@prosopo/provider 1.0.1 → 2.0.0

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 (191) hide show
  1. package/README.md +0 -258
  2. package/dist/api/admin.d.ts +2 -2
  3. package/dist/api/admin.d.ts.map +1 -1
  4. package/dist/api/admin.js +5 -64
  5. package/dist/api/admin.js.map +1 -1
  6. package/dist/api/authMiddleware.d.ts +4 -4
  7. package/dist/api/authMiddleware.d.ts.map +1 -1
  8. package/dist/api/authMiddleware.js +15 -29
  9. package/dist/api/authMiddleware.js.map +1 -1
  10. package/dist/api/captcha.d.ts +2 -2
  11. package/dist/api/captcha.d.ts.map +1 -1
  12. package/dist/api/captcha.js +64 -55
  13. package/dist/api/captcha.js.map +1 -1
  14. package/dist/api/captchaScheduler.d.ts +4 -0
  15. package/dist/api/captchaScheduler.d.ts.map +1 -0
  16. package/dist/api/captchaScheduler.js +22 -0
  17. package/dist/api/captchaScheduler.js.map +1 -0
  18. package/dist/api/errorHandler.d.ts +3 -3
  19. package/dist/api/errorHandler.d.ts.map +1 -1
  20. package/dist/api/errorHandler.js +7 -3
  21. package/dist/api/errorHandler.js.map +1 -1
  22. package/dist/api/verify.d.ts +2 -2
  23. package/dist/api/verify.d.ts.map +1 -1
  24. package/dist/api/verify.js +37 -29
  25. package/dist/api/verify.js.map +1 -1
  26. package/dist/cjs/api/admin.cjs +2 -89
  27. package/dist/cjs/api/authMiddleware.cjs +1 -15
  28. package/dist/cjs/api/captcha.cjs +89 -52
  29. package/dist/cjs/api/captchaScheduler.cjs +20 -0
  30. package/dist/cjs/api/errorHandler.cjs +3 -1
  31. package/dist/cjs/api/verify.cjs +54 -28
  32. package/dist/cjs/index.cjs +2 -3
  33. package/dist/cjs/tasks/dataset/datasetTasks.cjs +68 -0
  34. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +34 -0
  35. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +277 -0
  36. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +25 -0
  37. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +107 -0
  38. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +55 -0
  39. package/dist/cjs/tasks/tasks.cjs +21 -512
  40. package/dist/cjs/util.cjs +32 -19
  41. package/dist/index.d.ts +7 -7
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +7 -7
  44. package/dist/index.js.map +1 -1
  45. package/dist/tasks/dataset/datasetTasks.d.ts +15 -0
  46. package/dist/tasks/dataset/datasetTasks.d.ts.map +1 -0
  47. package/dist/tasks/dataset/datasetTasks.js +40 -0
  48. package/dist/tasks/dataset/datasetTasks.js.map +1 -0
  49. package/dist/tasks/dataset/datasetTasksUtils.d.ts +3 -0
  50. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +1 -0
  51. package/dist/tasks/dataset/datasetTasksUtils.js +34 -0
  52. package/dist/tasks/dataset/datasetTasksUtils.js.map +1 -0
  53. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +28 -0
  54. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +1 -0
  55. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +212 -0
  56. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +1 -0
  57. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +7 -0
  58. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +1 -0
  59. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +18 -0
  60. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +1 -0
  61. package/dist/tasks/index.d.ts +1 -1
  62. package/dist/tasks/index.d.ts.map +1 -1
  63. package/dist/tasks/index.js +1 -1
  64. package/dist/tasks/index.js.map +1 -1
  65. package/dist/tasks/powCaptcha/powTasks.d.ts +13 -0
  66. package/dist/tasks/powCaptcha/powTasks.d.ts.map +1 -0
  67. package/dist/tasks/powCaptcha/powTasks.js +66 -0
  68. package/dist/tasks/powCaptcha/powTasks.js.map +1 -0
  69. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +5 -0
  70. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +1 -0
  71. package/dist/tasks/powCaptcha/powTasksUtils.js +49 -0
  72. package/dist/tasks/powCaptcha/powTasksUtils.js.map +1 -0
  73. package/dist/tasks/tasks.d.ts +12 -42
  74. package/dist/tasks/tasks.d.ts.map +1 -1
  75. package/dist/tasks/tasks.js +13 -419
  76. package/dist/tasks/tasks.js.map +1 -1
  77. package/dist/tests/index.d.ts +2 -0
  78. package/dist/tests/index.d.ts.map +1 -0
  79. package/dist/tests/index.js +2 -0
  80. package/dist/tests/index.js.map +1 -0
  81. package/dist/tests/integration/imgCaptcha.test.d.ts +2 -0
  82. package/dist/tests/integration/imgCaptcha.test.d.ts.map +1 -0
  83. package/dist/tests/integration/imgCaptcha.test.js +111 -0
  84. package/dist/tests/integration/imgCaptcha.test.js.map +1 -0
  85. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +32 -0
  86. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +1 -0
  87. package/dist/tests/integration/mocks/solvedTestCaptchas.js +1042 -0
  88. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +1 -0
  89. package/dist/tests/integration/powCaptcha.test.d.ts +2 -0
  90. package/dist/tests/integration/powCaptcha.test.d.ts.map +1 -0
  91. package/dist/tests/integration/powCaptcha.test.js +171 -0
  92. package/dist/tests/integration/powCaptcha.test.js.map +1 -0
  93. package/dist/tests/unit/api/authMiddleware.test.d.ts +2 -0
  94. package/dist/tests/unit/api/authMiddleware.test.d.ts.map +1 -0
  95. package/dist/tests/unit/api/authMiddleware.test.js +87 -0
  96. package/dist/tests/unit/api/authMiddleware.test.js.map +1 -0
  97. package/dist/tests/unit/api/captchaScheduler.test.d.ts +2 -0
  98. package/dist/tests/unit/api/captchaScheduler.test.d.ts.map +1 -0
  99. package/dist/tests/unit/api/captchaScheduler.test.js +47 -0
  100. package/dist/tests/unit/api/captchaScheduler.test.js.map +1 -0
  101. package/dist/tests/unit/api/errorHandler.test.d.ts +2 -0
  102. package/dist/tests/unit/api/errorHandler.test.d.ts.map +1 -0
  103. package/dist/tests/unit/api/errorHandler.test.js +65 -0
  104. package/dist/tests/unit/api/errorHandler.test.js.map +1 -0
  105. package/dist/tests/unit/tasks/dataset/datasetTasks.test.d.ts +2 -0
  106. package/dist/tests/unit/tasks/dataset/datasetTasks.test.d.ts.map +1 -0
  107. package/dist/tests/unit/tasks/dataset/datasetTasks.test.js +88 -0
  108. package/dist/tests/unit/tasks/dataset/datasetTasks.test.js.map +1 -0
  109. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.d.ts +2 -0
  110. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.d.ts.map +1 -0
  111. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.js +75 -0
  112. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.test.js.map +1 -0
  113. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.d.ts +2 -0
  114. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.d.ts.map +1 -0
  115. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.js +260 -0
  116. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.test.js.map +1 -0
  117. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.d.ts +2 -0
  118. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.d.ts.map +1 -0
  119. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.js +46 -0
  120. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.test.js.map +1 -0
  121. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.d.ts +2 -0
  122. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.d.ts.map +1 -0
  123. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.js +133 -0
  124. package/dist/tests/unit/tasks/powCaptcha/powTasks.test.js.map +1 -0
  125. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.d.ts +2 -0
  126. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.d.ts.map +1 -0
  127. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.js +94 -0
  128. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.test.js.map +1 -0
  129. package/dist/util.d.ts +2 -2
  130. package/dist/util.d.ts.map +1 -1
  131. package/dist/util.js +10 -8
  132. package/dist/util.js.map +1 -1
  133. package/package.json +74 -86
  134. package/vite.cjs.config.ts +3 -3
  135. package/vite.test.config.ts +12 -12
  136. package/dist/batch/commitments.d.ts +0 -24
  137. package/dist/batch/commitments.d.ts.map +0 -1
  138. package/dist/batch/commitments.js +0 -130
  139. package/dist/batch/commitments.js.map +0 -1
  140. package/dist/batch/index.d.ts +0 -2
  141. package/dist/batch/index.d.ts.map +0 -1
  142. package/dist/batch/index.js +0 -2
  143. package/dist/batch/index.js.map +0 -1
  144. package/dist/cjs/batch/commitments.cjs +0 -158
  145. package/dist/cjs/batch/index.cjs +0 -4
  146. package/dist/scheduler.d.ts +0 -4
  147. package/dist/scheduler.d.ts.map +0 -1
  148. package/dist/scheduler.js +0 -21
  149. package/dist/scheduler.js.map +0 -1
  150. package/dist/tests/accounts.d.ts +0 -12
  151. package/dist/tests/accounts.d.ts.map +0 -1
  152. package/dist/tests/accounts.js +0 -35
  153. package/dist/tests/accounts.js.map +0 -1
  154. package/dist/tests/contract/helpers.test.d.ts +0 -6
  155. package/dist/tests/contract/helpers.test.d.ts.map +0 -1
  156. package/dist/tests/contract/helpers.test.js +0 -54
  157. package/dist/tests/contract/helpers.test.js.map +0 -1
  158. package/dist/tests/dataUtils/DatabaseAccounts.d.ts +0 -35
  159. package/dist/tests/dataUtils/DatabaseAccounts.d.ts.map +0 -1
  160. package/dist/tests/dataUtils/DatabaseAccounts.js +0 -84
  161. package/dist/tests/dataUtils/DatabaseAccounts.js.map +0 -1
  162. package/dist/tests/dataUtils/DatabasePopulator.d.ts +0 -73
  163. package/dist/tests/dataUtils/DatabasePopulator.d.ts.map +0 -1
  164. package/dist/tests/dataUtils/DatabasePopulator.js +0 -326
  165. package/dist/tests/dataUtils/DatabasePopulator.js.map +0 -1
  166. package/dist/tests/dataUtils/dapp-example-contract/dapp.json +0 -648
  167. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts +0 -4
  168. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts.map +0 -1
  169. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js +0 -27
  170. package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js.map +0 -1
  171. package/dist/tests/dataUtils/funds.d.ts +0 -9
  172. package/dist/tests/dataUtils/funds.d.ts.map +0 -1
  173. package/dist/tests/dataUtils/funds.js +0 -105
  174. package/dist/tests/dataUtils/funds.js.map +0 -1
  175. package/dist/tests/dataUtils/populateDatabase.d.ts +0 -16
  176. package/dist/tests/dataUtils/populateDatabase.d.ts.map +0 -1
  177. package/dist/tests/dataUtils/populateDatabase.js +0 -72
  178. package/dist/tests/dataUtils/populateDatabase.js.map +0 -1
  179. package/dist/tests/getUser.d.ts +0 -4
  180. package/dist/tests/getUser.d.ts.map +0 -1
  181. package/dist/tests/getUser.js +0 -18
  182. package/dist/tests/getUser.js.map +0 -1
  183. package/dist/tests/tasks/tasks.test.d.ts +0 -6
  184. package/dist/tests/tasks/tasks.test.d.ts.map +0 -1
  185. package/dist/tests/tasks/tasks.test.js +0 -635
  186. package/dist/tests/tasks/tasks.test.js.map +0 -1
  187. package/dist/tests/util.test.d.ts +0 -2
  188. package/dist/tests/util.test.d.ts.map +0 -1
  189. package/dist/tests/util.test.js +0 -23
  190. package/dist/tests/util.test.js.map +0 -1
  191. package/typedoc.config.js +0 -19
