@maci-protocol/relayer 0.0.0-ci.2653bc0

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 +109 -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 +147 -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 +101 -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,147 @@
1
+ import { jest } from "@jest/globals";
2
+ import { Keypair } from "@maci-protocol/domainobjs";
3
+ import { formatProofForVerifierContract, genProofSnarkjs } from "@maci-protocol/sdk";
4
+ import { TestingClass } from "@maci-protocol/testing";
5
+ import { HttpStatus, ValidationPipe } from "@nestjs/common";
6
+ import { Test } from "@nestjs/testing";
7
+ import request from "supertest";
8
+ import { AppModule } from "../ts/app.module.js";
9
+ import { pollJoinedWasm, pollJoinedZkey, pollWasm, tallyVotesZkeyPathNonQv, pollJoiningZkey, processMessagesZkeyPathNonQv, pollWitgen, rapidsnark, } from "./constants.js";
10
+ jest.unmock("@maci-protocol/sdk");
11
+ describe("Integration messages", () => {
12
+ let app;
13
+ let circuitInputs;
14
+ let stateLeafIndex;
15
+ let maciContractAddress;
16
+ beforeAll(async () => {
17
+ await TestingClass.sleep(10_000);
18
+ const testDeploy = await TestingClass.getInstance({
19
+ pollJoiningZkeyPath: pollJoiningZkey,
20
+ pollJoinedZkeyPath: pollJoinedZkey,
21
+ processMessagesZkeyPath: processMessagesZkeyPathNonQv,
22
+ tallyVotesZkeyPath: tallyVotesZkeyPathNonQv,
23
+ pollWasm,
24
+ pollWitgen,
25
+ rapidsnark,
26
+ });
27
+ const poll = testDeploy.contractsData.maciState.polls.get(0n);
28
+ poll.updatePoll(BigInt(testDeploy.contractsData.maciState.pubKeys.length));
29
+ const [user] = testDeploy.contractsData.users;
30
+ stateLeafIndex = Number(user.stateLeafIndex);
31
+ maciContractAddress = testDeploy.contractsData.maciContractAddress;
32
+ circuitInputs = poll.joinedCircuitInputs({
33
+ maciPrivKey: user.keypair.privKey,
34
+ stateLeafIndex: user.stateLeafIndex,
35
+ voiceCreditsBalance: user.voiceCreditBalance,
36
+ joinTimestamp: user.timestamp,
37
+ });
38
+ const moduleFixture = await Test.createTestingModule({
39
+ imports: [AppModule],
40
+ }).compile();
41
+ app = moduleFixture.createNestApplication();
42
+ app.useGlobalPipes(new ValidationPipe({ transform: true }));
43
+ await app.listen(3002);
44
+ });
45
+ afterAll(async () => {
46
+ TestingClass.clean();
47
+ await app.close();
48
+ });
49
+ describe("/v1/messages/publish", () => {
50
+ const keypair = new Keypair();
51
+ const defaultSaveMessagesArgs = {
52
+ maciContractAddress,
53
+ poll: 0,
54
+ stateLeafIndex,
55
+ messages: [
56
+ {
57
+ data: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
58
+ publicKey: keypair.pubKey.serialize(),
59
+ },
60
+ ],
61
+ };
62
+ test("should throw an error if there is no valid proof", async () => {
63
+ const result = await request(app.getHttpServer())
64
+ .post("/v1/messages/publish")
65
+ .send({
66
+ ...defaultSaveMessagesArgs,
67
+ maciContractAddress,
68
+ stateLeafIndex,
69
+ poll: 0,
70
+ proof: ["0", "0", "0", "0", "0", "0", "0", "0"],
71
+ })
72
+ .expect(HttpStatus.FORBIDDEN);
73
+ expect(result.body).toStrictEqual({
74
+ error: "Forbidden",
75
+ statusCode: HttpStatus.FORBIDDEN,
76
+ message: "Forbidden resource",
77
+ });
78
+ });
79
+ test("should throw an error if dto is invalid", async () => {
80
+ const { proof } = await genProofSnarkjs({
81
+ inputs: circuitInputs,
82
+ zkeyPath: pollJoinedZkey,
83
+ wasmPath: pollJoinedWasm,
84
+ });
85
+ const result = await request(app.getHttpServer())
86
+ .post("/v1/messages/publish")
87
+ .send({
88
+ stateLeafIndex,
89
+ proof: formatProofForVerifierContract(proof),
90
+ maciContractAddress: "invalid",
91
+ poll: "-1",
92
+ messages: [],
93
+ })
94
+ .expect(HttpStatus.BAD_REQUEST);
95
+ expect(result.body).toStrictEqual({
96
+ error: "Bad Request",
97
+ statusCode: HttpStatus.BAD_REQUEST,
98
+ message: [
99
+ "poll must not be less than 0",
100
+ "poll must be an integer number",
101
+ "maciContractAddress must be an Ethereum address",
102
+ "messages must contain at least 1 elements",
103
+ ],
104
+ });
105
+ });
106
+ test("should throw an error if messages dto is invalid", async () => {
107
+ const { proof } = await genProofSnarkjs({
108
+ inputs: circuitInputs,
109
+ zkeyPath: pollJoinedZkey,
110
+ wasmPath: pollJoinedWasm,
111
+ });
112
+ const result = await request(app.getHttpServer())
113
+ .post("/v1/messages/publish")
114
+ .send({
115
+ ...defaultSaveMessagesArgs,
116
+ maciContractAddress,
117
+ stateLeafIndex,
118
+ proof: formatProofForVerifierContract(proof),
119
+ messages: [{ data: [], publicKey: "invalid" }],
120
+ })
121
+ .expect(HttpStatus.BAD_REQUEST);
122
+ expect(result.body).toStrictEqual({
123
+ error: "Bad Request",
124
+ statusCode: HttpStatus.BAD_REQUEST,
125
+ message: ["messages.0.data must contain at least 10 elements", "messages.0.Public key is invalid"],
126
+ });
127
+ });
128
+ test("should publish user messages properly", async () => {
129
+ const { proof } = await genProofSnarkjs({
130
+ inputs: circuitInputs,
131
+ zkeyPath: pollJoinedZkey,
132
+ wasmPath: pollJoinedWasm,
133
+ });
134
+ const result = await request(app.getHttpServer())
135
+ .post("/v1/messages/publish")
136
+ .send({
137
+ ...defaultSaveMessagesArgs,
138
+ maciContractAddress,
139
+ stateLeafIndex,
140
+ proof: formatProofForVerifierContract(proof),
141
+ })
142
+ .expect(HttpStatus.CREATED);
143
+ expect(result.status).toBe(HttpStatus.CREATED);
144
+ });
145
+ });
146
+ });
147
+ //# sourceMappingURL=messages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.test.js","sourceRoot":"","sources":["../../tests/messages.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=onchain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onchain.test.d.ts","sourceRoot":"","sources":["../../tests/onchain.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,101 @@
1
+ import { jest } from "@jest/globals";
2
+ import { Keypair } from "@maci-protocol/domainobjs";
3
+ import { formatProofForVerifierContract, genProofSnarkjs, getDefaultSigner, getPollContracts, } from "@maci-protocol/sdk";
4
+ import { TestingClass } from "@maci-protocol/testing";
5
+ import { HttpStatus, ValidationPipe } from "@nestjs/common";
6
+ import { SchedulerRegistry } from "@nestjs/schedule";
7
+ import { Test } from "@nestjs/testing";
8
+ import request from "supertest";
9
+ import { AppModule } from "../ts/app.module.js";
10
+ import { pollJoinedWasm, pollJoinedZkey, pollWasm, tallyVotesZkeyPathNonQv, pollJoiningZkey, processMessagesZkeyPathNonQv, pollWitgen, rapidsnark, } from "./constants.js";
11
+ jest.unmock("@maci-protocol/sdk");
12
+ describe("Integration message publishing", () => {
13
+ let app;
14
+ let circuitInputs;
15
+ let stateLeafIndex;
16
+ let maciContractAddress;
17
+ let schedulerRegistry;
18
+ beforeAll(async () => {
19
+ await TestingClass.sleep(20_000);
20
+ const testDeploy = await TestingClass.getInstance({
21
+ pollJoiningZkeyPath: pollJoiningZkey,
22
+ pollJoinedZkeyPath: pollJoinedZkey,
23
+ processMessagesZkeyPath: processMessagesZkeyPathNonQv,
24
+ tallyVotesZkeyPath: tallyVotesZkeyPathNonQv,
25
+ pollWasm,
26
+ pollWitgen,
27
+ rapidsnark,
28
+ });
29
+ const poll = testDeploy.contractsData.maciState.polls.get(0n);
30
+ poll.updatePoll(BigInt(testDeploy.contractsData.maciState.pubKeys.length));
31
+ const [user] = testDeploy.contractsData.users;
32
+ stateLeafIndex = Number(user.stateLeafIndex);
33
+ maciContractAddress = testDeploy.contractsData.maciContractAddress;
34
+ circuitInputs = poll.joinedCircuitInputs({
35
+ maciPrivKey: user.keypair.privKey,
36
+ stateLeafIndex: user.stateLeafIndex,
37
+ voiceCreditsBalance: user.voiceCreditBalance,
38
+ joinTimestamp: user.timestamp,
39
+ });
40
+ const moduleFixture = await Test.createTestingModule({
41
+ imports: [AppModule],
42
+ }).compile();
43
+ app = moduleFixture.createNestApplication();
44
+ app.useGlobalPipes(new ValidationPipe({ transform: true }));
45
+ await app.listen(3003);
46
+ schedulerRegistry = moduleFixture.get(SchedulerRegistry);
47
+ });
48
+ afterAll(async () => {
49
+ jest.restoreAllMocks();
50
+ TestingClass.clean();
51
+ await app.close();
52
+ });
53
+ test("should publish user messages properly", async () => {
54
+ const keypair = new Keypair();
55
+ const defaultSaveMessagesArgs = {
56
+ maciContractAddress,
57
+ poll: 0,
58
+ stateLeafIndex,
59
+ messages: [
60
+ {
61
+ data: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"],
62
+ publicKey: keypair.pubKey.serialize(),
63
+ },
64
+ ],
65
+ };
66
+ const { proof } = await genProofSnarkjs({
67
+ inputs: circuitInputs,
68
+ zkeyPath: pollJoinedZkey,
69
+ wasmPath: pollJoinedWasm,
70
+ });
71
+ const cronJob = schedulerRegistry.getCronJob("publishMessages");
72
+ expect(cronJob).toBeDefined();
73
+ const result = await request(app.getHttpServer())
74
+ .post("/v1/messages/publish")
75
+ .send({
76
+ ...defaultSaveMessagesArgs,
77
+ maciContractAddress,
78
+ stateLeafIndex,
79
+ proof: formatProofForVerifierContract(proof),
80
+ })
81
+ .expect(HttpStatus.CREATED);
82
+ expect(result.status).toBe(HttpStatus.CREATED);
83
+ cronJob.fireOnTick();
84
+ const signer = await getDefaultSigner();
85
+ await signer.provider.send("evm_increaseTime", [100]);
86
+ await signer.provider.send("evm_mine", []);
87
+ const { poll: pollContract } = await getPollContracts({ maciAddress: maciContractAddress, pollId: 0, signer });
88
+ await Promise.race([
89
+ new Promise((resolve) => {
90
+ pollContract.once(pollContract.filters.IpfsHashAdded(), (ipfsHash) => {
91
+ expect(ipfsHash).toBeDefined();
92
+ resolve(true);
93
+ });
94
+ }),
95
+ TestingClass.sleep(30_000).then(() => {
96
+ throw new Error("Timeout error");
97
+ }),
98
+ ]);
99
+ });
100
+ });
101
+ //# sourceMappingURL=onchain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onchain.test.js","sourceRoot":"","sources":["../../tests/onchain.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class AppModule {
2
+ }
3
+ //# sourceMappingURL=app.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.module.d.ts","sourceRoot":"","sources":["../../ts/app.module.ts"],"names":[],"mappings":"AAUA,qBAiCa,SAAS;CAAG"}
@@ -0,0 +1,51 @@
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 { Module } from "@nestjs/common";
8
+ import { MongooseModule } from "@nestjs/mongoose";
9
+ import { ScheduleModule } from "@nestjs/schedule";
10
+ import { ThrottlerModule } from "@nestjs/throttler";
11
+ import { HealthModule } from "./health/health.module.js";
12
+ import { IpfsModule } from "./ipfs/ipfs.module.js";
13
+ import { MessageModule } from "./message/message.module.js";
14
+ import { MessageBatchModule } from "./messageBatch/messageBatch.module.js";
15
+ let AppModule = class AppModule {
16
+ };
17
+ AppModule = __decorate([
18
+ Module({
19
+ imports: [
20
+ ThrottlerModule.forRoot([
21
+ {
22
+ ttl: Number(process.env.TTL),
23
+ limit: Number(process.env.LIMIT),
24
+ },
25
+ ]),
26
+ ScheduleModule.forRoot(),
27
+ MongooseModule.forRootAsync({
28
+ useFactory: async () => {
29
+ if (process.env.NODE_ENV === "test") {
30
+ const { getTestMongooseModuleOptions } = await import("./jest/mongo.js");
31
+ return getTestMongooseModuleOptions();
32
+ }
33
+ return {
34
+ uri: process.env.MONGO_DB_URI,
35
+ auth: {
36
+ username: process.env.MONGODB_USER,
37
+ password: process.env.MONGODB_PASSWORD,
38
+ },
39
+ dbName: process.env.MONGODB_DATABASE,
40
+ };
41
+ },
42
+ }),
43
+ IpfsModule,
44
+ MessageModule,
45
+ MessageBatchModule,
46
+ HealthModule,
47
+ ],
48
+ })
49
+ ], AppModule);
50
+ export { AppModule };
51
+ //# sourceMappingURL=app.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../ts/app.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAmCpE,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,SAAS;IAjCrB,MAAM,CAAC;QACN,OAAO,EAAE;YACP,eAAe,CAAC,OAAO,CAAC;gBACtB;oBACE,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAC5B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;iBACjC;aACF,CAAC;YACF,cAAc,CAAC,OAAO,EAAE;YACxB,cAAc,CAAC,YAAY,CAAC;gBAC1B,UAAU,EAAE,KAAK,IAAI,EAAE;oBACrB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;wBACpC,MAAM,EAAE,4BAA4B,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;wBAEzE,OAAO,4BAA4B,EAAE,CAAC;oBACxC,CAAC;oBAED,OAAO;wBACL,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;wBAC7B,IAAI,EAAE;4BACJ,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;4BAClC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;yBACvC;wBACD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;qBACrC,CAAC;gBACJ,CAAC;aACF,CAAC;YACF,UAAU;YACV,aAAa;YACb,kBAAkB;YAClB,YAAY;SACb;KACF,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health.controller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.controller.test.d.ts","sourceRoot":"","sources":["../../../../ts/health/__tests__/health.controller.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { jest } from "@jest/globals";
2
+ import { Test } from "@nestjs/testing";
3
+ import { HealthController } from "../health.controller.js";
4
+ describe("HealthController", () => {
5
+ let controller;
6
+ beforeEach(async () => {
7
+ const app = await Test.createTestingModule({
8
+ controllers: [HealthController],
9
+ }).compile();
10
+ controller = app.get(HealthController);
11
+ });
12
+ afterEach(() => {
13
+ jest.clearAllMocks();
14
+ });
15
+ describe("v1/health/check", () => {
16
+ test("should check properly", () => {
17
+ const isRunning = controller.check();
18
+ expect(isRunning).toBe(true);
19
+ });
20
+ });
21
+ });
22
+ //# sourceMappingURL=health.controller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.controller.test.js","sourceRoot":"","sources":["../../../../ts/health/__tests__/health.controller.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,UAA4B,CAAC;IAEjC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;YACzC,WAAW,EAAE,CAAC,gBAAgB,CAAC;SAChC,CAAC,CAAC,OAAO,EAAE,CAAC;QAEb,UAAU,GAAG,GAAG,CAAC,GAAG,CAAmB,gBAAgB,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACjC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC;YAErC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class HealthController {
2
+ /**
3
+ * Health check api method.
4
+ *
5
+ * @param args fetch arguments
6
+ * @returns message batches
7
+ */
8
+ check(): boolean;
9
+ }
10
+ //# sourceMappingURL=health.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.controller.d.ts","sourceRoot":"","sources":["../../../ts/health/health.controller.ts"],"names":[],"mappings":"AAIA,qBAEa,gBAAgB;IAC3B;;;;;OAKG;IAGH,KAAK,IAAI,OAAO;CAGjB"}
@@ -0,0 +1,36 @@
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
+ /* eslint-disable @typescript-eslint/no-shadow */
11
+ import { Controller, Get, HttpStatus } from "@nestjs/common";
12
+ import { ApiResponse, ApiTags } from "@nestjs/swagger";
13
+ let HealthController = class HealthController {
14
+ /**
15
+ * Health check api method.
16
+ *
17
+ * @param args fetch arguments
18
+ * @returns message batches
19
+ */
20
+ check() {
21
+ return true;
22
+ }
23
+ };
24
+ __decorate([
25
+ ApiResponse({ status: HttpStatus.OK, description: "The service is running" }),
26
+ Get("check"),
27
+ __metadata("design:type", Function),
28
+ __metadata("design:paramtypes", []),
29
+ __metadata("design:returntype", Boolean)
30
+ ], HealthController.prototype, "check", null);
31
+ HealthController = __decorate([
32
+ ApiTags("v1/health"),
33
+ Controller("v1/health")
34
+ ], HealthController);
35
+ export { HealthController };
36
+ //# sourceMappingURL=health.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../../ts/health/health.controller.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iDAAiD;AACjD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAIhD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B;;;;;OAKG;IAGH,KAAK;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAHC;IAFC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;IAC7E,GAAG,CAAC,OAAO,CAAC;;;;6CAGZ;AAXU,gBAAgB;IAF5B,OAAO,CAAC,WAAW,CAAC;IACpB,UAAU,CAAC,WAAW,CAAC;GACX,gBAAgB,CAY5B"}
@@ -0,0 +1,3 @@
1
+ export declare class HealthModule {
2
+ }
3
+ //# sourceMappingURL=health.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.module.d.ts","sourceRoot":"","sources":["../../../ts/health/health.module.ts"],"names":[],"mappings":"AAIA,qBAGa,YAAY;CAAG"}
@@ -0,0 +1,17 @@
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 { Module } from "@nestjs/common";
8
+ import { HealthController } from "./health.controller.js";
9
+ let HealthModule = class HealthModule {
10
+ };
11
+ HealthModule = __decorate([
12
+ Module({
13
+ controllers: [HealthController],
14
+ })
15
+ ], HealthModule);
16
+ export { HealthModule };
17
+ //# sourceMappingURL=health.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.module.js","sourceRoot":"","sources":["../../../ts/health/health.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKnD,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IAHxB,MAAM,CAAC;QACN,WAAW,EAAE,CAAC,gBAAgB,CAAC;KAChC,CAAC;GACW,YAAY,CAAG"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ipfs.service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.service.test.d.ts","sourceRoot":"","sources":["../../../../ts/ipfs/__tests__/ipfs.service.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { IpfsService } from "../ipfs.service.js";
2
+ describe("IpfsService", () => {
3
+ const defaultData = { hello: "world" };
4
+ test("should not add or get data if adapter is not initialized", async () => {
5
+ const service = new IpfsService();
6
+ await expect(service.add(defaultData)).rejects.toThrow("IPFS adapter is not initialized");
7
+ await expect(service.get("cid")).rejects.toThrow("IPFS adapter is not initialized");
8
+ });
9
+ test("should add data and get data properly", async () => {
10
+ const service = new IpfsService();
11
+ await service.init();
12
+ const cid = await service.add(defaultData);
13
+ const data = await service.get(cid);
14
+ expect(data).toStrictEqual(defaultData);
15
+ });
16
+ test("should convert cid v1 to bytes32 properly", async () => {
17
+ const service = new IpfsService();
18
+ await service.init();
19
+ const bytes32Id = await service.cidToBytes32("bagaaierae7uwukkhfsvbw63l2wc4jdi2pilwaceei5quutzi4vcuh2z72dcq");
20
+ expect(bytes32Id).toBe("0x27e96a29472caa1b7b6bd585c48d1a7a1760088447614a4f28e54543eb3fd0c5");
21
+ });
22
+ });
23
+ //# sourceMappingURL=ipfs.service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.service.test.js","sourceRoot":"","sources":["../../../../ts/ipfs/__tests__/ipfs.service.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAEvC,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAElC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC1F,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAErB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEpC,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAErB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,+DAA+D,CAAC,CAAC;QAE9G,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare class IpfsModule {
2
+ }
3
+ //# sourceMappingURL=ipfs.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.module.d.ts","sourceRoot":"","sources":["../../../ts/ipfs/ipfs.module.ts"],"names":[],"mappings":"AAIA,qBAIa,UAAU;CAAG"}
@@ -0,0 +1,18 @@
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 { Module } from "@nestjs/common";
8
+ import { IpfsService } from "./ipfs.service.js";
9
+ let IpfsModule = class IpfsModule {
10
+ };
11
+ IpfsModule = __decorate([
12
+ Module({
13
+ exports: [IpfsService],
14
+ providers: [IpfsService],
15
+ })
16
+ ], IpfsModule);
17
+ export { IpfsModule };
18
+ //# sourceMappingURL=ipfs.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.module.js","sourceRoot":"","sources":["../../../ts/ipfs/ipfs.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMzC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,UAAU;IAJtB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,SAAS,EAAE,CAAC,WAAW,CAAC;KACzB,CAAC;GACW,UAAU,CAAG"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * IpfsService is responsible for saving data to ipfs
3
+ */
4
+ export declare class IpfsService {
5
+ /**
6
+ * Logger
7
+ */
8
+ private readonly logger;
9
+ /**
10
+ * IPFS adapter
11
+ */
12
+ private adapter?;
13
+ /**
14
+ * Initialize IpfsService
15
+ */
16
+ init(): Promise<void>;
17
+ /**
18
+ * Add data to IPFS and return the CID
19
+ *
20
+ * @param data data to be added to IPFS
21
+ * @returns cid
22
+ */
23
+ add<T>(data: T): Promise<string>;
24
+ /**
25
+ * Get data from IPFS
26
+ *
27
+ * @param cid CID of the data to be fetched from IPFS
28
+ * @returns data
29
+ */
30
+ get<T>(cid: string): Promise<T>;
31
+ /**
32
+ * Converts an IPFS CIDv1 to a bytes32-compatible hex string.
33
+ *
34
+ * This function:
35
+ * - Decodes the Base32-encoded CIDv1
36
+ * - Extracts the SHA-256 digest from the multihash
37
+ * - Converts it to a Solidity-compatible `bytes32` format
38
+ *
39
+ * @param hash - The CIDv1 string
40
+ * @returns A `bytes32`-compatible hex string (e.g., `0x...`)
41
+ */
42
+ cidToBytes32(hash: string): Promise<string>;
43
+ /**
44
+ * Check if IPFS adapter is initialized
45
+ *
46
+ * @throws Error if IPFS adapter is not initialized
47
+ */
48
+ private checkAdapter;
49
+ }
50
+ //# sourceMappingURL=ipfs.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs.service.d.ts","sourceRoot":"","sources":["../../../ts/ipfs/ipfs.service.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,qBACa,WAAW;IACtB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAE/D;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,CAAc;IAE9B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMtC;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAQrC;;;;;;;;;;OAUG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjD;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAMrB"}