@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
@@ -1,635 +0,0 @@
1
- import { AccountKey } from '../dataUtils/DatabaseAccounts.js';
2
- import { BN, BN_THOUSAND, BN_TWO, bnMin } from '@polkadot/util/bn';
3
- import { BatchCommitmentsTask } from '../../batch/commitments.js';
4
- import { CaptchaMerkleTree, computeCaptchaSolutionHash, computePendingRequestHash, datasetWithSolutionHashes, } from '@prosopo/datasets';
5
- import { CaptchaStatus, DappPayee, Payee } from '@prosopo/captcha-contract/types-returns';
6
- import { ContractDeployer, getCurrentBlockNumber, getPairAsync, wrapQuery } from '@prosopo/contract';
7
- import { DappAbiJSON, DappWasm } from '../dataUtils/dapp-example-contract/loadFiles.js';
8
- import { MockEnvironment } from '@prosopo/env';
9
- import { PROVIDER, accountAddress, accountContract, accountMnemonic, getSignedTasks } from '../accounts.js';
10
- import { ProsopoContractError, ProsopoEnvError, hexHash, i18n } from '@prosopo/common';
11
- import { ScheduledTaskNames } from '@prosopo/types';
12
- import { assert, beforeEach, describe, expect, test } from 'vitest';
13
- import { at, get } from '@prosopo/util';
14
- import { datasetWithIndexSolutions } from '@prosopo/datasets';
15
- import { getDispatchError } from '@prosopo/tx';
16
- import { getSendAmount, getStakeAmount, sendFunds } from '../dataUtils/funds.js';
17
- import { getTestConfig } from '@prosopo/config';
18
- import { getUser } from '../getUser.js';
19
- import { parseBlockNumber } from '../../index.js';
20
- import { randomAsHex } from '@polkadot/util-crypto/random';
21
- import { signatureVerify } from '@polkadot/util-crypto/signature';
22
- import { sleep } from '@prosopo/util';
23
- import { stringToHex, stringToU8a } from '@polkadot/util/string';
24
- import { u8aToHex } from '@polkadot/util/u8a';
25
- const THRESHOLD = BN_THOUSAND.div(BN_TWO);
26
- const DEFAULT_TIME = new BN(6000);
27
- const A_DAY = new BN(24 * 60 * 60 * 1000);
28
- function calcInterval(api) {
29
- return bnMin(A_DAY, api.consts.babe?.expectedBlockTime ||
30
- api.consts.difficulty?.targetBlockTime ||
31
- api.consts.subspace?.expectedBlockTime ||
32
- (api.consts.timestamp?.minimumPeriod.gte(THRESHOLD)
33
- ?
34
- api.consts.timestamp.minimumPeriod.mul(BN_TWO)
35
- : api.query.parachainSystem
36
- ?
37
- DEFAULT_TIME.mul(BN_TWO)
38
- :
39
- DEFAULT_TIME));
40
- }
41
- const PROVIDER_PAYEE = Payee.dapp;
42
- describe.sequential('CONTRACT TASKS', async function () {
43
- beforeEach(async function (context) {
44
- const config = getTestConfig();
45
- const network = config.networks[config.defaultNetwork];
46
- const alicePair = await getPairAsync(network, '//Alice');
47
- const env = new MockEnvironment(getTestConfig(), alicePair);
48
- try {
49
- await env.isReady();
50
- }
51
- catch (e) {
52
- throw new ProsopoEnvError(e);
53
- }
54
- context.env = env;
55
- const promiseStakeDefault = wrapQuery(context.env.getContractInterface().query.getProviderStakeThreshold, context.env.getContractInterface().query)();
56
- const dappStakeDefault = wrapQuery(context.env.getContractInterface().query.getDappStakeThreshold, context.env.getContractInterface().query)();
57
- context.providerStakeThreshold = (await promiseStakeDefault).rawNumber;
58
- context.dappStakeThreshold = (await promiseStakeDefault).rawNumber;
59
- return () => {
60
- env.db?.close();
61
- };
62
- });
63
- const commitmentCount = 50;
64
- test(`Batches ~${commitmentCount} commitments on-chain`, async ({ env }) => {
65
- const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
66
- await env.changeSigner(await getPairAsync(env.config.networks[env.config.defaultNetwork], accountMnemonic(providerAccount), ''));
67
- const contractApi = await env.getContractApi();
68
- await env.getDb().getTables().commitment.deleteMany({});
69
- await env.getDb().getTables().usersolution.deleteMany({});
70
- const startNonce = await contractApi.api.call.accountNonceApi.accountNonce(accountAddress(providerAccount));
71
- const batcher = new BatchCommitmentsTask(env.config.batchCommit, await env.getContractApi(), env.getDb(), BigInt(startNonce.toNumber()), env.logger);
72
- const providerTasks = await getSignedTasks(env, providerAccount);
73
- const providerDetails = (await providerTasks.contract.query.getProvider(accountAddress(providerAccount))).value
74
- .unwrap()
75
- .unwrap();
76
- const dappAccount = await getUser(env, AccountKey.dappsWithStake);
77
- const randomCaptchasResult = await providerTasks.db.getRandomCaptcha(true, providerDetails.datasetId);
78
- if (randomCaptchasResult) {
79
- const solutions = await providerTasks.db.getSolutions(providerDetails.datasetId.toString());
80
- const solutionIndex = solutions.findIndex((s) => s.captchaContentId === at(randomCaptchasResult, 0).captchaContentId);
81
- const solution = at(solutions, solutionIndex).solution;
82
- const unsolvedCaptcha = at(randomCaptchasResult, 0);
83
- const captchaSolution = { ...unsolvedCaptcha, solution, salt: randomAsHex() };
84
- const commitmentIds = [];
85
- const completedAt = (await env.getApi().rpc.chain.getBlock()).block.header.number.toNumber();
86
- const requestedAt = completedAt - 1;
87
- const requestHash = 'requestHash';
88
- for (let count = 0; count < commitmentCount; count++) {
89
- const dappUser = await getUser(env, AccountKey.dappUsers, false);
90
- const commitmentId = randomAsHex();
91
- commitmentIds.push(commitmentId);
92
- const status = count % 2 === 0 ? CaptchaStatus.approved : CaptchaStatus.disapproved;
93
- const signer = env.keyring.addFromMnemonic(accountMnemonic(dappUser));
94
- const userSignature = signer.sign(stringToHex(requestHash));
95
- const commit = {
96
- id: commitmentId,
97
- userAccount: accountAddress(dappUser),
98
- providerAccount: accountAddress(providerAccount),
99
- datasetId: providerDetails.datasetId.toString(),
100
- dappContract: accountContract(dappAccount),
101
- status,
102
- requestedAt,
103
- completedAt,
104
- userSignature: Array.from(userSignature),
105
- processed: false,
106
- batched: false,
107
- };
108
- await providerTasks.db.storeDappUserSolution([captchaSolution], commit);
109
- if (status === CaptchaStatus.approved) {
110
- await providerTasks.db.approveDappUserCommitment(commitmentId);
111
- }
112
- await sleep(10);
113
- const userSolutions = await providerTasks.db.getDappUserSolutionById(commitmentId);
114
- expect(userSolutions).to.be.not.empty;
115
- const commitRecord = await providerTasks.db.getDappUserCommitmentById(commitmentId);
116
- expect(commitRecord).to.be.not.empty;
117
- }
118
- const commitmentsBeforeBatching = await batcher.getCommitments();
119
- expect(commitmentsBeforeBatching.length).to.be.equal(commitmentCount);
120
- expect(commitmentsBeforeBatching
121
- .map((c) => +(c.status === CaptchaStatus.approved))
122
- .reduce((prev, next) => prev + next)).to.equal(Math.round(commitmentCount / 2));
123
- await batcher.run();
124
- const batcherResult = await env.getDb().getLastScheduledTaskStatus(ScheduledTaskNames.BatchCommitment);
125
- console.log('batcherResult', batcherResult);
126
- if (!batcherResult ||
127
- (batcherResult && !batcherResult.result) ||
128
- (batcherResult && batcherResult.result && !batcherResult.result.data)) {
129
- expect(true).to.be.false;
130
- }
131
- if (batcherResult && batcherResult.result && batcherResult.result.data) {
132
- const processedCommitmentIds = batcherResult.result.data.commitmentIds;
133
- const processedCommitments = commitmentsBeforeBatching.filter((commitment) => processedCommitmentIds.indexOf(commitment.id.toString()) > -1);
134
- const commitmentsFromDbAfter = await env.getDb().getUnbatchedDappUserCommitments();
135
- expect(commitmentsBeforeBatching.length - processedCommitments.length).to.equal(commitmentsFromDbAfter.length);
136
- const waitTime = calcInterval(contractApi.api).toNumber() * 2;
137
- env.logger.debug(`waiting ${waitTime}ms for commitments to be available on-chain`);
138
- await sleep(waitTime);
139
- let count = 0;
140
- for (const commitment of processedCommitments) {
141
- const approved = count % 2 === 0 ? 'Approved' : 'Disapproved';
142
- env.logger.debug(`Getting commitmentId ${commitment.id} from contract`);
143
- const contractCommitment = (await contractApi.query.getCommit(commitment.id)).value
144
- .unwrap()
145
- .unwrap();
146
- expect(contractCommitment).to.be.not.empty;
147
- expect(contractCommitment.status).to.be.equal(approved);
148
- count++;
149
- }
150
- const lastBatchCommit = await providerTasks.db.getLastScheduledTaskStatus(ScheduledTaskNames.BatchCommitment);
151
- expect(lastBatchCommit).to.be.not.empty;
152
- expect(lastBatchCommit.status).to.be.equal('Completed');
153
- if (lastBatchCommit !== undefined) {
154
- expect(+Date.now() - +lastBatchCommit?.datetime).to.be.lessThan(waitTime * 2);
155
- }
156
- }
157
- }
158
- }, 120000);
159
- async function createMockCaptchaSolutionsAndRequestHash(env) {
160
- const dappUserAccount = await getUser(env, AccountKey.dappUsers);
161
- const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
162
- const dappContractAccount = await getUser(env, AccountKey.dappsWithStake);
163
- const tasks = await getSignedTasks(env, providerAccount);
164
- const providerDetails = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value
165
- .unwrap()
166
- .unwrap();
167
- const solvedCaptchas = await env
168
- .getDb()
169
- .getRandomSolvedCaptchasFromSingleDataset(providerDetails.datasetId.toString(), 2);
170
- const network = env.config.networks[env.config.defaultNetwork];
171
- const pair = await getPairAsync(network, accountMnemonic(dappUserAccount), '');
172
- await env.changeSigner(pair);
173
- const userSalt = randomAsHex();
174
- const captchaSolutions = solvedCaptchas.map((captcha) => ({
175
- captchaId: captcha.captchaId,
176
- salt: userSalt,
177
- solution: captcha.solution,
178
- captchaContentId: captcha.captchaContentId,
179
- }));
180
- const pendingRequestSalt = randomAsHex();
181
- const requestHash = computePendingRequestHash(captchaSolutions.map((c) => c.captchaId), accountAddress(dappUserAccount), pendingRequestSalt);
182
- const blockNumber = await getCurrentBlockNumber(env.getApi());
183
- if ('storeDappUserPending' in env.getDb()) {
184
- await env
185
- .getDb()
186
- .storeDappUserPending(hexHash(accountAddress(dappUserAccount)), requestHash, pendingRequestSalt, 99999999999999, blockNumber);
187
- }
188
- const signer = env.keyring.addFromMnemonic(accountMnemonic(dappUserAccount));
189
- const userSignature = signer.sign(stringToHex(requestHash));
190
- signatureVerify(stringToHex(requestHash), userSignature, accountAddress(dappUserAccount));
191
- return {
192
- dappUserAccount,
193
- captchaSolutions,
194
- requestHash,
195
- providerAccount,
196
- dappContractAccount,
197
- userSalt,
198
- userSignature,
199
- blockNumber,
200
- };
201
- }
202
- test('Provider registration', async function ({ env, providerStakeThreshold }) {
203
- const providerAccount = env.createAccountAndAddToKeyring() || ['', ''];
204
- const tasks = await getSignedTasks(env, providerAccount);
205
- const stakeAmount = getStakeAmount(env, providerStakeThreshold);
206
- const sendAmount = getSendAmount(env, stakeAmount);
207
- await sendFunds(env, providerAccount.address, 'ProsopoPayee', sendAmount);
208
- const queryResult = await tasks.contract.query.providerRegister(Array.from(stringToU8a(PROVIDER.url + randomAsHex().slice(0, 8))), PROVIDER.fee, PROVIDER_PAYEE);
209
- if (queryResult.value.err) {
210
- throw new Error(queryResult.value.err);
211
- }
212
- if (queryResult.value.ok?.err) {
213
- throw new Error(queryResult.value.ok.err);
214
- }
215
- const result = await tasks.contract.tx.providerRegister(Array.from(stringToU8a(PROVIDER.url + randomAsHex().slice(0, 8))), PROVIDER.fee, PROVIDER_PAYEE);
216
- console.log(JSON.stringify(result.error, null, 4));
217
- expect(result?.error).to.be.undefined;
218
- });
219
- test('Provider update', async ({ env, providerStakeThreshold }) => {
220
- const providerAccount = await getUser(env, AccountKey.providers);
221
- const tasks = await getSignedTasks(env, providerAccount);
222
- const value = providerStakeThreshold;
223
- const result = (await tasks.contract.tx.providerUpdate(Array.from(stringToU8a(PROVIDER.url + randomAsHex().slice(0, 8))), PROVIDER.fee, PROVIDER_PAYEE, { value })).result;
224
- if (result?.isError && result?.dispatchError) {
225
- const dispatchError = getDispatchError(result?.dispatchError);
226
- throw new ProsopoContractError(new Error(dispatchError));
227
- }
228
- expect(result?.isError).to.be.false;
229
- });
230
- test('Provider add dataset', async ({ env }) => {
231
- const providerAccount = await getUser(env, AccountKey.providersWithStake);
232
- const tasks = await getSignedTasks(env, providerAccount);
233
- await tasks.providerSetDatasetFromFile(JSON.parse(JSON.stringify(datasetWithIndexSolutions)));
234
- });
235
- test('Provider add dataset with too few captchas will fail', async ({ env }) => {
236
- const providerAccount = await getUser(env, AccountKey.providersWithStake);
237
- const tasks = await getSignedTasks(env, providerAccount);
238
- const dataset = { ...datasetWithIndexSolutions };
239
- dataset.captchas = dataset.captchas.slice(0, 1);
240
- try {
241
- await tasks.providerSetDatasetFromFile(JSON.parse(JSON.stringify(dataset)));
242
- }
243
- catch (e) {
244
- expect(e).to.match(/Number of captchas in dataset is less than configured number of captchas/);
245
- }
246
- });
247
- test('Provider add dataset with too few solutions will fail', async ({ env }) => {
248
- const providerAccount = await getUser(env, AccountKey.providersWithStake);
249
- const tasks = await getSignedTasks(env, providerAccount);
250
- const dataset = { ...datasetWithIndexSolutions };
251
- dataset.captchas = dataset.captchas.map((captcha) => {
252
- const { solution, ...rest } = captcha;
253
- return rest;
254
- });
255
- try {
256
- await tasks.providerSetDatasetFromFile(JSON.parse(JSON.stringify(dataset)));
257
- }
258
- catch (e) {
259
- expect(e).to.match(/Number of solutions in dataset is less than configured number of solutions/);
260
- }
261
- });
262
- test('Inactive Provider cannot add dataset', async ({ env }) => {
263
- const providerAccount = await getUser(env, AccountKey.providers);
264
- const tasks = await getSignedTasks(env, providerAccount);
265
- try {
266
- await tasks.providerSetDatasetFromFile(JSON.parse(JSON.stringify(datasetWithIndexSolutions)));
267
- }
268
- catch (e) {
269
- expect(e).to.match(/ProviderInactive/);
270
- }
271
- });
272
- test('Provider approve', async ({ env }) => {
273
- const { dappUserAccount, captchaSolutions, providerAccount, dappContractAccount, userSignature } = await createMockCaptchaSolutionsAndRequestHash(env);
274
- const tasks = await getSignedTasks(env, dappUserAccount);
275
- const salt = randomAsHex();
276
- const tree = new CaptchaMerkleTree();
277
- const captchaSolutionsSalted = captchaSolutions.map((captcha) => ({
278
- ...captcha,
279
- salt: salt,
280
- }));
281
- const captchasHashed = captchaSolutionsSalted.map((captcha) => computeCaptchaSolutionHash(captcha));
282
- tree.build(captchasHashed);
283
- const commitmentId = tree.root.hash;
284
- const provider = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value
285
- .unwrap()
286
- .unwrap();
287
- const completedAt = (await env.getApi().rpc.chain.getBlock()).block.header.number.toNumber();
288
- const requestedAt = completedAt - 1;
289
- const providerTasks = await getSignedTasks(env, providerAccount);
290
- const commit = {
291
- dappContract: accountContract(dappContractAccount),
292
- datasetId: provider.datasetId,
293
- id: commitmentId,
294
- providerAccount: accountAddress(providerAccount),
295
- userAccount: accountAddress(dappUserAccount),
296
- status: CaptchaStatus.approved,
297
- requestedAt,
298
- completedAt,
299
- userSignature: [...userSignature],
300
- };
301
- const queryResult = await providerTasks.contract.query.providerCommit(commit);
302
- if (queryResult.value.err) {
303
- throw new Error(queryResult.value.err);
304
- }
305
- const result = await providerTasks.contract.tx.providerCommit(commit);
306
- if (result.result?.isError && result.result?.dispatchError) {
307
- const dispatchError = getDispatchError(result.result?.dispatchError);
308
- throw new ProsopoContractError(new Error(dispatchError));
309
- }
310
- expect(result.result?.isError).to.be.false;
311
- if (result.error) {
312
- throw new ProsopoContractError(result.error.message);
313
- }
314
- });
315
- test('Provider disapprove', async ({ env }) => {
316
- const { dappUserAccount, captchaSolutions, providerAccount, dappContractAccount, userSignature } = await createMockCaptchaSolutionsAndRequestHash(env);
317
- const tasks = await getSignedTasks(env, dappUserAccount);
318
- const salt = randomAsHex();
319
- const tree = new CaptchaMerkleTree();
320
- const captchaSolutionsSalted = captchaSolutions.map((captcha) => ({
321
- ...captcha,
322
- salt: salt,
323
- }));
324
- const captchasHashed = captchaSolutionsSalted.map((captcha) => computeCaptchaSolutionHash(captcha));
325
- tree.build(captchasHashed);
326
- const commitmentId = tree.root.hash;
327
- const provider = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value
328
- .unwrap()
329
- .unwrap();
330
- const completedAt = (await env.getApi().rpc.chain.getBlock()).block.header.number.toNumber();
331
- const requestedAt = completedAt - 1;
332
- const providerTasks = await getSignedTasks(env, providerAccount);
333
- await providerTasks.contract.tx.providerCommit({
334
- dappContract: accountContract(dappContractAccount),
335
- datasetId: provider.datasetId.toString(),
336
- id: commitmentId,
337
- providerAccount: accountAddress(providerAccount),
338
- userAccount: accountAddress(dappUserAccount),
339
- status: CaptchaStatus.disapproved,
340
- requestedAt,
341
- completedAt,
342
- userSignature: [...userSignature],
343
- });
344
- });
345
- test('Timestamps check', async ({ env }) => {
346
- const salt = randomAsHex();
347
- const tree = new CaptchaMerkleTree();
348
- const { dappUserAccount, captchaSolutions, providerAccount, dappContractAccount, userSignature } = await createMockCaptchaSolutionsAndRequestHash(env);
349
- const tasks = await getSignedTasks(env, dappUserAccount);
350
- const captchaSolutionsSalted = captchaSolutions.map((captcha) => ({
351
- ...captcha,
352
- salt: salt,
353
- }));
354
- const captchasHashed = captchaSolutionsSalted.map((captcha) => computeCaptchaSolutionHash(captcha));
355
- tree.build(captchasHashed);
356
- const commitmentId = tree.root.hash;
357
- const provider = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value
358
- .unwrap()
359
- .unwrap();
360
- const completedAt = (await env.getApi().rpc.chain.getBlock()).block.header.number.toNumber();
361
- const requestedAt = completedAt - 1;
362
- const providerTasks = await getSignedTasks(env, providerAccount);
363
- await providerTasks.contract.tx.providerCommit({
364
- dappContract: accountContract(dappContractAccount),
365
- datasetId: provider.datasetId.toString(),
366
- id: commitmentId,
367
- providerAccount: accountAddress(providerAccount),
368
- userAccount: accountAddress(dappUserAccount),
369
- status: CaptchaStatus.approved,
370
- completedAt,
371
- requestedAt,
372
- userSignature: [...userSignature],
373
- });
374
- const commitment = (await providerTasks.contract.query.getCommit(commitmentId)).value.unwrap().unwrap();
375
- const completedAtCheck = parseInt(commitment.completedAt.toString().replace(',', ''));
376
- expect(completedAtCheck).to.be.above(0);
377
- const lastCorrectCaptcha = (await providerTasks.contract.query.dappOperatorLastCorrectCaptcha(accountAddress(dappUserAccount))).value
378
- .unwrap()
379
- .unwrap();
380
- expect(Number.parseInt(lastCorrectCaptcha.before.toString())).to.be.above(0);
381
- });
382
- test('Provider details', async ({ env }) => {
383
- try {
384
- const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
385
- const tasks = await getSignedTasks(env, providerAccount);
386
- const result = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value
387
- .unwrap()
388
- .unwrap();
389
- expect(result).to.have.a.property('status');
390
- }
391
- catch (err) {
392
- throw new ProsopoEnvError(err);
393
- }
394
- });
395
- test('Provider accounts', async ({ env }) => {
396
- const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
397
- const tasks = await getSignedTasks(env, providerAccount);
398
- const result = (await tasks.contract.query.getAllProviderAccounts()).value.unwrap().unwrap();
399
- expect(result).to.be.an('array');
400
- });
401
- test('Dapp registration', async ({ env, providerStakeThreshold, dappStakeThreshold }) => {
402
- const newAccount = env.createAccountAndAddToKeyring() || ['', ''];
403
- const tasks = await getSignedTasks(env, newAccount);
404
- const stakeAmount = getStakeAmount(env, providerStakeThreshold);
405
- const sendAmount = getSendAmount(env, stakeAmount);
406
- await sendFunds(env, accountAddress(newAccount), 'Dapp', sendAmount);
407
- const dappParams = ['1000000000000000000', 1000, env.getContractInterface().address, 65, 1000000];
408
- if (!env.pair) {
409
- throw new ProsopoContractError('CONTRACT.SIGNER_UNDEFINED');
410
- }
411
- const deployer = new ContractDeployer(env.getApi(), await DappAbiJSON(), await DappWasm(), env.pair, dappParams, 0, 0, randomAsHex());
412
- const deployResult = await deployer.deploy();
413
- const instantiateEvent = deployResult.events.find((event) => event.event.section === 'contracts');
414
- const contractAddress = String(get(instantiateEvent?.event.data, 'contract'));
415
- const result = (await tasks.contract.tx.dappRegister(contractAddress, DappPayee.dapp)).result;
416
- expect(result?.isError).to.be.false;
417
- const dapp = (await tasks.contract.query.getDapp(contractAddress)).value.unwrap().unwrap();
418
- expect(dapp.owner).to.equal(accountAddress(newAccount));
419
- });
420
- test('Dapp is active', async ({ env }) => {
421
- const dappAccount = await getUser(env, AccountKey.dappsWithStake);
422
- const tasks = await getSignedTasks(env, dappAccount);
423
- const result = await tasks.dappIsActive(accountContract(dappAccount));
424
- expect(result).to.equal(true);
425
- });
426
- test('Dapp details', async ({ env }) => {
427
- const dappAccount = await getUser(env, AccountKey.dapps);
428
- const tasks = await getSignedTasks(env, dappAccount);
429
- const result = (await tasks.contract.query.getDapp(accountContract(dappAccount))).value.unwrap().unwrap();
430
- expect(result).to.have.a.property('status');
431
- });
432
- test('Dapp fund', async ({ env, dappStakeThreshold }) => {
433
- const dappAccount = await getUser(env, AccountKey.dappsWithStake);
434
- const tasks = await getSignedTasks(env, dappAccount);
435
- const dappContractAddress = accountContract(dappAccount);
436
- const dappBefore = (await tasks.contract.query.getDapp(dappContractAddress)).value.unwrap().unwrap();
437
- const result = (await tasks.contract.tx.dappFund(dappContractAddress, { value: dappStakeThreshold })).result;
438
- expect(result?.isError).to.be.false;
439
- const dappAfter = (await tasks.contract.query.getDapp(dappContractAddress)).value.unwrap().unwrap();
440
- expect(dappBefore.balance.rawNumber.add(dappStakeThreshold).toString()).to.equal(dappAfter.balance.rawNumber.toString());
441
- });
442
- test('Captchas are correctly formatted before being passed to the API layer', async ({ env }) => {
443
- const dappUserAccount = await getUser(env, AccountKey.dappUsers);
444
- const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
445
- const dappUserTasks = await getSignedTasks(env, dappUserAccount);
446
- const provider = (await dappUserTasks.contract.query.getProvider(accountAddress(providerAccount))).value
447
- .unwrap()
448
- .unwrap();
449
- const captchas = await dappUserTasks.getCaptchaWithProof(provider.datasetId.toString(), true, 1);
450
- expect(captchas[0]).to.have.nested.property('captcha.captchaId');
451
- expect(captchas[0]).to.have.nested.property('captcha.datasetId', provider.datasetId.toString());
452
- expect(captchas[0]).to.have.property('proof');
453
- expect(captchas[0]).to.not.have.property('solution');
454
- expect(captchas[0]).to.not.have.nested.property('captcha.solution');
455
- });
456
- test('Captcha proofs are returned if commitment found and solution is correct', async ({ env }) => {
457
- const { captchaSolutions, requestHash, dappUserAccount, providerAccount, dappContractAccount, userSignature } = await createMockCaptchaSolutionsAndRequestHash(env);
458
- const dappUserTasks = await getSignedTasks(env, dappUserAccount);
459
- const tree = new CaptchaMerkleTree();
460
- const captchaSolutionsSalted = captchaSolutions;
461
- const captchasHashed = captchaSolutionsSalted.map((captcha) => computeCaptchaSolutionHash(captcha));
462
- tree.build(captchasHashed);
463
- const commitmentId = tree.root.hash;
464
- const provider = (await dappUserTasks.contract.query.getProvider(accountAddress(providerAccount))).value
465
- .unwrap()
466
- .unwrap();
467
- const completedAt = (await env.getApi().rpc.chain.getBlock()).block.header.number.toNumber();
468
- const requestedAt = completedAt - 1;
469
- const providerTasks = await getSignedTasks(env, providerAccount);
470
- await providerTasks.contract.tx.providerCommit({
471
- dappContract: accountContract(dappContractAccount),
472
- datasetId: provider.datasetId.toString(),
473
- id: commitmentId,
474
- providerAccount: accountAddress(providerAccount),
475
- userAccount: accountAddress(dappUserAccount),
476
- status: CaptchaStatus.approved,
477
- completedAt,
478
- requestedAt,
479
- userSignature: [...userSignature],
480
- });
481
- const commitment = (await providerTasks.contract.query.getCommit(commitmentId)).value.unwrap().unwrap();
482
- await env.getApi().rpc.chain.getBlockHash(commitment.completedAt);
483
- const result = await providerTasks.dappUserSolution(accountAddress(dappUserAccount), accountContract(dappContractAccount), requestHash, JSON.parse(JSON.stringify(captchaSolutionsSalted)), u8aToHex(userSignature));
484
- expect(result.captchas.length).to.be.eq(2);
485
- const expectedProof = tree.proof(at(captchaSolutionsSalted, 0).captchaId);
486
- const filteredResult = at(result.captchas.filter((res) => res.captchaId == at(captchaSolutionsSalted, 0).captchaId), 0);
487
- expect(filteredResult.proof).to.deep.eq(expectedProof);
488
- expect(filteredResult.captchaId).to.eq(at(captchaSolutionsSalted, 0).captchaId);
489
- });
490
- test('Validates the received captchas length', async ({ env }) => {
491
- const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
492
- const { captchaSolutions } = await createMockCaptchaSolutionsAndRequestHash(env);
493
- const providerTasks = await getSignedTasks(env, providerAccount);
494
- try {
495
- await providerTasks.validateReceivedCaptchasAgainstStoredCaptchas(captchaSolutions);
496
- }
497
- catch (e) {
498
- assert.fail('Should not throw');
499
- }
500
- });
501
- test('Builds the tree and gets the commitment', async ({ env }) => {
502
- try {
503
- const { captchaSolutions, dappUserAccount, userSignature } = await createMockCaptchaSolutionsAndRequestHash(env);
504
- const dappAccount = await getUser(env, AccountKey.dappsWithStake);
505
- const tasks = await getSignedTasks(env, dappUserAccount);
506
- const initialTree = new CaptchaMerkleTree();
507
- const captchasHashed = captchaSolutions.map((captcha) => computeCaptchaSolutionHash(captcha));
508
- initialTree.build(captchasHashed);
509
- const initialCommitmentId = initialTree.root.hash;
510
- const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
511
- const provider = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value
512
- .unwrap()
513
- .unwrap();
514
- const providerTasks = await getSignedTasks(env, providerAccount);
515
- const completedAt = (await env.getApi().rpc.chain.getBlock()).block.header.number.toNumber();
516
- const requestedAt = completedAt - 1;
517
- const commit = {
518
- dappContract: accountContract(dappAccount),
519
- datasetId: provider.datasetId.toString(),
520
- id: initialCommitmentId,
521
- providerAccount: accountAddress(providerAccount),
522
- userAccount: accountAddress(dappUserAccount),
523
- status: CaptchaStatus.approved,
524
- completedAt,
525
- requestedAt,
526
- userSignature: [...userSignature],
527
- };
528
- const queryResult = await providerTasks.contract.query.providerCommit(commit);
529
- const error = queryResult.value.err || queryResult.value.ok?.err;
530
- if (error) {
531
- throw new Error(error);
532
- }
533
- const result = (await providerTasks.contract.tx.providerCommit(commit)).result;
534
- expect(result?.isError).to.be.false;
535
- const { commitmentId, tree } = await tasks.buildTreeAndGetCommitmentId(captchaSolutions);
536
- expect(tree).to.deep.equal(initialTree);
537
- expect(commitmentId).to.equal(initialCommitmentId);
538
- const commitment = await wrapQuery(tasks.contract.query.getCommit, tasks.contract.query)(commitmentId);
539
- expect(commitment).to.not.be.undefined;
540
- }
541
- catch (e) {
542
- console.log(e);
543
- throw e;
544
- }
545
- });
546
- test('BuildTreeAndGetCommitment throws if commitment does not exist', async ({ env }) => {
547
- const { captchaSolutions, dappUserAccount } = await createMockCaptchaSolutionsAndRequestHash(env);
548
- const tasks = await getSignedTasks(env, dappUserAccount);
549
- const salt = randomAsHex();
550
- const captchaSolutionsSalted = captchaSolutions.map((captcha) => ({
551
- ...captcha,
552
- salt: salt,
553
- }));
554
- const commitmentPromise = tasks.buildTreeAndGetCommitmentId(captchaSolutionsSalted);
555
- commitmentPromise.catch((e) => e.message.should.match(new RegExp(i18n.t('CONTRACT.CAPTCHA_SOLUTION_COMMITMENT_DOES_NOT_EXIST'))));
556
- });
557
- test('Validates the Dapp User Solution Request is Pending', async ({ env }) => {
558
- const { dappUserAccount, captchaSolutions, blockNumber } = await createMockCaptchaSolutionsAndRequestHash(env);
559
- const tasks = await getSignedTasks(env, dappUserAccount);
560
- const pendingRequestSalt = randomAsHex();
561
- const captchaIds = captchaSolutions.map((c) => c.captchaId);
562
- const requestHash = computePendingRequestHash(captchaIds, accountAddress(dappUserAccount), pendingRequestSalt);
563
- await env
564
- .getDb()
565
- .storeDappUserPending(hexHash(accountAddress(dappUserAccount)), requestHash, pendingRequestSalt, 99999999999999, blockNumber);
566
- const pendingRecord = await env.getDb().getDappUserPending(requestHash);
567
- const valid = await tasks.validateDappUserSolutionRequestIsPending(requestHash, pendingRecord, accountAddress(dappUserAccount), captchaIds);
568
- expect(valid).to.be.true;
569
- });
570
- test('Get random captchas and request hash', async ({ env }) => {
571
- try {
572
- const dappUserAccount = await getUser(env, AccountKey.dappUsers);
573
- await getUser(env, AccountKey.providersWithStakeAndDataset);
574
- const dappUserTasks = await getSignedTasks(env, dappUserAccount);
575
- const solvedCaptchaCount = env.config.captchas.solved.count;
576
- const unsolvedCaptchaCount = env.config.captchas.unsolved.count;
577
- const { captchas, requestHash } = await dappUserTasks.getRandomCaptchasAndRequestHash(datasetWithSolutionHashes.datasetId.toString(), hexHash(accountAddress(dappUserAccount)));
578
- expect(captchas.length).to.equal(solvedCaptchaCount + unsolvedCaptchaCount);
579
- const pendingRequest = await env.getDb().getDappUserPending(requestHash);
580
- expect(pendingRequest).to.not.be.null;
581
- }
582
- catch (err) {
583
- throw new ProsopoEnvError(err);
584
- }
585
- });
586
- test('Validate provided captcha dataset', async ({ env }) => {
587
- const dappAccount = await getUser(env, AccountKey.dappsWithStake);
588
- const tasks = await getSignedTasks(env, dappAccount);
589
- const res = (await tasks.contract.query.getRandomActiveProvider(accountContract(dappAccount), accountContract(dappAccount))).value
590
- .unwrap()
591
- .unwrap();
592
- const blockNumberParsed = parseBlockNumber(res.blockNumber.toString());
593
- await tasks.validateProviderWasRandomlyChosen(accountContract(dappAccount), accountContract(dappAccount), res.provider.datasetId.toString(), blockNumberParsed);
594
- const valid = await tasks
595
- .validateProviderWasRandomlyChosen(accountContract(dappAccount), accountContract(dappAccount), res.provider.datasetId.toString(), blockNumberParsed)
596
- .then(() => true)
597
- .catch(() => false);
598
- expect(valid).to.be.true;
599
- });
600
- test('Validate provided captcha dataset - fail', async ({ env, providerStakeThreshold }) => {
601
- const providerAccount = await getUser(env, AccountKey.providers);
602
- const tasks = await getSignedTasks(env, providerAccount);
603
- let provider = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value.unwrap().unwrap();
604
- const resultProviderUpdate1 = (await tasks.contract.tx.providerUpdate(provider.url, provider.fee, PROVIDER_PAYEE, {
605
- value: 0,
606
- })).result;
607
- expect(resultProviderUpdate1?.isError).to.be.false;
608
- provider = (await tasks.contract.query.getProvider(accountAddress(providerAccount))).value.unwrap().unwrap();
609
- expect(provider.status).to.equal('Inactive');
610
- const resultproviderUpdate2 = (await tasks.contract.tx.providerUpdate(provider.url, provider.fee, PROVIDER_PAYEE, {
611
- value: providerStakeThreshold,
612
- })).result;
613
- expect(resultproviderUpdate2?.isError).to.be.false;
614
- await tasks.providerSetDatasetFromFile(JSON.parse(JSON.stringify(datasetWithIndexSolutions)));
615
- const dappAccount = await getUser(env, AccountKey.dappsWithStake);
616
- const dappUser = await getUser(env, AccountKey.dappUsers);
617
- const dappUserTasks = await getSignedTasks(env, dappUser);
618
- const res = (await dappUserTasks.contract.query.getRandomActiveProvider(accountAddress(dappUser), accountContract(dappAccount))).value
619
- .unwrap()
620
- .unwrap();
621
- const blockNumberParsed = parseBlockNumber(res.blockNumber.toString());
622
- const valid = await dappUserTasks
623
- .validateProviderWasRandomlyChosen(accountAddress(dappUser), accountContract(dappAccount), '0x1dc833d14a257f21967feddafb3b3876b75b3fc9b0a2d071f29da9bfebc84f5a', blockNumberParsed)
624
- .then(() => true)
625
- .catch(() => false);
626
- expect(valid).to.be.false;
627
- });
628
- test('Provider deregister', async ({ env }) => {
629
- const providerAccount = await getUser(env, AccountKey.providersWithStake);
630
- const tasks = await getSignedTasks(env, providerAccount);
631
- const isError = (await tasks.contract.tx.providerDeregister()).result?.isError;
632
- expect(isError).to.be.false;
633
- });
634
- });
635
- //# sourceMappingURL=tasks.test.js.map