ソースを参照

Merge pull request #2123 from mnaamani/sumer-content-dir-module

new content directory: initial setup
Bedeho Mender 4 年 前
コミット
5c2155f7df
95 ファイル変更2767 行追加17489 行削除
  1. 3 2
      Cargo.lock
  2. 1 3
      Cargo.toml
  3. 0 2
      build.sh
  4. 6 0
      content-metadata-protobuf/compiled/proto/Channel_pb.d.ts
  5. 49 1
      content-metadata-protobuf/compiled/proto/Channel_pb.js
  6. 6 0
      content-metadata-protobuf/compiled/proto/Playlist_pb.d.ts
  7. 60 2
      content-metadata-protobuf/compiled/proto/Playlist_pb.js
  8. 12 0
      content-metadata-protobuf/compiled/proto/Series_pb.d.ts
  9. 120 4
      content-metadata-protobuf/compiled/proto/Series_pb.js
  10. 12 0
      content-metadata-protobuf/compiled/proto/Video_pb.d.ts
  11. 108 2
      content-metadata-protobuf/compiled/proto/Video_pb.js
  12. 6 0
      content-metadata-protobuf/doc/index.md
  13. 3 0
      content-metadata-protobuf/proto/Channel.proto
  14. 2 0
      content-metadata-protobuf/proto/Playlist.proto
  15. 4 0
      content-metadata-protobuf/proto/Series.proto
  16. 6 0
      content-metadata-protobuf/proto/Video.proto
  17. 2 0
      content-metadata-protobuf/test/channel.ts
  18. 3 0
      content-metadata-protobuf/test/video.ts
  19. 16 14
      node/src/chain_spec/mod.rs
  20. 1 1
      package.json
  21. 4 0
      runtime-modules/common/src/lib.rs
  22. 0 30
      runtime-modules/content-directory/Cargo.toml
  23. 0 243
      runtime-modules/content-directory/src/class.rs
  24. 0 213
      runtime-modules/content-directory/src/entity.rs
  25. 0 239
      runtime-modules/content-directory/src/errors.rs
  26. 0 346
      runtime-modules/content-directory/src/helpers.rs
  27. 0 2920
      runtime-modules/content-directory/src/lib.rs
  28. 0 1041
      runtime-modules/content-directory/src/mock.rs
  29. 0 141
      runtime-modules/content-directory/src/operations.rs
  30. 0 107
      runtime-modules/content-directory/src/permissions/class.rs
  31. 0 175
      runtime-modules/content-directory/src/permissions/entity.rs
  32. 0 56
      runtime-modules/content-directory/src/permissions/entity_creation_voucher.rs
  33. 0 91
      runtime-modules/content-directory/src/schema.rs
  34. 0 62
      runtime-modules/content-directory/src/schema/convert.rs
  35. 0 137
      runtime-modules/content-directory/src/schema/input.rs
  36. 0 348
      runtime-modules/content-directory/src/schema/output.rs
  37. 0 634
      runtime-modules/content-directory/src/schema/property.rs
  38. 0 350
      runtime-modules/content-directory/src/tests.rs
  39. 0 507
      runtime-modules/content-directory/src/tests/add_class_schema.rs
  40. 0 59
      runtime-modules/content-directory/src/tests/add_curator_group.rs
  41. 0 162
      runtime-modules/content-directory/src/tests/add_curator_to_group.rs
  42. 0 195
      runtime-modules/content-directory/src/tests/add_maintainer_to_class.rs
  43. 0 1458
      runtime-modules/content-directory/src/tests/add_schema_support_to_entity.rs
  44. 0 557
      runtime-modules/content-directory/src/tests/clear_entity_property_vector.rs
  45. 0 275
      runtime-modules/content-directory/src/tests/create_class.rs
  46. 0 446
      runtime-modules/content-directory/src/tests/create_entity.rs
  47. 0 1271
      runtime-modules/content-directory/src/tests/insert_at_entity_property_vector.rs
  48. 0 776
      runtime-modules/content-directory/src/tests/remove_at_entity_property_vector.rs
  49. 0 131
      runtime-modules/content-directory/src/tests/remove_curator_from_group.rs
  50. 0 110
      runtime-modules/content-directory/src/tests/remove_curator_group.rs
  51. 0 302
      runtime-modules/content-directory/src/tests/remove_entity.rs
  52. 0 147
      runtime-modules/content-directory/src/tests/remove_maintainer_from_class.rs
  53. 0 84
      runtime-modules/content-directory/src/tests/set_curator_group_status.rs
  54. 0 155
      runtime-modules/content-directory/src/tests/transaction.rs
  55. 0 738
      runtime-modules/content-directory/src/tests/transfer_entity_ownership.rs
  56. 0 227
      runtime-modules/content-directory/src/tests/update_class_permissions.rs
  57. 0 145
      runtime-modules/content-directory/src/tests/update_class_schema_status.rs
  58. 0 197
      runtime-modules/content-directory/src/tests/update_entity_creation_voucher.rs
  59. 0 104
      runtime-modules/content-directory/src/tests/update_entity_permissions.rs
  60. 0 1025
      runtime-modules/content-directory/src/tests/update_entity_property_values.rs
  61. 2 0
      runtime-modules/content/Cargo.toml
  62. 0 104
      runtime-modules/content/lib.rs
  63. 47 0
      runtime-modules/content/src/errors.rs
  64. 1140 0
      runtime-modules/content/src/lib.rs
  65. 16 16
      runtime-modules/content/src/permissions/curator_group.rs
  66. 2 20
      runtime-modules/content/src/permissions/mod.rs
  67. 2 1
      runtime-modules/service-discovery/Cargo.toml
  68. 2 3
      runtime-modules/service-discovery/src/lib.rs
  69. 2 3
      runtime/Cargo.toml
  70. 2 3
      runtime/src/integration/content_directory.rs
  71. 14 39
      runtime/src/lib.rs
  72. 24 3
      runtime/src/primitives.rs
  73. 6 2
      runtime/src/runtime_api.rs
  74. 5 5
      types/augment-codec/all.ts
  75. 7 0
      types/augment-codec/augment-api-consts.ts
  76. 38 20
      types/augment-codec/augment-api-query.ts
  77. 52 82
      types/augment-codec/augment-api-tx.ts
  78. 0 0
      types/augment-codec/augment-types.ts
  79. 187 218
      types/augment/all/defs.json
  80. 295 271
      types/augment/all/types.ts
  81. 7 0
      types/augment/augment-api-consts.ts
  82. 38 20
      types/augment/augment-api-query.ts
  83. 52 82
      types/augment/augment-api-tx.ts
  84. 0 0
      types/augment/augment-types.ts
  85. 2 2
      types/package.json
  86. 8 4
      types/src/common.ts
  87. 0 333
      types/src/content-directory/index.ts
  88. 214 0
      types/src/content/index.ts
  89. 1 3
      types/src/discovery.ts
  90. 4 4
      types/src/index.ts
  91. 110 6
      types/src/legacy.ts
  92. 4 4
      types/src/scripts/generateAugmentCodec.ts
  93. 44 4
      types/src/storage.ts
  94. 1 1
      utils/api-scripts/package.json
  95. 15 1
      yarn.lock

+ 3 - 2
Cargo.lock

@@ -2067,7 +2067,7 @@ dependencies = [
  "pallet-balances",
  "pallet-collective",
  "pallet-common",
- "pallet-content-directory",
+ "pallet-content",
  "pallet-finality-tracker",
  "pallet-forum",
  "pallet-governance",
@@ -3306,11 +3306,12 @@ dependencies = [
 ]
 
 [[package]]
-name = "pallet-content-directory"
+name = "pallet-content"
 version = "3.0.0"
 dependencies = [
  "frame-support",
  "frame-system",
+ "pallet-common",
  "parity-scale-codec",
  "serde",
  "sp-arithmetic 2.0.0-rc4",

+ 1 - 3
Cargo.toml

@@ -16,9 +16,7 @@ members = [
 	"runtime-modules/storage",
 	"runtime-modules/token-minting",
 	"runtime-modules/working-group",
-	"runtime-modules/content-directory",
-	# New content directory
-	# "runtime-modules/content",
+	"runtime-modules/content",
 	"node",
 	"utils/chain-spec-builder/"
 ]

+ 0 - 2
build.sh

@@ -4,8 +4,6 @@ set -e
 
 yarn
 yarn workspace @joystream/types build
-yarn workspace @joystream/cd-schemas generate:all
-yarn workspace @joystream/cd-schemas build
 yarn workspace @joystream/cli build
 yarn workspace query-node-root build
 yarn workspace storage-node build

+ 6 - 0
content-metadata-protobuf/compiled/proto/Channel_pb.d.ts

@@ -34,6 +34,11 @@ export class ChannelMetadata extends jspb.Message {
   getAvatarPhoto(): number | undefined;
   setAvatarPhoto(value: number): void;
 
+  hasCategory(): boolean;
+  clearCategory(): void;
+  getCategory(): number | undefined;
+  setCategory(value: number): void;
+
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): ChannelMetadata.AsObject;
   static toObject(includeInstance: boolean, msg: ChannelMetadata): ChannelMetadata.AsObject;
@@ -52,6 +57,7 @@ export namespace ChannelMetadata {
     language?: string,
     coverPhoto?: number,
     avatarPhoto?: number,
+    category?: number,
   }
 }
 

+ 49 - 1
content-metadata-protobuf/compiled/proto/Channel_pb.js

@@ -95,7 +95,8 @@ proto.ChannelMetadata.toObject = function(includeInstance, msg) {
     isPublic: (f = jspb.Message.getBooleanField(msg, 3)) == null ? undefined : f,
     language: (f = jspb.Message.getField(msg, 4)) == null ? undefined : f,
     coverPhoto: (f = jspb.Message.getField(msg, 5)) == null ? undefined : f,
-    avatarPhoto: (f = jspb.Message.getField(msg, 6)) == null ? undefined : f
+    avatarPhoto: (f = jspb.Message.getField(msg, 6)) == null ? undefined : f,
+    category: (f = jspb.Message.getField(msg, 7)) == null ? undefined : f
   };
 
   if (includeInstance) {
@@ -156,6 +157,10 @@ proto.ChannelMetadata.deserializeBinaryFromReader = function(msg, reader) {
       var value = /** @type {number} */ (reader.readUint32());
       msg.setAvatarPhoto(value);
       break;
+    case 7:
+      var value = /** @type {number} */ (reader.readUint64());
+      msg.setCategory(value);
+      break;
     default:
       reader.skipField();
       break;
@@ -227,6 +232,13 @@ proto.ChannelMetadata.serializeBinaryToWriter = function(message, writer) {
       f
     );
   }
+  f = /** @type {number} */ (jspb.Message.getField(message, 7));
+  if (f != null) {
+    writer.writeUint64(
+      7,
+      f
+    );
+  }
 };
 
 
@@ -446,6 +458,42 @@ proto.ChannelMetadata.prototype.hasAvatarPhoto = function() {
 };
 
 
+/**
+ * optional uint64 category = 7;
+ * @return {number}
+ */
+proto.ChannelMetadata.prototype.getCategory = function() {
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 7, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.ChannelMetadata} returns this
+ */
+proto.ChannelMetadata.prototype.setCategory = function(value) {
+  return jspb.Message.setField(this, 7, value);
+};
+
+
+/**
+ * Clears the field making it undefined.
+ * @return {!proto.ChannelMetadata} returns this
+ */
+proto.ChannelMetadata.prototype.clearCategory = function() {
+  return jspb.Message.setField(this, 7, undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.ChannelMetadata.prototype.hasCategory = function() {
+  return jspb.Message.getField(this, 7) != null;
+};
+
+
 
 
 

+ 6 - 0
content-metadata-protobuf/compiled/proto/Playlist_pb.d.ts

@@ -9,6 +9,11 @@ export class PlaylistMetadata extends jspb.Message {
   getTitle(): string | undefined;
   setTitle(value: string): void;
 
+  clearVideosList(): void;
+  getVideosList(): Array<number>;
+  setVideosList(value: Array<number>): void;
+  addVideos(value: number, index?: number): number;
+
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): PlaylistMetadata.AsObject;
   static toObject(includeInstance: boolean, msg: PlaylistMetadata): PlaylistMetadata.AsObject;
@@ -22,6 +27,7 @@ export class PlaylistMetadata extends jspb.Message {
 export namespace PlaylistMetadata {
   export type AsObject = {
     title?: string,
+    videosList: Array<number>,
   }
 }
 

+ 60 - 2
content-metadata-protobuf/compiled/proto/Playlist_pb.js

@@ -26,7 +26,7 @@ goog.exportSymbol('proto.PlaylistMetadata', null, global);
  * @constructor
  */
 proto.PlaylistMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.PlaylistMetadata.repeatedFields_, null);
 };
 goog.inherits(proto.PlaylistMetadata, jspb.Message);
 if (goog.DEBUG && !COMPILED) {
@@ -37,6 +37,13 @@ if (goog.DEBUG && !COMPILED) {
   proto.PlaylistMetadata.displayName = 'proto.PlaylistMetadata';
 }
 
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.PlaylistMetadata.repeatedFields_ = [2];
+
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
@@ -68,7 +75,8 @@ proto.PlaylistMetadata.prototype.toObject = function(opt_includeInstance) {
  */
 proto.PlaylistMetadata.toObject = function(includeInstance, msg) {
   var f, obj = {
-    title: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f
+    title: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
+    videosList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f
   };
 
   if (includeInstance) {
@@ -109,6 +117,12 @@ proto.PlaylistMetadata.deserializeBinaryFromReader = function(msg, reader) {
       var value = /** @type {string} */ (reader.readString());
       msg.setTitle(value);
       break;
+    case 2:
+      var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint64() : [reader.readUint64()]);
+      for (var i = 0; i < values.length; i++) {
+        msg.addVideos(values[i]);
+      }
+      break;
     default:
       reader.skipField();
       break;
@@ -145,6 +159,13 @@ proto.PlaylistMetadata.serializeBinaryToWriter = function(message, writer) {
       f
     );
   }
+  f = message.getVideosList();
+  if (f.length > 0) {
+    writer.writeRepeatedUint64(
+      2,
+      f
+    );
+  }
 };
 
 
@@ -184,4 +205,41 @@ proto.PlaylistMetadata.prototype.hasTitle = function() {
 };
 
 
+/**
+ * repeated uint64 videos = 2;
+ * @return {!Array<number>}
+ */
+proto.PlaylistMetadata.prototype.getVideosList = function() {
+  return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 2));
+};
+
+
+/**
+ * @param {!Array<number>} value
+ * @return {!proto.PlaylistMetadata} returns this
+ */
+proto.PlaylistMetadata.prototype.setVideosList = function(value) {
+  return jspb.Message.setField(this, 2, value || []);
+};
+
+
+/**
+ * @param {number} value
+ * @param {number=} opt_index
+ * @return {!proto.PlaylistMetadata} returns this
+ */
+proto.PlaylistMetadata.prototype.addVideos = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.PlaylistMetadata} returns this
+ */
+proto.PlaylistMetadata.prototype.clearVideosList = function() {
+  return this.setVideosList([]);
+};
+
+
 goog.object.extend(exports, proto);

+ 12 - 0
content-metadata-protobuf/compiled/proto/Series_pb.d.ts

@@ -19,6 +19,11 @@ export class SeriesMetadata extends jspb.Message {
   getCoverPhoto(): number | undefined;
   setCoverPhoto(value: number): void;
 
+  clearPersonsList(): void;
+  getPersonsList(): Array<number>;
+  setPersonsList(value: Array<number>): void;
+  addPersons(value: number, index?: number): number;
+
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): SeriesMetadata.AsObject;
   static toObject(includeInstance: boolean, msg: SeriesMetadata): SeriesMetadata.AsObject;
@@ -34,6 +39,7 @@ export namespace SeriesMetadata {
     title?: string,
     description?: string,
     coverPhoto?: number,
+    personsList: Array<number>,
   }
 }
 
@@ -53,6 +59,11 @@ export class SeasonMetadata extends jspb.Message {
   getCoverPhoto(): number | undefined;
   setCoverPhoto(value: number): void;
 
+  clearPersonsList(): void;
+  getPersonsList(): Array<number>;
+  setPersonsList(value: Array<number>): void;
+  addPersons(value: number, index?: number): number;
+
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): SeasonMetadata.AsObject;
   static toObject(includeInstance: boolean, msg: SeasonMetadata): SeasonMetadata.AsObject;
@@ -68,6 +79,7 @@ export namespace SeasonMetadata {
     title?: string,
     description?: string,
     coverPhoto?: number,
+    personsList: Array<number>,
   }
 }
 

+ 120 - 4
content-metadata-protobuf/compiled/proto/Series_pb.js

@@ -27,7 +27,7 @@ goog.exportSymbol('proto.SeriesMetadata', null, global);
  * @constructor
  */
 proto.SeriesMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.SeriesMetadata.repeatedFields_, null);
 };
 goog.inherits(proto.SeriesMetadata, jspb.Message);
 if (goog.DEBUG && !COMPILED) {
@@ -48,7 +48,7 @@ if (goog.DEBUG && !COMPILED) {
  * @constructor
  */
 proto.SeasonMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.SeasonMetadata.repeatedFields_, null);
 };
 goog.inherits(proto.SeasonMetadata, jspb.Message);
 if (goog.DEBUG && !COMPILED) {
@@ -59,6 +59,13 @@ if (goog.DEBUG && !COMPILED) {
   proto.SeasonMetadata.displayName = 'proto.SeasonMetadata';
 }
 
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.SeriesMetadata.repeatedFields_ = [4];
+
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
@@ -92,7 +99,8 @@ proto.SeriesMetadata.toObject = function(includeInstance, msg) {
   var f, obj = {
     title: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
     description: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
-    coverPhoto: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f
+    coverPhoto: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
+    personsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f
   };
 
   if (includeInstance) {
@@ -141,6 +149,12 @@ proto.SeriesMetadata.deserializeBinaryFromReader = function(msg, reader) {
       var value = /** @type {number} */ (reader.readUint32());
       msg.setCoverPhoto(value);
       break;
+    case 4:
+      var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint64() : [reader.readUint64()]);
+      for (var i = 0; i < values.length; i++) {
+        msg.addPersons(values[i]);
+      }
+      break;
     default:
       reader.skipField();
       break;
@@ -191,6 +205,13 @@ proto.SeriesMetadata.serializeBinaryToWriter = function(message, writer) {
       f
     );
   }
+  f = message.getPersonsList();
+  if (f.length > 0) {
+    writer.writePackedUint64(
+      4,
+      f
+    );
+  }
 };
 
 
@@ -302,6 +323,50 @@ proto.SeriesMetadata.prototype.hasCoverPhoto = function() {
 };
 
 
+/**
+ * repeated uint64 persons = 4;
+ * @return {!Array<number>}
+ */
+proto.SeriesMetadata.prototype.getPersonsList = function() {
+  return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 4));
+};
+
+
+/**
+ * @param {!Array<number>} value
+ * @return {!proto.SeriesMetadata} returns this
+ */
+proto.SeriesMetadata.prototype.setPersonsList = function(value) {
+  return jspb.Message.setField(this, 4, value || []);
+};
+
+
+/**
+ * @param {number} value
+ * @param {number=} opt_index
+ * @return {!proto.SeriesMetadata} returns this
+ */
+proto.SeriesMetadata.prototype.addPersons = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 4, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.SeriesMetadata} returns this
+ */
+proto.SeriesMetadata.prototype.clearPersonsList = function() {
+  return this.setPersonsList([]);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.SeasonMetadata.repeatedFields_ = [4];
 
 
 
@@ -336,7 +401,8 @@ proto.SeasonMetadata.toObject = function(includeInstance, msg) {
   var f, obj = {
     title: (f = jspb.Message.getField(msg, 1)) == null ? undefined : f,
     description: (f = jspb.Message.getField(msg, 2)) == null ? undefined : f,
-    coverPhoto: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f
+    coverPhoto: (f = jspb.Message.getField(msg, 3)) == null ? undefined : f,
+    personsList: (f = jspb.Message.getRepeatedField(msg, 4)) == null ? undefined : f
   };
 
   if (includeInstance) {
@@ -385,6 +451,12 @@ proto.SeasonMetadata.deserializeBinaryFromReader = function(msg, reader) {
       var value = /** @type {number} */ (reader.readUint32());
       msg.setCoverPhoto(value);
       break;
+    case 4:
+      var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint64() : [reader.readUint64()]);
+      for (var i = 0; i < values.length; i++) {
+        msg.addPersons(values[i]);
+      }
+      break;
     default:
       reader.skipField();
       break;
@@ -435,6 +507,13 @@ proto.SeasonMetadata.serializeBinaryToWriter = function(message, writer) {
       f
     );
   }
+  f = message.getPersonsList();
+  if (f.length > 0) {
+    writer.writePackedUint64(
+      4,
+      f
+    );
+  }
 };
 
 
@@ -546,4 +625,41 @@ proto.SeasonMetadata.prototype.hasCoverPhoto = function() {
 };
 
 
+/**
+ * repeated uint64 persons = 4;
+ * @return {!Array<number>}
+ */
+proto.SeasonMetadata.prototype.getPersonsList = function() {
+  return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 4));
+};
+
+
+/**
+ * @param {!Array<number>} value
+ * @return {!proto.SeasonMetadata} returns this
+ */
+proto.SeasonMetadata.prototype.setPersonsList = function(value) {
+  return jspb.Message.setField(this, 4, value || []);
+};
+
+
+/**
+ * @param {number} value
+ * @param {number=} opt_index
+ * @return {!proto.SeasonMetadata} returns this
+ */
+proto.SeasonMetadata.prototype.addPersons = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 4, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.SeasonMetadata} returns this
+ */
+proto.SeasonMetadata.prototype.clearPersonsList = function() {
+  return this.setPersonsList([]);
+};
+
+
 goog.object.extend(exports, proto);

+ 12 - 0
content-metadata-protobuf/compiled/proto/Video_pb.d.ts

@@ -170,6 +170,16 @@ export class VideoMetadata extends jspb.Message {
   getIsExplicit(): boolean | undefined;
   setIsExplicit(value: boolean): void;
 
+  clearPersonsList(): void;
+  getPersonsList(): Array<number>;
+  setPersonsList(value: Array<number>): void;
+  addPersons(value: number, index?: number): number;
+
+  hasCategory(): boolean;
+  clearCategory(): void;
+  getCategory(): number | undefined;
+  setCategory(value: number): void;
+
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): VideoMetadata.AsObject;
   static toObject(includeInstance: boolean, msg: VideoMetadata): VideoMetadata.AsObject;
@@ -196,6 +206,8 @@ export namespace VideoMetadata {
     hasMarketing?: boolean,
     isPublic?: boolean,
     isExplicit?: boolean,
+    personsList: Array<number>,
+    category?: number,
   }
 }
 

+ 108 - 2
content-metadata-protobuf/compiled/proto/Video_pb.js

@@ -93,7 +93,7 @@ if (goog.DEBUG && !COMPILED) {
  * @constructor
  */
 proto.VideoMetadata = function(opt_data) {
-  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.VideoMetadata.repeatedFields_, null);
 };
 goog.inherits(proto.VideoMetadata, jspb.Message);
 if (goog.DEBUG && !COMPILED) {
@@ -809,6 +809,13 @@ proto.MediaType.prototype.hasMimeMediaType = function() {
 
 
 
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.VideoMetadata.repeatedFields_ = [15];
+
 
 
 if (jspb.Message.GENERATE_TO_OBJECT) {
@@ -853,7 +860,9 @@ proto.VideoMetadata.toObject = function(includeInstance, msg) {
     publishedBeforeJoystream: (f = msg.getPublishedBeforeJoystream()) && proto.PublishedBeforeJoystream.toObject(includeInstance, f),
     hasMarketing: (f = jspb.Message.getBooleanField(msg, 12)) == null ? undefined : f,
     isPublic: (f = jspb.Message.getBooleanField(msg, 13)) == null ? undefined : f,
-    isExplicit: (f = jspb.Message.getBooleanField(msg, 14)) == null ? undefined : f
+    isExplicit: (f = jspb.Message.getBooleanField(msg, 14)) == null ? undefined : f,
+    personsList: (f = jspb.Message.getRepeatedField(msg, 15)) == null ? undefined : f,
+    category: (f = jspb.Message.getField(msg, 16)) == null ? undefined : f
   };
 
   if (includeInstance) {
@@ -949,6 +958,16 @@ proto.VideoMetadata.deserializeBinaryFromReader = function(msg, reader) {
       var value = /** @type {boolean} */ (reader.readBool());
       msg.setIsExplicit(value);
       break;
+    case 15:
+      var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedUint64() : [reader.readUint64()]);
+      for (var i = 0; i < values.length; i++) {
+        msg.addPersons(values[i]);
+      }
+      break;
+    case 16:
+      var value = /** @type {number} */ (reader.readUint64());
+      msg.setCategory(value);
+      break;
     default:
       reader.skipField();
       break;
@@ -1079,6 +1098,20 @@ proto.VideoMetadata.serializeBinaryToWriter = function(message, writer) {
       f
     );
   }
+  f = message.getPersonsList();
+  if (f.length > 0) {
+    writer.writePackedUint64(
+      15,
+      f
+    );
+  }
+  f = /** @type {number} */ (jspb.Message.getField(message, 16));
+  if (f != null) {
+    writer.writeUint64(
+      16,
+      f
+    );
+  }
 };
 
 
@@ -1589,6 +1622,79 @@ proto.VideoMetadata.prototype.hasIsExplicit = function() {
 };
 
 
+/**
+ * repeated uint64 persons = 15;
+ * @return {!Array<number>}
+ */
+proto.VideoMetadata.prototype.getPersonsList = function() {
+  return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 15));
+};
+
+
+/**
+ * @param {!Array<number>} value
+ * @return {!proto.VideoMetadata} returns this
+ */
+proto.VideoMetadata.prototype.setPersonsList = function(value) {
+  return jspb.Message.setField(this, 15, value || []);
+};
+
+
+/**
+ * @param {number} value
+ * @param {number=} opt_index
+ * @return {!proto.VideoMetadata} returns this
+ */
+proto.VideoMetadata.prototype.addPersons = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 15, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.VideoMetadata} returns this
+ */
+proto.VideoMetadata.prototype.clearPersonsList = function() {
+  return this.setPersonsList([]);
+};
+
+
+/**
+ * optional uint64 category = 16;
+ * @return {number}
+ */
+proto.VideoMetadata.prototype.getCategory = function() {
+  return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 16, 0));
+};
+
+
+/**
+ * @param {number} value
+ * @return {!proto.VideoMetadata} returns this
+ */
+proto.VideoMetadata.prototype.setCategory = function(value) {
+  return jspb.Message.setField(this, 16, value);
+};
+
+
+/**
+ * Clears the field making it undefined.
+ * @return {!proto.VideoMetadata} returns this
+ */
+proto.VideoMetadata.prototype.clearCategory = function() {
+  return jspb.Message.setField(this, 16, undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.VideoMetadata.prototype.hasCategory = function() {
+  return jspb.Message.getField(this, 16) != null;
+};
+
+
 
 
 

+ 6 - 0
content-metadata-protobuf/doc/index.md

@@ -64,6 +64,7 @@
 | language | [string](#string) | optional | ISO_639-1 Language [Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) |
 | cover_photo | [uint32](#uint32) | optional | index into external [assets array](#.Assets) |
 | avatar_photo | [uint32](#uint32) | optional | index into external [assets array](#.Assets) |
+| category | [uint64](#uint64) | optional | Channel Category Id |
 
 
 
@@ -131,6 +132,7 @@
 | Field | Type | Label | Description |
 | ----- | ---- | ----- | ----------- |
 | title | [string](#string) | optional |  |
+| videos | [uint64](#uint64) | repeated | Videos in the playlist |
 
 
 
@@ -164,6 +166,7 @@
 | title | [string](#string) | optional |  |
 | description | [string](#string) | optional |  |
 | cover_photo | [uint32](#uint32) | optional | index into external [assets array](#.Assets) |
+| persons | [uint64](#uint64) | repeated | Person(s) referenced by PersonId involved in this Season |
 
 
 
@@ -181,6 +184,7 @@
 | title | [string](#string) | optional |  |
 | description | [string](#string) | optional |  |
 | cover_photo | [uint32](#uint32) | optional | index into external [assets array](#.Assets) |
+| persons | [uint64](#uint64) | repeated | Person(s) referenced by PersonId involved in this Series |
 
 
 
@@ -290,6 +294,8 @@ Publication status before joystream
 | has_marketing | [bool](#bool) | optional | Does video have marketing or advertising in the stream |
 | is_public | [bool](#bool) | optional | Should video be publicy visible yet |
 | is_explicit | [bool](#bool) | optional | Does Video have explicit language or scenes |
+| persons | [uint64](#uint64) | repeated | Person(s) referenced by PersonId involved in this video |
+| category | [uint64](#uint64) | optional | Video Category Id |
 
 
 

+ 3 - 0
content-metadata-protobuf/proto/Channel.proto

@@ -17,6 +17,9 @@ message ChannelMetadata {
     optional uint32 cover_photo = 5;
     // index into external [assets array](#.Assets)
     optional uint32 avatar_photo  = 6;
+
+    // Channel Category Id
+    optional uint64 category = 7;
 }
 
 message ChannelCategoryMetadata {

+ 2 - 0
content-metadata-protobuf/proto/Playlist.proto

@@ -2,4 +2,6 @@ syntax = "proto2";
 
 message PlaylistMetadata {
     optional string title = 1;
+    // Videos in the playlist
+    repeated uint64 videos = 2;
 }

+ 4 - 0
content-metadata-protobuf/proto/Series.proto

@@ -5,6 +5,8 @@ message SeriesMetadata {
     optional string description = 2;
     // index into external [assets array](#.Assets)
     optional uint32 cover_photo = 3;
+    // Person(s) referenced by PersonId involved in this Series
+    repeated uint64 persons = 4 [packed=true];
 }
 
 message SeasonMetadata {
@@ -12,4 +14,6 @@ message SeasonMetadata {
     optional string description = 2; 
     // index into external [assets array](#.Assets)
     optional uint32 cover_photo = 3;
+    // Person(s) referenced by PersonId involved in this Season
+    repeated uint64 persons = 4 [packed=true];
 }

+ 6 - 0
content-metadata-protobuf/proto/Video.proto

@@ -74,6 +74,12 @@ message VideoMetadata {
 
     // Does Video have explicit language or scenes
     optional bool is_explicit = 14;
+
+    // Person(s) referenced by PersonId involved in this video
+    repeated uint64 persons = 15 [packed=true];
+
+    // Video Category Id
+    optional uint64 category = 16;
 }
 
 message VideoCategoryMetadata {

+ 2 - 0
content-metadata-protobuf/test/channel.ts

@@ -16,6 +16,7 @@ describe('Channel Metadata', () => {
     channel.setLanguage(language)
     channel.setAvatarPhoto(0)
     channel.setCoverPhoto(1)
+    channel.setCategory(100)
 
     assert.deepEqual(channel.toObject(), {
       title,
@@ -24,6 +25,7 @@ describe('Channel Metadata', () => {
       language,
       avatarPhoto: 0,
       coverPhoto: 1,
+      category: 100,
     })
 
     assert.deepEqual(ChannelMetadata.deserializeBinary(channel.serializeBinary()), channel)

+ 3 - 0
content-metadata-protobuf/test/video.ts

@@ -23,6 +23,7 @@ describe('Video Metadata', () => {
     meta.setIsExplicit(false)
     meta.setVideo(0)
     meta.setThumbnailPhoto(1)
+    meta.setCategory(101)
 
     assert.deepEqual(meta.toObject(), {
       title,
@@ -47,6 +48,8 @@ describe('Video Metadata', () => {
       isExplicit: false,
       thumbnailPhoto: 1,
       video: 0,
+      personsList: [],
+      category: 101,
     })
 
     // sanity check - encoding / decoding works

+ 16 - 14
node/src/chain_spec/mod.rs

@@ -29,13 +29,12 @@ use sp_runtime::traits::{IdentifyAccount, Verify};
 use sp_runtime::Perbill;
 
 use node_runtime::{
-    membership, AuthorityDiscoveryConfig, BabeConfig, Balance, BalancesConfig,
-    ContentDirectoryConfig, ContentDirectoryWorkingGroupConfig, CouncilConfig,
-    CouncilElectionConfig, DataDirectoryConfig, DataObjectStorageRegistryConfig,
-    DataObjectTypeRegistryConfig, ElectionParameters, ForumConfig, GrandpaConfig, ImOnlineConfig,
-    MembersConfig, Moment, ProposalsCodexConfig, SessionConfig, SessionKeys, Signature,
-    StakerStatus, StakingConfig, StorageWorkingGroupConfig, SudoConfig, SystemConfig, DAYS,
-    WASM_BINARY,
+    membership, AuthorityDiscoveryConfig, BabeConfig, Balance, BalancesConfig, ContentConfig,
+    ContentDirectoryWorkingGroupConfig, CouncilConfig, CouncilElectionConfig, DataDirectoryConfig,
+    DataObjectStorageRegistryConfig, DataObjectTypeRegistryConfig, ElectionParameters, ForumConfig,
+    GrandpaConfig, ImOnlineConfig, MembersConfig, Moment, ProposalsCodexConfig, SessionConfig,
+    SessionKeys, Signature, StakerStatus, StakingConfig, StorageWorkingGroupConfig, SudoConfig,
+    SystemConfig, DAYS, WASM_BINARY,
 };
 
 // Exported to be used by chain-spec-builder
@@ -319,14 +318,17 @@ pub fn testnet_genesis(
             worker_application_human_readable_text_constraint: default_text_constraint,
             worker_exit_rationale_text_constraint: default_text_constraint,
         }),
-        content_directory: Some({
-            ContentDirectoryConfig {
-                class_by_id: vec![],
-                entity_by_id: vec![],
-                curator_group_by_id: vec![],
-                next_class_id: 1,
-                next_entity_id: 1,
+        content: Some({
+            ContentConfig {
                 next_curator_group_id: 1,
+                next_channel_category_id: 1,
+                next_channel_id: 1,
+                next_video_category_id: 1,
+                next_video_id: 1,
+                next_playlist_id: 1,
+                next_series_id: 1,
+                next_person_id: 1,
+                next_channel_transfer_request_id: 1,
             }
         }),
         proposals_codex: Some(ProposalsCodexConfig {

+ 1 - 1
package.json

@@ -4,7 +4,7 @@
   "version": "1.0.0",
   "license": "GPL-3.0-only",
   "scripts": {
-    "postinstall": "yarn workspace @joystream/types build && yarn workspace @joystream/cd-schemas generate:all && yarn workspace @joystream/cd-schemas build && yarn workspace @joystream/cli build",
+    "postinstall": "yarn workspace @joystream/types build",
     "build": "./build.sh",
     "start": "./start.sh",
     "cargo-checks": "devops/git-hooks/pre-commit && devops/git-hooks/pre-push",

+ 4 - 0
runtime-modules/common/src/lib.rs

@@ -14,6 +14,7 @@ use serde::{Deserialize, Serialize};
 use frame_support::Parameter;
 use sp_arithmetic::traits::BaseArithmetic;
 use sp_runtime::traits::{MaybeSerialize, Member};
+use sp_std::vec::Vec;
 
 /// Member id type alias
 pub type MemberId<T> = <T as MembershipTypes>::MemberId;
@@ -21,6 +22,9 @@ pub type MemberId<T> = <T as MembershipTypes>::MemberId;
 /// Actor id type alias
 pub type ActorId<T> = <T as MembershipTypes>::ActorId;
 
+/// HTTP Url string
+pub type Url = Vec<u8>;
+
 /// Generic trait for membership dependent pallets.
 pub trait MembershipTypes: system::Trait {
     /// Describes the common type for the members.

+ 0 - 30
runtime-modules/content-directory/Cargo.toml

@@ -1,30 +0,0 @@
-[package]
-name = 'pallet-content-directory'
-version = '3.0.0'
-authors = ['Joystream contributors']
-edition = '2018'
-
-[dependencies]
-sp-std = { package = 'sp-std', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-sp-runtime = { package = 'sp-runtime', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-frame-support = { package = 'frame-support', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-system = { package = 'frame-system', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-sp-arithmetic = { package = 'sp-arithmetic', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-codec = { package = 'parity-scale-codec', version = '1.3.1', default-features = false, features = ['derive'] }
-serde = {version = '1.0.101', features = ['derive'], optional = true}
-
-[dev-dependencies]
-sp-io = { package = 'sp-io', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-sp-core = { package = 'sp-core', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
-
-[features]
-default = ['std']
-std = [
-	'sp-std/std',
-	'sp-runtime/std',
-	'frame-support/std',
-	'system/std',
-	'sp-arithmetic/std',
-	'codec/std',
-	'serde',
-]

+ 0 - 243
runtime-modules/content-directory/src/class.rs

@@ -1,243 +0,0 @@
-use super::*;
-
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Eq, PartialEq, Default, Clone)]
-pub struct Class<
-    EntityId: Default + BaseArithmetic + Clone + Copy,
-    ClassId: Default + BaseArithmetic + Clone + Copy,
-    CuratorGroupId: Ord + Default,
-> {
-    /// Permissions for an instance of a Class.
-    class_permissions: ClassPermissions<CuratorGroupId>,
-    /// All properties that have been used on this class across different class schemas.
-    /// Unlikely to be more than roughly 20 properties per class, often less.
-    /// For Person, think "height", "weight", etc.
-    properties: Vec<Property<ClassId>>,
-
-    /// All schemas that are available for this class, think v0.0 Person, v.1.0 Person, etc.
-    schemas: Vec<Schema>,
-
-    name: Vec<u8>,
-
-    description: Vec<u8>,
-
-    /// The maximum number of entities which can be created.
-    maximum_entities_count: EntityId,
-
-    /// The current number of entities which exist.
-    current_number_of_entities: EntityId,
-
-    /// How many entities a given controller may create at most.
-    default_entity_creation_voucher_upper_bound: EntityId,
-}
-
-impl<
-        EntityId: Default + BaseArithmetic + Clone + Copy,
-        ClassId: Default + BaseArithmetic + Clone + Copy,
-        CuratorGroupId: Ord + Default,
-    > Class<EntityId, ClassId, CuratorGroupId>
-{
-    /// Create new `Class` with provided parameters
-    pub fn new(
-        class_permissions: ClassPermissions<CuratorGroupId>,
-        name: Vec<u8>,
-        description: Vec<u8>,
-        maximum_entities_count: EntityId,
-        default_entity_creation_voucher_upper_bound: EntityId,
-    ) -> Self {
-        Self {
-            class_permissions,
-            properties: vec![],
-            schemas: vec![],
-            name,
-            description,
-            maximum_entities_count,
-            current_number_of_entities: EntityId::zero(),
-            default_entity_creation_voucher_upper_bound,
-        }
-    }
-
-    pub fn get_name(&self) -> &[u8] {
-        &self.name
-    }
-
-    pub fn get_description(&self) -> &[u8] {
-        &self.description
-    }
-
-    pub fn set_name(&mut self, name: Vec<u8>) {
-        self.name = name;
-    }
-
-    pub fn set_description(&mut self, description: Vec<u8>) {
-        self.description = description;
-    }
-
-    /// Used to update `Schema` status under given `schema_index`
-    pub fn update_schema_status(&mut self, schema_index: SchemaId, schema_status: bool) {
-        if let Some(schema) = self.schemas.get_mut(schema_index as usize) {
-            schema.set_status(schema_status);
-        };
-    }
-
-    /// Used to update `Class` permissions
-    pub fn update_permissions(&mut self, permissions: ClassPermissions<CuratorGroupId>) {
-        self.class_permissions = permissions
-    }
-
-    /// Get Class schemas by mutable reference
-    pub fn get_schemas_mut(&mut self) -> &mut Vec<Schema> {
-        &mut self.schemas
-    }
-
-    /// Get Class schemas by reference
-    pub fn get_schemas(&self) -> &Vec<Schema> {
-        &self.schemas
-    }
-
-    /// Increment number of entities, associated with this class
-    pub fn increment_entities_count(&mut self) {
-        self.current_number_of_entities += EntityId::one();
-    }
-
-    /// Decrement number of entities, associated with this class
-    pub fn decrement_entities_count(&mut self) {
-        self.current_number_of_entities -= EntityId::one();
-    }
-
-    /// Retrieve `ClassPermissions` by mutable reference
-    pub fn get_permissions_mut(&mut self) -> &mut ClassPermissions<CuratorGroupId> {
-        &mut self.class_permissions
-    }
-
-    /// Retrieve `ClassPermissions` by reference
-    pub fn get_permissions_ref(&self) -> &ClassPermissions<CuratorGroupId> {
-        &self.class_permissions
-    }
-
-    /// Retrieve `ClassPermissions` by value
-    pub fn get_permissions(self) -> ClassPermissions<CuratorGroupId> {
-        self.class_permissions
-    }
-
-    /// Retrieve `Class` properties by value  
-    pub fn get_properties(self) -> Vec<Property<ClassId>> {
-        self.properties
-    }
-
-    /// Replace `Class` properties with updated_class_properties
-    pub fn set_properties(&mut self, updated_class_properties: Vec<Property<ClassId>>) {
-        self.properties = updated_class_properties;
-    }
-
-    /// Get per controller `Class`- specific limit
-    pub fn get_default_entity_creation_voucher_upper_bound(&self) -> EntityId {
-        self.default_entity_creation_voucher_upper_bound
-    }
-
-    /// Retrive the maximum entities count, which can be created for given `Class`
-    pub fn get_maximum_entities_count(&self) -> EntityId {
-        self.maximum_entities_count
-    }
-
-    /// Set per controller `Class`- specific limit
-    pub fn set_default_entity_creation_voucher_upper_bound(
-        &mut self,
-        new_default_entity_creation_voucher_upper_bound: EntityId,
-    ) {
-        self.default_entity_creation_voucher_upper_bound =
-            new_default_entity_creation_voucher_upper_bound;
-    }
-
-    /// Set the maximum entities count, which can be created for given `Class`
-    pub fn set_maximum_entities_count(&mut self, maximum_entities_count: EntityId) {
-        self.maximum_entities_count = maximum_entities_count;
-    }
-
-    /// Ensure `Class` `Schema` under given index exist, return corresponding `Schema`
-    pub fn ensure_schema_exists<T: Trait>(
-        &self,
-        schema_index: SchemaId,
-    ) -> Result<&Schema, Error<T>> {
-        self.schemas
-            .get(schema_index as usize)
-            .ok_or(Error::<T>::UnknownClassSchemaId)
-    }
-
-    /// Ensure `schema_id` is a valid index of `Class` schemas vector
-    pub fn ensure_schema_id_exists<T: Trait>(&self, schema_id: SchemaId) -> Result<(), Error<T>> {
-        ensure!(
-            schema_id < self.schemas.len() as SchemaId,
-            Error::<T>::UnknownClassSchemaId
-        );
-        Ok(())
-    }
-
-    /// Ensure `Schema`s limit per `Class` not reached
-    pub fn ensure_schemas_limit_not_reached<T: Trait>(&self) -> Result<(), Error<T>> {
-        ensure!(
-            (self.schemas.len() as MaxNumber) < T::MaxNumberOfSchemasPerClass::get(),
-            Error::<T>::ClassSchemasLimitReached
-        );
-        Ok(())
-    }
-
-    /// Ensure properties limit per `Schema` not reached
-    pub fn ensure_properties_limit_not_reached<T: Trait>(
-        &self,
-        new_properties: &[Property<ClassId>],
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            T::MaxNumberOfPropertiesPerSchema::get()
-                >= (self.properties.len() + new_properties.len()) as MaxNumber,
-            Error::<T>::SchemaPropertiesLimitReached
-        );
-        Ok(())
-    }
-
-    /// Ensure `Class` specific entities limit not reached
-    pub fn ensure_maximum_entities_count_limit_not_reached<T: Trait>(
-        &self,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            self.current_number_of_entities < self.maximum_entities_count,
-            Error::<T>::NumberOfEntitiesPerClassLimitReached
-        );
-        Ok(())
-    }
-
-    /// Ensure `Property` under given `PropertyId` is unlocked from actor with given `EntityAccessLevel`
-    /// return corresponding `Property` by value
-    pub fn ensure_class_property_type_unlocked_from<T: Trait>(
-        self,
-        in_class_schema_property_id: PropertyId,
-        entity_access_level: EntityAccessLevel,
-    ) -> Result<Property<ClassId>, Error<T>> {
-        // Ensure property values were not locked on Class level
-        self.ensure_property_values_unlocked()?;
-
-        // Get class-level information about this `Property`
-        let class_property = self
-            .properties
-            .get(in_class_schema_property_id as usize)
-            // Throw an error if a property was not found on class
-            // by an in-class index of a property.
-            .ok_or(Error::<T>::ClassPropertyNotFound)?;
-
-        // Ensure Property is unlocked from Actor with given EntityAccessLevel
-        class_property.ensure_unlocked_from::<T>(entity_access_level)?;
-
-        Ok(class_property.clone())
-    }
-
-    /// Ensure property values were not locked on `Class` level
-    pub fn ensure_property_values_unlocked<T: Trait>(&self) -> Result<(), Error<T>> {
-        ensure!(
-            !self
-                .get_permissions_ref()
-                .all_entity_property_values_locked(),
-            Error::<T>::AllPropertiesWereLockedOnClassLevel
-        );
-        Ok(())
-    }
-}

+ 0 - 213
runtime-modules/content-directory/src/entity.rs

@@ -1,213 +0,0 @@
-use super::*;
-
-/// Represents `Entity`, related to a specific `Class`
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Default, Clone, PartialEq, Eq)]
-pub struct Entity<
-    ClassId: Default + BaseArithmetic + Clone + Copy,
-    MemberId: Default + PartialEq + Clone + Copy,
-    Hashed: Default + Clone + Codec,
-    EntityId: Default + Clone + Copy + Codec,
-    Nonce: Default + BaseArithmetic + Clone + Copy,
-> {
-    /// Permissions for an instance of an Entity.
-    entity_permissions: EntityPermissions<MemberId>,
-
-    /// The class id of this entity.
-    class_id: ClassId,
-
-    /// What schemas under which entity of the respective class is available, think
-    /// v.2.0 Person schema for John, v3.0 Person schema for John
-    /// Unlikely to be more than roughly 20ish, assuming schemas for a given class eventually stableize,
-    /// or that very old schema are eventually removed.
-    supported_schemas: BTreeSet<SchemaId>, // indices of schema in corresponding class
-
-    /// Values for properties on class that are used by some schema used by this entity
-    /// Length is no more than Class.properties.
-    values: BTreeMap<PropertyId, StoredPropertyValue<Hashed, EntityId, Nonce>>,
-
-    /// Number of property values referencing current entity
-    reference_counter: InboundReferenceCounter,
-}
-
-impl<
-        ClassId: Default + BaseArithmetic + Clone + Copy,
-        MemberId: Default + PartialEq + Clone + Copy,
-        Hashed: Default + Clone + Codec,
-        EntityId: Default + Clone + Copy + Codec,
-        Nonce: Default + BaseArithmetic + Clone + Copy,
-    > Entity<ClassId, MemberId, Hashed, EntityId, Nonce>
-{
-    /// Create new `Entity` instance, related to a given `class_id` with provided parameters,  
-    pub fn new(
-        controller: EntityController<MemberId>,
-        class_id: ClassId,
-        supported_schemas: BTreeSet<SchemaId>,
-        values: BTreeMap<PropertyId, StoredPropertyValue<Hashed, EntityId, Nonce>>,
-    ) -> Self {
-        Self {
-            entity_permissions: EntityPermissions::<MemberId>::default_with_controller(controller),
-            class_id,
-            supported_schemas,
-            values,
-            reference_counter: InboundReferenceCounter::default(),
-        }
-    }
-
-    /// Get `class_id` of this `Entity`
-    pub fn get_class_id(&self) -> ClassId {
-        self.class_id
-    }
-
-    /// Get Entity supported schemas by mutable reference
-    pub fn get_supported_schemas_mut(&mut self) -> &mut BTreeSet<SchemaId> {
-        &mut self.supported_schemas
-    }
-
-    /// Get `Entity` values by value
-    pub fn get_values(self) -> BTreeMap<PropertyId, StoredPropertyValue<Hashed, EntityId, Nonce>> {
-        self.values
-    }
-
-    /// Get `Entity` values by reference
-    pub fn get_values_ref(
-        &self,
-    ) -> &BTreeMap<PropertyId, StoredPropertyValue<Hashed, EntityId, Nonce>> {
-        &self.values
-    }
-
-    /// Get `Entity` values by mutable reference
-    pub fn get_values_mut(
-        &mut self,
-    ) -> &mut BTreeMap<PropertyId, StoredPropertyValue<Hashed, EntityId, Nonce>> {
-        &mut self.values
-    }
-
-    /// Get mutable reference to `Entity` values
-    pub fn set_values(
-        &mut self,
-        new_values: BTreeMap<PropertyId, StoredPropertyValue<Hashed, EntityId, Nonce>>,
-    ) {
-        self.values = new_values;
-    }
-
-    /// Get mutable `EntityPermissions` reference, related to given `Entity`
-    pub fn get_permissions_mut(&mut self) -> &mut EntityPermissions<MemberId> {
-        &mut self.entity_permissions
-    }
-
-    /// Get `EntityPermissions` reference, related to given `Entity`
-    pub fn get_permissions_ref(&self) -> &EntityPermissions<MemberId> {
-        &self.entity_permissions
-    }
-
-    /// Get `EntityPermissions`, related to given `Entity` by value
-    pub fn get_permissions(self) -> EntityPermissions<MemberId> {
-        self.entity_permissions
-    }
-
-    /// Update existing `EntityPermissions` with newly provided
-    pub fn update_permissions(&mut self, permissions: EntityPermissions<MemberId>) {
-        self.entity_permissions = permissions
-    }
-
-    /// Ensure `Schema` under given id is not added to given `Entity` yet
-    pub fn ensure_schema_id_is_not_added<T: Trait>(
-        &self,
-        schema_id: SchemaId,
-    ) -> Result<(), Error<T>> {
-        let schema_not_added = !self.supported_schemas.contains(&schema_id);
-        ensure!(schema_not_added, Error::<T>::SchemaAlreadyAddedToTheEntity);
-        Ok(())
-    }
-
-    /// Ensure provided `property_values` are not added to the `Entity` `values` map yet
-    pub fn ensure_property_values_are_not_added<T: Trait>(
-        &self,
-        property_values: &BTreeMap<PropertyId, InputPropertyValue<T>>,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            property_values
-                .keys()
-                .all(|key| !self.values.contains_key(key)),
-            Error::<T>::EntityAlreadyContainsGivenPropertyId
-        );
-        Ok(())
-    }
-
-    /// Ensure InputPropertyValue under given `in_class_schema_property_id` is Vector
-    pub fn ensure_property_value_is_vec<T: Trait>(
-        &self,
-        in_class_schema_property_id: PropertyId,
-    ) -> Result<VecStoredPropertyValue<Hashed, EntityId, Nonce>, Error<T>> {
-        self.values
-            .get(&in_class_schema_property_id)
-            // Throw an error if a property was not found on entity
-            // by an in-class index of a property.
-            .ok_or(Error::<T>::UnknownEntityPropertyId)?
-            .as_vec_property_value()
-            .cloned()
-            // Ensure prop value under given class schema property id is vector
-            .ok_or(Error::<T>::PropertyValueUnderGivenIndexIsNotAVector)
-    }
-
-    /// Ensure any `InputPropertyValue` from external entity does not point to the given `Entity`
-    pub fn ensure_rc_is_zero<T: Trait>(&self) -> Result<(), Error<T>> {
-        ensure!(
-            self.reference_counter.is_total_equal_to_zero(),
-            Error::<T>::EntityRcDoesNotEqualToZero
-        );
-        Ok(())
-    }
-
-    /// Ensure any inbound `InputPropertyValue` with `same_owner` flag set points to the given `Entity`
-    pub fn ensure_inbound_same_owner_rc_is_zero<T: Trait>(&self) -> Result<(), Error<T>> {
-        ensure!(
-            self.reference_counter.is_same_owner_equal_to_zero(),
-            Error::<T>::EntityInboundSameOwnerRcDoesNotEqualToZero
-        );
-        Ok(())
-    }
-
-    /// Get mutable reference to the `Entity`'s `InboundReferenceCounter` instance
-    pub fn get_reference_counter_mut(&mut self) -> &mut InboundReferenceCounter {
-        &mut self.reference_counter
-    }
-}
-
-/// Structure, respresenting inbound entity rcs for each `Entity`
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Copy)]
-pub struct InboundReferenceCounter {
-    /// Total number of inbound references from another entities
-    pub total: u32,
-    /// Number of inbound references from another entities with `SameOwner` flag set
-    pub same_owner: u32,
-}
-
-impl InboundReferenceCounter {
-    /// Create simple `InboundReferenceCounter` instance, based on `same_owner` flag provided
-    pub fn new(reference_counter: u32, same_owner: bool) -> Self {
-        if same_owner {
-            Self {
-                total: reference_counter,
-                same_owner: reference_counter,
-            }
-        } else {
-            Self {
-                total: reference_counter,
-                same_owner: 0,
-            }
-        }
-    }
-
-    /// Check if `total` is equal to zero
-    pub fn is_total_equal_to_zero(self) -> bool {
-        self.total == 0
-    }
-
-    /// Check if `same_owner` is equal to zero
-    pub fn is_same_owner_equal_to_zero(self) -> bool {
-        self.same_owner == 0
-    }
-}

+ 0 - 239
runtime-modules/content-directory/src/errors.rs

@@ -1,239 +0,0 @@
-use crate::*;
-use frame_support::decl_error;
-
-decl_error! {
-    /// Content directory errors
-    pub enum Error for Module<T: Trait> {
-
-        /// Validation errors
-        /// --------------------------------------
-
-
-        /// Property name is too short
-        PropertyNameTooShort,
-
-        /// Property name is too long
-        PropertyNameTooLong,
-
-        /// Property description is too short
-        PropertyDescriptionTooShort,
-
-        /// Property description is too long
-        PropertyDescriptionTooLong,
-
-        /// Class name is too short
-        ClassNameTooShort,
-
-        /// Class name is too long
-        ClassNameTooLong,
-
-        /// Class description is too short
-        ClassDescriptionTooShort,
-
-        /// Class description is too long
-        ClassDescriptionTooLong,
-
-        /// Maximum number of classes limit reached
-        ClassLimitReached,
-
-        /// Maximum number of given class schemas limit reached
-        ClassSchemasLimitReached,
-
-        /// Maximum number of properties in schema limit reached
-        SchemaPropertiesLimitReached,
-
-        /// Entities creation limit per controller should be less than overall entities creation limit
-        PerControllerEntitiesCreationLimitExceedsOverallLimit,
-
-        /// Number of entities per class is to big
-        EntitiesNumberPerClassConstraintViolated,
-
-        /// Number of class entities per actor constraint violated
-        NumberOfClassEntitiesPerActorConstraintViolated,
-
-        /// Individual number of class entities per actor is too big
-        IndividualNumberOfClassEntitiesPerActorIsTooBig,
-
-        /// Number of operations during atomic batching limit reached
-        NumberOfOperationsDuringAtomicBatchingLimitReached,
-
-        /// Text property is too long
-        TextPropertyTooLong,
-
-        /// Text property to be hashed is too long
-        HashedTextPropertyTooLong,
-
-        /// Vector property is too long
-        VecPropertyTooLong,
-
-        /// Propery value vector can`t contain more values
-        EntityPropertyValueVectorIsTooLong,
-
-        /// Given property value vector index is out of range
-        EntityPropertyValueVectorIndexIsOutOfRange,
-
-
-        /// Main logic errors
-        /// --------------------------------------
-
-
-        /// Class was not found by id
-        ClassNotFound,
-
-        /// Class property under given index not found
-        ClassPropertyNotFound,
-
-        /// Unknown class schema id
-        UnknownClassSchemaId,
-
-        /// Given class schema is not active
-        ClassSchemaNotActive,
-
-        /// New class schema refers to an unknown property index
-        ClassSchemaRefersUnknownPropertyIndex,
-
-        /// New class schema refers to an unknown class id
-        ClassSchemaRefersUnknownClass,
-
-        /// Cannot add a class schema with an empty list of properties
-        NoPropertiesInClassSchema,
-
-        /// Entity was not found by id
-        EntityNotFound,
-
-        /// Cannot add a schema that is already added to this entity
-        SchemaAlreadyAddedToTheEntity,
-
-        /// Some of the provided property values don't match the expected property type
-        PropertyValueDoNotMatchType,
-
-        /// Property value don't match the expected vector property type
-        PropertyValueDoNotMatchVecType,
-
-        /// Property value under given index is not a vector
-        PropertyValueUnderGivenIndexIsNotAVector,
-
-        /// Current property value vector nonce does not equal to provided one
-        PropertyValueVecNoncesDoesNotMatch,
-
-        /// Property name is not unique within its class
-        PropertyNameNotUniqueInAClass,
-
-        /// Some required property was not found when adding schema support to entity
-        MissingRequiredProperty,
-
-        /// Schema under provided schema_id does not contain given property
-        SchemaDoesNotContainProvidedPropertyId,
-
-        /// Some of the provided property ids cannot be found on the current list of propery values of this entity
-        UnknownEntityPropertyId,
-
-        /// Entity already contains property under provided index
-        EntityAlreadyContainsGivenPropertyId,
-
-        /// Propery value type does not match internal entity vector type
-        PropertyValueTypeDoesNotMatchInternalVectorType,
-
-        /// Provided property references entity, which class_id is not equal to class_id, declared in corresponding property type
-        ReferencedEntityDoesNotMatchItsClass,
-
-        /// Entity removal can`t be completed, as there are some property values pointing to given entity
-        EntityRcDoesNotEqualToZero,
-
-        /// Entity ownership transfer can`t be completed, as there are some property values pointing to given entity with same owner flag set
-        EntityInboundSameOwnerRcDoesNotEqualToZero,
-
-        /// Provided entity controller is equal to the current one
-        ProvidedEntityControllerIsEqualToTheCurrentOne,
-
-        /// All ids of new property value references with same owner flag set should match their respective Properties defined on Class level
-        AllProvidedPropertyValueIdsMustBeReferencesWithSameOwnerFlagSet,
-
-        /// Entity was not created in batched transaction
-        EntityNotCreatedByOperation,
-
-        /// Permission errors
-        /// --------------------------------------
-
-        /// Curator group can`t be removed, as it currently maintains at least one class
-        CuratorGroupRemovalForbidden,
-
-        /// All property values, related to a given Entity were locked on Class level
-        AllPropertiesWereLockedOnClassLevel,
-
-        /// Curator under provided curator id is not a member of curaror group under given id
-        CuratorIsNotAMemberOfGivenCuratorGroup,
-
-        /// Curator under provided curator id is already a member of curaror group under given id
-        CuratorIsAlreadyAMemberOfGivenCuratorGroup,
-
-        /// Given curator group does not exist
-        CuratorGroupDoesNotExist,
-
-        /// Entity should be referenced from the entity, owned by the same controller
-        SameControllerConstraintViolation,
-
-        /// Given maintainer does not exist
-        MaintainerDoesNotExist,
-
-        /// Given maintainer already exist
-        MaintainerAlreadyExists,
-
-        /// Provided actor can`t create entities of given class
-        ActorCanNotCreateEntities,
-
-        /// Maximum numbers of entities per class limit reached
-        NumberOfEntitiesPerClassLimitReached,
-
-        /// Current class entities creation blocked
-        EntitiesCreationBlocked,
-
-        /// Entities voucher limit reached
-        VoucherLimitReached,
-
-        /// Lead authentication failed
-        LeadAuthFailed,
-
-        /// Member authentication failed
-        MemberAuthFailed,
-
-        /// Curator authentication failed
-        CuratorAuthFailed,
-
-        /// Expected root or signed origin
-        BadOrigin,
-
-        /// Entity removal access denied
-        EntityRemovalAccessDenied,
-
-        /// Add entity schema support access denied
-        EntityAddSchemaSupportAccessDenied,
-
-        /// Class access denied
-        ClassAccessDenied,
-
-        /// Entity access denied
-        EntityAccessDenied,
-
-        /// Given entity can`t be referenced
-        EntityCanNotBeReferenced,
-
-        /// Given class property type is locked for given actor
-        ClassPropertyTypeLockedForGivenActor,
-
-        /// Number of maintainers per class limit reached
-        ClassMaintainersLimitReached,
-
-        /// Max number of curators per group limit reached
-        CuratorsPerGroupLimitReached,
-
-        /// Curator group is not active
-        CuratorGroupIsNotActive,
-
-        /// Origin cannot be made into raw origin
-        OriginCanNotBeMadeIntoRawOrigin,
-
-        /// Property value should be unique across all Entities of this Class
-        PropertyValueShouldBeUnique
-    }
-}

+ 0 - 346
runtime-modules/content-directory/src/helpers.rs

@@ -1,346 +0,0 @@
-use crate::*;
-use core::ops::{Deref, DerefMut};
-
-/// Wrapper for existing `InputPropertyValue` and its respective `Class` `Property`
-pub struct InputValueForExistingProperty<'a, T: Trait>(
-    &'a Property<T::ClassId>,
-    &'a InputPropertyValue<T>,
-);
-
-impl<'a, T: Trait> InputValueForExistingProperty<'a, T> {
-    /// Create single instance of `InputValueForExistingProperty` from provided `property` and `value`
-    fn new(property: &'a Property<T::ClassId>, value: &'a InputPropertyValue<T>) -> Self {
-        Self(property, value)
-    }
-
-    /// Retrieve `Property` reference
-    pub fn get_property(&self) -> &Property<T::ClassId> {
-        self.0
-    }
-
-    /// Retrieve `InputPropertyValue` reference
-    pub fn get_value(&self) -> &InputPropertyValue<T> {
-        self.1
-    }
-
-    /// Retrieve `Property` and `InputPropertyValue` references
-    pub fn unzip(&self) -> (&Property<T::ClassId>, &InputPropertyValue<T>) {
-        (self.0, self.1)
-    }
-}
-
-/// Mapping, used to represent `PropertyId` relation to its respective `InputValueForExistingProperty` structure
-pub struct InputValuesForExistingProperties<'a, T: Trait>(
-    BTreeMap<PropertyId, InputValueForExistingProperty<'a, T>>,
-);
-
-impl<'a, T: Trait> Default for InputValuesForExistingProperties<'a, T> {
-    fn default() -> Self {
-        Self(BTreeMap::default())
-    }
-}
-
-impl<'a, T: Trait> Deref for InputValuesForExistingProperties<'a, T> {
-    type Target = BTreeMap<PropertyId, InputValueForExistingProperty<'a, T>>;
-
-    fn deref(&self) -> &Self::Target {
-        &self.0
-    }
-}
-
-impl<'a, T: Trait> DerefMut for InputValuesForExistingProperties<'a, T> {
-    fn deref_mut(&mut self) -> &mut Self::Target {
-        &mut self.0
-    }
-}
-
-impl<'a, T: Trait> InputValuesForExistingProperties<'a, T> {
-    /// Create `InputValuesForExistingProperties` helper structure from provided `property_values` and their corresponding `Class` properties.
-    /// Throws an error, when `Class` `Property` under `property_id`, corresponding to provided `property_value` not found
-    pub fn from(
-        properties: &'a [Property<T::ClassId>],
-        property_values: &'a BTreeMap<PropertyId, InputPropertyValue<T>>,
-    ) -> Result<Self, Error<T>> {
-        let mut values_for_existing_properties = InputValuesForExistingProperties::<T>::default();
-        for (&property_id, property_value) in property_values {
-            let property = properties
-                .get(property_id as usize)
-                .ok_or(Error::<T>::ClassPropertyNotFound)?;
-            values_for_existing_properties.insert(
-                property_id,
-                InputValueForExistingProperty::new(property, property_value),
-            );
-        }
-        Ok(values_for_existing_properties)
-    }
-}
-
-/// Wrapper for existing `StoredPropertyValue` and its respective `Class` `Property`
-pub struct StoredValueForExistingProperty<'a, T: Trait>(
-    &'a Property<T::ClassId>,
-    &'a StoredPropertyValueOf<T>,
-);
-
-impl<'a, T: Trait> StoredValueForExistingProperty<'a, T> {
-    /// Create single instance of `StoredValueForExistingProperty` from provided `property` and `value`
-    pub fn new(property: &'a Property<T::ClassId>, value: &'a StoredPropertyValueOf<T>) -> Self {
-        Self(property, value)
-    }
-
-    /// Retrieve `Property` reference
-    pub fn get_property(&self) -> &Property<T::ClassId> {
-        self.0
-    }
-
-    /// Retrieve `StoredPropertyValue` reference
-    pub fn get_value(&self) -> &StoredPropertyValueOf<T> {
-        self.1
-    }
-
-    /// Retrieve `Property` and `StoredPropertyValue` references
-    pub fn unzip(&self) -> (&Property<T::ClassId>, &StoredPropertyValueOf<T>) {
-        (self.0, self.1)
-    }
-
-    /// Check if Property is default and non `required`
-    pub fn is_default(&self) -> bool {
-        let (property, property_value) = self.unzip();
-        !property.required
-            && *property_value == StoredPropertyValue::<T::Hash, T::EntityId, T::Nonce>::default()
-    }
-}
-
-/// Mapping, used to represent `PropertyId` relation to its respective `StoredValuesForExistingProperties` structure
-pub struct StoredValuesForExistingProperties<'a, T: Trait>(
-    BTreeMap<PropertyId, StoredValueForExistingProperty<'a, T>>,
-);
-
-impl<'a, T: Trait> Default for StoredValuesForExistingProperties<'a, T> {
-    fn default() -> Self {
-        Self(BTreeMap::default())
-    }
-}
-
-impl<'a, T: Trait> Deref for StoredValuesForExistingProperties<'a, T> {
-    type Target = BTreeMap<PropertyId, StoredValueForExistingProperty<'a, T>>;
-
-    fn deref(&self) -> &Self::Target {
-        &self.0
-    }
-}
-
-impl<'a, T: Trait> DerefMut for StoredValuesForExistingProperties<'a, T> {
-    fn deref_mut(&mut self) -> &mut Self::Target {
-        &mut self.0
-    }
-}
-
-impl<'a, T: Trait> StoredValuesForExistingProperties<'a, T> {
-    /// Create `StoredValuesForExistingProperties` helper structure from provided `property_values` and their corresponding `Class` properties.
-    pub fn from(
-        properties: &'a [Property<T::ClassId>],
-        property_values: &'a BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-    ) -> Result<Self, Error<T>> {
-        let mut values_for_existing_properties = StoredValuesForExistingProperties::<T>::default();
-
-        for (&property_id, property_value) in property_values {
-            let property = properties
-                .get(property_id as usize)
-                .ok_or(Error::<T>::ClassPropertyNotFound)?;
-            values_for_existing_properties.insert(
-                property_id,
-                StoredValueForExistingProperty::new(property, property_value),
-            );
-        }
-        Ok(values_for_existing_properties)
-    }
-
-    /// Used to compute hashes from `StoredPropertyValue`s and their respective property ids, which respective `Properties` have `unique` flag set
-    /// (skip `PropertyId`s, which respective `property values` under this `Entity` are default and non `required`)
-    pub fn compute_unique_hashes(&self) -> BTreeMap<PropertyId, T::Hash> {
-        self.iter()
-            .filter(|(_, value_for_property)| {
-                // skip `PropertyId`s, which respective `property values` under this `Entity` are default and non `required`
-                value_for_property.get_property().unique && !value_for_property.is_default()
-            })
-            .map(|(&property_id, property_value)| {
-                (
-                    property_id,
-                    property_value
-                        .get_value()
-                        .compute_unique_hash::<T>(property_id),
-                )
-            })
-            .collect()
-    }
-}
-
-/// Length constraint for input validation
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Default, Clone, Copy, PartialEq, Eq)]
-pub struct InputValidationLengthConstraint {
-    /// Minimum length
-    min: u16,
-
-    /// Difference between minimum length and max length.
-    /// While having max would have been more direct, this
-    /// way makes max < min unrepresentable semantically,
-    /// which is safer.
-    max_min_diff: u16,
-}
-
-impl InputValidationLengthConstraint {
-    /// Create new `InputValidationLengthConstraint` constraint
-    pub const fn new(min: u16, max_min_diff: u16) -> Self {
-        Self { min, max_min_diff }
-    }
-
-    /// Helper for computing max
-    pub fn max(self) -> u16 {
-        self.min + self.max_min_diff
-    }
-
-    /// Retrieve min length value
-    pub fn min(self) -> u16 {
-        self.min
-    }
-
-    /// Ensure length is valid
-    pub fn ensure_valid<T: Trait>(
-        self,
-        len: usize,
-        too_short_msg: Error<T>,
-        too_long_msg: Error<T>,
-    ) -> Result<(), Error<T>> {
-        let length = len as u16;
-        if length < self.min {
-            Err(too_short_msg)
-        } else if length > self.max() {
-            Err(too_long_msg)
-        } else {
-            Ok(())
-        }
-    }
-}
-
-/// Enum, used to specify, which mode of operation should be chosen
-#[derive(Clone, PartialEq, Eq, Copy)]
-pub enum DeltaMode {
-    Increment,
-    Decrement,
-}
-
-impl Default for DeltaMode {
-    fn default() -> Self {
-        Self::Increment
-    }
-}
-
-/// Representing delta on which respective `InboundReferenceCounter` should be changed.
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Default, PartialEq, Eq)]
-pub struct EntityReferenceCounterSideEffect {
-    /// Delta number of all inbound references from another entities
-    pub total: i32,
-    /// Delta number of inbound references from another entities with `SameOwner` flag set
-    pub same_owner: i32,
-}
-
-impl Clone for EntityReferenceCounterSideEffect {
-    fn clone(&self) -> Self {
-        *self
-    }
-}
-
-impl Copy for EntityReferenceCounterSideEffect {}
-
-impl EntityReferenceCounterSideEffect {
-    /// Create atomic `EntityReferenceCounterSideEffect` instance, based on `same_owner` flag provided and `DeltaMode`
-    pub fn atomic(same_owner: bool, delta_mode: DeltaMode) -> Self {
-        let counter = if let DeltaMode::Increment = delta_mode {
-            1
-        } else {
-            -1
-        };
-
-        if same_owner {
-            Self {
-                total: counter,
-                same_owner: counter,
-            }
-        } else {
-            Self {
-                total: counter,
-                same_owner: 0,
-            }
-        }
-    }
-}
-
-impl AddAssign for EntityReferenceCounterSideEffect {
-    fn add_assign(&mut self, other: EntityReferenceCounterSideEffect) {
-        *self = Self {
-            total: self.total + other.total,
-            same_owner: self.same_owner + other.same_owner,
-        };
-    }
-}
-
-/// The net side effect on a set of entities from some operations.
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
-pub struct ReferenceCounterSideEffects<T: Trait>(
-    BTreeMap<T::EntityId, EntityReferenceCounterSideEffect>,
-);
-
-impl<T: Trait> Deref for ReferenceCounterSideEffects<T> {
-    type Target = BTreeMap<T::EntityId, EntityReferenceCounterSideEffect>;
-
-    fn deref(&self) -> &Self::Target {
-        &self.0
-    }
-}
-
-impl<T: Trait> DerefMut for ReferenceCounterSideEffects<T> {
-    fn deref_mut(&mut self) -> &mut Self::Target {
-        &mut self.0
-    }
-}
-
-impl<T: Trait> Default for ReferenceCounterSideEffects<T> {
-    fn default() -> Self {
-        Self(BTreeMap::default())
-    }
-}
-
-impl<T: Trait> ReferenceCounterSideEffects<T> {
-    /// Updates all the elements of `other` with `Self`
-    pub fn update(mut self, other: Self) -> Self {
-        // Make a set, that includes both self and other entity_id keys
-        let entity_ids: BTreeSet<T::EntityId> = self.keys().chain(other.keys()).copied().collect();
-
-        for entity_id in entity_ids {
-            // If `self` contains value under provided `entity_id`,
-            // increase it on `EntityReferenceCounterSideEffect` value from `other` if exists,
-            // otherwise update `self` entry under provided `entity_id` with `EntityReferenceCounterSideEffect` from `other`
-            match (self.get_mut(&entity_id), other.get(&entity_id)) {
-                (Some(self_entity_rc_side_effect), Some(other_entity_rc_side_effect)) => {
-                    *self_entity_rc_side_effect += *other_entity_rc_side_effect
-                }
-                (_, Some(other_entity_rc_side_effect)) => {
-                    self.insert(entity_id, *other_entity_rc_side_effect);
-                }
-                _ => (),
-            }
-        }
-        self
-    }
-
-    /// Traverse `ReferenceCounterSideEffects`, updating each `Entity` respective reference counters
-    pub fn update_entities_rcs(&self) {
-        self.iter()
-            .for_each(|(entity_id, inbound_reference_counter_delta)| {
-                Module::<T>::update_entity_rc(*entity_id, *inbound_reference_counter_delta);
-            });
-    }
-}

+ 0 - 2920
runtime-modules/content-directory/src/lib.rs

@@ -1,2920 +0,0 @@
-//! # Content Directory Module
-//!
-//! The content directory is an on-chain index of all content and metadata,
-//! and related concepts - such as channels and playlists.
-//!
-//! - [`substrate_content_directory_module::Trait`](./trait.Trait.html)
-//! - [`Call`](./enum.Call.html)
-//! - [`Module`](./struct.Module.html)
-//!
-//! ## Overview
-//!
-//! The content directory provides functions for:
-//!
-//! - Creating/removal and managing curator groups
-//! - Creating classes and managing their permissions
-//! - Adding schemas to the class
-//! - Creating and removal of entities and managing their permissions
-//! - Adding schemas support to the respective class entities
-//! - Transfering entities ownership
-//! - Updating entity property values
-//!
-//! ## Terminology
-//!
-//! ### Class
-//!
-//! - **Class Properties:** All properties that have been used on this class across different class schemas.
-//! Unlikely to be more than roughly 20 properties per class, often less.
-//! For Person, think "height", "weight", etc.
-//!
-//! - **Schemas:**  All schemas, that are available for this class, think v0.0 Person, v.1.0 Person, etc.
-//!
-//! ### Entity
-//!
-//! - **Supported Schemas:**  What schemas under which entity of the respective class is available, think
-//! v.2.0 Person schema for John, v3.0 Person schema for John
-//! Unlikely to be more than roughly 20ish, assuming schemas for a given class eventually stableize,
-//! or that very old schema are eventually removed.
-//!
-//! - **Property Values:**  Values for properties, declared on class level,
-//! that are used in respective Class Entity after adding Schema support.
-//!
-//! ## Interface
-//!
-//! ### Dispatchable Functions
-//!
-//! #### Curator groups
-//!
-//! - `add_curator_group` - Add new curator group to the runtime storage
-//! - `remove_curator_group` - Remove curator group under given `curator_group_id` from runtime storage.
-//! The origin of this call must be a blog owner.
-//! - `set_curator_group_status` - Set activity status for curator group under given `curator_group_id`
-//! - `add_curator_to_group` - Add curator to curator group under given `curator_group_id`
-//! - `remove_curator_from_group` - Remove curator from a given curator group.
-//!
-//! #### Classes
-//!
-//! - `create_class` - Create new class with provided parameters
-//! - `add_maintainer_to_class` - Add curator group under given curator_group_id as class maintainer
-//! - `remove_maintainer_from_class` - Remove curator group under given curator_group_id from class maintainers set
-//! - `update_class_permissions` - Update class permissions under specific class_id
-//! - `add_class_schema` - Create new class schema from existing property ids and new properties
-//! - `update_class_schema_status` - Update schema status  under specific schema_id in class
-//!
-//! #### Entities
-//!
-//! - `create_entity` - Create new entity of respective class
-//! - `remove_entity` - Remove entity under provided entity_id
-//! - `update_entity_permissions` - Update entity permissions
-//! - `add_schema_support_to_entity` - add schema support to entity under given schema_id and provided property values
-//! - `update_entity_property_values` - Update entity property values with provided ones
-//! - `clear_entity_property_vector` - Clear property value vector under given entity_id & in class schema property id
-//! - `remove_at_entity_property_vector` - Remove value at given index_in_property_vector
-//! from property values vector under in_class schema property id
-//! - `insert_at_entity_property_vector` - Insert single input property values at given index in property vector
-//! into  property values vector under in class schema property id
-//!
-//! #### Others
-//!
-//! - `update_entity_creation_voucher` - Update/create new entity creation voucher for given entity controller with individual limit
-//! - `transaction` - This extrinsic allows a batch operation, which is atomic, over the following operations:
-//! **Entity creation**
-//! **Adding schema support to the entity**
-//! **Update property values of the entity**
-//!
-//! ## Usage
-//!
-//! The following example shows how to use the content directory module in your custom module.
-//!
-//! ### Prerequisites
-//!
-//! Import the content directory module into your custom module and derive the module configuration
-//! trait from the content directory trait.
-//!
-//! ### Add curator group
-//!
-//! ```
-//! use frame_support::{decl_module, assert_ok};
-//! use system::{self as system, ensure_signed};
-//!
-//! pub trait Trait: pallet_content_directory::Trait {}
-//!
-//! decl_module! {
-//!     pub struct Module<T: Trait> for enum Call where origin: T::Origin {
-//!         #[weight = 10_000_000]
-//!         pub fn add_curator_group(origin) -> Result<(), &'static str> {
-//!             <pallet_content_directory::Module<T>>::add_curator_group(origin)?;
-//!             Ok(())
-//!         }
-//!     }
-//! }
-//! # fn main() {}
-//! ```
-
-// Ensure we're `no_std` when compiling for Wasm.
-#![cfg_attr(not(feature = "std"), no_std)]
-#![recursion_limit = "256"]
-
-#[cfg(test)]
-mod tests;
-
-mod class;
-mod entity;
-mod errors;
-mod helpers;
-mod mock;
-mod operations;
-mod permissions;
-mod schema;
-
-pub use class::*;
-pub use entity::*;
-pub use errors::*;
-pub use helpers::*;
-pub use operations::*;
-pub use permissions::*;
-pub use schema::*;
-
-use core::hash::Hash;
-use core::ops::AddAssign;
-
-use codec::{Codec, Decode, Encode};
-use frame_support::storage::IterableStorageMap;
-
-use frame_support::{
-    decl_event, decl_module, decl_storage,
-    dispatch::{DispatchError, DispatchResult},
-    ensure,
-    traits::Get,
-    Parameter,
-};
-#[cfg(feature = "std")]
-pub use serde::{Deserialize, Serialize};
-use sp_arithmetic::traits::{BaseArithmetic, One, Zero};
-use sp_runtime::traits::{MaybeSerializeDeserialize, Member};
-use sp_std::borrow::ToOwned;
-use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet};
-use sp_std::vec;
-use sp_std::vec::Vec;
-use system::ensure_signed;
-
-pub use errors::Error;
-
-use core::debug_assert;
-
-/// Type, used in diffrent numeric constraints representations
-pub type MaxNumber = u32;
-
-/// Type simplification
-pub type EntityOf<T> = Entity<
-    <T as Trait>::ClassId,
-    <T as ActorAuthenticator>::MemberId,
-    <T as system::Trait>::Hash,
-    <T as Trait>::EntityId,
-    <T as Trait>::Nonce,
->;
-
-/// Type simplification
-pub type ClassOf<T> =
-    Class<<T as Trait>::EntityId, <T as Trait>::ClassId, <T as ActorAuthenticator>::CuratorGroupId>;
-
-/// Type simplification
-pub type StoredPropertyValueOf<T> =
-    StoredPropertyValue<<T as system::Trait>::Hash, <T as Trait>::EntityId, <T as Trait>::Nonce>;
-
-/// Module configuration trait for this Substrate module.
-pub trait Trait: system::Trait + ActorAuthenticator + Clone {
-    /// The overarching event type.
-    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
-
-    /// Nonce type is used to avoid data race update conditions, when performing property value vector operations
-    type Nonce: Parameter
-        + Member
-        + BaseArithmetic
-        + Codec
-        + Default
-        + Copy
-        + Clone
-        + MaybeSerializeDeserialize
-        + Eq
-        + PartialEq
-        + Ord
-        + From<u32>;
-
-    /// Type of identifier for classes
-    type ClassId: Parameter
-        + Member
-        + BaseArithmetic
-        + Codec
-        + Default
-        + Copy
-        + Clone
-        + Hash
-        + MaybeSerializeDeserialize
-        + Eq
-        + PartialEq
-        + Ord;
-
-    /// Type of identifier for entities
-    type EntityId: Parameter
-        + Member
-        + BaseArithmetic
-        + Codec
-        + Default
-        + Copy
-        + Clone
-        + Hash
-        + MaybeSerializeDeserialize
-        + Eq
-        + PartialEq
-        + Ord;
-
-    /// Security/configuration constraints
-
-    /// Type, representing min & max property name length constraints
-    type PropertyNameLengthConstraint: Get<InputValidationLengthConstraint>;
-
-    /// Type, representing min & max property description length constraints
-    type PropertyDescriptionLengthConstraint: Get<InputValidationLengthConstraint>;
-
-    /// Type, representing min & max class name length constraints
-    type ClassNameLengthConstraint: Get<InputValidationLengthConstraint>;
-
-    /// Type, representing min & max class description length constraints
-    type ClassDescriptionLengthConstraint: Get<InputValidationLengthConstraint>;
-
-    /// The maximum number of classes
-    type MaxNumberOfClasses: Get<MaxNumber>;
-
-    /// The maximum number of maintainers per class constraint
-    type MaxNumberOfMaintainersPerClass: Get<MaxNumber>;
-
-    /// The maximum number of curators per group constraint
-    type MaxNumberOfCuratorsPerGroup: Get<MaxNumber>;
-
-    /// The maximum number of schemas per class constraint
-    type MaxNumberOfSchemasPerClass: Get<MaxNumber>;
-
-    /// The maximum number of properties per class constraint
-    type MaxNumberOfPropertiesPerSchema: Get<MaxNumber>;
-
-    /// The maximum number of operations during single invocation of `transaction`
-    type MaxNumberOfOperationsDuringAtomicBatching: Get<MaxNumber>;
-
-    /// The maximum length of vector property value constarint
-    type VecMaxLengthConstraint: Get<VecMaxLength>;
-
-    /// The maximum length of text property value constarint
-    type TextMaxLengthConstraint: Get<TextMaxLength>;
-
-    /// The maximum length of text, that will be hashed property value constarint
-    type HashedTextMaxLengthConstraint: Get<HashedTextMaxLength>;
-
-    /// Entities creation constraint per class
-    type MaxNumberOfEntitiesPerClass: Get<Self::EntityId>;
-
-    /// Entities creation constraint per individual
-    type IndividualEntitiesCreationLimit: Get<Self::EntityId>;
-}
-
-decl_storage! {
-    trait Store for Module<T: Trait> as ContentDirectory {
-
-        /// Map, representing ClassId -> Class relation
-        pub ClassById get(fn class_by_id) config(): map hasher(blake2_128_concat) T::ClassId => ClassOf<T>;
-
-        /// Map, representing EntityId -> Entity relation
-        pub EntityById get(fn entity_by_id) config(): map hasher(blake2_128_concat) T::EntityId => EntityOf<T>;
-
-        /// Map, representing  CuratorGroupId -> CuratorGroup relation
-        pub CuratorGroupById get(fn curator_group_by_id) config(): map hasher(blake2_128_concat) T::CuratorGroupId => CuratorGroup<T>;
-
-        /// Mapping of class id and its property id to the respective entity id and property value hash.
-        pub UniquePropertyValueHashes get(fn unique_property_value_hashes): double_map hasher(blake2_128_concat) (T::ClassId, PropertyId), hasher(blake2_128_concat) T::Hash => ();
-
-        /// Next runtime storage values used to maintain next id value, used on creation of respective curator groups, classes and entities
-
-        pub NextClassId get(fn next_class_id) config(): T::ClassId;
-
-        pub NextEntityId get(fn next_entity_id) config(): T::EntityId;
-
-        pub NextCuratorGroupId get(fn next_curator_group_id) config(): T::CuratorGroupId;
-
-        // The voucher associated with entity creation for a given class and controller.
-        // Is updated whenever an entity is created in a given class by a given controller.
-        // Constraint is updated by Root, an initial value comes from `ClassPermissions::default_entity_creation_voucher_upper_bound`.
-        pub EntityCreationVouchers get(fn entity_creation_vouchers):
-            double_map hasher(blake2_128_concat) T::ClassId, hasher(blake2_128_concat) EntityController<T::MemberId> => EntityCreationVoucher<T>;
-    }
-}
-
-decl_module! {
-    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
-        /// Predefined errors
-        type Error = Error<T>;
-
-        /// Initializing events
-        fn deposit_event() = default;
-
-        // ======
-        // Next set of extrinsics can only be invoked by lead.
-        // ======
-
-        /// Add new curator group to runtime storage
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn add_curator_group(
-            origin,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            let curator_group_id = Self::next_curator_group_id();
-
-            // Insert empty curator group with `active` parameter set to false
-            <CuratorGroupById<T>>::insert(curator_group_id, CuratorGroup::<T>::default());
-
-            // Increment the next curator curator_group_id:
-            <NextCuratorGroupId<T>>::mutate(|n| *n += T::CuratorGroupId::one());
-
-            // Trigger event
-            Self::deposit_event(RawEvent::CuratorGroupAdded(curator_group_id));
-            Ok(())
-        }
-
-        /// Remove curator group under given `curator_group_id` from runtime storage
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn remove_curator_group(
-            origin,
-            curator_group_id: T::CuratorGroupId,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure CuratorGroup under given curator_group_id exists
-            let curator_group = Self::ensure_curator_group_exists(&curator_group_id)?;
-
-            // We should previously ensure that curator_group  maintains no classes to be able to remove it
-            curator_group.ensure_curator_group_maintains_no_classes()?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-
-            // Remove curator group under given curator group id from runtime storage
-            <CuratorGroupById<T>>::remove(curator_group_id);
-
-            // Trigger event
-            Self::deposit_event(RawEvent::CuratorGroupRemoved(curator_group_id));
-            Ok(())
-        }
-
-        /// Set `is_active` status for curator group under given `curator_group_id`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn set_curator_group_status(
-            origin,
-            curator_group_id: T::CuratorGroupId,
-            is_active: bool,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure curator group under provided curator_group_id already exist
-            Self::ensure_curator_group_under_given_id_exists(&curator_group_id)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Set `is_active` status for curator group under given `curator_group_id`
-            <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
-                curator_group.set_status(is_active)
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::CuratorGroupStatusSet(curator_group_id, is_active));
-            Ok(())
-        }
-
-        /// Add curator to curator group under given `curator_group_id`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn add_curator_to_group(
-            origin,
-            curator_group_id: T::CuratorGroupId,
-            curator_id: T::CuratorId,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure curator group under provided curator_group_id already exist, retrieve corresponding one
-            let curator_group = Self::ensure_curator_group_exists(&curator_group_id)?;
-
-            // Ensure max number of curators per group limit not reached yet
-            curator_group.ensure_max_number_of_curators_limit_not_reached()?;
-
-            // Ensure curator under provided curator_id isn`t a CuratorGroup member yet
-            curator_group.ensure_curator_in_group_does_not_exist(&curator_id)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Insert curator_id into curator_group under given curator_group_id
-            <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
-                curator_group.get_curators_mut().insert(curator_id);
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::CuratorAdded(curator_group_id, curator_id));
-            Ok(())
-        }
-
-        /// Remove curator from a given curator group
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn remove_curator_from_group(
-            origin,
-            curator_group_id: T::CuratorGroupId,
-            curator_id: T::CuratorId,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure curator group under provided curator_group_id already exist, retrieve corresponding one
-            let curator_group = Self::ensure_curator_group_exists(&curator_group_id)?;
-
-            // Ensure curator under provided curator_id is CuratorGroup member
-            curator_group.ensure_curator_in_group_exists(&curator_id)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Remove curator_id from curator_group under given curator_group_id
-            <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
-                curator_group.get_curators_mut().remove(&curator_id);
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::CuratorRemoved(curator_group_id, curator_id));
-            Ok(())
-        }
-
-        /// Updates or creates new `EntityCreationVoucher` for given `EntityController` with individual limit
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn update_entity_creation_voucher(
-            origin,
-            class_id: T::ClassId,
-            controller: EntityController<T::MemberId>,
-            maximum_entities_count: T::EntityId
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Class under given id exists, return corresponding one
-            Self::ensure_known_class_id(class_id)?;
-
-            // Ensure maximum_entities_count does not exceed individual entities creation limit
-            Self::ensure_valid_number_of_class_entities_per_actor_constraint(maximum_entities_count)?;
-
-            // Check voucher existance
-            let voucher_exists = <EntityCreationVouchers<T>>::contains_key(class_id, &controller);
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            if voucher_exists {
-
-                // Set new maximum_entities_count limit for selected voucher
-                let mut entity_creation_voucher = Self::entity_creation_vouchers(class_id, &controller);
-
-                entity_creation_voucher.set_maximum_entities_count(maximum_entities_count);
-
-                <EntityCreationVouchers<T>>::insert(class_id, controller.clone(), entity_creation_voucher.clone());
-
-                // Trigger event
-                Self::deposit_event(RawEvent::EntityCreationVoucherUpdated(controller, entity_creation_voucher))
-            } else {
-                // Create new EntityCreationVoucher instance with provided maximum_entities_count
-                let entity_creation_voucher = EntityCreationVoucher::new(maximum_entities_count);
-
-                // Add newly created `EntityCreationVoucher` into `EntityCreationVouchers`
-                // runtime storage under given `class_id`, `controller` key
-                <EntityCreationVouchers<T>>::insert(class_id, controller.clone(), entity_creation_voucher.clone());
-
-                // Trigger event
-                Self::deposit_event(RawEvent::EntityCreationVoucherCreated(controller, entity_creation_voucher));
-            }
-
-            Ok(())
-        }
-
-        /// Create new `Class` with provided parameters
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn create_class(
-            origin,
-            name: Vec<u8>,
-            description: Vec<u8>,
-            class_permissions: ClassPermissions<T::CuratorGroupId>,
-            maximum_entities_count: T::EntityId,
-            default_entity_creation_voucher_upper_bound: T::EntityId
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure, that all entities creation limits, defined for a given Class, are valid
-            Self::ensure_entities_creation_limits_are_valid(maximum_entities_count, default_entity_creation_voucher_upper_bound)?;
-
-            // Ensure max number of classes limit not reached
-            Self::ensure_class_limit_not_reached()?;
-
-            // Ensure ClassNameLengthConstraint conditions satisfied
-            Self::ensure_class_name_is_valid(&name)?;
-
-            // Ensure ClassDescriptionLengthConstraint conditions satisfied
-            Self::ensure_class_description_is_valid(&description)?;
-
-            // Perform required checks to ensure class_maintainers under provided class_permissions are valid
-            let class_maintainers = class_permissions.get_maintainers();
-            Self::ensure_class_maintainers_are_valid(class_maintainers)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Create new Class instance from provided values
-            let class = Class::new(
-                class_permissions, name, description, maximum_entities_count, default_entity_creation_voucher_upper_bound
-            );
-
-            let class_id = Self::next_class_id();
-
-            // Add new `Class` to runtime storage
-            <ClassById<T>>::insert(&class_id, class);
-
-            // Increment the next class id:
-            <NextClassId<T>>::mutate(|n| *n += T::ClassId::one());
-
-            // Trigger event
-            Self::deposit_event(RawEvent::ClassCreated(class_id));
-            Ok(())
-        }
-
-        /// Add curator group under given `curator_group_id` as `Class` maintainer
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn add_maintainer_to_class(
-            origin,
-            class_id: T::ClassId,
-            curator_group_id: T::CuratorGroupId,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Class under provided class_id exist, retrieve corresponding one
-            let class = Self::ensure_known_class_id(class_id)?;
-
-            // Ensure CuratorGroup under provided curator_group_id exist, retrieve corresponding one
-            Self::ensure_curator_group_under_given_id_exists(&curator_group_id)?;
-
-            // Ensure the max number of maintainers per Class limit not reached
-            let class_permissions = class.get_permissions_ref();
-
-            // Ensure max number of maintainers per Class constraint satisfied
-            Self::ensure_maintainers_limit_not_reached(class_permissions.get_maintainers())?;
-
-            // Ensure maintainer under provided curator_group_id is not added to the Class maintainers set yet
-            class_permissions.ensure_maintainer_does_not_exist::<T>(&curator_group_id)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Insert `curator_group_id` into `maintainers` set, associated with given `Class`
-            <ClassById<T>>::mutate(class_id, |class|
-                class.get_permissions_mut().get_maintainers_mut().insert(curator_group_id)
-            );
-
-            // Increment the number of classes, curator group under given `curator_group_id` maintains
-            Self::increment_number_of_classes_maintained_by_curator_group(curator_group_id);
-
-            // Trigger event
-            Self::deposit_event(RawEvent::MaintainerAdded(class_id, curator_group_id));
-            Ok(())
-        }
-
-        /// Remove curator group under given `curator_group_id` from `Class` maintainers set
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn remove_maintainer_from_class(
-            origin,
-            class_id: T::ClassId,
-            curator_group_id: T::CuratorGroupId,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Class under given id exists, return corresponding one
-            let class = Self::ensure_known_class_id(class_id)?;
-
-            // Ensure maintainer under provided curator_group_id was previously added
-            // to the maintainers set, associated with corresponding Class
-            class.get_permissions_ref().ensure_maintainer_exists::<T>(&curator_group_id)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Remove `curator_group_id` from `maintainers` set, associated with given `Class`
-            <ClassById<T>>::mutate(class_id, |class|
-                class.get_permissions_mut().get_maintainers_mut().remove(&curator_group_id)
-            );
-
-            // Decrement the number of classes, curator group under given `curator_group_id` maintains
-            Self::decrement_number_of_classes_maintained_by_curator_group(curator_group_id);
-
-            // Trigger event
-            Self::deposit_event(RawEvent::MaintainerRemoved(class_id, curator_group_id));
-            Ok(())
-        }
-
-        /// Update `ClassPermissions` under specific `class_id`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn update_class_permissions(
-            origin,
-            class_id: T::ClassId,
-            updated_any_member: Option<bool>,
-            updated_entity_creation_blocked: Option<bool>,
-            updated_all_entity_property_values_locked: Option<bool>,
-            updated_maintainers: Option<BTreeSet<T::CuratorGroupId>>,
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Class under given id exists, return corresponding one
-            let class = Self::ensure_known_class_id(class_id)?;
-
-            // Perform required checks to ensure class_maintainers are valid
-            if let Some(ref updated_maintainers) = updated_maintainers {
-                Self::ensure_class_maintainers_are_valid(updated_maintainers)?;
-            }
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            let class_permissions = class.get_permissions();
-
-            // Make updated class_permissions from parameters provided
-            let updated_class_permissions = Self::make_updated_class_permissions(
-                &class_permissions, updated_any_member, updated_entity_creation_blocked,
-                updated_all_entity_property_values_locked, updated_maintainers
-            );
-
-            // If class_permissions update has been performed
-            if let Some(updated_class_permissions) = updated_class_permissions  {
-
-                // Decrement number of classes, maintained by each curator group removed from maintainers set.
-                let curator_group_ids_to_decrement_number_of_classes: BTreeSet<_> =
-                    class_permissions.get_maintainers().difference(updated_class_permissions.get_maintainers()).cloned().collect();
-
-                Self::decrement_number_of_classes_maintained_by_curator_groups(curator_group_ids_to_decrement_number_of_classes);
-
-                // Increment number of classes, maintained by each curator group added to maintainers set.
-                let curator_group_ids_to_increment_number_of_classes: BTreeSet<_> =
-                    updated_class_permissions.get_maintainers().difference(class_permissions.get_maintainers()).cloned().collect();
-
-                Self::increment_number_of_classes_maintained_by_curator_groups(curator_group_ids_to_increment_number_of_classes);
-
-                // Update `class_permissions` under given class id
-                <ClassById<T>>::mutate(class_id, |class| {
-                    class.update_permissions(updated_class_permissions)
-                });
-
-                // Trigger event
-                Self::deposit_event(RawEvent::ClassPermissionsUpdated(class_id));
-            }
-
-            Ok(())
-        }
-
-        /// Create new class schema from existing property ids and new properties
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn add_class_schema(
-            origin,
-            class_id: T::ClassId,
-            existing_properties: BTreeSet<PropertyId>,
-            new_properties: Vec<Property<T::ClassId>>
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Class under given id exists, return corresponding one
-            let class = Self::ensure_known_class_id(class_id)?;
-
-            // Ensure Schemas limit per Class not reached
-            class.ensure_schemas_limit_not_reached::<T>()?;
-
-            // Ensure both existing and new properties for future Schema are not empty
-            Self::ensure_non_empty_schema(&existing_properties, &new_properties)?;
-
-            // Ensure max number of properties per Schema limit not reached
-            class.ensure_properties_limit_not_reached::<T>(&new_properties)?;
-
-            // Complete all checks to ensure all provided new_properties are valid
-            Self::ensure_all_properties_are_valid(&new_properties)?;
-
-            // Id of next Class Schema being added
-            let schema_id = class.get_schemas().len() as SchemaId;
-
-            let class_properties = class.get_properties();
-
-            // Ensure all Property names are unique within Class
-            Self::ensure_all_property_names_are_unique(&class_properties, &new_properties)?;
-
-            // Ensure existing_properties are valid indices of properties, corresponding to chosen Class
-            Self::ensure_schema_properties_are_valid_indices(&existing_properties, &class_properties)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Create `Schema` instance from existing and new property ids
-            let schema = Self::create_class_schema(existing_properties, &class_properties, &new_properties);
-
-            // Update class properties after new `Schema` added
-            let updated_class_properties = Self::make_updated_class_properties(class_properties, new_properties);
-
-            // Update Class properties and schemas
-            <ClassById<T>>::mutate(class_id, |class| {
-                class.set_properties(updated_class_properties);
-                class.get_schemas_mut().push(schema);
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::ClassSchemaAdded(class_id, schema_id));
-
-            Ok(())
-        }
-
-        /// Update `schema_status` under specific `schema_id` in `Class`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn update_class_schema_status(
-            origin,
-            class_id: T::ClassId,
-            schema_id: SchemaId,
-            schema_status: bool
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Class under given id exists, return corresponding one
-            let class = Self::ensure_known_class_id(class_id)?;
-
-            // Ensure Class already contains schema under provided schema_id
-            class.ensure_schema_id_exists::<T>(schema_id)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Update class schema status
-            <ClassById<T>>::mutate(class_id, |class| {
-                class.update_schema_status(schema_id, schema_status)
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::ClassSchemaStatusUpdated(class_id, schema_id, schema_status));
-            Ok(())
-        }
-
-        /// Update entity permissions
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn update_entity_permissions(
-            origin,
-            entity_id: T::EntityId,
-            updated_frozen: Option<bool>,
-            updated_referenceable: Option<bool>
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Entity under given id exists, return corresponding one
-            let entity = Self::ensure_known_entity_id(entity_id)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Make updated entity_permissions from parameters provided
-            let entity_permissions = entity.get_permissions();
-
-            let updated_entity_permissions =
-                Self::make_updated_entity_permissions(entity_permissions, updated_frozen, updated_referenceable);
-
-            // Update entity permissions under given entity id
-            if let Some(updated_entity_permissions) = updated_entity_permissions {
-
-                <EntityById<T>>::mutate(entity_id, |entity| {
-                    entity.update_permissions(updated_entity_permissions)
-                });
-
-                // Trigger event
-                Self::deposit_event(RawEvent::EntityPermissionsUpdated(entity_id));
-            }
-            Ok(())
-        }
-
-        /// Transfer ownership to new `EntityController` for `Entity` under given `entity_id`
-        /// `new_property_value_references_with_same_owner_flag_set` should be provided manually
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn transfer_entity_ownership(
-            origin,
-            entity_id: T::EntityId,
-            new_controller: EntityController<T::MemberId>,
-            new_property_value_references_with_same_owner_flag_set: BTreeMap<PropertyId, InputPropertyValue<T>>
-        ) -> DispatchResult {
-
-            // Ensure given origin is lead
-            ensure_is_lead::<T>(origin)?;
-
-            // Ensure Entity under given entity_id exists, retrieve corresponding Entity & Class
-            let (entity, class) = Self::ensure_known_entity_and_class(entity_id)?;
-
-            // Ensure provided new_entity_controller is not equal to current one
-            entity.get_permissions_ref().ensure_controllers_are_not_equal::<T>(&new_controller)?;
-
-            // Ensure any inbound InputPropertyValue::Reference with same_owner flag set points to the given Entity
-            entity.ensure_inbound_same_owner_rc_is_zero::<T>()?;
-
-            let class_properties = class.get_properties();
-
-            let class_id = entity.get_class_id();
-
-            let entity_property_values = entity.get_values();
-
-            // Create wrapper structure from provided entity_property_values and their corresponding Class properties
-            let values_for_existing_properties = match StoredValuesForExistingProperties::from(&class_properties, &entity_property_values) {
-                Ok(values_for_existing_properties) => values_for_existing_properties,
-                Err(e) => {
-                    debug_assert!(false, "Should not fail! {:?}", e);
-                    return Err(e.into())
-                }
-            };
-
-            // Filter provided values_for_existing_properties, leaving only `Reference`'s with `SameOwner` flag set
-            // Retrieve the set of corresponding property ids
-            let entity_property_id_references_with_same_owner_flag_set =
-                Self::get_property_id_references_with_same_owner_flag_set(values_for_existing_properties);
-
-            // Ensure all ids of provided `new_property_value_references_with_same_owner_flag_set`
-            // corresponding to property ids of respective Class Property references with same owner flag set
-            Self::ensure_only_reference_ids_with_same_owner_flag_set_provided(
-                &entity_property_id_references_with_same_owner_flag_set,
-                &new_property_value_references_with_same_owner_flag_set
-            )?;
-
-            // Retrieve ids of all entity property values, that are references with same owner flag set and which are not provided
-            // in new property value references with same owner flag set
-            let unused_property_id_references_with_same_owner_flag_set = Self::compute_unused_property_ids(
-                &new_property_value_references_with_same_owner_flag_set, &entity_property_id_references_with_same_owner_flag_set
-            );
-
-            // Perform checks to ensure all required property_values under provided unused_schema_property_ids provided
-            Self::ensure_all_required_properties_provided(&class_properties, &unused_property_id_references_with_same_owner_flag_set)?;
-
-            // Create wrapper structure from provided new_property_value_references_with_same_owner_flag_set and their corresponding Class properties
-            let new_values_for_existing_properties = InputValuesForExistingProperties::from(
-                &class_properties, &new_property_value_references_with_same_owner_flag_set
-            )?;
-
-            // Ensure all provided `new_property_value_references_with_same_owner_flag_set` are valid
-            Self::ensure_are_valid_references_with_same_owner_flag_set(
-                new_values_for_existing_properties, &new_controller
-            )?;
-
-            let new_output_property_value_references_with_same_owner_flag_set = Self::make_output_property_values(new_property_value_references_with_same_owner_flag_set);
-
-            // Compute StoredPropertyValues, which respective Properties have unique flag set
-            // (skip PropertyIds, which respective property values under this Entity are default and non required)
-            let new_output_values_for_existing_properties =
-                StoredValuesForExistingProperties::from(&class_properties, &new_output_property_value_references_with_same_owner_flag_set)?;
-
-            // Compute new unique property value hashes.
-            // Ensure new property value hashes with `unique` flag set are `unique` on `Class` level
-            let new_unique_hashes = Self::ensure_new_property_values_respect_uniquness(
-                class_id, new_output_values_for_existing_properties,
-            )?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Used to compute old unique hashes, that should be substituted with new ones.
-            let old_unique_hashes =
-                Self::compute_old_unique_hashes(&new_output_property_value_references_with_same_owner_flag_set, &entity_property_values);
-
-            // Add property values, that should be unique on Class level
-            Self::add_unique_property_value_hashes(class_id, new_unique_hashes);
-
-            // Remove unique hashes, that were substituted with new ones.
-            Self::remove_unique_property_value_hashes(class_id, old_unique_hashes);
-
-            // Make updated entity_property_values from parameters provided
-            let entity_property_values_updated =
-                    Self::make_updated_property_value_references_with_same_owner_flag_set(
-                        unused_property_id_references_with_same_owner_flag_set, &entity_property_values,
-                        &new_output_property_value_references_with_same_owner_flag_set,
-                    );
-
-            // Transfer entity ownership
-            let entities_inbound_rcs_delta = if let Some(entity_property_values_updated) = entity_property_values_updated {
-
-
-                // Calculate entities reference counter side effects for current operation
-                let entities_inbound_rcs_delta =
-                    Self::get_updated_inbound_rcs_delta(
-                        entity_id, class_properties, entity_property_values, new_output_property_value_references_with_same_owner_flag_set
-                    )?;
-
-                // Update InboundReferenceCounter, based on previously calculated ReferenceCounterSideEffects, for each Entity involved
-                Self::update_entities_rcs(&entities_inbound_rcs_delta);
-
-                <EntityById<T>>::mutate(entity_id, |entity| {
-
-                    // Update current Entity property values with updated ones
-                    entity.set_values(entity_property_values_updated);
-
-                    // Set up new controller for the current Entity instance
-                    entity.get_permissions_mut().set_conroller(new_controller.clone());
-                });
-
-                entities_inbound_rcs_delta
-            } else {
-                // Set up new controller for the current Entity instance
-                <EntityById<T>>::mutate(entity_id, |entity| {
-                    entity.get_permissions_mut().set_conroller(new_controller.clone());
-                });
-
-                None
-            };
-
-            // Trigger event
-            Self::deposit_event(RawEvent::EntityOwnershipTransfered(entity_id, new_controller, entities_inbound_rcs_delta));
-
-            Ok(())
-        }
-
-        // ======
-        // The next set of extrinsics can be invoked by anyone who can properly sign for provided value of `Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>`.
-        // ======
-
-        /// Create entity.
-        /// If someone is making an entity of this class for first time,
-        /// then a voucher is also added with the class limit as the default limit value.
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn create_entity(
-            origin,
-            class_id: T::ClassId,
-            actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-        ) -> DispatchResult {
-
-            let account_id = ensure_signed(origin)?;
-
-            // Ensure Class under given id exists, return corresponding one
-            let class = Self::ensure_class_exists(class_id)?;
-
-            // Ensure maximum entities limit per class not reached
-            class.ensure_maximum_entities_count_limit_not_reached::<T>()?;
-
-            let class_permissions = class.get_permissions_ref();
-
-            // Ensure entities creation is not blocked on Class level
-            class_permissions.ensure_entity_creation_not_blocked::<T>()?;
-
-            // Ensure actor can create entities
-            Self::ensure_can_create_entities(&class_permissions, &account_id, &actor)?;
-
-            let entity_controller = EntityController::<T::MemberId>::from_actor::<T>(&actor);
-
-            // Check if entity creation voucher exists
-            let voucher_exists = if <EntityCreationVouchers<T>>::contains_key(class_id, &entity_controller) {
-
-                // Ensure voucher limit not reached
-                Self::entity_creation_vouchers(class_id, &entity_controller).ensure_voucher_limit_not_reached()?;
-                true
-            } else {
-                false
-            };
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Create voucher, update if exists
-
-            if voucher_exists {
-
-                // Increment number of created entities count, if specified voucher already exist
-                <EntityCreationVouchers<T>>::mutate(class_id, &entity_controller, |entity_creation_voucher| {
-                    entity_creation_voucher.increment_created_entities_count()
-                });
-            } else {
-
-                // Create new voucher for given entity creator with default limit
-                let mut entity_creation_voucher = EntityCreationVoucher::new(class.get_default_entity_creation_voucher_upper_bound());
-
-                // Increase created entities count by 1 to maintain valid entity_creation_voucher state after following Entity added
-                entity_creation_voucher.increment_created_entities_count();
-                <EntityCreationVouchers<T>>::insert(class_id, entity_controller.clone(), entity_creation_voucher);
-            }
-
-            // Create new entity
-
-            let entity_id = Self::next_entity_id();
-
-            let new_entity = Entity::<T::ClassId, T::MemberId, T::Hash, T::EntityId, T::Nonce>::new(
-                entity_controller,
-                class_id,
-                BTreeSet::new(),
-                BTreeMap::new(),
-            );
-
-            // Save newly created entity:
-            <EntityById<T>>::insert(entity_id, new_entity);
-
-            // Increment the next entity id:
-            <NextEntityId<T>>::mutate(|n| *n += T::EntityId::one());
-
-            // Increment number of entities, associated with this class
-            <ClassById<T>>::mutate(class_id, |class| {
-                class.increment_entities_count();
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::EntityCreated(actor, entity_id));
-            Ok(())
-        }
-
-        /// Remove `Entity` under provided `entity_id`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn remove_entity(
-            origin,
-            actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-            entity_id: T::EntityId,
-        ) -> DispatchResult {
-
-            let account_id = ensure_signed(origin)?;
-
-            // Retrieve Class, Entity and EntityAccessLevel for the actor, attemting to perform operation
-            let (class, entity, access_level) = Self::ensure_class_entity_and_access_level(account_id, entity_id, &actor)?;
-
-            // Ensure actor with given EntityAccessLevel can remove entity
-            EntityPermissions::<T::MemberId>::ensure_group_can_remove_entity::<T>(access_level)?;
-
-            // Ensure any inbound InputPropertyValue::Reference points to the given Entity
-            entity.ensure_rc_is_zero::<T>()?;
-
-            let class_properties = class.get_properties();
-
-            let class_id = entity.get_class_id();
-
-            let entity_values = entity.get_values();
-
-            let values_for_existing_properties = match StoredValuesForExistingProperties::<T>::from(&class_properties, &entity_values) {
-                Ok(values_for_existing_properties) => values_for_existing_properties,
-                Err(e) => {
-                    debug_assert!(false, "Should not fail! {:?}", e);
-                    return Err(e.into())
-                }
-            };
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            let unique_property_value_hashes = values_for_existing_properties.compute_unique_hashes();
-
-            // Calculate entities reference counter side effects for current operation
-            let entities_inbound_rcs_delta = Self::calculate_entities_inbound_rcs_delta(entity_id, values_for_existing_properties, DeltaMode::Decrement);
-
-            // Update InboundReferenceCounter, based on previously calculated entities_inbound_rcs_delta, for each Entity involved
-            Self::update_entities_rcs(&entities_inbound_rcs_delta);
-
-            // Remove property value entries, that should be unique on Class level
-            Self::remove_unique_property_value_hashes(class_id, unique_property_value_hashes);
-
-            // Remove entity
-            <EntityById<T>>::remove(entity_id);
-
-            // Decrement class entities counter
-            <ClassById<T>>::mutate(class_id, |class| class.decrement_entities_count());
-
-            let entity_controller = EntityController::<T::MemberId>::from_actor::<T>(&actor);
-
-            // Decrement entity_creation_voucher after entity removal perfomed
-            <EntityCreationVouchers<T>>::mutate(class_id, entity_controller, |entity_creation_voucher| {
-                entity_creation_voucher.decrement_created_entities_count();
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::EntityRemoved(actor, entity_id));
-            Ok(())
-        }
-
-        /// Add schema support to entity under given `schema_id` and provided `property_values`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn add_schema_support_to_entity(
-            origin,
-            actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-            entity_id: T::EntityId,
-            schema_id: SchemaId,
-            new_property_values: BTreeMap<PropertyId, InputPropertyValue<T>>
-        ) -> DispatchResult {
-
-            let account_id = ensure_signed(origin)?;
-
-            // Retrieve Class, Entity and EntityAccessLevel for the actor, attemting to perform operation
-            let (class, entity, _) = Self::ensure_class_entity_and_access_level(account_id, entity_id, &actor)?;
-
-            // Ensure Class Schema under given index exists, return corresponding Schema
-            let schema = class.ensure_schema_exists::<T>(schema_id)?.to_owned();
-
-            let class_properties = class.get_properties();
-
-            // Create wrapper structure from provided new_property_values and their corresponding Class properties
-            let new_values_for_existing_properties = InputValuesForExistingProperties::from(&class_properties, &new_property_values)?;
-
-            // Ensure Schema under given id is not added to given Entity yet
-            entity.ensure_schema_id_is_not_added::<T>(schema_id)?;
-
-            // Ensure provided new_property_values are not added to the Entity values map yet
-            entity.ensure_property_values_are_not_added(&new_property_values)?;
-
-            // Ensure provided schema can be added to the Entity
-            schema.ensure_is_active::<T>()?;
-
-            // Ensure all provided new property values are for properties in the given schema
-            schema.ensure_has_properties(&new_property_values)?;
-
-            // Retrieve Schema property ids, which are not provided in new_property_values
-            let unused_schema_property_ids = Self::compute_unused_property_ids(&new_property_values, schema.get_properties());
-
-            // Perform checks to ensure all required property_values under provided unused_schema_property_ids provided
-            Self::ensure_all_required_properties_provided(&class_properties, &unused_schema_property_ids)?;
-
-            // Ensure all property_values under given Schema property ids are valid
-            let entity_controller = entity.get_permissions_ref().get_controller();
-
-            // Validate all values, provided in new_values_for_existing_properties,
-            // against the type of its Property and check any additional constraints
-            Self::ensure_property_values_are_valid(&entity_controller, &new_values_for_existing_properties)?;
-
-            let class_id = entity.get_class_id();
-
-            let entity_property_values = entity.get_values();
-
-            let new_output_property_values = Self::make_output_property_values(new_property_values);
-
-            // Compute updated entity values, after new schema support added
-            let entity_values_updated = Self::make_updated_entity_property_values(
-                schema, entity_property_values, &new_output_property_values
-            );
-
-            let new_output_values_for_existing_properties = StoredValuesForExistingProperties::from(&class_properties, &new_output_property_values)?;
-
-            // Retrieve StoredPropertyValues, which respective Properties have unique flag set
-            // (skip PropertyIds, which respective property values under this Entity are default and non required)
-            let new_unique_property_value_hashes = new_output_values_for_existing_properties.compute_unique_hashes();
-
-            // Ensure all provided Properties with unique flag set are unique on Class level
-            Self::ensure_property_value_hashes_unique_option_satisfied(class_id, &new_unique_property_value_hashes)?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Add property value hashes, that should be unique on Class level
-            Self::add_unique_property_value_hashes(class_id, new_unique_property_value_hashes);
-
-            // Calculate entities reference counter side effects for current operation
-            let entities_inbound_rcs_delta = Self::calculate_entities_inbound_rcs_delta(
-                entity_id, new_output_values_for_existing_properties, DeltaMode::Increment
-            );
-
-            // Update InboundReferenceCounter, based on previously calculated entities_inbound_rcs_delta, for each Entity involved
-            Self::update_entities_rcs(&entities_inbound_rcs_delta);
-
-            // Add schema support to `Entity` under given `entity_id`
-            <EntityById<T>>::mutate(entity_id, |entity| {
-
-                // Add a new schema to the list of schemas supported by this entity.
-                entity.get_supported_schemas_mut().insert(schema_id);
-
-                // Update entity values only if new properties have been added.
-                if entity_values_updated.len() > entity.get_values_ref().len() {
-                    entity.set_values(entity_values_updated);
-                }
-            });
-
-            // Trigger event
-            Self::deposit_event(RawEvent::EntitySchemaSupportAdded(actor, entity_id, schema_id, entities_inbound_rcs_delta));
-            Ok(())
-        }
-
-        /// Update `Entity` `InputPropertyValue`'s with provided ones
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn update_entity_property_values(
-            origin,
-            actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-            entity_id: T::EntityId,
-            new_property_values: BTreeMap<PropertyId, InputPropertyValue<T>>
-        ) -> DispatchResult {
-
-            let account_id = ensure_signed(origin)?;
-
-            // Retrieve Class, Entity and EntityAccessLevel for the actor, attemting to perform operation
-            let (class, entity, access_level) = Self::ensure_class_entity_and_access_level(account_id, entity_id, &actor)?;
-
-            // Ensure property values were not locked on Class level
-            class.ensure_property_values_unlocked::<T>()?;
-
-            let entity_values_ref = entity.get_values_ref();
-
-            // Filter new_property_values, that are identical to entity_property_values.
-            // Get `new_property_values`, that are not in `entity_property_values`
-            let new_property_values = Self::try_filter_identical_property_values(entity_values_ref, new_property_values);
-
-            // Ensure all provided new_property_values are already added to the current Entity instance
-            Self::ensure_all_property_values_are_already_added(entity_values_ref, &new_property_values)?;
-
-            let class_properties = class.get_properties();
-
-            // Create wrapper structure from new_property_values and their corresponding Class properties
-            let new_values_for_existing_properties = InputValuesForExistingProperties::from(&class_properties, &new_property_values)?;
-
-            // Ensure all provided property values are unlocked for the actor with given access_level
-            Self::ensure_all_property_values_are_unlocked_from(&new_values_for_existing_properties, access_level)?;
-
-            let entity_controller = entity.get_permissions_ref().get_controller();
-
-            // Validate all values, provided in values_for_existing_properties,
-            // against the type of its Property and check any additional constraints
-            Self::ensure_property_values_are_valid(&entity_controller, &new_values_for_existing_properties)?;
-
-            let class_id = entity.get_class_id();
-
-            // Get current property values of an Entity
-
-            let entity_property_values = entity.get_values();
-
-            let new_output_property_values = Self::make_output_property_values(new_property_values);
-
-            // Compute StoredPropertyValues, which respective Properties have unique flag set
-            // (skip PropertyIds, which respective property values under this Entity are default and non required)
-            let new_output_values_for_existing_properties =
-                StoredValuesForExistingProperties::from(&class_properties, &new_output_property_values)?;
-
-            // Compute new unique property value hashes.
-            // Ensure new property value hashes with `unique` flag set are `unique` on `Class` level
-            let new_unique_hashes = Self::ensure_new_property_values_respect_uniquness(
-                class_id, new_output_values_for_existing_properties,
-            )?;
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            // Used to compute old unique hashes, that should be substituted with new ones.
-            let old_unique_hashes =
-                Self::compute_old_unique_hashes(&new_output_property_values, &entity_property_values);
-
-            // Add property value hashes, that should be unique on Class level
-            Self::add_unique_property_value_hashes(class_id, new_unique_hashes);
-
-            // Remove unique hashes, that were substituted with new ones. (if some).
-            Self::remove_unique_property_value_hashes(class_id, old_unique_hashes);
-
-            // Make updated entity_property_values from current entity_property_values and new_output_property_values provided
-            let entity_property_values_updated =
-                Self::make_updated_property_values(&entity_property_values, &new_output_property_values);
-
-            // If property values should be updated
-            if let Some(entity_property_values_updated) = entity_property_values_updated {
-
-                // Calculate entities reference counter side effects for current operation (should always be safe)
-                let entities_inbound_rcs_delta =
-                    Self::get_updated_inbound_rcs_delta(entity_id, class_properties, entity_property_values, new_output_property_values)?;
-
-                // Update InboundReferenceCounter, based on previously calculated entities_inbound_rcs_delta, for each Entity involved
-                Self::update_entities_rcs(&entities_inbound_rcs_delta);
-
-                // Update entity property values
-                <EntityById<T>>::mutate(entity_id, |entity| {
-                    entity.set_values(entity_property_values_updated);
-                });
-
-                // Trigger event
-                Self::deposit_event(RawEvent::EntityPropertyValuesUpdated(actor, entity_id, entities_inbound_rcs_delta));
-            }
-
-            Ok(())
-        }
-
-        /// Clear `PropertyValueVec` under given `entity_id` & `in_class_schema_property_id`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn clear_entity_property_vector(
-            origin,
-            actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-            entity_id: T::EntityId,
-            in_class_schema_property_id: PropertyId
-        ) -> DispatchResult {
-
-            let account_id = ensure_signed(origin)?;
-
-            // Retrieve Class, Entity and EntityAccessLevel for the actor, attemting to perform operation
-            let (class, entity, access_level) = Self::ensure_class_entity_and_access_level(account_id, entity_id, &actor)?;
-
-            // Ensure Property under given PropertyId is unlocked from actor with given EntityAccessLevel
-            // Retrieve corresponding Property by value
-            let property = class.ensure_class_property_type_unlocked_from::<T>(
-                in_class_schema_property_id,
-                access_level,
-            )?;
-
-            // Ensure InputPropertyValue under given in_class_schema_property_id is Vector
-            let property_value_vector =
-                entity.ensure_property_value_is_vec::<T>(in_class_schema_property_id)?;
-
-            // Calculate side effects for clear_property_vector operation, based on property_value_vector provided and its respective property.
-            let entities_inbound_rcs_delta = Self::make_side_effects_for_clear_property_vector_operation(&property_value_vector, &property);
-
-            // Clear property_value_vector.
-            let empty_property_value_vector = Self::clear_property_vector(property_value_vector.clone());
-
-            let class_id = entity.get_class_id();
-
-            // Compute old and new vec unique property value hash.
-            // Ensure new property value hash with `unique` flag set is `unique` on `Class` level
-            let vec_property_value_hashes = if property.unique {
-                Some(
-                    Self::ensure_vec_property_value_hashes(class_id, in_class_schema_property_id, &empty_property_value_vector, property_value_vector)?
-                )
-            } else {
-                None
-            };
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            if let Some((new_property_value_hash, old_property_value_hash)) = vec_property_value_hashes {
-                // Add property value hash, that should be unique on `Class` level
-                Self::add_unique_property_value_hash(class_id, in_class_schema_property_id, new_property_value_hash);
-
-                // Remove property value hash, that should be unique on `Class` level
-                Self::remove_unique_property_value_hash(class_id, in_class_schema_property_id, old_property_value_hash);
-            }
-
-            // Decrease reference counters of involved entities (if some)
-            Self::update_entities_rcs(&entities_inbound_rcs_delta);
-
-            // Insert empty_property_value_vector into entity_property_values mapping at in_class_schema_property_id.
-            // Retrieve updated entity_property_values
-            let entity_values_updated = Self::insert_at_in_class_schema_property_id(
-                entity.get_values(), in_class_schema_property_id, empty_property_value_vector
-            );
-
-            // Update entity property values
-            <EntityById<T>>::mutate(entity_id, |entity| {
-                entity.set_values(entity_values_updated);
-            });
-
-            // Trigger event
-            Self::deposit_event(
-                RawEvent::VectorCleared(
-                    actor, entity_id, in_class_schema_property_id, entities_inbound_rcs_delta
-                )
-            );
-
-            Ok(())
-        }
-
-        /// Remove value at given `index_in_property_vector`
-        /// from `PropertyValueVec` under `in_class_schema_property_id`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn remove_at_entity_property_vector(
-            origin,
-            actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-            entity_id: T::EntityId,
-            in_class_schema_property_id: PropertyId,
-            index_in_property_vector: VecMaxLength,
-            nonce: T::Nonce
-        ) -> DispatchResult {
-
-            let account_id = ensure_signed(origin)?;
-
-            // Retrieve Class, Entity and EntityAccessLevel for the actor, attemting to perform operation
-            let (class, entity, access_level) = Self::ensure_class_entity_and_access_level(account_id, entity_id, &actor)?;
-
-            // Ensure Property under given PropertyId is unlocked from actor with given EntityAccessLevel
-            // Retrieve corresponding Property by value
-            let property = class.ensure_class_property_type_unlocked_from::<T>(
-                in_class_schema_property_id,
-                access_level,
-            )?;
-
-            // Ensure InputPropertyValue under given in_class_schema_property_id is Vector
-            let property_value_vector =
-                entity.ensure_property_value_is_vec::<T>(in_class_schema_property_id)?;
-
-            // Ensure `VecInputPropertyValue` nonce is equal to the provided one.
-            // Used to to avoid possible data races, when performing vector specific operations
-            property_value_vector.ensure_nonce_equality::<T>(nonce)?;
-
-            // Ensure, provided index_in_property_vec is valid index of VecInputValue
-            property_value_vector
-                .ensure_index_in_property_vector_is_valid::<T>(index_in_property_vector)?;
-
-            let involved_entity_id = property_value_vector
-                .get_vec_value_ref()
-                .get_involved_entities()
-                .and_then(|involved_entities| involved_entities.get(index_in_property_vector as usize).copied());
-
-            // Remove value at in_class_schema_property_id in property value vector
-            // Get VecInputPropertyValue wrapped in InputPropertyValue
-            let property_value_vector_updated = Self::remove_at_index_in_property_vector(
-                property_value_vector.clone(), index_in_property_vector
-            );
-
-            let class_id = entity.get_class_id();
-
-            // Compute old and new vec unique property value hash.
-            // Ensure new property value hash with `unique` flag set is `unique` on `Class` level
-            let vec_property_value_hashes = if property.unique {
-                Some(
-                    Self::ensure_vec_property_value_hashes(class_id, in_class_schema_property_id, &property_value_vector_updated, property_value_vector)?
-                )
-            } else {
-                None
-            };
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            if let Some((new_property_value_hash, old_property_value_hash)) = vec_property_value_hashes {
-                // Add property value hash, that should be unique on `Class` level
-                Self::add_unique_property_value_hash(class_id, in_class_schema_property_id, new_property_value_hash);
-
-                // Remove property value hash, that should be unique on `Class` level
-                Self::remove_unique_property_value_hash(class_id, in_class_schema_property_id, old_property_value_hash);
-            }
-
-            // Insert updated propery value into entity_property_values mapping at in_class_schema_property_id.
-            let entity_values_updated = Self::insert_at_in_class_schema_property_id(
-                entity.get_values(), in_class_schema_property_id, property_value_vector_updated
-            );
-
-            let involved_entity_and_side_effect = if let Some(involved_entity_id) = involved_entity_id {
-                // Decrease reference counter of involved entity (if some)
-                let same_controller_status = property.property_type.same_controller_status();
-                let rc_delta = EntityReferenceCounterSideEffect::atomic(same_controller_status, DeltaMode::Decrement);
-
-                // Update InboundReferenceCounter of involved entity, based on previously calculated rc_delta
-                Self::update_entity_rc(involved_entity_id, rc_delta);
-                Some((involved_entity_id, rc_delta))
-            } else {
-                None
-            };
-
-            // Update entity property values
-            <EntityById<T>>::mutate(entity_id, |entity| {
-                entity.set_values(entity_values_updated);
-            });
-
-            // Trigger event
-            Self::deposit_event(
-                RawEvent::RemovedAtVectorIndex(
-                    actor, entity_id, in_class_schema_property_id, index_in_property_vector,
-                    nonce + T::Nonce::one(), involved_entity_and_side_effect
-                )
-            );
-
-            Ok(())
-        }
-
-        /// Insert `SingleInputPropertyValue` at given `index_in_property_vector`
-        /// into `PropertyValueVec` under `in_class_schema_property_id`
-        #[weight = 10_000_000] // TODO: adjust weight
-        pub fn insert_at_entity_property_vector(
-            origin,
-            actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-            entity_id: T::EntityId,
-            in_class_schema_property_id: PropertyId,
-            index_in_property_vector: VecMaxLength,
-            value: InputValue<T>,
-            nonce: T::Nonce
-        ) -> DispatchResult {
-
-            let account_id = ensure_signed(origin)?;
-
-            // Retrieve Class, Entity and EntityAccessLevel for the actor, attemting to perform operation
-            let (class, entity, access_level) = Self::ensure_class_entity_and_access_level(account_id, entity_id, &actor)?;
-
-            // Ensure Property under given PropertyId is unlocked from actor with given EntityAccessLevel
-            // Retrieve corresponding Property by value
-            let property = class.ensure_class_property_type_unlocked_from::<T>(
-                in_class_schema_property_id,
-                access_level,
-            )?;
-
-            // Ensure InputPropertyValue under given in_class_schema_property_id is Vector
-            let property_value_vector =
-                entity.ensure_property_value_is_vec::<T>(in_class_schema_property_id)?;
-
-            // Ensure `VecInputPropertyValue` nonce is equal to the provided one.
-            // Used to to avoid possible data races, when performing vector specific operations
-            property_value_vector.ensure_nonce_equality::<T>(nonce)?;
-
-            let entity_controller = entity.get_permissions_ref().get_controller();
-
-            // Ensure property_value type is equal to the property_value_vector type and check all constraints
-            Property::<T::ClassId>::ensure_property_value_can_be_inserted_at_property_vector(
-                &property,
-                &value,
-                &property_value_vector,
-                index_in_property_vector,
-                entity_controller,
-            )?;
-
-            let involved_entity = value.get_involved_entity();
-
-            // Insert SingleInputPropertyValue at in_class_schema_property_id into property value vector
-            // Get VecInputPropertyValue wrapped in InputPropertyValue
-            let property_value_vector_updated = Self::insert_at_index_in_property_vector(
-                property_value_vector.clone(), index_in_property_vector, value
-            );
-
-            let class_id = entity.get_class_id();
-
-            // Compute old and new vec unique property value hash.
-            // Ensure new property value hash with `unique` flag set is `unique` on `Class` level
-            let vec_property_value_hashes = if property.unique {
-                Some(
-                    Self::ensure_vec_property_value_hashes(class_id, in_class_schema_property_id, &property_value_vector_updated, property_value_vector)?
-                )
-            } else {
-                None
-            };
-
-            //
-            // == MUTATION SAFE ==
-            //
-
-            if let Some((new_property_value_hash, old_property_value_hash)) = vec_property_value_hashes {
-                // Add property value hash, that should be unique on `Class` level
-                Self::add_unique_property_value_hash(class_id, in_class_schema_property_id, new_property_value_hash);
-
-                // Remove property value hash, that should be unique on `Class` level
-                Self::remove_unique_property_value_hash(class_id, in_class_schema_property_id, old_property_value_hash);
-            }
-
-            // Insert updated property value into entity_property_values mapping at in_class_schema_property_id.
-            // Retrieve updated entity_property_values
-            let entity_values_updated = Self::insert_at_in_class_schema_property_id(
-                entity.get_values(), in_class_schema_property_id, property_value_vector_updated
-            );
-
-            // Increase reference counter of involved entity (if some)
-            let involved_entity_and_side_effect = if let Some(entity_rc_to_increment) = involved_entity {
-                let same_controller_status = property.property_type.same_controller_status();
-                let rc_delta = EntityReferenceCounterSideEffect::atomic(same_controller_status, DeltaMode::Increment);
-
-                // Update InboundReferenceCounter of involved entity, based on previously calculated ReferenceCounterSideEffect
-                Self::update_entity_rc(entity_rc_to_increment, rc_delta);
-                Some((entity_rc_to_increment, rc_delta))
-            } else {
-                None
-            };
-
-            // Update entity property values
-            <EntityById<T>>::mutate(entity_id, |entity| {
-                entity.set_values(entity_values_updated);
-            });
-
-            // Trigger event
-            Self::deposit_event(
-                RawEvent::InsertedAtVectorIndex(
-                    actor, entity_id, in_class_schema_property_id, index_in_property_vector,
-                    nonce + T::Nonce::one(), involved_entity_and_side_effect
-                )
-            );
-
-            Ok(())
-        }
-
-       /// Batch transaction
-       #[weight = 10_000_000] // TODO: adjust weight
-       pub fn transaction(origin, actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>, operations: Vec<OperationType<T>>) -> DispatchResult {
-
-           // Ensure maximum number of operations during atomic batching limit not reached
-           Self::ensure_number_of_operations_during_atomic_batching_limit_not_reached(&operations)?;
-
-           //
-           // == MUTATION SAFE ==
-           //
-
-           // This BTreeMap holds the T::EntityId of the entity created as a result of executing a `CreateEntity` `Operation`
-           let mut entity_created_in_operation = BTreeMap::new();
-
-           // Create raw origin
-           let raw_origin = origin.into().map_err(|_| Error::<T>::OriginCanNotBeMadeIntoRawOrigin)?;
-
-           for (index, operation_type) in operations.into_iter().enumerate() {
-               let origin = T::Origin::from(raw_origin.clone());
-               match operation_type {
-                   OperationType::CreateEntity(create_entity_operation) => {
-                        Self::ensure_transaction_failed_event(
-                            Self::create_entity(origin, create_entity_operation.class_id, actor),
-                            actor,
-                            index
-                        )?;
-
-                        // entity id of newly created entity
-                        let entity_id = Self::next_entity_id() - T::EntityId::one();
-                        entity_created_in_operation.insert(index, entity_id);
-                   },
-                   OperationType::AddSchemaSupportToEntity(add_schema_support_to_entity_operation) => {
-                       let entity_id =
-                            Self::ensure_transaction_failed_event(
-                                operations::parametrized_entity_to_entity_id(
-                                    &entity_created_in_operation, add_schema_support_to_entity_operation.entity_id
-                                ),
-                                actor,
-                                index
-                            )?;
-
-                       let schema_id = add_schema_support_to_entity_operation.schema_id;
-
-                       let property_values =
-                            Self::ensure_transaction_failed_event(
-                                operations::parametrized_property_values_to_property_values(
-                                    &entity_created_in_operation, add_schema_support_to_entity_operation.parametrized_property_values
-                                ),
-                                actor,
-                                index
-                            )?;
-                        Self::ensure_transaction_failed_event(
-                            Self::add_schema_support_to_entity(origin, actor, entity_id, schema_id, property_values),
-                            actor,
-                            index
-                        )?;
-                   },
-                   OperationType::UpdatePropertyValues(update_property_values_operation) => {
-                       let entity_id =
-                            Self::ensure_transaction_failed_event(
-                                operations::parametrized_entity_to_entity_id(
-                                    &entity_created_in_operation, update_property_values_operation.entity_id
-                                ),
-                                actor,
-                                index
-                            )?;
-
-                       let property_values =
-                            Self::ensure_transaction_failed_event(
-                                operations::parametrized_property_values_to_property_values(
-                                    &entity_created_in_operation, update_property_values_operation.new_parametrized_property_values
-                                ),
-                                actor,
-                                index
-                            )?;
-
-                       Self::ensure_transaction_failed_event(
-                            Self::update_entity_property_values(origin, actor, entity_id, property_values),
-                            actor,
-                            index
-                       )?;
-                   },
-               }
-           }
-
-           // Trigger event
-           Self::deposit_event(RawEvent::TransactionCompleted(actor));
-
-           Ok(())
-       }
-    }
-}
-
-impl<T: Trait> Module<T> {
-    /// Deposits an `TransactionFailed` event if an error during `transaction` extrinsic execution occured
-    fn ensure_transaction_failed_event<R, E: Into<DispatchError>>(
-        result: Result<R, E>,
-        actor: Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-        index: usize,
-    ) -> Result<R, DispatchError> {
-        match result {
-            Err(e) => {
-                Self::deposit_event(RawEvent::TransactionFailed(actor, index as u32));
-                Err(e.into())
-            }
-            Ok(result) => Ok(result),
-        }
-    }
-
-    /// Updates corresponding `Entity` `reference_counter` by `reference_counter_delta`.
-    fn update_entity_rc(
-        entity_id: T::EntityId,
-        reference_counter_delta: EntityReferenceCounterSideEffect,
-    ) {
-        // Update both `total` and `same owner` number of inbound references for the Entity instance under given `entity_id`
-        <EntityById<T>>::mutate(entity_id, |entity| {
-            let entity_inbound_rc = entity.get_reference_counter_mut();
-            entity_inbound_rc.total =
-                (entity_inbound_rc.total as i32 + reference_counter_delta.total) as u32;
-            entity_inbound_rc.same_owner =
-                (entity_inbound_rc.same_owner as i32 + reference_counter_delta.same_owner) as u32;
-        })
-    }
-
-    /// Increment number of classes, maintained by each curator group
-    fn increment_number_of_classes_maintained_by_curator_groups(
-        curator_group_ids: BTreeSet<T::CuratorGroupId>,
-    ) {
-        curator_group_ids.into_iter().for_each(|curator_group_id| {
-            Self::increment_number_of_classes_maintained_by_curator_group(curator_group_id);
-        });
-    }
-
-    /// Decrement number of classes, maintained by each curator group
-    fn decrement_number_of_classes_maintained_by_curator_groups(
-        curator_group_ids: BTreeSet<T::CuratorGroupId>,
-    ) {
-        curator_group_ids.into_iter().for_each(|curator_group_id| {
-            Self::decrement_number_of_classes_maintained_by_curator_group(curator_group_id);
-        });
-    }
-
-    /// Increment number of classes, maintained by curator group
-    fn increment_number_of_classes_maintained_by_curator_group(
-        curator_group_id: T::CuratorGroupId,
-    ) {
-        <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
-            curator_group.increment_number_of_classes_maintained_count();
-        });
-    }
-
-    /// Decrement number of classes, maintained by curator group
-    fn decrement_number_of_classes_maintained_by_curator_group(
-        curator_group_id: T::CuratorGroupId,
-    ) {
-        <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
-            curator_group.decrement_number_of_classes_maintained_count();
-        });
-    }
-
-    /// Add property value hash, that should be unique on `Class` level
-    pub fn add_unique_property_value_hash(
-        class_id: T::ClassId,
-        property_id: PropertyId,
-        hash: T::Hash,
-    ) {
-        <UniquePropertyValueHashes<T>>::insert((class_id, property_id), hash, ());
-    }
-
-    /// Remove property value hash, that should be unique on `Class` level
-    pub fn remove_unique_property_value_hash(
-        class_id: T::ClassId,
-        property_id: PropertyId,
-        hash: T::Hash,
-    ) {
-        <UniquePropertyValueHashes<T>>::remove((class_id, property_id), hash);
-    }
-
-    /// Add property value hashes, that should be unique on `Class` level
-    pub fn add_unique_property_value_hashes(
-        class_id: T::ClassId,
-        unique_property_value_hashes: BTreeMap<PropertyId, T::Hash>,
-    ) {
-        unique_property_value_hashes
-            .into_iter()
-            .for_each(|(property_id, hash)| {
-                Self::add_unique_property_value_hash(class_id, property_id, hash);
-            });
-    }
-
-    /// Remove property value hashes, that should be unique on `Class` level
-    pub fn remove_unique_property_value_hashes(
-        class_id: T::ClassId,
-        unique_property_value_hashes: BTreeMap<PropertyId, T::Hash>,
-    ) {
-        unique_property_value_hashes
-            .into_iter()
-            .for_each(|(property_id, hash)| {
-                Self::remove_unique_property_value_hash(class_id, property_id, hash);
-            });
-    }
-
-    /// Convert all provided `InputPropertyValue`'s into `StoredPropertyValue`'s
-    pub fn make_output_property_values(
-        input_property_values: BTreeMap<PropertyId, InputPropertyValue<T>>,
-    ) -> BTreeMap<PropertyId, StoredPropertyValueOf<T>> {
-        input_property_values
-            .into_iter()
-            .map(|(property_id, property_value)| (property_id, property_value.into()))
-            .collect()
-    }
-
-    /// Update `entity_property_values` with `property_values`
-    /// Returns updated `entity_property_values`
-    fn make_updated_entity_property_values(
-        schema: Schema,
-        entity_property_values: BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        output_property_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-    ) -> BTreeMap<PropertyId, StoredPropertyValueOf<T>> {
-        // Concatenate existing `entity_property_values` with `property_values`, provided, when adding `Schema` support.
-        let updated_entity_property_values: BTreeMap<PropertyId, StoredPropertyValueOf<T>> =
-            entity_property_values
-                .into_iter()
-                .chain(output_property_values.to_owned().into_iter())
-                .collect();
-
-        // Write all missing non required `Schema` `property_values` as `InputPropertyValue::default()`
-        let non_required_property_values: BTreeMap<PropertyId, StoredPropertyValueOf<T>> = schema
-            .get_properties()
-            .iter()
-            .filter_map(|property_id| {
-                if !updated_entity_property_values.contains_key(property_id) {
-                    Some((*property_id, StoredPropertyValue::default()))
-                } else {
-                    None
-                }
-            })
-            .collect();
-
-        // Extend updated_entity_property_values with given Schema non_required_property_values
-        updated_entity_property_values
-            .into_iter()
-            .chain(non_required_property_values.into_iter())
-            .collect()
-    }
-
-    /// Calculate side effects for clear_property_vector operation, based on `property_value_vector` provided and its respective `property`.
-    /// Returns calculated `ReferenceCounterSideEffects`
-    pub fn make_side_effects_for_clear_property_vector_operation(
-        property_value_vector: &VecStoredPropertyValue<T::Hash, T::EntityId, T::Nonce>,
-        property: &Property<T::ClassId>,
-    ) -> Option<ReferenceCounterSideEffects<T>> {
-        let entity_ids_to_decrease_rc = property_value_vector
-            .get_vec_value_ref()
-            .get_involved_entities();
-
-        if let Some(entity_ids_to_decrease_rcs) = entity_ids_to_decrease_rc {
-            // Calculate `ReferenceCounterSideEffects`, based on entity_ids involved, same_controller_status and chosen `DeltaMode`
-            let same_controller_status = property.property_type.same_controller_status();
-            let entities_inbound_rcs_delta = Self::perform_entities_inbound_rcs_delta_calculation(
-                ReferenceCounterSideEffects::<T>::default(),
-                entity_ids_to_decrease_rcs,
-                same_controller_status,
-                DeltaMode::Decrement,
-            );
-
-            if !entities_inbound_rcs_delta.is_empty() {
-                Some(entities_inbound_rcs_delta)
-            } else {
-                None
-            }
-        } else {
-            None
-        }
-    }
-
-    /// Update `inbound_rcs_delta`, based on `involved_entity_ids`, `same_controller_status` provided and chosen `DeltaMode`
-    /// Returns updated `inbound_rcs_delta`
-    fn perform_entities_inbound_rcs_delta_calculation(
-        mut inbound_rcs_delta: ReferenceCounterSideEffects<T>,
-        involved_entity_ids: Vec<T::EntityId>,
-        same_controller_status: bool,
-        delta_mode: DeltaMode,
-    ) -> ReferenceCounterSideEffects<T> {
-        for involved_entity_id in involved_entity_ids {
-            // If inbound_rcs_delta already contains entry for the given involved_entity_id, increment it
-            // with atomic EntityReferenceCounterSideEffect instance, based on same_owner flag provided and DeltaMode,
-            // otherwise create new atomic EntityReferenceCounterSideEffect instance
-            if let Some(inbound_rc_delta) = inbound_rcs_delta.get_mut(&involved_entity_id) {
-                *inbound_rc_delta +=
-                    EntityReferenceCounterSideEffect::atomic(same_controller_status, delta_mode);
-            } else {
-                inbound_rcs_delta.insert(
-                    involved_entity_id,
-                    EntityReferenceCounterSideEffect::atomic(same_controller_status, delta_mode),
-                );
-            }
-        }
-        inbound_rcs_delta
-    }
-
-    /// Filter references, pointing to the same `Entity`
-    fn filter_references_to_the_same_entity(
-        current_entity_id: T::EntityId,
-        involved_entity_ids: Vec<T::EntityId>,
-    ) -> Vec<T::EntityId> {
-        involved_entity_ids
-            .into_iter()
-            .filter(|involved_entity_id| current_entity_id != *involved_entity_id)
-            .collect()
-    }
-
-    /// Calculate `ReferenceCounterSideEffects`, based on `values_for_existing_properties` provided and chosen `DeltaMode`
-    /// Returns calculated `ReferenceCounterSideEffects`
-    fn calculate_entities_inbound_rcs_delta(
-        current_entity_id: T::EntityId,
-        values_for_existing_properties: StoredValuesForExistingProperties<T>,
-        delta_mode: DeltaMode,
-    ) -> Option<ReferenceCounterSideEffects<T>> {
-        let entities_inbound_rcs_delta = values_for_existing_properties
-            .values()
-            .map(|value_for_existing_property| value_for_existing_property.unzip())
-            .filter_map(|(property, value)| {
-                let involved_entity_ids =
-                    value.get_involved_entities().map(|involved_entity_ids| {
-                        Self::filter_references_to_the_same_entity(
-                            current_entity_id,
-                            involved_entity_ids,
-                        )
-                    });
-                match involved_entity_ids {
-                    Some(involved_entity_ids) if !involved_entity_ids.is_empty() => Some((
-                        involved_entity_ids,
-                        property.property_type.same_controller_status(),
-                    )),
-                    _ => None,
-                }
-            })
-            // Aggeregate all sideffects on a single entity together into one side effect map
-            .fold(
-                ReferenceCounterSideEffects::default(),
-                |inbound_rcs_delta, (involved_entity_ids, same_controller_status)| {
-                    Self::perform_entities_inbound_rcs_delta_calculation(
-                        inbound_rcs_delta,
-                        involved_entity_ids,
-                        same_controller_status,
-                        delta_mode,
-                    )
-                },
-            );
-
-        if !entities_inbound_rcs_delta.is_empty() {
-            Some(entities_inbound_rcs_delta)
-        } else {
-            None
-        }
-    }
-
-    /// Compute `ReferenceCounterSideEffects`, based on `InputPropertyValue` `Reference`'s involved into update process.
-    /// Returns updated `ReferenceCounterSideEffects`
-    pub fn get_updated_inbound_rcs_delta(
-        current_entity_id: T::EntityId,
-        class_properties: Vec<Property<T::ClassId>>,
-        entity_property_values: BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        new_output_property_values: BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-    ) -> Result<Option<ReferenceCounterSideEffects<T>>, Error<T>> {
-        // Filter entity_property_values to get only those, which will be substituted with new_property_values
-        let entity_property_values_to_update: BTreeMap<PropertyId, StoredPropertyValueOf<T>> =
-            entity_property_values
-                .into_iter()
-                .filter(|(entity_id, _)| new_output_property_values.contains_key(entity_id))
-                .collect();
-
-        // Calculate entities reference counter side effects for update operation
-
-        let stored_values_for_entity_property_values_to_update =
-            match StoredValuesForExistingProperties::from(
-                &class_properties,
-                &entity_property_values_to_update,
-            ) {
-                Ok(stored_values_for_entity_property_values_to_update) => {
-                    stored_values_for_entity_property_values_to_update
-                }
-                Err(e) => {
-                    debug_assert!(false, "Should not fail! {:?}", e);
-                    return Err(e);
-                }
-            };
-
-        // Calculate entities inbound reference counter delta with Decrement DeltaMode for entity_property_values_to_update,
-        // as involved InputPropertyValue References will be substituted with new ones
-        let decremental_reference_counter_side_effects = Self::calculate_entities_inbound_rcs_delta(
-            current_entity_id,
-            stored_values_for_entity_property_values_to_update,
-            DeltaMode::Decrement,
-        );
-
-        // Calculate entities inbound reference counter delta with Increment DeltaMode for new_property_values,
-        // as involved InputPropertyValue References will substitute the old ones
-        let incremental_reference_counter_side_effects = Self::calculate_entities_inbound_rcs_delta(
-            current_entity_id,
-            StoredValuesForExistingProperties::from(
-                &class_properties,
-                &new_output_property_values,
-            )?,
-            DeltaMode::Increment,
-        );
-
-        // Add up both net decremental_reference_counter_side_effects and incremental_reference_counter_side_effects
-        // to get one net sideffect per entity.
-        Ok(Self::calculate_updated_inbound_rcs_delta(
-            decremental_reference_counter_side_effects,
-            incremental_reference_counter_side_effects,
-        ))
-    }
-
-    /// Add up both net first_reference_counter_side_effects and second_reference_counter_side_effects (if some)
-    /// to get one net sideffect per entity.
-    /// Returns updated `ReferenceCounterSideEffects`
-    pub fn calculate_updated_inbound_rcs_delta(
-        first_reference_counter_side_effects: Option<ReferenceCounterSideEffects<T>>,
-        second_reference_counter_side_effects: Option<ReferenceCounterSideEffects<T>>,
-    ) -> Option<ReferenceCounterSideEffects<T>> {
-        match (
-            first_reference_counter_side_effects,
-            second_reference_counter_side_effects,
-        ) {
-            (
-                Some(first_reference_counter_side_effects),
-                Some(second_reference_counter_side_effects),
-            ) => {
-                let reference_counter_side_effects = first_reference_counter_side_effects
-                    .update(second_reference_counter_side_effects);
-                Some(reference_counter_side_effects)
-            }
-            (Some(first_reference_counter_side_effects), _) => {
-                Some(first_reference_counter_side_effects)
-            }
-            (_, Some(second_reference_counter_side_effects)) => {
-                Some(second_reference_counter_side_effects)
-            }
-            _ => None,
-        }
-    }
-
-    /// Used to update `class_permissions` with parameters provided.
-    /// Returns updated `class_permissions` if update performed
-    pub fn make_updated_class_permissions(
-        class_permissions: &ClassPermissions<T::CuratorGroupId>,
-        updated_any_member: Option<bool>,
-        updated_entity_creation_blocked: Option<bool>,
-        updated_all_entity_property_values_locked: Option<bool>,
-        updated_maintainers: Option<BTreeSet<T::CuratorGroupId>>,
-    ) -> Option<ClassPermissions<T::CuratorGroupId>> {
-        // Used to check if update performed
-        let mut updated_class_permissions = class_permissions.clone();
-
-        if let Some(updated_any_member) = updated_any_member {
-            updated_class_permissions.set_any_member_status(updated_any_member);
-        }
-
-        if let Some(updated_entity_creation_blocked) = updated_entity_creation_blocked {
-            updated_class_permissions.set_entity_creation_blocked(updated_entity_creation_blocked);
-        }
-
-        if let Some(updated_all_entity_property_values_locked) =
-            updated_all_entity_property_values_locked
-        {
-            updated_class_permissions
-                .set_all_entity_property_values_locked(updated_all_entity_property_values_locked);
-        }
-
-        if let Some(updated_maintainers) = updated_maintainers {
-            updated_class_permissions.set_maintainers(updated_maintainers);
-        }
-
-        if updated_class_permissions != *class_permissions {
-            Some(updated_class_permissions)
-        } else {
-            None
-        }
-    }
-
-    /// Used to update `entity_permissions` with parameters provided.
-    /// Returns updated `entity_permissions` if update performed
-    pub fn make_updated_entity_permissions(
-        entity_permissions: EntityPermissions<T::MemberId>,
-        updated_frozen: Option<bool>,
-        updated_referenceable: Option<bool>,
-    ) -> Option<EntityPermissions<T::MemberId>> {
-        // Used to check if update performed
-        let mut updated_entity_permissions = entity_permissions.clone();
-
-        if let Some(updated_frozen) = updated_frozen {
-            updated_entity_permissions.set_frozen(updated_frozen);
-        }
-
-        if let Some(updated_referenceable) = updated_referenceable {
-            updated_entity_permissions.set_referencable(updated_referenceable);
-        }
-
-        if updated_entity_permissions != entity_permissions {
-            Some(updated_entity_permissions)
-        } else {
-            None
-        }
-    }
-
-    /// Ensure property value hash with `unique` flag set is `unique` on `Class` level
-    pub fn ensure_property_value_hash_unique_option_satisfied(
-        class_id: T::ClassId,
-        property_id: PropertyId,
-        unique_property_value_hash: &T::Hash,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            !<UniquePropertyValueHashes<T>>::contains_key(
-                (class_id, property_id),
-                unique_property_value_hash
-            ),
-            Error::<T>::PropertyValueShouldBeUnique
-        );
-        Ok(())
-    }
-
-    /// Ensure all property value hashes with `unique` flag set are `unique` on `Class` level
-    pub fn ensure_property_value_hashes_unique_option_satisfied(
-        class_id: T::ClassId,
-        unique_property_value_hashes: &BTreeMap<PropertyId, T::Hash>,
-    ) -> Result<(), Error<T>> {
-        for (&property_id, unique_property_value_hash) in unique_property_value_hashes {
-            Self::ensure_property_value_hash_unique_option_satisfied(
-                class_id,
-                property_id,
-                unique_property_value_hash,
-            )?;
-        }
-        Ok(())
-    }
-
-    /// Compute old and new vec unique property value hash.
-    /// Ensure new property value hash with `unique` flag set is `unique` on `Class` level
-    pub fn ensure_vec_property_value_hashes(
-        class_id: T::ClassId,
-        in_class_schema_property_id: PropertyId,
-        property_value_vector_updated: &StoredPropertyValueOf<T>,
-        property_value_vector: VecStoredPropertyValue<T::Hash, T::EntityId, T::Nonce>,
-    ) -> Result<(T::Hash, T::Hash), Error<T>> {
-        // Compute new hash from unique property value and its respective property id
-        let new_property_value_hash =
-            property_value_vector_updated.compute_unique_hash::<T>(in_class_schema_property_id);
-
-        // Ensure `Property` with `unique` flag set is `unique` on `Class` level
-        Self::ensure_property_value_hash_unique_option_satisfied(
-            class_id,
-            in_class_schema_property_id,
-            &new_property_value_hash,
-        )?;
-
-        // Compute old hash from the old unique property value and its respective property id
-        let old_property_value_hash =
-            property_value_vector.compute_unique_hash::<T>(in_class_schema_property_id);
-
-        Ok((new_property_value_hash, old_property_value_hash))
-    }
-
-    /// Compute new unique property value hashes.
-    /// Ensure new property value hashes with `unique` flag set are `unique` on `Class` level
-    pub fn ensure_new_property_values_respect_uniquness(
-        class_id: T::ClassId,
-        new_output_values_for_existing_properties: StoredValuesForExistingProperties<T>,
-    ) -> Result<BTreeMap<PropertyId, T::Hash>, Error<T>> {
-        let new_unique_property_value_hashes =
-            new_output_values_for_existing_properties.compute_unique_hashes();
-
-        // Ensure all provided Properties with unique flag set are unique on Class level
-        Self::ensure_property_value_hashes_unique_option_satisfied(
-            class_id,
-            &new_unique_property_value_hashes,
-        )?;
-
-        Ok(new_unique_property_value_hashes)
-    }
-
-    /// Returns the stored `Class` if exist, error otherwise.
-    fn ensure_class_exists(class_id: T::ClassId) -> Result<ClassOf<T>, Error<T>> {
-        ensure!(
-            <ClassById<T>>::contains_key(class_id),
-            Error::<T>::ClassNotFound
-        );
-        Ok(Self::class_by_id(class_id))
-    }
-
-    /// Returns `Class` and `Entity` under given id, if exists, and `EntityAccessLevel` corresponding to `origin`, if permitted
-    fn ensure_class_entity_and_access_level(
-        account_id: T::AccountId,
-        entity_id: T::EntityId,
-        actor: &Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-    ) -> Result<(ClassOf<T>, EntityOf<T>, EntityAccessLevel), Error<T>> {
-        // Ensure Entity under given id exists, retrieve corresponding one
-        let entity = Self::ensure_known_entity_id(entity_id)?;
-
-        // Retrieve corresponding Class
-        let class = Self::class_by_id(entity.get_class_id());
-
-        // Derive EntityAccessLevel for the actor, attempting to act.
-        let access_level = EntityAccessLevel::derive(
-            &account_id,
-            entity.get_permissions_ref(),
-            class.get_permissions_ref(),
-            actor,
-        )?;
-
-        Ok((class, entity, access_level))
-    }
-
-    /// Ensure `Entity` under given `entity_id` exists, retrieve corresponding `Entity` & `Class`
-    pub fn ensure_known_entity_and_class(
-        entity_id: T::EntityId,
-    ) -> Result<(EntityOf<T>, ClassOf<T>), Error<T>> {
-        // Ensure Entity under given id exists, retrieve corresponding one
-        let entity = Self::ensure_known_entity_id(entity_id)?;
-
-        let class = ClassById::<T>::get(entity.get_class_id());
-        Ok((entity, class))
-    }
-
-    /// Filter `provided values_for_existing_properties`, leaving only `Reference`'s with `SameOwner` flag set
-    /// Returns the set of corresponding property ids
-    pub fn get_property_id_references_with_same_owner_flag_set(
-        values_for_existing_properties: StoredValuesForExistingProperties<T>,
-    ) -> BTreeSet<PropertyId> {
-        values_for_existing_properties
-            // Iterate over the PropertyId's
-            .keys()
-            // Filter provided values_for_existing_properties, leaving only `Reference`'s with `SameOwner` flag set
-            .filter(|property_id| {
-                if let Some(value_for_existing_property) =
-                    values_for_existing_properties.get(property_id)
-                {
-                    value_for_existing_property
-                        .get_property()
-                        .property_type
-                        .same_controller_status()
-                } else {
-                    false
-                }
-            })
-            .copied()
-            .collect()
-    }
-
-    /// Ensure all ids of provided `new_property_value_references_with_same_owner_flag_set`
-    /// corresponding to property ids of respective Class Property references with same owner flag set
-    pub fn ensure_only_reference_ids_with_same_owner_flag_set_provided(
-        entity_property_id_references_with_same_owner_flag_set: &BTreeSet<PropertyId>,
-        new_property_value_references_with_same_owner_flag_set: &BTreeMap<
-            PropertyId,
-            InputPropertyValue<T>,
-        >,
-    ) -> Result<(), Error<T>> {
-        let new_property_value_id_references_with_same_owner_flag_set: BTreeSet<PropertyId> =
-            new_property_value_references_with_same_owner_flag_set
-                .keys()
-                .copied()
-                .collect();
-
-        ensure!(
-            new_property_value_id_references_with_same_owner_flag_set
-                .is_subset(entity_property_id_references_with_same_owner_flag_set),
-            Error::<T>::AllProvidedPropertyValueIdsMustBeReferencesWithSameOwnerFlagSet
-        );
-        Ok(())
-    }
-
-    /// Ensure provided actor can create entities of current `Class`
-    pub fn ensure_can_create_entities(
-        class_permissions: &ClassPermissions<T::CuratorGroupId>,
-        account_id: &T::AccountId,
-        actor: &Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-    ) -> Result<(), Error<T>> {
-        let can_create = match &actor {
-            Actor::Lead => {
-                // Ensure lead authorization performed succesfully
-                ensure_lead_auth_success::<T>(account_id)?;
-                true
-            }
-            Actor::Member(member_id) if class_permissions.any_member_status() => {
-                // Ensure member authorization performed succesfully
-                ensure_member_auth_success::<T>(member_id, account_id)?;
-                true
-            }
-            Actor::Curator(curator_group_id, curator_id)
-                if class_permissions.is_maintainer(curator_group_id) =>
-            {
-                // Authorize curator, performing all checks to ensure curator can act
-                CuratorGroup::<T>::perform_curator_in_group_auth(
-                    curator_id,
-                    curator_group_id,
-                    account_id,
-                )?;
-                true
-            }
-            _ => false,
-        };
-        ensure!(can_create, Error::<T>::ActorCanNotCreateEntities);
-        Ok(())
-    }
-
-    /// Ensure all provided `new_property_value_references_with_same_owner_flag_set` are valid
-    fn ensure_are_valid_references_with_same_owner_flag_set(
-        new_property_value_references_with_same_owner_flag_set: InputValuesForExistingProperties<T>,
-        new_controller: &EntityController<T::MemberId>,
-    ) -> Result<(), Error<T>> {
-        for updated_value_for_existing_property in
-            new_property_value_references_with_same_owner_flag_set.values()
-        {
-            let (property, value) = updated_value_for_existing_property.unzip();
-
-            // Perform all required checks to ensure provided property values are valid references
-            Property::<T::ClassId>::ensure_property_value_is_valid_reference(
-                &property,
-                value,
-                new_controller,
-            )?;
-        }
-        Ok(())
-    }
-
-    /// Used to update entity_property_values with parameters provided.
-    /// Returns updated `entity_property_values`, if update performed
-    pub fn make_updated_property_value_references_with_same_owner_flag_set(
-        unused_property_id_references_with_same_owner_flag_set: BTreeSet<PropertyId>,
-        entity_property_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        new_property_value_references_with_same_owner_flag_set: &BTreeMap<
-            PropertyId,
-            StoredPropertyValueOf<T>,
-        >,
-    ) -> Option<BTreeMap<PropertyId, StoredPropertyValueOf<T>>> {
-        // Used to check if update performed
-        let mut entity_property_values_updated = entity_property_values.clone();
-
-        for (property_id, new_property_value_reference_with_same_owner_flag_set) in
-            new_property_value_references_with_same_owner_flag_set
-        {
-            // Update entity_property_values map at property_id with new_property_value_reference_with_same_owner_flag_set
-            entity_property_values_updated.insert(
-                *property_id,
-                new_property_value_reference_with_same_owner_flag_set.to_owned(),
-            );
-        }
-
-        // Throw away old non required property value references with same owner flag set
-        // and replace them with Default ones
-        for unused_property_id_reference_with_same_owner_flag_set in
-            unused_property_id_references_with_same_owner_flag_set
-        {
-            entity_property_values_updated.insert(
-                unused_property_id_reference_with_same_owner_flag_set,
-                StoredPropertyValue::default(),
-            );
-        }
-
-        if *entity_property_values != entity_property_values_updated {
-            Some(entity_property_values_updated)
-        } else {
-            None
-        }
-    }
-
-    /// Update InboundReferenceCounter, based on previously calculated entities_inbound_rcs_delta, for each Entity involved
-    pub fn update_entities_rcs(
-        entities_inbound_rcs_delta: &Option<ReferenceCounterSideEffects<T>>,
-    ) {
-        if let Some(entities_inbound_rcs_delta) = entities_inbound_rcs_delta {
-            entities_inbound_rcs_delta.update_entities_rcs();
-        }
-    }
-
-    /// Retrieve `property_ids`, that are not in `property_values`
-    pub fn compute_unused_property_ids(
-        property_values: &BTreeMap<PropertyId, InputPropertyValue<T>>,
-        property_ids: &BTreeSet<PropertyId>,
-    ) -> BTreeSet<PropertyId> {
-        let property_value_indices: BTreeSet<PropertyId> =
-            property_values.keys().cloned().collect();
-
-        property_ids
-            .difference(&property_value_indices)
-            .copied()
-            .collect()
-    }
-
-    /// Used to compute old unique hashes, that should be substituted with new ones.
-    pub fn compute_old_unique_hashes(
-        new_output_property_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        entity_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-    ) -> BTreeMap<PropertyId, T::Hash> {
-        entity_values
-            .iter()
-            .filter(|(property_id, _)| new_output_property_values.contains_key(property_id))
-            .map(|(&property_id, property_value)| {
-                (
-                    property_id,
-                    property_value.compute_unique_hash::<T>(property_id),
-                )
-            })
-            .collect()
-    }
-
-    /// Perform checks to ensure all required `property_values` under provided `unused_schema_property_ids` provided
-    pub fn ensure_all_required_properties_provided(
-        class_properties: &[Property<T::ClassId>],
-        unused_schema_property_ids: &BTreeSet<PropertyId>,
-    ) -> Result<(), Error<T>> {
-        for &unused_schema_property_id in unused_schema_property_ids {
-            let class_property = &class_properties
-                .get(unused_schema_property_id as usize)
-                .ok_or(Error::<T>::ClassPropertyNotFound)?;
-
-            // All required property values should be provided
-            ensure!(
-                !class_property.required,
-                Error::<T>::MissingRequiredProperty
-            );
-        }
-        Ok(())
-    }
-
-    /// Validate all values, provided in `values_for_existing_properties`, against the type of its `Property`
-    /// and check any additional constraints
-    pub fn ensure_property_values_are_valid(
-        entity_controller: &EntityController<T::MemberId>,
-        values_for_existing_properties: &InputValuesForExistingProperties<T>,
-    ) -> Result<(), Error<T>> {
-        for value_for_existing_property in values_for_existing_properties.values() {
-            let (property, value) = value_for_existing_property.unzip();
-
-            // Validate new InputPropertyValue against the type of this Property and check any additional constraints
-            Property::<T::ClassId>::ensure_property_value_to_update_is_valid(
-                property,
-                value,
-                entity_controller,
-            )?;
-        }
-
-        Ok(())
-    }
-
-    /// Ensure all provided `new_property_values` are already exist in `entity_property_values` map
-    pub fn ensure_all_property_values_are_already_added(
-        entity_property_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        new_property_values: &BTreeMap<PropertyId, InputPropertyValue<T>>,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            new_property_values
-                .keys()
-                .all(|key| entity_property_values.contains_key(key)),
-            Error::<T>::UnknownEntityPropertyId
-        );
-        Ok(())
-    }
-
-    /// Ensure `new_values_for_existing_properties` are accessible for actor with given `access_level`
-    pub fn ensure_all_property_values_are_unlocked_from(
-        new_values_for_existing_properties: &InputValuesForExistingProperties<T>,
-        access_level: EntityAccessLevel,
-    ) -> Result<(), Error<T>> {
-        for value_for_new_property in new_values_for_existing_properties.values() {
-            // Ensure Property is unlocked from Actor with given EntityAccessLevel
-            value_for_new_property
-                .get_property()
-                .ensure_unlocked_from::<T>(access_level)?;
-        }
-        Ok(())
-    }
-
-    /// Filter `new_property_values` identical to `entity_property_values`.
-    /// Return only `new_property_values`, that are not in `entity_property_values`
-    pub fn try_filter_identical_property_values(
-        entity_property_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        new_property_values: BTreeMap<PropertyId, InputPropertyValue<T>>,
-    ) -> BTreeMap<PropertyId, InputPropertyValue<T>> {
-        new_property_values
-            .into_iter()
-            .filter(|(id, new_property_value)| {
-                if let Some(entity_property_value) = entity_property_values.get(id) {
-                    StoredPropertyValue::<T::Hash, T::EntityId, T::Nonce>::from(
-                        new_property_value.to_owned(),
-                    ) != *entity_property_value
-                } else {
-                    true
-                }
-            })
-            .collect()
-    }
-
-    /// Update existing `entity_property_values` with `new_property_values`.
-    /// if update performed, returns updated entity property values
-    pub fn make_updated_property_values(
-        entity_property_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        new_output_property_values: &BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-    ) -> Option<BTreeMap<PropertyId, StoredPropertyValueOf<T>>> {
-        // Used to check if updated performed
-        let mut entity_property_values_updated = entity_property_values.to_owned();
-
-        new_output_property_values
-            .iter()
-            .for_each(|(id, new_property_value)| {
-                if let Some(entity_property_value) = entity_property_values_updated.get_mut(&id) {
-                    entity_property_value.update(new_property_value.to_owned());
-                }
-            });
-
-        if entity_property_values_updated != *entity_property_values {
-            Some(entity_property_values_updated)
-        } else {
-            None
-        }
-    }
-
-    /// Insert `InputValue` into `VecStoredPropertyValue` at `index_in_property_vector`.
-    /// Returns `VecStoredPropertyValue` wrapped in `StoredPropertyValue`
-    pub fn insert_at_index_in_property_vector(
-        mut property_value_vector: VecStoredPropertyValue<T::Hash, T::EntityId, T::Nonce>,
-        index_in_property_vector: VecMaxLength,
-        value: InputValue<T>,
-    ) -> StoredPropertyValueOf<T> {
-        property_value_vector.insert_at(index_in_property_vector, value.into());
-        StoredPropertyValue::Vector(property_value_vector)
-    }
-
-    /// Remove `InputValue` at `index_in_property_vector` in `VecInputPropertyValue`.
-    /// Returns `VecInputPropertyValue` wrapped in `InputPropertyValue`
-    pub fn remove_at_index_in_property_vector(
-        mut property_value_vector: VecStoredPropertyValue<T::Hash, T::EntityId, T::Nonce>,
-        index_in_property_vector: VecMaxLength,
-    ) -> StoredPropertyValueOf<T> {
-        property_value_vector.remove_at(index_in_property_vector);
-        StoredPropertyValue::Vector(property_value_vector)
-    }
-
-    /// Clear `VecStoredPropertyValue`.
-    /// Returns empty `VecStoredPropertyValue` wrapped in `StoredPropertyValue`
-    pub fn clear_property_vector(
-        mut property_value_vector: VecStoredPropertyValue<T::Hash, T::EntityId, T::Nonce>,
-    ) -> StoredPropertyValueOf<T> {
-        property_value_vector.clear();
-        StoredPropertyValue::Vector(property_value_vector)
-    }
-
-    /// Insert `InputPropertyValue` into `entity_property_values` mapping at `in_class_schema_property_id`.
-    /// Returns updated `entity_property_values`
-    pub fn insert_at_in_class_schema_property_id(
-        mut entity_property_values: BTreeMap<PropertyId, StoredPropertyValueOf<T>>,
-        in_class_schema_property_id: PropertyId,
-        property_value: StoredPropertyValueOf<T>,
-    ) -> BTreeMap<PropertyId, StoredPropertyValueOf<T>> {
-        entity_property_values.insert(in_class_schema_property_id, property_value);
-        entity_property_values
-    }
-
-    /// Ensure `Class` under given id exists, return corresponding one
-    pub fn ensure_known_class_id(class_id: T::ClassId) -> Result<ClassOf<T>, Error<T>> {
-        ensure!(
-            <ClassById<T>>::contains_key(class_id),
-            Error::<T>::ClassNotFound
-        );
-        Ok(Self::class_by_id(class_id))
-    }
-
-    /// Ensure `Entity` under given id exists, return corresponding one
-    pub fn ensure_known_entity_id(entity_id: T::EntityId) -> Result<EntityOf<T>, Error<T>> {
-        ensure!(
-            <EntityById<T>>::contains_key(entity_id),
-            Error::<T>::EntityNotFound
-        );
-        Ok(Self::entity_by_id(entity_id))
-    }
-
-    /// Ensure `CuratorGroup` under given id exists
-    pub fn ensure_curator_group_under_given_id_exists(
-        curator_group_id: &T::CuratorGroupId,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            <CuratorGroupById<T>>::contains_key(curator_group_id),
-            Error::<T>::CuratorGroupDoesNotExist
-        );
-        Ok(())
-    }
-
-    /// Ensure `CuratorGroup` under given id exists, return corresponding one
-    pub fn ensure_curator_group_exists(
-        curator_group_id: &T::CuratorGroupId,
-    ) -> Result<CuratorGroup<T>, Error<T>> {
-        Self::ensure_curator_group_under_given_id_exists(curator_group_id)?;
-        Ok(Self::curator_group_by_id(curator_group_id))
-    }
-
-    /// Ensure `MaxNumberOfMaintainersPerClass` constraint satisfied
-    pub fn ensure_maintainers_limit_not_reached(
-        curator_groups: &BTreeSet<T::CuratorGroupId>,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            curator_groups.len() < T::MaxNumberOfMaintainersPerClass::get() as usize,
-            Error::<T>::ClassMaintainersLimitReached
-        );
-        Ok(())
-    }
-
-    /// Ensure all `CuratorGroup`'s under given ids exist
-    pub fn ensure_curator_groups_exist(
-        curator_groups: &BTreeSet<T::CuratorGroupId>,
-    ) -> Result<(), Error<T>> {
-        for curator_group in curator_groups {
-            // Ensure CuratorGroup under given id exists
-            Self::ensure_curator_group_exists(curator_group)?;
-        }
-        Ok(())
-    }
-
-    /// Perform security checks to ensure provided `class_maintainers` are valid
-    pub fn ensure_class_maintainers_are_valid(
-        class_maintainers: &BTreeSet<T::CuratorGroupId>,
-    ) -> Result<(), Error<T>> {
-        // Ensure max number of maintainers per Class constraint satisfied
-        ensure!(
-            class_maintainers.len() <= T::MaxNumberOfMaintainersPerClass::get() as usize,
-            Error::<T>::ClassMaintainersLimitReached
-        );
-
-        // Ensure all curator groups provided are already exist in runtime
-        Self::ensure_curator_groups_exist(class_maintainers)?;
-        Ok(())
-    }
-
-    /// Ensure new `Schema` is not empty
-    pub fn ensure_non_empty_schema(
-        existing_properties: &BTreeSet<PropertyId>,
-        new_properties: &[Property<T::ClassId>],
-    ) -> Result<(), Error<T>> {
-        // Schema is empty if both existing_properties and new_properties are empty
-        let non_empty_schema = !existing_properties.is_empty() || !new_properties.is_empty();
-        ensure!(non_empty_schema, Error::<T>::NoPropertiesInClassSchema);
-        Ok(())
-    }
-
-    /// Ensure `ClassNameLengthConstraint` conditions satisfied
-    pub fn ensure_class_name_is_valid(text: &[u8]) -> Result<(), Error<T>> {
-        T::ClassNameLengthConstraint::get().ensure_valid(
-            text.len(),
-            Error::<T>::ClassNameTooShort,
-            Error::<T>::ClassNameTooLong,
-        )
-    }
-
-    /// Ensure `ClassDescriptionLengthConstraint` conditions satisfied
-    pub fn ensure_class_description_is_valid(text: &[u8]) -> Result<(), Error<T>> {
-        T::ClassDescriptionLengthConstraint::get().ensure_valid(
-            text.len(),
-            Error::<T>::ClassDescriptionTooShort,
-            Error::<T>::ClassDescriptionTooLong,
-        )
-    }
-
-    /// Ensure `MaxNumberOfClasses` constraint satisfied
-    pub fn ensure_class_limit_not_reached() -> Result<(), Error<T>> {
-        ensure!(
-            (<ClassById<T>>::iter().count() as MaxNumber) < T::MaxNumberOfClasses::get(),
-            Error::<T>::ClassLimitReached
-        );
-        Ok(())
-    }
-
-    /// Ensure `MaxNumberOfEntitiesPerClass` constraint satisfied
-    pub fn ensure_valid_number_of_entities_per_class(
-        maximum_entities_count: T::EntityId,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            maximum_entities_count <= T::MaxNumberOfEntitiesPerClass::get(),
-            Error::<T>::EntitiesNumberPerClassConstraintViolated
-        );
-        Ok(())
-    }
-
-    /// Ensure `IndividualEntitiesCreationLimit` constraint satisfied
-    pub fn ensure_valid_number_of_class_entities_per_actor_constraint(
-        number_of_class_entities_per_actor: T::EntityId,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            number_of_class_entities_per_actor <= T::IndividualEntitiesCreationLimit::get(),
-            Error::<T>::NumberOfClassEntitiesPerActorConstraintViolated
-        );
-        Ok(())
-    }
-
-    /// Ensure all entities creation limits, defined for a given `Class`, are valid
-    pub fn ensure_entities_creation_limits_are_valid(
-        maximum_entities_count: T::EntityId,
-        default_entity_creation_voucher_upper_bound: T::EntityId,
-    ) -> Result<(), Error<T>> {
-        // Ensure default_entity_creation_voucher_upper_bound does not exceed default_entity_creation_voucher_upper_bound
-        ensure!(
-            default_entity_creation_voucher_upper_bound <= maximum_entities_count,
-            Error::<T>::PerControllerEntitiesCreationLimitExceedsOverallLimit
-        );
-
-        // Ensure maximum_entities_count does not exceed MaxNumberOfEntitiesPerClass limit
-        Self::ensure_valid_number_of_entities_per_class(maximum_entities_count)?;
-
-        // Ensure default_entity_creation_voucher_upper_bound constraint does not exceed IndividualEntitiesCreationLimit
-        Self::ensure_valid_number_of_class_entities_per_actor_constraint(
-            default_entity_creation_voucher_upper_bound,
-        )
-    }
-
-    /// Ensure maximum number of operations during atomic batching constraint satisfied
-    pub fn ensure_number_of_operations_during_atomic_batching_limit_not_reached(
-        operations: &[OperationType<T>],
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            operations.len() <= T::MaxNumberOfOperationsDuringAtomicBatching::get() as usize,
-            Error::<T>::NumberOfOperationsDuringAtomicBatchingLimitReached
-        );
-        Ok(())
-    }
-
-    /// Complete all checks to ensure each `Property` is valid
-    pub fn ensure_all_properties_are_valid(
-        new_properties: &[Property<T::ClassId>],
-    ) -> Result<(), Error<T>> {
-        for new_property in new_properties.iter() {
-            // Ensure PropertyNameLengthConstraint satisfied
-            new_property.ensure_name_is_valid()?;
-
-            // Ensure PropertyDescriptionLengthConstraint satisfied
-            new_property.ensure_description_is_valid()?;
-
-            // Ensure Type specific constraints satisfied
-            new_property.ensure_property_type_size_is_valid()?;
-
-            // Ensure refers to existing class_id, if If Property Type is Reference,
-            Self::ensure_property_type_reference_is_valid(new_property)?;
-        }
-        Ok(())
-    }
-
-    /// Ensure refers to existing `class_id`, if If `Property` `Type` is `Reference`,
-    pub fn ensure_property_type_reference_is_valid(
-        property: &Property<T::ClassId>,
-    ) -> Result<(), Error<T>> {
-        let has_unknown_reference =
-            if let Type::Reference(other_class_id, _) = property.property_type.get_inner_type() {
-                !<ClassById<T>>::contains_key(other_class_id)
-            } else {
-                false
-            };
-
-        ensure!(
-            !has_unknown_reference,
-            Error::<T>::ClassSchemaRefersUnknownClass
-        );
-
-        Ok(())
-    }
-
-    /// Ensure all `Property` names are  unique within `Class`
-    pub fn ensure_all_property_names_are_unique(
-        class_properties: &[Property<T::ClassId>],
-        new_properties: &[Property<T::ClassId>],
-    ) -> Result<(), Error<T>> {
-        // Used to ensure all property names are unique within class
-        let mut unique_prop_names = BTreeSet::new();
-
-        for property in class_properties.iter() {
-            unique_prop_names.insert(property.name.to_owned());
-        }
-
-        for new_property in new_properties {
-            // Ensure name of a new property is unique within its class.
-            ensure!(
-                !unique_prop_names.contains(&new_property.name),
-                Error::<T>::PropertyNameNotUniqueInAClass
-            );
-
-            unique_prop_names.insert(new_property.name.to_owned());
-        }
-
-        Ok(())
-    }
-
-    /// Ensure provided indices of `existing_properties`  are valid indices of `Class` properties
-    pub fn ensure_schema_properties_are_valid_indices(
-        existing_properties: &BTreeSet<PropertyId>,
-        class_properties: &[Property<T::ClassId>],
-    ) -> Result<(), Error<T>> {
-        let has_unknown_properties = existing_properties
-            .iter()
-            .any(|&prop_id| prop_id >= class_properties.len() as PropertyId);
-        ensure!(
-            !has_unknown_properties,
-            Error::<T>::ClassSchemaRefersUnknownPropertyIndex
-        );
-        Ok(())
-    }
-
-    /// Create new `Schema` from existing and new property ids
-    pub fn create_class_schema(
-        existing_properties: BTreeSet<PropertyId>,
-        class_properties: &[Property<T::ClassId>],
-        new_properties: &[Property<T::ClassId>],
-    ) -> Schema {
-        // Calcualate new property ids
-        let properties = new_properties
-            .iter()
-            .enumerate()
-            .map(|(i, _)| (class_properties.len() + i) as PropertyId)
-            // Concatenate them with existing ones
-            .chain(existing_properties.into_iter())
-            .collect();
-
-        Schema::new(properties)
-    }
-
-    /// Update existing `Class` properties with new ones provided, return updated ones
-    pub fn make_updated_class_properties(
-        class_properties: Vec<Property<T::ClassId>>,
-        new_properties: Vec<Property<T::ClassId>>,
-    ) -> Vec<Property<T::ClassId>> {
-        class_properties
-            .into_iter()
-            .chain(new_properties.into_iter())
-            .collect()
-    }
-}
-
-impl<T: Trait> Module<T> {
-    pub fn set_initial_ids_to_one() {
-        <NextEntityId<T>>::put(T::EntityId::one());
-        <NextClassId<T>>::put(T::ClassId::one());
-        <NextCuratorGroupId<T>>::put(T::CuratorGroupId::one());
-    }
-}
-
-decl_event!(
-    pub enum Event<T>
-    where
-        CuratorGroupId = <T as ActorAuthenticator>::CuratorGroupId,
-        CuratorId = <T as ActorAuthenticator>::CuratorId,
-        ClassId = <T as Trait>::ClassId,
-        EntityId = <T as Trait>::EntityId,
-        EntityController = EntityController<<T as ActorAuthenticator>::MemberId>,
-        EntityCreationVoucher = EntityCreationVoucher<T>,
-        Status = bool,
-        Actor = Actor<
-            <T as ActorAuthenticator>::CuratorGroupId,
-            <T as ActorAuthenticator>::CuratorId,
-            <T as ActorAuthenticator>::MemberId,
-        >,
-        Nonce = <T as Trait>::Nonce,
-        SideEffects = Option<ReferenceCounterSideEffects<T>>,
-        SideEffect = Option<(<T as Trait>::EntityId, EntityReferenceCounterSideEffect)>,
-        FailedAt = u32,
-    {
-        CuratorGroupAdded(CuratorGroupId),
-        CuratorGroupRemoved(CuratorGroupId),
-        CuratorGroupStatusSet(CuratorGroupId, Status),
-        CuratorAdded(CuratorGroupId, CuratorId),
-        CuratorRemoved(CuratorGroupId, CuratorId),
-        MaintainerAdded(ClassId, CuratorGroupId),
-        MaintainerRemoved(ClassId, CuratorGroupId),
-        EntityCreationVoucherUpdated(EntityController, EntityCreationVoucher),
-        EntityCreationVoucherCreated(EntityController, EntityCreationVoucher),
-        ClassCreated(ClassId),
-        ClassPermissionsUpdated(ClassId),
-        ClassSchemaAdded(ClassId, SchemaId),
-        ClassSchemaStatusUpdated(ClassId, SchemaId, Status),
-        EntityPermissionsUpdated(EntityId),
-        EntityCreated(Actor, EntityId),
-        EntityRemoved(Actor, EntityId),
-        EntitySchemaSupportAdded(Actor, EntityId, SchemaId, SideEffects),
-        EntityPropertyValuesUpdated(Actor, EntityId, SideEffects),
-        VectorCleared(Actor, EntityId, PropertyId, SideEffects),
-        RemovedAtVectorIndex(Actor, EntityId, PropertyId, VecMaxLength, Nonce, SideEffect),
-        InsertedAtVectorIndex(Actor, EntityId, PropertyId, VecMaxLength, Nonce, SideEffect),
-        EntityOwnershipTransfered(EntityId, EntityController, SideEffects),
-        TransactionCompleted(Actor),
-        TransactionFailed(Actor, FailedAt),
-    }
-);

+ 0 - 1041
runtime-modules/content-directory/src/mock.rs

@@ -1,1041 +0,0 @@
-#![cfg(test)]
-
-use crate::InputValidationLengthConstraint;
-use crate::*;
-use core::iter::FromIterator;
-use frame_support::traits::{OnFinalize, OnInitialize};
-pub use frame_support::{
-    assert_err, assert_ok, impl_outer_event, impl_outer_origin, parameter_types,
-};
-use sp_core::H256;
-use sp_runtime::{
-    testing::Header,
-    traits::{BlakeTwo256, IdentityLookup},
-    Perbill,
-};
-use std::cell::RefCell;
-
-/// Runtime Types
-
-pub type ClassId = <Runtime as Trait>::ClassId;
-pub type EntityId = <Runtime as Trait>::EntityId;
-pub type Nonce = <Runtime as Trait>::Nonce;
-pub type Hashed = <Runtime as system::Trait>::Hash;
-
-pub type CuratorId = <Runtime as ActorAuthenticator>::CuratorId;
-pub type CuratorGroupId = <Runtime as ActorAuthenticator>::CuratorGroupId;
-pub type MemberId = <Runtime as ActorAuthenticator>::MemberId;
-
-/// Origins
-
-pub const LEAD_ORIGIN: u64 = 1;
-
-pub const FIRST_CURATOR_ORIGIN: u64 = 2;
-pub const SECOND_CURATOR_ORIGIN: u64 = 3;
-
-pub const FIRST_MEMBER_ORIGIN: u64 = 4;
-pub const SECOND_MEMBER_ORIGIN: u64 = 5;
-pub const UNKNOWN_ORIGIN: u64 = 7777;
-
-/// Runtime Id's
-
-pub const FIRST_CURATOR_ID: CuratorId = 1;
-pub const SECOND_CURATOR_ID: CuratorId = 2;
-
-pub const FIRST_CURATOR_GROUP_ID: CuratorGroupId = 1;
-pub const SECOND_CURATOR_GROUP_ID: CuratorGroupId = 2;
-
-pub const FIRST_MEMBER_ID: MemberId = 1;
-pub const SECOND_MEMBER_ID: MemberId = 2;
-
-pub const FIRST_CLASS_ID: ClassId = 1;
-pub const SECOND_CLASS_ID: ClassId = 2;
-
-pub const FIRST_ENTITY_ID: EntityId = 1;
-pub const SECOND_ENTITY_ID: EntityId = 2;
-pub const THIRD_ENTITY_ID: EntityId = 3;
-
-pub const UNKNOWN_CLASS_ID: ClassId = 111;
-pub const UNKNOWN_ENTITY_ID: EntityId = 222;
-pub const UNKNOWN_PROPERTY_ID: PropertyId = 333;
-pub const UNKNOWN_SCHEMA_ID: SchemaId = 444;
-
-pub const UNKNOWN_CURATOR_GROUP_ID: CuratorGroupId = 555;
-pub const UNKNOWN_CURATOR_ID: CuratorGroupId = 555;
-pub const UNKNOWN_MEMBER_ID: CuratorGroupId = 777;
-
-pub const FIRST_SCHEMA_ID: SchemaId = 0;
-pub const SECOND_SCHEMA_ID: SchemaId = 1;
-
-pub const FIRST_PROPERTY_ID: SchemaId = 0;
-pub const SECOND_PROPERTY_ID: SchemaId = 1;
-
-impl_outer_origin! {
-    pub enum Origin for Runtime {}
-}
-
-// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted.
-#[derive(Clone, Default, PartialEq, Eq, Debug)]
-pub struct Runtime;
-parameter_types! {
-    pub const BlockHashCount: u64 = 250;
-    pub const MaximumBlockWeight: u32 = 1024;
-    pub const MaximumBlockLength: u32 = 2 * 1024;
-    pub const AvailableBlockRatio: Perbill = Perbill::one();
-    pub const MinimumPeriod: u64 = 5;
-}
-
-thread_local! {
-    static PROPERTY_NAME_CONSTRAINT: RefCell<InputValidationLengthConstraint> = RefCell::new(InputValidationLengthConstraint::default());
-    static PROPERTY_DESCRIPTION_CONSTRAINT: RefCell<InputValidationLengthConstraint> = RefCell::new(InputValidationLengthConstraint::default());
-    static CLASS_NAME_CONSTRAINT: RefCell<InputValidationLengthConstraint> = RefCell::new(InputValidationLengthConstraint::default());
-    static CLASS_DESCRIPTION_CONSTRAINT: RefCell<InputValidationLengthConstraint> = RefCell::new(InputValidationLengthConstraint::default());
-    static MAX_NUMBER_OF_CLASSES: RefCell<MaxNumber> = RefCell::new(0);
-    static MAX_NUMBER_OF_MAINTAINERS_PER_CLASS: RefCell<MaxNumber> = RefCell::new(0);
-    static MAX_NUMBER_OF_SCHEMAS_PER_CLASS: RefCell<MaxNumber> = RefCell::new(0);
-    static MAX_NUMBER_OF_PROPERTIES_PER_CLASS: RefCell<MaxNumber> = RefCell::new(0);
-    static MAX_NUMBER_OF_ENTITIES_PER_CLASS: RefCell<EntityId> = RefCell::new(0);
-    static MAX_NUMBER_OF_CURATORS_PER_GROUP: RefCell<MaxNumber> = RefCell::new(0);
-    static MAX_NUMBER_OF_OPERATIONS_DURING_ATOMIC_BATCHING: RefCell<MaxNumber> = RefCell::new(0);
-    static VEC_MAX_LENGTH_CONSTRAINT: RefCell<VecMaxLength> = RefCell::new(0);
-    static TEXT_MAX_LENGTH_CONSTRAINT: RefCell<TextMaxLength> = RefCell::new(0);
-    static HASHED_TEXT_MAX_LENGTH_CONSTRAINT: RefCell<HashedTextMaxLength> = RefCell::new(Some(0));
-    static INDIVIDUAL_ENTITIES_CREATION_LIMIT: RefCell<EntityId> = RefCell::new(0);
-}
-
-pub struct PropertyNameLengthConstraint;
-impl Get<InputValidationLengthConstraint> for PropertyNameLengthConstraint {
-    fn get() -> InputValidationLengthConstraint {
-        PROPERTY_NAME_CONSTRAINT.with(|v| *v.borrow())
-    }
-}
-
-pub struct PropertyDescriptionLengthConstraint;
-impl Get<InputValidationLengthConstraint> for PropertyDescriptionLengthConstraint {
-    fn get() -> InputValidationLengthConstraint {
-        PROPERTY_DESCRIPTION_CONSTRAINT.with(|v| *v.borrow())
-    }
-}
-
-pub struct ClassNameLengthConstraint;
-impl Get<InputValidationLengthConstraint> for ClassNameLengthConstraint {
-    fn get() -> InputValidationLengthConstraint {
-        CLASS_NAME_CONSTRAINT.with(|v| *v.borrow())
-    }
-}
-
-pub struct ClassDescriptionLengthConstraint;
-impl Get<InputValidationLengthConstraint> for ClassDescriptionLengthConstraint {
-    fn get() -> InputValidationLengthConstraint {
-        CLASS_DESCRIPTION_CONSTRAINT.with(|v| *v.borrow())
-    }
-}
-
-pub struct MaxNumberOfClasses;
-impl Get<MaxNumber> for MaxNumberOfClasses {
-    fn get() -> MaxNumber {
-        MAX_NUMBER_OF_CLASSES.with(|v| *v.borrow())
-    }
-}
-
-pub struct MaxNumberOfMaintainersPerClass;
-impl Get<MaxNumber> for MaxNumberOfMaintainersPerClass {
-    fn get() -> MaxNumber {
-        MAX_NUMBER_OF_MAINTAINERS_PER_CLASS.with(|v| *v.borrow())
-    }
-}
-
-pub struct MaxNumberOfCuratorsPerGroup;
-impl Get<MaxNumber> for MaxNumberOfCuratorsPerGroup {
-    fn get() -> MaxNumber {
-        MAX_NUMBER_OF_CURATORS_PER_GROUP.with(|v| *v.borrow())
-    }
-}
-
-pub struct MaxNumberOfSchemasPerClass;
-impl Get<MaxNumber> for MaxNumberOfSchemasPerClass {
-    fn get() -> MaxNumber {
-        MAX_NUMBER_OF_SCHEMAS_PER_CLASS.with(|v| *v.borrow())
-    }
-}
-
-pub struct MaxNumberOfPropertiesPerSchema;
-impl Get<MaxNumber> for MaxNumberOfPropertiesPerSchema {
-    fn get() -> MaxNumber {
-        MAX_NUMBER_OF_PROPERTIES_PER_CLASS.with(|v| *v.borrow())
-    }
-}
-
-pub struct MaxNumberOfOperationsDuringAtomicBatching;
-impl Get<MaxNumber> for MaxNumberOfOperationsDuringAtomicBatching {
-    fn get() -> MaxNumber {
-        MAX_NUMBER_OF_OPERATIONS_DURING_ATOMIC_BATCHING.with(|v| *v.borrow())
-    }
-}
-
-pub struct VecMaxLengthConstraint;
-impl Get<VecMaxLength> for VecMaxLengthConstraint {
-    fn get() -> VecMaxLength {
-        VEC_MAX_LENGTH_CONSTRAINT.with(|v| *v.borrow())
-    }
-}
-
-pub struct TextMaxLengthConstraint;
-impl Get<TextMaxLength> for TextMaxLengthConstraint {
-    fn get() -> TextMaxLength {
-        TEXT_MAX_LENGTH_CONSTRAINT.with(|v| *v.borrow())
-    }
-}
-
-pub struct HashedTextMaxLengthConstraint;
-impl Get<HashedTextMaxLength> for HashedTextMaxLengthConstraint {
-    fn get() -> HashedTextMaxLength {
-        HASHED_TEXT_MAX_LENGTH_CONSTRAINT.with(|v| *v.borrow())
-    }
-}
-
-pub struct MaxNumberOfEntitiesPerClass;
-impl Get<EntityId> for MaxNumberOfEntitiesPerClass {
-    fn get() -> EntityId {
-        MAX_NUMBER_OF_ENTITIES_PER_CLASS.with(|v| *v.borrow())
-    }
-}
-
-pub struct IndividualEntitiesCreationLimit;
-impl Get<EntityId> for IndividualEntitiesCreationLimit {
-    fn get() -> EntityId {
-        INDIVIDUAL_ENTITIES_CREATION_LIMIT.with(|v| *v.borrow())
-    }
-}
-
-impl system::Trait for Runtime {
-    type BaseCallFilter = ();
-    type Origin = Origin;
-    type Call = ();
-    type Index = u64;
-    type BlockNumber = u64;
-    type Hash = H256;
-    type Hashing = BlakeTwo256;
-    type AccountId = u64;
-    type Lookup = IdentityLookup<Self::AccountId>;
-    type Header = Header;
-    type Event = TestEvent;
-    type BlockHashCount = BlockHashCount;
-    type MaximumBlockWeight = MaximumBlockWeight;
-    type DbWeight = ();
-    type BlockExecutionWeight = ();
-    type ExtrinsicBaseWeight = ();
-    type MaximumExtrinsicWeight = ();
-    type MaximumBlockLength = MaximumBlockLength;
-    type AvailableBlockRatio = AvailableBlockRatio;
-    type Version = ();
-    type ModuleToIndex = ();
-    type AccountData = ();
-    type OnNewAccount = ();
-    type OnKilledAccount = ();
-}
-
-mod test_events {
-    pub use crate::Event;
-}
-
-impl_outer_event! {
-    pub enum TestEvent for Runtime {
-        test_events<T>,
-        system<T>,
-    }
-}
-
-impl Trait for Runtime {
-    type Event = TestEvent;
-    type Nonce = u64;
-    type ClassId = u64;
-    type EntityId = u64;
-    type PropertyNameLengthConstraint = PropertyNameLengthConstraint;
-    type PropertyDescriptionLengthConstraint = PropertyDescriptionLengthConstraint;
-    type ClassNameLengthConstraint = ClassNameLengthConstraint;
-    type ClassDescriptionLengthConstraint = ClassDescriptionLengthConstraint;
-    type MaxNumberOfClasses = MaxNumberOfClasses;
-    type MaxNumberOfMaintainersPerClass = MaxNumberOfMaintainersPerClass;
-    type MaxNumberOfSchemasPerClass = MaxNumberOfSchemasPerClass;
-    type MaxNumberOfPropertiesPerSchema = MaxNumberOfPropertiesPerSchema;
-    type MaxNumberOfEntitiesPerClass = MaxNumberOfEntitiesPerClass;
-    type MaxNumberOfCuratorsPerGroup = MaxNumberOfCuratorsPerGroup;
-    type MaxNumberOfOperationsDuringAtomicBatching = MaxNumberOfOperationsDuringAtomicBatching;
-    type VecMaxLengthConstraint = VecMaxLengthConstraint;
-    type TextMaxLengthConstraint = TextMaxLengthConstraint;
-    type HashedTextMaxLengthConstraint = HashedTextMaxLengthConstraint;
-    type IndividualEntitiesCreationLimit = IndividualEntitiesCreationLimit;
-}
-
-impl ActorAuthenticator for Runtime {
-    type CuratorId = u64;
-    type MemberId = u64;
-    type CuratorGroupId = u64;
-
-    // Consider lazy_static crate?
-
-    fn is_lead(account_id: &Self::AccountId) -> bool {
-        let lead_account_id = ensure_signed(Origin::signed(LEAD_ORIGIN)).unwrap();
-        *account_id == lead_account_id
-    }
-
-    fn is_curator(curator_id: &Self::CuratorId, account_id: &Self::AccountId) -> bool {
-        let first_curator_account_id = ensure_signed(Origin::signed(FIRST_CURATOR_ORIGIN)).unwrap();
-        let second_curator_account_id =
-            ensure_signed(Origin::signed(SECOND_CURATOR_ORIGIN)).unwrap();
-        (first_curator_account_id == *account_id && FIRST_CURATOR_ID == *curator_id)
-            || (second_curator_account_id == *account_id && SECOND_CURATOR_ID == *curator_id)
-    }
-
-    fn is_member(member_id: &Self::MemberId, account_id: &Self::AccountId) -> bool {
-        let unknown_member_account_id = ensure_signed(Origin::signed(UNKNOWN_ORIGIN)).unwrap();
-        *member_id < MaxNumberOfEntitiesPerClass::get() && unknown_member_account_id != *account_id
-    }
-}
-
-pub struct ExtBuilder {
-    property_name_constraint: InputValidationLengthConstraint,
-    property_description_constraint: InputValidationLengthConstraint,
-    class_name_constraint: InputValidationLengthConstraint,
-    class_description_constraint: InputValidationLengthConstraint,
-    max_number_of_classes: MaxNumber,
-    max_number_of_maintainers_per_class: MaxNumber,
-    max_number_of_schemas_per_class: MaxNumber,
-    max_number_of_properties_per_class: MaxNumber,
-    max_number_of_entities_per_class: EntityId,
-    max_number_of_curators_per_group: MaxNumber,
-    max_number_of_operations_during_atomic_batching: MaxNumber,
-    vec_max_length_constraint: VecMaxLength,
-    text_max_length_constraint: TextMaxLength,
-    hashed_text_max_length_constraint: HashedTextMaxLength,
-    individual_entities_creation_limit: EntityId,
-}
-
-impl Default for ExtBuilder {
-    fn default() -> Self {
-        Self {
-            property_name_constraint: InputValidationLengthConstraint::new(1, 49),
-            property_description_constraint: InputValidationLengthConstraint::new(1, 500),
-            class_name_constraint: InputValidationLengthConstraint::new(1, 49),
-            class_description_constraint: InputValidationLengthConstraint::new(1, 500),
-            max_number_of_classes: 100,
-            max_number_of_maintainers_per_class: 10,
-            max_number_of_schemas_per_class: 20,
-            max_number_of_properties_per_class: 40,
-            max_number_of_entities_per_class: 400,
-            max_number_of_curators_per_group: 50,
-            max_number_of_operations_during_atomic_batching: 500,
-            vec_max_length_constraint: 200,
-            text_max_length_constraint: 5000,
-            hashed_text_max_length_constraint: Some(25000),
-            individual_entities_creation_limit: 50,
-        }
-    }
-}
-
-impl ExtBuilder {
-    pub fn set_associated_consts(&self) {
-        PROPERTY_NAME_CONSTRAINT.with(|v| *v.borrow_mut() = self.property_name_constraint);
-        PROPERTY_DESCRIPTION_CONSTRAINT
-            .with(|v| *v.borrow_mut() = self.property_description_constraint);
-        CLASS_NAME_CONSTRAINT.with(|v| *v.borrow_mut() = self.class_name_constraint);
-        CLASS_DESCRIPTION_CONSTRAINT.with(|v| *v.borrow_mut() = self.class_description_constraint);
-        MAX_NUMBER_OF_CLASSES.with(|v| *v.borrow_mut() = self.max_number_of_classes);
-        MAX_NUMBER_OF_MAINTAINERS_PER_CLASS
-            .with(|v| *v.borrow_mut() = self.max_number_of_maintainers_per_class);
-        MAX_NUMBER_OF_SCHEMAS_PER_CLASS
-            .with(|v| *v.borrow_mut() = self.max_number_of_schemas_per_class);
-        MAX_NUMBER_OF_PROPERTIES_PER_CLASS
-            .with(|v| *v.borrow_mut() = self.max_number_of_properties_per_class);
-        MAX_NUMBER_OF_ENTITIES_PER_CLASS
-            .with(|v| *v.borrow_mut() = self.max_number_of_entities_per_class);
-        MAX_NUMBER_OF_CURATORS_PER_GROUP
-            .with(|v| *v.borrow_mut() = self.max_number_of_curators_per_group);
-        MAX_NUMBER_OF_OPERATIONS_DURING_ATOMIC_BATCHING
-            .with(|v| *v.borrow_mut() = self.max_number_of_operations_during_atomic_batching);
-        VEC_MAX_LENGTH_CONSTRAINT.with(|v| *v.borrow_mut() = self.vec_max_length_constraint);
-        TEXT_MAX_LENGTH_CONSTRAINT.with(|v| *v.borrow_mut() = self.text_max_length_constraint);
-        HASHED_TEXT_MAX_LENGTH_CONSTRAINT
-            .with(|v| *v.borrow_mut() = self.hashed_text_max_length_constraint);
-        INDIVIDUAL_ENTITIES_CREATION_LIMIT
-            .with(|v| *v.borrow_mut() = self.individual_entities_creation_limit);
-    }
-
-    pub fn build(self, config: GenesisConfig<Runtime>) -> sp_io::TestExternalities {
-        self.set_associated_consts();
-        let mut t = system::GenesisConfig::default()
-            .build_storage::<Runtime>()
-            .unwrap();
-        config.assimilate_storage(&mut t).unwrap();
-        t.into()
-    }
-}
-
-// This function basically just builds a genesis storage key/value store according to
-// our desired mockup.
-
-fn default_content_directory_genesis_config() -> GenesisConfig<Runtime> {
-    GenesisConfig {
-        class_by_id: vec![],
-        entity_by_id: vec![],
-        curator_group_by_id: vec![],
-        next_class_id: 1,
-        next_entity_id: 1,
-        next_curator_group_id: 1,
-    }
-}
-
-pub fn with_test_externalities<R, F: FnOnce() -> R>(f: F) -> R {
-    let default_genesis_config = default_content_directory_genesis_config();
-    /*
-        Events are not emitted on block 0.
-        So any dispatchable calls made during genesis block formation will have no events emitted.
-        https://substrate.dev/recipes/2-appetizers/4-events.html
-    */
-    let func = || {
-        run_to_block(1);
-        f()
-    };
-
-    ExtBuilder::default()
-        .build(default_genesis_config)
-        .execute_with(func)
-}
-
-pub fn generate_text(len: usize) -> Vec<u8> {
-    vec![b'x'; len]
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> Property<ClassId> {
-    pub fn required(mut self) -> Self {
-        self.required = true;
-        self
-    }
-
-    pub fn unique(mut self) -> Self {
-        self.unique = true;
-        self
-    }
-}
-
-// Events
-
-type RawTestEvent = RawEvent<
-    CuratorGroupId,
-    CuratorId,
-    ClassId,
-    EntityId,
-    EntityController<MemberId>,
-    EntityCreationVoucher<Runtime>,
-    bool,
-    Actor<CuratorGroupId, CuratorId, MemberId>,
-    Nonce,
-    Option<ReferenceCounterSideEffects<Runtime>>,
-    Option<(EntityId, EntityReferenceCounterSideEffect)>,
-    u32,
->;
-
-pub fn get_test_event(raw_event: RawTestEvent) -> TestEvent {
-    TestEvent::test_events(raw_event)
-}
-
-pub fn assert_event(tested_event: TestEvent, number_of_events_after_call: usize) {
-    // Ensure  runtime events length is equal to expected number of events after call
-    assert_eq!(System::events().len(), number_of_events_after_call);
-
-    // Ensure  last emitted event is equal to expected one
-    assert!(matches!(
-            System::events()
-                .iter()
-                .last(),
-            Some(last_event) if last_event.event == tested_event
-    ));
-}
-
-pub fn assert_failure(
-    call_result: DispatchResult,
-    expected_error: Error<Runtime>,
-    number_of_events_before_call: usize,
-) {
-    // Ensure  call result is equal to expected error
-    assert_err!(call_result, expected_error);
-
-    // Ensure  no other events emitted after call
-    assert_eq!(System::events().len(), number_of_events_before_call);
-}
-
-// Curator groups
-
-pub fn next_curator_group_id() -> CuratorGroupId {
-    TestModule::next_curator_group_id()
-}
-
-pub fn add_curator_group(lead_origin: u64) -> DispatchResult {
-    TestModule::add_curator_group(Origin::signed(lead_origin))
-}
-
-pub fn remove_curator_group(lead_origin: u64, curator_group_id: CuratorGroupId) -> DispatchResult {
-    TestModule::remove_curator_group(Origin::signed(lead_origin), curator_group_id)
-}
-
-pub fn add_curator_to_group(
-    lead_origin: u64,
-    curator_group_id: CuratorGroupId,
-    curator_id: CuratorId,
-) -> DispatchResult {
-    TestModule::add_curator_to_group(Origin::signed(lead_origin), curator_group_id, curator_id)
-}
-
-pub fn remove_curator_from_group(
-    lead_origin: u64,
-    curator_group_id: CuratorGroupId,
-    curator_id: CuratorId,
-) -> DispatchResult {
-    TestModule::remove_curator_from_group(Origin::signed(lead_origin), curator_group_id, curator_id)
-}
-
-pub fn set_curator_group_status(
-    lead_origin: u64,
-    curator_group_id: CuratorGroupId,
-    is_active: bool,
-) -> DispatchResult {
-    TestModule::set_curator_group_status(Origin::signed(lead_origin), curator_group_id, is_active)
-}
-
-pub fn curator_group_by_id(curator_group_id: CuratorGroupId) -> CuratorGroup<Runtime> {
-    TestModule::curator_group_by_id(curator_group_id)
-}
-
-pub fn curator_group_exists(curator_group_id: CuratorGroupId) -> bool {
-    CuratorGroupById::<Runtime>::contains_key(curator_group_id)
-}
-
-// Classes
-
-pub enum ClassType {
-    Valid,
-    NameTooLong,
-    NameTooShort,
-    DescriptionTooLong,
-    DescriptionTooShort,
-    InvalidMaximumEntitiesCount,
-    InvalidDefaultVoucherUpperBound,
-    DefaultVoucherUpperBoundExceedsMaximumEntitiesCount,
-    MaintainersLimitReached,
-    CuratorGroupDoesNotExist,
-}
-
-pub fn create_simple_class(lead_origin: u64, class_type: ClassType) -> DispatchResult {
-    let mut class = create_class_with_default_permissions();
-    match class_type {
-        ClassType::Valid => (),
-        ClassType::NameTooShort => {
-            class.set_name(generate_text(
-                ClassNameLengthConstraint::get().min() as usize - 1,
-            ));
-        }
-        ClassType::NameTooLong => {
-            class.set_name(generate_text(
-                ClassNameLengthConstraint::get().max() as usize + 1,
-            ));
-        }
-        ClassType::DescriptionTooLong => {
-            class.set_description(generate_text(
-                ClassDescriptionLengthConstraint::get().max() as usize + 1,
-            ));
-        }
-        ClassType::DescriptionTooShort => {
-            class.set_description(generate_text(
-                ClassDescriptionLengthConstraint::get().min() as usize - 1,
-            ));
-        }
-        ClassType::InvalidMaximumEntitiesCount => {
-            class.set_maximum_entities_count(MaxNumberOfEntitiesPerClass::get() + 1);
-        }
-        ClassType::InvalidDefaultVoucherUpperBound => {
-            class.set_default_entity_creation_voucher_upper_bound(
-                IndividualEntitiesCreationLimit::get() + 1,
-            );
-        }
-        ClassType::DefaultVoucherUpperBoundExceedsMaximumEntitiesCount => {
-            class.set_maximum_entities_count(5);
-
-            class.set_maximum_entities_count(3);
-        }
-        ClassType::MaintainersLimitReached => {
-            let mut maintainers = BTreeSet::new();
-            for curator_group_id in 1..=(MaxNumberOfMaintainersPerClass::get() + 1) {
-                maintainers.insert(curator_group_id as CuratorGroupId);
-            }
-            class.get_permissions_mut().set_maintainers(maintainers);
-        }
-        ClassType::CuratorGroupDoesNotExist => {
-            let maintainers = BTreeSet::from_iter(vec![UNKNOWN_CURATOR_GROUP_ID].into_iter());
-            class.get_permissions_mut().set_maintainers(maintainers);
-        }
-    };
-    TestModule::create_class(
-        Origin::signed(lead_origin),
-        class.get_name().to_owned(),
-        class.get_description().to_owned(),
-        class.get_permissions_ref().to_owned(),
-        class.get_maximum_entities_count(),
-        class.get_default_entity_creation_voucher_upper_bound(),
-    )
-}
-
-pub fn create_class_with_default_permissions() -> Class<EntityId, ClassId, CuratorGroupId> {
-    Class::new(
-        ClassPermissions::default(),
-        generate_text(ClassNameLengthConstraint::get().max() as usize),
-        generate_text(ClassDescriptionLengthConstraint::get().max() as usize),
-        MaxNumberOfEntitiesPerClass::get(),
-        IndividualEntitiesCreationLimit::get(),
-    )
-}
-
-pub fn add_maintainer_to_class(
-    lead_origin: u64,
-    class_id: ClassId,
-    curator_group_id: CuratorGroupId,
-) -> DispatchResult {
-    TestModule::add_maintainer_to_class(Origin::signed(lead_origin), class_id, curator_group_id)
-}
-
-pub fn remove_maintainer_from_class(
-    lead_origin: u64,
-    class_id: ClassId,
-    curator_group_id: CuratorGroupId,
-) -> DispatchResult {
-    TestModule::remove_maintainer_from_class(
-        Origin::signed(lead_origin),
-        class_id,
-        curator_group_id,
-    )
-}
-
-pub fn update_class_permissions(
-    lead_origin: u64,
-    class_id: ClassId,
-    updated_any_member: Option<bool>,
-    updated_entity_creation_blocked: Option<bool>,
-    updated_all_entity_property_values_locked: Option<bool>,
-    updated_maintainers: Option<BTreeSet<CuratorGroupId>>,
-) -> DispatchResult {
-    TestModule::update_class_permissions(
-        Origin::signed(lead_origin),
-        class_id,
-        updated_any_member,
-        updated_entity_creation_blocked,
-        updated_all_entity_property_values_locked,
-        updated_maintainers,
-    )
-}
-
-pub fn add_class_schema(
-    lead_origin: u64,
-    class_id: ClassId,
-    existing_properties: BTreeSet<PropertyId>,
-    new_properties: Vec<Property<ClassId>>,
-) -> DispatchResult {
-    TestModule::add_class_schema(
-        Origin::signed(lead_origin),
-        class_id,
-        existing_properties,
-        new_properties,
-    )
-}
-
-pub fn update_class_schema_status(
-    lead_origin: u64,
-    class_id: ClassId,
-    schema_id: SchemaId,
-    status: bool,
-) -> DispatchResult {
-    TestModule::update_class_schema_status(Origin::signed(lead_origin), class_id, schema_id, status)
-}
-
-pub fn next_class_id() -> ClassId {
-    TestModule::next_class_id()
-}
-
-pub fn class_by_id(class_id: ClassId) -> Class<EntityId, ClassId, CuratorGroupId> {
-    TestModule::class_by_id(class_id)
-}
-
-pub fn class_exists(class_id: ClassId) -> bool {
-    ClassById::<Runtime>::contains_key(class_id)
-}
-
-// Vouchers
-
-pub fn update_entity_creation_voucher(
-    lead_origin: u64,
-    class_id: ClassId,
-    controller: EntityController<MemberId>,
-    maximum_entities_count: EntityId,
-) -> DispatchResult {
-    TestModule::update_entity_creation_voucher(
-        Origin::signed(lead_origin),
-        class_id,
-        controller,
-        maximum_entities_count,
-    )
-}
-
-pub fn entity_creation_vouchers(
-    class_id: ClassId,
-    entity_controller: &EntityController<MemberId>,
-) -> EntityCreationVoucher<Runtime> {
-    TestModule::entity_creation_vouchers(class_id, entity_controller)
-}
-
-pub fn entity_creation_voucher_exists(
-    class_id: ClassId,
-    entity_controller: &EntityController<MemberId>,
-) -> bool {
-    EntityCreationVouchers::<Runtime>::contains_key(class_id, entity_controller)
-}
-
-// Entities
-
-pub fn entity_exists(entity_id: EntityId) -> bool {
-    EntityById::<Runtime>::contains_key(entity_id)
-}
-
-pub fn entity_by_id(entity_id: EntityId) -> Entity<ClassId, MemberId, Hashed, EntityId, Nonce> {
-    TestModule::entity_by_id(entity_id)
-}
-
-pub fn next_entity_id() -> EntityId {
-    TestModule::next_entity_id()
-}
-
-pub fn create_entity(
-    origin: u64,
-    class_id: ClassId,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-) -> DispatchResult {
-    TestModule::create_entity(Origin::signed(origin), class_id, actor)
-}
-
-pub fn remove_entity(
-    origin: u64,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-    entity_id: EntityId,
-) -> DispatchResult {
-    TestModule::remove_entity(Origin::signed(origin), actor, entity_id)
-}
-
-pub fn update_entity_permissions(
-    lead_origin: u64,
-    entity_id: EntityId,
-    updated_frozen: Option<bool>,
-    updated_referenceable: Option<bool>,
-) -> DispatchResult {
-    TestModule::update_entity_permissions(
-        Origin::signed(lead_origin),
-        entity_id,
-        updated_frozen,
-        updated_referenceable,
-    )
-}
-
-pub fn add_schema_support_to_entity(
-    origin: u64,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-    entity_id: EntityId,
-    schema_id: SchemaId,
-    new_property_values: BTreeMap<PropertyId, InputPropertyValue<Runtime>>,
-) -> DispatchResult {
-    TestModule::add_schema_support_to_entity(
-        Origin::signed(origin),
-        actor,
-        entity_id,
-        schema_id,
-        new_property_values,
-    )
-}
-
-pub fn update_entity_property_values(
-    origin: u64,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-    entity_id: EntityId,
-    new_property_values: BTreeMap<PropertyId, InputPropertyValue<Runtime>>,
-) -> DispatchResult {
-    TestModule::update_entity_property_values(
-        Origin::signed(origin),
-        actor,
-        entity_id,
-        new_property_values,
-    )
-}
-
-pub fn clear_entity_property_vector(
-    origin: u64,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-    entity_id: EntityId,
-    in_class_schema_property_id: PropertyId,
-) -> DispatchResult {
-    TestModule::clear_entity_property_vector(
-        Origin::signed(origin),
-        actor,
-        entity_id,
-        in_class_schema_property_id,
-    )
-}
-
-pub fn insert_at_entity_property_vector(
-    origin: u64,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-    entity_id: EntityId,
-    in_class_schema_property_id: PropertyId,
-    index_in_property_vector: VecMaxLength,
-    property_value: InputValue<Runtime>,
-    nonce: Nonce,
-) -> DispatchResult {
-    TestModule::insert_at_entity_property_vector(
-        Origin::signed(origin),
-        actor,
-        entity_id,
-        in_class_schema_property_id,
-        index_in_property_vector,
-        property_value,
-        nonce,
-    )
-}
-
-pub fn remove_at_entity_property_vector(
-    origin: u64,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-    entity_id: EntityId,
-    in_class_schema_property_id: PropertyId,
-    index_in_property_vector: VecMaxLength,
-    nonce: Nonce,
-) -> DispatchResult {
-    TestModule::remove_at_entity_property_vector(
-        Origin::signed(origin),
-        actor,
-        entity_id,
-        in_class_schema_property_id,
-        index_in_property_vector,
-        nonce,
-    )
-}
-
-pub fn transfer_entity_ownership(
-    origin: u64,
-    entity_id: EntityId,
-    new_controller: EntityController<MemberId>,
-    new_property_value_references_with_same_owner_flag_set: BTreeMap<
-        PropertyId,
-        InputPropertyValue<Runtime>,
-    >,
-) -> DispatchResult {
-    TestModule::transfer_entity_ownership(
-        Origin::signed(origin),
-        entity_id,
-        new_controller,
-        new_property_value_references_with_same_owner_flag_set,
-    )
-}
-
-// Transaction
-
-pub fn transaction(
-    origin: u64,
-    actor: Actor<CuratorGroupId, CuratorId, MemberId>,
-    operations: Vec<OperationType<Runtime>>,
-) -> DispatchResult {
-    TestModule::transaction(Origin::signed(origin), actor, operations)
-}
-
-pub enum InvalidPropertyType {
-    NameTooLong,
-    NameTooShort,
-    DescriptionTooLong,
-    DescriptionTooShort,
-    TextIsTooLong,
-    TextHashIsTooLong,
-    VecIsTooLong,
-}
-
-impl Property<ClassId> {
-    pub fn default_with_name(name_len: usize) -> Self {
-        let name = generate_text(name_len);
-        let description = generate_text(PropertyDescriptionLengthConstraint::get().min() as usize);
-        Self {
-            name,
-            description,
-            ..Property::<ClassId>::default()
-        }
-    }
-
-    pub fn with_name_and_type(
-        name_len: usize,
-        property_type: PropertyType<ClassId>,
-        required: bool,
-        unique: bool,
-    ) -> Self {
-        let name = generate_text(name_len);
-        let description = generate_text(PropertyDescriptionLengthConstraint::get().min() as usize);
-        Self {
-            name,
-            description,
-            property_type,
-            required,
-            unique,
-            ..Property::<ClassId>::default()
-        }
-    }
-
-    pub fn invalid(invalid_property_type: InvalidPropertyType) -> Property<ClassId> {
-        let mut default_property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().min() as usize,
-        );
-        match invalid_property_type {
-            InvalidPropertyType::NameTooLong => {
-                default_property.name =
-                    generate_text(PropertyNameLengthConstraint::get().max() as usize + 1);
-            }
-            InvalidPropertyType::NameTooShort => {
-                default_property.name =
-                    generate_text(PropertyNameLengthConstraint::get().min() as usize - 1);
-            }
-            InvalidPropertyType::DescriptionTooLong => {
-                default_property.description =
-                    generate_text(PropertyDescriptionLengthConstraint::get().max() as usize + 1);
-            }
-            InvalidPropertyType::DescriptionTooShort => {
-                default_property.description =
-                    generate_text(PropertyDescriptionLengthConstraint::get().min() as usize - 1);
-            }
-            InvalidPropertyType::TextIsTooLong => {
-                default_property.property_type =
-                    PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get() + 1);
-            }
-            InvalidPropertyType::TextHashIsTooLong => {
-                if let Some(hashed_text_max_len) = HashedTextMaxLengthConstraint::get() {
-                    default_property.property_type =
-                        PropertyType::<ClassId>::single_text_hash(Some(hashed_text_max_len + 1));
-                }
-            }
-            InvalidPropertyType::VecIsTooLong => {
-                default_property.property_type = PropertyType::<ClassId>::vec_reference(
-                    FIRST_CLASS_ID,
-                    true,
-                    VecMaxLengthConstraint::get() + 1,
-                );
-            }
-        };
-        default_property
-    }
-}
-
-impl PropertyType<ClassId> {
-    pub fn vec_reference(
-        class_id: ClassId,
-        same_controller: bool,
-        max_length: VecMaxLength,
-    ) -> PropertyType<ClassId> {
-        let vec_type = Type::<ClassId>::Reference(class_id, same_controller);
-        let vec_reference = VecPropertyType::<ClassId>::new(vec_type, max_length);
-        PropertyType::<ClassId>::Vector(vec_reference)
-    }
-
-    pub fn vec_text(
-        text_max_len: TextMaxLength,
-        vec_max_length: VecMaxLength,
-    ) -> PropertyType<ClassId> {
-        let vec_type = Type::<ClassId>::Text(text_max_len);
-        let vec_text = VecPropertyType::<ClassId>::new(vec_type, vec_max_length);
-        PropertyType::<ClassId>::Vector(vec_text)
-    }
-
-    pub fn single_text(text_max_len: TextMaxLength) -> PropertyType<ClassId> {
-        let text_type = Type::<ClassId>::Text(text_max_len);
-        PropertyType::<ClassId>::Single(text_type)
-    }
-
-    pub fn single_text_hash(text_hash_max_len: HashedTextMaxLength) -> PropertyType<ClassId> {
-        let text_type = Type::<ClassId>::Hash(text_hash_max_len);
-        PropertyType::<ClassId>::Single(text_type)
-    }
-
-    pub fn vec_text_hash(
-        text_hash_max_len: HashedTextMaxLength,
-        vec_max_length: VecMaxLength,
-    ) -> PropertyType<ClassId> {
-        let vec_type = Type::<ClassId>::Hash(text_hash_max_len);
-        let vec_text_hash = VecPropertyType::<ClassId>::new(vec_type, vec_max_length);
-        PropertyType::<ClassId>::Vector(vec_text_hash)
-    }
-}
-
-impl<T: Trait> InputPropertyValue<T> {
-    pub fn vec_reference(entity_ids: Vec<EntityId>) -> InputPropertyValue<Runtime> {
-        let vec_value = VecInputValue::<Runtime>::Reference(entity_ids);
-        InputPropertyValue::<Runtime>::Vector(vec_value)
-    }
-
-    pub fn vec_text(texts: Vec<Vec<u8>>) -> InputPropertyValue<Runtime> {
-        let vec_value = VecInputValue::<Runtime>::Text(texts);
-        InputPropertyValue::<Runtime>::Vector(vec_value)
-    }
-
-    pub fn vec_text_to_hash(texts: Vec<Vec<u8>>) -> InputPropertyValue<Runtime> {
-        let vec_value = VecInputValue::<Runtime>::TextToHash(texts);
-        InputPropertyValue::<Runtime>::Vector(vec_value)
-    }
-
-    pub fn single_text(text_len: TextMaxLength) -> InputPropertyValue<Runtime> {
-        let text_value = InputValue::<Runtime>::Text(generate_text(text_len as usize));
-        InputPropertyValue::<Runtime>::Single(text_value)
-    }
-
-    pub fn single_text_to_hash(text_len: TextMaxLength) -> InputPropertyValue<Runtime> {
-        let text_value = InputValue::<Runtime>::TextToHash(generate_text(text_len as usize));
-        InputPropertyValue::<Runtime>::Single(text_value)
-    }
-}
-
-impl From<InboundReferenceCounter> for EntityReferenceCounterSideEffect {
-    fn from(inbound_rc: InboundReferenceCounter) -> Self {
-        Self {
-            total: inbound_rc.total as i32,
-            same_owner: inbound_rc.same_owner as i32,
-        }
-    }
-}
-
-impl EntityReferenceCounterSideEffect {
-    pub fn new(total: i32, same_owner: i32) -> Self {
-        Self { total, same_owner }
-    }
-}
-
-impl PropertyLockingPolicy {
-    pub fn new(is_locked_from_maintainer: bool, is_locked_from_controller: bool) -> Self {
-        Self {
-            is_locked_from_maintainer,
-            is_locked_from_controller,
-        }
-    }
-}
-
-// Assign back to type variables so we can make dispatched calls of these modules later.
-pub type System = system::Module<Runtime>;
-pub type TestModule = Module<Runtime>;
-
-// Recommendation from Parity on testing on_finalize
-// https://substrate.dev/docs/en/next/development/module/tests
-pub fn run_to_block(n: u64) {
-    while System::block_number() < n {
-        <System as OnFinalize<u64>>::on_finalize(System::block_number());
-        <TestModule as OnFinalize<u64>>::on_finalize(System::block_number());
-        System::set_block_number(System::block_number() + 1);
-        <System as OnInitialize<u64>>::on_initialize(System::block_number());
-        <TestModule as OnInitialize<u64>>::on_initialize(System::block_number());
-    }
-}

+ 0 - 141
runtime-modules/content-directory/src/operations.rs

@@ -1,141 +0,0 @@
-use crate::{Error, InputPropertyValue, InputValue, PropertyId, SchemaId, Trait, VecInputValue};
-use codec::{Decode, Encode};
-use sp_std::collections::btree_map::BTreeMap;
-use sp_std::prelude::*;
-
-/// Parametrized entity property value
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
-pub enum ParametrizedPropertyValue<T: Trait> {
-    /// Same fields as normal InputPropertyValue
-    InputPropertyValue(InputPropertyValue<T>),
-
-    /// This is the index of an operation creating an entity in the transaction/batch operations
-    InternalEntityJustAdded(u32), // should really be usize but it doesn't have Encode/Decode support
-
-    /// Vector of mix of Entities already existing and just added in a recent operation
-    InternalEntityVec(Vec<ParameterizedEntity<T>>),
-}
-
-/// Parametrized entity
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
-pub enum ParameterizedEntity<T: Trait> {
-    InternalEntityJustAdded(u32),
-    ExistingEntity(T::EntityId),
-}
-
-/// Parametrized class property value
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
-pub struct ParametrizedClassPropertyValue<T: Trait> {
-    /// Index is into properties vector of class.
-    pub in_class_index: PropertyId,
-
-    /// InputValue of property with index `in_class_index` in a given class.
-    pub value: ParametrizedPropertyValue<T>,
-}
-
-/// Operation, that represents `Entity` creation
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
-pub struct CreateEntityOperation<T: Trait> {
-    /// Class of an Entity
-    pub class_id: T::ClassId,
-}
-
-/// Operation, that represents property values update
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
-pub struct UpdatePropertyValuesOperation<T: Trait> {
-    /// Entity id to perfrom operation
-    pub entity_id: ParameterizedEntity<T>,
-    /// Property values, that should be updated
-    pub new_parametrized_property_values: Vec<ParametrizedClassPropertyValue<T>>,
-}
-
-/// Operation, that represents adding `Entity` `Schema` support
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
-pub struct AddSchemaSupportToEntityOperation<T: Trait> {
-    /// Entity id to perfrom operation
-    pub entity_id: ParameterizedEntity<T>,
-    /// Schema id defined on `Class` level to be added to the `Entity`
-    pub schema_id: SchemaId,
-    /// Property values, that should be added for the underlying schema_id
-    pub parametrized_property_values: Vec<ParametrizedClassPropertyValue<T>>,
-}
-
-/// The type of operation performed
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
-pub enum OperationType<T: Trait> {
-    CreateEntity(CreateEntityOperation<T>),
-    UpdatePropertyValues(UpdatePropertyValuesOperation<T>),
-    AddSchemaSupportToEntity(AddSchemaSupportToEntityOperation<T>),
-}
-
-impl<T: Trait> core::fmt::Debug for OperationType<T> {
-    fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
-        write!(formatter, "OperationType {:?}", self)
-    }
-}
-
-/// Retrieve entity_id of parametrized `Entity`
-pub fn parametrized_entity_to_entity_id<T: Trait>(
-    created_entities: &BTreeMap<usize, T::EntityId>,
-    entity: ParameterizedEntity<T>,
-) -> Result<T::EntityId, Error<T>> {
-    match entity {
-        ParameterizedEntity::ExistingEntity(entity_id) => Ok(entity_id),
-        ParameterizedEntity::InternalEntityJustAdded(op_index_u32) => {
-            let op_index = op_index_u32 as usize;
-            Ok(*created_entities
-                .get(&op_index)
-                .ok_or(Error::<T>::EntityNotCreatedByOperation)?)
-        }
-    }
-}
-
-/// Convert parametrized property values into property values
-pub fn parametrized_property_values_to_property_values<T: Trait>(
-    created_entities: &BTreeMap<usize, T::EntityId>,
-    parametrized_property_values: Vec<ParametrizedClassPropertyValue<T>>,
-) -> Result<BTreeMap<PropertyId, InputPropertyValue<T>>, Error<T>> {
-    let mut class_property_values = BTreeMap::new();
-
-    for parametrized_class_property_value in parametrized_property_values.into_iter() {
-        let property_value = match parametrized_class_property_value.value {
-            ParametrizedPropertyValue::InputPropertyValue(value) => value,
-            ParametrizedPropertyValue::InternalEntityJustAdded(
-                entity_created_in_operation_index,
-            ) => {
-                // Verify that referenced entity was indeed created created
-                let op_index = entity_created_in_operation_index as usize;
-                let entity_id = created_entities
-                    .get(&op_index)
-                    .ok_or(Error::<T>::EntityNotCreatedByOperation)?;
-                InputPropertyValue::Single(InputValue::Reference(*entity_id))
-            }
-            ParametrizedPropertyValue::InternalEntityVec(parametrized_entities) => {
-                let mut entities: Vec<T::EntityId> = vec![];
-
-                for parametrized_entity in parametrized_entities.into_iter() {
-                    match parametrized_entity {
-                        ParameterizedEntity::ExistingEntity(id) => entities.push(id),
-                        ParameterizedEntity::InternalEntityJustAdded(
-                            entity_created_in_operation_index,
-                        ) => {
-                            let op_index = entity_created_in_operation_index as usize;
-                            let entity_id = created_entities
-                                .get(&op_index)
-                                .ok_or(Error::<T>::EntityNotCreatedByOperation)?;
-                            entities.push(*entity_id);
-                        }
-                    }
-                }
-                InputPropertyValue::Vector(VecInputValue::Reference(entities))
-            }
-        };
-
-        class_property_values.insert(
-            parametrized_class_property_value.in_class_index,
-            property_value,
-        );
-    }
-
-    Ok(class_property_values)
-}

+ 0 - 107
runtime-modules/content-directory/src/permissions/class.rs

@@ -1,107 +0,0 @@
-use super::*;
-
-/// Permissions for an instance of a `Class` in the versioned store.
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug, Default)]
-pub struct ClassPermissions<CuratorGroupId: Ord + Default> {
-    /// For this permission, the individual member is allowed to create the entity and become controller.
-    any_member: bool,
-
-    /// Whether to prevent everyone from creating an entity.
-    ///
-    /// This could be useful in order to quickly, and possibly temporarily, block new entity creation, without
-    /// having to tear down `can_create_entities`.
-    entity_creation_blocked: bool,
-
-    /// Whether to prevent everyone from updating entity properties.
-    ///
-    /// This could be useful in order to quickly, and probably temporarily, block any editing of entities,
-    /// rather than for example having to set, and later clear.
-    all_entity_property_values_locked: bool,
-
-    /// Current class maintainer curator groups
-    maintainers: BTreeSet<CuratorGroupId>,
-}
-
-impl<CuratorGroupId: Ord + Default> ClassPermissions<CuratorGroupId> {
-    /// Retieve `all_entity_property_values_locked` status
-    pub fn all_entity_property_values_locked(&self) -> bool {
-        self.all_entity_property_values_locked
-    }
-
-    /// Retieve `any_member` status
-    pub fn any_member_status(&self) -> bool {
-        self.any_member
-    }
-
-    /// Check if given `curator_group_id` is maintainer of current `Class`
-    pub fn is_maintainer(&self, curator_group_id: &CuratorGroupId) -> bool {
-        self.maintainers.contains(curator_group_id)
-    }
-
-    /// Get `Class` maintainers by reference
-    pub fn get_maintainers(&self) -> &BTreeSet<CuratorGroupId> {
-        &self.maintainers
-    }
-
-    /// Get `Class` maintainers by mutable reference
-    pub fn get_maintainers_mut(&mut self) -> &mut BTreeSet<CuratorGroupId> {
-        &mut self.maintainers
-    }
-
-    /// Set `entity_creation_blocked` flag, as provided
-    pub fn set_entity_creation_blocked(&mut self, entity_creation_blocked: bool) {
-        self.entity_creation_blocked = entity_creation_blocked
-    }
-
-    /// Set `all_entity_property_values_locked` flag, as provided
-    pub fn set_all_entity_property_values_locked(
-        &mut self,
-        all_entity_property_values_locked: bool,
-    ) {
-        self.all_entity_property_values_locked = all_entity_property_values_locked
-    }
-
-    /// Set `any_member` flag, as provided
-    pub fn set_any_member_status(&mut self, any_member: bool) {
-        self.any_member = any_member;
-    }
-
-    /// Update `maintainers` set with provided one
-    pub fn set_maintainers(&mut self, maintainers: BTreeSet<CuratorGroupId>) {
-        self.maintainers = maintainers
-    }
-
-    /// Ensure entities creation is not blocked on `Class` level
-    pub fn ensure_entity_creation_not_blocked<T: Trait>(&self) -> Result<(), Error<T>> {
-        ensure!(
-            !self.entity_creation_blocked,
-            Error::<T>::EntitiesCreationBlocked
-        );
-        Ok(())
-    }
-
-    /// Ensure maintainer, associated with given `curator_group_id` is already added to `maintainers` set
-    pub fn ensure_maintainer_exists<T: Trait>(
-        &self,
-        curator_group_id: &CuratorGroupId,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            self.maintainers.contains(curator_group_id),
-            Error::<T>::MaintainerDoesNotExist
-        );
-        Ok(())
-    }
-
-    /// Ensure maintainer, associated with given `curator_group_id` is not yet added to `maintainers` set
-    pub fn ensure_maintainer_does_not_exist<T: Trait>(
-        &self,
-        curator_group_id: &CuratorGroupId,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            !self.maintainers.contains(curator_group_id),
-            Error::<T>::MaintainerAlreadyExists
-        );
-        Ok(())
-    }
-}

+ 0 - 175
runtime-modules/content-directory/src/permissions/entity.rs

@@ -1,175 +0,0 @@
-use super::*;
-
-/// Owner of an `Entity`.
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
-pub enum EntityController<MemberId: Default + PartialEq + Clone + Copy> {
-    Maintainers,
-    Member(MemberId),
-    Lead,
-}
-
-impl<MemberId: Default + PartialEq + Clone + Copy> EntityController<MemberId> {
-    /// Create `EntityController` enum representation, using provided `Actor`
-    pub fn from_actor<T: Trait>(actor: &Actor<T::CuratorGroupId, T::CuratorId, MemberId>) -> Self {
-        match &actor {
-            Actor::Lead => Self::Lead,
-            Actor::Member(member_id) => Self::Member(*member_id),
-            Actor::Curator(_, _) => Self::Maintainers,
-        }
-    }
-}
-
-impl<MemberId: Default + PartialEq + Clone + Copy> Default for EntityController<MemberId> {
-    fn default() -> Self {
-        Self::Lead
-    }
-}
-
-/// Permissions for a given entity.
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
-pub struct EntityPermissions<MemberId: Default + PartialEq + Clone + Copy> {
-    /// Current controller, which is initially set based on who created entity
-    pub controller: EntityController<MemberId>,
-
-    /// Forbid groups to mutate any property value.
-    /// Can be useful to use in concert with some curation censorship policy
-    pub frozen: bool,
-
-    /// Prevent from being referenced by any entity (including self-references).
-    /// Can be useful to use in concert with some curation censorship policy,
-    /// e.g. to block content from being included in some public playlist.
-    pub referenceable: bool,
-}
-
-impl<MemberId: Default + PartialEq + Clone + Copy> Default for EntityPermissions<MemberId> {
-    fn default() -> Self {
-        Self {
-            controller: EntityController::<MemberId>::default(),
-            frozen: false,
-            referenceable: true,
-        }
-    }
-}
-
-impl<MemberId: Default + PartialEq + Clone + Copy> EntityPermissions<MemberId> {
-    /// Create an instance of `EntityPermissions` with `EntityController` equal to provided one
-    pub fn default_with_controller(controller: EntityController<MemberId>) -> Self {
-        Self {
-            controller,
-            ..EntityPermissions::default()
-        }
-    }
-
-    /// Set current `controller` as provided
-    pub fn set_conroller(&mut self, controller: EntityController<MemberId>) {
-        self.controller = controller
-    }
-
-    /// Check if inner `controller` is equal to the provided one
-    pub fn controller_is_equal_to(
-        &self,
-        new_entity_controller: &EntityController<MemberId>,
-    ) -> bool {
-        self.controller == *new_entity_controller
-    }
-
-    /// Set `frozen` flag as provided
-    pub fn set_frozen(&mut self, frozen: bool) {
-        self.frozen = frozen
-    }
-
-    /// Set `referenceable` flag as provided
-    pub fn set_referencable(&mut self, referenceable: bool) {
-        self.referenceable = referenceable;
-    }
-
-    /// Retrieve `referenceable` flag
-    pub fn is_referancable(&self) -> bool {
-        self.referenceable
-    }
-
-    /// Get current `controller` by reference
-    pub fn get_controller(&self) -> &EntityController<MemberId> {
-        &self.controller
-    }
-
-    /// Ensure actor with given `EntityAccessLevel` can remove entity
-    pub fn ensure_group_can_remove_entity<T: Trait>(
-        access_level: EntityAccessLevel,
-    ) -> Result<(), Error<T>> {
-        match access_level {
-            EntityAccessLevel::EntityController => Ok(()),
-            EntityAccessLevel::EntityControllerAndMaintainer => Ok(()),
-            _ => Err(Error::<T>::EntityRemovalAccessDenied),
-        }
-    }
-
-    /// Ensure provided new_entity_controller is not equal to current one
-    pub fn ensure_controllers_are_not_equal<T: Trait>(
-        &self,
-        new_entity_controller: &EntityController<MemberId>,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            !self.controller_is_equal_to(new_entity_controller),
-            Error::<T>::ProvidedEntityControllerIsEqualToTheCurrentOne
-        );
-        Ok(())
-    }
-}
-
-/// Type, derived from dispatchable call, identifies the caller
-#[derive(Encode, Decode, Eq, PartialEq, Ord, PartialOrd, Clone, Copy)]
-pub enum EntityAccessLevel {
-    /// Caller identified as the entity maintainer
-    EntityMaintainer,
-
-    /// Caller identified as the entity controller
-    EntityController,
-
-    /// Caller, that can act as controller and maintainer simultaneously
-    /// (can be useful, when controller and maintainer have features, that do not intersect)
-    EntityControllerAndMaintainer,
-}
-
-impl EntityAccessLevel {
-    /// Derives the `EntityAccessLevel` for the actor, attempting to act.
-    pub fn derive<T: Trait>(
-        account_id: &T::AccountId,
-        entity_permissions: &EntityPermissions<T::MemberId>,
-        class_permissions: &ClassPermissions<T::CuratorGroupId>,
-        actor: &Actor<T::CuratorGroupId, T::CuratorId, T::MemberId>,
-    ) -> Result<Self, Error<T>> {
-        let controller = EntityController::<T::MemberId>::from_actor::<T>(actor);
-        match actor {
-            Actor::Lead if entity_permissions.controller_is_equal_to(&controller) => {
-                // Ensure lead authorization performed succesfully
-                ensure_lead_auth_success::<T>(account_id).map(|_| Self::EntityController)
-            }
-            Actor::Member(member_id) if entity_permissions.controller_is_equal_to(&controller) => {
-                // Ensure member authorization performed succesfully
-                ensure_member_auth_success::<T>(member_id, account_id)
-                    .map(|_| Self::EntityController)
-            }
-            Actor::Curator(curator_group_id, curator_id) => {
-                // Authorize curator, performing all checks to ensure curator can act
-                CuratorGroup::<T>::perform_curator_in_group_auth(
-                    curator_id,
-                    curator_group_id,
-                    account_id,
-                )?;
-                match (
-                    entity_permissions.controller_is_equal_to(&controller),
-                    class_permissions.is_maintainer(curator_group_id),
-                ) {
-                    (true, true) => Ok(Self::EntityControllerAndMaintainer),
-                    (false, true) => Ok(Self::EntityMaintainer),
-                    // Curator cannot be controller, but not maintainer simultaneously
-                    _ => Err(Error::<T>::EntityAccessDenied),
-                }
-            }
-            _ => Err(Error::<T>::EntityAccessDenied),
-        }
-    }
-}

+ 0 - 56
runtime-modules/content-directory/src/permissions/entity_creation_voucher.rs

@@ -1,56 +0,0 @@
-use super::*;
-
-/// A voucher for `Entity` creation
-#[derive(Encode, Decode, Clone, Copy, Debug, PartialEq, Eq)]
-pub struct EntityCreationVoucher<T: Trait> {
-    /// How many are allowed in total
-    pub maximum_entities_count: T::EntityId,
-
-    /// How many have currently been created
-    pub entities_created: T::EntityId,
-}
-
-impl<T: Trait> Default for EntityCreationVoucher<T> {
-    fn default() -> Self {
-        Self {
-            maximum_entities_count: T::EntityId::zero(),
-            entities_created: T::EntityId::zero(),
-        }
-    }
-}
-
-impl<T: Trait> EntityCreationVoucher<T> {
-    /// Create a new instance of `EntityCreationVoucher` with specified limit
-    pub fn new(maximum_entities_count: T::EntityId) -> Self {
-        Self {
-            maximum_entities_count,
-            entities_created: T::EntityId::zero(),
-        }
-    }
-
-    /// Set new `maximum_entities_count` limit
-    pub fn set_maximum_entities_count(&mut self, maximum_entities_count: T::EntityId) {
-        self.maximum_entities_count = maximum_entities_count
-    }
-
-    /// Increase `entities_created` by 1
-    pub fn increment_created_entities_count(&mut self) {
-        self.entities_created += T::EntityId::one();
-    }
-
-    /// Decrease `entities_created` by 1
-    pub fn decrement_created_entities_count(&mut self) {
-        self.entities_created -= T::EntityId::one();
-    }
-
-    /// Check if `entities_created` is less than `maximum_entities_count` limit set to this `EntityCreationVoucher`
-    pub fn limit_not_reached(&self) -> bool {
-        self.entities_created < self.maximum_entities_count
-    }
-
-    /// Ensure voucher limit not reached
-    pub fn ensure_voucher_limit_not_reached(&self) -> Result<(), Error<T>> {
-        ensure!(self.limit_not_reached(), Error::<T>::VoucherLimitReached);
-        Ok(())
-    }
-}

+ 0 - 91
runtime-modules/content-directory/src/schema.rs

@@ -1,91 +0,0 @@
-mod convert;
-mod input;
-mod output;
-mod property;
-
-pub use convert::*;
-pub use input::*;
-pub use output::*;
-pub use property::*;
-
-pub use crate::{permissions::EntityAccessLevel, *};
-pub use codec::{Decode, Encode};
-use core::ops::Deref;
-#[cfg(feature = "std")]
-pub use serde::{Deserialize, Serialize};
-
-/// Type identificator for schema id
-pub type SchemaId = u16;
-
-/// A schema defines what properties describe an entity
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
-pub struct Schema {
-    /// Indices into properties vector for the corresponding class.
-    properties: BTreeSet<PropertyId>,
-    /// If schema can be added to an entity
-    is_active: bool,
-}
-
-impl Default for Schema {
-    fn default() -> Self {
-        Self {
-            properties: BTreeSet::new(),
-            // Default schema status
-            is_active: true,
-        }
-    }
-}
-
-impl Schema {
-    /// Create new schema with provided properties
-    pub fn new(properties: BTreeSet<PropertyId>) -> Self {
-        Self {
-            properties,
-            // Default schema status
-            is_active: true,
-        }
-    }
-
-    /// If `Schema` can be added to an entity
-    pub fn is_active(&self) -> bool {
-        self.is_active
-    }
-
-    /// Ensure schema in `active` status
-    pub fn ensure_is_active<T: Trait>(&self) -> Result<(), Error<T>> {
-        ensure!(self.is_active, Error::<T>::ClassSchemaNotActive);
-        Ok(())
-    }
-
-    /// Get `Schema` `properties` by reference
-    pub fn get_properties(&self) -> &BTreeSet<PropertyId> {
-        &self.properties
-    }
-
-    /// Ensure keys of provided `property_values` are valid indices of current `Schema`
-    pub fn ensure_has_properties<T: Trait>(
-        &self,
-        property_values: &BTreeMap<PropertyId, InputPropertyValue<T>>,
-    ) -> Result<(), Error<T>> {
-        let property_value_indices: BTreeSet<PropertyId> =
-            property_values.keys().cloned().collect();
-
-        ensure!(
-            property_value_indices.is_subset(&self.properties),
-            Error::<T>::SchemaDoesNotContainProvidedPropertyId
-        );
-
-        Ok(())
-    }
-
-    /// Get `Schema` `properties` by mutable reference
-    pub fn get_properties_mut(&mut self) -> &mut BTreeSet<PropertyId> {
-        &mut self.properties
-    }
-
-    /// Set `Schema`'s `is_active` flag as provided
-    pub fn set_status(&mut self, is_active: bool) {
-        self.is_active = is_active;
-    }
-}

+ 0 - 62
runtime-modules/content-directory/src/schema/convert.rs

@@ -1,62 +0,0 @@
-use super::*;
-use sp_runtime::traits::Hash;
-
-impl<T: Trait> From<InputPropertyValue<T>> for StoredPropertyValueOf<T> {
-    fn from(input_property_value: InputPropertyValue<T>) -> Self {
-        match input_property_value {
-            InputPropertyValue::Single(input_value) => {
-                StoredPropertyValue::Single(input_value.into())
-            }
-            InputPropertyValue::Vector(vector_input_value) => {
-                let vec_output_property_value =
-                    VecStoredPropertyValue::new(vector_input_value.into(), T::Nonce::default());
-                StoredPropertyValue::Vector(vec_output_property_value)
-            }
-        }
-    }
-}
-
-impl<T: Trait> From<InputValue<T>> for StoredValue<T::Hash, T::EntityId> {
-    fn from(input_value: InputValue<T>) -> Self {
-        match input_value {
-            InputValue::Bool(value) => StoredValue::Bool(value),
-            InputValue::Uint16(value) => StoredValue::Uint16(value),
-            InputValue::Uint32(value) => StoredValue::Uint32(value),
-            InputValue::Uint64(value) => StoredValue::Uint64(value),
-            InputValue::Int16(value) => StoredValue::Int16(value),
-            InputValue::Int32(value) => StoredValue::Int32(value),
-            InputValue::Int64(value) => StoredValue::Int64(value),
-            InputValue::Text(value) => StoredValue::Text(value),
-
-            InputValue::TextToHash(value) => {
-                let hash_value = value.using_encoded(<T as system::Trait>::Hashing::hash);
-                StoredValue::Hash(hash_value)
-            }
-            InputValue::Reference(value) => StoredValue::Reference(value),
-        }
-    }
-}
-
-impl<T: Trait> From<VecInputValue<T>> for VecStoredValue<T::Hash, T::EntityId> {
-    fn from(vec_input_value: VecInputValue<T>) -> Self {
-        match vec_input_value {
-            VecInputValue::Bool(vec_value) => VecStoredValue::Bool(vec_value),
-            VecInputValue::Uint16(vec_value) => VecStoredValue::Uint16(vec_value),
-            VecInputValue::Uint32(vec_value) => VecStoredValue::Uint32(vec_value),
-            VecInputValue::Uint64(vec_value) => VecStoredValue::Uint64(vec_value),
-            VecInputValue::Int16(vec_value) => VecStoredValue::Int16(vec_value),
-            VecInputValue::Int32(vec_value) => VecStoredValue::Int32(vec_value),
-            VecInputValue::Int64(vec_value) => VecStoredValue::Int64(vec_value),
-            VecInputValue::Text(vec_value) => VecStoredValue::Text(vec_value),
-
-            VecInputValue::TextToHash(vec_value) => {
-                let hash_vec_value: Vec<_> = vec_value
-                    .into_iter()
-                    .map(|value| value.using_encoded(<T as system::Trait>::Hashing::hash))
-                    .collect();
-                VecStoredValue::Hash(hash_vec_value)
-            }
-            VecInputValue::Reference(value) => VecStoredValue::Reference(value),
-        }
-    }
-}

+ 0 - 137
runtime-modules/content-directory/src/schema/input.rs

@@ -1,137 +0,0 @@
-use super::*;
-
-/// Enum, representing either `SingleInputPropertyValue` or `VecInputPropertyValue`
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
-pub enum InputPropertyValue<T: Trait> {
-    Single(InputValue<T>),
-    Vector(VecInputValue<T>),
-}
-
-impl<T: Trait> core::fmt::Debug for InputPropertyValue<T> {
-    fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
-        write!(formatter, "InputPropertyValue {:?}", self)
-    }
-}
-
-impl<T: Trait> InputPropertyValue<T> {
-    pub fn as_single_value(&self) -> Option<&InputValue<T>> {
-        if let InputPropertyValue::Single(single_value) = self {
-            Some(single_value)
-        } else {
-            None
-        }
-    }
-
-    pub fn as_vec_value(&self) -> Option<&VecInputValue<T>> {
-        if let InputPropertyValue::Vector(vec_value) = self {
-            Some(vec_value)
-        } else {
-            None
-        }
-    }
-
-    pub fn as_vec_value_mut(&mut self) -> Option<&mut VecInputValue<T>> {
-        if let InputPropertyValue::Vector(vec_value) = self {
-            Some(vec_value)
-        } else {
-            None
-        }
-    }
-
-    /// Retrieve all involved `entity_id`'s, if current `InputPropertyValue` is reference
-    pub fn get_involved_entities(&self) -> Option<Vec<T::EntityId>> {
-        match self {
-            InputPropertyValue::Single(single_property_value) => {
-                if let Some(entity_id) = single_property_value.get_involved_entity() {
-                    Some(vec![entity_id])
-                } else {
-                    None
-                }
-            }
-            InputPropertyValue::Vector(vector_property_value) => {
-                vector_property_value.get_involved_entities()
-            }
-        }
-    }
-}
-
-impl<T: Trait> Default for InputPropertyValue<T> {
-    fn default() -> Self {
-        InputPropertyValue::Single(InputValue::default())
-    }
-}
-
-/// InputValue enum representation, related to corresponding `SingleInputPropertyValue` structure
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
-pub enum InputValue<T: Trait> {
-    Bool(bool),
-    Uint16(u16),
-    Uint32(u32),
-    Uint64(u64),
-    Int16(i16),
-    Int32(i32),
-    Int64(i64),
-    Text(Vec<u8>),
-    // Used to pass text value, which respective hash should be stored
-    TextToHash(Vec<u8>),
-    Reference(T::EntityId),
-}
-
-impl<T: Trait> core::fmt::Debug for InputValue<T> {
-    fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> sp_std::fmt::Result {
-        write!(formatter, "InputValue {:?}", self)
-    }
-}
-
-impl<T: Trait> Default for InputValue<T> {
-    fn default() -> InputValue<T> {
-        Self::Bool(false)
-    }
-}
-
-impl<T: Trait> InputValue<T> {
-    /// Retrieve involved `entity_id`, if current `InputValue` is reference
-    pub fn get_involved_entity(&self) -> Option<T::EntityId> {
-        if let InputValue::Reference(entity_id) = self {
-            Some(*entity_id)
-        } else {
-            None
-        }
-    }
-}
-
-/// Vector value enum representation
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
-pub enum VecInputValue<T: Trait> {
-    Bool(Vec<bool>),
-    Uint16(Vec<u16>),
-    Uint32(Vec<u32>),
-    Uint64(Vec<u64>),
-    Int16(Vec<i16>),
-    Int32(Vec<i32>),
-    Int64(Vec<i64>),
-    // Used to pass text vec value, which respective hashes should be stored
-    TextToHash(Vec<Vec<u8>>),
-    Text(Vec<Vec<u8>>),
-    Reference(Vec<T::EntityId>),
-}
-
-impl<T: Trait> Default for VecInputValue<T> {
-    fn default() -> Self {
-        Self::Bool(vec![])
-    }
-}
-
-impl<T: Trait> VecInputValue<T> {
-    /// Retrieve all involved `entity_id`'s, if current `VecInputValue` is reference
-    pub fn get_involved_entities(&self) -> Option<Vec<T::EntityId>> {
-        if let Self::Reference(entity_ids) = self {
-            Some(entity_ids.to_owned())
-        } else {
-            None
-        }
-    }
-}

+ 0 - 348
runtime-modules/content-directory/src/schema/output.rs

@@ -1,348 +0,0 @@
-use super::*;
-use sp_runtime::traits::Hash;
-
-/// Enum, representing either `StoredValue` or `VecStoredPropertyValue`
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq)]
-pub enum StoredPropertyValue<
-    Hashed: Default + Clone + Codec,
-    EntityId: Default + Clone + Copy + Codec,
-    Nonce: Default + BaseArithmetic + Clone + Copy,
-> {
-    Single(StoredValue<Hashed, EntityId>),
-    Vector(VecStoredPropertyValue<Hashed, EntityId, Nonce>),
-}
-
-impl<
-        Hashed: Default + Clone + Codec,
-        EntityId: Default + Clone + Copy + Codec,
-        Nonce: Default + BaseArithmetic + Clone + Copy,
-    > StoredPropertyValue<Hashed, EntityId, Nonce>
-{
-    /// Returns single property value by reference if `StoredPropertyValue` is Single
-    pub fn as_single_value(&self) -> Option<&StoredValue<Hashed, EntityId>> {
-        if let StoredPropertyValue::Single(single_value) = self {
-            Some(single_value)
-        } else {
-            None
-        }
-    }
-
-    /// Returns vector property value by reference if `StoredPropertyValue` is Single
-    pub fn as_vec_property_value(
-        &self,
-    ) -> Option<&VecStoredPropertyValue<Hashed, EntityId, Nonce>> {
-        if let StoredPropertyValue::Vector(vec_property_value) = self {
-            Some(vec_property_value)
-        } else {
-            None
-        }
-    }
-
-    /// Returns vector property value by mutable reference if `StoredPropertyValue` is Single
-    pub fn as_vec_property_value_mut(
-        &mut self,
-    ) -> Option<&mut VecStoredPropertyValue<Hashed, EntityId, Nonce>> {
-        if let StoredPropertyValue::Vector(vec_property_value) = self {
-            Some(vec_property_value)
-        } else {
-            None
-        }
-    }
-
-    /// Update `Self` with provided `StoredPropertyValue`
-    pub fn update(&mut self, mut new_value: Self) {
-        if let (Some(vec_property_value), Some(new_vec_property_value)) = (
-            self.as_vec_property_value_mut(),
-            new_value.as_vec_property_value_mut(),
-        ) {
-            new_vec_property_value.nonce = vec_property_value.nonce;
-        }
-        *self = new_value
-    }
-
-    /// Retrieve all involved `entity_id`'s, if current `StoredPropertyValue` is reference
-    pub fn get_involved_entities(&self) -> Option<Vec<EntityId>> {
-        match self {
-            StoredPropertyValue::Single(single_property_value) => {
-                if let Some(entity_id) = single_property_value.get_involved_entity() {
-                    Some(vec![entity_id])
-                } else {
-                    None
-                }
-            }
-            StoredPropertyValue::Vector(vector_property_value) => vector_property_value
-                .get_vec_value_ref()
-                .get_involved_entities(),
-        }
-    }
-
-    /// Compute hash from unique property value and its respective property_id
-    pub fn compute_unique_hash<T: Trait>(&self, property_id: PropertyId) -> T::Hash {
-        match self {
-            StoredPropertyValue::Single(output_value) => {
-                (property_id, output_value).using_encoded(<T as system::Trait>::Hashing::hash)
-            }
-            StoredPropertyValue::Vector(vector_output_value) => {
-                vector_output_value.compute_unique_hash::<T>(property_id)
-            }
-        }
-    }
-}
-
-impl<
-        Hashed: Default + Clone + Codec,
-        EntityId: Default + Clone + Copy + Codec,
-        Nonce: Default + BaseArithmetic + Clone + Copy,
-    > Default for StoredPropertyValue<Hashed, EntityId, Nonce>
-{
-    fn default() -> Self {
-        StoredPropertyValue::Single(StoredValue::default())
-    }
-}
-
-/// StoredValue enum representation, related to corresponding `SingleStoredPropertyValue` structure
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Clone, PartialEq, PartialOrd, Ord, Eq)]
-pub enum StoredValue<Hashed: Default + Clone + Codec, EntityId: Default + Clone + Copy + Codec> {
-    Bool(bool),
-    Uint16(u16),
-    Uint32(u32),
-    Uint64(u64),
-    Int16(i16),
-    Int32(i32),
-    Int64(i64),
-    Text(Vec<u8>),
-    Hash(Hashed),
-    Reference(EntityId),
-}
-
-impl<Hashed: Default + Clone + Codec, EntityId: Default + Clone + Copy + Codec> Default
-    for StoredValue<Hashed, EntityId>
-{
-    fn default() -> StoredValue<Hashed, EntityId> {
-        Self::Bool(false)
-    }
-}
-
-impl<Hashed: Default + Clone + Codec, EntityId: Default + Clone + Copy + Codec>
-    StoredValue<Hashed, EntityId>
-{
-    /// Retrieve involved `entity_id`, if current `StoredValue` is reference
-    pub fn get_involved_entity(&self) -> Option<EntityId> {
-        if let StoredValue::Reference(entity_id) = self {
-            Some(*entity_id)
-        } else {
-            None
-        }
-    }
-}
-
-/// Consists of `VecStoredPropertyValue` enum representation and `nonce`, used to avoid vector data race update conditions
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Default, Clone, PartialEq, Eq)]
-pub struct VecStoredPropertyValue<
-    Hashed: Default + Clone + Codec,
-    EntityId: Default + Clone + Copy + Codec,
-    Nonce: Default + BaseArithmetic + Clone + Copy,
-> {
-    vec_value: VecStoredValue<Hashed, EntityId>,
-    nonce: Nonce,
-}
-
-impl<
-        Hashed: Default + Clone + Codec,
-        EntityId: Default + Clone + Copy + Codec,
-        Nonce: Default + BaseArithmetic + Clone + Copy,
-    > VecStoredPropertyValue<Hashed, EntityId, Nonce>
-{
-    /// Compute hash from unique vec property value and its respective property_id
-    pub fn compute_unique_hash<T: Trait>(&self, property_id: PropertyId) -> T::Hash {
-        // Do not hash nonce
-        (property_id, &self.vec_value).using_encoded(<T as system::Trait>::Hashing::hash)
-    }
-
-    /// Increase nonce by 1
-    fn increment_nonce(&mut self) -> Nonce {
-        self.nonce += Nonce::one();
-        self.nonce
-    }
-
-    /// Create new `VecStoredPropertyValue` from `vec value` provided and `nonce`
-    pub fn new(vec_value: VecStoredValue<Hashed, EntityId>, nonce: Nonce) -> Self {
-        Self { vec_value, nonce }
-    }
-
-    /// Retrieve `VecStoredValue`
-    pub fn get_vec_value(self) -> VecStoredValue<Hashed, EntityId> {
-        self.vec_value
-    }
-
-    /// Retrieve `VecStoredValue` by reference
-    pub fn get_vec_value_ref(&self) -> &VecStoredValue<Hashed, EntityId> {
-        &self.vec_value
-    }
-
-    fn len(&self) -> usize {
-        match &self.vec_value {
-            VecStoredValue::Bool(vec) => vec.len(),
-            VecStoredValue::Uint16(vec) => vec.len(),
-            VecStoredValue::Uint32(vec) => vec.len(),
-            VecStoredValue::Uint64(vec) => vec.len(),
-            VecStoredValue::Int16(vec) => vec.len(),
-            VecStoredValue::Int32(vec) => vec.len(),
-            VecStoredValue::Int64(vec) => vec.len(),
-            VecStoredValue::Text(vec) => vec.len(),
-            VecStoredValue::Hash(vec) => vec.len(),
-            VecStoredValue::Reference(vec) => vec.len(),
-        }
-    }
-
-    /// Clear current `vec_value`
-    pub fn clear(&mut self) {
-        match &mut self.vec_value {
-            VecStoredValue::Bool(vec) => *vec = vec![],
-            VecStoredValue::Uint16(vec) => *vec = vec![],
-            VecStoredValue::Uint32(vec) => *vec = vec![],
-            VecStoredValue::Uint64(vec) => *vec = vec![],
-            VecStoredValue::Int16(vec) => *vec = vec![],
-            VecStoredValue::Int32(vec) => *vec = vec![],
-            VecStoredValue::Int64(vec) => *vec = vec![],
-            VecStoredValue::Text(vec) => *vec = vec![],
-            VecStoredValue::Hash(vec) => *vec = vec![],
-            VecStoredValue::Reference(vec) => *vec = vec![],
-        }
-    }
-
-    /// Perform removal at given `index_in_property_vec`, increment `nonce`
-    pub fn remove_at(&mut self, index_in_property_vec: VecMaxLength) {
-        fn remove_at_checked<T>(vec: &mut Vec<T>, index_in_property_vec: VecMaxLength) {
-            if (index_in_property_vec as usize) < vec.len() {
-                vec.remove(index_in_property_vec as usize);
-            }
-        }
-
-        match &mut self.vec_value {
-            VecStoredValue::Bool(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Uint16(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Uint32(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Uint64(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Int16(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Int32(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Int64(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Text(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Hash(vec) => remove_at_checked(vec, index_in_property_vec),
-            VecStoredValue::Reference(vec) => remove_at_checked(vec, index_in_property_vec),
-        }
-
-        self.increment_nonce();
-    }
-
-    /// Insert provided `StoredValue` at given `index_in_property_vec`, increment `nonce`
-    pub fn insert_at(
-        &mut self,
-        index_in_property_vec: VecMaxLength,
-        single_value: StoredValue<Hashed, EntityId>,
-    ) {
-        fn insert_at<T>(vec: &mut Vec<T>, index_in_property_vec: VecMaxLength, value: T) {
-            if (index_in_property_vec as usize) < vec.len() {
-                vec.insert(index_in_property_vec as usize, value);
-            }
-        }
-
-        match (&mut self.vec_value, single_value) {
-            (VecStoredValue::Bool(vec), StoredValue::Bool(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-            (VecStoredValue::Uint16(vec), StoredValue::Uint16(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-            (VecStoredValue::Uint32(vec), StoredValue::Uint32(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-            (VecStoredValue::Uint64(vec), StoredValue::Uint64(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-            (VecStoredValue::Int16(vec), StoredValue::Int16(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-            (VecStoredValue::Int32(vec), StoredValue::Int32(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-            (VecStoredValue::Int64(vec), StoredValue::Int64(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-
-            // Match by move, when https://github.com/rust-lang/rust/issues/68354 stableize
-            (VecStoredValue::Text(vec), StoredValue::Text(ref value)) => {
-                insert_at(vec, index_in_property_vec, value.to_owned())
-            }
-            (VecStoredValue::Reference(vec), StoredValue::Reference(value)) => {
-                insert_at(vec, index_in_property_vec, value)
-            }
-            _ => return,
-        }
-
-        self.increment_nonce();
-    }
-
-    /// Ensure `VecStoredPropertyValue` nonce is equal to the provided one.
-    /// Used to to avoid possible data races, when performing vector specific operations
-    pub fn ensure_nonce_equality<T: Trait>(&self, new_nonce: Nonce) -> Result<(), Error<T>> {
-        ensure!(
-            self.nonce == new_nonce,
-            Error::<T>::PropertyValueVecNoncesDoesNotMatch
-        );
-        Ok(())
-    }
-
-    /// Ensure, provided `index_in_property_vec` is valid index of `VecStoredValue`
-    pub fn ensure_index_in_property_vector_is_valid<T: Trait>(
-        &self,
-        index_in_property_vec: VecMaxLength,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            (index_in_property_vec as usize) <= self.len(),
-            Error::<T>::EntityPropertyValueVectorIndexIsOutOfRange
-        );
-
-        Ok(())
-    }
-}
-
-/// Vector value enum representation, related to corresponding `VecStoredPropertyValue` structure
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Clone, PartialEq, Eq, PartialOrd, Ord)]
-pub enum VecStoredValue<Hashed: Default + Clone + Codec, EntityId: Default + Clone + Copy + Codec> {
-    Bool(Vec<bool>),
-    Uint16(Vec<u16>),
-    Uint32(Vec<u32>),
-    Uint64(Vec<u64>),
-    Int16(Vec<i16>),
-    Int32(Vec<i32>),
-    Int64(Vec<i64>),
-    Hash(Vec<Hashed>),
-    Text(Vec<Vec<u8>>),
-    Reference(Vec<EntityId>),
-}
-
-impl<Hashed: Default + Clone + Codec, EntityId: Default + Clone + Copy + Codec> Default
-    for VecStoredValue<Hashed, EntityId>
-{
-    fn default() -> Self {
-        Self::Bool(vec![])
-    }
-}
-
-impl<Hashed: Default + Clone + Codec, EntityId: Default + Clone + Copy + Codec>
-    VecStoredValue<Hashed, EntityId>
-{
-    /// Retrieve all involved `entity_id`'s, if current `VecStoredValue` is reference
-    pub fn get_involved_entities(&self) -> Option<Vec<EntityId>> {
-        if let Self::Reference(entity_ids) = self {
-            Some(entity_ids.to_owned())
-        } else {
-            None
-        }
-    }
-}

+ 0 - 634
runtime-modules/content-directory/src/schema/property.rs

@@ -1,634 +0,0 @@
-use super::*;
-
-/// Type identificator for property id
-pub type PropertyId = u16;
-
-/// Type representing max length of vector property type
-pub type VecMaxLength = u16;
-
-/// Type representing max length of text property type
-pub type TextMaxLength = u16;
-
-/// Type representing optional max length of text property type, that will be subsequently hashed
-pub type HashedTextMaxLength = Option<u16>;
-
-/// Used to force property values to only reference entities, owned by the same controller
-type SameController = bool;
-
-/// Locking policy, representing `Property` locking status for both controller and maintainer
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Default, Decode, Clone, Copy, PartialEq, Eq, Debug)]
-pub struct PropertyLockingPolicy {
-    /// If property is locked from maintainer
-    pub is_locked_from_maintainer: bool,
-    /// If property is locked from controller
-    pub is_locked_from_controller: bool,
-}
-
-/// Enum, used for `PropertyType` representation
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, Debug)]
-pub enum Type<ClassId: Default + BaseArithmetic + Clone + Copy> {
-    Bool,
-    Uint16,
-    Uint32,
-    Uint64,
-    Int16,
-    Int32,
-    Int64,
-    /// Max length of text item.
-    Text(TextMaxLength),
-    Hash(HashedTextMaxLength),
-    /// Can reference only specific class id entities
-    Reference(ClassId, SameController),
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> Default for Type<ClassId> {
-    fn default() -> Self {
-        Self::Bool
-    }
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> Type<ClassId> {
-    /// Ensure `Type` specific `TextMaxLengthConstraint` or `HashedTextMaxLengthConstraint` satisfied
-    pub fn ensure_property_type_size_is_valid<T: Trait>(&self) -> Result<(), Error<T>> {
-        if let Type::Text(text_max_len) = self {
-            ensure!(
-                *text_max_len <= T::TextMaxLengthConstraint::get(),
-                Error::<T>::TextPropertyTooLong
-            );
-        }
-
-        if let Type::Hash(hashed_text_max_len) = self {
-            ensure!(
-                *hashed_text_max_len <= T::HashedTextMaxLengthConstraint::get(),
-                Error::<T>::HashedTextPropertyTooLong
-            );
-        }
-
-        Ok(())
-    }
-}
-
-/// Vector property type representation
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Clone, Default, Copy, PartialEq, Eq, Debug)]
-pub struct VecPropertyType<ClassId: Default + BaseArithmetic + Clone + Copy> {
-    vec_type: Type<ClassId>,
-    /// Max length of vector, corresponding to a given type
-    max_length: VecMaxLength,
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> VecPropertyType<ClassId> {
-    /// Create new `VecPropertyType` from provided `type` and `max_length`
-    pub fn new(vec_type: Type<ClassId>, max_length: VecMaxLength) -> Self {
-        Self {
-            vec_type,
-            max_length,
-        }
-    }
-
-    /// Ensure `Type` specific `TextMaxLengthConstraint` & `VecMaxLengthConstraint` satisfied
-    fn ensure_property_type_size_is_valid<T: Trait>(&self) -> Result<(), Error<T>> {
-        // Ensure Type specific TextMaxLengthConstraint or HashedTextMaxLengthConstraint satisfied
-        self.vec_type.ensure_property_type_size_is_valid()?;
-
-        ensure!(
-            self.max_length <= T::VecMaxLengthConstraint::get(),
-            Error::<T>::VecPropertyTooLong
-        );
-        Ok(())
-    }
-
-    fn get_vec_type(&self) -> &Type<ClassId> {
-        &self.vec_type
-    }
-
-    fn get_max_len(&self) -> VecMaxLength {
-        self.max_length
-    }
-}
-
-/// Enum, representing either `Type` or `VecPropertyType`
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, Debug)]
-pub enum PropertyType<ClassId: Default + BaseArithmetic + Clone + Copy> {
-    Single(Type<ClassId>),
-    Vector(VecPropertyType<ClassId>),
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> Default for PropertyType<ClassId> {
-    fn default() -> Self {
-        Self::Single(Type::default())
-    }
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> PropertyType<ClassId> {
-    fn as_single_value_type(&self) -> Option<&Type<ClassId>> {
-        if let PropertyType::Single(single_value_property_type) = self {
-            Some(single_value_property_type)
-        } else {
-            None
-        }
-    }
-
-    pub fn as_vec_type(&self) -> Option<&VecPropertyType<ClassId>> {
-        if let PropertyType::Vector(vec_value_property_type) = self {
-            Some(vec_value_property_type)
-        } else {
-            None
-        }
-    }
-
-    /// Get inner type of `PropertyType` enum wrapper
-    pub fn get_inner_type(&self) -> &Type<ClassId> {
-        match self {
-            PropertyType::Single(single_property_type) => single_property_type,
-            PropertyType::Vector(vec_property_type) => vec_property_type.get_vec_type(),
-        }
-    }
-
-    /// Retrives `same_controller` flag.
-    /// Always returns false if `Type` is not a reference,
-    pub fn same_controller_status(&self) -> SameController {
-        if let Type::Reference(_, same_controller) = self.get_inner_type() {
-            *same_controller
-        } else {
-            false
-        }
-    }
-}
-
-/// `Property` representation, related to a given `Class`
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
-#[derive(Encode, Decode, Clone, Debug, PartialEq, Eq)]
-pub struct Property<ClassId: Default + BaseArithmetic + Clone + Copy> {
-    /// The type of `Property`
-    pub property_type: PropertyType<ClassId>,
-    /// If property value can be skipped, when adding entity schema support
-    pub required: bool,
-    /// Used to enforce uniquness of a property across all entities that have this property
-    pub unique: bool,
-    /// Property name
-    pub name: Vec<u8>,
-    /// Property description
-    pub description: Vec<u8>,
-    /// Locking policy, representing `Property` locking status for both controller and maintainer
-    pub locking_policy: PropertyLockingPolicy,
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> Default for Property<ClassId> {
-    fn default() -> Self {
-        Self {
-            property_type: PropertyType::<ClassId>::default(),
-            required: false,
-            unique: false,
-            name: vec![],
-            description: vec![],
-            locking_policy: PropertyLockingPolicy::default(),
-        }
-    }
-}
-
-impl<ClassId: Default + BaseArithmetic + Clone + Copy> Property<ClassId> {
-    /// Check if property is locked from actor with provided `EntityAccessLevel`
-    pub fn is_locked_from(&self, access_level: EntityAccessLevel) -> bool {
-        let is_locked_from_controller = self.locking_policy.is_locked_from_controller;
-        let is_locked_from_maintainer = self.locking_policy.is_locked_from_maintainer;
-        match access_level {
-            EntityAccessLevel::EntityControllerAndMaintainer => {
-                is_locked_from_controller && is_locked_from_maintainer
-            }
-            EntityAccessLevel::EntityController => is_locked_from_controller,
-            EntityAccessLevel::EntityMaintainer => is_locked_from_maintainer,
-        }
-    }
-
-    /// Ensure `Property` is unlocked from `Actor` with given `EntityAccessLevel`
-    pub fn ensure_unlocked_from<T: Trait>(
-        &self,
-        access_level: EntityAccessLevel,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            !self.is_locked_from(access_level),
-            Error::<T>::ClassPropertyTypeLockedForGivenActor
-        );
-        Ok(())
-    }
-
-    /// Validate new `InputPropertyValue` against the type of this `Property`
-    /// and check any additional constraints
-    pub fn ensure_property_value_to_update_is_valid<T: Trait>(
-        property: &Property<T::ClassId>,
-        value: &InputPropertyValue<T>,
-        current_entity_controller: &EntityController<T::MemberId>,
-    ) -> Result<(), Error<T>> {
-        // Ensure provided InputPropertyValue matches its Type
-        property.ensure_property_value_matches_its_type(value)?;
-
-        // Perform all required checks to ensure provided InputPropertyValue is valid, when current PropertyType is Reference
-        Self::ensure_property_value_is_valid_reference(
-            &property,
-            value,
-            current_entity_controller,
-        )?;
-
-        // Ensure text property does not exceed its max length
-        property.validate_max_len_if_text_property(value)?;
-
-        // Ensure vector property does not exceed its max length
-        property.validate_max_len_if_vec_property(value)?;
-        Ok(())
-    }
-
-    /// Ensure property vector length after value inserted is valid
-    fn validate_property_vector_length_after_value_insert<T: Trait, V>(
-        vec: &[V],
-        max_len: VecMaxLength,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            vec.len() < max_len as usize,
-            Error::<T>::EntityPropertyValueVectorIsTooLong
-        );
-        Ok(())
-    }
-
-    /// Ensure `SingleInputPropertyValue` type is equal to the `VecInputPropertyValue` type
-    /// and check all constraints
-    pub fn ensure_property_value_can_be_inserted_at_property_vector<T: Trait>(
-        property: &Property<T::ClassId>,
-        single_value: &InputValue<T>,
-        vec_value: &VecStoredPropertyValue<T::Hash, T::EntityId, T::Nonce>,
-        index_in_property_vec: VecMaxLength,
-        current_entity_controller: &EntityController<T::MemberId>,
-    ) -> Result<(), Error<T>> {
-        // Ensure, provided index_in_property_vec is valid index of VecInputValue
-        vec_value.ensure_index_in_property_vector_is_valid(index_in_property_vec)?;
-
-        let property_type_vec = property
-            .property_type
-            .as_vec_type()
-            .ok_or(Error::<T>::PropertyValueTypeDoesNotMatchInternalVectorType)?;
-
-        let max_vec_len = property_type_vec.get_max_len();
-
-        match (
-            single_value,
-            vec_value.get_vec_value_ref(),
-            property_type_vec.get_vec_type(),
-        ) {
-            // Single values
-            (InputValue::Bool(_), VecStoredValue::Bool(vec), Type::Bool) => {
-                Self::validate_property_vector_length_after_value_insert::<T, bool>(
-                    vec,
-                    max_vec_len,
-                )
-            }
-            (InputValue::Uint16(_), VecStoredValue::Uint16(vec), Type::Uint16) => {
-                Self::validate_property_vector_length_after_value_insert::<T, u16>(vec, max_vec_len)
-            }
-            (InputValue::Uint32(_), VecStoredValue::Uint32(vec), Type::Uint32) => {
-                Self::validate_property_vector_length_after_value_insert::<T, u32>(vec, max_vec_len)
-            }
-            (InputValue::Uint64(_), VecStoredValue::Uint64(vec), Type::Uint64) => {
-                Self::validate_property_vector_length_after_value_insert::<T, u64>(vec, max_vec_len)
-            }
-            (InputValue::Int16(_), VecStoredValue::Int16(vec), Type::Int16) => {
-                Self::validate_property_vector_length_after_value_insert::<T, i16>(vec, max_vec_len)
-            }
-            (InputValue::Int32(_), VecStoredValue::Int32(vec), Type::Int32) => {
-                Self::validate_property_vector_length_after_value_insert::<T, i32>(vec, max_vec_len)
-            }
-            (InputValue::Int64(_), VecStoredValue::Int64(vec), Type::Int64) => {
-                Self::validate_property_vector_length_after_value_insert::<T, i64>(vec, max_vec_len)
-            }
-            (InputValue::Text(text_item), VecStoredValue::Text(vec), Type::Text(text_max_len)) => {
-                Self::validate_max_len_of_text(text_item, *text_max_len)?;
-                Self::validate_property_vector_length_after_value_insert::<T, Vec<u8>>(
-                    vec,
-                    max_vec_len,
-                )
-            }
-            (
-                InputValue::TextToHash(text_item),
-                VecStoredValue::Hash(vec),
-                Type::Hash(text_max_len),
-            ) => {
-                if let Some(text_max_len) = text_max_len {
-                    Self::validate_max_len_of_text_to_be_hashed(text_item, *text_max_len)?;
-                }
-                Self::validate_property_vector_length_after_value_insert::<T, T::Hash>(
-                    vec,
-                    max_vec_len,
-                )
-            }
-            (
-                InputValue::Reference(entity_id),
-                VecStoredValue::Reference(vec),
-                Type::Reference(class_id, same_controller_status),
-            ) => {
-                // Ensure class_id of Entity under provided entity_id references Entity,
-                // which class_id is equal to class_id, declared in corresponding PropertyType
-                // Retrieve corresponding Entity
-                let entity =
-                    Self::ensure_referenced_entity_match_its_class::<T>(*entity_id, *class_id)?;
-                // Ensure Entity can be referenced.
-                Self::ensure_entity_can_be_referenced(
-                    entity,
-                    *same_controller_status,
-                    current_entity_controller,
-                )?;
-                Self::validate_property_vector_length_after_value_insert::<T, T::EntityId>(
-                    vec,
-                    max_vec_len,
-                )
-            }
-            _ => Err(Error::<T>::PropertyValueTypeDoesNotMatchInternalVectorType),
-        }
-    }
-
-    /// Ensure text property does not exceed its max len
-    pub fn validate_max_len_if_text_property<T: Trait>(
-        &self,
-        value: &InputPropertyValue<T>,
-    ) -> Result<(), Error<T>> {
-        let single_value = value.as_single_value();
-
-        match (single_value, &self.property_type.as_single_value_type()) {
-            (Some(InputValue::Text(text)), Some(Type::Text(text_max_len))) => {
-                Self::validate_max_len_of_text(text, *text_max_len)
-            }
-            (
-                Some(InputValue::TextToHash(text_to_be_hashed)),
-                Some(Type::Hash(Some(text_to_be_hashed_max_len))),
-            ) => Self::validate_max_len_of_text_to_be_hashed(
-                text_to_be_hashed,
-                *text_to_be_hashed_max_len,
-            ),
-            _ => Ok(()),
-        }
-    }
-
-    fn validate_max_len_of_text<T: Trait>(
-        text: &[u8],
-        text_max_len: TextMaxLength,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            text.len() <= text_max_len as usize,
-            Error::<T>::TextPropertyTooLong
-        );
-        Ok(())
-    }
-
-    fn validate_max_len_of_text_to_be_hashed<T: Trait>(
-        text_to_be_hashed: &[u8],
-        text_to_be_hashed_max_len: u16,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            text_to_be_hashed.len() <= text_to_be_hashed_max_len as usize,
-            Error::<T>::HashedTextPropertyTooLong
-        );
-        Ok(())
-    }
-
-    fn validate_vec_len<V, T: Trait>(vec: &[V], max_len: VecMaxLength) -> Result<(), Error<T>> {
-        ensure!(
-            vec.len() <= max_len as usize,
-            Error::<T>::VecPropertyTooLong
-        );
-        Ok(())
-    }
-
-    /// Ensure `VecInputValue` does not exceed its max len
-    pub fn validate_max_len_if_vec_property<T: Trait>(
-        &self,
-        value: &InputPropertyValue<T>,
-    ) -> Result<(), Error<T>> {
-        let (vec_value, vec_property_type) = if let (Some(vec_value), Some(vec_property_type)) =
-            (value.as_vec_value(), self.property_type.as_vec_type())
-        {
-            (vec_value, vec_property_type)
-        } else {
-            return Ok(());
-        };
-
-        let max_len = vec_property_type.get_max_len();
-
-        match vec_value {
-            VecInputValue::Bool(vec) => Self::validate_vec_len(vec, max_len),
-            VecInputValue::Uint16(vec) => Self::validate_vec_len(vec, max_len),
-            VecInputValue::Uint32(vec) => Self::validate_vec_len(vec, max_len),
-            VecInputValue::Uint64(vec) => Self::validate_vec_len(vec, max_len),
-            VecInputValue::Int16(vec) => Self::validate_vec_len(vec, max_len),
-            VecInputValue::Int32(vec) => Self::validate_vec_len(vec, max_len),
-            VecInputValue::Int64(vec) => Self::validate_vec_len(vec, max_len),
-            VecInputValue::TextToHash(vec) => {
-                Self::validate_vec_len(vec, max_len)?;
-                if let Type::Hash(Some(text_to_be_hashed_max_len)) =
-                    vec_property_type.get_vec_type()
-                {
-                    for text_to_be_hashed_item in vec.iter() {
-                        Self::validate_max_len_of_text_to_be_hashed(
-                            text_to_be_hashed_item,
-                            *text_to_be_hashed_max_len,
-                        )?;
-                    }
-                }
-                Ok(())
-            }
-            VecInputValue::Text(vec) => {
-                Self::validate_vec_len(vec, max_len)?;
-                if let Type::Text(text_max_len) = vec_property_type.get_vec_type() {
-                    for text_item in vec.iter() {
-                        Self::validate_max_len_of_text(text_item, *text_max_len)?;
-                    }
-                }
-                Ok(())
-            }
-            VecInputValue::Reference(vec) => Self::validate_vec_len(vec, max_len),
-        }
-    }
-
-    /// Ensure provided `InputPropertyValue` matches its `Type`
-    pub fn ensure_property_value_matches_its_type<T: Trait>(
-        &self,
-        value: &InputPropertyValue<T>,
-    ) -> Result<(), Error<T>> {
-        ensure!(
-            self.does_prop_value_match_type(value),
-            Error::<T>::PropertyValueDoNotMatchType
-        );
-        Ok(())
-    }
-
-    /// Check if provided `InputPropertyValue` matches its `Type`
-    pub fn does_prop_value_match_type<T: Trait>(&self, value: &InputPropertyValue<T>) -> bool {
-        // A non required property can be updated to Bool(false):
-        if !self.required && *value == InputPropertyValue::default() {
-            return true;
-        }
-        match (value, &self.property_type) {
-            (
-                InputPropertyValue::Single(single_property_value),
-                PropertyType::Single(ref single_property_type),
-            ) => matches!((single_property_value, single_property_type.deref()),
-                (InputValue::Bool(_), Type::Bool)
-                | (InputValue::Uint16(_), Type::Uint16)
-                | (InputValue::Uint32(_), Type::Uint32)
-                | (InputValue::Uint64(_), Type::Uint64)
-                | (InputValue::Int16(_), Type::Int16)
-                | (InputValue::Int32(_), Type::Int32)
-                | (InputValue::Int64(_), Type::Int64)
-                | (InputValue::Text(_), Type::Text(_))
-                | (InputValue::TextToHash(_), Type::Hash(_))
-                | (InputValue::Reference(_), Type::Reference(_, _))),
-            (
-                InputPropertyValue::Vector(vec_value),
-                PropertyType::Vector(ref vec_property_type),
-            ) => matches!((vec_value, vec_property_type.get_vec_type()),
-                (VecInputValue::Bool(_), Type::Bool)
-                | (VecInputValue::Uint16(_), Type::Uint16)
-                | (VecInputValue::Uint32(_), Type::Uint32)
-                | (VecInputValue::Uint64(_), Type::Uint64)
-                | (VecInputValue::Int16(_), Type::Int16)
-                | (VecInputValue::Int32(_), Type::Int32)
-                | (VecInputValue::Int64(_), Type::Int64)
-                | (VecInputValue::Text(_), Type::Text(_))
-                | (VecInputValue::TextToHash(_), Type::Hash(_))
-                | (VecInputValue::Reference(_), Type::Reference(_, _))),
-            _ => false,
-        }
-    }
-
-    /// Perform all required checks to ensure provided `InputPropertyValue` is valid,
-    /// when current `PropertyType` is `Reference`
-    pub fn ensure_property_value_is_valid_reference<T: Trait>(
-        property: &Property<T::ClassId>,
-        value: &InputPropertyValue<T>,
-        current_entity_controller: &EntityController<T::MemberId>,
-    ) -> Result<(), Error<T>> {
-        match (value, &property.property_type) {
-            (
-                InputPropertyValue::Single(single_property_value),
-                PropertyType::Single(single_property_type),
-            ) => {
-                if let (
-                    InputValue::Reference(entity_id),
-                    Type::Reference(class_id, same_controller_status),
-                ) = (single_property_value, single_property_type.deref())
-                {
-                    // Ensure class_id of Entity under provided entity_id references Entity,
-                    // which class_id is equal to class_id, declared in corresponding PropertyType
-                    // Retrieve corresponding Entity
-                    let entity =
-                        Self::ensure_referenced_entity_match_its_class::<T>(*entity_id, *class_id)?;
-
-                    // Ensure Entity can be referenced.
-                    Self::ensure_entity_can_be_referenced(
-                        entity,
-                        *same_controller_status,
-                        current_entity_controller,
-                    )?;
-                }
-            }
-            (InputPropertyValue::Vector(vec_value), PropertyType::Vector(vec_property_type)) => {
-                if let (
-                    VecInputValue::Reference(entity_ids),
-                    Type::Reference(class_id, same_controller_status),
-                ) = (vec_value, vec_property_type.get_vec_type())
-                {
-                    for entity_id in entity_ids.iter() {
-                        // Ensure class_id of Entity under provided entity_id references Entity,
-                        // which class_id is equal to class_id, declared in corresponding PropertyType
-                        // Retrieve corresponding Entity
-                        let entity = Self::ensure_referenced_entity_match_its_class::<T>(
-                            *entity_id, *class_id,
-                        )?;
-
-                        // Ensure Entity can be referenced.
-                        Self::ensure_entity_can_be_referenced(
-                            entity,
-                            *same_controller_status,
-                            current_entity_controller,
-                        )?;
-                    }
-                }
-            }
-            _ => (),
-        }
-        Ok(())
-    }
-
-    /// Ensure `class_id` of `Entity` under provided `entity_id` references `Entity`, which `class_id` is equal to `class_id`,
-    /// declared in corresponding `PropertyType`.
-    /// Returns  corresponding `Entity` instance
-    pub fn ensure_referenced_entity_match_its_class<T: Trait>(
-        entity_id: T::EntityId,
-        class_id: T::ClassId,
-    ) -> Result<EntityOf<T>, Error<T>> {
-        // Ensure Entity under given id exists
-        let entity = Module::<T>::ensure_known_entity_id(entity_id)?;
-
-        ensure!(
-            class_id == entity.get_class_id(),
-            Error::<T>::ReferencedEntityDoesNotMatchItsClass
-        );
-        Ok(entity)
-    }
-
-    /// Ensure `Entity` can be referenced.
-    pub fn ensure_entity_can_be_referenced<T: Trait>(
-        entity: EntityOf<T>,
-        same_controller_status: bool,
-        current_entity_controller: &EntityController<T::MemberId>,
-    ) -> Result<(), Error<T>> {
-        let entity_permissions = entity.get_permissions();
-
-        // Ensure Entity is referencable
-        ensure!(
-            entity_permissions.is_referancable(),
-            Error::<T>::EntityCanNotBeReferenced
-        );
-
-        if same_controller_status {
-            // Ensure Entity controller is equal to the provided one
-            ensure!(
-                entity_permissions.controller_is_equal_to(current_entity_controller),
-                Error::<T>::SameControllerConstraintViolation
-            );
-        }
-        Ok(())
-    }
-
-    /// Ensure `PropertyNameLengthConstraint` satisfied
-    pub fn ensure_name_is_valid<T: Trait>(&self) -> Result<(), Error<T>> {
-        T::PropertyNameLengthConstraint::get().ensure_valid(
-            self.name.len(),
-            Error::<T>::PropertyNameTooShort,
-            Error::<T>::PropertyNameTooLong,
-        )
-    }
-
-    /// Ensure `PropertyDescriptionLengthConstraint` satisfied
-    pub fn ensure_description_is_valid<T: Trait>(&self) -> Result<(), Error<T>> {
-        T::PropertyDescriptionLengthConstraint::get().ensure_valid(
-            self.description.len(),
-            Error::<T>::PropertyDescriptionTooShort,
-            Error::<T>::PropertyDescriptionTooLong,
-        )
-    }
-
-    /// Ensure `Type` specific constraints satisfied
-    pub fn ensure_property_type_size_is_valid<T: Trait>(&self) -> Result<(), Error<T>> {
-        match &self.property_type {
-            PropertyType::Single(single_property_type) => {
-                // Ensure Type specific TextMaxLengthConstraint satisfied
-                single_property_type.ensure_property_type_size_is_valid()
-            }
-            PropertyType::Vector(vec_property_type) => {
-                // Ensure Type specific TextMaxLengthConstraint & VecMaxLengthConstraint satisfied
-                vec_property_type.ensure_property_type_size_is_valid()
-            }
-        }
-    }
-}

+ 0 - 350
runtime-modules/content-directory/src/tests.rs

@@ -1,350 +0,0 @@
-mod add_class_schema;
-mod add_curator_group;
-mod add_curator_to_group;
-mod add_maintainer_to_class;
-mod add_schema_support_to_entity;
-mod clear_entity_property_vector;
-mod create_class;
-mod create_entity;
-mod insert_at_entity_property_vector;
-mod remove_at_entity_property_vector;
-mod remove_curator_from_group;
-mod remove_curator_group;
-mod remove_entity;
-mod remove_maintainer_from_class;
-mod set_curator_group_status;
-mod transaction;
-mod transfer_entity_ownership;
-mod update_class_permissions;
-mod update_class_schema_status;
-mod update_entity_creation_voucher;
-mod update_entity_permissions;
-mod update_entity_property_values;
-
-use super::*;
-use crate::mock::*;
-use core::iter::FromIterator;
-
-pub fn add_entity_schemas_support() -> (
-    Entity<ClassId, MemberId, Hashed, EntityId, Nonce>,
-    Entity<ClassId, MemberId, Hashed, EntityId, Nonce>,
-) {
-    // Create first class with default permissions
-    assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-    // Create second class with default permissions
-    assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-    let actor = Actor::Lead;
-
-    // Create first entity
-    assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-    // Create second entity
-    assert_ok!(create_entity(
-        LEAD_ORIGIN,
-        SECOND_CLASS_ID,
-        actor.to_owned()
-    ));
-
-    // Create first property
-    let first_property =
-        Property::<ClassId>::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-    // Create second property
-    let second_property_type = PropertyType::<ClassId>::vec_reference(SECOND_CLASS_ID, true, 5);
-
-    let second_property = Property::<ClassId>::with_name_and_type(
-        (PropertyNameLengthConstraint::get().max() - 1) as usize,
-        second_property_type,
-        true,
-        false,
-    );
-
-    // Add first Schema to the first Class
-    assert_ok!(add_class_schema(
-        LEAD_ORIGIN,
-        FIRST_CLASS_ID,
-        BTreeSet::new(),
-        vec![first_property]
-    ));
-
-    // Add second Schema to the first Class
-    assert_ok!(add_class_schema(
-        LEAD_ORIGIN,
-        FIRST_CLASS_ID,
-        BTreeSet::new(),
-        vec![second_property]
-    ));
-
-    // Runtime state before tested call
-
-    // Events number before tested calls
-    let number_of_events_before_calls = System::events().len();
-
-    // Used to ensure schema support added succesfully
-    let mut first_entity = entity_by_id(FIRST_ENTITY_ID);
-
-    // Used to ensure reference counter updated succesfully
-    let mut second_entity = entity_by_id(SECOND_ENTITY_ID);
-
-    let mut first_schema_property_values = BTreeMap::new();
-    first_schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-    // Add first schema support to the first entity
-    assert_ok!(add_schema_support_to_entity(
-        LEAD_ORIGIN,
-        actor.to_owned(),
-        FIRST_ENTITY_ID,
-        FIRST_SCHEMA_ID,
-        first_schema_property_values.clone()
-    ));
-
-    let mut second_schema_property_values = BTreeMap::new();
-    let second_schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-        SECOND_ENTITY_ID,
-        SECOND_ENTITY_ID,
-        SECOND_ENTITY_ID,
-    ]);
-
-    second_schema_property_values.insert(SECOND_PROPERTY_ID, second_schema_property_value);
-
-    // Add second schema support to the first entity
-    assert_ok!(add_schema_support_to_entity(
-        LEAD_ORIGIN,
-        actor.to_owned(),
-        FIRST_ENTITY_ID,
-        SECOND_SCHEMA_ID,
-        second_schema_property_values.clone()
-    ));
-
-    // Update supported schemas set and properties of first entity
-    *first_entity.get_supported_schemas_mut() =
-        BTreeSet::from_iter(vec![FIRST_SCHEMA_ID, SECOND_SCHEMA_ID].into_iter());
-
-    first_schema_property_values.append(&mut second_schema_property_values);
-
-    first_entity.set_values(TestModule::make_output_property_values(
-        first_schema_property_values,
-    ));
-
-    // Update reference counter of second entity
-    let inbound_rc = InboundReferenceCounter::new(3, true);
-    *second_entity.get_reference_counter_mut() = inbound_rc.clone();
-
-    // Create side-effect
-    let side_effect: EntityReferenceCounterSideEffect = inbound_rc.into();
-    let mut side_effects = ReferenceCounterSideEffects::default();
-    side_effects.insert(SECOND_ENTITY_ID, side_effect);
-
-    let entity_schema_support_added_event = get_test_event(RawEvent::EntitySchemaSupportAdded(
-        actor,
-        FIRST_ENTITY_ID,
-        SECOND_SCHEMA_ID,
-        Some(side_effects),
-    ));
-
-    // Last event checked
-    assert_event(
-        entity_schema_support_added_event,
-        number_of_events_before_calls + 2,
-    );
-
-    (first_entity, second_entity)
-}
-
-pub enum EntityAccessStateFailureType {
-    EntityNotFound,
-    LeadAuthFailed,
-    MemberAuthFailed,
-    CuratorAuthFailed,
-    CuratorNotFoundInCuratorGroup,
-    EntityAccessDenied,
-    PropertyValuesLocked,
-}
-
-pub fn emulate_entity_access_state_for_failure_case(
-    entity_access_level_failure_type: EntityAccessStateFailureType,
-) -> Actor<CuratorGroupId, CuratorId, MemberId> {
-    // Create class with default permissions
-    assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-    match entity_access_level_failure_type {
-        EntityAccessStateFailureType::EntityNotFound => Actor::Lead,
-        EntityAccessStateFailureType::LeadAuthFailed => {
-            let actor = Actor::Lead;
-
-            // Create entity
-            assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-            actor
-        }
-        EntityAccessStateFailureType::MemberAuthFailed => {
-            // Update class permissions to force any member be available to create entities
-            assert_ok!(update_class_permissions(
-                LEAD_ORIGIN,
-                FIRST_CLASS_ID,
-                Some(true),
-                None,
-                None,
-                None
-            ));
-
-            let actor = Actor::Member(FIRST_MEMBER_ID);
-
-            // Create entity
-            assert_ok!(create_entity(
-                FIRST_MEMBER_ORIGIN,
-                FIRST_CLASS_ID,
-                actor.clone()
-            ));
-            actor
-        }
-        EntityAccessStateFailureType::CuratorAuthFailed => {
-            // Add curator group
-            assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-            // Add curator to group
-            assert_ok!(add_curator_to_group(
-                LEAD_ORIGIN,
-                FIRST_CURATOR_GROUP_ID,
-                FIRST_CURATOR_ID,
-            ));
-
-            // Add curator group as class maintainer
-            assert_ok!(add_maintainer_to_class(
-                LEAD_ORIGIN,
-                FIRST_CLASS_ID,
-                FIRST_CURATOR_GROUP_ID
-            ));
-
-            // Make curator group active
-            assert_ok!(set_curator_group_status(
-                LEAD_ORIGIN,
-                FIRST_CURATOR_GROUP_ID,
-                true
-            ));
-
-            let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
-
-            // Create Entity
-            assert_ok!(create_entity(
-                FIRST_CURATOR_ORIGIN,
-                FIRST_CLASS_ID,
-                actor.clone()
-            ));
-
-            actor
-        }
-        EntityAccessStateFailureType::CuratorNotFoundInCuratorGroup => {
-            // Add curator group
-            assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-            // Add curator to group
-            assert_ok!(add_curator_to_group(
-                LEAD_ORIGIN,
-                FIRST_CURATOR_GROUP_ID,
-                FIRST_CURATOR_ID,
-            ));
-
-            // Make curator group active
-            assert_ok!(set_curator_group_status(
-                LEAD_ORIGIN,
-                FIRST_CURATOR_GROUP_ID,
-                true
-            ));
-
-            // Add curator group as class maintainer
-            assert_ok!(add_maintainer_to_class(
-                LEAD_ORIGIN,
-                FIRST_CLASS_ID,
-                FIRST_CURATOR_GROUP_ID
-            ));
-
-            // Create entity
-            assert_ok!(create_entity(
-                FIRST_CURATOR_ORIGIN,
-                FIRST_CLASS_ID,
-                Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID)
-            ));
-
-            Actor::Curator(FIRST_CURATOR_GROUP_ID, SECOND_CURATOR_ID)
-        }
-        EntityAccessStateFailureType::EntityAccessDenied => {
-            // Update class permissions to force any member be available to create entities
-            assert_ok!(update_class_permissions(
-                LEAD_ORIGIN,
-                FIRST_CLASS_ID,
-                Some(true),
-                None,
-                None,
-                None
-            ));
-
-            // Create entity
-            assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, Actor::Lead));
-
-            Actor::Member(SECOND_MEMBER_ID)
-        }
-        EntityAccessStateFailureType::PropertyValuesLocked => {
-            // Update class permissions to force lock all entity property values from update being performed
-            assert_ok!(update_class_permissions(
-                LEAD_ORIGIN,
-                FIRST_CLASS_ID,
-                None,
-                None,
-                Some(true),
-                None
-            ));
-
-            // Create entity
-            assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, Actor::Lead));
-
-            Actor::Lead
-        }
-    }
-}
-
-///  Create class reference schema
-pub fn add_unique_class_reference_schema() {
-    // Create property
-    let property_type =
-        PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, VecMaxLengthConstraint::get());
-
-    let property = Property::<ClassId>::with_name_and_type(
-        (PropertyNameLengthConstraint::get().max() - 1) as usize,
-        property_type,
-        true,
-        true,
-    );
-
-    // Add Schema to the Class
-    assert_ok!(add_class_schema(
-        LEAD_ORIGIN,
-        FIRST_CLASS_ID,
-        BTreeSet::new(),
-        vec![property]
-    ));
-}
-
-///  Create class reference schema and add corresponding schema support to the Entity
-pub fn add_unique_class_reference_schema_and_entity_schema_support(
-    actor: &Actor<CuratorGroupId, CuratorId, MemberId>,
-    origin: u64,
-) {
-    add_unique_class_reference_schema();
-
-    let schema_property_value =
-        InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-    let mut schema_property_values = BTreeMap::new();
-    schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-    // Add schema support to the entity
-    assert_ok!(add_schema_support_to_entity(
-        origin,
-        actor.to_owned(),
-        FIRST_ENTITY_ID,
-        FIRST_SCHEMA_ID,
-        schema_property_values
-    ));
-}

+ 0 - 507
runtime-modules/content-directory/src/tests/add_class_schema.rs

@@ -1,507 +0,0 @@
-use super::*;
-
-#[test]
-fn add_class_schema_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let first_property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        let second_property =
-            Property::default_with_name((PropertyNameLengthConstraint::get().max() - 1) as usize);
-
-        // Add first class schema
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![first_property.clone()]
-        ));
-
-        // Add second class schema
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::from_iter(vec![FIRST_PROPERTY_ID].into_iter()),
-            vec![second_property.clone()]
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure class schemas added succesfully
-        let mut class = create_class_with_default_permissions();
-
-        class.set_properties(vec![first_property, second_property]);
-        *class.get_schemas_mut() = vec![
-            Schema::new(BTreeSet::from_iter(vec![FIRST_PROPERTY_ID].into_iter())),
-            Schema::new(BTreeSet::from_iter(
-                vec![FIRST_PROPERTY_ID, SECOND_PROPERTY_ID].into_iter(),
-            )),
-        ];
-
-        assert_eq!(class_by_id(FIRST_CLASS_ID), class);
-
-        let class_schema_added_event =
-            get_test_event(RawEvent::ClassSchemaAdded(FIRST_CLASS_ID, SECOND_SCHEMA_ID));
-
-        // Last event checked
-        assert_event(class_schema_added_event, number_of_events_before_call + 2);
-    })
-}
-
-#[test]
-fn add_class_schema_lead_auth_failied() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        // Make an attempt to add class schema under non lead origin
-        let add_class_schema_result = add_class_schema(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property],
-        );
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_class_does_not_exist() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        // Make an attempt to add class schema to class, which does not exist in runtime
-        let add_class_schema_result = add_class_schema(
-            LEAD_ORIGIN,
-            UNKNOWN_CLASS_ID,
-            BTreeSet::new(),
-            vec![property],
-        );
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::ClassNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_limit_reached() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let mut number_of_schemas_added = 0;
-
-        // Add schemas to the class until MaxNumberOfSchemasPerClass limit reached
-        let add_class_schema_result = loop {
-            // property name must be unique
-            let property = Property::default_with_name(
-                PropertyNameLengthConstraint::get().max() as usize - number_of_schemas_added,
-            );
-
-            // Add class schema
-            let add_class_schema_result =
-                add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-            if add_class_schema_result.is_err() {
-                break add_class_schema_result;
-            } else {
-                number_of_schemas_added += 1;
-            }
-        };
-
-        // Ensure number of schemas added is equal to MaxNumberOfSchemasPerClass
-        assert_eq!(
-            number_of_schemas_added,
-            MaxNumberOfSchemasPerClass::get() as usize
-        );
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::ClassSchemasLimitReached,
-            number_of_events_before_call + number_of_schemas_added,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_no_props_in_schema() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add class schema with both empty existing and new properties
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::NoPropertiesInClassSchema,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_properties_limit_reached() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        // Add properties to Vec until it exceed MaxNumberOfPropertiesPerSchema runtime constraint
-        let properties = (1..=MaxNumberOfPropertiesPerSchema::get() + 1)
-            .into_iter()
-            .map(|property_id| {
-                // property name must be unique
-                let name_len = PropertyNameLengthConstraint::get().max() as u32 - property_id;
-                Property::default_with_name(name_len as usize)
-            })
-            .collect();
-
-        // Make an attempt to add class schema, providing properties, which total number exceeds MaxNumberOfPropertiesPerSchema limit
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), properties);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::SchemaPropertiesLimitReached,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_prop_name_not_unique() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        let first_property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        let second_property =
-            Property::default_with_name((PropertyNameLengthConstraint::get().max()) as usize);
-
-        // Add first class schema
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![first_property]
-        ));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add second class schema with the same name
-        let add_class_schema_result = add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::from_iter(vec![FIRST_PROPERTY_ID].into_iter()),
-            vec![second_property],
-        );
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::PropertyNameNotUniqueInAClass,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_refers_invalid_property_index() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        // Make an attempt to add class schema, providing existing property index, which corresponding property does not added yet
-        let add_class_schema_result = add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::from_iter(vec![UNKNOWN_PROPERTY_ID].into_iter()),
-            vec![property],
-        );
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::ClassSchemaRefersUnknownPropertyIndex,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_property_name_too_long() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property = Property::<ClassId>::invalid(InvalidPropertyType::NameTooLong);
-
-        // Make an attempt to add class schema, providing property with name, which length exceeds PropertyNameLengthConstraint
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::PropertyNameTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_property_name_too_short() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property = Property::<ClassId>::invalid(InvalidPropertyType::NameTooShort);
-
-        // Make an attempt to add class schema, providing property with name, which length is less than min value of PropertyNameLengthConstraint
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::PropertyNameTooShort,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_property_description_too_long() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property = Property::<ClassId>::invalid(InvalidPropertyType::DescriptionTooLong);
-
-        // Make an attempt to add class schema, providing property with description, which length exceeds PropertyDescriptionLengthConstraint
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::PropertyDescriptionTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_property_description_too_short() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property = Property::<ClassId>::invalid(InvalidPropertyType::DescriptionTooShort);
-
-        // Make an attempt to add class schema, providing property with description, which length is less than min value of PropertyDescriptionLengthConstraint
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::PropertyDescriptionTooShort,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_text_property_is_too_long() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property = Property::<ClassId>::invalid(InvalidPropertyType::TextIsTooLong);
-
-        // Make an attempt to add class schema, providing property with Text type, which TextMaxLength exceeds corresponding TextMaxLengthConstraint
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::TextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_text_hash_property_is_too_long() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property = Property::<ClassId>::invalid(InvalidPropertyType::TextHashIsTooLong);
-
-        // Make an attempt to add class schema, providing property with Hash type,
-        // which HashedTextMaxLength exceeds corresponding HashedTextMaxLengthConstraint
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::HashedTextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_property_vec_property_is_too_long() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let property = Property::<ClassId>::invalid(InvalidPropertyType::VecIsTooLong);
-
-        // Make an attempt to add class schema, providing Vector property, which VecMaxLength exceeds corresponding VecMaxLengthConstraint
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::VecPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_class_schema_property_refers_unknown_class() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested calls
-        let number_of_events_before_call = System::events().len();
-
-        let reference_vec_type = PropertyType::<ClassId>::vec_reference(
-            UNKNOWN_CLASS_ID,
-            true,
-            VecMaxLengthConstraint::get(),
-        );
-        let property = Property::<ClassId>::with_name_and_type(1, reference_vec_type, true, true);
-
-        // Make an attempt to add class schema, providing property with Type::Reference, which refers to unknown ClassId
-        let add_class_schema_result =
-            add_class_schema(LEAD_ORIGIN, FIRST_CLASS_ID, BTreeSet::new(), vec![property]);
-
-        // Failure checked
-        assert_failure(
-            add_class_schema_result,
-            Error::<Runtime>::ClassSchemaRefersUnknownClass,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 59
runtime-modules/content-directory/src/tests/add_curator_group.rs

@@ -1,59 +0,0 @@
-use super::*;
-
-///Root Origin
-
-#[test]
-fn add_curator_group_success() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        assert_eq!(next_curator_group_id(), FIRST_CURATOR_GROUP_ID);
-        assert!(!curator_group_exists(FIRST_CURATOR_GROUP_ID));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state after call
-
-        // Ensure new curator group exists and equal to default one right after creation
-        let curator_group = CuratorGroup::default();
-        assert_eq!(curator_group_by_id(FIRST_CURATOR_GROUP_ID), curator_group);
-
-        // Overall curator groups counter after curator group creation creation checked
-        assert_eq!(next_curator_group_id(), SECOND_CURATOR_GROUP_ID);
-
-        assert!(curator_group_exists(FIRST_CURATOR_GROUP_ID));
-
-        let curator_group_created_event =
-            get_test_event(RawEvent::CuratorGroupAdded(FIRST_CURATOR_GROUP_ID));
-
-        // Event checked
-        assert_event(
-            curator_group_created_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn add_curator_group_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attemt to add curator group from non lead origin
-        let add_curator_group_result = add_curator_group(FIRST_MEMBER_ORIGIN);
-
-        // Failure checked
-        assert_failure(
-            add_curator_group_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 162
runtime-modules/content-directory/src/tests/add_curator_to_group.rs

@@ -1,162 +0,0 @@
-use super::*;
-
-#[test]
-fn add_curator_to_group_success() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Add curator to group
-        assert_ok!(add_curator_to_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure curator added to group
-        let mut curator_group = CuratorGroup::default();
-        curator_group.get_curators_mut().insert(FIRST_CURATOR_ID);
-        assert_eq!(curator_group_by_id(FIRST_CURATOR_GROUP_ID), curator_group);
-
-        let curator_group_curator_added_event = get_test_event(RawEvent::CuratorAdded(
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID,
-        ));
-
-        // Event checked
-        assert_event(
-            curator_group_curator_added_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn add_curator_to_group_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add curator to group from non lead origin
-        let add_curator_to_group_result = add_curator_to_group(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_curator_to_group_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_curator_to_non_existent_group() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add curator to group that does not exist
-        let add_curator_to_group_result =
-            add_curator_to_group(LEAD_ORIGIN, UNKNOWN_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
-
-        // Failure checked
-        assert_failure(
-            add_curator_to_group_result,
-            Error::<Runtime>::CuratorGroupDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_curator_to_group_already_a_member_of_given_curator_group() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add curator to group
-        assert_ok!(add_curator_to_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID
-        ));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add curator, which is already a member of given curator group.
-        let add_curator_to_group_result =
-            add_curator_to_group(LEAD_ORIGIN, FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
-
-        // Failure checked
-        assert_failure(
-            add_curator_to_group_result,
-            Error::<Runtime>::CuratorIsAlreadyAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_curator_to_group_curators_limit_reached() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut number_of_curators_added = 0;
-
-        // Adding curators to the same group until limit reached
-        let add_curator_to_group_result = loop {
-            // Add curator to group
-            let add_curator_to_group_result = add_curator_to_group(
-                LEAD_ORIGIN,
-                FIRST_CURATOR_GROUP_ID,
-                number_of_curators_added,
-            );
-
-            if add_curator_to_group_result.is_err() {
-                break add_curator_to_group_result;
-            } else {
-                number_of_curators_added += 1;
-            }
-        };
-
-        // Ensure number of curators added is equal to the MaxNumberOfCuratorsPerGroup runtime limit
-        assert_eq!(
-            number_of_curators_added as u32,
-            MaxNumberOfCuratorsPerGroup::get()
-        );
-
-        // Failure checked
-        assert_failure(
-            add_curator_to_group_result,
-            Error::<Runtime>::CuratorsPerGroupLimitReached,
-            number_of_events_before_call + number_of_curators_added as usize,
-        );
-    })
-}

+ 0 - 195
runtime-modules/content-directory/src/tests/add_maintainer_to_class.rs

@@ -1,195 +0,0 @@
-use super::*;
-
-#[test]
-fn add_maintainer_to_class_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure curator_group added as class maintainer
-        let mut class = create_class_with_default_permissions();
-        class
-            .get_permissions_mut()
-            .get_maintainers_mut()
-            .insert(FIRST_CURATOR_GROUP_ID);
-        assert_eq!(class_by_id(FIRST_CLASS_ID), class);
-
-        let maintainer_added_event = get_test_event(RawEvent::MaintainerAdded(
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID,
-        ));
-
-        // Event checked
-        assert_event(maintainer_added_event, number_of_events_before_call + 1);
-    })
-}
-
-#[test]
-fn add_maintainer_to_class_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add maintainer to class from non lead origin
-        let add_maintainer_result =
-            add_maintainer_to_class(SECOND_MEMBER_ORIGIN, FIRST_CLASS_ID, FIRST_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            add_maintainer_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_non_existent_maintainer_to_class() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add non existent maintainer curator group to class
-        let add_maintainer_result =
-            add_maintainer_to_class(LEAD_ORIGIN, FIRST_CLASS_ID, UNKNOWN_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            add_maintainer_result,
-            Error::<Runtime>::CuratorGroupDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_maintainer_to_non_existent_class() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add maintainer to non existent class
-        let add_maintainer_result =
-            add_maintainer_to_class(LEAD_ORIGIN, UNKNOWN_CLASS_ID, FIRST_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            add_maintainer_result,
-            Error::<Runtime>::ClassNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_maintainer_to_class_limit_reached() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator groups to runtime storage, that will be used to be added as class maintainers
-        for _ in 0..=MaxNumberOfMaintainersPerClass::get() {
-            assert_ok!(add_curator_group(LEAD_ORIGIN));
-        }
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut number_of_maintainers_added_to_class = 0_usize;
-
-        // Adding curator group maintainers to the same class until limit reached
-        let add_maintainer_result = loop {
-            let curator_group_id = (number_of_maintainers_added_to_class + 1) as CuratorGroupId;
-
-            let add_maintainer_result =
-                add_maintainer_to_class(LEAD_ORIGIN, FIRST_CLASS_ID, curator_group_id);
-
-            if add_maintainer_result.is_err() {
-                break add_maintainer_result;
-            } else {
-                number_of_maintainers_added_to_class += 1;
-            }
-        };
-
-        // Ensure number of maintainers added to the class is equal to MaxNumberOfMaintainersPerClass constraint defined on class level
-        assert_eq!(
-            number_of_maintainers_added_to_class,
-            MaxNumberOfMaintainersPerClass::get() as usize
-        );
-
-        // Failure checked
-        assert_failure(
-            add_maintainer_result,
-            Error::<Runtime>::ClassMaintainersLimitReached,
-            number_of_events_before_call + number_of_maintainers_added_to_class,
-        );
-    })
-}
-
-#[test]
-fn add_maintainer_that_is_already_exist() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add maintainer
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add curator group maintainer, that is already added to given class maintainers set
-        let add_maintainer_result =
-            add_maintainer_to_class(LEAD_ORIGIN, FIRST_CLASS_ID, FIRST_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            add_maintainer_result,
-            Error::<Runtime>::MaintainerAlreadyExists,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 1458
runtime-modules/content-directory/src/tests/add_schema_support_to_entity.rs

@@ -1,1458 +0,0 @@
-use super::*;
-
-#[test]
-fn add_schema_support_to_entity_success() {
-    with_test_externalities(|| {
-        // Add entity schemas support
-        let (first_entity, second_entity) = add_entity_schemas_support();
-
-        // Ensure supported schemas set and properties of first entity updated succesfully
-        assert_eq!(first_entity, entity_by_id(FIRST_ENTITY_ID));
-
-        // Ensure reference counter of second entity updated succesfully
-        assert_eq!(second_entity, entity_by_id(SECOND_ENTITY_ID));
-    })
-}
-
-#[test]
-fn add_schema_support_to_non_existent_entity() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityNotFound,
-        );
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add schema support to non existent Entity
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_lead_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::LeadAuthFailed,
-        );
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add schema support under non lead origin
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_member_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::MemberAuthFailed,
-        );
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add schema support to entity using unknown origin and member actor
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::MemberAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_curator_group_is_not_active() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Make curator group inactive to block it from any entity operations
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            false
-        ));
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to entity using curator group, which is not active as actor
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            FIRST_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::CuratorGroupIsNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_curator_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to entity under unknown origin and curator actor,
-        // which corresponding group is current entity controller
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::CuratorAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_curator_not_found_in_curator_group() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorNotFoundInCuratorGroup,
-        );
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to entity, using actor in group,
-        // which curator id was not added to corresponding group set
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_access_denied() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityAccessDenied,
-        );
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to entity, using origin,
-        // which corresponding actor is neither entity maintainer, nor controller.
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            SECOND_MEMBER_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::EntityAccessDenied,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_to_entity_schema_does_not_exist() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to entity, providing schema_id,
-        // which corresponding Schema does not exist on Class level
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::UnknownClassSchemaId,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_to_entity_class_property_not_found() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(SECOND_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to Entity, providing property value under property_id,
-        // which does not not yet added to corresponding Class properties
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::ClassPropertyNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_already_added_to_the_entity() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values.clone(),
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add schema support to entity, providing schema_id,
-        // which was already added to the Entity
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::SchemaAlreadyAddedToTheEntity,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_already_contains_given_property_id() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create first property
-        let first_property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add first Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![first_property]
-        ));
-
-        // Create second property
-        let second_property_type =
-            PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get());
-        let second_property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize - 1,
-            second_property_type,
-            true,
-            false,
-        );
-
-        // Add second Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::from_iter(vec![FIRST_PROPERTY_ID].into_iter()),
-            vec![second_property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values.clone(),
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        schema_property_values.insert(
-            SECOND_PROPERTY_ID,
-            InputPropertyValue::<Runtime>::single_text(TextMaxLengthConstraint::get()),
-        );
-
-        // Make an attempt to add schema support to entity, providing Schema property_values,
-        // some of which were already added to this Entity
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            SECOND_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::EntityAlreadyContainsGivenPropertyId,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_is_not_active() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Make Class Schema inactive
-        assert_ok!(update_class_schema_status(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_SCHEMA_ID,
-            false
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to Entity, providing schema id,
-        // which corresponding class Schema is not active
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::ClassSchemaNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_does_not_contain_provided_property_id() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create first property
-        let first_property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![first_property]
-        ));
-
-        // Create second property
-        let second_property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize - 1,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![second_property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(SECOND_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to Entity, providing property values, which are not a members of
-        // provided Schema
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::SchemaDoesNotContainProvidedPropertyId,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_missing_required_property() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create first property
-        let first_property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Create second property
-        let second_property_type =
-            PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get());
-        let second_property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize - 1,
-            second_property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![first_property, second_property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to Entity, do not providing some of required property values
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::MissingRequiredProperty,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_dont_match_type() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get());
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize - 1,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Make an attempt to add schema support to Entity, providing property values, some of which do not match
-        // Class level Property Type
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::PropertyValueDoNotMatchType,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_referenced_entity_does_not_match_class() {
-    with_test_externalities(|| {
-        // Create first class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create second class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create second entity
-        assert_ok!(create_entity(
-            LEAD_ORIGIN,
-            SECOND_CLASS_ID,
-            actor.to_owned()
-        ));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, 5);
-
-        let property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the first Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Make an attempt to add schema support to the Entity, when provided schema property value(s) refer(s) Entity, which Class
-        // does not match the class in corresponding Class Property
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::ReferencedEntityDoesNotMatchItsClass,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_referenced_entity_does_not_exist() {
-    with_test_externalities(|| {
-        // Create first class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create second class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(SECOND_CLASS_ID, true, 5);
-
-        let property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the first Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            UNKNOWN_ENTITY_ID,
-            UNKNOWN_ENTITY_ID,
-        ]);
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Make an attempt to add schema support to the first entity, if provided property value(s) refer(s) to another Entity,
-        // which does not exist in runtime
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_entity_can_not_be_referenced() {
-    with_test_externalities(|| {
-        // Create first class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Update second entity permissions to forbid it from being referencable
-        assert_ok!(update_entity_permissions(
-            LEAD_ORIGIN,
-            SECOND_ENTITY_ID,
-            None,
-            Some(false)
-        ));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, 5);
-
-        let property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Make an attempt to add schema support to the first entity, when provided schema property value(s)
-        // refer(s) to Entity which can not be referenced
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::EntityCanNotBeReferenced,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_same_controller_constraint_violation() {
-    with_test_externalities(|| {
-        // Create first class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create second entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            Actor::Member(FIRST_MEMBER_ID)
-        ));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, 5);
-
-        let property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Make an attempt to add schema support to the first entity, providing reference property value(s) in case,
-        // when corresponding Entity can only be referenced from Entity with the same controller.
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::SameControllerConstraintViolation,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_text_property_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create text property
-        let property_type = PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get());
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the first Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::single_text(TextMaxLengthConstraint::get() + 1);
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Make an attempt to add schema support to the entity, providing text property value(s), which
-        // length exceeds TextMaxLengthConstraint.
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::TextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_text_hash_property_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        let hashed_text_max_length_constraint = HashedTextMaxLengthConstraint::get();
-
-        // Create hash property
-        let property_type =
-            PropertyType::<ClassId>::single_text_hash(hashed_text_max_length_constraint);
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the first Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-
-        let schema_property_value = InputPropertyValue::<Runtime>::single_text_to_hash(
-            hashed_text_max_length_constraint.unwrap() + 1,
-        );
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Make an attempt to add schema support to the entity, providing text property value(s), which
-        // length exceeds HashedTextMaxLengthConstraint.
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::HashedTextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_vec_property_is_too_long() {
-    with_test_externalities(|| {
-        // Create first class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create second class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create second entity
-        assert_ok!(create_entity(
-            LEAD_ORIGIN,
-            SECOND_CLASS_ID,
-            actor.to_owned()
-        ));
-
-        // Create vec property
-        let property_type = PropertyType::<ClassId>::vec_reference(
-            SECOND_CLASS_ID,
-            true,
-            VecMaxLengthConstraint::get(),
-        );
-
-        let property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the first Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_property_values = BTreeMap::new();
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-                SECOND_ENTITY_ID;
-                VecMaxLengthConstraint::get() as usize + 1
-            ]);
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Make an attempt to add schema support to the Entity, providing vector property value(s), which
-        // length exceeds VecMaxLengthConstraint.
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::VecPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_property_should_be_unique() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        let property_type = PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get());
-
-        // Create text property
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            true,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let mut schema_property_values = BTreeMap::new();
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::single_text(TextMaxLengthConstraint::get());
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add Entity Schema support to the first Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values.clone(),
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add schema support to the Entity, providing property values, which respective Class properties have
-        // unique flag set and same property values under same property_ids were already added to any Entity of this Class
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::PropertyValueShouldBeUnique,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn add_schema_support_properties_should_be_unique() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create third entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        let property_type = PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get());
-
-        // Create text property
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            true,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let mut first_schema_property_values = BTreeMap::new();
-
-        let first_schema_property_value =
-            InputPropertyValue::<Runtime>::single_text(TextMaxLengthConstraint::get());
-
-        first_schema_property_values.insert(FIRST_PROPERTY_ID, first_schema_property_value);
-
-        // Add Entity Schema support to the first Entity (property unique on the Class level added)
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            first_schema_property_values.clone(),
-        ));
-
-        let mut second_schema_property_values = BTreeMap::new();
-
-        let second_schema_property_value =
-            InputPropertyValue::<Runtime>::single_text(TextMaxLengthConstraint::get() - 1);
-
-        second_schema_property_values.insert(FIRST_PROPERTY_ID, second_schema_property_value);
-
-        // Add Entity Schema support to the second Entity (property unique on the Class level added)
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            second_schema_property_values,
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to add schema support to the Entity, providing property values, which respective Class properties have
-        // unique flag set and same property values under same property_ids were already added to any Entity of this Class
-        let add_schema_support_to_entity_result = add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            THIRD_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            first_schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            add_schema_support_to_entity_result,
-            Error::<Runtime>::PropertyValueShouldBeUnique,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 557
runtime-modules/content-directory/src/tests/clear_entity_property_vector.rs

@@ -1,557 +0,0 @@
-use super::*;
-
-#[test]
-fn clear_entity_property_vector_success() {
-    with_test_externalities(|| {
-        let actor = Actor::Lead;
-
-        // Add entity schemas support
-        let (mut first_entity, mut second_entity) = add_entity_schemas_support();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_calls = System::events().len();
-
-        // Clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        assert_ok!(clear_entity_property_vector(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            SECOND_PROPERTY_ID
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure first entity properties updated succesfully
-        if let Some(second_schema_old_property_value) = first_entity
-            .get_values_mut()
-            .get_mut(&SECOND_PROPERTY_ID)
-            .and_then(|property_value| property_value.as_vec_property_value_mut())
-        {
-            second_schema_old_property_value.clear();
-        }
-
-        assert_eq!(first_entity, entity_by_id(FIRST_ENTITY_ID));
-
-        // Ensure reference counter of second entity updated succesfully
-        let inbound_rc = InboundReferenceCounter::new(0, true);
-        *second_entity.get_reference_counter_mut() = inbound_rc.clone();
-
-        assert_eq!(second_entity, entity_by_id(SECOND_ENTITY_ID));
-
-        // Create side-effect
-        let side_effect = EntityReferenceCounterSideEffect::new(-3, -3);
-        let mut side_effects = ReferenceCounterSideEffects::default();
-        side_effects.insert(SECOND_ENTITY_ID, side_effect);
-
-        let entity_property_vector_cleared_event = get_test_event(RawEvent::VectorCleared(
-            actor,
-            FIRST_ENTITY_ID,
-            SECOND_PROPERTY_ID,
-            Some(side_effects),
-        ));
-
-        // Last event checked
-        assert_event(
-            entity_property_vector_cleared_event,
-            number_of_events_before_calls + 1,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_entity_not_found() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityNotFound,
-        );
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // in case when corresponding Entity does not exist
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(LEAD_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_lead_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::LeadAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // using unknown origin and lead actor
-        let clear_entity_property_vector_result = clear_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_member_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::MemberAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, FIRST_MEMBER_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // using unknown origin an member actor
-        let clear_entity_property_vector_result = clear_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::MemberAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_curator_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, FIRST_CURATOR_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // using unknown origin and curator actor
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(UNKNOWN_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::CuratorAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_curator_group_is_not_active() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, FIRST_CURATOR_ORIGIN);
-
-        // Make curator group inactive to block it from any entity operations
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            false
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // using curator group, which is not active as actor
-        let clear_entity_property_vector_result = clear_entity_property_vector(
-            FIRST_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::CuratorGroupIsNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_curator_not_found_in_curator_group() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorNotFoundInCuratorGroup,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(
-            &Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
-            FIRST_CURATOR_ORIGIN,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // using actor in group, which curator id was not added to corresponding group set
-        let clear_entity_property_vector_result = clear_entity_property_vector(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_entity_access_denied() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityAccessDenied,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // using origin, which corresponding actor is neither entity maintainer, nor controller.
-        let clear_entity_property_vector_result = clear_entity_property_vector(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::EntityAccessDenied,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_values_locked_on_class_level() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::PropertyValuesLocked,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // in the case, when all property values were locked on Class level
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(LEAD_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::AllPropertiesWereLockedOnClassLevel,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_class_property_not_found() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // in the case, when Property under corresponding PropertyId was not found on Class level
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(LEAD_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::ClassPropertyNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_is_locked_for_given_actor() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, 5);
-
-        let mut property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        property.locking_policy = PropertyLockingPolicy::new(false, true);
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id` under lead origin,
-        // which is current Entity controller, in the case, when corresponding class Property was locked from controller on Class level
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(LEAD_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::ClassPropertyTypeLockedForGivenActor,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_unknown_entity_property_id() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // in the case, when property value was not added to current Entity values yet.
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(LEAD_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::UnknownEntityPropertyId,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_value_under_given_index_is_not_a_vector() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // in the case, when entity property value corresponding to a given in_class_schema_property_id is not a vector.
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(LEAD_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueUnderGivenIndexIsNotAVector,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn clear_entity_property_vector_property_should_be_unique() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create unique class reference schema and add corresponding schema support to the first Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create blank vec reference
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to clear property_vector under given `entity_id` & `in_class_schema_property_id`
-        // in case, when the same blank required & unique property value vector already added to another Entity of this Class.
-        let clear_entity_property_vector_result =
-            clear_entity_property_vector(LEAD_ORIGIN, actor, FIRST_ENTITY_ID, FIRST_PROPERTY_ID);
-
-        // Failure checked
-        assert_failure(
-            clear_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueShouldBeUnique,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 275
runtime-modules/content-directory/src/tests/create_class.rs

@@ -1,275 +0,0 @@
-use super::*;
-
-#[test]
-fn create_class_success() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        assert_eq!(next_class_id(), FIRST_CLASS_ID);
-        assert!(!class_exists(FIRST_CLASS_ID));
-
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state after call
-
-        // Ensure class under given if is equal to default one
-        let default_class = create_class_with_default_permissions();
-        assert_eq!(class_by_id(FIRST_CLASS_ID), default_class);
-
-        let class_created_event = get_test_event(RawEvent::ClassCreated(FIRST_CLASS_ID));
-
-        // Event checked
-        assert_event(class_created_event, number_of_events_before_call + 1);
-    })
-}
-
-#[test]
-fn create_class_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with non lead origin
-        let create_class_result = create_simple_class(FIRST_MEMBER_ORIGIN, ClassType::Valid);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_limit_reached() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut number_of_classes_created = 0;
-
-        // Creating classes before limit reached
-        let create_class_result = loop {
-            let create_class_result = create_simple_class(LEAD_ORIGIN, ClassType::Valid);
-            if create_class_result.is_err() {
-                break create_class_result;
-            } else {
-                number_of_classes_created += 1;
-            }
-        };
-
-        // Ensure number of classes created is equal to MaxNumberOfClasses runtime constraint
-        assert_eq!(
-            number_of_classes_created,
-            MaxNumberOfClasses::get() as usize
-        );
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::ClassLimitReached,
-            number_of_events_before_call + number_of_classes_created,
-        );
-    })
-}
-
-#[test]
-fn create_class_name_is_too_long() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with invalid name
-        let create_class_result = create_simple_class(LEAD_ORIGIN, ClassType::NameTooLong);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::ClassNameTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_name_is_too_short() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with invalid name
-        let create_class_result = create_simple_class(LEAD_ORIGIN, ClassType::NameTooShort);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::ClassNameTooShort,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_description_is_too_long() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with invalid description
-        let create_class_result = create_simple_class(LEAD_ORIGIN, ClassType::DescriptionTooLong);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::ClassDescriptionTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_description_is_too_short() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with invalid description
-        let create_class_result = create_simple_class(LEAD_ORIGIN, ClassType::DescriptionTooShort);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::ClassDescriptionTooShort,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_invalid_maximum_entities_count() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with invalid maximum entities count value
-        let create_class_result =
-            create_simple_class(LEAD_ORIGIN, ClassType::InvalidMaximumEntitiesCount);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::EntitiesNumberPerClassConstraintViolated,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_invalid_default_voucher_upper_bound() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with invalid default voucher upper bound value
-        let create_class_result =
-            create_simple_class(LEAD_ORIGIN, ClassType::InvalidDefaultVoucherUpperBound);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::NumberOfClassEntitiesPerActorConstraintViolated,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_per_controller_creation_limit_exceeds_overall_limit() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with per controller creation limit that exceeds overall entities creation limit
-        let create_class_result = create_simple_class(
-            LEAD_ORIGIN,
-            ClassType::DefaultVoucherUpperBoundExceedsMaximumEntitiesCount,
-        );
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::PerControllerEntitiesCreationLimitExceedsOverallLimit,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_maintainers_limit_reached() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Add curator groups to runtime
-        for _ in 1..=MaxNumberOfMaintainersPerClass::get() {
-            assert_ok!(add_curator_group(LEAD_ORIGIN));
-        }
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with number of maintainers that exceeds runtime limit
-        let create_class_result =
-            create_simple_class(LEAD_ORIGIN, ClassType::MaintainersLimitReached);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::ClassMaintainersLimitReached,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_class_curator_group_does_not_exist() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attempt to create class with curator group maintainer, which does not exist in runtime
-        let create_class_result =
-            create_simple_class(LEAD_ORIGIN, ClassType::CuratorGroupDoesNotExist);
-
-        // Failure checked
-        assert_failure(
-            create_class_result,
-            Error::<Runtime>::CuratorGroupDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 446
runtime-modules/content-directory/src/tests/create_entity.rs

@@ -1,446 +0,0 @@
-use super::*;
-
-#[test]
-fn create_entity_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Update class permissions to force any member be available to create entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        // Runtime state before tested call
-
-        assert_eq!(next_entity_id(), FIRST_ENTITY_ID);
-        assert!(!entity_exists(FIRST_ENTITY_ID));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Member(FIRST_MEMBER_ID);
-
-        // Create entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            actor.clone()
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure Class `current_number_of_entities` value updated succesfully
-        let mut class = create_class_with_default_permissions();
-        class.get_permissions_mut().set_any_member_status(true);
-        class.increment_entities_count();
-
-        assert_eq!(class_by_id(FIRST_CLASS_ID), class);
-
-        // Ensure  entity creation voucher with `default_entity_creation_voucher_upper_bound` for given entity controller created succesfully.
-        let mut entity_voucher =
-            EntityCreationVoucher::new(class.get_default_entity_creation_voucher_upper_bound());
-        entity_voucher.increment_created_entities_count();
-
-        let entity_controller = EntityController::<MemberId>::from_actor::<Runtime>(&actor);
-
-        assert_eq!(
-            entity_creation_vouchers(FIRST_CLASS_ID, &entity_controller),
-            entity_voucher,
-        );
-
-        // Ensure new entity created
-        let entity = Entity::<ClassId, MemberId, Hashed, EntityId, Nonce>::new(
-            entity_controller,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            BTreeMap::new(),
-        );
-
-        assert_eq!(entity_by_id(FIRST_ENTITY_ID), entity);
-
-        // Ensure `NextEntityId` storage value updated
-        assert_eq!(next_entity_id(), SECOND_ENTITY_ID);
-
-        let entity_created_event =
-            get_test_event(RawEvent::EntityCreated(actor, next_entity_id() - 1));
-
-        // Last event checked
-        assert_event(entity_created_event, number_of_events_before_call + 1);
-    })
-}
-
-#[test]
-fn create_entity_of_non_existent_class() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Lead;
-
-        // Make an attempt to create Entity of non existent Class
-        let create_entity_result = create_entity(LEAD_ORIGIN, UNKNOWN_CLASS_ID, actor);
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::ClassNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_creation_limit_reached() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Update class permissions to force any member be available to create entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut number_of_entities_created = 0;
-
-        // Create entities of the same Class entities limit per class reached
-        let create_entity_result = loop {
-            let create_entity_result = create_entity(
-                number_of_entities_created,
-                FIRST_CLASS_ID,
-                Actor::Member(number_of_entities_created),
-            );
-            if create_entity_result.is_err() {
-                break create_entity_result;
-            } else {
-                number_of_entities_created += 1;
-            }
-        };
-
-        // Runtime tested state after call
-
-        // Ensure number of entities created is equal to MaxNumberOfEntitiesPerClass runtime constraint.
-        assert_eq!(
-            number_of_entities_created,
-            MaxNumberOfEntitiesPerClass::get()
-        );
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::NumberOfEntitiesPerClassLimitReached,
-            number_of_events_before_call + number_of_entities_created as usize,
-        );
-    })
-}
-
-#[test]
-fn create_entity_creation_blocked_on_class_level() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Update class permissions to block entity creation on class level
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            None,
-            Some(true),
-            None,
-            None
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Lead;
-
-        // Make an attempt to create Entity, when entiti creation was previously blocked on class level
-        let create_entity_result = create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor);
-
-        // Runtime tested state after call
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::EntitiesCreationBlocked,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Lead;
-
-        // Make an attempt to authorize as Lead under non lead origin
-        let create_entity_result = create_entity(FIRST_MEMBER_ORIGIN, FIRST_CLASS_ID, actor);
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_member_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Update class permissions to force any member be available to create entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Member(UNKNOWN_MEMBER_ID);
-
-        // Make an attempt to authorize under non existent member id
-        let create_entity_result = create_entity(UNKNOWN_ORIGIN, FIRST_CLASS_ID, actor);
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::MemberAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_actor_can_not_create_entities() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Member(UNKNOWN_MEMBER_ID);
-
-        // Make an attempt to create entity, authorizing as member in case, when members are not permitted to create entities on class level
-        let create_entity_result = create_entity(UNKNOWN_ORIGIN, FIRST_CLASS_ID, actor);
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::ActorCanNotCreateEntities,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_unknown_curator_id() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Make curator group active
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            true
-        ));
-
-        // Add curator group as class maintainer
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, UNKNOWN_CURATOR_ID);
-
-        // Make an attempt to create entity, authorizing as curator in group,
-        // in case, when provided curator id wasn`t added to respective curator group set
-        let create_entity_result = create_entity(FIRST_CURATOR_ORIGIN, FIRST_CLASS_ID, actor);
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::CuratorAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_curator_group_is_not_active() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add curator to group
-        assert_ok!(add_curator_to_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID,
-        ));
-
-        // Add curator group as class maintainer
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
-
-        // Make an attempt to create entity, authorizing as curator in group, in case, when
-        // corresponding curator group is not active. (default status of curator group right after creation)
-        let create_entity_result = create_entity(FIRST_CURATOR_ORIGIN, FIRST_CLASS_ID, actor);
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::CuratorGroupIsNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_curator_not_found_in_curator_group() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Make curator group active
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            true
-        ));
-
-        // Add curator group as class maintainer
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
-
-        // Make an attempt to create entity, authorizing as curator in group, in case, when
-        // curator was not added to corresponding curator group.
-        let create_entity_result = create_entity(FIRST_CURATOR_ORIGIN, FIRST_CLASS_ID, actor);
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_voucher_limit_reached() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Lead;
-
-        let mut number_of_entities_created = 0;
-
-        // Create entities until individual creation limit reached
-        let create_entity_result = loop {
-            let create_entity_result = create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone());
-            if create_entity_result.is_err() {
-                break create_entity_result;
-            } else {
-                number_of_entities_created += 1;
-            }
-        };
-
-        // Ensure number of entities created is equal to IndividualEntitiesCreationLimit runtime constraint.
-        assert_eq!(
-            number_of_entities_created,
-            IndividualEntitiesCreationLimit::get()
-        );
-
-        // Failure checked
-        assert_failure(
-            create_entity_result,
-            Error::<Runtime>::VoucherLimitReached,
-            number_of_events_before_call + number_of_entities_created as usize,
-        );
-    })
-}

+ 0 - 1271
runtime-modules/content-directory/src/tests/insert_at_entity_property_vector.rs

@@ -1,1271 +0,0 @@
-use super::*;
-
-#[test]
-fn insert_at_entity_property_vector_success() {
-    with_test_externalities(|| {
-        let actor = Actor::Lead;
-
-        // Add entity schemas support
-        let (mut first_entity, mut second_entity) = add_entity_schemas_support();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_calls = System::events().len();
-
-        // Insert `InputValue` at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`
-        let nonce = 0;
-        let index_in_property_vector = 1;
-        let input_value = InputValue::Reference(SECOND_ENTITY_ID);
-
-        assert_ok!(insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            SECOND_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure first entity properties updated succesfully
-        if let Some(second_schema_old_property_value) = first_entity
-            .get_values_mut()
-            .get_mut(&SECOND_PROPERTY_ID)
-            .and_then(|property_value| property_value.as_vec_property_value_mut())
-        {
-            second_schema_old_property_value.insert_at(
-                index_in_property_vector,
-                StoredValue::Reference(SECOND_ENTITY_ID),
-            );
-        }
-
-        assert_eq!(first_entity, entity_by_id(FIRST_ENTITY_ID));
-
-        // Ensure reference counter of second entity updated succesfully
-        let inbound_rc = InboundReferenceCounter::new(4, true);
-        *second_entity.get_reference_counter_mut() = inbound_rc;
-
-        assert_eq!(second_entity, entity_by_id(SECOND_ENTITY_ID));
-
-        // Create side-effect
-        let side_effect = EntityReferenceCounterSideEffect::new(1, 1);
-
-        let inserted_at_vector_index_event = get_test_event(RawEvent::InsertedAtVectorIndex(
-            actor,
-            FIRST_ENTITY_ID,
-            SECOND_PROPERTY_ID,
-            index_in_property_vector,
-            nonce + 1,
-            Some((SECOND_ENTITY_ID, side_effect)),
-        ));
-
-        // Last event checked
-        assert_event(
-            inserted_at_vector_index_event,
-            number_of_events_before_calls + 1,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_entity_not_found() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityNotFound,
-        );
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 1;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case when corresponding Entity does not exist
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_lead_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::LeadAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 1;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` using unknown origin and lead actor
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_member_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::MemberAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` using unknown origin and member actor
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::MemberAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_curator_group_is_not_active() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, FIRST_CURATOR_ORIGIN);
-
-        // Make curator group inactive to block it from any entity operations
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            false
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` using curator group, which is not active as actor
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            FIRST_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::CuratorGroupIsNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_curator_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(
-            &Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
-            FIRST_CURATOR_ORIGIN,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` using unknown origin and curator actor
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::CuratorAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_curator_not_found_in_curator_group() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorNotFoundInCuratorGroup,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(
-            &Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
-            FIRST_CURATOR_ORIGIN,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // using actor in group, which curator id was not added to corresponding group set
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_access_denied() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityAccessDenied,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // using origin, which corresponding actor is neither entity maintainer, nor controller.
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::EntityAccessDenied,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_values_locked_on_class_level() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::PropertyValuesLocked,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // in the case, when all property values were locked on Class level.
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::AllPropertiesWereLockedOnClassLevel,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_class_property_not_found() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // in the case, when Property under corresponding PropertyId was not found on Class level.
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::ClassPropertyNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_is_locked_for_given_actor() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, 5);
-
-        let mut property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        property.locking_policy = PropertyLockingPolicy::new(false, true);
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // under lead origin, which is current Entity controller, in the case,
-        // when corresponding class Property was locked from controller on Class level
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::ClassPropertyTypeLockedForGivenActor,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_unknown_entity_property_id() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // in the case, when property value was not added to current Entity values yet.
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::UnknownEntityPropertyId,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_value_under_given_index_is_not_a_vector() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // in the case, when entity property value corresponding to a given in_class_schema_property_id is not a vector.
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueUnderGivenIndexIsNotAVector,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_nonces_does_not_match() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 1;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id`,
-        // providing nonce that does not corresponding property value vector one.
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueVecNoncesDoesNotMatch,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_index_is_out_of_range() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        let entity_ids = vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID];
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(entity_ids.clone());
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when provided index_in_property_vector is out of range of the related vector
-        let nonce = 0;
-        let index_in_property_vector = entity_ids.len() as u16 + 1;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::EntityPropertyValueVectorIndexIsOutOfRange,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        let entity_ids = vec![FIRST_ENTITY_ID; VecMaxLengthConstraint::get() as usize];
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(entity_ids.clone());
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when corresponding property_vector can not contain more values
-        let nonce = 0;
-        let index_in_property_vector = 1;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::EntityPropertyValueVectorIsTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_text_prop_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_text(
-            TextMaxLengthConstraint::get(),
-            VecMaxLengthConstraint::get(),
-        );
-
-        let property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_text(vec![]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when corresponding property text value is too long
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value =
-            InputValue::Text(generate_text(TextMaxLengthConstraint::get() as usize + 1));
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::TextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_hashed_text_prop_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let hashed_text_max_length_constraint = HashedTextMaxLengthConstraint::get();
-
-        // Create vec text hash property
-        let property_type = PropertyType::<ClassId>::vec_text_hash(
-            hashed_text_max_length_constraint,
-            VecMaxLengthConstraint::get(),
-        );
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_text_to_hash(vec![]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when corresponding property text to hash value is too long
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::TextToHash(generate_text(
-            hashed_text_max_length_constraint.unwrap() as usize + 1,
-        ));
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::HashedTextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_prop_type_does_not_match_internal_vec_property() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_text(
-            TextMaxLengthConstraint::get(),
-            VecMaxLengthConstraint::get(),
-        );
-
-        let property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_text(vec![]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when corresponding property type does not match internal vector property type
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::default();
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueTypeDoesNotMatchInternalVectorType,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_referenced_entity_not_found() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when corresponding input_value referes to unknown Entity
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(SECOND_ENTITY_ID);
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_entity_can_not_be_referenced() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity of first Class
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the first Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity of first Class
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Update second entity permissions to forbid it from being referencable
-        assert_ok!(update_entity_permissions(
-            LEAD_ORIGIN,
-            SECOND_ENTITY_ID,
-            None,
-            Some(false)
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when corresponding Entity can not be referenced
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(SECOND_ENTITY_ID);
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::EntityCanNotBeReferenced,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_same_controller_constraint_violation() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the first  Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            Actor::Member(FIRST_MEMBER_ID)
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when corresponding Entity can only be referenced from Entity with the same controller.
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(SECOND_ENTITY_ID);
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::SameControllerConstraintViolation,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn insert_at_entity_property_vector_property_should_be_unique() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create unique class reference schema and add corresponding schema support to the first Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create vec reference
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to insert value at given `index_in_property_vector`
-        // into `VecStoredPropertyValue` under `in_class_schema_property_id` in case,
-        // when in result we`ll get required & unique property value vector,
-        // which is already added to another Entity of this Class.
-        let nonce = 0;
-        let index_in_property_vector = 0;
-        let input_value = InputValue::Reference(FIRST_ENTITY_ID);
-
-        let insert_at_entity_property_vector_result = insert_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            SECOND_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            input_value,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            insert_at_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueShouldBeUnique,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 776
runtime-modules/content-directory/src/tests/remove_at_entity_property_vector.rs

@@ -1,776 +0,0 @@
-use super::*;
-
-#[test]
-fn remove_at_entity_property_vector_success() {
-    with_test_externalities(|| {
-        let actor = Actor::Lead;
-
-        // Add entity schemas support
-        let (mut first_entity, mut second_entity) = add_entity_schemas_support();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_calls = System::events().len();
-
-        // Remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under in_class_schema_property_id
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        assert_ok!(remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            SECOND_PROPERTY_ID,
-            index_in_property_vector,
-            nonce
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure first entity properties updated succesfully
-        if let Some(second_schema_old_property_value) = first_entity
-            .get_values_mut()
-            .get_mut(&SECOND_PROPERTY_ID)
-            .and_then(|property_value| property_value.as_vec_property_value_mut())
-        {
-            second_schema_old_property_value.remove_at(index_in_property_vector);
-        }
-
-        assert_eq!(first_entity, entity_by_id(FIRST_ENTITY_ID));
-
-        // Ensure reference counter of second entity updated succesfully
-        let inbound_rc = InboundReferenceCounter::new(2, true);
-        *second_entity.get_reference_counter_mut() = inbound_rc;
-
-        assert_eq!(second_entity, entity_by_id(SECOND_ENTITY_ID));
-
-        // Create side-effect
-        let side_effect = EntityReferenceCounterSideEffect::new(-1, -1);
-
-        let removed_at_vector_index_event = get_test_event(RawEvent::RemovedAtVectorIndex(
-            actor,
-            FIRST_ENTITY_ID,
-            SECOND_PROPERTY_ID,
-            index_in_property_vector,
-            nonce + 1,
-            Some((SECOND_ENTITY_ID, side_effect)),
-        ));
-
-        // Last event checked
-        assert_event(
-            removed_at_vector_index_event,
-            number_of_events_before_calls + 1,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_entity_not_found() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityNotFound,
-        );
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id` in case when corresponding Entity does not exist
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_lead_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::LeadAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id` using unknown origin and lead actor
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_member_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::MemberAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id` using unknown origin and member actor
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::MemberAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_curator_group_is_not_active() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, FIRST_CURATOR_ORIGIN);
-
-        // Make curator group inactive to block it from any entity operations
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            false
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id` using curator group, which is not active as actor
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            FIRST_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::CuratorGroupIsNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_curator_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, FIRST_CURATOR_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id` using unknown origin and curator actor
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::CuratorAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_curator_not_found_in_curator_group() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorNotFoundInCuratorGroup,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(
-            &Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
-            FIRST_CURATOR_ORIGIN,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // using actor in group, which curator id was not added to corresponding group set
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_access_denied() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityAccessDenied,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // using origin, which corresponding actor is neither entity maintainer, nor controller.
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::EntityAccessDenied,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_values_locked_on_class_level() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::PropertyValuesLocked,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // in the case, when all property values were locked on Class level.
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::AllPropertiesWereLockedOnClassLevel,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_class_property_not_found() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // in the case, when Property under corresponding PropertyId was not found on Class level.
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::ClassPropertyNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_is_locked_for_given_actor() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, 5);
-
-        let mut property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        property.locking_policy = PropertyLockingPolicy::new(false, true);
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // under lead origin, which is current Entity controller, in the case,
-        // when corresponding class Property was locked from controller on Class level
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::ClassPropertyTypeLockedForGivenActor,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_unknown_entity_property_id() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // in the case, when property value was not added to current Entity values yet.
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::UnknownEntityPropertyId,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_value_under_given_index_is_not_a_vector() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property = Property::<ClassId>::default_with_name(
-            PropertyNameLengthConstraint::get().max() as usize,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, InputPropertyValue::default());
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // in the case, when entity property value corresponding to a given in_class_schema_property_id is not a vector.
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueUnderGivenIndexIsNotAVector,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_nonces_does_not_match() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 1;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id`,
-        // providing nonce that does not corresponding property value vector one.
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueVecNoncesDoesNotMatch,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_index_is_out_of_range() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        let entity_ids = vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID];
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(entity_ids.clone());
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id` in case,
-        // when provided index_in_property_vector is out of range of the related vector
-        let nonce = 0;
-        let index_in_property_vector = entity_ids.len() as u16 + 1;
-
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::EntityPropertyValueVectorIndexIsOutOfRange,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_at_entity_property_vector_property_should_be_unique() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create unique class reference schema and add corresponding schema support to the first Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create vec reference
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            FIRST_ENTITY_ID,
-            FIRST_ENTITY_ID,
-            FIRST_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let nonce = 0;
-        let index_in_property_vector = 0;
-
-        // Make an attempt to remove value at given `index_in_property_vector`
-        // from `PropertyValueVec` under `in_class_schema_property_id` in case,
-        // when in result we`ll get required & unique property value vector,
-        // which is already added to another Entity of this Class.
-        let remove_at_entity_property_vector_result = remove_at_entity_property_vector(
-            LEAD_ORIGIN,
-            actor,
-            SECOND_ENTITY_ID,
-            FIRST_PROPERTY_ID,
-            index_in_property_vector,
-            nonce,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_at_entity_property_vector_result,
-            Error::<Runtime>::PropertyValueShouldBeUnique,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 131
runtime-modules/content-directory/src/tests/remove_curator_from_group.rs

@@ -1,131 +0,0 @@
-use super::*;
-
-#[test]
-fn remove_curator_from_group_success() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add first curator to group
-        assert_ok!(add_curator_to_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID
-        ));
-        // Add second curator to group
-        assert_ok!(add_curator_to_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            SECOND_CURATOR_ID
-        ));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Remove first curator from group
-        assert_ok!(remove_curator_from_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure group contains only second curator
-        let mut curator_group = CuratorGroup::default();
-        curator_group.get_curators_mut().insert(SECOND_CURATOR_ID);
-        assert_eq!(curator_group_by_id(FIRST_CURATOR_GROUP_ID), curator_group);
-
-        let curator_group_curator_removed_event = get_test_event(RawEvent::CuratorRemoved(
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID,
-        ));
-
-        // Event checked
-        assert_event(
-            curator_group_curator_removed_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn remove_curator_from_group_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add curator to group
-        assert_ok!(add_curator_to_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID
-        ));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove curator from group using non lead origin
-        let remove_curator_from_group_result = remove_curator_from_group(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_curator_from_group_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_curator_from_group_curator_is_not_a_member() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove curator that does not added to the provided curator group
-        let remove_curator_from_group_result =
-            remove_curator_from_group(LEAD_ORIGIN, FIRST_CURATOR_GROUP_ID, UNKNOWN_CURATOR_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_curator_from_group_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_curator_from_non_existent_group() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove curator from group using non lead origin
-        let remove_curator_from_group_result =
-            remove_curator_from_group(LEAD_ORIGIN, UNKNOWN_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_curator_from_group_result,
-            Error::<Runtime>::CuratorGroupDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 110
runtime-modules/content-directory/src/tests/remove_curator_group.rs

@@ -1,110 +0,0 @@
-use super::*;
-
-#[test]
-fn remove_curator_group_success() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        assert_ok!(remove_curator_group(LEAD_ORIGIN, FIRST_CURATOR_GROUP_ID));
-
-        // Runtime tested state after call
-
-        assert_eq!(next_curator_group_id(), SECOND_CURATOR_GROUP_ID);
-
-        // Ensure curator group removed
-        assert!(!curator_group_exists(FIRST_CURATOR_GROUP_ID));
-
-        let curator_group_removed_event =
-            get_test_event(RawEvent::CuratorGroupRemoved(FIRST_CURATOR_GROUP_ID));
-
-        // Event checked
-        assert_event(
-            curator_group_removed_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn remove_curator_group_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attemt to remove curator group from non lead origin
-        let remove_curator_group_result =
-            remove_curator_group(FIRST_MEMBER_ORIGIN, FIRST_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_curator_group_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_non_existent_curator_group() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attemt to remove non existent curator group
-        let remove_curator_group_result =
-            remove_curator_group(LEAD_ORIGIN, UNKNOWN_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_curator_group_result,
-            Error::<Runtime>::CuratorGroupDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn curator_group_removal_forbidden() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Create class
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add curator group as class maintainer
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attemt to remove curator group, that have classes maintained
-        let remove_curator_group_result = remove_curator_group(LEAD_ORIGIN, FIRST_CURATOR_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_curator_group_result,
-            Error::<Runtime>::CuratorGroupRemovalForbidden,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 302
runtime-modules/content-directory/src/tests/remove_entity.rs

@@ -1,302 +0,0 @@
-use super::*;
-
-#[test]
-fn remove_entity_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Remove entity
-        assert_ok!(remove_entity(LEAD_ORIGIN, actor.clone(), FIRST_ENTITY_ID));
-
-        // Runtime tested state after call
-
-        // Ensure entity under corresponding id was succesfully removed from runtime storage
-        assert!(!entity_exists(FIRST_ENTITY_ID));
-
-        // Ensure number of entities_created under respective entity creation voucher decremented succesfully.
-        let entity_voucher = EntityCreationVoucher::new(IndividualEntitiesCreationLimit::get());
-
-        let entity_controller = EntityController::<MemberId>::from_actor::<Runtime>(&actor);
-
-        assert_eq!(
-            entity_creation_vouchers(FIRST_CLASS_ID, &entity_controller),
-            entity_voucher,
-        );
-
-        let entity_removed_event =
-            get_test_event(RawEvent::EntityRemoved(actor, next_entity_id() - 1));
-
-        // Last event checked
-        assert_event(entity_removed_event, number_of_events_before_call + 1);
-    })
-}
-
-#[test]
-fn remove_non_existent_entity() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityNotFound,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove Entity, which does not exist in runtime
-        let remove_entity_result = remove_entity(LEAD_ORIGIN, actor, UNKNOWN_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_entity_lead_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::LeadAuthFailed,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity under non lead origin
-        let remove_entity_result = remove_entity(UNKNOWN_ORIGIN, actor, FIRST_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_entity_member_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::MemberAuthFailed,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity using unknown origin and member actor, which is current Entity controller
-        let remove_entity_result = remove_entity(UNKNOWN_ORIGIN, actor, FIRST_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::MemberAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn create_entity_curator_group_is_not_active() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Make curator group inactive to block it from any entity operations
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            false
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity using curator group, which is not active as actor
-        let remove_entity_result = remove_entity(FIRST_CURATOR_ORIGIN, actor, FIRST_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::CuratorGroupIsNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_entity_curator_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity under unknown origin and curator actor, which corresponding group is current entity controller
-        let remove_entity_result = remove_entity(UNKNOWN_ORIGIN, actor, FIRST_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::CuratorAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_entity_curator_not_found_in_curator_group() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorNotFoundInCuratorGroup,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity, using actor in group,
-        // which curator id was not added to corresponding group set
-        let remove_entity_result = remove_entity(SECOND_CURATOR_ORIGIN, actor, FIRST_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_entity_access_denied() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityAccessDenied,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity, using origin, which corresponding actor is neither entity maintainer, nor controller.
-        let remove_entity_result = remove_entity(SECOND_MEMBER_ORIGIN, actor, FIRST_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::EntityAccessDenied,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_entity_removal_access_denied() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add curator to group
-        assert_ok!(add_curator_to_group(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            FIRST_CURATOR_ID,
-        ));
-
-        // Make curator group active
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            true
-        ));
-
-        // Add curator group as class maintainer
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime state before tested call
-
-        let actor = Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID);
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, Actor::Lead));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity, using origin, which corresponding actor is not an entity controller
-        let remove_entity_result = remove_entity(FIRST_CURATOR_ORIGIN, actor, FIRST_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::EntityRemovalAccessDenied,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_entity_rc_does_not_equal_to_zero() {
-    with_test_externalities(|| {
-        let actor = Actor::Lead;
-
-        // Create class, two corresponding entities and force first entity have schema support with property value referencing second entity
-        add_entity_schemas_support();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove entity, which rc does not equal to zero
-        let remove_entity_result = remove_entity(LEAD_ORIGIN, actor, SECOND_ENTITY_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_entity_result,
-            Error::<Runtime>::EntityRcDoesNotEqualToZero,
-            number_of_events_before_call,
-        );
-
-        // Remove first entity, which have property values referencing second one.
-        assert_ok!(remove_entity(LEAD_ORIGIN, actor, FIRST_ENTITY_ID));
-
-        // Succesfully perform second entity removal
-        assert_ok!(remove_entity(LEAD_ORIGIN, actor, SECOND_ENTITY_ID));
-    })
-}

+ 0 - 147
runtime-modules/content-directory/src/tests/remove_maintainer_from_class.rs

@@ -1,147 +0,0 @@
-use super::*;
-
-#[test]
-fn remove_maintainer_from_class_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add first curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add second curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add first maintainer to class
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Add second maintainer to class
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            SECOND_CURATOR_GROUP_ID
-        ));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Remove first maintainer from class
-        assert_ok!(remove_maintainer_from_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure curator_group removed from class maintainers set
-        let mut class = create_class_with_default_permissions();
-        class
-            .get_permissions_mut()
-            .get_maintainers_mut()
-            .insert(SECOND_CURATOR_GROUP_ID);
-        assert_eq!(class_by_id(FIRST_CLASS_ID), class);
-
-        let maintainer_removed_event = get_test_event(RawEvent::MaintainerRemoved(
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID,
-        ));
-
-        // Event checked
-        assert_event(maintainer_removed_event, number_of_events_before_call + 1);
-    })
-}
-
-#[test]
-fn remove_maintainer_from_class_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add maintainer to class
-        assert_ok!(add_maintainer_to_class(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID
-        ));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove maintainer from class under non lead origin
-        let remove_maintainer_from_class_result = remove_maintainer_from_class(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_CURATOR_GROUP_ID,
-        );
-
-        // Failure checked
-        assert_failure(
-            remove_maintainer_from_class_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_maintainer_from_non_existent_class() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove maintainer from non existent class
-        let remove_maintainer_from_class_result =
-            remove_maintainer_from_class(LEAD_ORIGIN, UNKNOWN_CLASS_ID, FIRST_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_maintainer_from_class_result,
-            Error::<Runtime>::ClassNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn remove_maintainer_that_was_not_added_to_class_maintainers_set() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to remove curator group maintainer, that was not added to corresponding class maintainers set yet
-        let remove_maintainer_from_class_result =
-            remove_maintainer_from_class(LEAD_ORIGIN, FIRST_CLASS_ID, UNKNOWN_CURATOR_GROUP_ID);
-
-        // Failure checked
-        assert_failure(
-            remove_maintainer_from_class_result,
-            Error::<Runtime>::MaintainerDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 84
runtime-modules/content-directory/src/tests/set_curator_group_status.rs

@@ -1,84 +0,0 @@
-use super::*;
-
-#[test]
-fn set_curator_group_status_success() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Change curator group status
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            true
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure curator group status changed
-        let mut curator_group = CuratorGroup::default();
-        curator_group.set_status(true);
-        assert_eq!(curator_group_by_id(FIRST_CURATOR_GROUP_ID), curator_group);
-
-        let curator_group_status_set_event = get_test_event(RawEvent::CuratorGroupStatusSet(
-            FIRST_CURATOR_GROUP_ID,
-            true,
-        ));
-
-        // Event checked
-        assert_event(
-            curator_group_status_set_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn set_curator_group_status_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Add curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attemt to change curator group status from non lead origin
-        let set_curator_group_status_result =
-            set_curator_group_status(FIRST_MEMBER_ORIGIN, FIRST_CURATOR_GROUP_ID, true);
-
-        // Failure checked
-        assert_failure(
-            set_curator_group_status_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn set_curator_group_status_for_non_existent_curator_group() {
-    with_test_externalities(|| {
-        // Runtime tested state before call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // An attemt to change curator group status for non existent curator group
-        let set_curator_group_status_result =
-            set_curator_group_status(LEAD_ORIGIN, FIRST_CURATOR_GROUP_ID, true);
-
-        // Failure checked
-        assert_failure(
-            set_curator_group_status_result,
-            Error::<Runtime>::CuratorGroupDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 155
runtime-modules/content-directory/src/tests/transaction.rs

@@ -1,155 +0,0 @@
-use super::*;
-
-#[test]
-fn transaction_success() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create single reference property
-        let property_type_reference = Type::Reference(FIRST_CLASS_ID, true);
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            PropertyType::Single(property_type_reference),
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let operations = vec![
-            OperationType::CreateEntity(CreateEntityOperation {
-                class_id: FIRST_CLASS_ID,
-            }),
-            OperationType::AddSchemaSupportToEntity(AddSchemaSupportToEntityOperation {
-                entity_id: ParameterizedEntity::InternalEntityJustAdded(0), // index 0 (prior operation)
-                schema_id: 0,
-                parametrized_property_values: vec![ParametrizedClassPropertyValue {
-                    in_class_index: 0,
-                    value: ParametrizedPropertyValue::InternalEntityJustAdded(0),
-                }],
-            }),
-            OperationType::CreateEntity(CreateEntityOperation {
-                class_id: FIRST_CLASS_ID,
-            }),
-            OperationType::UpdatePropertyValues(UpdatePropertyValuesOperation {
-                entity_id: ParameterizedEntity::InternalEntityJustAdded(0), // index 0 (prior operation)
-                new_parametrized_property_values: vec![ParametrizedClassPropertyValue {
-                    in_class_index: 0,
-                    value: ParametrizedPropertyValue::InternalEntityJustAdded(2),
-                }],
-            }),
-        ];
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_calls = System::events().len();
-
-        let actor = Actor::Lead;
-
-        // Number of operations to be performed
-        let operations_count = operations.len();
-
-        // Complete transaction
-        assert_ok!(transaction(LEAD_ORIGIN, actor.clone(), operations));
-
-        // Runtime tested state after call
-
-        let transaction_completed_event = get_test_event(RawEvent::TransactionCompleted(actor));
-
-        // Last event checked
-        assert_event(
-            transaction_completed_event,
-            number_of_events_before_calls + operations_count + 1,
-        );
-    })
-}
-
-#[test]
-fn transaction_limit_reached() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let operation = OperationType::CreateEntity(CreateEntityOperation {
-            class_id: FIRST_CLASS_ID,
-        });
-
-        let operations =
-            vec![operation; MaxNumberOfOperationsDuringAtomicBatching::get() as usize + 1];
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Lead;
-
-        // Make an attempt to complete transaction with operations, which total number exceeds MaxNumberOfOperationsDuringAtomicBatching runtime constraint
-        let transaction_result = transaction(LEAD_ORIGIN, actor, operations);
-
-        // Failure checked
-        assert_failure(
-            transaction_result,
-            Error::<Runtime>::NumberOfOperationsDuringAtomicBatchingLimitReached,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transaction_failed() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let operation = OperationType::CreateEntity(CreateEntityOperation {
-            class_id: FIRST_CLASS_ID,
-        });
-
-        let failed_operation = OperationType::CreateEntity(CreateEntityOperation {
-            class_id: UNKNOWN_CLASS_ID,
-        });
-
-        let operations = vec![
-            operation.clone(),
-            operation.clone(),
-            failed_operation,
-            operation,
-        ];
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let actor = Actor::Lead;
-
-        // Make an attempt to complete transaction with CreateEntity operation, when provided class_id does not exist on runtime level
-        let transaction_result = transaction(LEAD_ORIGIN, actor, operations.clone());
-
-        let failed_operation_index = 2;
-
-        // Failure checked
-
-        // Ensure  call result is equal to expected error
-        assert_err!(transaction_result, Error::<Runtime>::ClassNotFound);
-
-        let transaction_failed_event =
-            get_test_event(RawEvent::TransactionFailed(actor, failed_operation_index));
-
-        // Last event checked
-        assert_event(
-            transaction_failed_event,
-            // two operations succeded and one TransactionFailed event
-            number_of_events_before_call + operations[..failed_operation_index as usize].len() + 1,
-        );
-    })
-}

+ 0 - 738
runtime-modules/content-directory/src/tests/transfer_entity_ownership.rs

@@ -1,738 +0,0 @@
-use super::*;
-
-#[test]
-fn transfer_entity_ownership_success() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_calls = System::events().len();
-
-        // Used to ensure controller changed succesfully
-        let mut entity = entity_by_id(FIRST_ENTITY_ID);
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Ensure Entity controller set to EntityController::Lead
-        assert!(entity
-            .get_permissions_ref()
-            .controller_is_equal_to(&EntityController::Lead));
-
-        // Transfer entity ownership to new controller
-        assert_ok!(transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller.clone(),
-            // Given entity does not have property references with same_owner flag set
-            BTreeMap::new()
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure Entity controller changed to the new_controller
-        entity
-            .get_permissions_mut()
-            .set_conroller(new_controller.clone());
-
-        assert!(entity
-            .get_permissions_ref()
-            .controller_is_equal_to(&new_controller));
-
-        let entity_ownership_transfered_event = get_test_event(
-            RawEvent::EntityOwnershipTransfered(FIRST_ENTITY_ID, new_controller, None),
-        );
-
-        // Last event checked
-        assert_event(
-            entity_ownership_transfered_event,
-            number_of_events_before_calls + 1,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Make an attempt to transfer entity ownership to new controller under non lead origin
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            UNKNOWN_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            // Given entity does not have property references with same_owner flag set
-            BTreeMap::new(),
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_entity_not_found() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Make an attempt to transfer entity ownership of non existent Entity
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            // Given entity does not have property references with same_owner flag set
-            BTreeMap::new(),
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_provided_entity_controller_is_equal_to_the_current_one() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let new_controller = EntityController::Lead;
-
-        // Make an attempt to transfer entity ownership, providing new Entity controller, which is equal to the current one
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            // Given entity does not have property references with same_owner flag set
-            BTreeMap::new(),
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::ProvidedEntityControllerIsEqualToTheCurrentOne,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_inbound_same_owner_rc_does_not_equal_to_zero() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        add_unique_class_reference_schema();
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Make an attempt to transfer ownership of Entity, which is referenced by property values
-        // of another entities with same owner flag set
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            // Given entity does not have property references with same_owner flag set
-            BTreeMap::new(),
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::EntityInboundSameOwnerRcDoesNotEqualToZero,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_provided_property_value_ids_must_be_references_with_same_owner_flag_set(
-) {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        add_unique_class_reference_schema();
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Create third entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            Actor::Member(FIRST_MEMBER_ID)
-        ));
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(SECOND_PROPERTY_ID, schema_property_value);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to transfer ownership of Entity, providing new property value references with same owner flag set,
-        // which respective property ids are not references with same owner flag set on Class Property level
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::AllProvidedPropertyValueIdsMustBeReferencesWithSameOwnerFlagSet,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_provided_new_property_value_referencing_entity_that_can_not_be_referenced(
-) {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        add_unique_class_reference_schema();
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Create third entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            Actor::Member(FIRST_MEMBER_ID)
-        ));
-
-        // Update third entity permissions to forbid it from being referencable
-        assert_ok!(update_entity_permissions(
-            LEAD_ORIGIN,
-            THIRD_ENTITY_ID,
-            None,
-            Some(false)
-        ));
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to transfer ownership of Entity, providing new property value reference(s) with same owner flag set,
-        // which refer(s) Entity, that can not be referenced
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::EntityCanNotBeReferenced,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_provided_new_property_value_referencing_non_existent_entity() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        add_unique_class_reference_schema();
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to transfer ownership of Entity, providing new property value reference(s) with same owner flag set,
-        // which refer(s) to Entity that does not exist
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_provided_new_property_value_referencing_entity_controlled_by_another_actor(
-) {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        add_unique_class_reference_schema();
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Create third entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor));
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to transfer ownership of Entity, providing new property value reference(s) with same owner flag set,
-        // which refer(s) Entity, controlled by another actor
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::SameControllerConstraintViolation,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_required_property_was_not_provided() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        add_unique_class_reference_schema();
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Create third entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            Actor::Member(FIRST_MEMBER_ID)
-        ));
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to transfer ownership of Entity without providing required
-        // new property value references with same owner flag set
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller,
-            BTreeMap::new(),
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::MissingRequiredProperty,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn transfer_entity_ownership_unique_constraint_violation() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create unique reference property with same_controller flag set
-        let property_type = PropertyType::<ClassId>::vec_reference(
-            FIRST_CLASS_ID,
-            true,
-            VecMaxLengthConstraint::get(),
-        );
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            true,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let first_schema_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, first_schema_property_value);
-
-        // Add schema support to the first Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        let second_schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            SECOND_ENTITY_ID,
-            SECOND_ENTITY_ID,
-            SECOND_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, second_schema_property_value);
-
-        // Add schema support to the second Entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor,
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Create third entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            Actor::Member(FIRST_MEMBER_ID)
-        ));
-
-        let new_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-            THIRD_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        assert_ok!(transfer_entity_ownership(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            new_controller.clone(),
-            schema_property_values.clone(),
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to transfer ownership of Entity, providing new property value reference(s)
-        // with same owner flag set, which are identical to thouse, are already added to the another Entity of this Class,
-        // though should be unique on Class Property level
-        let transfer_entity_ownership_result = transfer_entity_ownership(
-            LEAD_ORIGIN,
-            SECOND_ENTITY_ID,
-            new_controller,
-            schema_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            transfer_entity_ownership_result,
-            Error::<Runtime>::PropertyValueShouldBeUnique,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 227
runtime-modules/content-directory/src/tests/update_class_permissions.rs

@@ -1,227 +0,0 @@
-use super::*;
-
-#[test]
-fn update_class_permissions_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add first curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Add second curator group
-        assert_ok!(add_curator_group(LEAD_ORIGIN));
-
-        // Runtime tested state before call
-
-        let mut class_permissions = ClassPermissions::default();
-
-        // Ensure class permissions of newly created Class are equal to default ones
-
-        assert_eq!(
-            class_by_id(FIRST_CLASS_ID).get_permissions(),
-            class_permissions
-        );
-
-        // Ensure curator groups maintain no classes.
-
-        assert_eq!(
-            curator_group_by_id(FIRST_CURATOR_GROUP_ID).get_number_of_classes_maintained(),
-            0
-        );
-
-        assert_eq!(
-            curator_group_by_id(SECOND_CURATOR_GROUP_ID).get_number_of_classes_maintained(),
-            0
-        );
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut maintainers =
-            BTreeSet::from_iter(vec![FIRST_CURATOR_GROUP_ID, SECOND_CURATOR_GROUP_ID]);
-
-        // Update class permissions
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            None,
-            Some(true),
-            None,
-            Some(maintainers.clone())
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure class permissions updated succesfully
-
-        *class_permissions.get_maintainers_mut() = maintainers;
-        class_permissions.set_entity_creation_blocked(true);
-
-        assert_eq!(
-            class_by_id(FIRST_CLASS_ID).get_permissions(),
-            class_permissions
-        );
-
-        let class_permissions_updated_event =
-            get_test_event(RawEvent::ClassPermissionsUpdated(FIRST_CLASS_ID));
-
-        // Ensure number of classes maintained by curator groups updated succesfully.
-
-        assert_eq!(
-            curator_group_by_id(FIRST_CURATOR_GROUP_ID).get_number_of_classes_maintained(),
-            1
-        );
-
-        assert_eq!(
-            curator_group_by_id(SECOND_CURATOR_GROUP_ID).get_number_of_classes_maintained(),
-            1
-        );
-
-        maintainers = BTreeSet::from_iter(vec![SECOND_CURATOR_GROUP_ID]);
-
-        // Update class permissions
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            None,
-            Some(true),
-            None,
-            Some(maintainers.clone())
-        ));
-
-        // Ensure number of classes maintained by curator groups updated succesfully.
-
-        assert_eq!(
-            curator_group_by_id(FIRST_CURATOR_GROUP_ID).get_number_of_classes_maintained(),
-            0
-        );
-
-        assert_eq!(
-            curator_group_by_id(SECOND_CURATOR_GROUP_ID).get_number_of_classes_maintained(),
-            1
-        );
-
-        // Event checked
-        assert_event(
-            class_permissions_updated_event,
-            number_of_events_before_call + 2,
-        );
-    })
-}
-
-#[test]
-fn update_class_permissions_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to update class permissions under non lead origin
-        let update_class_permissions_result = update_class_permissions(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            None,
-            Some(true),
-            None,
-            None,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_class_permissions_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_class_permissions_of_non_existent_class() {
-    with_test_externalities(|| {
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to update class permissions of non existent class
-        let update_class_permissions_result =
-            update_class_permissions(LEAD_ORIGIN, FIRST_CLASS_ID, None, Some(true), None, None);
-
-        // Failure checked
-        assert_failure(
-            update_class_permissions_result,
-            Error::<Runtime>::ClassNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_class_permissions_curator_group_does_not_exist() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let maintainers = BTreeSet::from_iter(vec![UNKNOWN_CURATOR_GROUP_ID]);
-
-        // Make an attempt to update class permissions, providing curator group maintainers which aren`t exist in runtime yet
-        let update_class_permissions_result = update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            None,
-            Some(true),
-            None,
-            Some(maintainers),
-        );
-
-        // Failure checked
-        assert_failure(
-            update_class_permissions_result,
-            Error::<Runtime>::CuratorGroupDoesNotExist,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_class_permissions_maintainers_limit_reached() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Add curator groups, which total number exceeds MaxNumberOfMaintainersPerClass runtime limit
-        // and initialize class maintainers set with their respective ids
-        let mut maintainers = BTreeSet::new();
-        (1..=(MaxNumberOfMaintainersPerClass::get() + 1))
-            .into_iter()
-            .for_each(|curator_group_id| {
-                assert_ok!(add_curator_group(LEAD_ORIGIN));
-                maintainers.insert(curator_group_id as CuratorGroupId);
-            });
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to update class permissions, providing curator group maintainers,
-        // which total number exceeds MaxNumberOfMaintainersPerClass runtime limit
-        let update_class_permissions_result = update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            None,
-            Some(true),
-            None,
-            Some(maintainers),
-        );
-
-        // Failure checked
-        assert_failure(
-            update_class_permissions_result,
-            Error::<Runtime>::ClassMaintainersLimitReached,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 145
runtime-modules/content-directory/src/tests/update_class_schema_status.rs

@@ -1,145 +0,0 @@
-use super::*;
-
-#[test]
-fn update_class_schema_status_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        let property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        // Add class schema (default class schema active flag set true)
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property.clone()]
-        ));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        assert_ok!(update_class_schema_status(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            FIRST_SCHEMA_ID,
-            false
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure class schema status updated succesfully
-        let mut class = create_class_with_default_permissions();
-        let mut schema = Schema::new(BTreeSet::from_iter(vec![FIRST_PROPERTY_ID].into_iter()));
-
-        schema.set_status(false);
-        class.set_properties(vec![property]);
-        *class.get_schemas_mut() = vec![schema];
-
-        assert_eq!(class_by_id(FIRST_CLASS_ID), class);
-
-        let class_schema_status_updated_event = get_test_event(RawEvent::ClassSchemaStatusUpdated(
-            FIRST_CLASS_ID,
-            FIRST_SCHEMA_ID,
-            false,
-        ));
-
-        // Last event checked
-        assert_event(
-            class_schema_status_updated_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn update_class_schema_status_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        let property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        // Add class schema (default class schema active flag set true)
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // make an attempt to update class schema status under non lead origin
-        let update_class_schema_status_result =
-            update_class_schema_status(FIRST_MEMBER_ORIGIN, FIRST_CLASS_ID, FIRST_SCHEMA_ID, false);
-
-        // Failure checked
-        assert_failure(
-            update_class_schema_status_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_class_schema_status_of_non_existent_class() {
-    with_test_externalities(|| {
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to update class schema status of non existent class
-        let update_class_schema_status_result =
-            update_class_schema_status(LEAD_ORIGIN, UNKNOWN_CLASS_ID, FIRST_SCHEMA_ID, false);
-
-        // Failure checked
-        assert_failure(
-            update_class_schema_status_result,
-            Error::<Runtime>::ClassNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_class_schema_status_for_non_existent_schema() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime tested state before call
-
-        let property =
-            Property::default_with_name(PropertyNameLengthConstraint::get().max() as usize);
-
-        // Add class schema (default class schema active flag set true)
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to update  status of Schema, which does not exist in this Class yet.
-        let update_class_schema_status_result =
-            update_class_schema_status(LEAD_ORIGIN, FIRST_CLASS_ID, UNKNOWN_SCHEMA_ID, false);
-
-        // Failure checked
-        assert_failure(
-            update_class_schema_status_result,
-            Error::<Runtime>::UnknownClassSchemaId,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 197
runtime-modules/content-directory/src/tests/update_entity_creation_voucher.rs

@@ -1,197 +0,0 @@
-use super::*;
-
-#[test]
-fn create_entity_creation_voucher_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        let entity_controller = EntityController::Member(FIRST_MEMBER_ID);
-        assert!(!entity_creation_voucher_exists(
-            FIRST_CLASS_ID,
-            &entity_controller
-        ));
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Create entities creation voucher for chosen controller
-        assert_ok!(update_entity_creation_voucher(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            entity_controller.clone(),
-            IndividualEntitiesCreationLimit::get()
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure entity creation voucher for chosen controller created succesfully
-        let entity_voucher = EntityCreationVoucher::new(IndividualEntitiesCreationLimit::get());
-
-        assert_eq!(
-            entity_creation_vouchers(FIRST_CLASS_ID, &entity_controller),
-            entity_voucher,
-        );
-
-        let entity_creation_voucher_created_event = get_test_event(
-            RawEvent::EntityCreationVoucherCreated(entity_controller, entity_voucher),
-        );
-
-        // Last event checked
-        assert_event(
-            entity_creation_voucher_created_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn update_entity_creation_voucher_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Member(FIRST_MEMBER_ID);
-
-        // Update class permissions to force any member be available to create entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let entity_controller = EntityController::<MemberId>::from_actor::<Runtime>(&actor);
-
-        // Create entity
-        assert_ok!(create_entity(FIRST_MEMBER_ORIGIN, FIRST_CLASS_ID, actor));
-
-        // Runtime state before tested call
-
-        let mut entity_creation_voucher =
-            entity_creation_vouchers(FIRST_CLASS_ID, &entity_controller);
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Update entities creation voucher for chosen controller
-        let new_maximum_entities_count = entity_creation_voucher.maximum_entities_count - 1;
-        assert_ok!(update_entity_creation_voucher(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            entity_controller.clone(),
-            new_maximum_entities_count
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure  entity creation voucher for chosen controller updated succesfully
-        entity_creation_voucher.set_maximum_entities_count(new_maximum_entities_count);
-        assert_eq!(
-            entity_creation_vouchers(FIRST_CLASS_ID, &entity_controller),
-            entity_creation_voucher
-        );
-
-        let entity_creation_voucher_created_event = get_test_event(
-            RawEvent::EntityCreationVoucherUpdated(entity_controller, entity_creation_voucher),
-        );
-
-        // Last event checked
-        assert_event(
-            entity_creation_voucher_created_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn update_entity_creation_voucher_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        let entity_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to create entities creation voucher for chosen controller under non lead origin
-        let update_entity_creation_voucher_result = update_entity_creation_voucher(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            entity_controller,
-            IndividualEntitiesCreationLimit::get(),
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_creation_voucher_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_creation_voucher_class_does_not_exist() {
-    with_test_externalities(|| {
-        // Runtime state before tested call
-
-        let entity_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to create entities creation voucher for chosen controller and non existent class
-        let update_entity_creation_voucher_result = update_entity_creation_voucher(
-            LEAD_ORIGIN,
-            UNKNOWN_CLASS_ID,
-            entity_controller,
-            IndividualEntitiesCreationLimit::get(),
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_creation_voucher_result,
-            Error::<Runtime>::ClassNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_creation_voucher_individual_creation_limit_exceed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        let entity_controller = EntityController::Member(FIRST_MEMBER_ID);
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to create entities creation voucher for chosen controller with maximum_entities_count
-        // value that exceeds IndividualEntitiesCreationLimit
-        let update_entity_creation_voucher_result = update_entity_creation_voucher(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            entity_controller,
-            IndividualEntitiesCreationLimit::get() + 1,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_creation_voucher_result,
-            Error::<Runtime>::NumberOfClassEntitiesPerActorConstraintViolated,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 104
runtime-modules/content-directory/src/tests/update_entity_permissions.rs

@@ -1,104 +0,0 @@
-use super::*;
-
-#[test]
-fn update_entity_permissions_success() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor));
-
-        // Runtime state before tested call
-
-        // Ensure entity permissions of newly created Entity are equal to default ones.
-        let mut entity_permissions = EntityPermissions::default();
-        assert_eq!(
-            entity_by_id(FIRST_ENTITY_ID).get_permissions(),
-            entity_permissions
-        );
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Update entity permissions for chosen entity
-        assert_ok!(update_entity_permissions(
-            LEAD_ORIGIN,
-            FIRST_ENTITY_ID,
-            None,
-            Some(false)
-        ));
-
-        // Runtime tested state after call
-
-        entity_permissions.set_referencable(false);
-        assert_eq!(
-            entity_by_id(FIRST_ENTITY_ID).get_permissions(),
-            entity_permissions
-        );
-
-        let entity_permissions_updated_event =
-            get_test_event(RawEvent::EntityPermissionsUpdated(FIRST_ENTITY_ID));
-
-        // Last event checked
-        assert_event(
-            entity_permissions_updated_event,
-            number_of_events_before_call + 1,
-        );
-    })
-}
-
-#[test]
-fn update_entity_permissions_lead_auth_failed() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to update entity permissions for chosen entity under non lead origin
-        let update_entity_permissions_result =
-            update_entity_permissions(FIRST_MEMBER_ORIGIN, FIRST_ENTITY_ID, None, Some(false));
-
-        // Failure checked
-        assert_failure(
-            update_entity_permissions_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_permissions_of_non_existent_entity() {
-    with_test_externalities(|| {
-        // Create simple class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        // Make an attempt to update entity permissions for chosen entity under non lead origin
-        let update_entity_permissions_result =
-            update_entity_permissions(LEAD_ORIGIN, UNKNOWN_ENTITY_ID, None, Some(false));
-
-        // Failure checked
-        assert_failure(
-            update_entity_permissions_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}

+ 0 - 1025
runtime-modules/content-directory/src/tests/update_entity_property_values.rs

@@ -1,1025 +0,0 @@
-use super::*;
-
-#[test]
-fn update_entity_property_values_success() {
-    with_test_externalities(|| {
-        let actor = Actor::Lead;
-
-        // Add entity schemas support
-        let (mut first_entity, mut second_entity) = add_entity_schemas_support();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_calls = System::events().len();
-
-        let mut second_schema_new_property_values = BTreeMap::new();
-        let second_schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![SECOND_ENTITY_ID, SECOND_ENTITY_ID]);
-
-        second_schema_new_property_values
-            .insert(SECOND_PROPERTY_ID, second_schema_new_property_value.clone());
-
-        // Update entity property values
-        assert_ok!(update_entity_property_values(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            second_schema_new_property_values
-        ));
-
-        // Runtime tested state after call
-
-        // Ensure first entity properties updated succesfully
-        if let Some(second_schema_old_property_value) =
-            first_entity.get_values_mut().get_mut(&SECOND_PROPERTY_ID)
-        {
-            second_schema_old_property_value.update(second_schema_new_property_value.into());
-        }
-
-        assert_eq!(first_entity, entity_by_id(FIRST_ENTITY_ID));
-
-        // Ensure reference counter of second entity updated succesfully
-        let inbound_rc = InboundReferenceCounter::new(2, true);
-        *second_entity.get_reference_counter_mut() = inbound_rc;
-
-        assert_eq!(second_entity, entity_by_id(SECOND_ENTITY_ID));
-
-        // Create side-effect
-        let side_effect = EntityReferenceCounterSideEffect::atomic(true, DeltaMode::Decrement);
-        let mut side_effects = ReferenceCounterSideEffects::default();
-        side_effects.insert(SECOND_ENTITY_ID, side_effect);
-
-        let entity_property_values_updated_event = get_test_event(
-            RawEvent::EntityPropertyValuesUpdated(actor, FIRST_ENTITY_ID, Some(side_effects)),
-        );
-
-        // Last event checked
-        assert_event(
-            entity_property_values_updated_event,
-            number_of_events_before_calls + 1,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_entity_not_found() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityNotFound,
-        );
-
-        // Create class reference schema
-        add_unique_class_reference_schema();
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values in case when corresponding Entity does not exist
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_lead_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::LeadAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values using unknown origin and lead actor
-        let update_entity_property_values_result = update_entity_property_values(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::LeadAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_member_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::MemberAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values using unknown origin and member actor
-        let update_entity_property_values_result = update_entity_property_values(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::MemberAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_curator_group_is_not_active() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(
-            &Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
-            FIRST_CURATOR_ORIGIN,
-        );
-
-        // Make curator group inactive to block it from any entity operations
-        assert_ok!(set_curator_group_status(
-            LEAD_ORIGIN,
-            FIRST_CURATOR_GROUP_ID,
-            false
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values using curator group, which is not active as actor
-        let update_entity_property_values_result = update_entity_property_values(
-            FIRST_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::CuratorGroupIsNotActive,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_curator_auth_failed() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorAuthFailed,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(
-            &Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
-            FIRST_CURATOR_ORIGIN,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values using unknown origin and curator actor
-        let update_entity_property_values_result = update_entity_property_values(
-            UNKNOWN_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::CuratorAuthFailed,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_curator_not_found_in_curator_group() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::CuratorNotFoundInCuratorGroup,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(
-            &Actor::Curator(FIRST_CURATOR_GROUP_ID, FIRST_CURATOR_ID),
-            FIRST_CURATOR_ORIGIN,
-        );
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values using actor in group, which curator id was not added to corresponding group set
-        let update_entity_property_values_result = update_entity_property_values(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::CuratorIsNotAMemberOfGivenCuratorGroup,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_entity_access_denied() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::EntityAccessDenied,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values using actor in group,
-        // using origin, which corresponding actor is neither entity maintainer, nor controller.
-        let update_entity_property_values_result = update_entity_property_values(
-            SECOND_CURATOR_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::EntityAccessDenied,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_locked_on_class_level() {
-    with_test_externalities(|| {
-        let actor = emulate_entity_access_state_for_failure_case(
-            EntityAccessStateFailureType::PropertyValuesLocked,
-        );
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&Actor::Lead, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values using actor in group,
-        // in the case, when all property values were locked on Class level.
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::AllPropertiesWereLockedOnClassLevel,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_is_locked_for_given_actor() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create property
-        let property_type = PropertyType::<ClassId>::vec_reference(FIRST_CLASS_ID, true, 5);
-
-        let mut property = Property::<ClassId>::with_name_and_type(
-            (PropertyNameLengthConstraint::get().max() - 1) as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        property.locking_policy = PropertyLockingPolicy::new(false, true);
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            FIRST_ENTITY_ID,
-            FIRST_ENTITY_ID,
-            FIRST_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values
-        // under lead origin, which is current Entity controller, in the case,
-        // when corresponding class Property was locked from controller on Class level
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::ClassPropertyTypeLockedForGivenActor,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_unknown_entity_property_id() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(SECOND_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values in the case, when Property
-        // under corresponding property id was not added to the current Entity yet
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::UnknownEntityPropertyId,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_prop_value_do_not_match_type() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value = InputPropertyValue::<Runtime>::default();
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values in the case, providing property values,
-        // some of which do not match Class level Property Type
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::PropertyValueDoNotMatchType,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_vec_prop_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-                FIRST_ENTITY_ID;
-                VecMaxLengthConstraint::get() as usize + 1
-            ]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values providing vector property value(s), which
-        // length exceeds VecMaxLengthConstraint.
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::VecPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_text_prop_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        // Create text property
-        let property_type = PropertyType::<ClassId>::single_text(TextMaxLengthConstraint::get());
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let mut schema_property_values = BTreeMap::new();
-
-        let schema_property_value =
-            InputPropertyValue::<Runtime>::single_text(TextMaxLengthConstraint::get());
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::single_text(TextMaxLengthConstraint::get() + 1);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values providing text property value(s), which
-        // length exceeds TextMaxLengthConstraint.
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::TextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_hashed_text_prop_is_too_long() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.to_owned()));
-
-        let hashed_text_max_length_constraint = HashedTextMaxLengthConstraint::get();
-
-        // Create hash property
-        let property_type =
-            PropertyType::<ClassId>::single_text_hash(hashed_text_max_length_constraint);
-
-        let property = Property::<ClassId>::with_name_and_type(
-            PropertyNameLengthConstraint::get().max() as usize,
-            property_type,
-            true,
-            false,
-        );
-
-        // Add Schema to the first Class
-        assert_ok!(add_class_schema(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            BTreeSet::new(),
-            vec![property]
-        ));
-
-        let mut schema_property_values = BTreeMap::new();
-
-        let schema_property_value = InputPropertyValue::<Runtime>::single_text_to_hash(
-            hashed_text_max_length_constraint.unwrap(),
-        );
-
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.clone(),
-            FIRST_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values,
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value = InputPropertyValue::<Runtime>::single_text_to_hash(
-            hashed_text_max_length_constraint.unwrap() + 1,
-        );
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values providing text to hash property value(s), which
-        // length exceeds length exceeds HashedTextMaxLengthConstraint.
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::HashedTextPropertyTooLong,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_referenced_entity_not_found() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-                SECOND_ENTITY_ID;
-                VecMaxLengthConstraint::get() as usize
-            ]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values, providing new property value(s),
-        // some of which refer(s) to another Entity, which does not exist in runtime
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::EntityNotFound,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_referenced_entity_does_not_match_its_class() {
-    with_test_externalities(|| {
-        // Create first class
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Create second class
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the first Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second entity
-        assert_ok!(create_entity(LEAD_ORIGIN, SECOND_CLASS_ID, actor.clone()));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-                SECOND_ENTITY_ID;
-                VecMaxLengthConstraint::get() as usize
-            ]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values, when provided schema new property value(s)
-        // refer(s) Entity, which Class does not match the class in corresponding Class Property
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::ReferencedEntityDoesNotMatchItsClass,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_entity_can_not_be_referenced() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity of first Class
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the first Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity of first Class
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Update second entity permissions to forbid it from being referencable
-        assert_ok!(update_entity_permissions(
-            LEAD_ORIGIN,
-            SECOND_ENTITY_ID,
-            None,
-            Some(false)
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-                SECOND_ENTITY_ID;
-                VecMaxLengthConstraint::get() as usize
-            ]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values, when provided schema new property value(s)
-        // refer(s) to Entity which can not be referenced
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::EntityCanNotBeReferenced,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_same_controller_constraint_violation() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        // Update class permissions to force any member be available to create Entities
-        assert_ok!(update_class_permissions(
-            LEAD_ORIGIN,
-            FIRST_CLASS_ID,
-            Some(true),
-            None,
-            None,
-            None
-        ));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create class reference schema and add corresponding schema support to the first  Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity
-        assert_ok!(create_entity(
-            FIRST_MEMBER_ORIGIN,
-            FIRST_CLASS_ID,
-            Actor::Member(FIRST_MEMBER_ID)
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-                SECOND_ENTITY_ID;
-                VecMaxLengthConstraint::get() as usize
-            ]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values, providing new reference property value(s) in case,
-        // when corresponding Entity can only be referenced from Entity with the same controller.
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            FIRST_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::SameControllerConstraintViolation,
-            number_of_events_before_call,
-        );
-    })
-}
-
-#[test]
-fn update_entity_property_values_property_should_be_unique() {
-    with_test_externalities(|| {
-        // Create class with default permissions
-        assert_ok!(create_simple_class(LEAD_ORIGIN, ClassType::Valid));
-
-        let actor = Actor::Lead;
-
-        // Create first Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        // Create Class reference schema and add corresponding schema support to the first Entity
-        add_unique_class_reference_schema_and_entity_schema_support(&actor, LEAD_ORIGIN);
-
-        // Create second Entity
-        assert_ok!(create_entity(LEAD_ORIGIN, FIRST_CLASS_ID, actor.clone()));
-
-        let schema_property_value = InputPropertyValue::<Runtime>::vec_reference(vec![
-            FIRST_ENTITY_ID,
-            FIRST_ENTITY_ID,
-            FIRST_ENTITY_ID,
-        ]);
-
-        let mut schema_property_values = BTreeMap::new();
-        schema_property_values.insert(FIRST_PROPERTY_ID, schema_property_value);
-
-        // Add schema support to the entity
-        assert_ok!(add_schema_support_to_entity(
-            LEAD_ORIGIN,
-            actor.to_owned(),
-            SECOND_ENTITY_ID,
-            FIRST_SCHEMA_ID,
-            schema_property_values
-        ));
-
-        // Runtime state before tested call
-
-        // Events number before tested call
-        let number_of_events_before_call = System::events().len();
-
-        let mut schema_new_property_values = BTreeMap::new();
-        let schema_new_property_value =
-            InputPropertyValue::<Runtime>::vec_reference(vec![FIRST_ENTITY_ID, FIRST_ENTITY_ID]);
-
-        schema_new_property_values.insert(FIRST_PROPERTY_ID, schema_new_property_value);
-
-        // Make an attempt to update entity property values, providing property value(s), which are identical to thouse,
-        // are already added to the another Entity of this Class, though should be unique on Class Property level
-        let update_entity_property_values_result = update_entity_property_values(
-            LEAD_ORIGIN,
-            actor,
-            SECOND_ENTITY_ID,
-            schema_new_property_values,
-        );
-
-        // Failure checked
-        assert_failure(
-            update_entity_property_values_result,
-            Error::<Runtime>::PropertyValueShouldBeUnique,
-            number_of_events_before_call,
-        );
-    })
-}

+ 2 - 0
runtime-modules/content/Cargo.toml

@@ -12,6 +12,7 @@ system = { package = 'frame-system', default-features = false, git = 'https://gi
 sp-arithmetic = { package = 'sp-arithmetic', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
 codec = { package = 'parity-scale-codec', version = '1.3.1', default-features = false, features = ['derive'] }
 serde = {version = '1.0.101', features = ['derive'], optional = true}
+common = { package = 'pallet-common', default-features = false, path = '../common'}
 
 [dev-dependencies]
 sp-io = { package = 'sp-io', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
@@ -27,4 +28,5 @@ std = [
 	'sp-arithmetic/std',
 	'codec/std',
 	'serde',
+	'common/std'
 ]

+ 0 - 104
runtime-modules/content/lib.rs

@@ -1,104 +0,0 @@
-// Ensure we're `no_std` when compiling for Wasm.
-#![cfg_attr(not(feature = "std"), no_std)]
-#![recursion_limit = "256"]
-
-use core::hash::Hash;
-use core::ops::AddAssign;
-
-use codec::{Codec, Decode, Encode};
-use frame_support::storage::IterableStorageMap;
-
-use frame_support::{
-    decl_event, decl_module, decl_storage,
-    dispatch::{DispatchError, DispatchResult},
-    ensure,
-    traits::Get,
-    Parameter,
-};
-#[cfg(feature = "std")]
-pub use serde::{Deserialize, Serialize};
-use sp_arithmetic::traits::{BaseArithmetic, One, Zero};
-use sp_runtime::traits::{MaybeSerializeDeserialize, Member};
-use sp_std::borrow::ToOwned;
-use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet};
-use sp_std::vec;
-use sp_std::vec::Vec;
-use system::ensure_signed;
-
-/// Module configuration trait for this Substrate module.
-pub trait Trait: system::Trait + ActorAuthenticator + Clone {
-    /// The overarching event type.
-    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
-
-    /// Type of identifier for Videos
-    type VideoId: Parameter
-        + Member
-        + BaseArithmetic
-        + Codec
-        + Default
-        + Copy
-        + Clone
-        + Hash
-        + MaybeSerializeDeserialize
-        + Eq
-        + PartialEq
-        + Ord;
-
-    /// Type of identifier for Channels
-    type ChannelId: Parameter
-        + Member
-        + BaseArithmetic
-        + Codec
-        + Default
-        + Copy
-        + Clone
-        + Hash
-        + MaybeSerializeDeserialize
-        + Eq
-        + PartialEq
-        + Ord;
-
-    // Security/configuration constraints
-
-    /// The maximum number of curators per group constraint
-    type MaxNumberOfCuratorsPerGroup: Get<MaxNumber>;
-}
-
-decl_storage! {
-    trait Store for Module<T: Trait> as Content {
-
-
-    }
-}
-
-decl_module! {
-    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
-        /// Predefined errors
-        type Error = Error<T>;
-
-        /// Initializing events
-        fn deposit_event() = default;
-
-    }
-}
-
-impl<T: Trait> Module<T> {
-
-}
-
-decl_event!(
-    pub enum Event<T>
-    where
-        CuratorGroupId = <T as ActorAuthenticator>::CuratorGroupId,
-        CuratorId = <T as ActorAuthenticator>::CuratorId,
-    {
-
-    }
-);
-
-decl_error! {
-    /// Content directory errors
-    pub enum Error for Module<T: Trait> {
-
-    }
-}

+ 47 - 0
runtime-modules/content/src/errors.rs

@@ -0,0 +1,47 @@
+use crate::*;
+use frame_support::decl_error;
+
+decl_error! {
+    /// Content directory errors
+    pub enum Error for Module<T: Trait> {
+
+        // Curator Management Errors
+        // -------------------------
+
+        /// Curator group can`t be removed
+        CuratorGroupRemovalForbidden,
+
+        /// Curator under provided curator id is not a member of curaror group under given id
+        CuratorIsNotAMemberOfGivenCuratorGroup,
+
+        /// Curator under provided curator id is already a member of curaror group under given id
+        CuratorIsAlreadyAMemberOfGivenCuratorGroup,
+
+        /// Given curator group does not exist
+        CuratorGroupDoesNotExist,
+
+        /// Max number of curators per group limit reached
+        CuratorsPerGroupLimitReached,
+
+        /// Curator group is not active
+        CuratorGroupIsNotActive,
+
+        // Authentication Errors
+        // ---------------------
+
+        /// Origin cannot be made into raw origin
+        OriginCanNotBeMadeIntoRawOrigin,
+
+        /// Lead authentication failed
+        LeadAuthFailed,
+
+        /// Member authentication failed
+        MemberAuthFailed,
+
+        /// Curator authentication failed
+        CuratorAuthFailed,
+
+        /// Expected root or signed origin
+        BadOrigin,
+    }
+}

+ 1140 - 0
runtime-modules/content/src/lib.rs

@@ -0,0 +1,1140 @@
+// Ensure we're `no_std` when compiling for Wasm.
+#![cfg_attr(not(feature = "std"), no_std)]
+#![recursion_limit = "256"]
+
+// #[cfg(test)]
+// mod tests;
+
+mod errors;
+mod permissions;
+
+pub use errors::*;
+pub use permissions::*;
+
+use core::hash::Hash;
+
+use codec::Codec;
+use codec::{Decode, Encode};
+
+use frame_support::{
+    decl_event, decl_module, decl_storage, dispatch::DispatchResult, ensure, traits::Get, Parameter,
+};
+#[cfg(feature = "std")]
+pub use serde::{Deserialize, Serialize};
+use sp_arithmetic::traits::{BaseArithmetic, One, Zero};
+use sp_runtime::traits::{MaybeSerializeDeserialize, Member};
+use sp_std::collections::btree_set::BTreeSet;
+// use sp_std::vec;
+use sp_std::vec::Vec;
+use system::ensure_signed;
+
+pub use common::storage::{ContentParameters as ContentParametersRecord, StorageSystem};
+pub use common::{
+    currency::{BalanceOf, GovernanceCurrency},
+    MembershipTypes, StorageOwnership, Url,
+};
+
+pub(crate) type ContentId<T> = <T as StorageOwnership>::ContentId;
+
+pub(crate) type DataObjectTypeId<T> = <T as StorageOwnership>::DataObjectTypeId;
+
+pub(crate) type ContentParameters<T> = ContentParametersRecord<ContentId<T>, DataObjectTypeId<T>>;
+
+/// Type, used in diffrent numeric constraints representations
+pub type MaxNumber = u32;
+
+/// A numeric identifier trait
+pub trait NumericIdentifier:
+    Parameter
+    + Member
+    + BaseArithmetic
+    + Codec
+    + Default
+    + Copy
+    + Clone
+    + Hash
+    + MaybeSerializeDeserialize
+    + Eq
+    + PartialEq
+    + Ord
+    + Zero
+{
+}
+
+impl NumericIdentifier for u64 {}
+
+/// Module configuration trait for Content Directory Module
+pub trait Trait:
+    system::Trait
+    + ContentActorAuthenticator
+    + Clone
+    + StorageOwnership
+    + MembershipTypes
+    + GovernanceCurrency
+{
+    /// The overarching event type.
+    type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
+
+    /// Channel Transfer Payments Escrow Account seed for ModuleId to compute deterministic AccountId
+    type ChannelOwnershipPaymentEscrowId: Get<[u8; 8]>;
+
+    /// Type of identifier for Videos
+    type VideoId: NumericIdentifier;
+
+    /// Type of identifier for Video Categories
+    type VideoCategoryId: NumericIdentifier;
+
+    /// Type of identifier for Channel Categories
+    type ChannelCategoryId: NumericIdentifier;
+
+    /// Type of identifier for Playlists
+    type PlaylistId: NumericIdentifier;
+
+    /// Type of identifier for Persons
+    type PersonId: NumericIdentifier;
+
+    /// Type of identifier for Channels
+    type SeriesId: NumericIdentifier;
+
+    /// Type of identifier for Channel transfer requests
+    type ChannelOwnershipTransferRequestId: NumericIdentifier;
+
+    /// The maximum number of curators per group constraint
+    type MaxNumberOfCuratorsPerGroup: Get<MaxNumber>;
+
+    // Type that handles asset uploads to storage system
+    type StorageSystem: StorageSystem<Self>;
+}
+
+/// Specifies how a new asset will be provided on creating and updating
+/// Channels, Videos, Series and Person
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub enum NewAsset<ContentParameters> {
+    /// Upload to the storage system
+    Upload(ContentParameters),
+    /// Multiple url strings pointing at an asset
+    Urls(Vec<Url>),
+}
+
+/// The owner of a channel, is the authorized "actor" that can update
+/// or delete or transfer a channel and its contents.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub enum ChannelOwner<MemberId, CuratorGroupId, DAOId> {
+    /// A Member owns the channel
+    Member(MemberId),
+    /// A specific curation group owns the channel
+    CuratorGroup(CuratorGroupId),
+    // Native DAO owns the channel
+    Dao(DAOId),
+}
+
+// Default trait implemented only because its used in a Channel which needs to implement a Default trait
+// since it is a StorageValue.
+impl<MemberId: Default, CuratorGroupId, DAOId> Default
+    for ChannelOwner<MemberId, CuratorGroupId, DAOId>
+{
+    fn default() -> Self {
+        ChannelOwner::Member(MemberId::default())
+    }
+}
+
+/// A category which channels can belong to.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct ChannelCategory {
+    // No runtime information is currently stored for a Category.
+}
+
+/// Information on the category being created.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct ChannelCategoryCreationParameters {
+    /// Metadata for the category.
+    meta: Vec<u8>,
+}
+
+/// Information on the category being updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct ChannelCategoryUpdateParameters {
+    // as this is the only field it is not an Option
+    /// Metadata update for the category.
+    new_meta: Vec<u8>,
+}
+
+/// Type representing an owned channel which videos, playlists, and series can belong to.
+/// If a channel is deleted, all videos, playlists and series will also be deleted.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct ChannelRecord<MemberId, CuratorGroupId, DAOId, AccountId, VideoId, PlaylistId, SeriesId>
+{
+    /// The owner of a channel
+    owner: ChannelOwner<MemberId, CuratorGroupId, DAOId>,
+    /// The videos under this channel
+    videos: Vec<VideoId>,
+    /// The playlists under this channel
+    playlists: Vec<PlaylistId>,
+    /// The series under this channel
+    series: Vec<SeriesId>,
+    /// If curators have censored this channel or not
+    is_censored: bool,
+    /// Reward account where revenue is sent if set.
+    reward_account: Option<AccountId>,
+}
+
+// Channel alias type for simplification.
+pub type Channel<T> = ChannelRecord<
+    <T as MembershipTypes>::MemberId,
+    <T as ContentActorAuthenticator>::CuratorGroupId,
+    <T as StorageOwnership>::DAOId,
+    <T as system::Trait>::AccountId,
+    <T as Trait>::VideoId,
+    <T as Trait>::PlaylistId,
+    <T as Trait>::SeriesId,
+>;
+
+/// A request to buy a channel by a new ChannelOwner.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct ChannelOwnershipTransferRequestRecord<
+    ChannelId,
+    MemberId,
+    CuratorGroupId,
+    DAOId,
+    Balance,
+    AccountId,
+> {
+    channel_id: ChannelId,
+    new_owner: ChannelOwner<MemberId, CuratorGroupId, DAOId>,
+    payment: Balance,
+    new_reward_account: Option<AccountId>,
+}
+
+// ChannelOwnershipTransferRequest type alias for simplification.
+pub type ChannelOwnershipTransferRequest<T> = ChannelOwnershipTransferRequestRecord<
+    <T as StorageOwnership>::ChannelId,
+    <T as MembershipTypes>::MemberId,
+    <T as ContentActorAuthenticator>::CuratorGroupId,
+    <T as StorageOwnership>::DAOId,
+    BalanceOf<T>,
+    <T as system::Trait>::AccountId,
+>;
+
+/// Information about channel being created.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub struct ChannelCreationParameters<ContentParameters> {
+    /// Assets referenced by metadata
+    assets: Vec<NewAsset<ContentParameters>>,
+    /// Metadata about the channel.
+    meta: Vec<u8>,
+}
+
+/// Information about channel being updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct ChannelUpdateParameters<ContentParameters> {
+    /// Assets referenced by metadata
+    assets: Option<Vec<NewAsset<ContentParameters>>>,
+    /// If set, metadata update for the channel.
+    new_meta: Option<Vec<u8>>,
+}
+
+/// A category that videos can belong to.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct VideoCategory {
+    // No runtime information is currently stored for a Category.
+}
+
+/// Information about the video category being created.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct VideoCategoryCreationParameters {
+    /// Metadata about the video category.
+    meta: Vec<u8>,
+}
+
+/// Information about the video category being updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct VideoCategoryUpdateParameters {
+    // Because it is the only field it is not an Option
+    /// Metadata update for the video category.
+    new_meta: Vec<u8>,
+}
+
+/// Information about the video being created.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub struct VideoCreationParameters<ContentParameters> {
+    /// Assets referenced by metadata
+    assets: Vec<NewAsset<ContentParameters>>,
+    /// Metadata for the video.
+    meta: Vec<u8>,
+}
+
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct VideoUpdateParameters<ContentParameters> {
+    /// Assets referenced by metadata
+    assets: Option<Vec<NewAsset<ContentParameters>>>,
+    /// If set, metadata update for the video.
+    new_meta: Option<Vec<u8>>,
+}
+
+/// A video which belongs to a channel. A video may be part of a series or playlist.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct Video<ChannelId, SeriesId> {
+    in_channel: ChannelId,
+    // keep track of which season the video is in if it is an 'episode'
+    // - prevent removing a video if it is in a season (because order is important)
+    in_series: Option<SeriesId>,
+    /// Whether the curators have censored the video or not.
+    is_censored: bool,
+    /// Whether the curators have chosen to feature the video or not.
+    is_featured: bool,
+}
+
+/// Information about the plyalist being created.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct PlaylistCreationParameters {
+    /// Metadata about the playlist.
+    meta: Vec<u8>,
+}
+
+/// Information about the playlist being updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct PlaylistUpdateParameters {
+    // It is the only field so its not an Option
+    /// Metadata update for the playlist.
+    new_meta: Vec<u8>,
+}
+
+/// A playlist is an ordered collection of videos.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct Playlist<ChannelId> {
+    /// The channel the playlist belongs to.
+    in_channel: ChannelId,
+}
+
+/// Information about the episode being created or updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub enum EpisodeParameters<VideoId, ContentParameters> {
+    /// A new video is being added as the episode.
+    NewVideo(VideoCreationParameters<ContentParameters>),
+    /// An existing video is being made into an episode.
+    ExistingVideo(VideoId),
+}
+
+/// Information about the season being created or updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct SeasonParameters<VideoId, ContentParameters> {
+    /// Season assets referenced by metadata
+    assets: Option<Vec<NewAsset<ContentParameters>>>,
+    // ?? It might just be more straighforward to always provide full list of episodes at cost of larger tx.
+    /// If set, updates the episodes of a season. Extends the number of episodes in a season
+    /// when length of new_episodes is greater than previously set. Last elements must all be
+    /// 'Some' in that case.
+    /// Will truncate existing season when length of new_episodes is less than previously set.
+    episodes: Option<Vec<Option<EpisodeParameters<VideoId, ContentParameters>>>>,
+    /// If set, Metadata update for season.
+    meta: Option<Vec<u8>>,
+}
+
+/// Information about the series being created or updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct SeriesParameters<VideoId, ContentParameters> {
+    /// Series assets referenced by metadata
+    assets: Option<Vec<NewAsset<ContentParameters>>>,
+    // ?? It might just be more straighforward to always provide full list of seasons at cost of larger tx.
+    /// If set, updates the seasons of a series. Extend a series when length of seasons is
+    /// greater than previoulsy set. Last elements must all be 'Some' in that case.
+    /// Will truncate existing series when length of seasons is less than previously set.
+    seasons: Option<Vec<Option<SeasonParameters<VideoId, ContentParameters>>>>,
+    meta: Option<Vec<u8>>,
+}
+
+/// A season is an ordered list of videos (episodes).
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct Season<VideoId> {
+    episodes: Vec<VideoId>,
+}
+
+/// A series is an ordered list of seasons that belongs to a channel.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct Series<ChannelId, VideoId> {
+    in_channel: ChannelId,
+    seasons: Vec<Season<VideoId>>,
+}
+
+// The actor the caller/origin is trying to act as for Person creation and update and delete calls.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub enum PersonActor<MemberId, CuratorId> {
+    Member(MemberId),
+    Curator(CuratorId),
+}
+
+/// The authorized actor that may update or delete a Person.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub enum PersonController<MemberId> {
+    /// Member controls the person
+    Member(MemberId),
+    /// Any curator controls the person
+    Curators,
+}
+
+// Default trait implemented only because its used in Person which needs to implement a Default trait
+// since it is a StorageValue.
+impl<MemberId: Default> Default for PersonController<MemberId> {
+    fn default() -> Self {
+        PersonController::Member(MemberId::default())
+    }
+}
+
+/// Information for Person being created.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Clone, PartialEq, Eq, Debug)]
+pub struct PersonCreationParameters<ContentParameters> {
+    /// Assets referenced by metadata
+    assets: Vec<NewAsset<ContentParameters>>,
+    /// Metadata for person.
+    meta: Vec<u8>,
+}
+
+/// Information for Persion being updated.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct PersonUpdateParameters<ContentParameters> {
+    /// Assets referenced by metadata
+    assets: Option<Vec<NewAsset<ContentParameters>>>,
+    /// Metadata to update person.
+    new_meta: Option<Vec<u8>>,
+}
+
+/// A Person represents a real person that may be associated with a video.
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Default, Clone, PartialEq, Eq, Debug)]
+pub struct Person<MemberId> {
+    /// Who can update or delete this person.
+    controlled_by: PersonController<MemberId>,
+}
+
+decl_storage! {
+    trait Store for Module<T: Trait> as Content {
+        pub ChannelById get(fn channel_by_id): map hasher(blake2_128_concat) T::ChannelId => Channel<T>;
+
+        pub ChannelCategoryById get(fn channel_category_by_id): map hasher(blake2_128_concat) T::ChannelCategoryId => ChannelCategory;
+
+        pub VideoById get(fn video_by_id): map hasher(blake2_128_concat) T::VideoId => Video<T::ChannelId, T::SeriesId>;
+
+        pub VideoCategoryById get(fn video_category_by_id): map hasher(blake2_128_concat) T::VideoCategoryId => VideoCategory;
+
+        pub PlaylistById get(fn playlist_by_id): map hasher(blake2_128_concat) T::PlaylistId => Playlist<T::ChannelId>;
+
+        pub SeriesById get(fn series_by_id): map hasher(blake2_128_concat) T::SeriesId => Series<T::ChannelId, T::VideoId>;
+
+        pub PersonById get(fn person_by_id): map hasher(blake2_128_concat) T::PersonId => Person<T::MemberId>;
+
+        pub ChannelOwnershipTransferRequestById get(fn channel_ownership_transfer_request_by_id):
+            map hasher(blake2_128_concat) T::ChannelOwnershipTransferRequestId => ChannelOwnershipTransferRequest<T>;
+
+        pub NextChannelCategoryId get(fn next_channel_category_id) config(): T::ChannelCategoryId;
+
+        pub NextChannelId get(fn next_channel_id) config(): T::ChannelId;
+
+        pub NextVideoCategoryId get(fn next_video_category_id) config(): T::VideoCategoryId;
+
+        pub NextVideoId get(fn next_video_id) config(): T::VideoId;
+
+        pub NextPlaylistId get(fn next_playlist_id) config(): T::PlaylistId;
+
+        pub NextPersonId get(fn next_person_id) config(): T::PersonId;
+
+        pub NextSeriesId get(fn next_series_id) config(): T::SeriesId;
+
+        pub NextChannelOwnershipTransferRequestId get(fn next_channel_transfer_request_id) config(): T::ChannelOwnershipTransferRequestId;
+
+        pub NextCuratorGroupId get(fn next_curator_group_id) config(): T::CuratorGroupId;
+
+        /// Map, representing  CuratorGroupId -> CuratorGroup relation
+        pub CuratorGroupById get(fn curator_group_by_id): map hasher(blake2_128_concat) T::CuratorGroupId => CuratorGroup<T>;
+    }
+}
+
+decl_module! {
+    pub struct Module<T: Trait> for enum Call where origin: T::Origin {
+        /// Predefined errors
+        type Error = Error<T>;
+
+        /// Initializing events
+        fn deposit_event() = default;
+
+        /// Exports const -  max number of curators per group
+        const MaxNumberOfCuratorsPerGroup: MaxNumber = T::MaxNumberOfCuratorsPerGroup::get();
+
+        // ======
+        // Next set of extrinsics can only be invoked by lead.
+        // ======
+
+        /// Add new curator group to runtime storage
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_curator_group(
+            origin,
+        ) -> DispatchResult {
+
+            // Ensure given origin is lead
+            ensure_is_lead::<T>(origin)?;
+
+            //
+            // == MUTATION SAFE ==
+            //
+
+            let curator_group_id = Self::next_curator_group_id();
+
+            // Insert empty curator group with `active` parameter set to false
+            <CuratorGroupById<T>>::insert(curator_group_id, CuratorGroup::<T>::default());
+
+            // Increment the next curator curator_group_id:
+            <NextCuratorGroupId<T>>::mutate(|n| *n += T::CuratorGroupId::one());
+
+            // Trigger event
+            Self::deposit_event(RawEvent::CuratorGroupCreated(curator_group_id));
+            Ok(())
+        }
+
+        /// Remove curator group under given `curator_group_id` from runtime storage
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_curator_group(
+            origin,
+            curator_group_id: T::CuratorGroupId,
+        ) -> DispatchResult {
+
+            // Ensure given origin is lead
+            ensure_is_lead::<T>(origin)?;
+
+            // Ensure CuratorGroup under given curator_group_id exists
+            let curator_group = Self::ensure_curator_group_exists(&curator_group_id)?;
+
+            // We should previously ensure that curator_group  owns no channels to be able to remove it
+            curator_group.ensure_curator_group_owns_no_channels()?;
+
+            //
+            // == MUTATION SAFE ==
+            //
+
+
+            // Remove curator group under given curator group id from runtime storage
+            <CuratorGroupById<T>>::remove(curator_group_id);
+
+            // Trigger event
+            Self::deposit_event(RawEvent::CuratorGroupDeleted(curator_group_id));
+            Ok(())
+        }
+
+        /// Set `is_active` status for curator group under given `curator_group_id`
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn set_curator_group_status(
+            origin,
+            curator_group_id: T::CuratorGroupId,
+            is_active: bool,
+        ) -> DispatchResult {
+
+            // Ensure given origin is lead
+            ensure_is_lead::<T>(origin)?;
+
+            // Ensure curator group under provided curator_group_id already exist
+            Self::ensure_curator_group_under_given_id_exists(&curator_group_id)?;
+
+            //
+            // == MUTATION SAFE ==
+            //
+
+            // Set `is_active` status for curator group under given `curator_group_id`
+            <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
+                curator_group.set_status(is_active)
+            });
+
+            // Trigger event
+            Self::deposit_event(RawEvent::CuratorGroupStatusSet(curator_group_id, is_active));
+            Ok(())
+        }
+
+        /// Add curator to curator group under given `curator_group_id`
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn add_curator_to_group(
+            origin,
+            curator_group_id: T::CuratorGroupId,
+            curator_id: T::CuratorId,
+        ) -> DispatchResult {
+
+            // Ensure given origin is lead
+            ensure_is_lead::<T>(origin)?;
+
+            // Ensure curator group under provided curator_group_id already exist, retrieve corresponding one
+            let curator_group = Self::ensure_curator_group_exists(&curator_group_id)?;
+
+            // Ensure max number of curators per group limit not reached yet
+            curator_group.ensure_max_number_of_curators_limit_not_reached()?;
+
+            // Ensure curator under provided curator_id isn`t a CuratorGroup member yet
+            curator_group.ensure_curator_in_group_does_not_exist(&curator_id)?;
+
+            //
+            // == MUTATION SAFE ==
+            //
+
+            // Insert curator_id into curator_group under given curator_group_id
+            <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
+                curator_group.get_curators_mut().insert(curator_id);
+            });
+
+            // Trigger event
+            Self::deposit_event(RawEvent::CuratorAdded(curator_group_id, curator_id));
+            Ok(())
+        }
+
+        /// Remove curator from a given curator group
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn remove_curator_from_group(
+            origin,
+            curator_group_id: T::CuratorGroupId,
+            curator_id: T::CuratorId,
+        ) -> DispatchResult {
+
+            // Ensure given origin is lead
+            ensure_is_lead::<T>(origin)?;
+
+            // Ensure curator group under provided curator_group_id already exist, retrieve corresponding one
+            let curator_group = Self::ensure_curator_group_exists(&curator_group_id)?;
+
+            // Ensure curator under provided curator_id is CuratorGroup member
+            curator_group.ensure_curator_in_group_exists(&curator_id)?;
+
+            //
+            // == MUTATION SAFE ==
+            //
+
+            // Remove curator_id from curator_group under given curator_group_id
+            <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
+                curator_group.get_curators_mut().remove(&curator_id);
+            });
+
+            // Trigger event
+            Self::deposit_event(RawEvent::CuratorRemoved(curator_group_id, curator_id));
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_channel(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            params: ChannelCreationParameters<ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn update_channel(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+            params: ChannelUpdateParameters<ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_channel(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn request_channel_transfer(
+            origin,
+            new_owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+            payment: BalanceOf<T>,
+        ) -> DispatchResult {
+            // requester must be new_owner
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn cancel_channel_transfer_request(
+            origin,
+            request_id: T::ChannelOwnershipTransferRequestId,
+        ) -> DispatchResult {
+            // origin must be original requester (ie. proposed new channel owner)
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn accept_channel_transfer(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            request_id: T::ChannelOwnershipTransferRequestId,
+        ) -> DispatchResult {
+            // only current owner of channel can approve
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_video(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+            params: VideoCreationParameters<ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn update_video(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            video: T::VideoId,
+            params: VideoUpdateParameters<ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_video(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            video: T::VideoId,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_playlist(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+            params: PlaylistCreationParameters,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn update_playlist(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            playlist: T::PlaylistId,
+            params: PlaylistUpdateParameters,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_playlist(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+            playlist: T::PlaylistId,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn set_featured_videos(
+            origin,
+            list: Vec<T::VideoId>
+        ) -> DispatchResult {
+            // can only be set by lead
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_video_category(
+            origin,
+            curator: T::CuratorId,
+            params: VideoCategoryCreationParameters,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn update_video_category(
+            origin,
+            curator: T::CuratorId,
+            category: T::VideoCategoryId,
+            params: VideoCategoryUpdateParameters,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_video_category(
+            origin,
+            curator: T::CuratorId,
+            category: T::VideoCategoryId,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_channel_category(
+            origin,
+            curator: T::CuratorId,
+            params: ChannelCategoryCreationParameters,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn update_channel_category(
+            origin,
+            curator: T::CuratorId,
+            category: T::ChannelCategoryId,
+            params: ChannelCategoryUpdateParameters,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_channel_category(
+            origin,
+            curator: T::CuratorId,
+            category: T::ChannelCategoryId,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_person(
+            origin,
+            actor: PersonActor<T::MemberId, T::CuratorId>,
+            params: PersonCreationParameters<ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn update_person(
+            origin,
+            actor: PersonActor<T::MemberId, T::CuratorId>,
+            person: T::PersonId,
+            params: PersonUpdateParameters<ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_person(
+            origin,
+            actor: PersonActor<T::MemberId, T::CuratorId>,
+            person: T::PersonId,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn add_person_to_video(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            video_id: T::VideoId,
+            person: T::PersonId
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn remove_person_from_video(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            video_id: T::VideoId
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn censor_video(
+            origin,
+            curator_id: T::CuratorId,
+            video_id: T::VideoId,
+            rationale: Vec<u8>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn censor_channel(
+            origin,
+            curator_id: T::CuratorId,
+            channel_id: T::ChannelId,
+            rationale: Vec<u8>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn uncensor_video(
+            origin,
+            curator_id: T::CuratorId,
+            video_id: T::VideoId,
+            rationale: Vec<u8>
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn uncensor_channel(
+            origin,
+            curator_id: T::CuratorId,
+            channel_id: T::ChannelId,
+            rationale: Vec<u8>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn create_series(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+            params: SeriesParameters<T::VideoId, ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn update_series(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            channel_id: T::ChannelId,
+            params: SeriesParameters<T::VideoId, ContentParameters<T>>,
+        ) -> DispatchResult {
+            Ok(())
+        }
+
+        #[weight = 10_000_000] // TODO: adjust weight
+        pub fn delete_series(
+            origin,
+            owner: ChannelOwner<T::MemberId, T::CuratorGroupId, T::DAOId>,
+            series: T::SeriesId,
+        ) -> DispatchResult {
+            Ok(())
+        }
+    }
+}
+
+impl<T: Trait> Module<T> {
+    // TODO: make this private again after used in module
+    /// Increment number of channels, maintained by each curator group
+    pub fn increment_number_of_channels_owned_by_curator_groups(
+        curator_group_ids: BTreeSet<T::CuratorGroupId>,
+    ) {
+        curator_group_ids.into_iter().for_each(|curator_group_id| {
+            Self::increment_number_of_channels_owned_by_curator_group(curator_group_id);
+        });
+    }
+
+    // TODO: make this private again after used in module
+    /// Decrement number of channels, maintained by each curator group
+    pub fn decrement_number_of_channels_owned_by_curator_groups(
+        curator_group_ids: BTreeSet<T::CuratorGroupId>,
+    ) {
+        curator_group_ids.into_iter().for_each(|curator_group_id| {
+            Self::decrement_number_of_channels_owned_by_curator_group(curator_group_id);
+        });
+    }
+
+    // TODO: make this private again after used in module
+    /// Increment number of channels, maintained by curator group
+    pub fn increment_number_of_channels_owned_by_curator_group(
+        curator_group_id: T::CuratorGroupId,
+    ) {
+        <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
+            curator_group.increment_number_of_channels_owned_count();
+        });
+    }
+
+    // TODO: make this private again after used in module
+    /// Decrement number of channels, maintained by curator group
+    pub fn decrement_number_of_channels_owned_by_curator_group(
+        curator_group_id: T::CuratorGroupId,
+    ) {
+        <CuratorGroupById<T>>::mutate(curator_group_id, |curator_group| {
+            curator_group.decrement_number_of_channels_owned_count();
+        });
+    }
+
+    /// Ensure `CuratorGroup` under given id exists
+    pub fn ensure_curator_group_under_given_id_exists(
+        curator_group_id: &T::CuratorGroupId,
+    ) -> Result<(), Error<T>> {
+        ensure!(
+            <CuratorGroupById<T>>::contains_key(curator_group_id),
+            Error::<T>::CuratorGroupDoesNotExist
+        );
+        Ok(())
+    }
+
+    /// Ensure `CuratorGroup` under given id exists, return corresponding one
+    pub fn ensure_curator_group_exists(
+        curator_group_id: &T::CuratorGroupId,
+    ) -> Result<CuratorGroup<T>, Error<T>> {
+        Self::ensure_curator_group_under_given_id_exists(curator_group_id)?;
+        Ok(Self::curator_group_by_id(curator_group_id))
+    }
+
+    /// Ensure all `CuratorGroup`'s under given ids exist
+    pub fn ensure_curator_groups_exist(
+        curator_groups: &BTreeSet<T::CuratorGroupId>,
+    ) -> Result<(), Error<T>> {
+        for curator_group in curator_groups {
+            // Ensure CuratorGroup under given id exists
+            Self::ensure_curator_group_exists(curator_group)?;
+        }
+        Ok(())
+    }
+}
+
+// Some initial config for the module on runtime upgrade
+impl<T: Trait> Module<T> {
+    pub fn on_runtime_upgrade() {
+        <NextChannelCategoryId<T>>::put(T::ChannelCategoryId::one());
+        <NextVideoCategoryId<T>>::put(T::VideoCategoryId::one());
+        <NextVideoId<T>>::put(T::VideoId::one());
+        <NextChannelId<T>>::put(T::ChannelId::one());
+        <NextPlaylistId<T>>::put(T::PlaylistId::one());
+        <NextSeriesId<T>>::put(T::SeriesId::one());
+        <NextPersonId<T>>::put(T::PersonId::one());
+        <NextChannelOwnershipTransferRequestId<T>>::put(T::ChannelOwnershipTransferRequestId::one());
+    }
+}
+
+decl_event!(
+    pub enum Event<T>
+    where
+        CuratorGroupId = <T as ContentActorAuthenticator>::CuratorGroupId,
+        CuratorId = <T as ContentActorAuthenticator>::CuratorId,
+        VideoId = <T as Trait>::VideoId,
+        VideoCategoryId = <T as Trait>::VideoCategoryId,
+        ChannelId = <T as StorageOwnership>::ChannelId,
+        MemberId = <T as MembershipTypes>::MemberId,
+        NewAsset = NewAsset<ContentParameters<T>>,
+        ChannelCategoryId = <T as Trait>::ChannelCategoryId,
+        ChannelOwnershipTransferRequestId = <T as Trait>::ChannelOwnershipTransferRequestId,
+        PlaylistId = <T as Trait>::PlaylistId,
+        SeriesId = <T as Trait>::SeriesId,
+        PersonId = <T as Trait>::PersonId,
+        DAOId = <T as StorageOwnership>::DAOId,
+        ChannelOwnershipTransferRequest = ChannelOwnershipTransferRequest<T>,
+        Series = Series<<T as StorageOwnership>::ChannelId, <T as Trait>::VideoId>,
+        ContentParameters = ContentParameters<T>,
+    {
+        // Curators
+        CuratorGroupCreated(CuratorGroupId),
+        CuratorGroupDeleted(CuratorGroupId),
+        CuratorGroupStatusSet(CuratorGroupId, bool /* active status */),
+        CuratorAdded(CuratorGroupId, CuratorId),
+        CuratorRemoved(CuratorGroupId, CuratorId),
+
+        // Channels
+        ChannelCreated(
+            ChannelId,
+            ChannelOwner<MemberId, CuratorGroupId, DAOId>,
+            Vec<NewAsset>,
+            ChannelCreationParameters<ContentParameters>,
+        ),
+        ChannelUpdated(
+            ChannelId,
+            Vec<NewAsset>,
+            ChannelUpdateParameters<ContentParameters>,
+        ),
+        ChannelDeleted(ChannelId),
+
+        ChannelCensored(ChannelId, Vec<u8> /* rationale */),
+        ChannelUncensored(ChannelId, Vec<u8> /* rationale */),
+
+        // Channel Ownership Transfers
+        ChannelOwnershipTransferRequested(
+            ChannelOwnershipTransferRequestId,
+            ChannelOwnershipTransferRequest,
+        ),
+        ChannelOwnershipTransferRequestWithdrawn(ChannelOwnershipTransferRequestId),
+        ChannelOwnershipTransferred(ChannelOwnershipTransferRequestId),
+
+        // Channel Categories
+        ChannelCategoryCreated(ChannelCategoryId, ChannelCategoryCreationParameters),
+        ChannelCategoryUpdated(ChannelCategoryUpdateParameters),
+        ChannelCategoryDeleted(ChannelCategoryId),
+
+        // Videos
+        VideoCategoryCreated(VideoCategoryId, VideoCategoryCreationParameters),
+        VideoCategoryUpdated(VideoCategoryId, VideoCategoryUpdateParameters),
+        VideoCategoryDeleted(VideoCategoryId),
+
+        VideoCreated(
+            VideoId,
+            Vec<NewAsset>,
+            VideoCreationParameters<ContentParameters>,
+        ),
+        VideoUpdated(
+            VideoId,
+            Vec<NewAsset>,
+            VideoUpdateParameters<ContentParameters>,
+        ),
+        VideoDeleted(VideoId),
+
+        VideoCensored(VideoId, Vec<u8> /* rationale */),
+        VideoUncensored(VideoId, Vec<u8> /* rationale */),
+
+        // Featured Videos
+        FeaturedVideosSet(Vec<VideoId>),
+
+        // Video Playlists
+        PlaylistCreated(PlaylistId, PlaylistCreationParameters),
+        PlaylistUpdated(PlaylistId, PlaylistUpdateParameters),
+        PlaylistDeleted(PlaylistId),
+
+        // Series
+        SeriesCreated(
+            SeriesId,
+            Vec<NewAsset>,
+            SeriesParameters<VideoId, ContentParameters>,
+            Series,
+        ),
+        SeriesUpdated(
+            SeriesId,
+            Vec<NewAsset>,
+            SeriesParameters<VideoId, ContentParameters>,
+            Series,
+        ),
+        SeriesDeleted(SeriesId),
+
+        // Persons
+        PersonCreated(
+            PersonId,
+            Vec<NewAsset>,
+            PersonCreationParameters<ContentParameters>,
+        ),
+        PersonUpdated(
+            PersonId,
+            Vec<NewAsset>,
+            PersonUpdateParameters<ContentParameters>,
+        ),
+        PersonDeleted(PersonId),
+    }
+);

+ 16 - 16
runtime-modules/content-directory/src/permissions/curator_group.rs → runtime-modules/content/src/permissions/curator_group.rs

@@ -1,8 +1,8 @@
 use super::*;
 
 /// A group, that consists of `curators` set
-#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))]
-#[derive(Encode, Decode, Eq, PartialEq, Clone)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+#[derive(Encode, Decode, Eq, PartialEq, Clone, Debug)]
 pub struct CuratorGroup<T: Trait> {
     /// Curators set, associated with a iven curator group
     curators: BTreeSet<T::CuratorId>,
@@ -10,8 +10,8 @@ pub struct CuratorGroup<T: Trait> {
     /// When `false`, curator in a given group is forbidden to act
     active: bool,
 
-    /// Used to count the number of `Class`(es), given curator group maintains
-    number_of_classes_maintained: u32,
+    /// Used to count the number of Channels, given curator group owns
+    number_of_channels_owned: u32,
 }
 
 impl<T: Trait> Default for CuratorGroup<T> {
@@ -20,7 +20,7 @@ impl<T: Trait> Default for CuratorGroup<T> {
             curators: BTreeSet::new(),
             // default curator group status right after creation
             active: false,
-            number_of_classes_maintained: 0,
+            number_of_channels_owned: 0,
         }
     }
 }
@@ -36,8 +36,8 @@ impl<T: Trait> CuratorGroup<T> {
         self.active
     }
 
-    pub fn get_number_of_classes_maintained(&self) -> u32 {
-        self.number_of_classes_maintained
+    pub fn get_number_of_channels_owned(&self) -> u32 {
+        self.number_of_channels_owned
     }
 
     /// Set `CuratorGroup` status as provided
@@ -55,20 +55,20 @@ impl<T: Trait> CuratorGroup<T> {
         &mut self.curators
     }
 
-    /// Increment number of classes `CuratorGroup` maintains
-    pub fn increment_number_of_classes_maintained_count(&mut self) {
-        self.number_of_classes_maintained += 1;
+    /// Increment number of channels `CuratorGroup` owns
+    pub fn increment_number_of_channels_owned_count(&mut self) {
+        self.number_of_channels_owned += 1;
     }
 
-    /// Decrement number of classes `CuratorGroup` maintains
-    pub fn decrement_number_of_classes_maintained_count(&mut self) {
-        self.number_of_classes_maintained -= 1;
+    /// Decrement number of channels `CuratorGroup` owns
+    pub fn decrement_number_of_channels_owned_count(&mut self) {
+        self.number_of_channels_owned -= 1;
     }
 
-    /// Ensure curator group does not maintain any `Class`
-    pub fn ensure_curator_group_maintains_no_classes(&self) -> Result<(), Error<T>> {
+    /// Ensure curator group does not maintain any `Channel`
+    pub fn ensure_curator_group_owns_no_channels(&self) -> Result<(), Error<T>> {
         ensure!(
-            self.number_of_classes_maintained == 0,
+            self.number_of_channels_owned == 0,
             Error::<T>::CuratorGroupRemovalForbidden
         );
         Ok(())

+ 2 - 20
runtime-modules/content-directory/src/permissions.rs → runtime-modules/content/src/permissions/mod.rs

@@ -1,16 +1,11 @@
-mod class;
 mod curator_group;
-mod entity;
-mod entity_creation_voucher;
 
-pub use class::*;
 pub use curator_group::*;
-pub use entity::*;
-pub use entity_creation_voucher::*;
 
 pub use crate::errors::*;
 use crate::*;
 pub use codec::{Codec, Decode, Encode};
+pub use common::MembershipTypes;
 use core::fmt::Debug;
 use frame_support::{ensure, Parameter};
 #[cfg(feature = "std")]
@@ -19,7 +14,7 @@ use sp_arithmetic::traits::BaseArithmetic;
 use sp_runtime::traits::{MaybeSerializeDeserialize, Member};
 
 /// Model of authentication manager.
-pub trait ActorAuthenticator: system::Trait {
+pub trait ContentActorAuthenticator: system::Trait + MembershipTypes {
     /// Curator identifier
     type CuratorId: Parameter
         + Member
@@ -33,19 +28,6 @@ pub trait ActorAuthenticator: system::Trait {
         + PartialEq
         + Ord;
 
-    /// Member identifier
-    type MemberId: Parameter
-        + Member
-        + BaseArithmetic
-        + Codec
-        + Default
-        + Copy
-        + Clone
-        + MaybeSerializeDeserialize
-        + Eq
-        + PartialEq
-        + Ord;
-
     /// Curator group identifier
     type CuratorGroupId: Parameter
         + Member

+ 2 - 1
runtime-modules/service-discovery/Cargo.toml

@@ -12,6 +12,7 @@ frame-support = { package = 'frame-support', default-features = false, git = 'ht
 system = { package = 'frame-system', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
 sp-runtime = { package = 'sp-runtime', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
 working-group = { package = 'pallet-working-group', default-features = false, path = '../working-group'}
+common = { package = 'pallet-common', default-features = false, path = '../common'}
 
 [dev-dependencies]
 sp-io = { package = 'sp-io', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
@@ -23,7 +24,6 @@ stake = { package = 'pallet-stake', default-features = false, path = '../stake'}
 hiring = { package = 'pallet-hiring', default-features = false, path = '../hiring'}
 minting = { package = 'pallet-token-mint', default-features = false, path = '../token-minting'}
 recurringrewards = { package = 'pallet-recurring-reward', default-features = false, path = '../recurring-reward'}
-common = { package = 'pallet-common', default-features = false, path = '../common'}
 
 [features]
 default = ['std']
@@ -35,4 +35,5 @@ std = [
 	'system/std',
 	'sp-runtime/std',
 	'working-group/std',
+	'common/std'
 ]

+ 2 - 3
runtime-modules/service-discovery/src/lib.rs

@@ -23,6 +23,8 @@ mod mock;
 mod tests;
 
 use codec::{Decode, Encode};
+use common::Url;
+
 #[cfg(feature = "std")]
 use serde::{Deserialize, Serialize};
 
@@ -45,9 +47,6 @@ use system::ensure_root;
 /// base58 encoded IPNS identity multihash codec
 pub type IPNSIdentity = Vec<u8>;
 
-/// HTTP Url string to a discovery service endpoint
-pub type Url = Vec<u8>;
-
 // The storage working group instance alias.
 pub(crate) type StorageWorkingGroupInstance = working_group::Instance2;
 

+ 2 - 3
runtime/Cargo.toml

@@ -75,8 +75,7 @@ service-discovery = { package = 'pallet-service-discovery', default-features = f
 proposals-engine = { package = 'pallet-proposals-engine', default-features = false, path = '../runtime-modules/proposals/engine'}
 proposals-discussion = { package = 'pallet-proposals-discussion', default-features = false, path = '../runtime-modules/proposals/discussion'}
 proposals-codex = { package = 'pallet-proposals-codex', default-features = false, path = '../runtime-modules/proposals/codex'}
-content-directory = { package = 'pallet-content-directory', default-features = false, path = '../runtime-modules/content-directory' }
-# content = { package = 'pallet-content', default-features = false, path = '../runtime-modules/content' }
+content = { package = 'pallet-content', default-features = false, path = '../runtime-modules/content' }
 
 [dev-dependencies]
 sp-io = { package = 'sp-io', default-features = false, git = 'https://github.com/paritytech/substrate.git', rev = '00768a1f21a579c478fe5d4f51e1fa71f7db9fd4'}
@@ -150,7 +149,7 @@ std = [
     'proposals-engine/std',
     'proposals-discussion/std',
     'proposals-codex/std',
-    'content-directory/std',
+    'content/std',
 ]
 runtime-benchmarks = [
     "system/runtime-benchmarks",

+ 2 - 3
runtime/src/integration/content_directory.rs

@@ -1,12 +1,11 @@
-use crate::{AccountId, ContentDirectoryWorkingGroupInstance, MemberId, Runtime};
+use crate::{AccountId, ContentDirectoryWorkingGroupInstance, Runtime};
 
 // Alias for content directory working group
 pub(crate) type ContentDirectoryWorkingGroup<T> =
     working_group::Module<T, ContentDirectoryWorkingGroupInstance>;
 
-impl content_directory::ActorAuthenticator for Runtime {
+impl content::ContentActorAuthenticator for Runtime {
     type CuratorId = u64;
-    type MemberId = MemberId;
     type CuratorGroupId = u64;
 
     fn is_lead(account_id: &AccountId) -> bool {

+ 14 - 39
runtime/src/lib.rs

@@ -63,10 +63,8 @@ use storage::data_directory::Quota;
 pub use storage::{data_directory, data_object_type_registry};
 pub use working_group;
 
-pub use content_directory;
-pub use content_directory::{
-    HashedTextMaxLength, InputValidationLengthConstraint, MaxNumber, TextMaxLength, VecMaxLength,
-};
+pub use content;
+pub use content::MaxNumber;
 
 /// This runtime version.
 pub const VERSION: RuntimeVersion = RuntimeVersion {
@@ -369,46 +367,23 @@ impl pallet_finality_tracker::Trait for Runtime {
     type ReportLatency = ReportLatency;
 }
 
-type EntityId = <Runtime as content_directory::Trait>::EntityId;
-
 parameter_types! {
-    pub const PropertyNameLengthConstraint: InputValidationLengthConstraint = InputValidationLengthConstraint::new(1, 49);
-    pub const PropertyDescriptionLengthConstraint: InputValidationLengthConstraint = InputValidationLengthConstraint::new(1, 500);
-    pub const ClassNameLengthConstraint: InputValidationLengthConstraint = InputValidationLengthConstraint::new(1, 49);
-    pub const ClassDescriptionLengthConstraint: InputValidationLengthConstraint = InputValidationLengthConstraint::new(1, 500);
-    pub const MaxNumberOfClasses: MaxNumber = 100;
-    pub const MaxNumberOfMaintainersPerClass: MaxNumber = 10;
-    pub const MaxNumberOfSchemasPerClass: MaxNumber = 20;
-    pub const MaxNumberOfPropertiesPerSchema: MaxNumber = 40;
-    pub const MaxNumberOfEntitiesPerClass: MaxNumber = 5000;
     pub const MaxNumberOfCuratorsPerGroup: MaxNumber = 50;
-    pub const MaxNumberOfOperationsDuringAtomicBatching: MaxNumber = 500;
-    pub const VecMaxLengthConstraint: VecMaxLength = 200;
-    pub const TextMaxLengthConstraint: TextMaxLength = 5000;
-    pub const HashedTextMaxLengthConstraint: HashedTextMaxLength = Some(25000);
-    pub const IndividualEntitiesCreationLimit: EntityId = 500;
+    pub const ChannelOwnershipPaymentEscrowId: [u8; 8] = *b"chescrow";
 }
 
-impl content_directory::Trait for Runtime {
+impl content::Trait for Runtime {
     type Event = Event;
-    type Nonce = u64;
-    type ClassId = u64;
-    type EntityId = u64;
-    type PropertyNameLengthConstraint = PropertyNameLengthConstraint;
-    type PropertyDescriptionLengthConstraint = PropertyDescriptionLengthConstraint;
-    type ClassNameLengthConstraint = ClassNameLengthConstraint;
-    type ClassDescriptionLengthConstraint = ClassDescriptionLengthConstraint;
-    type MaxNumberOfClasses = MaxNumberOfClasses;
-    type MaxNumberOfMaintainersPerClass = MaxNumberOfMaintainersPerClass;
-    type MaxNumberOfSchemasPerClass = MaxNumberOfSchemasPerClass;
-    type MaxNumberOfPropertiesPerSchema = MaxNumberOfPropertiesPerSchema;
-    type MaxNumberOfEntitiesPerClass = MaxNumberOfEntitiesPerClass;
+    type ChannelOwnershipPaymentEscrowId = ChannelOwnershipPaymentEscrowId;
+    type ChannelCategoryId = ChannelCategoryId;
+    type VideoId = VideoId;
+    type VideoCategoryId = VideoCategoryId;
+    type PlaylistId = PlaylistId;
+    type PersonId = PersonId;
+    type SeriesId = SeriesId;
+    type ChannelOwnershipTransferRequestId = ChannelOwnershipTransferRequestId;
     type MaxNumberOfCuratorsPerGroup = MaxNumberOfCuratorsPerGroup;
-    type MaxNumberOfOperationsDuringAtomicBatching = MaxNumberOfOperationsDuringAtomicBatching;
-    type VecMaxLengthConstraint = VecMaxLengthConstraint;
-    type TextMaxLengthConstraint = TextMaxLengthConstraint;
-    type HashedTextMaxLengthConstraint = HashedTextMaxLengthConstraint;
-    type IndividualEntitiesCreationLimit = IndividualEntitiesCreationLimit;
+    type StorageSystem = data_directory::Module<Self>;
 }
 
 impl hiring::Trait for Runtime {
@@ -656,7 +631,7 @@ construct_runtime!(
         Minting: minting::{Module, Call, Storage},
         RecurringRewards: recurring_rewards::{Module, Call, Storage},
         Hiring: hiring::{Module, Call, Storage},
-        ContentDirectory: content_directory::{Module, Call, Storage, Event<T>, Config<T>},
+        Content: content::{Module, Call, Storage, Event<T>, Config<T>},
         // --- Storage
         DataObjectTypeRegistry: data_object_type_registry::{Module, Call, Storage, Event<T>, Config<T>},
         DataDirectory: data_directory::{Module, Call, Storage, Event<T>, Config<T>},

+ 24 - 3
runtime/src/primitives.rs

@@ -15,9 +15,6 @@ pub type TransactionPriority = u64;
 /// Alias for ContentId, used in various places.
 pub type ContentId = sp_core::H256;
 
-/// Alias for ChannelId, used in various places.
-pub type ChannelId = u64;
-
 /// Alias for DAOId, used in various places.
 pub type DAOId = u64;
 
@@ -50,6 +47,30 @@ pub type Hash = sp_core::H256;
 /// Moment type
 pub type Moment = u64;
 
+/// Content Directory Channel identifier.
+pub type ChannelId = u64;
+
+/// Content Directory Channel Category identifier.
+pub type ChannelCategoryId = u64;
+
+/// Content Directory Video identifier.
+pub type VideoId = u64;
+
+/// Content Directory Video Category identifier.
+pub type VideoCategoryId = u64;
+
+/// Content Directory Playlist identifier.
+pub type PlaylistId = u64;
+
+/// Content Directory Person identifier.
+pub type PersonId = u64;
+
+/// Content Directory Series identifier.
+pub type SeriesId = u64;
+
+/// Content Directory Channel transfer request identifier.
+pub type ChannelOwnershipTransferRequestId = u64;
+
 /// Represents a thread identifier for both Forum and Proposals Discussion
 ///
 /// Note: Both modules expose type names ThreadId and PostId (which are defined on their Trait) and

+ 6 - 2
runtime/src/runtime_api.rs

@@ -12,8 +12,8 @@ use sp_std::vec::Vec;
 
 use crate::constants::PRIMARY_PROBABILITY;
 use crate::{
-    AccountId, AuthorityDiscoveryId, Balance, BlockNumber, EpochDuration, GrandpaAuthorityList,
-    GrandpaId, Hash, Index, RuntimeVersion, Signature, VERSION,
+    content, AccountId, AuthorityDiscoveryId, Balance, BlockNumber, EpochDuration,
+    GrandpaAuthorityList, GrandpaId, Hash, Index, RuntimeVersion, Signature, VERSION,
 };
 use crate::{
     AllModules, AuthorityDiscovery, Babe, Call, Grandpa, Historical, InherentDataExt,
@@ -59,6 +59,10 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic<AccountId, Call, Signa
 pub struct CustomOnRuntimeUpgrade;
 impl OnRuntimeUpgrade for CustomOnRuntimeUpgrade {
     fn on_runtime_upgrade() -> Weight {
+        content::Module::<Runtime>::on_runtime_upgrade();
+
+        // TODO: storage / data_directory migration or clear all data objects
+
         10_000_000 // TODO: adjust weight
     }
 }

ファイルの差分が大きいため隠しています
+ 5 - 5
types/augment-codec/all.ts


+ 7 - 0
types/augment-codec/augment-api-consts.ts

@@ -3,6 +3,7 @@
 
 import { Vec } from '@polkadot/types/codec';
 import { u32, u64 } from '@polkadot/types/primitive';
+import { MaxNumber } from './all';
 import { Balance, BalanceOf, BlockNumber, Moment, Perbill, RuntimeDbWeight, Weight } from '@polkadot/types/interfaces/runtime';
 import { SessionIndex } from '@polkadot/types/interfaces/session';
 import { EraIndex } from '@polkadot/types/interfaces/staking';
@@ -31,6 +32,12 @@ declare module '@polkadot/metadata/Decorated/consts/types' {
        **/
       existentialDeposit: AugmentedConst<Balance>;
     };
+    content: {
+      /**
+       * Exports const -  max number of curators per group
+       **/
+      maxNumberOfCuratorsPerGroup: AugmentedConst<MaxNumber>;
+    };
     contentDirectoryWorkingGroup: {
       /**
        * Exports const -  max simultaneous active worker number.

+ 38 - 20
types/augment-codec/augment-api-query.ts

@@ -4,7 +4,7 @@
 import { AnyNumber, ITuple, Observable } from '@polkadot/types/types';
 import { Option, Vec } from '@polkadot/types/codec';
 import { Bytes, bool, u32, u64 } from '@polkadot/types/primitive';
-import { Application, ApplicationId, ApplicationOf, Category, CategoryId, ClassId, ClassOf, ContentId, CuratorGroup, CuratorGroupId, DataObject, DataObjectStorageRelationship, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DiscussionPost, DiscussionThread, ElectionStage, ElectionStake, EntityController, EntityCreationVoucher, EntityId, EntityOf, HiringApplicationId, InputValidationLengthConstraint, MemberId, Membership, MemoText, Mint, MintId, Opening, OpeningId, OpeningOf, PaidMembershipTerms, PaidTermId, Post, PostId, PropertyId, ProposalDetailsOf, ProposalId, ProposalOf, Recipient, RecipientId, RewardRelationship, RewardRelationshipId, SealedVote, Seats, ServiceProviderRecord, Stake, StakeId, StorageProviderId, Thread, ThreadCounter, ThreadId, TransferableStake, Url, VoteKind, WorkerId, WorkerOf } from './all';
+import { Application, ApplicationId, ApplicationOf, Category, CategoryId, Channel, ChannelCategory, ChannelCategoryId, ChannelId, ChannelOwnershipTransferRequest, ChannelOwnershipTransferRequestId, ContentId, CuratorGroup, CuratorGroupId, DataObject, DataObjectStorageRelationship, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DiscussionPost, DiscussionThread, ElectionStage, ElectionStake, HiringApplicationId, InputValidationLengthConstraint, MemberId, Membership, MemoText, Mint, MintId, Opening, OpeningId, OpeningOf, PaidMembershipTerms, PaidTermId, Person, PersonId, Playlist, PlaylistId, Post, PostId, ProposalDetailsOf, ProposalId, ProposalOf, Quota, Recipient, RecipientId, RewardRelationship, RewardRelationshipId, SealedVote, Seats, Series, SeriesId, ServiceProviderRecord, Stake, StakeId, StorageObjectOwner, StorageProviderId, Thread, ThreadCounter, ThreadId, TransferableStake, Url, Video, VideoCategory, VideoCategoryId, VideoId, VoteKind, WorkerId, WorkerOf } from './all';
 import { UncleEntryItem } from '@polkadot/types/interfaces/authorship';
 import { BabeAuthorityWeight, MaybeRandomness, NextConfigDescriptor, Randomness } from '@polkadot/types/interfaces/babe';
 import { AccountData, BalanceLock } from '@polkadot/types/interfaces/balances';
@@ -127,30 +127,28 @@ declare module '@polkadot/api/types/storage' {
        **/
       totalIssuance: AugmentedQuery<ApiType, () => Observable<Balance>>;
     };
-    contentDirectory: {
-      /**
-       * Map, representing ClassId -> Class relation
-       **/
-      classById: AugmentedQuery<ApiType, (arg: ClassId | AnyNumber | Uint8Array) => Observable<ClassOf>>;
+    content: {
+      channelById: AugmentedQuery<ApiType, (arg: ChannelId | AnyNumber | Uint8Array) => Observable<Channel>>;
+      channelCategoryById: AugmentedQuery<ApiType, (arg: ChannelCategoryId | AnyNumber | Uint8Array) => Observable<ChannelCategory>>;
+      channelOwnershipTransferRequestById: AugmentedQuery<ApiType, (arg: ChannelOwnershipTransferRequestId | AnyNumber | Uint8Array) => Observable<ChannelOwnershipTransferRequest>>;
       /**
        * Map, representing  CuratorGroupId -> CuratorGroup relation
        **/
       curatorGroupById: AugmentedQuery<ApiType, (arg: CuratorGroupId | AnyNumber | Uint8Array) => Observable<CuratorGroup>>;
-      /**
-       * Map, representing EntityId -> Entity relation
-       **/
-      entityById: AugmentedQuery<ApiType, (arg: EntityId | AnyNumber | Uint8Array) => Observable<EntityOf>>;
-      entityCreationVouchers: AugmentedQueryDoubleMap<ApiType, (key1: ClassId | AnyNumber | Uint8Array, key2: EntityController | { Maintainers: any } | { Member: any } | { Lead: any } | string | Uint8Array) => Observable<EntityCreationVoucher>>;
-      /**
-       * Next runtime storage values used to maintain next id value, used on creation of respective curator groups, classes and entities
-       **/
-      nextClassId: AugmentedQuery<ApiType, () => Observable<ClassId>>;
+      nextChannelCategoryId: AugmentedQuery<ApiType, () => Observable<ChannelCategoryId>>;
+      nextChannelId: AugmentedQuery<ApiType, () => Observable<ChannelId>>;
+      nextChannelOwnershipTransferRequestId: AugmentedQuery<ApiType, () => Observable<ChannelOwnershipTransferRequestId>>;
       nextCuratorGroupId: AugmentedQuery<ApiType, () => Observable<CuratorGroupId>>;
-      nextEntityId: AugmentedQuery<ApiType, () => Observable<EntityId>>;
-      /**
-       * Mapping of class id and its property id to the respective entity id and property value hash.
-       **/
-      uniquePropertyValueHashes: AugmentedQueryDoubleMap<ApiType, (key1: ITuple<[ClassId, PropertyId]> | [ClassId | AnyNumber | Uint8Array, PropertyId | AnyNumber | Uint8Array], key2: Hash | string | Uint8Array) => Observable<ITuple<[]>>>;
+      nextPersonId: AugmentedQuery<ApiType, () => Observable<PersonId>>;
+      nextPlaylistId: AugmentedQuery<ApiType, () => Observable<PlaylistId>>;
+      nextSeriesId: AugmentedQuery<ApiType, () => Observable<SeriesId>>;
+      nextVideoCategoryId: AugmentedQuery<ApiType, () => Observable<VideoCategoryId>>;
+      nextVideoId: AugmentedQuery<ApiType, () => Observable<VideoId>>;
+      personById: AugmentedQuery<ApiType, (arg: PersonId | AnyNumber | Uint8Array) => Observable<Person>>;
+      playlistById: AugmentedQuery<ApiType, (arg: PlaylistId | AnyNumber | Uint8Array) => Observable<Playlist>>;
+      seriesById: AugmentedQuery<ApiType, (arg: SeriesId | AnyNumber | Uint8Array) => Observable<Series>>;
+      videoById: AugmentedQuery<ApiType, (arg: VideoId | AnyNumber | Uint8Array) => Observable<Video>>;
+      videoCategoryById: AugmentedQuery<ApiType, (arg: VideoCategoryId | AnyNumber | Uint8Array) => Observable<VideoCategory>>;
     };
     contentDirectoryWorkingGroup: {
       /**
@@ -257,10 +255,30 @@ declare module '@polkadot/api/types/storage' {
        * Maps data objects by their content id.
        **/
       dataObjectByContentId: AugmentedQuery<ApiType, (arg: ContentId | string | Uint8Array) => Observable<Option<DataObject>>>;
+      /**
+       * Global quota.
+       **/
+      globalQuota: AugmentedQuery<ApiType, () => Observable<Quota>>;
       /**
        * List of ids known to the system.
        **/
       knownContentIds: AugmentedQuery<ApiType, () => Observable<Vec<ContentId>>>;
+      /**
+       * Upper bound for the Quota objects number limit.
+       **/
+      quotaObjectsLimitUpperBound: AugmentedQuery<ApiType, () => Observable<u64>>;
+      /**
+       * Maps storage owner to it`s quota. Created when the first upload by the new actor occured.
+       **/
+      quotas: AugmentedQuery<ApiType, (arg: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array) => Observable<Quota>>;
+      /**
+       * Upper bound for the Quota size limit.
+       **/
+      quotaSizeLimitUpperBound: AugmentedQuery<ApiType, () => Observable<u64>>;
+      /**
+       * If all new uploads blocked
+       **/
+      uploadingBlocked: AugmentedQuery<ApiType, () => Observable<bool>>;
     };
     dataObjectStorageRegistry: {
       /**

+ 52 - 82
types/augment-codec/augment-api-tx.ts

@@ -2,9 +2,9 @@
 /* eslint-disable */
 
 import { AnyNumber } from '@polkadot/types/types';
-import { BTreeMap, BTreeSet, Compact, Option, Vec } from '@polkadot/types/codec';
+import { Compact, Option, Vec } from '@polkadot/types/codec';
 import { Bytes, bool, u16, u32, u64 } from '@polkadot/types/primitive';
-import { ActivateOpeningAt, Actor, AddOpeningParameters, ApplicationId, ApplicationIdSet, BalanceOfMint, CategoryId, ClassId, ClassPermissions, ContentId, CuratorGroupId, CuratorId, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DataObjectsMap, ElectionParameters, EntityController, EntityId, FillOpeningParameters, InputPropertyValue, InputValue, MemberId, MemoText, Nonce, OpeningId, OpeningPolicyCommitment, OpeningType, OperationType, PaidTermId, PostId, Property, PropertyId, ProposalId, RewardPolicy, SchemaId, StorageProviderId, TerminateRoleParameters, ThreadId, Url, VecMaxLength, VoteKind, WorkerId, WorkingGroup } from './all';
+import { ActivateOpeningAt, AddOpeningParameters, ApplicationId, ApplicationIdSet, BalanceOfMint, CategoryId, ChannelCategoryCreationParameters, ChannelCategoryId, ChannelCategoryUpdateParameters, ChannelCreationParameters, ChannelId, ChannelOwner, ChannelOwnershipTransferRequestId, ChannelUpdateParameters, ContentId, ContentParameters, CuratorGroupId, CuratorId, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DataObjectsMap, ElectionParameters, FillOpeningParameters, MemberId, MemoText, OpeningId, OpeningPolicyCommitment, OpeningType, PaidTermId, PersonActor, PersonCreationParameters, PersonId, PersonUpdateParameters, PlaylistCreationParameters, PlaylistId, PlaylistUpdateParameters, PostId, ProposalId, RewardPolicy, SeriesId, SeriesParameters, StorageObjectOwner, StorageProviderId, TerminateRoleParameters, ThreadId, Url, VideoCategoryCreationParameters, VideoCategoryId, VideoCategoryUpdateParameters, VideoCreationParameters, VideoId, VideoUpdateParameters, VoteKind, WorkerId, WorkingGroup } from './all';
 import { Extrinsic, Signature } from '@polkadot/types/interfaces/extrinsics';
 import { GrandpaEquivocationProof, KeyOwnerProof } from '@polkadot/types/interfaces/grandpa';
 import { Heartbeat } from '@polkadot/types/interfaces/imOnline';
@@ -98,100 +98,58 @@ declare module '@polkadot/api/types/submittable' {
        **/
       transferKeepAlive: AugmentedSubmittable<(dest: LookupSource | string | Uint8Array, value: Compact<Balance> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
     };
-    contentDirectory: {
-      /**
-       * Create new class schema from existing property ids and new properties
-       **/
-      addClassSchema: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, existingProperties: BTreeSet<PropertyId>, newProperties: Vec<Property> | (Property | { property_type?: any; required?: any; unique?: any; name?: any; description?: any; locking_policy?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Add new curator group to runtime storage
-       **/
-      addCuratorGroup: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>>;
+    content: {
+      acceptChannelTransfer: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, requestId: ChannelOwnershipTransferRequestId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
        * Add curator to curator group under given `curator_group_id`
        **/
       addCuratorToGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array, curatorId: CuratorId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      addPersonToVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array, person: PersonId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      cancelChannelTransferRequest: AugmentedSubmittable<(requestId: ChannelOwnershipTransferRequestId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      censorChannel: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      censorVideo: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createChannel: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, params: ChannelCreationParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createChannelCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, params: ChannelCategoryCreationParameters | { meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
-       * Add curator group under given `curator_group_id` as `Class` maintainer
-       **/
-      addMaintainerToClass: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Add schema support to entity under given `schema_id` and provided `property_values`
-       **/
-      addSchemaSupportToEntity: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, schemaId: SchemaId | AnyNumber | Uint8Array, newPropertyValues: BTreeMap<PropertyId, InputPropertyValue>) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Clear `PropertyValueVec` under given `entity_id` & `in_class_schema_property_id`
-       **/
-      clearEntityPropertyVector: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, inClassSchemaPropertyId: PropertyId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Create new `Class` with provided parameters
-       **/
-      createClass: AugmentedSubmittable<(name: Bytes | string | Uint8Array, description: Bytes | string | Uint8Array, classPermissions: ClassPermissions | { any_member?: any; entity_creation_blocked?: any; all_entity_property_values_locked?: any; maintainers?: any } | string | Uint8Array, maximumEntitiesCount: EntityId | AnyNumber | Uint8Array, defaultEntityCreationVoucherUpperBound: EntityId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Create entity.
-       * If someone is making an entity of this class for first time,
-       * then a voucher is also added with the class limit as the default limit value.
-       **/
-      createEntity: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Insert `SingleInputPropertyValue` at given `index_in_property_vector`
-       * into `PropertyValueVec` under `in_class_schema_property_id`
+       * Add new curator group to runtime storage
        **/
-      insertAtEntityPropertyVector: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, inClassSchemaPropertyId: PropertyId | AnyNumber | Uint8Array, indexInPropertyVector: VecMaxLength | AnyNumber | Uint8Array, value: InputValue | { Bool: any } | { Uint16: any } | { Uint32: any } | { Uint64: any } | { Int16: any } | { Int32: any } | { Int64: any } | { Text: any } | { TextToHash: any } | { Reference: any } | string | Uint8Array, nonce: Nonce | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createCuratorGroup: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>>;
+      createPerson: AugmentedSubmittable<(actor: PersonActor | { Member: any } | { Curator: any } | string | Uint8Array, params: PersonCreationParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createPlaylist: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: PlaylistCreationParameters | { meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createSeries: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: SeriesParameters | { assets?: any; seasons?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: VideoCreationParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createVideoCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, params: VideoCategoryCreationParameters | { meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteChannel: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteChannelCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: ChannelCategoryId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
-       * Remove value at given `index_in_property_vector`
-       * from `PropertyValueVec` under `in_class_schema_property_id`
+       * Remove curator group under given `curator_group_id` from runtime storage
        **/
-      removeAtEntityPropertyVector: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, inClassSchemaPropertyId: PropertyId | AnyNumber | Uint8Array, indexInPropertyVector: VecMaxLength | AnyNumber | Uint8Array, nonce: Nonce | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteCuratorGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deletePerson: AugmentedSubmittable<(actor: PersonActor | { Member: any } | { Curator: any } | string | Uint8Array, person: PersonId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deletePlaylist: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, playlist: PlaylistId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteSeries: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, series: SeriesId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, video: VideoId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteVideoCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: VideoCategoryId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
        * Remove curator from a given curator group
        **/
       removeCuratorFromGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array, curatorId: CuratorId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Remove curator group under given `curator_group_id` from runtime storage
-       **/
-      removeCuratorGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Remove `Entity` under provided `entity_id`
-       **/
-      removeEntity: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Remove curator group under given `curator_group_id` from `Class` maintainers set
-       **/
-      removeMaintainerFromClass: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      removePersonFromVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      requestChannelTransfer: AugmentedSubmittable<(newOwner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, payment: BalanceOf | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
        * Set `is_active` status for curator group under given `curator_group_id`
        **/
       setCuratorGroupStatus: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array, isActive: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Batch transaction
-       **/
-      transaction: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, operations: Vec<OperationType> | (OperationType | { CreateEntity: any } | { UpdatePropertyValues: any } | { AddSchemaSupportToEntity: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Transfer ownership to new `EntityController` for `Entity` under given `entity_id`
-       * `new_property_value_references_with_same_owner_flag_set` should be provided manually
-       **/
-      transferEntityOwnership: AugmentedSubmittable<(entityId: EntityId | AnyNumber | Uint8Array, newController: EntityController | { Maintainers: any } | { Member: any } | { Lead: any } | string | Uint8Array, newPropertyValueReferencesWithSameOwnerFlagSet: BTreeMap<PropertyId, InputPropertyValue>) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update `ClassPermissions` under specific `class_id`
-       **/
-      updateClassPermissions: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, updatedAnyMember: Option<bool> | null | object | string | Uint8Array, updatedEntityCreationBlocked: Option<bool> | null | object | string | Uint8Array, updatedAllEntityPropertyValuesLocked: Option<bool> | null | object | string | Uint8Array, updatedMaintainers: Option<BTreeSet<CuratorGroupId>> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update `schema_status` under specific `schema_id` in `Class`
-       **/
-      updateClassSchemaStatus: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, schemaId: SchemaId | AnyNumber | Uint8Array, schemaStatus: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Updates or creates new `EntityCreationVoucher` for given `EntityController` with individual limit
-       **/
-      updateEntityCreationVoucher: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, controller: EntityController | { Maintainers: any } | { Member: any } | { Lead: any } | string | Uint8Array, maximumEntitiesCount: EntityId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update entity permissions
-       **/
-      updateEntityPermissions: AugmentedSubmittable<(entityId: EntityId | AnyNumber | Uint8Array, updatedFrozen: Option<bool> | null | object | string | Uint8Array, updatedReferenceable: Option<bool> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update `Entity` `InputPropertyValue`'s with provided ones
-       **/
-      updateEntityPropertyValues: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, newPropertyValues: BTreeMap<PropertyId, InputPropertyValue>) => SubmittableExtrinsic<ApiType>>;
+      setFeaturedVideos: AugmentedSubmittable<(list: Vec<VideoId> | (VideoId | AnyNumber | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
+      uncensorChannel: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      uncensorVideo: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateChannel: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: ChannelUpdateParameters | { assets?: any; new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateChannelCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: ChannelCategoryId | AnyNumber | Uint8Array, params: ChannelCategoryUpdateParameters | { new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updatePerson: AugmentedSubmittable<(actor: PersonActor | { Member: any } | { Curator: any } | string | Uint8Array, person: PersonId | AnyNumber | Uint8Array, params: PersonUpdateParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updatePlaylist: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, playlist: PlaylistId | AnyNumber | Uint8Array, params: PlaylistUpdateParameters | { new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateSeries: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: SeriesParameters | { assets?: any; seasons?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, video: VideoId | AnyNumber | Uint8Array, params: VideoUpdateParameters | { assets?: any; new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateVideoCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: VideoCategoryId | AnyNumber | Uint8Array, params: VideoCategoryUpdateParameters | { new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
     };
     contentDirectoryWorkingGroup: {
       /**
@@ -330,10 +288,10 @@ declare module '@polkadot/api/types/submittable' {
        **/
       acceptContent: AugmentedSubmittable<(storageProviderId: StorageProviderId | AnyNumber | Uint8Array, contentId: ContentId | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
-       * Adds the content to the system. Member id should match its origin. The created DataObject
+       * Adds the content to the system. The created DataObject
        * awaits liaison to accept or reject it.
        **/
-      addContent: AugmentedSubmittable<(memberId: MemberId | AnyNumber | Uint8Array, contentId: ContentId | string | Uint8Array, typeId: DataObjectTypeId | AnyNumber | Uint8Array, size: u64 | AnyNumber | Uint8Array, ipfsContentId: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      addContent: AugmentedSubmittable<(owner: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array, content: Vec<ContentParameters> | (ContentParameters | { content_id?: any; type_id?: any; ipfs_content_id?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
       /**
        * Injects a set of data objects and their corresponding content id into the directory.
        * The operation is "silent" - no events will be emitted as objects are added.
@@ -351,6 +309,18 @@ declare module '@polkadot/api/types/submittable' {
        * Removes the content id from the list of known content ids. Requires root privileges.
        **/
       removeKnownContentId: AugmentedSubmittable<(contentId: ContentId | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      /**
+       * Locks / unlocks content uploading
+       **/
+      updateContentUploadingStatus: AugmentedSubmittable<(isBlocked: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      /**
+       * Updates storage object owner quota objects limit. Requires leader privileges.
+       **/
+      updateStorageObjectOwnerQuotaObjectsLimit: AugmentedSubmittable<(abstractOwner: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array, newQuotaObjectsLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      /**
+       * Updates storage object owner quota size limit. Requires leader privileges.
+       **/
+      updateStorageObjectOwnerQuotaSizeLimit: AugmentedSubmittable<(abstractOwner: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array, newQuotaSizeLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
     };
     dataObjectStorageRegistry: {
       /**

ファイルの差分が大きいため隠しています
+ 0 - 0
types/augment-codec/augment-types.ts


+ 187 - 218
types/augment/all/defs.json

@@ -1,8 +1,6 @@
 {
-    "Channel": "Null",
     "ChannelContentType": "Null",
     "ChannelCurationStatus": "Null",
-    "ChannelId": "Null",
     "ChannelPublicationStatus": "Null",
     "CurationActor": "Null",
     "Curator": "Null",
@@ -18,8 +16,58 @@
     "Principal": "Null",
     "PrincipalId": "Null",
     "WorkingGroupUnstaker": "Null",
-    "Credential": "u64",
-    "CredentialSet": "BTreeSet<Credential>",
+    "Credential": "Null",
+    "CredentialSet": "Null",
+    "Nonce": "Null",
+    "EntityId": "Null",
+    "ClassId": "Null",
+    "VecMaxLength": "Null",
+    "TextMaxLength": "Null",
+    "HashedTextMaxLength": "Null",
+    "PropertyId": "Null",
+    "SchemaId": "Null",
+    "SameController": "Null",
+    "ClassPermissions": "Null",
+    "PropertyTypeSingle": "Null",
+    "PropertyTypeVector": "Null",
+    "PropertyType": "Null",
+    "PropertyLockingPolicy": "Null",
+    "Property": "Null",
+    "Schema": "Null",
+    "Class": "Null",
+    "ClassOf": "Null",
+    "EntityController": "Null",
+    "EntityPermissions": "Null",
+    "StoredValue": "Null",
+    "VecStoredValue": "Null",
+    "VecStoredPropertyValue": "Null",
+    "StoredPropertyValue": "Null",
+    "InboundReferenceCounter": "Null",
+    "Entity": "Null",
+    "EntityOf": "Null",
+    "EntityCreationVoucher": "Null",
+    "Actor": "Null",
+    "EntityReferenceCounterSideEffect": "Null",
+    "ReferenceCounterSideEffects": "Null",
+    "SideEffects": "Null",
+    "SideEffect": "Null",
+    "Status": "Null",
+    "InputValue": "Null",
+    "VecInputValue": "Null",
+    "InputPropertyValue": "Null",
+    "ParameterizedEntity": "Null",
+    "ParametrizedPropertyValue": "Null",
+    "ParametrizedClassPropertyValue": "Null",
+    "CreateEntityOperation": "Null",
+    "UpdatePropertyValuesOperation": "Null",
+    "AddSchemaSupportToEntityOperation": "Null",
+    "OperationType": "Null",
+    "InputEntityValuesMap": "Null",
+    "ClassPermissionsType": "Null",
+    "ClassPropertyValue": "Null",
+    "Operation": "Null",
+    "ReferenceConstraint": "Null",
+    "FailedAt": "Null",
     "BlockAndTime": {
         "block": "u32",
         "time": "u64"
@@ -49,6 +97,9 @@
     "MemoText": "Text",
     "Address": "AccountId",
     "LookupSource": "AccountId",
+    "ChannelId": "u64",
+    "DAOId": "u64",
+    "Url": "Text",
     "EntryMethod": {
         "_enum": {
             "Paid": "u64",
@@ -426,7 +477,6 @@
         "termination_unstaking_period": "Option<u32>",
         "exit_unstaking_period": "Option<u32>"
     },
-    "Url": "Text",
     "IPNSIdentity": "Text",
     "ServiceProviderRecord": {
         "identity": "IPNSIdentity",
@@ -441,7 +491,7 @@
         ]
     },
     "DataObject": {
-        "owner": "MemberId",
+        "owner": "StorageObjectOwner",
         "added_at": "BlockAndTime",
         "type_id": "DataObjectTypeId",
         "size": "u64",
@@ -461,6 +511,30 @@
         "active": "bool"
     },
     "DataObjectsMap": "BTreeMap<ContentId,DataObject>",
+    "ContentParameters": {
+        "content_id": "ContentId",
+        "type_id": "DataObjectTypeId",
+        "size": "u64",
+        "ipfs_content_id": "Bytes"
+    },
+    "StorageObjectOwner": {
+        "_enum": {
+            "Member": "MemberId",
+            "Channel": "ChannelId",
+            "DAO": "DAOId",
+            "Council": "Null",
+            "WorkingGroup": "WorkingGroup"
+        }
+    },
+    "Content": "Vec<ContentParameters>",
+    "Quota": {
+        "size_limit": "u64",
+        "objects_limit": "u64",
+        "size_used": "u64",
+        "objects_used": "u64"
+    },
+    "QuotaLimit": "u64",
+    "UploadingStatus": "bool",
     "ProposalId": "u32",
     "ProposalStatus": {
         "_enum": {
@@ -608,249 +682,144 @@
         }
     },
     "SetLeadParams": "(MemberId,GenericAccountId)",
-    "Nonce": "u64",
     "CuratorId": "u64",
-    "EntityId": "u64",
-    "ClassId": "u64",
     "CuratorGroupId": "u64",
-    "VecMaxLength": "u16",
-    "TextMaxLength": "u16",
-    "HashedTextMaxLength": "Option<u16>",
-    "PropertyId": "u16",
-    "SchemaId": "u16",
-    "SameController": "bool",
-    "ClassPermissions": {
-        "any_member": "bool",
-        "entity_creation_blocked": "bool",
-        "all_entity_property_values_locked": "bool",
-        "maintainers": "Vec<CuratorGroupId>"
-    },
-    "PropertyTypeSingle": {
-        "_enum": {
-            "Bool": "Null",
-            "Uint16": "Null",
-            "Uint32": "Null",
-            "Uint64": "Null",
-            "Int16": "Null",
-            "Int32": "Null",
-            "Int64": "Null",
-            "Text": "TextMaxLength",
-            "Hash": "HashedTextMaxLength",
-            "Reference": "(ClassId,SameController)"
-        }
-    },
-    "PropertyTypeVector": {
-        "vec_type": "PropertyTypeSingle",
-        "max_length": "VecMaxLength"
-    },
-    "PropertyType": {
-        "_enum": {
-            "Single": "PropertyTypeSingle",
-            "Vector": "PropertyTypeVector"
-        }
-    },
-    "PropertyLockingPolicy": {
-        "is_locked_from_maintainer": "bool",
-        "is_locked_from_controller": "bool"
-    },
-    "Property": {
-        "property_type": "PropertyType",
-        "required": "bool",
-        "unique": "bool",
-        "name": "Text",
-        "description": "Text",
-        "locking_policy": "PropertyLockingPolicy"
-    },
-    "Schema": {
-        "properties": "Vec<PropertyId>",
-        "is_active": "bool"
-    },
-    "Class": {
-        "class_permissions": "ClassPermissions",
-        "properties": "Vec<Property>",
-        "schemas": "Vec<Schema>",
-        "name": "Text",
-        "description": "Text",
-        "maximum_entities_count": "EntityId",
-        "current_number_of_entities": "EntityId",
-        "default_entity_creation_voucher_upper_bound": "EntityId"
-    },
-    "ClassOf": {
-        "class_permissions": "ClassPermissions",
-        "properties": "Vec<Property>",
-        "schemas": "Vec<Schema>",
-        "name": "Text",
-        "description": "Text",
-        "maximum_entities_count": "EntityId",
-        "current_number_of_entities": "EntityId",
-        "default_entity_creation_voucher_upper_bound": "EntityId"
+    "CuratorGroup": {
+        "curators": "Vec<CuratorId>",
+        "active": "bool",
+        "number_of_channels_owned": "u32"
     },
-    "EntityController": {
+    "ContentActor": {
         "_enum": {
-            "Maintainers": "Null",
+            "Curator": "(CuratorGroupId,CuratorId)",
             "Member": "MemberId",
             "Lead": "Null"
         }
     },
-    "EntityPermissions": {
-        "controller": "EntityController",
-        "frozen": "bool",
-        "referenceable": "bool"
-    },
-    "StoredValue": {
-        "_enum": {
-            "Bool": "bool",
-            "Uint16": "u16",
-            "Uint32": "u32",
-            "Uint64": "u64",
-            "Int16": "i16",
-            "Int32": "i32",
-            "Int64": "i64",
-            "Text": "Text",
-            "Hash": "Hash",
-            "Reference": "EntityId"
-        }
-    },
-    "VecStoredValue": {
+    "NewAsset": {
         "_enum": {
-            "Bool": "Vec<bool>",
-            "Uint16": "Vec<u16>",
-            "Uint32": "Vec<u32>",
-            "Uint64": "Vec<u64>",
-            "Int16": "Vec<i16>",
-            "Int32": "Vec<i32>",
-            "Int64": "Vec<i64>",
-            "Hash": "Vec<Hash>",
-            "Text": "Vec<Text>",
-            "Reference": "Vec<EntityId>"
+            "Upload": "ContentParameters",
+            "Urls": "Vec<Url>"
         }
     },
-    "VecStoredPropertyValue": {
-        "vec_value": "VecStoredValue",
-        "nonce": "Nonce"
+    "Channel": {
+        "owner": "ChannelOwner",
+        "videos": "Vec<VideoId>",
+        "playlists": "Vec<PlaylistId>",
+        "series": "Vec<SeriesId>",
+        "is_censored": "bool",
+        "reward_account": "Option<GenericAccountId>"
     },
-    "StoredPropertyValue": {
+    "ChannelOwner": {
         "_enum": {
-            "Single": "StoredValue",
-            "Vector": "VecStoredPropertyValue"
+            "Member": "MemberId",
+            "Curators": "CuratorGroupId",
+            "Dao": "DAOId"
         }
     },
-    "InboundReferenceCounter": {
-        "total": "u32",
-        "same_owner": "u32"
-    },
-    "Entity": {
-        "entity_permissions": "EntityPermissions",
-        "class_id": "ClassId",
-        "supported_schemas": "Vec<SchemaId>",
-        "values": "BTreeMap<PropertyId,StoredPropertyValue>",
-        "reference_counter": "InboundReferenceCounter"
-    },
-    "EntityOf": {
-        "entity_permissions": "EntityPermissions",
-        "class_id": "ClassId",
-        "supported_schemas": "Vec<SchemaId>",
-        "values": "BTreeMap<PropertyId,StoredPropertyValue>",
-        "reference_counter": "InboundReferenceCounter"
-    },
-    "CuratorGroup": {
-        "curators": "Vec<CuratorId>",
-        "active": "bool",
-        "number_of_classes_maintained": "u32"
-    },
-    "EntityCreationVoucher": {
-        "maximum_entities_count": "EntityId",
-        "entities_created": "EntityId"
-    },
-    "Actor": {
+    "ChannelCategoryId": "u64",
+    "ChannelCategory": {},
+    "ChannelCategoryCreationParameters": {
+        "meta": "Bytes"
+    },
+    "ChannelCategoryUpdateParameters": {
+        "new_meta": "Bytes"
+    },
+    "ChannelCreationParameters": {
+        "assets": "Vec<NewAsset>",
+        "meta": "Bytes"
+    },
+    "ChannelUpdateParameters": {
+        "assets": "Option<Vec<NewAsset>>",
+        "new_meta": "Bytes"
+    },
+    "ChannelOwnershipTransferRequestId": "u64",
+    "ChannelOwnershipTransferRequest": {
+        "channel_id": "ChannelId",
+        "new_owner": "ChannelOwner",
+        "payment": "u128",
+        "new_reward_account": "Option<GenericAccountId>"
+    },
+    "Video": {
+        "in_channel": "ChannelId",
+        "in_series": "Option<SeriesId>",
+        "is_censored": "bool",
+        "is_featured": "bool"
+    },
+    "VideoId": "u64",
+    "VideoCategoryId": "u64",
+    "VideoCategory": {},
+    "VideoCategoryCreationParameters": {
+        "meta": "Bytes"
+    },
+    "VideoCategoryUpdateParameters": {
+        "new_meta": "Bytes"
+    },
+    "VideoCreationParameters": {
+        "assets": "Vec<NewAsset>",
+        "meta": "Bytes"
+    },
+    "VideoUpdateParameters": {
+        "assets": "Option<Vec<NewAsset>>",
+        "new_meta": "Option<Bytes>"
+    },
+    "Person": {
+        "controlled_by": "PersonController"
+    },
+    "PersonId": "u64",
+    "PersonController": {
         "_enum": {
-            "Curator": "(CuratorGroupId,CuratorId)",
             "Member": "MemberId",
-            "Lead": "Null"
+            "Curators": "Null"
         }
     },
-    "EntityReferenceCounterSideEffect": {
-        "total": "i32",
-        "same_owner": "i32"
-    },
-    "ReferenceCounterSideEffects": "BTreeMap<EntityId,EntityReferenceCounterSideEffect>",
-    "SideEffects": "Option<ReferenceCounterSideEffects>",
-    "SideEffect": "Option<(EntityId,EntityReferenceCounterSideEffect)>",
-    "Status": "bool",
-    "InputValue": {
+    "PersonActor": {
         "_enum": {
-            "Bool": "bool",
-            "Uint16": "u16",
-            "Uint32": "u32",
-            "Uint64": "u64",
-            "Int16": "i16",
-            "Int32": "i32",
-            "Int64": "i64",
-            "Text": "Text",
-            "TextToHash": "Text",
-            "Reference": "EntityId"
+            "Member": "MemberId",
+            "Curator": "CuratorId"
         }
     },
-    "VecInputValue": {
-        "_enum": {
-            "Bool": "Vec<bool>",
-            "Uint16": "Vec<u16>",
-            "Uint32": "Vec<u32>",
-            "Uint64": "Vec<u64>",
-            "Int16": "Vec<i16>",
-            "Int32": "Vec<i32>",
-            "Int64": "Vec<i64>",
-            "TextToHash": "Vec<Text>",
-            "Text": "Vec<Text>",
-            "Reference": "Vec<EntityId>"
-        }
+    "PersonCreationParameters": {
+        "assets": "Vec<NewAsset>",
+        "meta": "Bytes"
     },
-    "InputPropertyValue": {
-        "_enum": {
-            "Single": "InputValue",
-            "Vector": "VecInputValue"
-        }
+    "PersonUpdateParameters": {
+        "assets": "Option<Vec<NewAsset>>",
+        "meta": "Option<Bytes>"
     },
-    "ParameterizedEntity": {
-        "_enum": {
-            "InternalEntityJustAdded": "u32",
-            "ExistingEntity": "EntityId"
-        }
+    "Playlist": {
+        "in_channel": "ChannelId"
     },
-    "ParametrizedPropertyValue": {
-        "_enum": {
-            "InputPropertyValue": "InputPropertyValue",
-            "InternalEntityJustAdded": "u32",
-            "InternalEntityVec": "Vec<ParameterizedEntity>"
-        }
+    "PlaylistId": "u64",
+    "PlaylistCreationParameters": {
+        "meta": "Bytes"
+    },
+    "PlaylistUpdateParameters": {
+        "new_meta": "Bytes"
     },
-    "ParametrizedClassPropertyValue": {
-        "in_class_index": "PropertyId",
-        "value": "ParametrizedPropertyValue"
+    "SeriesId": "u64",
+    "Series": {
+        "in_channel": "ChannelId",
+        "seasons": "Vec<Season>"
     },
-    "CreateEntityOperation": {
-        "class_id": "ClassId"
+    "Season": {
+        "episodes": "Vec<VideoId>"
     },
-    "UpdatePropertyValuesOperation": {
-        "entity_id": "ParameterizedEntity",
-        "new_parametrized_property_values": "Vec<ParametrizedClassPropertyValue>"
+    "SeriesParameters": {
+        "assets": "Option<Vec<NewAsset>>",
+        "seasons": "Option<Vec<Option<SeasonParameters>>>",
+        "meta": "Option<Bytes>"
     },
-    "AddSchemaSupportToEntityOperation": {
-        "entity_id": "ParameterizedEntity",
-        "schema_id": "SchemaId",
-        "parametrized_property_values": "Vec<ParametrizedClassPropertyValue>"
+    "SeasonParameters": {
+        "assets": "Option<Vec<NewAsset>>",
+        "episodes": "Option<Vec<Option<EpisodeParemters>>>",
+        "meta": "Option<Bytes>"
     },
-    "OperationType": {
+    "EpisodeParemters": {
         "_enum": {
-            "CreateEntity": "CreateEntityOperation",
-            "UpdatePropertyValues": "UpdatePropertyValuesOperation",
-            "AddSchemaSupportToEntity": "AddSchemaSupportToEntityOperation"
+            "NewVideo": "VideoCreationParameters",
+            "ExistingVideo": "VideoId"
         }
     },
-    "InputEntityValuesMap": "BTreeMap<PropertyId,InputPropertyValue>",
-    "ClassPermissionsType": "Null",
-    "ClassPropertyValue": "Null",
-    "Operation": "Null",
-    "ReferenceConstraint": "Null",
-    "FailedAt": "u32"
+    "MaxNumber": "u32"
 }

+ 295 - 271
types/augment/all/types.ts

@@ -4,7 +4,7 @@
 import { ITuple } from '@polkadot/types/types';
 import { BTreeMap, BTreeSet, Enum, Option, Struct, U8aFixed, Vec } from '@polkadot/types/codec';
 import { GenericAccountId } from '@polkadot/types/generic';
-import { Bytes, Null, Text, bool, i16, i32, i64, u128, u16, u32, u64 } from '@polkadot/types/primitive';
+import { Bytes, Null, Text, bool, u128, u16, u32, u64 } from '@polkadot/types/primitive';
 import { AccountId, Balance, Hash } from '@polkadot/types/interfaces/runtime';
 
 /** @name AcceptingApplications */
@@ -45,13 +45,7 @@ export interface ActiveStake extends Struct {
 }
 
 /** @name Actor */
-export interface Actor extends Enum {
-  readonly isCurator: boolean;
-  readonly asCurator: ITuple<[CuratorGroupId, CuratorId]>;
-  readonly isMember: boolean;
-  readonly asMember: MemberId;
-  readonly isLead: boolean;
-}
+export interface Actor extends Null {}
 
 /** @name ActorId */
 export interface ActorId extends u64 {}
@@ -68,11 +62,7 @@ export interface AddOpeningParameters extends Struct {
 export interface Address extends AccountId {}
 
 /** @name AddSchemaSupportToEntityOperation */
-export interface AddSchemaSupportToEntityOperation extends Struct {
-  readonly entity_id: ParameterizedEntity;
-  readonly schema_id: SchemaId;
-  readonly parametrized_property_values: Vec<ParametrizedClassPropertyValue>;
-}
+export interface AddSchemaSupportToEntityOperation extends Null {}
 
 /** @name AdjustCapacityBy */
 export interface AdjustCapacityBy extends Enum {
@@ -188,20 +178,76 @@ export interface Category extends Struct {
 export interface CategoryId extends u64 {}
 
 /** @name Channel */
-export interface Channel extends Null {}
+export interface Channel extends Struct {
+  readonly owner: ChannelOwner;
+  readonly videos: Vec<VideoId>;
+  readonly playlists: Vec<PlaylistId>;
+  readonly series: Vec<SeriesId>;
+  readonly is_censored: bool;
+  readonly reward_account: Option<GenericAccountId>;
+}
+
+/** @name ChannelCategory */
+export interface ChannelCategory extends Struct {}
+
+/** @name ChannelCategoryCreationParameters */
+export interface ChannelCategoryCreationParameters extends Struct {
+  readonly meta: Bytes;
+}
+
+/** @name ChannelCategoryId */
+export interface ChannelCategoryId extends u64 {}
+
+/** @name ChannelCategoryUpdateParameters */
+export interface ChannelCategoryUpdateParameters extends Struct {
+  readonly new_meta: Bytes;
+}
 
 /** @name ChannelContentType */
 export interface ChannelContentType extends Null {}
 
+/** @name ChannelCreationParameters */
+export interface ChannelCreationParameters extends Struct {
+  readonly assets: Vec<NewAsset>;
+  readonly meta: Bytes;
+}
+
 /** @name ChannelCurationStatus */
 export interface ChannelCurationStatus extends Null {}
 
 /** @name ChannelId */
-export interface ChannelId extends Null {}
+export interface ChannelId extends u64 {}
+
+/** @name ChannelOwner */
+export interface ChannelOwner extends Enum {
+  readonly isMember: boolean;
+  readonly asMember: MemberId;
+  readonly isCurators: boolean;
+  readonly asCurators: CuratorGroupId;
+  readonly isDao: boolean;
+  readonly asDao: DAOId;
+}
+
+/** @name ChannelOwnershipTransferRequest */
+export interface ChannelOwnershipTransferRequest extends Struct {
+  readonly channel_id: ChannelId;
+  readonly new_owner: ChannelOwner;
+  readonly payment: u128;
+  readonly new_reward_account: Option<GenericAccountId>;
+}
+
+/** @name ChannelOwnershipTransferRequestId */
+export interface ChannelOwnershipTransferRequestId extends u64 {}
 
 /** @name ChannelPublicationStatus */
 export interface ChannelPublicationStatus extends Null {}
 
+/** @name ChannelUpdateParameters */
+export interface ChannelUpdateParameters extends Struct {
+  readonly assets: Option<Vec<NewAsset>>;
+  readonly new_meta: Bytes;
+}
+
 /** @name ChildPositionInParentCategory */
 export interface ChildPositionInParentCategory extends Struct {
   readonly parent_id: CategoryId;
@@ -209,39 +255,16 @@ export interface ChildPositionInParentCategory extends Struct {
 }
 
 /** @name Class */
-export interface Class extends Struct {
-  readonly class_permissions: ClassPermissions;
-  readonly properties: Vec<Property>;
-  readonly schemas: Vec<Schema>;
-  readonly name: Text;
-  readonly description: Text;
-  readonly maximum_entities_count: EntityId;
-  readonly current_number_of_entities: EntityId;
-  readonly default_entity_creation_voucher_upper_bound: EntityId;
-}
+export interface Class extends Null {}
 
 /** @name ClassId */
-export interface ClassId extends u64 {}
+export interface ClassId extends Null {}
 
 /** @name ClassOf */
-export interface ClassOf extends Struct {
-  readonly class_permissions: ClassPermissions;
-  readonly properties: Vec<Property>;
-  readonly schemas: Vec<Schema>;
-  readonly name: Text;
-  readonly description: Text;
-  readonly maximum_entities_count: EntityId;
-  readonly current_number_of_entities: EntityId;
-  readonly default_entity_creation_voucher_upper_bound: EntityId;
-}
+export interface ClassOf extends Null {}
 
 /** @name ClassPermissions */
-export interface ClassPermissions extends Struct {
-  readonly any_member: bool;
-  readonly entity_creation_blocked: bool;
-  readonly all_entity_property_values_locked: bool;
-  readonly maintainers: Vec<CuratorGroupId>;
-}
+export interface ClassPermissions extends Null {}
 
 /** @name ClassPermissionsType */
 export interface ClassPermissionsType extends Null {}
@@ -249,19 +272,36 @@ export interface ClassPermissionsType extends Null {}
 /** @name ClassPropertyValue */
 export interface ClassPropertyValue extends Null {}
 
+/** @name Content */
+export interface Content extends Vec<ContentParameters> {}
+
+/** @name ContentActor */
+export interface ContentActor extends Enum {
+  readonly isCurator: boolean;
+  readonly asCurator: ITuple<[CuratorGroupId, CuratorId]>;
+  readonly isMember: boolean;
+  readonly asMember: MemberId;
+  readonly isLead: boolean;
+}
+
 /** @name ContentId */
 export interface ContentId extends U8aFixed {}
 
-/** @name CreateEntityOperation */
-export interface CreateEntityOperation extends Struct {
-  readonly class_id: ClassId;
+/** @name ContentParameters */
+export interface ContentParameters extends Struct {
+  readonly content_id: ContentId;
+  readonly type_id: DataObjectTypeId;
+  readonly ipfs_content_id: Bytes;
 }
 
+/** @name CreateEntityOperation */
+export interface CreateEntityOperation extends Null {}
+
 /** @name Credential */
-export interface Credential extends u64 {}
+export interface Credential extends Null {}
 
 /** @name CredentialSet */
-export interface CredentialSet extends BTreeSet<Credential> {}
+export interface CredentialSet extends Null {}
 
 /** @name CurationActor */
 export interface CurationActor extends Null {}
@@ -285,7 +325,7 @@ export interface CuratorApplicationIdToCuratorIdMap extends Null {}
 export interface CuratorGroup extends Struct {
   readonly curators: Vec<CuratorId>;
   readonly active: bool;
-  readonly number_of_classes_maintained: u32;
+  readonly number_of_channels_owned: u32;
 }
 
 /** @name CuratorGroupId */
@@ -300,9 +340,12 @@ export interface CuratorOpening extends Null {}
 /** @name CuratorOpeningId */
 export interface CuratorOpeningId extends Null {}
 
+/** @name DAOId */
+export interface DAOId extends u64 {}
+
 /** @name DataObject */
 export interface DataObject extends Struct {
-  readonly owner: MemberId;
+  readonly owner: StorageObjectOwner;
   readonly added_at: BlockAndTime;
   readonly type_id: DataObjectTypeId;
   readonly liaison: StorageProviderId;
@@ -386,50 +429,25 @@ export interface ElectionStake extends Struct {
 }
 
 /** @name Entity */
-export interface Entity extends Struct {
-  readonly entity_permissions: EntityPermissions;
-  readonly class_id: ClassId;
-  readonly supported_schemas: Vec<SchemaId>;
-  readonly reference_counter: InboundReferenceCounter;
-}
+export interface Entity extends Null {}
 
 /** @name EntityController */
-export interface EntityController extends Enum {
-  readonly isMaintainers: boolean;
-  readonly isMember: boolean;
-  readonly asMember: MemberId;
-  readonly isLead: boolean;
-}
+export interface EntityController extends Null {}
 
 /** @name EntityCreationVoucher */
-export interface EntityCreationVoucher extends Struct {
-  readonly maximum_entities_count: EntityId;
-  readonly entities_created: EntityId;
-}
+export interface EntityCreationVoucher extends Null {}
 
 /** @name EntityId */
-export interface EntityId extends u64 {}
+export interface EntityId extends Null {}
 
 /** @name EntityOf */
-export interface EntityOf extends Struct {
-  readonly entity_permissions: EntityPermissions;
-  readonly class_id: ClassId;
-  readonly supported_schemas: Vec<SchemaId>;
-  readonly reference_counter: InboundReferenceCounter;
-}
+export interface EntityOf extends Null {}
 
 /** @name EntityPermissions */
-export interface EntityPermissions extends Struct {
-  readonly controller: EntityController;
-  readonly frozen: bool;
-  readonly referenceable: bool;
-}
+export interface EntityPermissions extends Null {}
 
 /** @name EntityReferenceCounterSideEffect */
-export interface EntityReferenceCounterSideEffect extends Struct {
-  readonly total: i32;
-  readonly same_owner: i32;
-}
+export interface EntityReferenceCounterSideEffect extends Null {}
 
 /** @name EntryMethod */
 export interface EntryMethod extends Enum {
@@ -440,13 +458,21 @@ export interface EntryMethod extends Enum {
   readonly isGenesis: boolean;
 }
 
+/** @name EpisodeParemters */
+export interface EpisodeParemters extends Enum {
+  readonly isNewVideo: boolean;
+  readonly asNewVideo: VideoCreationParameters;
+  readonly isExistingVideo: boolean;
+  readonly asExistingVideo: VideoId;
+}
+
 /** @name ExecutionFailed */
 export interface ExecutionFailed extends Struct {
   readonly error: Text;
 }
 
 /** @name FailedAt */
-export interface FailedAt extends u32 {}
+export interface FailedAt extends Null {}
 
 /** @name FillOpeningParameters */
 export interface FillOpeningParameters extends Struct {
@@ -465,7 +491,7 @@ export interface Finalized extends Struct {
 }
 
 /** @name HashedTextMaxLength */
-export interface HashedTextMaxLength extends Option<u16> {}
+export interface HashedTextMaxLength extends Null {}
 
 /** @name HiringApplicationId */
 export interface HiringApplicationId extends u64 {}
@@ -478,21 +504,13 @@ export interface InactiveApplicationStage extends Struct {
 }
 
 /** @name InboundReferenceCounter */
-export interface InboundReferenceCounter extends Struct {
-  readonly total: u32;
-  readonly same_owner: u32;
-}
+export interface InboundReferenceCounter extends Null {}
 
 /** @name InputEntityValuesMap */
-export interface InputEntityValuesMap extends BTreeMap<PropertyId, InputPropertyValue> {}
+export interface InputEntityValuesMap extends Null {}
 
 /** @name InputPropertyValue */
-export interface InputPropertyValue extends Enum {
-  readonly isSingle: boolean;
-  readonly asSingle: InputValue;
-  readonly isVector: boolean;
-  readonly asVector: VecInputValue;
-}
+export interface InputPropertyValue extends Null {}
 
 /** @name InputValidationLengthConstraint */
 export interface InputValidationLengthConstraint extends Struct {
@@ -501,28 +519,7 @@ export interface InputValidationLengthConstraint extends Struct {
 }
 
 /** @name InputValue */
-export interface InputValue extends Enum {
-  readonly isBool: boolean;
-  readonly asBool: bool;
-  readonly isUint16: boolean;
-  readonly asUint16: u16;
-  readonly isUint32: boolean;
-  readonly asUint32: u32;
-  readonly isUint64: boolean;
-  readonly asUint64: u64;
-  readonly isInt16: boolean;
-  readonly asInt16: i16;
-  readonly isInt32: boolean;
-  readonly asInt32: i32;
-  readonly isInt64: boolean;
-  readonly asInt64: i64;
-  readonly isText: boolean;
-  readonly asText: Text;
-  readonly isTextToHash: boolean;
-  readonly asTextToHash: Text;
-  readonly isReference: boolean;
-  readonly asReference: EntityId;
-}
+export interface InputValue extends Null {}
 
 /** @name IPNSIdentity */
 export interface IPNSIdentity extends Text {}
@@ -543,6 +540,9 @@ export interface LiaisonJudgement extends Enum {
 /** @name LookupSource */
 export interface LookupSource extends AccountId {}
 
+/** @name MaxNumber */
+export interface MaxNumber extends u32 {}
+
 /** @name MemberId */
 export interface MemberId extends u64 {}
 
@@ -584,6 +584,14 @@ export interface ModerationAction extends Struct {
   readonly rationale: Text;
 }
 
+/** @name NewAsset */
+export interface NewAsset extends Enum {
+  readonly isUpload: boolean;
+  readonly asUpload: ContentParameters;
+  readonly isUrls: boolean;
+  readonly asUrls: Vec<Url>;
+}
+
 /** @name NextAdjustment */
 export interface NextAdjustment extends Struct {
   readonly adjustment: AdjustOnInterval;
@@ -591,7 +599,7 @@ export interface NextAdjustment extends Struct {
 }
 
 /** @name Nonce */
-export interface Nonce extends u64 {}
+export interface Nonce extends Null {}
 
 /** @name Opening */
 export interface Opening extends Struct {
@@ -658,14 +666,7 @@ export interface OpeningType extends Enum {
 export interface Operation extends Null {}
 
 /** @name OperationType */
-export interface OperationType extends Enum {
-  readonly isCreateEntity: boolean;
-  readonly asCreateEntity: CreateEntityOperation;
-  readonly isUpdatePropertyValues: boolean;
-  readonly asUpdatePropertyValues: UpdatePropertyValuesOperation;
-  readonly isAddSchemaSupportToEntity: boolean;
-  readonly asAddSchemaSupportToEntity: AddSchemaSupportToEntityOperation;
-}
+export interface OperationType extends Null {}
 
 /** @name OptionalText */
 export interface OptionalText extends Null {}
@@ -680,27 +681,65 @@ export interface PaidMembershipTerms extends Struct {
 export interface PaidTermId extends u64 {}
 
 /** @name ParameterizedEntity */
-export interface ParameterizedEntity extends Enum {
-  readonly isInternalEntityJustAdded: boolean;
-  readonly asInternalEntityJustAdded: u32;
-  readonly isExistingEntity: boolean;
-  readonly asExistingEntity: EntityId;
-}
+export interface ParameterizedEntity extends Null {}
 
 /** @name ParametrizedClassPropertyValue */
-export interface ParametrizedClassPropertyValue extends Struct {
-  readonly in_class_index: PropertyId;
-  readonly value: ParametrizedPropertyValue;
-}
+export interface ParametrizedClassPropertyValue extends Null {}
 
 /** @name ParametrizedPropertyValue */
-export interface ParametrizedPropertyValue extends Enum {
-  readonly isInputPropertyValue: boolean;
-  readonly asInputPropertyValue: InputPropertyValue;
-  readonly isInternalEntityJustAdded: boolean;
-  readonly asInternalEntityJustAdded: u32;
-  readonly isInternalEntityVec: boolean;
-  readonly asInternalEntityVec: Vec<ParameterizedEntity>;
+export interface ParametrizedPropertyValue extends Null {}
+
+/** @name Person */
+export interface Person extends Struct {
+  readonly controlled_by: PersonController;
+}
+
+/** @name PersonActor */
+export interface PersonActor extends Enum {
+  readonly isMember: boolean;
+  readonly asMember: MemberId;
+  readonly isCurator: boolean;
+  readonly asCurator: CuratorId;
+}
+
+/** @name PersonController */
+export interface PersonController extends Enum {
+  readonly isMember: boolean;
+  readonly asMember: MemberId;
+  readonly isCurators: boolean;
+}
+
+/** @name PersonCreationParameters */
+export interface PersonCreationParameters extends Struct {
+  readonly assets: Vec<NewAsset>;
+  readonly meta: Bytes;
+}
+
+/** @name PersonId */
+export interface PersonId extends u64 {}
+
+/** @name PersonUpdateParameters */
+export interface PersonUpdateParameters extends Struct {
+  readonly assets: Option<Vec<NewAsset>>;
+  readonly meta: Option<Bytes>;
+}
+
+/** @name Playlist */
+export interface Playlist extends Struct {
+  readonly in_channel: ChannelId;
+}
+
+/** @name PlaylistCreationParameters */
+export interface PlaylistCreationParameters extends Struct {
+  readonly meta: Bytes;
+}
+
+/** @name PlaylistId */
+export interface PlaylistId extends u64 {}
+
+/** @name PlaylistUpdateParameters */
+export interface PlaylistUpdateParameters extends Struct {
+  readonly new_meta: Bytes;
 }
 
 /** @name Post */
@@ -731,54 +770,22 @@ export interface Principal extends Null {}
 export interface PrincipalId extends Null {}
 
 /** @name Property */
-export interface Property extends Struct {
-  readonly property_type: PropertyType;
-  readonly required: bool;
-  readonly unique: bool;
-  readonly name: Text;
-  readonly description: Text;
-  readonly locking_policy: PropertyLockingPolicy;
-}
+export interface Property extends Null {}
 
 /** @name PropertyId */
-export interface PropertyId extends u16 {}
+export interface PropertyId extends Null {}
 
 /** @name PropertyLockingPolicy */
-export interface PropertyLockingPolicy extends Struct {
-  readonly is_locked_from_maintainer: bool;
-  readonly is_locked_from_controller: bool;
-}
+export interface PropertyLockingPolicy extends Null {}
 
 /** @name PropertyType */
-export interface PropertyType extends Enum {
-  readonly isSingle: boolean;
-  readonly asSingle: PropertyTypeSingle;
-  readonly isVector: boolean;
-  readonly asVector: PropertyTypeVector;
-}
+export interface PropertyType extends Null {}
 
 /** @name PropertyTypeSingle */
-export interface PropertyTypeSingle extends Enum {
-  readonly isBool: boolean;
-  readonly isUint16: boolean;
-  readonly isUint32: boolean;
-  readonly isUint64: boolean;
-  readonly isInt16: boolean;
-  readonly isInt32: boolean;
-  readonly isInt64: boolean;
-  readonly isText: boolean;
-  readonly asText: TextMaxLength;
-  readonly isHash: boolean;
-  readonly asHash: HashedTextMaxLength;
-  readonly isReference: boolean;
-  readonly asReference: ITuple<[ClassId, SameController]>;
-}
+export interface PropertyTypeSingle extends Null {}
 
 /** @name PropertyTypeVector */
-export interface PropertyTypeVector extends Struct {
-  readonly vec_type: PropertyTypeSingle;
-  readonly max_length: VecMaxLength;
-}
+export interface PropertyTypeVector extends Null {}
 
 /** @name ProposalDecisionStatus */
 export interface ProposalDecisionStatus extends Enum {
@@ -900,6 +907,17 @@ export interface ProposalStatus extends Enum {
   readonly asFinalized: Finalized;
 }
 
+/** @name Quota */
+export interface Quota extends Struct {
+  readonly size_limit: u64;
+  readonly objects_limit: u64;
+  readonly size_used: u64;
+  readonly objects_used: u64;
+}
+
+/** @name QuotaLimit */
+export interface QuotaLimit extends u64 {}
+
 /** @name RationaleText */
 export interface RationaleText extends Bytes {}
 
@@ -916,7 +934,7 @@ export interface RecipientId extends u64 {}
 export interface ReferenceConstraint extends Null {}
 
 /** @name ReferenceCounterSideEffects */
-export interface ReferenceCounterSideEffects extends BTreeMap<EntityId, EntityReferenceCounterSideEffect> {}
+export interface ReferenceCounterSideEffects extends Null {}
 
 /** @name Reply */
 export interface Reply extends Struct {
@@ -979,16 +997,13 @@ export interface RoleStakeProfile extends Struct {
 }
 
 /** @name SameController */
-export interface SameController extends bool {}
+export interface SameController extends Null {}
 
 /** @name Schema */
-export interface Schema extends Struct {
-  readonly properties: Vec<PropertyId>;
-  readonly is_active: bool;
-}
+export interface Schema extends Null {}
 
 /** @name SchemaId */
-export interface SchemaId extends u16 {}
+export interface SchemaId extends Null {}
 
 /** @name SealedVote */
 export interface SealedVote extends Struct {
@@ -998,6 +1013,18 @@ export interface SealedVote extends Struct {
   readonly vote: Option<GenericAccountId>;
 }
 
+/** @name Season */
+export interface Season extends Struct {
+  readonly episodes: Vec<VideoId>;
+}
+
+/** @name SeasonParameters */
+export interface SeasonParameters extends Struct {
+  readonly assets: Option<Vec<NewAsset>>;
+  readonly episodes: Option<Vec<Option<EpisodeParemters>>>;
+  readonly meta: Option<Bytes>;
+}
+
 /** @name Seat */
 export interface Seat extends Struct {
   readonly member: GenericAccountId;
@@ -1008,6 +1035,22 @@ export interface Seat extends Struct {
 /** @name Seats */
 export interface Seats extends Vec<Seat> {}
 
+/** @name Series */
+export interface Series extends Struct {
+  readonly in_channel: ChannelId;
+  readonly seasons: Vec<Season>;
+}
+
+/** @name SeriesId */
+export interface SeriesId extends u64 {}
+
+/** @name SeriesParameters */
+export interface SeriesParameters extends Struct {
+  readonly assets: Option<Vec<NewAsset>>;
+  readonly seasons: Option<Vec<Option<SeasonParameters>>>;
+  readonly meta: Option<Bytes>;
+}
+
 /** @name ServiceProviderRecord */
 export interface ServiceProviderRecord extends Struct {
   readonly identity: IPNSIdentity;
@@ -1018,10 +1061,10 @@ export interface ServiceProviderRecord extends Struct {
 export interface SetLeadParams extends ITuple<[MemberId, GenericAccountId]> {}
 
 /** @name SideEffect */
-export interface SideEffect extends Option<ITuple<[EntityId, EntityReferenceCounterSideEffect]>> {}
+export interface SideEffect extends Null {}
 
 /** @name SideEffects */
-export interface SideEffects extends Option<ReferenceCounterSideEffects> {}
+export interface SideEffects extends Null {}
 
 /** @name Slash */
 export interface Slash extends Struct {
@@ -1090,42 +1133,29 @@ export interface StakingStatus extends Enum {
 }
 
 /** @name Status */
-export interface Status extends bool {}
+export interface Status extends Null {}
+
+/** @name StorageObjectOwner */
+export interface StorageObjectOwner extends Enum {
+  readonly isMember: boolean;
+  readonly asMember: MemberId;
+  readonly isChannel: boolean;
+  readonly asChannel: ChannelId;
+  readonly isDao: boolean;
+  readonly asDao: DAOId;
+  readonly isCouncil: boolean;
+  readonly isWorkingGroup: boolean;
+  readonly asWorkingGroup: WorkingGroup;
+}
 
 /** @name StorageProviderId */
 export interface StorageProviderId extends u64 {}
 
 /** @name StoredPropertyValue */
-export interface StoredPropertyValue extends Enum {
-  readonly isSingle: boolean;
-  readonly asSingle: StoredValue;
-  readonly isVector: boolean;
-  readonly asVector: VecStoredPropertyValue;
-}
+export interface StoredPropertyValue extends Null {}
 
 /** @name StoredValue */
-export interface StoredValue extends Enum {
-  readonly isBool: boolean;
-  readonly asBool: bool;
-  readonly isUint16: boolean;
-  readonly asUint16: u16;
-  readonly isUint32: boolean;
-  readonly asUint32: u32;
-  readonly isUint64: boolean;
-  readonly asUint64: u64;
-  readonly isInt16: boolean;
-  readonly asInt16: i16;
-  readonly isInt32: boolean;
-  readonly asInt32: i32;
-  readonly isInt64: boolean;
-  readonly asInt64: i64;
-  readonly isText: boolean;
-  readonly asText: Text;
-  readonly isHash: boolean;
-  readonly asHash: Hash;
-  readonly isReference: boolean;
-  readonly asReference: EntityId;
-}
+export interface StoredValue extends Null {}
 
 /** @name SubscriptionId */
 export interface SubscriptionId extends u64 {}
@@ -1139,7 +1169,7 @@ export interface TerminateRoleParameters extends Struct {
 }
 
 /** @name TextMaxLength */
-export interface TextMaxLength extends u16 {}
+export interface TextMaxLength extends Null {}
 
 /** @name Thread */
 export interface Thread extends Struct {
@@ -1183,69 +1213,63 @@ export interface UnstakingApplicationStage extends Struct {
 }
 
 /** @name UpdatePropertyValuesOperation */
-export interface UpdatePropertyValuesOperation extends Struct {
-  readonly entity_id: ParameterizedEntity;
-  readonly new_parametrized_property_values: Vec<ParametrizedClassPropertyValue>;
-}
+export interface UpdatePropertyValuesOperation extends Null {}
+
+/** @name UploadingStatus */
+export interface UploadingStatus extends bool {}
 
 /** @name Url */
 export interface Url extends Text {}
 
 /** @name VecInputValue */
-export interface VecInputValue extends Enum {
-  readonly isBool: boolean;
-  readonly asBool: Vec<bool>;
-  readonly isUint16: boolean;
-  readonly asUint16: Vec<u16>;
-  readonly isUint32: boolean;
-  readonly asUint32: Vec<u32>;
-  readonly isUint64: boolean;
-  readonly asUint64: Vec<u64>;
-  readonly isInt16: boolean;
-  readonly asInt16: Vec<i16>;
-  readonly isInt32: boolean;
-  readonly asInt32: Vec<i32>;
-  readonly isInt64: boolean;
-  readonly asInt64: Vec<i64>;
-  readonly isTextToHash: boolean;
-  readonly asTextToHash: Vec<Text>;
-  readonly isText: boolean;
-  readonly asText: Vec<Text>;
-  readonly isReference: boolean;
-  readonly asReference: Vec<EntityId>;
-}
+export interface VecInputValue extends Null {}
 
 /** @name VecMaxLength */
-export interface VecMaxLength extends u16 {}
+export interface VecMaxLength extends Null {}
 
 /** @name VecStoredPropertyValue */
-export interface VecStoredPropertyValue extends Struct {
-  readonly vec_value: VecStoredValue;
-  readonly nonce: Nonce;
-}
+export interface VecStoredPropertyValue extends Null {}
 
 /** @name VecStoredValue */
-export interface VecStoredValue extends Enum {
-  readonly isBool: boolean;
-  readonly asBool: Vec<bool>;
-  readonly isUint16: boolean;
-  readonly asUint16: Vec<u16>;
-  readonly isUint32: boolean;
-  readonly asUint32: Vec<u32>;
-  readonly isUint64: boolean;
-  readonly asUint64: Vec<u64>;
-  readonly isInt16: boolean;
-  readonly asInt16: Vec<i16>;
-  readonly isInt32: boolean;
-  readonly asInt32: Vec<i32>;
-  readonly isInt64: boolean;
-  readonly asInt64: Vec<i64>;
-  readonly isHash: boolean;
-  readonly asHash: Vec<Hash>;
-  readonly isText: boolean;
-  readonly asText: Vec<Text>;
-  readonly isReference: boolean;
-  readonly asReference: Vec<EntityId>;
+export interface VecStoredValue extends Null {}
+
+/** @name Video */
+export interface Video extends Struct {
+  readonly in_channel: ChannelId;
+  readonly in_series: Option<SeriesId>;
+  readonly is_censored: bool;
+  readonly is_featured: bool;
+}
+
+/** @name VideoCategory */
+export interface VideoCategory extends Struct {}
+
+/** @name VideoCategoryCreationParameters */
+export interface VideoCategoryCreationParameters extends Struct {
+  readonly meta: Bytes;
+}
+
+/** @name VideoCategoryId */
+export interface VideoCategoryId extends u64 {}
+
+/** @name VideoCategoryUpdateParameters */
+export interface VideoCategoryUpdateParameters extends Struct {
+  readonly new_meta: Bytes;
+}
+
+/** @name VideoCreationParameters */
+export interface VideoCreationParameters extends Struct {
+  readonly assets: Vec<NewAsset>;
+  readonly meta: Bytes;
+}
+
+/** @name VideoId */
+export interface VideoId extends u64 {}
+
+/** @name VideoUpdateParameters */
+export interface VideoUpdateParameters extends Struct {
+  readonly assets: Option<Vec<NewAsset>>;
+  readonly new_meta: Option<Bytes>;
 }
 
 /** @name VoteKind */

+ 7 - 0
types/augment/augment-api-consts.ts

@@ -3,6 +3,7 @@
 
 import { Vec } from '@polkadot/types/codec';
 import { u32, u64 } from '@polkadot/types/primitive';
+import { MaxNumber } from './all';
 import { Balance, BalanceOf, BlockNumber, Moment, Perbill, RuntimeDbWeight, Weight } from '@polkadot/types/interfaces/runtime';
 import { SessionIndex } from '@polkadot/types/interfaces/session';
 import { EraIndex } from '@polkadot/types/interfaces/staking';
@@ -31,6 +32,12 @@ declare module '@polkadot/metadata/Decorated/consts/types' {
        **/
       existentialDeposit: AugmentedConst<Balance>;
     };
+    content: {
+      /**
+       * Exports const -  max number of curators per group
+       **/
+      maxNumberOfCuratorsPerGroup: AugmentedConst<MaxNumber>;
+    };
     contentDirectoryWorkingGroup: {
       /**
        * Exports const -  max simultaneous active worker number.

+ 38 - 20
types/augment/augment-api-query.ts

@@ -4,7 +4,7 @@
 import { AnyNumber, ITuple, Observable } from '@polkadot/types/types';
 import { Option, Vec } from '@polkadot/types/codec';
 import { Bytes, bool, u32, u64 } from '@polkadot/types/primitive';
-import { Application, ApplicationId, ApplicationOf, Category, CategoryId, ClassId, ClassOf, ContentId, CuratorGroup, CuratorGroupId, DataObject, DataObjectStorageRelationship, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DiscussionPost, DiscussionThread, ElectionStage, ElectionStake, EntityController, EntityCreationVoucher, EntityId, EntityOf, HiringApplicationId, InputValidationLengthConstraint, MemberId, Membership, MemoText, Mint, MintId, Opening, OpeningId, OpeningOf, PaidMembershipTerms, PaidTermId, Post, PostId, PropertyId, ProposalDetailsOf, ProposalId, ProposalOf, Recipient, RecipientId, RewardRelationship, RewardRelationshipId, SealedVote, Seats, ServiceProviderRecord, Stake, StakeId, StorageProviderId, Thread, ThreadCounter, ThreadId, TransferableStake, Url, VoteKind, WorkerId, WorkerOf } from './all';
+import { Application, ApplicationId, ApplicationOf, Category, CategoryId, Channel, ChannelCategory, ChannelCategoryId, ChannelId, ChannelOwnershipTransferRequest, ChannelOwnershipTransferRequestId, ContentId, CuratorGroup, CuratorGroupId, DataObject, DataObjectStorageRelationship, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DiscussionPost, DiscussionThread, ElectionStage, ElectionStake, HiringApplicationId, InputValidationLengthConstraint, MemberId, Membership, MemoText, Mint, MintId, Opening, OpeningId, OpeningOf, PaidMembershipTerms, PaidTermId, Person, PersonId, Playlist, PlaylistId, Post, PostId, ProposalDetailsOf, ProposalId, ProposalOf, Quota, Recipient, RecipientId, RewardRelationship, RewardRelationshipId, SealedVote, Seats, Series, SeriesId, ServiceProviderRecord, Stake, StakeId, StorageObjectOwner, StorageProviderId, Thread, ThreadCounter, ThreadId, TransferableStake, Url, Video, VideoCategory, VideoCategoryId, VideoId, VoteKind, WorkerId, WorkerOf } from './all';
 import { UncleEntryItem } from '@polkadot/types/interfaces/authorship';
 import { BabeAuthorityWeight, MaybeRandomness, NextConfigDescriptor, Randomness } from '@polkadot/types/interfaces/babe';
 import { AccountData, BalanceLock } from '@polkadot/types/interfaces/balances';
@@ -127,30 +127,28 @@ declare module '@polkadot/api/types/storage' {
        **/
       totalIssuance: AugmentedQuery<ApiType, () => Observable<Balance>>;
     };
-    contentDirectory: {
-      /**
-       * Map, representing ClassId -> Class relation
-       **/
-      classById: AugmentedQuery<ApiType, (arg: ClassId | AnyNumber | Uint8Array) => Observable<ClassOf>>;
+    content: {
+      channelById: AugmentedQuery<ApiType, (arg: ChannelId | AnyNumber | Uint8Array) => Observable<Channel>>;
+      channelCategoryById: AugmentedQuery<ApiType, (arg: ChannelCategoryId | AnyNumber | Uint8Array) => Observable<ChannelCategory>>;
+      channelOwnershipTransferRequestById: AugmentedQuery<ApiType, (arg: ChannelOwnershipTransferRequestId | AnyNumber | Uint8Array) => Observable<ChannelOwnershipTransferRequest>>;
       /**
        * Map, representing  CuratorGroupId -> CuratorGroup relation
        **/
       curatorGroupById: AugmentedQuery<ApiType, (arg: CuratorGroupId | AnyNumber | Uint8Array) => Observable<CuratorGroup>>;
-      /**
-       * Map, representing EntityId -> Entity relation
-       **/
-      entityById: AugmentedQuery<ApiType, (arg: EntityId | AnyNumber | Uint8Array) => Observable<EntityOf>>;
-      entityCreationVouchers: AugmentedQueryDoubleMap<ApiType, (key1: ClassId | AnyNumber | Uint8Array, key2: EntityController | { Maintainers: any } | { Member: any } | { Lead: any } | string | Uint8Array) => Observable<EntityCreationVoucher>>;
-      /**
-       * Next runtime storage values used to maintain next id value, used on creation of respective curator groups, classes and entities
-       **/
-      nextClassId: AugmentedQuery<ApiType, () => Observable<ClassId>>;
+      nextChannelCategoryId: AugmentedQuery<ApiType, () => Observable<ChannelCategoryId>>;
+      nextChannelId: AugmentedQuery<ApiType, () => Observable<ChannelId>>;
+      nextChannelOwnershipTransferRequestId: AugmentedQuery<ApiType, () => Observable<ChannelOwnershipTransferRequestId>>;
       nextCuratorGroupId: AugmentedQuery<ApiType, () => Observable<CuratorGroupId>>;
-      nextEntityId: AugmentedQuery<ApiType, () => Observable<EntityId>>;
-      /**
-       * Mapping of class id and its property id to the respective entity id and property value hash.
-       **/
-      uniquePropertyValueHashes: AugmentedQueryDoubleMap<ApiType, (key1: ITuple<[ClassId, PropertyId]> | [ClassId | AnyNumber | Uint8Array, PropertyId | AnyNumber | Uint8Array], key2: Hash | string | Uint8Array) => Observable<ITuple<[]>>>;
+      nextPersonId: AugmentedQuery<ApiType, () => Observable<PersonId>>;
+      nextPlaylistId: AugmentedQuery<ApiType, () => Observable<PlaylistId>>;
+      nextSeriesId: AugmentedQuery<ApiType, () => Observable<SeriesId>>;
+      nextVideoCategoryId: AugmentedQuery<ApiType, () => Observable<VideoCategoryId>>;
+      nextVideoId: AugmentedQuery<ApiType, () => Observable<VideoId>>;
+      personById: AugmentedQuery<ApiType, (arg: PersonId | AnyNumber | Uint8Array) => Observable<Person>>;
+      playlistById: AugmentedQuery<ApiType, (arg: PlaylistId | AnyNumber | Uint8Array) => Observable<Playlist>>;
+      seriesById: AugmentedQuery<ApiType, (arg: SeriesId | AnyNumber | Uint8Array) => Observable<Series>>;
+      videoById: AugmentedQuery<ApiType, (arg: VideoId | AnyNumber | Uint8Array) => Observable<Video>>;
+      videoCategoryById: AugmentedQuery<ApiType, (arg: VideoCategoryId | AnyNumber | Uint8Array) => Observable<VideoCategory>>;
     };
     contentDirectoryWorkingGroup: {
       /**
@@ -257,10 +255,30 @@ declare module '@polkadot/api/types/storage' {
        * Maps data objects by their content id.
        **/
       dataObjectByContentId: AugmentedQuery<ApiType, (arg: ContentId | string | Uint8Array) => Observable<Option<DataObject>>>;
+      /**
+       * Global quota.
+       **/
+      globalQuota: AugmentedQuery<ApiType, () => Observable<Quota>>;
       /**
        * List of ids known to the system.
        **/
       knownContentIds: AugmentedQuery<ApiType, () => Observable<Vec<ContentId>>>;
+      /**
+       * Upper bound for the Quota objects number limit.
+       **/
+      quotaObjectsLimitUpperBound: AugmentedQuery<ApiType, () => Observable<u64>>;
+      /**
+       * Maps storage owner to it`s quota. Created when the first upload by the new actor occured.
+       **/
+      quotas: AugmentedQuery<ApiType, (arg: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array) => Observable<Quota>>;
+      /**
+       * Upper bound for the Quota size limit.
+       **/
+      quotaSizeLimitUpperBound: AugmentedQuery<ApiType, () => Observable<u64>>;
+      /**
+       * If all new uploads blocked
+       **/
+      uploadingBlocked: AugmentedQuery<ApiType, () => Observable<bool>>;
     };
     dataObjectStorageRegistry: {
       /**

+ 52 - 82
types/augment/augment-api-tx.ts

@@ -2,9 +2,9 @@
 /* eslint-disable */
 
 import { AnyNumber } from '@polkadot/types/types';
-import { BTreeMap, BTreeSet, Compact, Option, Vec } from '@polkadot/types/codec';
+import { Compact, Option, Vec } from '@polkadot/types/codec';
 import { Bytes, bool, u16, u32, u64 } from '@polkadot/types/primitive';
-import { ActivateOpeningAt, Actor, AddOpeningParameters, ApplicationId, ApplicationIdSet, BalanceOfMint, CategoryId, ClassId, ClassPermissions, ContentId, CuratorGroupId, CuratorId, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DataObjectsMap, ElectionParameters, EntityController, EntityId, FillOpeningParameters, InputPropertyValue, InputValue, MemberId, MemoText, Nonce, OpeningId, OpeningPolicyCommitment, OpeningType, OperationType, PaidTermId, PostId, Property, PropertyId, ProposalId, RewardPolicy, SchemaId, StorageProviderId, TerminateRoleParameters, ThreadId, Url, VecMaxLength, VoteKind, WorkerId, WorkingGroup } from './all';
+import { ActivateOpeningAt, AddOpeningParameters, ApplicationId, ApplicationIdSet, BalanceOfMint, CategoryId, ChannelCategoryCreationParameters, ChannelCategoryId, ChannelCategoryUpdateParameters, ChannelCreationParameters, ChannelId, ChannelOwner, ChannelOwnershipTransferRequestId, ChannelUpdateParameters, ContentId, ContentParameters, CuratorGroupId, CuratorId, DataObjectStorageRelationshipId, DataObjectType, DataObjectTypeId, DataObjectsMap, ElectionParameters, FillOpeningParameters, MemberId, MemoText, OpeningId, OpeningPolicyCommitment, OpeningType, PaidTermId, PersonActor, PersonCreationParameters, PersonId, PersonUpdateParameters, PlaylistCreationParameters, PlaylistId, PlaylistUpdateParameters, PostId, ProposalId, RewardPolicy, SeriesId, SeriesParameters, StorageObjectOwner, StorageProviderId, TerminateRoleParameters, ThreadId, Url, VideoCategoryCreationParameters, VideoCategoryId, VideoCategoryUpdateParameters, VideoCreationParameters, VideoId, VideoUpdateParameters, VoteKind, WorkerId, WorkingGroup } from './all';
 import { Extrinsic, Signature } from '@polkadot/types/interfaces/extrinsics';
 import { GrandpaEquivocationProof, KeyOwnerProof } from '@polkadot/types/interfaces/grandpa';
 import { Heartbeat } from '@polkadot/types/interfaces/imOnline';
@@ -98,100 +98,58 @@ declare module '@polkadot/api/types/submittable' {
        **/
       transferKeepAlive: AugmentedSubmittable<(dest: LookupSource | string | Uint8Array, value: Compact<Balance> | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
     };
-    contentDirectory: {
-      /**
-       * Create new class schema from existing property ids and new properties
-       **/
-      addClassSchema: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, existingProperties: BTreeSet<PropertyId>, newProperties: Vec<Property> | (Property | { property_type?: any; required?: any; unique?: any; name?: any; description?: any; locking_policy?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Add new curator group to runtime storage
-       **/
-      addCuratorGroup: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>>;
+    content: {
+      acceptChannelTransfer: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, requestId: ChannelOwnershipTransferRequestId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
        * Add curator to curator group under given `curator_group_id`
        **/
       addCuratorToGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array, curatorId: CuratorId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      addPersonToVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array, person: PersonId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      cancelChannelTransferRequest: AugmentedSubmittable<(requestId: ChannelOwnershipTransferRequestId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      censorChannel: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      censorVideo: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createChannel: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, params: ChannelCreationParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createChannelCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, params: ChannelCategoryCreationParameters | { meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
-       * Add curator group under given `curator_group_id` as `Class` maintainer
-       **/
-      addMaintainerToClass: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Add schema support to entity under given `schema_id` and provided `property_values`
-       **/
-      addSchemaSupportToEntity: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, schemaId: SchemaId | AnyNumber | Uint8Array, newPropertyValues: BTreeMap<PropertyId, InputPropertyValue>) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Clear `PropertyValueVec` under given `entity_id` & `in_class_schema_property_id`
-       **/
-      clearEntityPropertyVector: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, inClassSchemaPropertyId: PropertyId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Create new `Class` with provided parameters
-       **/
-      createClass: AugmentedSubmittable<(name: Bytes | string | Uint8Array, description: Bytes | string | Uint8Array, classPermissions: ClassPermissions | { any_member?: any; entity_creation_blocked?: any; all_entity_property_values_locked?: any; maintainers?: any } | string | Uint8Array, maximumEntitiesCount: EntityId | AnyNumber | Uint8Array, defaultEntityCreationVoucherUpperBound: EntityId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Create entity.
-       * If someone is making an entity of this class for first time,
-       * then a voucher is also added with the class limit as the default limit value.
-       **/
-      createEntity: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Insert `SingleInputPropertyValue` at given `index_in_property_vector`
-       * into `PropertyValueVec` under `in_class_schema_property_id`
+       * Add new curator group to runtime storage
        **/
-      insertAtEntityPropertyVector: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, inClassSchemaPropertyId: PropertyId | AnyNumber | Uint8Array, indexInPropertyVector: VecMaxLength | AnyNumber | Uint8Array, value: InputValue | { Bool: any } | { Uint16: any } | { Uint32: any } | { Uint64: any } | { Int16: any } | { Int32: any } | { Int64: any } | { Text: any } | { TextToHash: any } | { Reference: any } | string | Uint8Array, nonce: Nonce | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createCuratorGroup: AugmentedSubmittable<() => SubmittableExtrinsic<ApiType>>;
+      createPerson: AugmentedSubmittable<(actor: PersonActor | { Member: any } | { Curator: any } | string | Uint8Array, params: PersonCreationParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createPlaylist: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: PlaylistCreationParameters | { meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createSeries: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: SeriesParameters | { assets?: any; seasons?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: VideoCreationParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      createVideoCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, params: VideoCategoryCreationParameters | { meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteChannel: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteChannelCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: ChannelCategoryId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
-       * Remove value at given `index_in_property_vector`
-       * from `PropertyValueVec` under `in_class_schema_property_id`
+       * Remove curator group under given `curator_group_id` from runtime storage
        **/
-      removeAtEntityPropertyVector: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, inClassSchemaPropertyId: PropertyId | AnyNumber | Uint8Array, indexInPropertyVector: VecMaxLength | AnyNumber | Uint8Array, nonce: Nonce | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteCuratorGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deletePerson: AugmentedSubmittable<(actor: PersonActor | { Member: any } | { Curator: any } | string | Uint8Array, person: PersonId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deletePlaylist: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, playlist: PlaylistId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteSeries: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, series: SeriesId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, video: VideoId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      deleteVideoCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: VideoCategoryId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
        * Remove curator from a given curator group
        **/
       removeCuratorFromGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array, curatorId: CuratorId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Remove curator group under given `curator_group_id` from runtime storage
-       **/
-      removeCuratorGroup: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Remove `Entity` under provided `entity_id`
-       **/
-      removeEntity: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Remove curator group under given `curator_group_id` from `Class` maintainers set
-       **/
-      removeMaintainerFromClass: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      removePersonFromVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      requestChannelTransfer: AugmentedSubmittable<(newOwner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, payment: BalanceOf | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
        * Set `is_active` status for curator group under given `curator_group_id`
        **/
       setCuratorGroupStatus: AugmentedSubmittable<(curatorGroupId: CuratorGroupId | AnyNumber | Uint8Array, isActive: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Batch transaction
-       **/
-      transaction: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, operations: Vec<OperationType> | (OperationType | { CreateEntity: any } | { UpdatePropertyValues: any } | { AddSchemaSupportToEntity: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Transfer ownership to new `EntityController` for `Entity` under given `entity_id`
-       * `new_property_value_references_with_same_owner_flag_set` should be provided manually
-       **/
-      transferEntityOwnership: AugmentedSubmittable<(entityId: EntityId | AnyNumber | Uint8Array, newController: EntityController | { Maintainers: any } | { Member: any } | { Lead: any } | string | Uint8Array, newPropertyValueReferencesWithSameOwnerFlagSet: BTreeMap<PropertyId, InputPropertyValue>) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update `ClassPermissions` under specific `class_id`
-       **/
-      updateClassPermissions: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, updatedAnyMember: Option<bool> | null | object | string | Uint8Array, updatedEntityCreationBlocked: Option<bool> | null | object | string | Uint8Array, updatedAllEntityPropertyValuesLocked: Option<bool> | null | object | string | Uint8Array, updatedMaintainers: Option<BTreeSet<CuratorGroupId>> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update `schema_status` under specific `schema_id` in `Class`
-       **/
-      updateClassSchemaStatus: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, schemaId: SchemaId | AnyNumber | Uint8Array, schemaStatus: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Updates or creates new `EntityCreationVoucher` for given `EntityController` with individual limit
-       **/
-      updateEntityCreationVoucher: AugmentedSubmittable<(classId: ClassId | AnyNumber | Uint8Array, controller: EntityController | { Maintainers: any } | { Member: any } | { Lead: any } | string | Uint8Array, maximumEntitiesCount: EntityId | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update entity permissions
-       **/
-      updateEntityPermissions: AugmentedSubmittable<(entityId: EntityId | AnyNumber | Uint8Array, updatedFrozen: Option<bool> | null | object | string | Uint8Array, updatedReferenceable: Option<bool> | null | object | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
-      /**
-       * Update `Entity` `InputPropertyValue`'s with provided ones
-       **/
-      updateEntityPropertyValues: AugmentedSubmittable<(actor: Actor | { Curator: any } | { Member: any } | { Lead: any } | string | Uint8Array, entityId: EntityId | AnyNumber | Uint8Array, newPropertyValues: BTreeMap<PropertyId, InputPropertyValue>) => SubmittableExtrinsic<ApiType>>;
+      setFeaturedVideos: AugmentedSubmittable<(list: Vec<VideoId> | (VideoId | AnyNumber | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
+      uncensorChannel: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      uncensorVideo: AugmentedSubmittable<(curatorId: CuratorId | AnyNumber | Uint8Array, videoId: VideoId | AnyNumber | Uint8Array, rationale: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateChannel: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: ChannelUpdateParameters | { assets?: any; new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateChannelCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: ChannelCategoryId | AnyNumber | Uint8Array, params: ChannelCategoryUpdateParameters | { new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updatePerson: AugmentedSubmittable<(actor: PersonActor | { Member: any } | { Curator: any } | string | Uint8Array, person: PersonId | AnyNumber | Uint8Array, params: PersonUpdateParameters | { assets?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updatePlaylist: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, playlist: PlaylistId | AnyNumber | Uint8Array, params: PlaylistUpdateParameters | { new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateSeries: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, channelId: ChannelId | AnyNumber | Uint8Array, params: SeriesParameters | { assets?: any; seasons?: any; meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateVideo: AugmentedSubmittable<(owner: ChannelOwner | { Member: any } | { Curators: any } | { Dao: any } | string | Uint8Array, video: VideoId | AnyNumber | Uint8Array, params: VideoUpdateParameters | { assets?: any; new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      updateVideoCategory: AugmentedSubmittable<(curator: CuratorId | AnyNumber | Uint8Array, category: VideoCategoryId | AnyNumber | Uint8Array, params: VideoCategoryUpdateParameters | { new_meta?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
     };
     contentDirectoryWorkingGroup: {
       /**
@@ -330,10 +288,10 @@ declare module '@polkadot/api/types/submittable' {
        **/
       acceptContent: AugmentedSubmittable<(storageProviderId: StorageProviderId | AnyNumber | Uint8Array, contentId: ContentId | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
       /**
-       * Adds the content to the system. Member id should match its origin. The created DataObject
+       * Adds the content to the system. The created DataObject
        * awaits liaison to accept or reject it.
        **/
-      addContent: AugmentedSubmittable<(memberId: MemberId | AnyNumber | Uint8Array, contentId: ContentId | string | Uint8Array, typeId: DataObjectTypeId | AnyNumber | Uint8Array, size: u64 | AnyNumber | Uint8Array, ipfsContentId: Bytes | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      addContent: AugmentedSubmittable<(owner: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array, content: Vec<ContentParameters> | (ContentParameters | { content_id?: any; type_id?: any; ipfs_content_id?: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>>;
       /**
        * Injects a set of data objects and their corresponding content id into the directory.
        * The operation is "silent" - no events will be emitted as objects are added.
@@ -351,6 +309,18 @@ declare module '@polkadot/api/types/submittable' {
        * Removes the content id from the list of known content ids. Requires root privileges.
        **/
       removeKnownContentId: AugmentedSubmittable<(contentId: ContentId | string | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      /**
+       * Locks / unlocks content uploading
+       **/
+      updateContentUploadingStatus: AugmentedSubmittable<(isBlocked: bool | boolean | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      /**
+       * Updates storage object owner quota objects limit. Requires leader privileges.
+       **/
+      updateStorageObjectOwnerQuotaObjectsLimit: AugmentedSubmittable<(abstractOwner: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array, newQuotaObjectsLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
+      /**
+       * Updates storage object owner quota size limit. Requires leader privileges.
+       **/
+      updateStorageObjectOwnerQuotaSizeLimit: AugmentedSubmittable<(abstractOwner: StorageObjectOwner | { Member: any } | { Channel: any } | { DAO: any } | { Council: any } | { WorkingGroup: any } | string | Uint8Array, newQuotaSizeLimit: u64 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>>;
     };
     dataObjectStorageRegistry: {
       /**

ファイルの差分が大きいため隠しています
+ 0 - 0
types/augment/augment-types.ts


+ 2 - 2
types/package.json

@@ -1,7 +1,7 @@
 {
   "name": "@joystream/types",
-  "version": "0.14.0",
-  "description": "Types for Joystream Substrate Runtime - Babylon release",
+  "version": "0.16.0",
+  "description": "Types for Joystream Substrate Runtime - Sumer release",
   "main": "index.js",
   "types": "index.d.ts",
   "scripts": {

+ 8 - 4
types/src/common.ts

@@ -44,8 +44,10 @@ export function JoyBTreeSet<V extends UInt>(valType: Constructor<V>): Constructo
   }
 }
 
-export class Credential extends u64 {}
-export class CredentialSet extends JoyBTreeSet(Credential) {}
+export class Url extends Text {}
+
+export class ChannelId extends u64 {}
+export class DAOId extends u64 {}
 
 // common types between Forum and Proposal Discussions modules
 export class ThreadId extends u64 {}
@@ -131,14 +133,13 @@ export class SlashingTerms extends JoyEnum({
 } as const) {}
 
 export class MemoText extends Text {}
+
 // @polkadot/types overrides required since migration to Substrate 2.0,
 // see: https://polkadot.js.org/api/start/FAQ.html#the-node-returns-a-could-not-convert-error-on-send
 export class Address extends AccountId {}
 export class LookupSource extends AccountId {}
 
 export const commonTypes: RegistryTypes = {
-  Credential,
-  CredentialSet,
   BlockAndTime,
   ThreadId,
   PostId,
@@ -150,6 +151,9 @@ export const commonTypes: RegistryTypes = {
   MemoText,
   Address,
   LookupSource,
+  ChannelId,
+  DAOId,
+  Url,
 }
 
 export default commonTypes

+ 0 - 333
types/src/content-directory/index.ts

@@ -1,333 +0,0 @@
-import { BTreeMap, Option, Tuple, Text, Vec } from '@polkadot/types'
-import { bool, u64, u32, u16, i16, i32, i64, Null } from '@polkadot/types/primitive'
-import { MemberId } from '../members'
-import { JoyStructDecorated, JoyEnum, Hash, JoyBTreeSet } from '../common'
-
-export class Nonce extends u64 {}
-export class EntityId extends u64 {}
-export class ClassId extends u64 {}
-export class CuratorId extends u64 {}
-export class CuratorGroupId extends u64 {}
-export class VecMaxLength extends u16 {}
-export class TextMaxLength extends u16 {}
-export class HashedTextMaxLength extends Option.with(u16) {}
-export class PropertyId extends u16 {}
-export class SchemaId extends u16 {}
-export class SameController extends bool {}
-
-export class ClassPermissions extends JoyStructDecorated({
-  any_member: bool,
-  entity_creation_blocked: bool,
-  all_entity_property_values_locked: bool,
-  maintainers: JoyBTreeSet(CuratorGroupId),
-}) {}
-
-// Named just "Type" in the runtime, but this name conflicts with @polkadot/types/primitive/Type.ts
-export class PropertyTypeSingle extends JoyEnum({
-  Bool: Null,
-  Uint16: Null,
-  Uint32: Null,
-  Uint64: Null,
-  Int16: Null,
-  Int32: Null,
-  Int64: Null,
-  Text: TextMaxLength,
-  Hash: HashedTextMaxLength,
-  Reference: Tuple.with([ClassId, SameController]),
-}) {}
-
-export class PropertyTypeVector extends JoyStructDecorated({
-  vec_type: PropertyTypeSingle,
-  max_length: VecMaxLength,
-}) {}
-
-export class PropertyType extends JoyEnum({
-  Single: PropertyTypeSingle,
-  Vector: PropertyTypeVector,
-}) {
-  get subtype() {
-    return this.isOfType('Single') ? this.asType('Single').type : this.asType('Vector').vec_type.type
-  }
-
-  toInputPropertyValue(value: any): InputPropertyValue {
-    const inputPwType: keyof typeof InputPropertyValue['typeDefinitions'] = this.type
-    const subtype = this.subtype
-
-    if (inputPwType === 'Single') {
-      const inputPwSubtype: keyof typeof InputValue['typeDefinitions'] = subtype === 'Hash' ? 'TextToHash' : subtype
-
-      return new InputPropertyValue(this.registry, { [inputPwType]: { [inputPwSubtype]: value } })
-    } else {
-      const inputPwSubtype: keyof typeof VecInputValue['typeDefinitions'] = subtype === 'Hash' ? 'TextToHash' : subtype
-
-      return new InputPropertyValue(this.registry, { [inputPwType]: { [inputPwSubtype]: value } })
-    }
-  }
-}
-
-export class PropertyLockingPolicy extends JoyStructDecorated({
-  is_locked_from_maintainer: bool,
-  is_locked_from_controller: bool,
-}) {}
-
-export class Property extends JoyStructDecorated({
-  property_type: PropertyType,
-  required: bool,
-  unique: bool,
-  name: Text,
-  description: Text,
-  locking_policy: PropertyLockingPolicy,
-}) {}
-
-export class Schema extends JoyStructDecorated({
-  properties: JoyBTreeSet(PropertyId),
-  is_active: bool,
-}) {}
-
-export class Class extends JoyStructDecorated({
-  class_permissions: ClassPermissions,
-  properties: Vec.with(Property),
-  schemas: Vec.with(Schema),
-  name: Text,
-  description: Text,
-  maximum_entities_count: EntityId,
-  current_number_of_entities: EntityId,
-  default_entity_creation_voucher_upper_bound: EntityId,
-}) {}
-
-export class EntityController extends JoyEnum({
-  Maintainers: Null,
-  Member: MemberId,
-  Lead: Null,
-}) {}
-
-export class EntityPermissions extends JoyStructDecorated({
-  controller: EntityController,
-  frozen: bool,
-  referenceable: bool,
-}) {}
-
-export class StoredValue extends JoyEnum({
-  Bool: bool,
-  Uint16: u16,
-  Uint32: u32,
-  Uint64: u64,
-  Int16: i16,
-  Int32: i32,
-  Int64: i64,
-  Text: Text,
-  Hash: Hash,
-  Reference: EntityId,
-}) {}
-
-export class VecStoredValue extends JoyEnum({
-  Bool: Vec.with(bool),
-  Uint16: Vec.with(u16),
-  Uint32: Vec.with(u32),
-  Uint64: Vec.with(u64),
-  Int16: Vec.with(i16),
-  Int32: Vec.with(i32),
-  Int64: Vec.with(i64),
-  Hash: Vec.with(Hash),
-  Text: Vec.with(Text),
-  Reference: Vec.with(EntityId),
-}) {}
-
-export class VecStoredPropertyValue extends JoyStructDecorated({
-  vec_value: VecStoredValue,
-  nonce: Nonce,
-}) {}
-
-export class StoredPropertyValue extends JoyEnum({
-  Single: StoredValue,
-  Vector: VecStoredPropertyValue,
-}) {
-  get subtype() {
-    return this.isOfType('Single') ? this.asType('Single').type : this.asType('Vector').vec_value.type
-  }
-
-  public getValue() {
-    return this.isOfType('Single') ? this.asType('Single').value : this.asType('Vector').vec_value.value
-  }
-}
-
-export class InboundReferenceCounter extends JoyStructDecorated({
-  total: u32,
-  same_owner: u32,
-}) {}
-
-export class Entity extends JoyStructDecorated({
-  entity_permissions: EntityPermissions,
-  class_id: ClassId,
-  supported_schemas: JoyBTreeSet(SchemaId),
-  values: BTreeMap.with(PropertyId, StoredPropertyValue),
-  reference_counter: InboundReferenceCounter,
-}) {}
-
-export class CuratorGroup extends JoyStructDecorated({
-  curators: JoyBTreeSet(CuratorId),
-  active: bool,
-  number_of_classes_maintained: u32,
-}) {}
-
-export class EntityCreationVoucher extends JoyStructDecorated({
-  maximum_entities_count: EntityId,
-  entities_created: EntityId,
-}) {}
-
-export class Actor extends JoyEnum({
-  Curator: Tuple.with([CuratorGroupId, CuratorId]),
-  Member: MemberId,
-  Lead: Null,
-}) {}
-
-export class EntityReferenceCounterSideEffect extends JoyStructDecorated({
-  /// Delta number of all inbound references from another entities
-  total: i32,
-  /// Delta number of inbound references from another entities with `SameOwner` flag set
-  same_owner: i32,
-}) {}
-
-export class ReferenceCounterSideEffects extends BTreeMap.with(EntityId, EntityReferenceCounterSideEffect) {}
-
-export class SideEffects extends Option.with(ReferenceCounterSideEffects) {}
-export class SideEffect extends Option.with(Tuple.with([EntityId, EntityReferenceCounterSideEffect])) {}
-export class Status extends bool {}
-
-export class InputValue extends JoyEnum({
-  Bool: bool,
-  Uint16: u16,
-  Uint32: u32,
-  Uint64: u64,
-  Int16: i16,
-  Int32: i32,
-  Int64: i64,
-  Text: Text,
-  // Used to pass text value, which respective hash should be stored
-  TextToHash: Text,
-  Reference: EntityId,
-}) {}
-
-export class VecInputValue extends JoyEnum({
-  Bool: Vec.with(bool),
-  Uint16: Vec.with(u16),
-  Uint32: Vec.with(u32),
-  Uint64: Vec.with(u64),
-  Int16: Vec.with(i16),
-  Int32: Vec.with(i32),
-  Int64: Vec.with(i64),
-  TextToHash: Vec.with(Text),
-  Text: Vec.with(Text),
-  Reference: Vec.with(EntityId),
-}) {}
-
-export class InputPropertyValue extends JoyEnum({
-  Single: InputValue,
-  Vector: VecInputValue,
-}) {}
-
-export class ParameterizedEntity extends JoyEnum({
-  InternalEntityJustAdded: u32,
-  ExistingEntity: EntityId,
-}) {}
-
-export class ParametrizedPropertyValue extends JoyEnum({
-  InputPropertyValue: InputPropertyValue,
-  InternalEntityJustAdded: u32,
-  InternalEntityVec: Vec.with(ParameterizedEntity),
-}) {}
-
-export class ParametrizedClassPropertyValue extends JoyStructDecorated({
-  in_class_index: PropertyId,
-  value: ParametrizedPropertyValue,
-}) {}
-
-export class CreateEntityOperation extends JoyStructDecorated({
-  class_id: ClassId,
-}) {}
-
-export class UpdatePropertyValuesOperation extends JoyStructDecorated({
-  entity_id: ParameterizedEntity,
-  new_parametrized_property_values: Vec.with(ParametrizedClassPropertyValue),
-}) {}
-
-export class AddSchemaSupportToEntityOperation extends JoyStructDecorated({
-  entity_id: ParameterizedEntity,
-  schema_id: SchemaId,
-  parametrized_property_values: Vec.with(ParametrizedClassPropertyValue),
-}) {}
-
-export class OperationType extends JoyEnum({
-  CreateEntity: CreateEntityOperation,
-  UpdatePropertyValues: UpdatePropertyValuesOperation,
-  AddSchemaSupportToEntity: AddSchemaSupportToEntityOperation,
-}) {}
-
-// Versioned store relicts - to be removed:
-export class ClassPermissionsType extends Null {}
-export class ClassPropertyValue extends Null {}
-export class Operation extends Null {}
-export class ReferenceConstraint extends Null {}
-
-export class InputEntityValuesMap extends BTreeMap.with(PropertyId, InputPropertyValue) {}
-
-export class FailedAt extends u32 {}
-
-export const contentDirectoryTypes = {
-  Nonce,
-  CuratorId,
-  EntityId,
-  ClassId,
-  CuratorGroupId,
-  VecMaxLength,
-  TextMaxLength,
-  HashedTextMaxLength,
-  PropertyId,
-  SchemaId,
-  SameController,
-  ClassPermissions,
-  PropertyTypeSingle,
-  PropertyTypeVector,
-  PropertyType,
-  PropertyLockingPolicy,
-  Property,
-  Schema,
-  Class,
-  ClassOf: Class,
-  EntityController,
-  EntityPermissions,
-  StoredValue,
-  VecStoredValue,
-  VecStoredPropertyValue,
-  StoredPropertyValue,
-  InboundReferenceCounter,
-  Entity,
-  EntityOf: Entity,
-  CuratorGroup,
-  EntityCreationVoucher,
-  Actor,
-  EntityReferenceCounterSideEffect,
-  ReferenceCounterSideEffects,
-  SideEffects,
-  SideEffect,
-  Status,
-  InputValue,
-  VecInputValue,
-  InputPropertyValue,
-  ParameterizedEntity,
-  ParametrizedPropertyValue,
-  ParametrizedClassPropertyValue,
-  CreateEntityOperation,
-  UpdatePropertyValuesOperation,
-  AddSchemaSupportToEntityOperation,
-  OperationType,
-  InputEntityValuesMap,
-  // Versioned store relicts - to be removed:
-  ClassPermissionsType,
-  ClassPropertyValue,
-  Operation,
-  ReferenceConstraint,
-  FailedAt,
-}
-
-export default contentDirectoryTypes

+ 214 - 0
types/src/content/index.ts

@@ -0,0 +1,214 @@
+import { Vec, Option, Tuple } from '@polkadot/types'
+import { bool, u64, u32, u128, Null, Bytes } from '@polkadot/types/primitive'
+import { MemberId } from '../members'
+import { JoyStructDecorated, JoyEnum, ChannelId, JoyBTreeSet, DAOId, Url } from '../common'
+import { ContentParameters } from '../storage'
+import AccountId from '@polkadot/types/generic/AccountId'
+
+export class CuratorId extends u64 {}
+export class CuratorGroupId extends u64 {}
+export class ChannelCategoryId extends u64 {}
+export class VideoId extends u64 {}
+export class VideoCategoryId extends u64 {}
+export class PlaylistId extends u64 {}
+export class PersonId extends u64 {}
+export class SeriesId extends u64 {}
+export class ChannelOwnershipTransferRequestId extends u64 {}
+export class MaxNumber extends u32 {}
+
+export class NewAsset extends JoyEnum({
+  Upload: ContentParameters,
+  Urls: Vec.with(Url),
+}) {}
+
+export class CuratorGroup extends JoyStructDecorated({
+  curators: JoyBTreeSet(CuratorId),
+  active: bool,
+  number_of_channels_owned: u32,
+}) {}
+
+export class ContentActor extends JoyEnum({
+  Curator: Tuple.with([CuratorGroupId, CuratorId]),
+  Member: MemberId,
+  Lead: Null,
+}) {}
+
+export class ChannelOwner extends JoyEnum({
+  Member: MemberId,
+  Curators: CuratorGroupId,
+  Dao: DAOId,
+}) {}
+
+export class Channel extends JoyStructDecorated({
+  owner: ChannelOwner,
+  videos: Vec.with(VideoId),
+  playlists: Vec.with(PlaylistId),
+  series: Vec.with(SeriesId),
+  is_censored: bool,
+  reward_account: Option.with(AccountId),
+}) {}
+
+export class ChannelCreationParameters extends JoyStructDecorated({
+  assets: Vec.with(NewAsset),
+  meta: Bytes,
+}) {}
+
+export class ChannelUpdateParameters extends JoyStructDecorated({
+  assets: Option.with(Vec.with(NewAsset)),
+  new_meta: Bytes,
+}) {}
+
+export class ChannelOwnershipTransferRequest extends JoyStructDecorated({
+  channel_id: ChannelId,
+  new_owner: ChannelOwner,
+  payment: u128,
+  new_reward_account: Option.with(AccountId),
+}) {}
+
+export class ChannelCategory extends JoyStructDecorated({
+  // No runtime information is currently stored for a Category.
+}) {}
+
+export class ChannelCategoryCreationParameters extends JoyStructDecorated({
+  meta: Bytes,
+}) {}
+
+export class ChannelCategoryUpdateParameters extends JoyStructDecorated({
+  new_meta: Bytes,
+}) {}
+
+export class VideoCategory extends JoyStructDecorated({
+  // No runtime information is currently stored for a Category.
+}) {}
+
+export class VideoCategoryCreationParameters extends JoyStructDecorated({
+  meta: Bytes,
+}) {}
+
+export class VideoCategoryUpdateParameters extends JoyStructDecorated({
+  new_meta: Bytes,
+}) {}
+
+export class Video extends JoyStructDecorated({
+  in_channel: ChannelId,
+  in_series: Option.with(SeriesId),
+  is_censored: bool,
+  is_featured: bool,
+}) {}
+
+export class VideoCreationParameters extends JoyStructDecorated({
+  assets: Vec.with(NewAsset),
+  meta: Bytes,
+}) {}
+
+export class VideoUpdateParameters extends JoyStructDecorated({
+  assets: Option.with(Vec.with(NewAsset)),
+  new_meta: Option.with(Bytes),
+}) {}
+
+export class Playlist extends JoyStructDecorated({
+  in_channel: ChannelId,
+}) {}
+
+export class PlaylistCreationParameters extends JoyStructDecorated({
+  meta: Bytes,
+}) {}
+
+export class PlaylistUpdateParameters extends JoyStructDecorated({
+  new_meta: Bytes,
+}) {}
+
+export class EpisodeParemters extends JoyEnum({
+  NewVideo: VideoCreationParameters,
+  ExistingVideo: VideoId,
+}) {}
+
+export class Season extends JoyStructDecorated({
+  episodes: Vec.with(VideoId),
+}) {}
+
+export class SeasonParameters extends JoyStructDecorated({
+  assets: Option.with(Vec.with(NewAsset)),
+  episodes: Option.with(Vec.with(Option.with(EpisodeParemters))),
+  meta: Option.with(Bytes),
+}) {}
+
+export class Series extends JoyStructDecorated({
+  in_channel: ChannelId,
+  seasons: Vec.with(Season),
+}) {}
+
+export class SeriesParameters extends JoyStructDecorated({
+  assets: Option.with(Vec.with(NewAsset)),
+  seasons: Option.with(Vec.with(Option.with(SeasonParameters))),
+  meta: Option.with(Bytes),
+}) {}
+
+export class PersonController extends JoyEnum({
+  Member: MemberId,
+  Curators: Null,
+}) {}
+
+export class Person extends JoyStructDecorated({
+  controlled_by: PersonController,
+}) {}
+
+export class PersonCreationParameters extends JoyStructDecorated({
+  assets: Vec.with(NewAsset),
+  meta: Bytes,
+}) {}
+
+export class PersonUpdateParameters extends JoyStructDecorated({
+  assets: Option.with(Vec.with(NewAsset)),
+  meta: Option.with(Bytes),
+}) {}
+
+export class PersonActor extends JoyEnum({
+  Member: MemberId,
+  Curator: CuratorId,
+}) {}
+
+export const contentDirectoryTypes = {
+  CuratorId,
+  CuratorGroupId,
+  CuratorGroup,
+  ContentActor,
+  NewAsset,
+  Channel,
+  ChannelOwner,
+  ChannelCategoryId,
+  ChannelCategory,
+  ChannelCategoryCreationParameters,
+  ChannelCategoryUpdateParameters,
+  ChannelCreationParameters,
+  ChannelUpdateParameters,
+  ChannelOwnershipTransferRequestId,
+  ChannelOwnershipTransferRequest,
+  Video,
+  VideoId,
+  VideoCategoryId,
+  VideoCategory,
+  VideoCategoryCreationParameters,
+  VideoCategoryUpdateParameters,
+  VideoCreationParameters,
+  VideoUpdateParameters,
+  Person,
+  PersonId,
+  PersonController,
+  PersonActor,
+  PersonCreationParameters,
+  PersonUpdateParameters,
+  Playlist,
+  PlaylistId,
+  PlaylistCreationParameters,
+  PlaylistUpdateParameters,
+  SeriesId,
+  Series,
+  Season,
+  SeriesParameters,
+  SeasonParameters,
+  EpisodeParemters,
+  MaxNumber,
+}
+
+export default contentDirectoryTypes

+ 1 - 3
types/src/discovery.ts

@@ -1,9 +1,8 @@
-import { Text, u32 } from '@polkadot/types'
+import { u32, Text } from '@polkadot/types'
 import { RegistryTypes } from '@polkadot/types/types'
 import { JoyStructDecorated } from './common'
 
 export class IPNSIdentity extends Text {}
-export class Url extends Text {}
 
 export class ServiceProviderRecord extends JoyStructDecorated({
   identity: IPNSIdentity,
@@ -11,7 +10,6 @@ export class ServiceProviderRecord extends JoyStructDecorated({
 }) {}
 
 export const discoveryTypes: RegistryTypes = {
-  Url,
   IPNSIdentity,
   ServiceProviderRecord,
 }

+ 4 - 4
types/src/index.ts

@@ -10,9 +10,9 @@ import recurringRewards from './recurring-rewards'
 import hiring from './hiring'
 import workingGroup from './working-group'
 import discovery from './discovery'
-import media from './media'
+import storage from './storage'
 import proposals from './proposals'
-import contentDirectory from './content-directory'
+import contentDirectory from './content'
 import legacy from './legacy'
 import { InterfaceTypes } from '@polkadot/types/types/registry'
 import { TypeRegistry, Text, UInt, Null, bool, Option, Vec, BTreeSet, BTreeMap } from '@polkadot/types'
@@ -32,7 +32,7 @@ export {
   hiring,
   workingGroup,
   discovery,
-  media,
+  storage,
   proposals,
   contentDirectory,
 }
@@ -51,7 +51,7 @@ export const types: RegistryTypes = {
   ...hiring,
   ...workingGroup,
   ...discovery,
-  ...media,
+  ...storage,
   ...proposals,
   ...contentDirectory,
 }

+ 110 - 6
types/src/legacy.ts

@@ -3,22 +3,24 @@
     - version-store
     - versioned-store-permissions
     - content-working-group
+    - old 'content-directory' which is now being replaced by new 'content' module
 
   We only add them here to make it possible for this version of the types library to be usable
   against babylon runtime without expectation of using these deprecated runtime modules and their
-  types, to perform a runtime upgrade of babylon for example.
-  
+  types, primarily to perform a runtime upgrade of babylon for example.
+
   Important Note: When new modules are added and happen to use type names that match the ones defined here
   make sure to remove them from this file!
+
+  In the following runtime upgrade (after "Sumer" release), remove these types entierly.
 */
 
 import { RegistryTypes } from '@polkadot/types/types'
 import { Null } from '@polkadot/types'
 
-export class Channel extends Null {}
+// from: versioned-store, versioned-store permissions, content-working-group
 export class ChannelContentType extends Null {}
 export class ChannelCurationStatus extends Null {}
-export class ChannelId extends Null {}
 export class ChannelPublicationStatus extends Null {}
 export class CurationActor extends Null {}
 export class Curator extends Null {}
@@ -34,12 +36,62 @@ export class OptionalText extends Null {}
 export class Principal extends Null {}
 export class PrincipalId extends Null {}
 export class WorkingGroupUnstaker extends Null {}
+export class Credential extends Null {}
+export class CredentialSet extends Null {}
+
+// from: old content-directory
+export class Actor extends Null {}
+export class Nonce extends Null {}
+export class EntityId extends Null {}
+export class ClassId extends Null {}
+export class VecMaxLength extends Null {}
+export class TextMaxLength extends Null {}
+export class HashedTextMaxLength extends Null {}
+export class PropertyId extends Null {}
+export class SchemaId extends Null {}
+export class SameController extends Null {}
+export class ClassPermissions extends Null {}
+export class PropertyTypeSingle extends Null {}
+export class PropertyTypeVector extends Null {}
+export class PropertyType extends Null {}
+export class PropertyLockingPolicy extends Null {}
+export class Property extends Null {}
+export class Schema extends Null {}
+export class Class extends Null {}
+export class EntityController extends Null {}
+export class EntityPermissions extends Null {}
+export class StoredValue extends Null {}
+export class VecStoredValue extends Null {}
+export class VecStoredPropertyValue extends Null {}
+export class StoredPropertyValue extends Null {}
+export class InboundReferenceCounter extends Null {}
+export class Entity extends Null {}
+export class EntityCreationVoucher extends Null {}
+export class EntityReferenceCounterSideEffect extends Null {}
+export class ReferenceCounterSideEffects extends Null {}
+export class SideEffects extends Null {}
+export class SideEffect extends Null {}
+export class Status extends Null {}
+export class InputValue extends Null {}
+export class VecInputValue extends Null {}
+export class InputPropertyValue extends Null {}
+export class ParameterizedEntity extends Null {}
+export class ParametrizedPropertyValue extends Null {}
+export class ParametrizedClassPropertyValue extends Null {}
+export class CreateEntityOperation extends Null {}
+export class UpdatePropertyValuesOperation extends Null {}
+export class AddSchemaSupportToEntityOperation extends Null {}
+export class OperationType extends Null {}
+export class ClassPermissionsType extends Null {}
+export class ClassPropertyValue extends Null {}
+export class Operation extends Null {}
+export class ReferenceConstraint extends Null {}
+export class InputEntityValuesMap extends Null {}
+export class FailedAt extends Null {}
 
 export const legacyTypes: RegistryTypes = {
-  Channel,
   ChannelContentType,
   ChannelCurationStatus,
-  ChannelId,
   ChannelPublicationStatus,
   CurationActor,
   Curator,
@@ -55,6 +107,58 @@ export const legacyTypes: RegistryTypes = {
   Principal,
   PrincipalId,
   WorkingGroupUnstaker,
+  Credential,
+  CredentialSet,
+  Nonce,
+  EntityId,
+  ClassId,
+  VecMaxLength,
+  TextMaxLength,
+  HashedTextMaxLength,
+  PropertyId,
+  SchemaId,
+  SameController,
+  ClassPermissions,
+  PropertyTypeSingle,
+  PropertyTypeVector,
+  PropertyType,
+  PropertyLockingPolicy,
+  Property,
+  Schema,
+  Class,
+  ClassOf: Class,
+  EntityController,
+  EntityPermissions,
+  StoredValue,
+  VecStoredValue,
+  VecStoredPropertyValue,
+  StoredPropertyValue,
+  InboundReferenceCounter,
+  Entity,
+  EntityOf: Entity,
+  EntityCreationVoucher,
+  Actor,
+  EntityReferenceCounterSideEffect,
+  ReferenceCounterSideEffects,
+  SideEffects,
+  SideEffect,
+  Status,
+  InputValue,
+  VecInputValue,
+  InputPropertyValue,
+  ParameterizedEntity,
+  ParametrizedPropertyValue,
+  ParametrizedClassPropertyValue,
+  CreateEntityOperation,
+  UpdatePropertyValuesOperation,
+  AddSchemaSupportToEntityOperation,
+  OperationType,
+  InputEntityValuesMap,
+  ClassPermissionsType,
+  ClassPropertyValue,
+  Operation,
+  ReferenceConstraint,
+  FailedAt,
 }
 
 export default legacyTypes

+ 4 - 4
types/src/scripts/generateAugmentCodec.ts

@@ -19,9 +19,9 @@ import recurringRewards from '../recurring-rewards'
 import hiring from '../hiring'
 import workingGroup from '../working-group'
 import discovery from '../discovery'
-import media from '../media'
+import storage from '../storage'
 import proposals from '../proposals'
-import contentDirectory from '../content-directory'
+import contentDirectory from '../content'
 import legacy from '../legacy'
 
 const AUGMENT_INTERFACES_PATH = path.join(__dirname, '../../augment')
@@ -42,9 +42,9 @@ const typesByModule = {
   'hiring': hiring,
   'working-group': workingGroup,
   'discovery': discovery,
-  'media': media,
+  'storage': storage,
   'proposals': proposals,
-  'content-directory': contentDirectory,
+  'content': contentDirectory,
 }
 
 type Imports = { [moduleName: string]: string[] }

+ 44 - 4
types/src/media.ts → types/src/storage.ts

@@ -1,5 +1,5 @@
-import { Option, Vec as Vector, BTreeMap, u64, bool, Text, Null } from '@polkadot/types'
-import { BlockAndTime, JoyEnum, JoyStructDecorated, Hash } from './common'
+import { Option, Vec, BTreeMap, u64, bool, Text, Null, Bytes } from '@polkadot/types'
+import { BlockAndTime, JoyEnum, JoyStructDecorated, Hash, ChannelId, DAOId, WorkingGroup } from './common'
 import { MemberId } from './members'
 import { StorageProviderId } from './working-group' // this should be in discovery really
 import { randomAsU8a } from '@polkadot/util-crypto'
@@ -29,7 +29,7 @@ export class ContentId extends Hash {
 export class DataObjectTypeId extends u64 {}
 export class DataObjectStorageRelationshipId extends u64 {}
 
-export class VecContentId extends Vector.with(ContentId) {}
+export class VecContentId extends Vec.with(ContentId) {}
 export class OptionVecContentId extends Option.with(VecContentId) {}
 
 export const LiaisonJudgementDef = {
@@ -40,8 +40,30 @@ export const LiaisonJudgementDef = {
 export type LiaisonJudgementKey = keyof typeof LiaisonJudgementDef
 export class LiaisonJudgement extends JoyEnum(LiaisonJudgementDef) {}
 
+export class StorageObjectOwner extends JoyEnum({
+  Member: MemberId,
+  Channel: ChannelId,
+  DAO: DAOId,
+  Council: Null,
+  WorkingGroup: WorkingGroup,
+}) {}
+
+export class ContentParameters extends JoyStructDecorated({
+  content_id: ContentId,
+  type_id: DataObjectTypeId,
+  size: u64,
+  ipfs_content_id: Bytes,
+}) {
+  /** Actually it's 'size', but 'size' is already reserved by a parent class. */
+  get size_in_bytes(): u64 {
+    return this.get('size') as u64
+  }
+}
+
+export class Content extends Vec.with(ContentParameters) {}
+
 export class DataObject extends JoyStructDecorated({
-  owner: MemberId,
+  owner: StorageObjectOwner,
   added_at: BlockAndTime,
   type_id: DataObjectTypeId,
   size: u64,
@@ -68,6 +90,18 @@ export class DataObjectType extends JoyStructDecorated({
 
 export class DataObjectsMap extends BTreeMap.with(ContentId, DataObject) {}
 
+export class Quota extends JoyStructDecorated({
+  // Total objects size limit per StorageObjectOwner
+  size_limit: u64,
+  // Total objects number limit per StorageObjectOwner
+  objects_limit: u64,
+  size_used: u64,
+  objects_used: u64,
+}) {}
+
+export class QuotaLimit extends u64 {}
+export class UploadingStatus extends bool {}
+
 export const mediaTypes: RegistryTypes = {
   ContentId,
   LiaisonJudgement,
@@ -77,6 +111,12 @@ export const mediaTypes: RegistryTypes = {
   DataObjectTypeId,
   DataObjectType,
   DataObjectsMap,
+  ContentParameters,
+  StorageObjectOwner,
+  Content,
+  Quota,
+  QuotaLimit,
+  UploadingStatus,
 }
 
 export default mediaTypes

+ 1 - 1
utils/api-scripts/package.json

@@ -9,7 +9,7 @@
     "tsnode-strict": "node -r ts-node/register --unhandled-rejections=strict"
   },
   "dependencies": {
-    "@joystream/types": "^0.14.0",
+    "@joystream/types": "^0.16.0",
     "@polkadot/api": "^1.26.1",
     "@polkadot/types": "^1.26.1",
     "@polkadot/keyring": "^3.0.1",

+ 15 - 1
yarn.lock

@@ -2262,8 +2262,22 @@
     "@types/yargs" "^15.0.0"
     chalk "^4.0.0"
 
-"@joystream/types@link:types":
+"@joystream/types@^0.14.0":
   version "0.14.0"
+  resolved "https://registry.yarnpkg.com/@joystream/types/-/types-0.14.0.tgz#3f243fb736d3cdd3dae90a90274c7a767fc96b75"
+  integrity sha512-t9LibCVM5j0NY2OQOXCGkZFFf1pbnQ9ccv0ZXMK7CfseRDwPtAlF/jVQUQQ03PAAGOKFWJQUenFUhPAbt6wKtg==
+  dependencies:
+    "@polkadot/api" "1.26.1"
+    "@polkadot/keyring" "^3.0.1"
+    "@polkadot/types" "1.26.1"
+    "@types/lodash" "^4.14.157"
+    "@types/vfile" "^4.0.0"
+    ajv "^6.11.0"
+    lodash "^4.17.15"
+    moment "^2.24.0"
+
+"@joystream/types@link:types":
+  version "0.16.0"
   dependencies:
     "@polkadot/api" "1.26.1"
     "@polkadot/keyring" "^3.0.1"

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません