@maci-protocol/relayer 0.0.0-ci.185b643

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/LICENSE +22 -0
  3. package/README.md +149 -0
  4. package/build/hardhat.config.cjs +31 -0
  5. package/build/hardhat.config.cjs.map +1 -0
  6. package/build/hardhat.config.d.cts +22 -0
  7. package/build/hardhat.config.d.cts.map +1 -0
  8. package/build/tests/app.test.d.ts +2 -0
  9. package/build/tests/app.test.d.ts.map +1 -0
  10. package/build/tests/app.test.js +30 -0
  11. package/build/tests/app.test.js.map +1 -0
  12. package/build/tests/constants.d.ts +19 -0
  13. package/build/tests/constants.d.ts.map +1 -0
  14. package/build/tests/constants.js +20 -0
  15. package/build/tests/constants.js.map +1 -0
  16. package/build/tests/messageBatches.test.d.ts +2 -0
  17. package/build/tests/messageBatches.test.d.ts.map +1 -0
  18. package/build/tests/messageBatches.test.js +108 -0
  19. package/build/tests/messageBatches.test.js.map +1 -0
  20. package/build/tests/messages.test.d.ts +2 -0
  21. package/build/tests/messages.test.d.ts.map +1 -0
  22. package/build/tests/messages.test.js +146 -0
  23. package/build/tests/messages.test.js.map +1 -0
  24. package/build/tests/onchain.test.d.ts +2 -0
  25. package/build/tests/onchain.test.d.ts.map +1 -0
  26. package/build/tests/onchain.test.js +100 -0
  27. package/build/tests/onchain.test.js.map +1 -0
  28. package/build/ts/app.module.d.ts +3 -0
  29. package/build/ts/app.module.d.ts.map +1 -0
  30. package/build/ts/app.module.js +51 -0
  31. package/build/ts/app.module.js.map +1 -0
  32. package/build/ts/health/__tests__/health.controller.test.d.ts +2 -0
  33. package/build/ts/health/__tests__/health.controller.test.d.ts.map +1 -0
  34. package/build/ts/health/__tests__/health.controller.test.js +22 -0
  35. package/build/ts/health/__tests__/health.controller.test.js.map +1 -0
  36. package/build/ts/health/health.controller.d.ts +10 -0
  37. package/build/ts/health/health.controller.d.ts.map +1 -0
  38. package/build/ts/health/health.controller.js +36 -0
  39. package/build/ts/health/health.controller.js.map +1 -0
  40. package/build/ts/health/health.module.d.ts +3 -0
  41. package/build/ts/health/health.module.d.ts.map +1 -0
  42. package/build/ts/health/health.module.js +17 -0
  43. package/build/ts/health/health.module.js.map +1 -0
  44. package/build/ts/ipfs/__tests__/ipfs.service.test.d.ts +2 -0
  45. package/build/ts/ipfs/__tests__/ipfs.service.test.d.ts.map +1 -0
  46. package/build/ts/ipfs/__tests__/ipfs.service.test.js +23 -0
  47. package/build/ts/ipfs/__tests__/ipfs.service.test.js.map +1 -0
  48. package/build/ts/ipfs/ipfs.module.d.ts +3 -0
  49. package/build/ts/ipfs/ipfs.module.d.ts.map +1 -0
  50. package/build/ts/ipfs/ipfs.module.js +18 -0
  51. package/build/ts/ipfs/ipfs.module.js.map +1 -0
  52. package/build/ts/ipfs/ipfs.service.d.ts +50 -0
  53. package/build/ts/ipfs/ipfs.service.d.ts.map +1 -0
  54. package/build/ts/ipfs/ipfs.service.js +86 -0
  55. package/build/ts/ipfs/ipfs.service.js.map +1 -0
  56. package/build/ts/jest/mongo.d.ts +9 -0
  57. package/build/ts/jest/mongo.d.ts.map +1 -0
  58. package/build/ts/jest/mongo.js +16 -0
  59. package/build/ts/jest/mongo.js.map +1 -0
  60. package/build/ts/jest/setup.d.ts +8 -0
  61. package/build/ts/jest/setup.d.ts.map +1 -0
  62. package/build/ts/jest/setup.js +3 -0
  63. package/build/ts/jest/setup.js.map +1 -0
  64. package/build/ts/jest/transform.d.ts +8 -0
  65. package/build/ts/jest/transform.d.ts.map +1 -0
  66. package/build/ts/jest/transform.js +10 -0
  67. package/build/ts/jest/transform.js.map +1 -0
  68. package/build/ts/main.d.ts +2 -0
  69. package/build/ts/main.d.ts.map +1 -0
  70. package/build/ts/main.js +46 -0
  71. package/build/ts/main.js.map +1 -0
  72. package/build/ts/message/__tests__/message.controller.test.d.ts +2 -0
  73. package/build/ts/message/__tests__/message.controller.test.d.ts.map +1 -0
  74. package/build/ts/message/__tests__/message.controller.test.js +42 -0
  75. package/build/ts/message/__tests__/message.controller.test.js.map +1 -0
  76. package/build/ts/message/__tests__/message.guard.test.d.ts +2 -0
  77. package/build/ts/message/__tests__/message.guard.test.d.ts.map +1 -0
  78. package/build/ts/message/__tests__/message.guard.test.js +98 -0
  79. package/build/ts/message/__tests__/message.guard.test.js.map +1 -0
  80. package/build/ts/message/__tests__/message.repository.test.d.ts +2 -0
  81. package/build/ts/message/__tests__/message.repository.test.d.ts.map +1 -0
  82. package/build/ts/message/__tests__/message.repository.test.js +62 -0
  83. package/build/ts/message/__tests__/message.repository.test.js.map +1 -0
  84. package/build/ts/message/__tests__/message.service.test.d.ts +2 -0
  85. package/build/ts/message/__tests__/message.service.test.d.ts.map +1 -0
  86. package/build/ts/message/__tests__/message.service.test.js +71 -0
  87. package/build/ts/message/__tests__/message.service.test.js.map +1 -0
  88. package/build/ts/message/__tests__/utils.d.ts +6 -0
  89. package/build/ts/message/__tests__/utils.d.ts.map +1 -0
  90. package/build/ts/message/__tests__/utils.js +27 -0
  91. package/build/ts/message/__tests__/utils.js.map +1 -0
  92. package/build/ts/message/__tests__/validation.test.d.ts +2 -0
  93. package/build/ts/message/__tests__/validation.test.d.ts.map +1 -0
  94. package/build/ts/message/__tests__/validation.test.js +21 -0
  95. package/build/ts/message/__tests__/validation.test.js.map +1 -0
  96. package/build/ts/message/message.controller.d.ts +25 -0
  97. package/build/ts/message/message.controller.d.ts.map +1 -0
  98. package/build/ts/message/message.controller.js +66 -0
  99. package/build/ts/message/message.controller.js.map +1 -0
  100. package/build/ts/message/message.dto.d.ts +43 -0
  101. package/build/ts/message/message.dto.d.ts.map +1 -0
  102. package/build/ts/message/message.dto.js +132 -0
  103. package/build/ts/message/message.dto.js.map +1 -0
  104. package/build/ts/message/message.guard.d.ts +33 -0
  105. package/build/ts/message/message.guard.d.ts.map +1 -0
  106. package/build/ts/message/message.guard.js +91 -0
  107. package/build/ts/message/message.guard.js.map +1 -0
  108. package/build/ts/message/message.module.d.ts +3 -0
  109. package/build/ts/message/message.module.d.ts.map +1 -0
  110. package/build/ts/message/message.module.js +24 -0
  111. package/build/ts/message/message.module.js.map +1 -0
  112. package/build/ts/message/message.repository.d.ts +37 -0
  113. package/build/ts/message/message.repository.d.ts.map +1 -0
  114. package/build/ts/message/message.repository.js +77 -0
  115. package/build/ts/message/message.repository.js.map +1 -0
  116. package/build/ts/message/message.schema.d.ts +52 -0
  117. package/build/ts/message/message.schema.d.ts.map +1 -0
  118. package/build/ts/message/message.schema.js +77 -0
  119. package/build/ts/message/message.schema.js.map +1 -0
  120. package/build/ts/message/message.service.d.ts +37 -0
  121. package/build/ts/message/message.service.d.ts.map +1 -0
  122. package/build/ts/message/message.service.js +85 -0
  123. package/build/ts/message/message.service.js.map +1 -0
  124. package/build/ts/message/types.d.ts +35 -0
  125. package/build/ts/message/types.d.ts.map +1 -0
  126. package/build/ts/message/types.js +2 -0
  127. package/build/ts/message/types.js.map +1 -0
  128. package/build/ts/message/validation.d.ts +20 -0
  129. package/build/ts/message/validation.d.ts.map +1 -0
  130. package/build/ts/message/validation.js +41 -0
  131. package/build/ts/message/validation.js.map +1 -0
  132. package/build/ts/messageBatch/__tests__/messageBatch.controller.test.d.ts +2 -0
  133. package/build/ts/messageBatch/__tests__/messageBatch.controller.test.d.ts.map +1 -0
  134. package/build/ts/messageBatch/__tests__/messageBatch.controller.test.js +41 -0
  135. package/build/ts/messageBatch/__tests__/messageBatch.controller.test.js.map +1 -0
  136. package/build/ts/messageBatch/__tests__/messageBatch.repository.test.d.ts +2 -0
  137. package/build/ts/messageBatch/__tests__/messageBatch.repository.test.d.ts.map +1 -0
  138. package/build/ts/messageBatch/__tests__/messageBatch.repository.test.js +55 -0
  139. package/build/ts/messageBatch/__tests__/messageBatch.repository.test.js.map +1 -0
  140. package/build/ts/messageBatch/__tests__/messageBatch.service.test.d.ts +2 -0
  141. package/build/ts/messageBatch/__tests__/messageBatch.service.test.d.ts.map +1 -0
  142. package/build/ts/messageBatch/__tests__/messageBatch.service.test.js +66 -0
  143. package/build/ts/messageBatch/__tests__/messageBatch.service.test.js.map +1 -0
  144. package/build/ts/messageBatch/__tests__/utils.d.ts +5 -0
  145. package/build/ts/messageBatch/__tests__/utils.d.ts.map +1 -0
  146. package/build/ts/messageBatch/__tests__/utils.js +24 -0
  147. package/build/ts/messageBatch/__tests__/utils.js.map +1 -0
  148. package/build/ts/messageBatch/__tests__/validation.test.d.ts +2 -0
  149. package/build/ts/messageBatch/__tests__/validation.test.d.ts.map +1 -0
  150. package/build/ts/messageBatch/__tests__/validation.test.js +20 -0
  151. package/build/ts/messageBatch/__tests__/validation.test.js.map +1 -0
  152. package/build/ts/messageBatch/messageBatch.controller.d.ts +24 -0
  153. package/build/ts/messageBatch/messageBatch.controller.d.ts.map +1 -0
  154. package/build/ts/messageBatch/messageBatch.controller.js +77 -0
  155. package/build/ts/messageBatch/messageBatch.controller.js.map +1 -0
  156. package/build/ts/messageBatch/messageBatch.dto.d.ts +52 -0
  157. package/build/ts/messageBatch/messageBatch.dto.d.ts.map +1 -0
  158. package/build/ts/messageBatch/messageBatch.dto.js +168 -0
  159. package/build/ts/messageBatch/messageBatch.dto.js.map +1 -0
  160. package/build/ts/messageBatch/messageBatch.module.d.ts +3 -0
  161. package/build/ts/messageBatch/messageBatch.module.d.ts.map +1 -0
  162. package/build/ts/messageBatch/messageBatch.module.js +25 -0
  163. package/build/ts/messageBatch/messageBatch.module.js.map +1 -0
  164. package/build/ts/messageBatch/messageBatch.repository.d.ts +39 -0
  165. package/build/ts/messageBatch/messageBatch.repository.d.ts.map +1 -0
  166. package/build/ts/messageBatch/messageBatch.repository.js +72 -0
  167. package/build/ts/messageBatch/messageBatch.repository.js.map +1 -0
  168. package/build/ts/messageBatch/messageBatch.schema.d.ts +36 -0
  169. package/build/ts/messageBatch/messageBatch.schema.d.ts.map +1 -0
  170. package/build/ts/messageBatch/messageBatch.schema.js +45 -0
  171. package/build/ts/messageBatch/messageBatch.schema.js.map +1 -0
  172. package/build/ts/messageBatch/messageBatch.service.d.ts +41 -0
  173. package/build/ts/messageBatch/messageBatch.service.d.ts.map +1 -0
  174. package/build/ts/messageBatch/messageBatch.service.js +107 -0
  175. package/build/ts/messageBatch/messageBatch.service.js.map +1 -0
  176. package/build/ts/messageBatch/validation.d.ts +20 -0
  177. package/build/ts/messageBatch/validation.d.ts.map +1 -0
  178. package/build/ts/messageBatch/validation.js +38 -0
  179. package/build/ts/messageBatch/validation.js.map +1 -0
  180. package/build/tsconfig.build.tsbuildinfo +1 -0
  181. package/package.json +79 -0
