@prosopo/provider 2.1.0 → 2.1.2

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 (149) hide show
  1. package/package.json +12 -14
  2. package/vite.test.config.ts +2 -16
  3. package/.dockerignore +0 -5
  4. package/dist/api/admin.d.ts +0 -4
  5. package/dist/api/admin.d.ts.map +0 -1
  6. package/dist/api/admin.js +0 -26
  7. package/dist/api/admin.js.map +0 -1
  8. package/dist/api/authMiddleware.d.ts +0 -7
  9. package/dist/api/authMiddleware.d.ts.map +0 -1
  10. package/dist/api/authMiddleware.js +0 -50
  11. package/dist/api/authMiddleware.js.map +0 -1
  12. package/dist/api/captcha.d.ts +0 -4
  13. package/dist/api/captcha.d.ts.map +0 -1
  14. package/dist/api/captcha.js +0 -134
  15. package/dist/api/captcha.js.map +0 -1
  16. package/dist/api/errorHandler.d.ts +0 -5
  17. package/dist/api/errorHandler.d.ts.map +0 -1
  18. package/dist/api/errorHandler.js +0 -14
  19. package/dist/api/errorHandler.js.map +0 -1
  20. package/dist/api/verify.d.ts +0 -4
  21. package/dist/api/verify.d.ts.map +0 -1
  22. package/dist/api/verify.js +0 -127
  23. package/dist/api/verify.js.map +0 -1
  24. package/dist/cjs/api/admin.cjs +0 -28
  25. package/dist/cjs/api/authMiddleware.cjs +0 -50
  26. package/dist/cjs/api/captcha.cjs +0 -183
  27. package/dist/cjs/api/errorHandler.cjs +0 -14
  28. package/dist/cjs/api/verify.cjs +0 -140
  29. package/dist/cjs/index.cjs +0 -21
  30. package/dist/cjs/schedulers/captchaScheduler.cjs +0 -33
  31. package/dist/cjs/schedulers/getClientList.cjs +0 -31
  32. package/dist/cjs/tasks/client/clientTasks.cjs +0 -141
  33. package/dist/cjs/tasks/dataset/datasetTasks.cjs +0 -30
  34. package/dist/cjs/tasks/dataset/datasetTasksUtils.cjs +0 -34
  35. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasks.cjs +0 -280
  36. package/dist/cjs/tasks/imgCaptcha/imgCaptchaTasksUtils.cjs +0 -25
  37. package/dist/cjs/tasks/index.cjs +0 -4
  38. package/dist/cjs/tasks/powCaptcha/powTasks.cjs +0 -132
  39. package/dist/cjs/tasks/powCaptcha/powTasksUtils.cjs +0 -26
  40. package/dist/cjs/tasks/tasks.cjs +0 -40
  41. package/dist/cjs/util.cjs +0 -45
  42. package/dist/index.d.ts +0 -9
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/index.js +0 -9
  45. package/dist/index.js.map +0 -1
  46. package/dist/schedulers/captchaScheduler.d.ts +0 -4
  47. package/dist/schedulers/captchaScheduler.d.ts.map +0 -1
  48. package/dist/schedulers/captchaScheduler.js +0 -28
  49. package/dist/schedulers/captchaScheduler.js.map +0 -1
  50. package/dist/schedulers/getClientList.d.ts +0 -4
  51. package/dist/schedulers/getClientList.d.ts.map +0 -1
  52. package/dist/schedulers/getClientList.js +0 -28
  53. package/dist/schedulers/getClientList.js.map +0 -1
  54. package/dist/tasks/client/clientTasks.d.ts +0 -12
  55. package/dist/tasks/client/clientTasks.d.ts.map +0 -1
  56. package/dist/tasks/client/clientTasks.js +0 -80
  57. package/dist/tasks/client/clientTasks.js.map +0 -1
  58. package/dist/tasks/dataset/datasetTasks.d.ts +0 -13
  59. package/dist/tasks/dataset/datasetTasks.d.ts.map +0 -1
  60. package/dist/tasks/dataset/datasetTasks.js +0 -19
  61. package/dist/tasks/dataset/datasetTasks.js.map +0 -1
  62. package/dist/tasks/dataset/datasetTasksUtils.d.ts +0 -3
  63. package/dist/tasks/dataset/datasetTasksUtils.d.ts.map +0 -1
  64. package/dist/tasks/dataset/datasetTasksUtils.js +0 -34
  65. package/dist/tasks/dataset/datasetTasksUtils.js.map +0 -1
  66. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts +0 -28
  67. package/dist/tasks/imgCaptcha/imgCaptchaTasks.d.ts.map +0 -1
  68. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js +0 -208
  69. package/dist/tasks/imgCaptcha/imgCaptchaTasks.js.map +0 -1
  70. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts +0 -7
  71. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.d.ts.map +0 -1
  72. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js +0 -18
  73. package/dist/tasks/imgCaptcha/imgCaptchaTasksUtils.js.map +0 -1
  74. package/dist/tasks/index.d.ts +0 -2
  75. package/dist/tasks/index.d.ts.map +0 -1
  76. package/dist/tasks/index.js +0 -2
  77. package/dist/tasks/index.js.map +0 -1
  78. package/dist/tasks/powCaptcha/powTasks.d.ts +0 -13
  79. package/dist/tasks/powCaptcha/powTasks.d.ts.map +0 -1
  80. package/dist/tasks/powCaptcha/powTasks.js +0 -83
  81. package/dist/tasks/powCaptcha/powTasks.js.map +0 -1
  82. package/dist/tasks/powCaptcha/powTasksUtils.d.ts +0 -3
  83. package/dist/tasks/powCaptcha/powTasksUtils.d.ts.map +0 -1
  84. package/dist/tasks/powCaptcha/powTasksUtils.js +0 -22
  85. package/dist/tasks/powCaptcha/powTasksUtils.js.map +0 -1
  86. package/dist/tasks/tasks.d.ts +0 -22
  87. package/dist/tasks/tasks.d.ts.map +0 -1
  88. package/dist/tasks/tasks.js +0 -24
  89. package/dist/tasks/tasks.js.map +0 -1
  90. package/dist/tests/index.d.ts +0 -2
  91. package/dist/tests/index.d.ts.map +0 -1
  92. package/dist/tests/index.js +0 -2
  93. package/dist/tests/index.js.map +0 -1
  94. package/dist/tests/integration/imgCaptcha.integration.test.d.ts +0 -2
  95. package/dist/tests/integration/imgCaptcha.integration.test.d.ts.map +0 -1
  96. package/dist/tests/integration/imgCaptcha.integration.test.js +0 -115
  97. package/dist/tests/integration/imgCaptcha.integration.test.js.map +0 -1
  98. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts +0 -32
  99. package/dist/tests/integration/mocks/solvedTestCaptchas.d.ts.map +0 -1
  100. package/dist/tests/integration/mocks/solvedTestCaptchas.js +0 -1046
  101. package/dist/tests/integration/mocks/solvedTestCaptchas.js.map +0 -1
  102. package/dist/tests/integration/powCaptcha.integration.test.d.ts +0 -2
  103. package/dist/tests/integration/powCaptcha.integration.test.d.ts.map +0 -1
  104. package/dist/tests/integration/powCaptcha.integration.test.js +0 -173
  105. package/dist/tests/integration/powCaptcha.integration.test.js.map +0 -1
  106. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts +0 -2
  107. package/dist/tests/unit/api/authMiddleware.unit.test.d.ts.map +0 -1
  108. package/dist/tests/unit/api/authMiddleware.unit.test.js +0 -87
  109. package/dist/tests/unit/api/authMiddleware.unit.test.js.map +0 -1
  110. package/dist/tests/unit/api/errorHandler.unit.test.d.ts +0 -2
  111. package/dist/tests/unit/api/errorHandler.unit.test.d.ts.map +0 -1
  112. package/dist/tests/unit/api/errorHandler.unit.test.js +0 -65
  113. package/dist/tests/unit/api/errorHandler.unit.test.js.map +0 -1
  114. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts +0 -2
  115. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.d.ts.map +0 -1
  116. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js +0 -63
  117. package/dist/tests/unit/schedulers/captchaScheduler.unit.test.js.map +0 -1
  118. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts +0 -2
  119. package/dist/tests/unit/tasks/client/clientTasks.unit.test.d.ts.map +0 -1
  120. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js +0 -172
  121. package/dist/tests/unit/tasks/client/clientTasks.unit.test.js.map +0 -1
  122. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts +0 -2
  123. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.d.ts.map +0 -1
  124. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js +0 -86
  125. package/dist/tests/unit/tasks/dataset/datasetTasks.unit.test.js.map +0 -1
  126. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts +0 -2
  127. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.d.ts.map +0 -1
  128. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js +0 -75
  129. package/dist/tests/unit/tasks/dataset/datasetTasksUtils.unit.test.js.map +0 -1
  130. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts +0 -2
  131. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.d.ts.map +0 -1
  132. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js +0 -266
  133. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasks.unit.test.js.map +0 -1
  134. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts +0 -2
  135. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.d.ts.map +0 -1
  136. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js +0 -46
  137. package/dist/tests/unit/tasks/imgCaptcha/imgCaptchaTasksUtils.unit.test.js.map +0 -1
  138. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts +0 -2
  139. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.d.ts.map +0 -1
  140. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js +0 -209
  141. package/dist/tests/unit/tasks/powCaptcha/powTasks.unit.test.js.map +0 -1
  142. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts +0 -2
  143. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.d.ts.map +0 -1
  144. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js +0 -65
  145. package/dist/tests/unit/tasks/powCaptcha/powTasksUtils.unit.test.js.map +0 -1
  146. package/dist/util.d.ts +0 -6
  147. package/dist/util.d.ts.map +0 -1
  148. package/dist/util.js +0 -34
  149. package/dist/util.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/provider",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "author": "PROSOPO LIMITED <info@prosopo.io>",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./dist/index.js",