@@ -0,0 +1,15 @@
1
+ import type { Logger } from "@prosopo/common";
2
+ import type { CaptchaConfig, DatasetRaw, ProsopoConfigOutput, StoredEvents } from "@prosopo/types";
3
+ import type { Database } from "@prosopo/types-database";
4
+ export declare class DatasetManager {
5
+ config: ProsopoConfigOutput;
6
+ logger: Logger;
7
+ captchaConfig: CaptchaConfig;
8
+ db: Database;
9
+ constructor(config: ProsopoConfigOutput, logger: Logger, captchaConfig: CaptchaConfig, db: Database);
10
+ providerSetDatasetFromFile(file: JSON): Promise<void>;
11
+ providerSetDataset(datasetRaw: DatasetRaw): Promise<void>;
12
+ saveCaptchaEvent(events: StoredEvents, accountId: string): Promise<void>;
13
+ storeCommitmentsExternal(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=datasetTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAgB9C,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EAEV,mBAAmB,EACnB,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAwB,MAAM,yBAAyB,CAAC;AAG9E,qBAAa,cAAc;IACzB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,EAAE,EAAE,QAAQ,CAAC;gBAGX,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,EAC5B,EAAE,EAAE,QAAQ;IAaR,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzD,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM;IAYxD,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBhD"}
@@ -0,0 +1,40 @@
1
+ import { saveCaptchaEvent, saveCaptchas } from "@prosopo/database";
2
+ import { parseCaptchaDataset } from "@prosopo/datasets";
3
+ import { providerValidateDataset } from "./datasetTasksUtils.js";
4
+ export class DatasetManager {
5
+ constructor(config, logger, captchaConfig, db) {
6
+ this.config = config;
7
+ this.logger = logger;
8
+ this.captchaConfig = captchaConfig;
9
+ this.db = db;
10
+ }
11
+ async providerSetDatasetFromFile(file) {
12
+ const datasetRaw = parseCaptchaDataset(file);
13
+ return await this.providerSetDataset(datasetRaw);
14
+ }
15
+ async providerSetDataset(datasetRaw) {
16
+ const dataset = await providerValidateDataset(datasetRaw, this.captchaConfig.solved.count, this.captchaConfig.unsolved.count);
17
+ await this.db?.storeDataset(dataset);
18
+ }
19
+ async saveCaptchaEvent(events, accountId) {
20
+ if (!this.config.devOnlyWatchEvents || !this.config.mongoEventsUri) {
21
+ this.logger.info("Dev watch events not set to true, not saving events");
22
+ return;
23
+ }
24
+ await saveCaptchaEvent(events, accountId, this.config.mongoEventsUri);
25
+ }
26
+ async storeCommitmentsExternal() {
27
+ if (!this.config.mongoCaptchaUri) {
28
+ this.logger.info("Mongo env not set");
29
+ return;
30
+ }
31
+ const commitments = await this.db.getUnstoredDappUserCommitments();
32
+ this.logger.info(`Storing ${commitments.length} commitments externally`);
33
+ const powRecords = await this.db.getUnstoredDappUserPoWCommitments();
34
+ this.logger.info(`Storing ${powRecords.length} pow challenges externally`);
35
+ await saveCaptchas(commitments, powRecords, this.config.mongoCaptchaUri);
36
+ await this.db.markDappUserCommitmentsStored(commitments.map((commitment) => commitment.id));
37
+ await this.db.markDappUserPoWCommitmentsStored(powRecords.map((powRecords) => powRecords.challenge));
38
+ }
39
+ }
40
+ //# sourceMappingURL=datasetTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetTasks.js","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAcnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AASxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,OAAO,cAAc;IAMzB,YACE,MAA2B,EAC3B,MAAc,EACd,aAA4B,EAC5B,EAAY;QAEZ,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAOD,KAAK,CAAC,0BAA0B,CAAC,IAAU;QACzC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB;QAC7C,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAC3C,UAAU,EACV,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAC/B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAClC,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAWD,KAAK,CAAC,gBAAgB,CAAC,MAAoB,EAAE,SAAiB;QAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YAClE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YACxE,OAAO;SACR;QACD,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACxE,CAAC;IAMD,KAAK,CAAC,wBAAwB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACtC,OAAO;SACR;QAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,8BAA8B,EAAE,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,WAAW,CAAC,MAAM,yBAAyB,CAAC,CAAC;QAEzE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,iCAAiC,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,4BAA4B,CAAC,CAAC;QAE3E,MAAM,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,EAAE,CAAC,6BAA6B,CACzC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAC/C,CAAC;QACF,MAAM,IAAI,CAAC,EAAE,CAAC,gCAAgC,CAC5C,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CACrD,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { DatasetRaw } from "@prosopo/types";
2
+ export declare const providerValidateDataset: (datasetRaw: DatasetRaw, minSolvedCaptchas: number, minUnsolvedCaptchas: number) => Promise<import("@prosopo/types").Dataset>;
3
+ //# sourceMappingURL=datasetTasksUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetTasksUtils.d.ts","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasksUtils.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,eAAO,MAAM,uBAAuB,eACvB,UAAU,qBACH,MAAM,uBACJ,MAAM,8CAyC3B,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { ProsopoEnvError } from "@prosopo/common";
2
+ import { buildDataset } from "@prosopo/datasets";
3
+ export const providerValidateDataset = async (datasetRaw, minSolvedCaptchas, minUnsolvedCaptchas) => {
4
+ if (datasetRaw.captchas.length < minSolvedCaptchas + minUnsolvedCaptchas) {
5
+ throw new ProsopoEnvError("DATASET.CAPTCHAS_COUNT_LESS_THAN_CONFIGURED", {
6
+ context: { failedFuncName: providerValidateDataset.name },
7
+ });
8
+ }
9
+ const solutions = datasetRaw.captchas
10
+ .map((captcha) => (captcha.solution ? 1 : 0))
11
+ .reduce((partialSum, b) => partialSum + b, 0);
12
+ if (solutions < minSolvedCaptchas) {
13
+ throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
14
+ context: { failedFuncName: providerValidateDataset.name },
15
+ });
16
+ }
17
+ if (solutions < minUnsolvedCaptchas) {
18
+ throw new ProsopoEnvError("DATASET.SOLUTIONS_COUNT_LESS_THAN_CONFIGURED", {
19
+ context: { failedFuncName: providerValidateDataset.name },
20
+ });
21
+ }
22
+ const dataset = await buildDataset(datasetRaw);
23
+ if (!dataset.datasetId || !dataset.datasetContentId) {
24
+ throw new ProsopoEnvError("DATASET.DATASET_ID_UNDEFINED", {
25
+ context: {
26
+ failedFuncName: providerValidateDataset.name,
27
+ datasetId: dataset.datasetId,
28
+ datasetContentId: dataset.datasetContentId,
29
+ },
30
+ });
31
+ }
32
+ return dataset;
33
+ };
34
+ //# sourceMappingURL=datasetTasksUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datasetTasksUtils.js","sourceRoot":"","sources":["../../../src/tasks/dataset/datasetTasksUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC3C,UAAsB,EACtB,iBAAyB,EACzB,mBAA2B,EAC1B,EAAE;IAEH,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,iBAAiB,GAAG,mBAAmB,EAAE;QACzE,MAAM,IAAI,eAAe,CAAC,6CAA6C,EAAE;YACxE,OAAO,EAAE,EAAE,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE;SACzD,CAAC,CAAC;KACH;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ;SACnC,GAAG,CAAC,CAAC,OAAO,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpD,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAG/C,IAAI,SAAS,GAAG,iBAAiB,EAAE;QAClC,MAAM,IAAI,eAAe,CAAC,8CAA8C,EAAE;YACzE,OAAO,EAAE,EAAE,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE;SACzD,CAAC,CAAC;KACH;IAGD,IAAI,SAAS,GAAG,mBAAmB,EAAE;QACpC,MAAM,IAAI,eAAe,CAAC,8CAA8C,EAAE;YACzE,OAAO,EAAE,EAAE,cAAc,EAAE,uBAAuB,CAAC,IAAI,EAAE;SACzD,CAAC,CAAC;KACH;IAED,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;IAG/C,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;QACpD,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE;YACzD,OAAO,EAAE;gBACR,cAAc,EAAE,uBAAuB,CAAC,IAAI;gBAC5C,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;aAC1C;SACD,CAAC,CAAC;KACH;IAED,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { KeyringPair } from "@polkadot/keyring/types";
2
+ import { type Logger } from "@prosopo/common";
3
+ import { type Captcha, type CaptchaConfig, type CaptchaSolution, type DappUserSolutionResult, type Hash, type PendingCaptchaRequest } from "@prosopo/types";
4
+ import type { Database, UserCommitmentRecord } from "@prosopo/types-database";
5
+ export declare class ImgCaptchaManager {
6
+ db: Database;
7
+ pair: KeyringPair;
8
+ logger: Logger;
9
+ captchaConfig: CaptchaConfig;
10
+ constructor(db: Database, pair: KeyringPair, logger: Logger, captchaConfig: CaptchaConfig);
11
+ getCaptchaWithProof(datasetId: Hash, solved: boolean, size: number): Promise<Captcha[]>;
12
+ getRandomCaptchasAndRequestHash(datasetId: string, userAccount: string): Promise<{
13
+ captchas: Captcha[];
14
+ requestHash: string;
15
+ timestamp: number;
16
+ signedTimestamp: string;
17
+ }>;
18
+ dappUserSolution(userAccount: string, dappAccount: string, requestHash: string, captchas: CaptchaSolution[], requestHashSignature: string, timestamp: number, timestampSignature: string): Promise<DappUserSolutionResult>;
19
+ validateReceivedCaptchasAgainstStoredCaptchas(captchas: CaptchaSolution[]): Promise<{
20
+ storedCaptchas: Captcha[];
21
+ receivedCaptchas: CaptchaSolution[];
22
+ captchaIds: string[];
23
+ }>;
24
+ validateDappUserSolutionRequestIsPending(requestHash: string, pendingRecord: PendingCaptchaRequest, userAccount: string, captchaIds: string[]): Promise<boolean>;
25
+ getDappUserCommitmentById(commitmentId: string): Promise<UserCommitmentRecord>;
26
+ getDappUserCommitmentByAccount(userAccount: string): Promise<UserCommitmentRecord | undefined>;
27
+ }
28
+ //# sourceMappingURL=imgCaptchaTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imgCaptchaTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasks.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,iBAAiB,CAAC;AAM/D,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,eAAe,EAGpB,KAAK,sBAAsB,EAC3B,KAAK,IAAI,EACT,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAK9E,qBAAa,iBAAiB;IAC5B,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;gBAG3B,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa;IAQxB,mBAAmB,CACvB,SAAS,EAAE,IAAI,EACf,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,EAAE,CAAC;IAgBf,+BAA+B,CACnC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QACT,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IA8EI,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,eAAe,EAAE,EAC3B,oBAAoB,EAAE,MAAM,EAC5B,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,sBAAsB,CAAC;IAmH5B,6CAA6C,CACjD,QAAQ,EAAE,eAAe,EAAE,GAC1B,OAAO,CAAC;QACT,cAAc,EAAE,OAAO,EAAE,CAAC;QAC1B,gBAAgB,EAAE,eAAe,EAAE,CAAC;QACpC,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAqCI,wCAAwC,CAC5C,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,qBAAqB,EACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,OAAO,CAAC;IA2Bb,yBAAyB,CAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC;IAe1B,8BAA8B,CAClC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;CAY7C"}
@@ -0,0 +1,212 @@
1
+ import { hexToU8a, stringToHex, u8aToHex } from "@polkadot/util";
2
+ import { randomAsHex, signatureVerify } from "@polkadot/util-crypto";
3
+ import { ProsopoEnvError } from "@prosopo/common";
4
+ import { compareCaptchaSolutions, computePendingRequestHash, parseAndSortCaptchaSolutions, } from "@prosopo/datasets";
5
+ import { CaptchaStatus, DEFAULT_IMAGE_CAPTCHA_TIMEOUT, } from "@prosopo/types";
6
+ import { at } from "@prosopo/util";
7
+ import { shuffleArray } from "../../util.js";
8
+ import { buildTreeAndGetCommitmentId } from "./imgCaptchaTasksUtils.js";
9
+ export class ImgCaptchaManager {
10
+ constructor(db, pair, logger, captchaConfig) {
11
+ this.db = db;
12
+ this.pair = pair;
13
+ this.logger = logger;
14
+ this.captchaConfig = captchaConfig;
15
+ }
16
+ async getCaptchaWithProof(datasetId, solved, size) {
17
+ const captchaDocs = await this.db.getRandomCaptcha(solved, datasetId, size);
18
+ if (!captchaDocs) {
19
+ throw new ProsopoEnvError("DATABASE.CAPTCHA_GET_FAILED", {
20
+ context: {
21
+ failedFuncName: this.getCaptchaWithProof.name,
22
+ datasetId,
23
+ solved,
24
+ size,
25
+ },
26
+ });
27
+ }
28
+ return captchaDocs;
29
+ }
30
+ async getRandomCaptchasAndRequestHash(datasetId, userAccount) {
31
+ const dataset = await this.db.getDatasetDetails(datasetId);
32
+ if (!dataset) {
33
+ throw new ProsopoEnvError("DATABASE.DATASET_GET_FAILED", {
34
+ context: {
35
+ failedFuncName: this.getRandomCaptchasAndRequestHash.name,
36
+ dataset,
37
+ datasetId,
38
+ },
39
+ });
40
+ }
41
+ const unsolvedCount = Math.abs(Math.trunc(this.captchaConfig.unsolved.count));
42
+ const solvedCount = Math.abs(Math.trunc(this.captchaConfig.solved.count));
43
+ if (!solvedCount) {
44
+ throw new ProsopoEnvError("CONFIG.INVALID_CAPTCHA_NUMBER");
45
+ }
46
+ const solved = await this.getCaptchaWithProof(datasetId, true, solvedCount);
47
+ let unsolved = [];
48
+ if (unsolvedCount) {
49
+ unsolved = await this.getCaptchaWithProof(datasetId, false, unsolvedCount);
50
+ }
51
+ const captchas = shuffleArray([...solved, ...unsolved]);
52
+ const salt = randomAsHex();
53
+ const requestHash = computePendingRequestHash(captchas.map((c) => c.captchaId), userAccount, salt);
54
+ const currentTime = Date.now();
55
+ const signedTimestamp = u8aToHex(this.pair.sign(stringToHex(currentTime.toString())));
56
+ const timeLimit = captchas
57
+ .map((captcha) => captcha.timeLimitMs || DEFAULT_IMAGE_CAPTCHA_TIMEOUT)
58
+ .reduce((a, b) => a + b, 0);
59
+ const deadlineTs = timeLimit + currentTime;
60
+ const currentBlockNumber = 0;
61
+ await this.db.storeDappUserPending(userAccount, requestHash, salt, deadlineTs, currentBlockNumber);
62
+ return {
63
+ captchas,
64
+ requestHash,
65
+ timestamp: currentTime,
66
+ signedTimestamp,
67
+ };
68
+ }
69
+ async dappUserSolution(userAccount, dappAccount, requestHash, captchas, requestHashSignature, timestamp, timestampSignature) {
70
+ const verification = signatureVerify(stringToHex(requestHash), requestHashSignature, userAccount);
71
+ if (!verification.isValid) {
72
+ this.logger.info("Invalid requestHash signature");
73
+ throw new ProsopoEnvError("GENERAL.INVALID_SIGNATURE", {
74
+ context: { failedFuncName: this.dappUserSolution.name, userAccount },
75
+ });
76
+ }
77
+ const timestampSigVerify = signatureVerify(stringToHex(timestamp.toString()), timestampSignature, this.pair.address);
78
+ if (!timestampSigVerify.isValid) {
79
+ this.logger.info("Invalid timestamp signature");
80
+ throw new ProsopoEnvError("GENERAL.INVALID_SIGNATURE", {
81
+ context: {
82
+ failedFuncName: this.dappUserSolution.name,
83
+ userAccount,
84
+ error: "timestamp signature is invalid",
85
+ },
86
+ });
87
+ }
88
+ let response = {
89
+ captchas: [],
90
+ verified: false,
91
+ };
92
+ const pendingRecord = await this.db.getDappUserPending(requestHash);
93
+ const unverifiedCaptchaIds = captchas.map((captcha) => captcha.captchaId);
94
+ const pendingRequest = await this.validateDappUserSolutionRequestIsPending(requestHash, pendingRecord, userAccount, unverifiedCaptchaIds);
95
+ console.log("Pending request", pendingRequest);
96
+ if (pendingRequest) {
97
+ const { storedCaptchas, receivedCaptchas, captchaIds } = await this.validateReceivedCaptchasAgainstStoredCaptchas(captchas);
98
+ const { tree, commitmentId } = buildTreeAndGetCommitmentId(receivedCaptchas);
99
+ const datasetId = at(storedCaptchas, 0).datasetId;
100
+ if (!datasetId) {
101
+ throw new ProsopoEnvError("CAPTCHA.ID_MISMATCH", {
102
+ context: { failedFuncName: this.dappUserSolution.name },
103
+ });
104
+ }
105
+ const userSignature = hexToU8a(requestHashSignature);
106
+ await this.db.updateDappUserPendingStatus(requestHash);
107
+ const commit = {
108
+ id: commitmentId,
109
+ userAccount: userAccount,
110
+ dappContract: dappAccount,
111
+ providerAccount: this.pair.address,
112
+ datasetId,
113
+ status: CaptchaStatus.pending,
114
+ userSignature: Array.from(userSignature),
115
+ requestedAt: pendingRecord.requestedAtBlock,
116
+ completedAt: 0,
117
+ processed: false,
118
+ batched: false,
119
+ stored: false,
120
+ requestedAtTimestamp: timestamp,
121
+ };
122
+ await this.db.storeDappUserSolution(receivedCaptchas, commit);
123
+ console.log(receivedCaptchas);
124
+ console.log(storedCaptchas);
125
+ if (compareCaptchaSolutions(receivedCaptchas, storedCaptchas)) {
126
+ response = {
127
+ captchas: captchaIds.map((id) => ({
128
+ captchaId: id,
129
+ proof: tree.proof(id),
130
+ })),
131
+ verified: true,
132
+ };
133
+ await this.db.approveDappUserCommitment(commitmentId);
134
+ }
135
+ else {
136
+ response = {
137
+ captchas: captchaIds.map((id) => ({
138
+ captchaId: id,
139
+ proof: [[]],
140
+ })),
141
+ verified: false,
142
+ };
143
+ }
144
+ }
145
+ else {
146
+ this.logger.info("Request hash not found");
147
+ }
148
+ return response;
149
+ }
150
+ async validateReceivedCaptchasAgainstStoredCaptchas(captchas) {
151
+ const receivedCaptchas = parseAndSortCaptchaSolutions(captchas);
152
+ const captchaIds = receivedCaptchas.map((captcha) => captcha.captchaId);
153
+ const storedCaptchas = await this.db.getCaptchaById(captchaIds);
154
+ if (!storedCaptchas || receivedCaptchas.length !== storedCaptchas.length) {
155
+ throw new ProsopoEnvError("CAPTCHA.INVALID_CAPTCHA_ID", {
156
+ context: {
157
+ failedFuncName: this.validateReceivedCaptchasAgainstStoredCaptchas.name,
158
+ captchas,
159
+ },
160
+ });
161
+ }
162
+ if (!storedCaptchas.every((captcha) => captcha.datasetId === at(storedCaptchas, 0).datasetId)) {
163
+ throw new ProsopoEnvError("CAPTCHA.DIFFERENT_DATASET_IDS", {
164
+ context: {
165
+ failedFuncName: this.validateReceivedCaptchasAgainstStoredCaptchas.name,
166
+ captchas,
167
+ },
168
+ });
169
+ }
170
+ return { storedCaptchas, receivedCaptchas, captchaIds };
171
+ }
172
+ async validateDappUserSolutionRequestIsPending(requestHash, pendingRecord, userAccount, captchaIds) {
173
+ const currentTime = Date.now();
174
+ if (!pendingRecord) {
175
+ this.logger.info("No pending record found");
176
+ return false;
177
+ }
178
+ if (pendingRecord.deadlineTimestamp < currentTime) {
179
+ this.logger.info("Deadline for responding to captcha has expired");
180
+ return false;
181
+ }
182
+ if (pendingRecord) {
183
+ const pendingHashComputed = computePendingRequestHash(captchaIds, userAccount, pendingRecord.salt);
184
+ return requestHash === pendingHashComputed;
185
+ }
186
+ return false;
187
+ }
188
+ async getDappUserCommitmentById(commitmentId) {
189
+ const dappUserSolution = await this.db.getDappUserCommitmentById(commitmentId);
190
+ if (!dappUserSolution) {
191
+ throw new ProsopoEnvError("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND", {
192
+ context: {
193
+ failedFuncName: this.getDappUserCommitmentById.name,
194
+ commitmentId: commitmentId,
195
+ },
196
+ });
197
+ }
198
+ return dappUserSolution;
199
+ }
200
+ async getDappUserCommitmentByAccount(userAccount) {
201
+ const dappUserSolutions = await this.db.getDappUserCommitmentByAccount(userAccount);
202
+ if (dappUserSolutions.length > 0) {
203
+ for (const dappUserSolution of dappUserSolutions) {
204
+ if (dappUserSolution.status === CaptchaStatus.approved) {
205
+ return dappUserSolution;
206
+ }
207
+ }
208
+ }
209
+ return undefined;
210
+ }
211
+ }
212
+ //# sourceMappingURL=imgCaptchaTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imgCaptchaTasks.js","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { CaptchaMerkleTree } from "@prosopo/datasets";
2
+ import type { CaptchaSolution } from "@prosopo/types";
3
+ export declare const buildTreeAndGetCommitmentId: (captchaSolutions: CaptchaSolution[]) => {
4
+ tree: CaptchaMerkleTree;
5
+ commitmentId: string;
6
+ };
7
+ //# sourceMappingURL=imgCaptchaTasksUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imgCaptchaTasksUtils.d.ts","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts"],"names":[],"mappings":"AAcA,OAAO,EACN,iBAAiB,EAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOtD,eAAO,MAAM,2BAA2B,qBACrB,eAAe,EAAE;UACzB,iBAAiB;kBAAgB,MAAM;CAqBjD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ProsopoEnvError } from "@prosopo/common";
2
+ import { CaptchaMerkleTree, computeCaptchaSolutionHash, } from "@prosopo/datasets";
3
+ export const buildTreeAndGetCommitmentId = (captchaSolutions) => {
4
+ const tree = new CaptchaMerkleTree();
5
+ const solutionsHashed = captchaSolutions.map((captcha) => computeCaptchaSolutionHash(captcha));
6
+ tree.build(solutionsHashed);
7
+ const commitmentId = tree.root?.hash;
8
+ if (!commitmentId) {
9
+ throw new ProsopoEnvError("CONTRACT.CAPTCHA_SOLUTION_COMMITMENT_DOES_NOT_EXIST", {
10
+ context: {
11
+ failedFuncName: buildTreeAndGetCommitmentId.name,
12
+ commitmentId: commitmentId,
13
+ },
14
+ });
15
+ }
16
+ return { tree, commitmentId };
17
+ };
18
+ //# sourceMappingURL=imgCaptchaTasksUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imgCaptchaTasksUtils.js","sourceRoot":"","sources":["../../../src/tasks/imgCaptcha/imgCaptchaTasksUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACN,iBAAiB,EACjB,0BAA0B,GAC1B,MAAM,mBAAmB,CAAC;AAQ3B,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAC1C,gBAAmC,EACiB,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACrC,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACxD,0BAA0B,CAAC,OAAO,CAAC,CACnC,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;IACrC,IAAI,CAAC,YAAY,EAAE;QAClB,MAAM,IAAI,eAAe,CACxB,qDAAqD,EACrD;YACC,OAAO,EAAE;gBACR,cAAc,EAAE,2BAA2B,CAAC,IAAI;gBAChD,YAAY,EAAE,YAAY;aAC1B;SACD,CACD,CAAC;KACF;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAC/B,CAAC,CAAC"}
@@ -1,2 +1,2 @@
1
- export * from './tasks.js';
1
+ export * from "./tasks.js";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAC"}
@@ -1,2 +1,2 @@
1
- export * from './tasks.js';
1
+ export * from "./tasks.js";
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tasks/index.ts"],"names":[],"mappings":"AAaA,cAAc,YAAY,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { KeyringPair } from "@polkadot/keyring/types";
2
+ import { type PoWCaptcha, PoWChallengeId } from "@prosopo/types";
3
+ import type { Database } from "@prosopo/types-database";
4
+ export declare class PowCaptchaManager {
5
+ pair: KeyringPair;
6
+ db: Database;
7
+ POW_SEPARATOR: string;
8
+ constructor(pair: KeyringPair, db: Database);
9
+ getPowCaptchaChallenge(userAccount: string, dappAccount: string, origin: string): Promise<PoWCaptcha>;
10
+ verifyPowCaptchaSolution(challenge: PoWChallengeId, difficulty: number, signature: string, nonce: number, timeout: number, timestampSignature: string): Promise<boolean>;
11
+ serverVerifyPowCaptchaSolution(dappAccount: string, challenge: string, timeout: number): Promise<boolean>;
12
+ }
13
+ //# sourceMappingURL=powTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"powTasks.d.ts","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasks.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,OAAO,EAGL,KAAK,UAAU,EACf,cAAc,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAQxD,qBAAa,iBAAiB;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,EAAE,EAAE,QAAQ,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ;IAarC,sBAAsB,CAC1B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC;IA6BhB,wBAAwB,CAC5B,SAAS,EAAE,cAAc,EACzB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,OAAO,CAAC;IAqCb,8BAA8B,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;CAgCpB"}
@@ -0,0 +1,66 @@
1
+ import { u8aToHex } from "@polkadot/util";
2
+ import { stringToHex } from "@polkadot/util";
3
+ import { ProsopoEnvError } from "@prosopo/common";
4
+ import { ApiParams, POW_SEPARATOR, } from "@prosopo/types";
5
+ import { at } from "@prosopo/util";
6
+ import { checkPowSignature, checkPowSolution, checkRecentPowSolution, } from "./powTasksUtils.js";
7
+ export class PowCaptchaManager {
8
+ constructor(pair, db) {
9
+ this.pair = pair;
10
+ this.db = db;
11
+ this.POW_SEPARATOR = POW_SEPARATOR;
12
+ }
13
+ async getPowCaptchaChallenge(userAccount, dappAccount, origin) {
14
+ const difficulty = 4;
15
+ const timestamp = Date.now();
16
+ const challenge = `${timestamp}___${userAccount}___${dappAccount}`;
17
+ const challengeSignature = u8aToHex(this.pair.sign(stringToHex(challenge)));
18
+ const timestampSignature = u8aToHex(this.pair.sign(stringToHex(timestamp.toString())));
19
+ return {
20
+ challenge,
21
+ difficulty,
22
+ signature: challengeSignature,
23
+ timestamp,
24
+ timestampSignature,
25
+ };
26
+ }
27
+ async verifyPowCaptchaSolution(challenge, difficulty, signature, nonce, timeout, timestampSignature) {
28
+ checkRecentPowSolution(challenge, timeout);
29
+ const challengeSplit = challenge.split(this.POW_SEPARATOR);
30
+ const timestamp = parseInt(at(challengeSplit, 0));
31
+ const userAccount = at(challengeSplit, 1);
32
+ const dappAccount = at(challengeSplit, 2);
33
+ checkPowSignature(timestamp.toString(), timestampSignature, userAccount, ApiParams.timestamp);
34
+ checkPowSignature(challenge, signature, this.pair.address, ApiParams.challenge);
35
+ checkPowSolution(nonce, challenge, difficulty);
36
+ await this.db.storePowCaptchaRecord(challenge, { timestamp, userAccount, dappAccount }, false);
37
+ return true;
38
+ }
39
+ async serverVerifyPowCaptchaSolution(dappAccount, challenge, timeout) {
40
+ const challengeRecord = await this.db.getPowCaptchaRecordByChallenge(challenge);
41
+ if (!challengeRecord) {
42
+ throw new ProsopoEnvError("DATABASE.CAPTCHA_GET_FAILED", {
43
+ context: {
44
+ failedFuncName: this.serverVerifyPowCaptchaSolution.name,
45
+ challenge,
46
+ },
47
+ });
48
+ }
49
+ if (challengeRecord.checked)
50
+ return false;
51
+ const challengeDappAccount = challengeRecord.dappAccount;
52
+ if (dappAccount !== challengeDappAccount) {
53
+ throw new ProsopoEnvError("CAPTCHA.DAPP_USER_SOLUTION_NOT_FOUND", {
54
+ context: {
55
+ failedFuncName: this.serverVerifyPowCaptchaSolution.name,
56
+ dappAccount,
57
+ challengeDappAccount,
58
+ },
59
+ });
60
+ }
61
+ checkRecentPowSolution(challenge, timeout);
62
+ await this.db.updatePowCaptchaRecord(challengeRecord.challenge, true);
63
+ return true;
64
+ }
65
+ }
66
+ //# sourceMappingURL=powTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"powTasks.js","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const validateSolution: (nonce: number, challenge: string, difficulty: number) => boolean;
2
+ export declare const checkPowSolution: (nonce: number, challenge: string, difficulty: number) => void;
3
+ export declare const checkPowSignature: (challenge: string, signature: string, address: string, signatureType?: string) => void;
4
+ export declare const checkRecentPowSolution: (challenge: string, timeout: number) => void;
5
+ //# sourceMappingURL=powTasksUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"powTasksUtils.d.ts","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasksUtils.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,gBAAgB,UACrB,MAAM,aACF,MAAM,cACL,MAAM,KAChB,OAIkC,CAAC;AAEtC,eAAO,MAAM,gBAAgB,UACrB,MAAM,aACF,MAAM,cACL,MAAM,KAChB,IAaF,CAAC;AAEF,eAAO,MAAM,iBAAiB,cAClB,MAAM,aACN,MAAM,WACR,MAAM,kBACC,MAAM,KACpB,IAgBF,CAAC;AAEF,eAAO,MAAM,sBAAsB,cACvB,MAAM,WACR,MAAM,KACb,IAWF,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { sha256 } from "@noble/hashes/sha256";
2
+ import { stringToHex } from "@polkadot/util";
3
+ import { signatureVerify } from "@polkadot/util-crypto";
4
+ import { ProsopoContractError } from "@prosopo/common";
5
+ import { verifyRecency } from "@prosopo/contract";
6
+ export const validateSolution = (nonce, challenge, difficulty) => Array.from(sha256(new TextEncoder().encode(nonce + challenge)))
7
+ .map((byte) => byte.toString(16).padStart(2, "0"))
8
+ .join("")
9
+ .startsWith("0".repeat(difficulty));
10
+ export const checkPowSolution = (nonce, challenge, difficulty) => {
11
+ const solutionValid = validateSolution(nonce, challenge, difficulty);
12
+ if (!solutionValid) {
13
+ throw new ProsopoContractError("API.CAPTCHA_FAILED", {
14
+ context: {
15
+ ERROR: "Captcha solution is invalid",
16
+ failedFuncName: checkPowSolution.name,
17
+ nonce,
18
+ challenge,
19
+ difficulty,
20
+ },
21
+ });
22
+ }
23
+ };
24
+ export const checkPowSignature = (challenge, signature, address, signatureType) => {
25
+ const signatureVerification = signatureVerify(stringToHex(challenge), signature, address);
26
+ if (!signatureVerification.isValid) {
27
+ throw new ProsopoContractError("GENERAL.INVALID_SIGNATURE", {
28
+ context: {
29
+ ERROR: `Signature is invalid for this message: ${signatureType}`,
30
+ failedFuncName: checkPowSignature.name,
31
+ signature,
32
+ signatureType,
33
+ },
34
+ });
35
+ }
36
+ };
37
+ export const checkRecentPowSolution = (challenge, timeout) => {
38
+ const recent = verifyRecency(challenge, timeout);
39
+ if (!recent) {
40
+ throw new ProsopoContractError("CONTRACT.INVALID_BLOCKHASH", {
41
+ context: {
42
+ ERROR: `Block in which the Provider was selected must be within the last ${timeout / 1000} seconds`,
43
+ failedFuncName: checkRecentPowSolution.name,
44
+ challenge,
45
+ },
46
+ });
47
+ }
48
+ };
49
+ //# sourceMappingURL=powTasksUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"powTasksUtils.js","sourceRoot":"","sources":["../../../src/tasks/powCaptcha/powTasksUtils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,KAAa,EACb,SAAiB,EACjB,UAAkB,EACR,EAAE,CACZ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;KAC7D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;KACjD,IAAI,CAAC,EAAE,CAAC;KACR,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC/B,KAAa,EACb,SAAiB,EACjB,UAAkB,EACX,EAAE;IACT,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,CAAC,aAAa,EAAE;QACnB,MAAM,IAAI,oBAAoB,CAAC,oBAAoB,EAAE;YACpD,OAAO,EAAE;gBACR,KAAK,EAAE,6BAA6B;gBACpC,cAAc,EAAE,gBAAgB,CAAC,IAAI;gBACrC,KAAK;gBACL,SAAS;gBACT,UAAU;aACV;SACD,CAAC,CAAC;KACH;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAChC,SAAiB,EACjB,SAAiB,EACjB,OAAe,EACf,aAAsB,EACf,EAAE;IACT,MAAM,qBAAqB,GAAG,eAAe,CAC5C,WAAW,CAAC,SAAS,CAAC,EACtB,SAAS,EACT,OAAO,CACP,CAAC;IACF,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE;QACnC,MAAM,IAAI,oBAAoB,CAAC,2BAA2B,EAAE;YAC3D,OAAO,EAAE;gBACR,KAAK,EAAE,0CAA0C,aAAa,EAAE;gBAChE,cAAc,EAAE,iBAAiB,CAAC,IAAI;gBACtC,SAAS;gBACT,aAAa;aACb;SACD,CAAC,CAAC;KACH;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACrC,SAAiB,EACjB,OAAe,EACR,EAAE;IACT,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE;QACZ,MAAM,IAAI,oBAAoB,CAAC,4BAA4B,EAAE;YAC5D,OAAO,EAAE;gBACR,KAAK,EAAE,oEAAoE,OAAO,GAAG,IAAI,UAAU;gBACnG,cAAc,EAAE,sBAAsB,CAAC,IAAI;gBAC3C,SAAS;aACT;SACD,CAAC,CAAC;KACH;AACF,CAAC,CAAC"}