@@ -0,0 +1,52 @@
1
+ import mongoose, { HydratedDocument } from "mongoose";
2
+ import type { MessageBatch } from "../messageBatch/messageBatch.schema.js";
3
+ /**
4
+ * Message document type
5
+ */
6
+ export type MessageDocument = HydratedDocument<Message>;
7
+ /**
8
+ * Messages limit
9
+ */
10
+ export declare const MESSAGES_LIMIT = 100;
11
+ /**
12
+ * Message model
13
+ */
14
+ export declare class Message {
15
+ /**
16
+ * Public key
17
+ */
18
+ publicKey: string;
19
+ /**
20
+ * Message data
21
+ */
22
+ data: string[];
23
+ /**
24
+ * Message hash
25
+ */
26
+ hash: string;
27
+ /**
28
+ * MACI contract address
29
+ */
30
+ maciContractAddress: string;
31
+ /**
32
+ * Poll ID
33
+ */
34
+ poll: number;
35
+ /**
36
+ * Message batch
37
+ */
38
+ messageBatch?: MessageBatch;
39
+ }
40
+ /**
41
+ * Message schema
42
+ */
43
+ export declare const MessageSchema: mongoose.Schema<Message, mongoose.Model<Message, any, any, any, mongoose.Document<unknown, any, Message> & Message & {
44
+ _id: mongoose.Types.ObjectId;
45
+ } & {
46
+ __v: number;
47
+ }, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, Message, mongoose.Document<unknown, {}, mongoose.FlatRecord<Message>> & mongoose.FlatRecord<Message> & {
48
+ _id: mongoose.Types.ObjectId;
49
+ } & {
50
+ __v: number;
51
+ }>;
52
+ //# sourceMappingURL=message.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.schema.d.ts","sourceRoot":"","sources":["../../../ts/message/message.schema.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,EAAE,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAE3E;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC;;GAEG;AACH,qBACa,OAAO;IAClB;;OAEG;IAEH,SAAS,EAAG,MAAM,CAAC;IAEnB;;OAEG;IAEH,IAAI,EAAG,MAAM,EAAE,CAAC;IAEhB;;OAEG;IAEH,IAAI,EAAG,MAAM,CAAC;IAEd;;OAEG;IAEH,mBAAmB,EAAG,MAAM,CAAC;IAE7B;;OAEG;IAEH,IAAI,EAAG,MAAM,CAAC;IAEd;;OAEG;IAEH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;EAAwC,CAAC"}
@@ -0,0 +1,77 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Prop, Schema, SchemaFactory } from "@nestjs/mongoose";
11
+ import mongoose from "mongoose";
12
+ /**
13
+ * Messages limit
14
+ */
15
+ export const MESSAGES_LIMIT = 100;
16
+ /**
17
+ * Message model
18
+ */
19
+ let Message = class Message {
20
+ /**
21
+ * Public key
22
+ */
23
+ publicKey;
24
+ /**
25
+ * Message data
26
+ */
27
+ data;
28
+ /**
29
+ * Message hash
30
+ */
31
+ hash;
32
+ /**
33
+ * MACI contract address
34
+ */
35
+ maciContractAddress;
36
+ /**
37
+ * Poll ID
38
+ */
39
+ poll;
40
+ /**
41
+ * Message batch
42
+ */
43
+ messageBatch;
44
+ };
45
+ __decorate([
46
+ Prop({ required: true }),
47
+ __metadata("design:type", String)
48
+ ], Message.prototype, "publicKey", void 0);
49
+ __decorate([
50
+ Prop({ required: true }),
51
+ __metadata("design:type", Array)
52
+ ], Message.prototype, "data", void 0);
53
+ __decorate([
54
+ Prop({ required: true }),
55
+ __metadata("design:type", String)
56
+ ], Message.prototype, "hash", void 0);
57
+ __decorate([
58
+ Prop({ required: true }),
59
+ __metadata("design:type", String)
60
+ ], Message.prototype, "maciContractAddress", void 0);
61
+ __decorate([
62
+ Prop({ required: true }),
63
+ __metadata("design:type", Number)
64
+ ], Message.prototype, "poll", void 0);
65
+ __decorate([
66
+ Prop({ type: mongoose.Schema.Types.ObjectId, required: false }),
67
+ __metadata("design:type", Function)
68
+ ], Message.prototype, "messageBatch", void 0);
69
+ Message = __decorate([
70
+ Schema()
71
+ ], Message);
72
+ export { Message };
73
+ /**
74
+ * Message schema
75
+ */
76
+ export const MessageSchema = SchemaFactory.createForClass(Message);
77
+ //# sourceMappingURL=message.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.schema.js","sourceRoot":"","sources":["../../../ts/message/message.schema.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,QAA8B,MAAM,UAAU,CAAC;AAStD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAElC;;GAEG;AAEI,IAAM,OAAO,GAAb,MAAM,OAAO;IAClB;;OAEG;IAEH,SAAS,CAAU;IAEnB;;OAEG;IAEH,IAAI,CAAY;IAEhB;;OAEG;IAEH,IAAI,CAAU;IAEd;;OAEG;IAEH,mBAAmB,CAAU;IAE7B;;OAEG;IAEH,IAAI,CAAU;IAEd;;OAEG;IAEH,YAAY,CAAgB;CAC7B,CAAA;AA/BC;IADC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACN;AAMnB;IADC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qCACT;AAMhB;IADC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qCACX;AAMd;IADC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oDACI;AAM7B;IADC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qCACX;AAMd;IADC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;;6CACpC;AAnCjB,OAAO;IADnB,MAAM,EAAE;GACI,OAAO,CAoCnB;;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { PublishMessagesDto } from "./message.dto.js";
2
+ import { MessageBatchService } from "../messageBatch/messageBatch.service.js";
3
+ import { MessageRepository } from "./message.repository.js";
4
+ import { Message } from "./message.schema.js";
5
+ /**
6
+ * MessageService is responsible for saving messages and send them onchain
7
+ */
8
+ export declare class MessageService {
9
+ private readonly messageBatchService;
10
+ private readonly messageRepository;
11
+ /**
12
+ * Logger
13
+ */
14
+ private readonly logger;
15
+ /**
16
+ * Initialize MessageService
17
+ *
18
+ * @param messageBatchService message batch service
19
+ * @param messageRepository message repository
20
+ */
21
+ constructor(messageBatchService: MessageBatchService, messageRepository: MessageRepository);
22
+ /**
23
+ * Save messages
24
+ *
25
+ * @param args publish messages dto
26
+ * @returns success or not
27
+ */
28
+ saveMessages(args: PublishMessagesDto): Promise<Message[]>;
29
+ /**
30
+ * Publish messages onchain
31
+ *
32
+ * @param args publish messages dto
33
+ * @returns transaction and ipfs hashes
34
+ */
35
+ publishMessages(): Promise<boolean>;
36
+ }
37
+ //# sourceMappingURL=message.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.service.d.ts","sourceRoot":"","sources":["../../../ts/message/message.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAE9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C;;GAEG;AACH,qBACa,cAAc;IAavB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAbpC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAElE;;;;;OAKG;gBAEgB,mBAAmB,EAAE,mBAAmB,EACxC,iBAAiB,EAAE,iBAAiB;IAGvD;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAqBhE;;;;;OAKG;IAEG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;CAc1C"}
@@ -0,0 +1,85 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var MessageService_1;
11
+ import { PubKey } from "@maci-protocol/domainobjs";
12
+ import { getDefaultSigner, MACI__factory as MACIFactory, Poll__factory as PollFactory } from "@maci-protocol/sdk";
13
+ import { Injectable, Logger } from "@nestjs/common";
14
+ import { Cron, CronExpression } from "@nestjs/schedule";
15
+ import { MessageBatchService } from "../messageBatch/messageBatch.service.js";
16
+ import { MessageRepository } from "./message.repository.js";
17
+ /**
18
+ * MessageService is responsible for saving messages and send them onchain
19
+ */
20
+ let MessageService = MessageService_1 = class MessageService {
21
+ messageBatchService;
22
+ messageRepository;
23
+ /**
24
+ * Logger
25
+ */
26
+ logger = new Logger(MessageService_1.name);
27
+ /**
28
+ * Initialize MessageService
29
+ *
30
+ * @param messageBatchService message batch service
31
+ * @param messageRepository message repository
32
+ */
33
+ constructor(messageBatchService, messageRepository) {
34
+ this.messageBatchService = messageBatchService;
35
+ this.messageRepository = messageRepository;
36
+ }
37
+ /**
38
+ * Save messages
39
+ *
40
+ * @param args publish messages dto
41
+ * @returns success or not
42
+ */
43
+ async saveMessages(args) {
44
+ const signer = await getDefaultSigner();
45
+ const maciContract = MACIFactory.connect(args.maciContractAddress, signer);
46
+ const pollAddresses = await maciContract.polls(args.poll);
47
+ const pollContract = PollFactory.connect(pollAddresses.poll, signer);
48
+ const hashes = await Promise.all(args.messages.map(({ data, publicKey }) => pollContract.hashMessageAndEncPubKey({ data }, PubKey.deserialize(publicKey).asContractParam())));
49
+ const messages = args.messages.map((message, index) => ({ ...message, hash: hashes[index].toString() }));
50
+ return this.messageRepository.create({ ...args, messages }).catch((error) => {
51
+ this.logger.error(`Save messages error:`, error);
52
+ throw error;
53
+ });
54
+ }
55
+ /**
56
+ * Publish messages onchain
57
+ *
58
+ * @param args publish messages dto
59
+ * @returns transaction and ipfs hashes
60
+ */
61
+ async publishMessages() {
62
+ const messages = await this.messageRepository.find({ messageBatch: { $exists: false } });
63
+ if (messages.length === 0) {
64
+ return false;
65
+ }
66
+ await this.messageBatchService.saveMessageBatches([{ messages }]).catch((error) => {
67
+ this.logger.error(`Save message batch error:`, error);
68
+ throw error;
69
+ });
70
+ return true;
71
+ }
72
+ };
73
+ __decorate([
74
+ Cron(process.env.CRON_EXPRESSION || CronExpression.EVERY_HOUR, { name: "publishMessages" }),
75
+ __metadata("design:type", Function),
76
+ __metadata("design:paramtypes", []),
77
+ __metadata("design:returntype", Promise)
78
+ ], MessageService.prototype, "publishMessages", null);
79
+ MessageService = MessageService_1 = __decorate([
80
+ Injectable(),
81
+ __metadata("design:paramtypes", [MessageBatchService,
82
+ MessageRepository])
83
+ ], MessageService);
84
+ export { MessageService };
85
+ //# sourceMappingURL=message.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.service.js","sourceRoot":"","sources":["../../../ts/message/message.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Interface for saving messages
3
+ */
4
+ export interface ICreateMessages {
5
+ /**
6
+ * Messages
7
+ */
8
+ messages: ICreateMessageWithHash[];
9
+ /**
10
+ * MACI contract address
11
+ */
12
+ maciContractAddress: string;
13
+ /**
14
+ * Poll id
15
+ */
16
+ poll: number;
17
+ }
18
+ /**
19
+ * Interface for saved messages
20
+ */
21
+ export interface ICreateMessageWithHash {
22
+ /**
23
+ * Message data
24
+ */
25
+ data: string[];
26
+ /**
27
+ * Public key
28
+ */
29
+ publicKey: string;
30
+ /**
31
+ * Message hash
32
+ */
33
+ hash: string;
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../ts/message/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IAEnC;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../ts/message/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { ValidatorConstraintInterface } from "class-validator";
2
+ /**
3
+ * Validate public key
4
+ */
5
+ export declare class PublicKeyValidator implements ValidatorConstraintInterface {
6
+ /**
7
+ * Try to deserialize public key from text and return status of validation
8
+ *
9
+ * @param text text to validate
10
+ * @returns status of validation
11
+ */
12
+ validate(text: string): boolean;
13
+ /**
14
+ * Return default validation message
15
+ *
16
+ * @returns default validation message
17
+ */
18
+ defaultMessage(): string;
19
+ }
20
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../ts/message/validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAEpF;;GAEG;AACH,qBACa,kBAAmB,YAAW,4BAA4B;IACrE;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAS/B;;;;OAIG;IACH,cAAc,IAAI,MAAM;CAGzB"}
@@ -0,0 +1,41 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { PubKey } from "@maci-protocol/domainobjs";
8
+ import { ValidatorConstraint } from "class-validator";
9
+ /**
10
+ * Validate public key
11
+ */
12
+ let PublicKeyValidator = class PublicKeyValidator {
13
+ /**
14
+ * Try to deserialize public key from text and return status of validation
15
+ *
16
+ * @param text text to validate
17
+ * @returns status of validation
18
+ */
19
+ validate(text) {
20
+ try {
21
+ const [x, y] = PubKey.deserialize(text).asArray();
22
+ return Boolean(new PubKey([x, y]));
23
+ }
24
+ catch (error) {
25
+ return false;
26
+ }
27
+ }
28
+ /**
29
+ * Return default validation message
30
+ *
31
+ * @returns default validation message
32
+ */
33
+ defaultMessage() {
34
+ return "Public key is invalid";
35
+ }
36
+ };
37
+ PublicKeyValidator = __decorate([
38
+ ValidatorConstraint({ name: "publicKey", async: false })
39
+ ], PublicKeyValidator);
40
+ export { PublicKeyValidator };
41
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../ts/message/validation.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAgC,MAAM,iBAAiB,CAAC;AAEpF;;GAEG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,IAAY;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAClD,OAAO,OAAO,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,cAAc;QACZ,OAAO,uBAAuB,CAAC;IACjC,CAAC;CACF,CAAA;AAxBY,kBAAkB;IAD9B,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;GAC5C,kBAAkB,CAwB9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messageBatch.controller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageBatch.controller.test.d.ts","sourceRoot":"","sources":["../../../../ts/messageBatch/__tests__/messageBatch.controller.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import { jest } from "@jest/globals";
2
+ import { HttpException, HttpStatus } from "@nestjs/common";
3
+ import { Test } from "@nestjs/testing";
4
+ import { MessageBatchController } from "../messageBatch.controller.js";
5
+ import { MessageBatchService } from "../messageBatch.service.js";
6
+ import { defaultGetMessageBatchesDto, defaultMessageBatches } from "./utils.js";
7
+ describe("MessageBatchController", () => {
8
+ let controller;
9
+ const mockMessageBatchService = {
10
+ findMessageBatches: jest.fn(),
11
+ };
12
+ beforeEach(async () => {
13
+ const app = await Test.createTestingModule({
14
+ controllers: [MessageBatchController],
15
+ })
16
+ .useMocker((token) => {
17
+ if (token === MessageBatchService) {
18
+ mockMessageBatchService.findMessageBatches.mockImplementation(() => Promise.resolve(defaultMessageBatches));
19
+ return mockMessageBatchService;
20
+ }
21
+ return jest.fn();
22
+ })
23
+ .compile();
24
+ controller = app.get(MessageBatchController);
25
+ });
26
+ afterEach(() => {
27
+ jest.clearAllMocks();
28
+ });
29
+ describe("v1/messageBatches/get", () => {
30
+ test("should get message batches properly", async () => {
31
+ const data = await controller.get(defaultGetMessageBatchesDto);
32
+ expect(data).toStrictEqual(defaultMessageBatches);
33
+ });
34
+ test("should throw an error if fetching is failed", async () => {
35
+ const error = new Error("error");
36
+ mockMessageBatchService.findMessageBatches.mockImplementation(() => Promise.reject(error));
37
+ await expect(controller.get(defaultGetMessageBatchesDto)).rejects.toThrow(new HttpException(error.message, HttpStatus.BAD_REQUEST));
38
+ });
39
+ });
40
+ });
41
+ //# sourceMappingURL=messageBatch.controller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageBatch.controller.test.js","sourceRoot":"","sources":["../../../../ts/messageBatch/__tests__/messageBatch.controller.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEhF,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,UAAkC,CAAC;IAEvC,MAAM,uBAAuB,GAAG;QAC9B,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;KAC9B,CAAC;IAEF,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;YACzC,WAAW,EAAE,CAAC,sBAAsB,CAAC;SACtC,CAAC;aACC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YACnB,IAAI,KAAK,KAAK,mBAAmB,EAAE,CAAC;gBAClC,uBAAuB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBAE5G,OAAO,uBAAuB,CAAC;YACjC,CAAC;YAED,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC;QACnB,CAAC,CAAC;aACD,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,GAAG,CAAC,GAAG,CAAyB,sBAAsB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YAE/D,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,uBAAuB,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAE3F,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvE,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,CACzD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messageBatch.repository.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageBatch.repository.test.d.ts","sourceRoot":"","sources":["../../../../ts/messageBatch/__tests__/messageBatch.repository.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { jest } from "@jest/globals";
2
+ import { MessageBatchRepository } from "../messageBatch.repository.js";
3
+ import { defaultMessageBatches } from "./utils.js";
4
+ describe("MessageBatchRepository", () => {
5
+ const mockMessageBatchModel = {
6
+ find: jest.fn().mockReturnValue({
7
+ limit: jest.fn().mockReturnValue({
8
+ skip: jest
9
+ .fn()
10
+ .mockReturnValue({ exec: jest.fn().mockImplementation(() => Promise.resolve([defaultMessageBatches])) }),
11
+ }),
12
+ }),
13
+ insertMany: jest.fn().mockImplementation(() => Promise.resolve(defaultMessageBatches)),
14
+ };
15
+ beforeEach(() => {
16
+ mockMessageBatchModel.find = jest.fn().mockReturnValue({
17
+ limit: jest.fn().mockReturnValue({
18
+ skip: jest
19
+ .fn()
20
+ .mockReturnValue({ exec: jest.fn().mockImplementation(() => Promise.resolve([defaultMessageBatches])) }),
21
+ }),
22
+ });
23
+ mockMessageBatchModel.insertMany = jest.fn().mockImplementation(() => Promise.resolve(defaultMessageBatches));
24
+ });
25
+ afterEach(() => {
26
+ jest.clearAllMocks();
27
+ });
28
+ test("should create message batch properly", async () => {
29
+ const repository = new MessageBatchRepository(mockMessageBatchModel);
30
+ const result = await repository.create(defaultMessageBatches);
31
+ expect(result).toStrictEqual(defaultMessageBatches);
32
+ });
33
+ test("should throw an error if creation is failed", async () => {
34
+ const error = new Error("error");
35
+ mockMessageBatchModel.insertMany.mockImplementation(() => Promise.reject(error));
36
+ const repository = new MessageBatchRepository(mockMessageBatchModel);
37
+ await expect(repository.create(defaultMessageBatches)).rejects.toThrow(error);
38
+ });
39
+ test("should find message batches properly", async () => {
40
+ const repository = new MessageBatchRepository(mockMessageBatchModel);
41
+ const result = await repository.find({});
42
+ expect(result).toStrictEqual([defaultMessageBatches]);
43
+ });
44
+ test("should throw an error if find is failed", async () => {
45
+ const error = new Error("error");
46
+ mockMessageBatchModel.find.mockReturnValue({
47
+ limit: jest.fn().mockReturnValue({
48
+ skip: jest.fn().mockReturnValue({ exec: jest.fn().mockImplementation(() => Promise.reject(error)) }),
49
+ }),
50
+ });
51
+ const repository = new MessageBatchRepository(mockMessageBatchModel);
52
+ await expect(repository.find({})).rejects.toThrow(error);
53
+ });
54
+ });
55
+ //# sourceMappingURL=messageBatch.repository.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageBatch.repository.test.js","sourceRoot":"","sources":["../../../../ts/messageBatch/__tests__/messageBatch.repository.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messageBatch.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageBatch.service.test.d.ts","sourceRoot":"","sources":["../../../../ts/messageBatch/__tests__/messageBatch.service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { jest } from "@jest/globals";
2
+ import { MessageBatchDto } from "../messageBatch.dto.js";
3
+ import { MessageBatchService } from "../messageBatch.service.js";
4
+ import { defaultIpfsHash, defaultMessageBatches } from "./utils.js";
5
+ jest.mock("@maci-protocol/sdk", () => ({
6
+ getDefaultSigner: jest.fn(),
7
+ relayMessages: jest.fn(),
8
+ }));
9
+ describe("MessageBatchService", () => {
10
+ const mockIpfsService = {
11
+ init: jest.fn(),
12
+ cidToBytes32: jest.fn().mockImplementation(() => Promise.resolve(defaultIpfsHash)),
13
+ add: jest.fn().mockImplementation(() => Promise.resolve(defaultIpfsHash)),
14
+ };
15
+ const mockRepository = {
16
+ create: jest.fn().mockImplementation(() => Promise.resolve(defaultMessageBatches)),
17
+ find: jest.fn().mockImplementation(() => Promise.resolve(defaultMessageBatches)),
18
+ };
19
+ beforeEach(() => {
20
+ mockRepository.create = jest.fn().mockImplementation(() => Promise.resolve(defaultMessageBatches));
21
+ mockRepository.find = jest.fn().mockImplementation(() => Promise.resolve(defaultMessageBatches));
22
+ mockIpfsService.add = jest.fn().mockImplementation(() => Promise.resolve(defaultIpfsHash));
23
+ mockIpfsService.cidToBytes32 = jest.fn().mockImplementation(() => Promise.resolve(defaultIpfsHash));
24
+ mockIpfsService.init = jest.fn();
25
+ });
26
+ afterEach(() => {
27
+ jest.clearAllMocks();
28
+ });
29
+ test("should save and find message batches properly", async () => {
30
+ const service = new MessageBatchService(mockIpfsService, mockRepository);
31
+ const result = await service.saveMessageBatches(defaultMessageBatches);
32
+ const messageBatches = await service.findMessageBatches({});
33
+ expect(result).toStrictEqual(defaultMessageBatches);
34
+ expect(messageBatches).toStrictEqual(defaultMessageBatches);
35
+ });
36
+ test("should throw an error if can't find message batches", async () => {
37
+ const error = new Error("error");
38
+ mockRepository.find.mockImplementation(() => Promise.reject(error));
39
+ const service = new MessageBatchService(mockIpfsService, mockRepository);
40
+ await expect(service.findMessageBatches({})).rejects.toThrow(error);
41
+ });
42
+ test("should throw an error if can't save message batches", async () => {
43
+ const error = new Error("error");
44
+ mockRepository.create.mockImplementation(() => Promise.reject(error));
45
+ const service = new MessageBatchService(mockIpfsService, mockRepository);
46
+ await expect(service.saveMessageBatches(defaultMessageBatches)).rejects.toThrow(error);
47
+ });
48
+ test("should throw an error if can't update message batches to ipfs", async () => {
49
+ const error = new Error("error");
50
+ mockIpfsService.add.mockImplementation(() => Promise.reject(error));
51
+ const service = new MessageBatchService(mockIpfsService, mockRepository);
52
+ await expect(service.saveMessageBatches(defaultMessageBatches)).rejects.toThrow(error);
53
+ });
54
+ test("should throw an error if validation is failed", async () => {
55
+ const service = new MessageBatchService(mockIpfsService, mockRepository);
56
+ const invalidEmptyMessagesArgs = new MessageBatchDto();
57
+ invalidEmptyMessagesArgs.messages = [];
58
+ invalidEmptyMessagesArgs.ipfsHash = "invalid";
59
+ const invalidMessageArgs = new MessageBatchDto();
60
+ invalidMessageArgs.messages = [];
61
+ invalidMessageArgs.ipfsHash = "invalid";
62
+ await expect(service.saveMessageBatches([invalidEmptyMessagesArgs])).rejects.toThrow("Validation error");
63
+ await expect(service.saveMessageBatches([invalidMessageArgs])).rejects.toThrow("Validation error");
64
+ });
65
+ });
66
+ //# sourceMappingURL=messageBatch.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageBatch.service.test.js","sourceRoot":"","sources":["../../../../ts/messageBatch/__tests__/messageBatch.service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { GetMessageBatchesDto, MessageBatchDto } from "../messageBatch.dto.js";
2
+ export declare const defaultIpfsHash = "QmXj8v1qbwTqVp9RxkQR29Xjc6g5C1KL2m2gZ9b8t8THHj";
3
+ export declare const defaultMessageBatches: MessageBatchDto[];
4
+ export declare const defaultGetMessageBatchesDto: GetMessageBatchesDto;
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../ts/messageBatch/__tests__/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAgB,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI7F,eAAO,MAAM,eAAe,mDAAmD,CAAC;AAYhF,eAAO,MAAM,qBAAqB,EAAE,eAAe,EAA0B,CAAC;AAE9E,eAAO,MAAM,2BAA2B,sBAA6B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Keypair } from "@maci-protocol/domainobjs";
2
+ import { ZeroAddress } from "ethers";
3
+ import { Message } from "../../message/message.schema.js";
4
+ import { GetMessageBatchesDto, MAX_MESSAGES, MessageBatchDto } from "../messageBatch.dto.js";
5
+ const keypair = new Keypair();
6
+ export const defaultIpfsHash = "QmXj8v1qbwTqVp9RxkQR29Xjc6g5C1KL2m2gZ9b8t8THHj";
7
+ const defaultMessageBatch = new MessageBatchDto();
8
+ const defaultMessage = new Message();
9
+ defaultMessage.data = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
10
+ defaultMessage.hash = "0";
11
+ defaultMessage.publicKey = keypair.pubKey.serialize();
12
+ defaultMessage.maciContractAddress = ZeroAddress;
13
+ defaultMessage.poll = 0;
14
+ defaultMessageBatch.messages = [defaultMessage];
15
+ defaultMessageBatch.ipfsHash = defaultIpfsHash;
16
+ export const defaultMessageBatches = [defaultMessageBatch];
17
+ export const defaultGetMessageBatchesDto = new GetMessageBatchesDto();
18
+ defaultGetMessageBatchesDto.limit = MAX_MESSAGES;
19
+ defaultGetMessageBatchesDto.maciContractAddress = ZeroAddress;
20
+ defaultGetMessageBatchesDto.poll = 0;
21
+ defaultGetMessageBatchesDto.ipfsHashes = [defaultIpfsHash];
22
+ defaultGetMessageBatchesDto.messageHashes = ["0"];
23
+ defaultGetMessageBatchesDto.publicKeys = [keypair.pubKey.serialize()];
24
+ //# sourceMappingURL=utils.js.map