@@ -20,24 +20,23 @@
20
20
  "build": "tsc --build --verbose",
21
21
  "build:cjs": "npx vite --config vite.cjs.config.ts build",
22
22
  "test": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --config ./vite.test.config.ts",
23
- "mnemonic": "tsx ./scripts/generateMnemonic.ts",
24
- "coverage": "npx c8 npm run test"
23
+ "mnemonic": "tsx ./scripts/generateMnemonic.ts"
25
24
  },
26
25
  "dependencies": {
27
26
  "@noble/hashes": "1.5.0",
28
27
  "@polkadot/keyring": "12.6.2",
29
28
  "@polkadot/util": "12.6.2",
30
29
  "@polkadot/util-crypto": "12.6.2",
31
- "@prosopo/common": "2.1.0",
32
- "@prosopo/config": "2.1.0",
33
- "@prosopo/contract": "2.1.0",
34
- "@prosopo/database": "2.1.0",
35
- "@prosopo/datasets": "2.1.0",
36
- "@prosopo/env": "2.1.0",
37
- "@prosopo/types": "2.1.0",
38
- "@prosopo/types-database": "2.1.0",
39
- "@prosopo/types-env": "2.1.0",
40
- "@prosopo/util": "2.1.0",
30
+ "@prosopo/common": "2.1.2",
31
+ "@prosopo/config": "2.1.2",
32
+ "@prosopo/contract": "2.1.2",
33
+ "@prosopo/database": "2.1.2",
34
+ "@prosopo/datasets": "2.1.2",
35
+ "@prosopo/env": "2.1.2",
36
+ "@prosopo/types": "2.1.2",
37
+ "@prosopo/types-database": "2.1.2",
38
+ "@prosopo/types-env": "2.1.2",
39
+ "@prosopo/util": "2.1.2",
41
40
  "cron": "3.1.7",
42
41
  "express": "4.21.0",
43
42
  "node-fetch": "3.3.2",
@@ -46,7 +45,6 @@
46
45
  "devDependencies": {
47
46
  "@types/node": "22.5.5",
48
47
  "@vitest/coverage-v8": "2.1.1",
49
- "c8": "10.1.2",
50
48
  "concurrently": "9.0.1",
51
49
  "dotenv": "16.4.5",
52
50
  "npm-run-all": "4.1.5",
@@ -12,23 +12,9 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- import fs from "node:fs";
16
- import path from "node:path";
17
15
  import { ViteTestConfig } from "@prosopo/config";
18
- import dotenv from "dotenv";
16
+ import { loadEnv } from "@prosopo/dotenv";
19
17
 
20
- process.env.NODE_ENV = "test";
21
- // if .env.test exists at this level, use it, otherwise use the one at the root
22
- const envFile = `.env.${process.env.NODE_ENV || "development"}`;
23
- let envPath = envFile;
24
- if (fs.existsSync(envFile)) {
25
- envPath = path.resolve(envFile);
26
- } else if (fs.existsSync(`../../${envFile}`)) {
27
- envPath = path.resolve(`../../${envFile}`);
28
- } else {
29
- throw new Error(`No ${envFile} file found`);
30
- }
31
-
32
- dotenv.config({ path: envPath });
18
+ loadEnv();
33
19
 
34
20
  export default ViteTestConfig;
package/.dockerignore DELETED
@@ -1,5 +0,0 @@
1
- node_modules/
2
- dist/
3
- .env*
4
- .git/
5
- .cache/
@@ -1,4 +0,0 @@
1
- import type { ProviderEnvironment } from "@prosopo/types-env";
2
- import { Router } from "express";
3
- export declare function prosopoAdminRouter(env: ProviderEnvironment): Router;
4
- //# sourceMappingURL=admin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/api/admin.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAUjC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAoBnE"}
package/dist/api/admin.js DELETED
@@ -1,26 +0,0 @@
1
- import { AdminApiPaths } from "@prosopo/types";
2
- import { Router } from "express";
3
- import { Tasks } from "../index.js";
4
- import { authMiddleware } from "./authMiddleware.js";
5
- const apiBatchCommitConfig = {
6
- interval: 0,
7
- maxBatchExtrinsicPercentage: 59,
8
- };
9
- export function prosopoAdminRouter(env) {
10
- const router = Router();
11
- const tasks = new Tasks(env);
12
- router.use(authMiddleware(tasks, env));
13
- router.post(AdminApiPaths.UpdateDataset, async (req, res, next) => {
14
- try {
15
- const result = await tasks.datasetManager.providerSetDataset(req.body);
16
- console.info(`Dataset update complete: ${result}`);
17
- res.status(200).send(result);
18
- }
19
- catch (err) {
20
- console.error(err);
21
- res.status(500).send(err);
22
- }
23
- });
24
- return router;
25
- }
26
- //# sourceMappingURL=admin.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/api/admin.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,MAAM,oBAAoB,GAAG;IAC5B,QAAQ,EAAE,CAAC;IACX,2BAA2B,EAAE,EAAE;CAC/B,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,GAAwB;IAC1D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IAG7B,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAEvC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACjE,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEvE,OAAO,CAAC,IAAI,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;YACnD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -1,7 +0,0 @@
1
- import type { KeyringPair } from "@polkadot/keyring/types";
2
- import type { ProviderEnvironment } from "@prosopo/types-env";
3
- import type { NextFunction, Request, Response } from "express";
4
- import type { Tasks } from "../index.js";
5
- export declare const authMiddleware: (tasks: Tasks, env: ProviderEnvironment) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
6
- export declare const verifySignature: (signature: string, blockNumber: string, pair: KeyringPair) => void;
7
- //# sourceMappingURL=authMiddleware.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authMiddleware.d.ts","sourceRoot":"","sources":["../../src/api/authMiddleware.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,eAAO,MAAM,cAAc,UAAW,KAAK,OAAO,mBAAmB,WACjD,OAAO,OAAO,QAAQ,QAAQ,YAAY,kBAiB7D,CAAC;AA+BF,eAAO,MAAM,eAAe,cAChB,MAAM,eACJ,MAAM,QACb,WAAW,SASjB,CAAC"}
@@ -1,50 +0,0 @@
1
- import { hexToU8a, isHex } from "@polkadot/util";
2
- import { ProsopoApiError, ProsopoEnvError } from "@prosopo/common";
3
- export const authMiddleware = (tasks, env) => {
4
- return async (req, res, next) => {
5
- try {
6
- const { signature, blocknumber } = extractHeaders(req);
7
- if (!env.pair) {
8
- throw new ProsopoEnvError("CONTRACT.CANNOT_FIND_KEYPAIR");
9
- }
10
- verifyEnvironmentKeyPair(env);
11
- verifySignature(signature, blocknumber, env.pair);
12
- next();
13
- }
14
- catch (err) {
15
- console.error("Auth Middleware Error:", err);
16
- res.status(401).json({ error: "Unauthorized", message: err });
17
- }
18
- };
19
- };
20
- const extractHeaders = (req) => {
21
- const signature = req.headers.signature;
22
- const blocknumber = req.headers.blocknumber;
23
- if (!signature || !blocknumber) {
24
- throw new ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
25
- context: { error: "Missing signature or block number", code: 400 },
26
- });
27
- }
28
- if (Array.isArray(signature) ||
29
- Array.isArray(blocknumber) ||
30
- !isHex(signature)) {
31
- throw new ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
32
- context: { error: "Invalid header format", code: 400 },
33
- });
34
- }
35
- return { signature, blocknumber };
36
- };
37
- const verifyEnvironmentKeyPair = (env) => {
38
- if (!env.pair) {
39
- throw new ProsopoEnvError("CONTRACT.CANNOT_FIND_KEYPAIR");
40
- }
41
- };
42
- export const verifySignature = (signature, blockNumber, pair) => {
43
- const u8Sig = hexToU8a(signature);
44
- if (!pair.verify(blockNumber, u8Sig, pair.publicKey)) {
45
- throw new ProsopoApiError("GENERAL.INVALID_SIGNATURE", {
46
- context: { error: "Signature verification failed", code: 401 },
47
- });
48
- }
49
- };
50
- //# sourceMappingURL=authMiddleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authMiddleware.js","sourceRoot":"","sources":["../../src/api/authMiddleware.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKnE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAY,EAAE,GAAwB,EAAE,EAAE;IACxE,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAChE,IAAI,CAAC;YACJ,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAEvD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACf,MAAM,IAAI,eAAe,CAAC,8BAA8B,CAAC,CAAC;YAC3D,CAAC;YAED,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC9B,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YAElD,IAAI,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/D,CAAC;IACF,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,GAAY,EAAE,EAAE;IACvC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,SAAmB,CAAC;IAClD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,WAAqB,CAAC;IAEtD,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE;YACzD,OAAO,EAAE,EAAE,KAAK,EAAE,mCAAmC,EAAE,IAAI,EAAE,GAAG,EAAE;SAClE,CAAC,CAAC;IACJ,CAAC;IAED,IACC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACxB,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1B,CAAC,KAAK,CAAC,SAAS,CAAC,EAChB,CAAC;QACF,MAAM,IAAI,eAAe,CAAC,8BAA8B,EAAE;YACzD,OAAO,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,GAAG,EAAE;SACtD,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,GAAwB,EAAE,EAAE;IAC7D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,8BAA8B,CAAC,CAAC;IAC3D,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,SAAiB,EACjB,WAAmB,EACnB,IAAiB,EAChB,EAAE;IACH,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAElC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;YACtD,OAAO,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,GAAG,EAAE;SAC9D,CAAC,CAAC;IACJ,CAAC;AACF,CAAC,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { ProviderEnvironment } from "@prosopo/types-env";
2
- import { type Router } from "express";
3
- export declare function prosopoRouter(env: ProviderEnvironment): Router;
4
- //# sourceMappingURL=captcha.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"captcha.d.ts","sourceRoot":"","sources":["../../src/api/captcha.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAgB,EAAE,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAwB/C,wBAAgB,aAAa,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAyN9D"}
@@ -1,134 +0,0 @@
1
- import { validateAddress } from "@polkadot/util-crypto/address";
2
- import { ProsopoApiError } from "@prosopo/common";
3
- import { parseCaptchaAssets } from "@prosopo/datasets";
4
- import { ApiParams, ApiPaths, CaptchaRequestBody, CaptchaSolutionBody, GetPowCaptchaChallengeRequestBody, SubmitPowCaptchaSolutionBody, } from "@prosopo/types";
5
- import { version } from "@prosopo/util";
6
- import express from "express";
7
- import { Tasks } from "../tasks/tasks.js";
8
- import { handleErrors } from "./errorHandler.js";
9
- const NO_IP_ADDRESS = "NO_IP_ADDRESS";
10
- const flattenHeaders = (headers) => {
11
- return Object.fromEntries(Object.entries(headers).map(([key, value]) => [
12
- key,
13
- Array.isArray(value) ? value.join(",") : value || "",
14
- ]));
15
- };
16
- export function prosopoRouter(env) {
17
- const router = express.Router();
18
- const tasks = new Tasks(env);
19
- const GetImageCaptchaChallengePath = `${ApiPaths.GetImageCaptchaChallenge}/:${ApiParams.datasetId}/:${ApiParams.user}/:${ApiParams.dapp}`;
20
- router.get(GetImageCaptchaChallengePath, async (req, res, next) => {
21
- try {
22
- const { datasetId, user } = CaptchaRequestBody.parse(req.params);
23
- validateAddress(user, false, 42);
24
- const taskData = await tasks.imgCaptchaManager.getRandomCaptchasAndRequestHash(datasetId, user, req.ip || NO_IP_ADDRESS, flattenHeaders(req.headers));
25
- const captchaResponse = {
26
- [ApiParams.captchas]: taskData.captchas.map((captcha) => ({
27
- ...captcha,
28
- items: captcha.items.map((item) => parseCaptchaAssets(item, env.assetsResolver)),
29
- })),
30
- [ApiParams.requestHash]: taskData.requestHash,
31
- [ApiParams.timestamp]: taskData.timestamp.toString(),
32
- [ApiParams.signature]: {
33
- [ApiParams.provider]: {
34
- [ApiParams.requestHash]: taskData.signedRequestHash,
35
- },
36
- },
37
- };
38
- return res.json(captchaResponse);
39
- }
40
- catch (err) {
41
- tasks.logger.error(err);
42
- return next(new ProsopoApiError("API.BAD_REQUEST", {
43
- context: { error: err, code: 400 },
44
- }));
45
- }
46
- });
47
- router.post(ApiPaths.SubmitImageCaptchaSolution, async (req, res, next) => {
48
- let parsed;
49
- try {
50
- parsed = CaptchaSolutionBody.parse(req.body);
51
- }
52
- catch (err) {
53
- return next(new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
54
- context: { code: 400, error: err },
55
- }));
56
- }
57
- try {
58
- const result = await tasks.imgCaptchaManager.dappUserSolution(parsed[ApiParams.user], parsed[ApiParams.dapp], parsed[ApiParams.requestHash], parsed[ApiParams.captchas], parsed[ApiParams.signature].user.requestHash, Number.parseInt(parsed[ApiParams.timestamp]), parsed[ApiParams.signature].provider.requestHash, req.ip || NO_IP_ADDRESS, flattenHeaders(req.headers));
59
- const returnValue = {
60
- status: req.i18n.t(result.verified ? "API.CAPTCHA_PASSED" : "API.CAPTCHA_FAILED"),
61
- ...result,
62
- };
63
- return res.json(returnValue);
64
- }
65
- catch (err) {
66
- tasks.logger.error(err);
67
- return next(new ProsopoApiError("API.UNKNOWN", {
68
- context: { code: 400, error: err },
69
- }));
70
- }
71
- });
72
- router.post(ApiPaths.GetPowCaptchaChallenge, async (req, res, next) => {
73
- try {
74
- const { user, dapp } = GetPowCaptchaChallengeRequestBody.parse(req.body);
75
- const origin = req.headers.origin;
76
- if (!origin) {
77
- throw new ProsopoApiError("API.BAD_REQUEST", {
78
- context: { code: 400, error: "origin header not found" },
79
- });
80
- }
81
- const challenge = await tasks.powCaptchaManager.getPowCaptchaChallenge(user, dapp, origin);
82
- await tasks.db.storePowCaptchaRecord(challenge.challenge, {
83
- requestedAtTimestamp: challenge.requestedAtTimestamp,
84
- userAccount: user,
85
- dappAccount: dapp,
86
- }, challenge.difficulty, challenge.providerSignature, req.ip || NO_IP_ADDRESS, flattenHeaders(req.headers));
87
- const getPowCaptchaResponse = {
88
- challenge: challenge.challenge,
89
- difficulty: challenge.difficulty,
90
- timestamp: challenge.requestedAtTimestamp.toString(),
91
- signature: {
92
- provider: {
93
- challenge: challenge.providerSignature,
94
- },
95
- },
96
- };
97
- return res.json(getPowCaptchaResponse);
98
- }
99
- catch (err) {
100
- tasks.logger.error(err);
101
- return next(new ProsopoApiError("API.BAD_REQUEST", {
102
- context: { code: 400, error: err },
103
- }));
104
- }
105
- });
106
- router.post(ApiPaths.SubmitPowCaptchaSolution, async (req, res, next) => {
107
- try {
108
- const { challenge, difficulty, signature, nonce, verifiedTimeout } = SubmitPowCaptchaSolutionBody.parse(req.body);
109
- const verified = await tasks.powCaptchaManager.verifyPowCaptchaSolution(challenge, difficulty, signature.provider.challenge, nonce, verifiedTimeout, signature.user.timestamp, req.ip || NO_IP_ADDRESS, flattenHeaders(req.headers));
110
- const response = { verified };
111
- return res.json(response);
112
- }
113
- catch (err) {
114
- tasks.logger.error(err);
115
- return next(new ProsopoApiError("API.BAD_REQUEST", {
116
- context: { code: 400, error: err },
117
- }));
118
- }
119
- });
120
- router.get(ApiPaths.GetProviderDetails, async (req, res, next) => {
121
- try {
122
- return res.json({ version, ...{ message: "Provider online" } });
123
- }
124
- catch (err) {
125
- tasks.logger.error(err);
126
- return next(new ProsopoApiError("API.BAD_REQUEST", {
127
- context: { code: 400, error: err },
128
- }));
129
- }
130
- });
131
- router.use(handleErrors);
132
- return router;
133
- }
134
- //# sourceMappingURL=captcha.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/api/captcha.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import { type ProsopoApiError } from "@prosopo/common";
2
- import type { NextFunction, Request, Response } from "express";
3
- import type { ZodError } from "zod";
4
- export declare const handleErrors: (err: ProsopoApiError | SyntaxError | ZodError, request: Request, response: Response, next: NextFunction) => void;
5
- //# sourceMappingURL=errorHandler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/api/errorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAoB,MAAM,iBAAiB,CAAC;AAezE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAEpC,eAAO,MAAM,YAAY,QACnB,eAAe,GAAG,WAAW,GAAG,QAAQ,WACpC,OAAO,YACN,QAAQ,QACZ,YAAY,SAclB,CAAC"}
@@ -1,14 +0,0 @@
1
- import { ProsopoBaseError } from "@prosopo/common";
2
- export const handleErrors = (err, request, response, next) => {
3
- const code = "code" in err ? err.code : 400;
4
- while (err instanceof ProsopoBaseError && err.context && err.context.error) {
5
- err = err.context.error;
6
- }
7
- const message = err.message;
8
- response
9
- .writeHead(code, JSON.stringify(message), {
10
- "content-type": "application/json",
11
- })
12
- .end();
13
- };
14
- //# sourceMappingURL=errorHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/api/errorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAkBzE,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,GAA6C,EAC7C,OAAgB,EAChB,QAAkB,EAClB,IAAkB,EACjB,EAAE;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAE5C,OAAO,GAAG,YAAY,gBAAgB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5E,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;IACzB,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAE5B,QAAQ;SACN,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;QACzC,cAAc,EAAE,kBAAkB;KAClC,CAAC;SACD,GAAG,EAAE,CAAC;AACT,CAAC,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { ProviderEnvironment } from "@prosopo/types-env";
2
- import { type Router } from "express";
3
- export declare function prosopoVerifyRouter(env: ProviderEnvironment): Router;
4
- //# sourceMappingURL=verify.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/api/verify.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAgB,EAIf,KAAK,MAAM,EACX,MAAM,SAAS,CAAC;AAWjB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAiNpE"}
@@ -1,127 +0,0 @@
1
- import { ProsopoApiError } from "@prosopo/common";
2
- import { ApiParams, ApiPaths, CaptchaStatus, ServerPowCaptchaVerifyRequestBody, VerifySolutionBody, } from "@prosopo/types";
3
- import { decodeProcaptchaOutput } from "@prosopo/types";
4
- import express from "express";
5
- import { Tasks } from "../tasks/tasks.js";
6
- import { verifySignature } from "./authMiddleware.js";
7
- import { handleErrors } from "./errorHandler.js";
8
- export function prosopoVerifyRouter(env) {
9
- const router = express.Router();
10
- const tasks = new Tasks(env);
11
- async function verifyImageSolution(res, req, next, isDapp) {
12
- const parsed = VerifySolutionBody.parse(req.body);
13
- try {
14
- const { dappSignature, token } = parsed;
15
- const { user, dapp, timestamp, commitmentId } = decodeProcaptchaOutput(token);
16
- const keyPair = isDapp
17
- ? env.keyring.addFromAddress(dapp)
18
- : env.keyring.addFromAddress(user);
19
- verifySignature(dappSignature, timestamp.toString(), keyPair);
20
- const solution = await (commitmentId
21
- ? tasks.imgCaptchaManager.getDappUserCommitmentById(commitmentId)
22
- : tasks.imgCaptchaManager.getDappUserCommitmentByAccount(user, dapp));
23
- if (!solution) {
24
- tasks.logger.debug("Not verified - no solution found");
25
- const noSolutionResponse = {
26
- [ApiParams.status]: req.t("API.USER_NOT_VERIFIED_NO_SOLUTION"),
27
- [ApiParams.verified]: false,
28
- };
29
- return res.json(noSolutionResponse);
30
- }
31
- if (isDapp) {
32
- if (solution.serverChecked) {
33
- const alreadyCheckedResponse = {
34
- [ApiParams.status]: req.t("API.USER_ALREADY_VERIFIED"),
35
- [ApiParams.verified]: false,
36
- };
37
- return res.json(alreadyCheckedResponse);
38
- }
39
- await tasks.imgCaptchaManager.db.markDappUserCommitmentsChecked([
40
- solution.id,
41
- ]);
42
- }
43
- if (solution.result.status === CaptchaStatus.disapproved) {
44
- const disapprovedResponse = {
45
- [ApiParams.status]: req.t("API.USER_NOT_VERIFIED"),
46
- [ApiParams.verified]: false,
47
- };
48
- return res.json(disapprovedResponse);
49
- }
50
- const maxVerifiedTime = parsed.maxVerifiedTime || 60 * 1000;
51
- if (maxVerifiedTime) {
52
- const currentTime = Date.now();
53
- const timeSinceCompletion = currentTime - solution.requestedAtTimestamp;
54
- if (timeSinceCompletion > parsed.maxVerifiedTime) {
55
- const expiredResponse = {
56
- [ApiParams.status]: req.t("API.USER_NOT_VERIFIED_TIME_EXPIRED"),
57
- [ApiParams.verified]: false,
58
- };
59
- tasks.logger.debug("Not verified - time run out");
60
- return res.json(expiredResponse);
61
- }
62
- }
63
- const isApproved = solution.result.status === CaptchaStatus.approved;
64
- const response = {
65
- [ApiParams.status]: req.t(isApproved ? "API.USER_VERIFIED" : "API.USER_NOT_VERIFIED"),
66
- [ApiParams.verified]: isApproved,
67
- [ApiParams.commitmentId]: solution.id.toString(),
68
- };
69
- return res.json(response);
70
- }
71
- catch (err) {
72
- return next(new ProsopoApiError("API.BAD_REQUEST", {
73
- context: { code: 400, error: err },
74
- }));
75
- }
76
- }
77
- router.post(ApiPaths.VerifyImageCaptchaSolutionDapp, async (req, res, next) => {
78
- try {
79
- await verifyImageSolution(res, req, next, true);
80
- }
81
- catch (err) {
82
- return next(new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
83
- context: { code: 400, error: err },
84
- }));
85
- }
86
- });
87
- router.post(ApiPaths.VerifyImageCaptchaSolutionUser, async (req, res, next) => {
88
- try {
89
- await verifyImageSolution(res, req, next, false);
90
- }
91
- catch (err) {
92
- return next(new ProsopoApiError("CAPTCHA.PARSE_ERROR", {
93
- context: { code: 400, error: err },
94
- }));
95
- }
96
- });
97
- router.post(ApiPaths.VerifyPowCaptchaSolution, async (req, res, next) => {
98
- try {
99
- const { token, dappSignature, verifiedTimeout } = ServerPowCaptchaVerifyRequestBody.parse(req.body);
100
- const { dapp, timestamp, challenge } = decodeProcaptchaOutput(token);
101
- if (!challenge) {
102
- const unverifiedResponse = {
103
- status: req.t("API.USER_NOT_VERIFIED"),
104
- [ApiParams.verified]: false,
105
- };
106
- return res.json(unverifiedResponse);
107
- }
108
- const dappPair = env.keyring.addFromAddress(dapp);
109
- verifySignature(dappSignature, timestamp.toString(), dappPair);
110
- const approved = await tasks.powCaptchaManager.serverVerifyPowCaptchaSolution(dapp, challenge, verifiedTimeout);
111
- const verificationResponse = {
112
- status: req.t(approved ? "API.USER_VERIFIED" : "API.USER_NOT_VERIFIED"),
113
- [ApiParams.verified]: approved,
114
- };
115
- return res.json(verificationResponse);
116
- }
117
- catch (err) {
118
- tasks.logger.error(err);
119
- return next(new ProsopoApiError("API.BAD_REQUEST", {
120
- context: { code: 400, error: err },
121
- }));
122
- }
123
- });
124
- router.use(handleErrors);
125
- return router;
126
- }
127
- //# sourceMappingURL=verify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/api/verify.ts"],"names":[],"mappings":"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"}
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const types = require("@prosopo/types");
4
- const express = require("express");
5
- require("../index.cjs");
6
- const authMiddleware = require("./authMiddleware.cjs");
7
- const tasks = require("../tasks/tasks.cjs");
8
- const apiBatchCommitConfig = {
9
- interval: 0,
10
- maxBatchExtrinsicPercentage: 59
11
- };
12
- function prosopoAdminRouter(env) {
13
- const router = express.Router();
14
- const tasks$1 = new tasks.Tasks(env);
15
- router.use(authMiddleware.authMiddleware(tasks$1, env));
16
- router.post(types.AdminApiPaths.UpdateDataset, async (req, res, next) => {
17
- try {
18
- const result = await tasks$1.datasetManager.providerSetDataset(req.body);
19
- console.info(`Dataset update complete: ${result}`);
20
- res.status(200).send(result);
21
- } catch (err) {
22
- console.error(err);
23
- res.status(500).send(err);
24
- }
25
- });
26
- return router;
27
- }
28
- exports.prosopoAdminRouter = prosopoAdminRouter;
@@ -1,50 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const util = require("@polkadot/util");
4
- const common = require("@prosopo/common");
5
- const authMiddleware = (tasks, env) => {
6
- return async (req, res, next) => {
7
- try {
8
- const { signature, blocknumber } = extractHeaders(req);
9
- if (!env.pair) {
10
- throw new common.ProsopoEnvError("CONTRACT.CANNOT_FIND_KEYPAIR");
11
- }
12
- verifyEnvironmentKeyPair(env);
13
- verifySignature(signature, blocknumber, env.pair);
14
- next();
15
- } catch (err) {
16
- console.error("Auth Middleware Error:", err);
17
- res.status(401).json({ error: "Unauthorized", message: err });
18
- }
19
- };
20
- };
21
- const extractHeaders = (req) => {
22
- const signature = req.headers.signature;
23
- const blocknumber = req.headers.blocknumber;
24
- if (!signature || !blocknumber) {
25
- throw new common.ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
26
- context: { error: "Missing signature or block number", code: 400 }
27
- });
28
- }
29
- if (Array.isArray(signature) || Array.isArray(blocknumber) || !util.isHex(signature)) {
30
- throw new common.ProsopoApiError("CONTRACT.INVALID_DATA_FORMAT", {
31
- context: { error: "Invalid header format", code: 400 }
32
- });
33
- }
34
- return { signature, blocknumber };
35
- };
36
- const verifyEnvironmentKeyPair = (env) => {
37
- if (!env.pair) {
38
- throw new common.ProsopoEnvError("CONTRACT.CANNOT_FIND_KEYPAIR");
39
- }
40
- };
41
- const verifySignature = (signature, blockNumber, pair) => {
42
- const u8Sig = util.hexToU8a(signature);
43
- if (!pair.verify(blockNumber, u8Sig, pair.publicKey)) {
44
- throw new common.ProsopoApiError("GENERAL.INVALID_SIGNATURE", {
45
- context: { error: "Signature verification failed", code: 401 }
46
- });
47
- }
48
- };
49
- exports.authMiddleware = authMiddleware;
50
- exports.verifySignature = verifySignature;