@prosopo/provider 0.2.4 → 0.2.6
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.
- package/dist/cjs/contracts/captcha/dist/contract-info/captcha.cjs +2 -2
- package/dist/cjs/util.cjs +2 -2
- package/dist/tests/accounts.d.ts +11 -0
- package/dist/tests/accounts.d.ts.map +1 -0
- package/dist/tests/accounts.js +47 -0
- package/dist/tests/accounts.js.map +1 -0
- package/dist/tests/batch/commitments.test.d.ts +6 -0
- package/dist/tests/batch/commitments.test.d.ts.map +1 -0
- package/dist/tests/batch/commitments.test.js +217 -0
- package/dist/tests/batch/commitments.test.js.map +1 -0
- package/dist/tests/contract/helpers.test.d.ts +6 -0
- package/dist/tests/contract/helpers.test.d.ts.map +1 -0
- package/dist/tests/contract/helpers.test.js +58 -0
- package/dist/tests/contract/helpers.test.js.map +1 -0
- package/dist/tests/data/captchas.d.ts +37 -0
- package/dist/tests/data/captchas.d.ts.map +1 -0
- package/dist/tests/data/captchas.js +902 -0
- package/dist/tests/data/captchas.js.map +1 -0
- package/dist/tests/data/captchas1.json +53 -0
- package/dist/tests/data/captchas2.json +69 -0
- package/dist/tests/data/captchas3.json +54 -0
- package/dist/tests/data/captchas4.json +53 -0
- package/dist/tests/dataUtils/DatabaseAccounts.d.ts +35 -0
- package/dist/tests/dataUtils/DatabaseAccounts.d.ts.map +1 -0
- package/dist/tests/dataUtils/DatabaseAccounts.js +85 -0
- package/dist/tests/dataUtils/DatabaseAccounts.js.map +1 -0
- package/dist/tests/dataUtils/DatabasePopulator.d.ts +66 -0
- package/dist/tests/dataUtils/DatabasePopulator.d.ts.map +1 -0
- package/dist/tests/dataUtils/DatabasePopulator.js +264 -0
- package/dist/tests/dataUtils/DatabasePopulator.js.map +1 -0
- package/dist/tests/dataUtils/dapp-example-contract/dapp.json +648 -0
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts +4 -0
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.d.ts.map +1 -0
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js +41 -0
- package/dist/tests/dataUtils/dapp-example-contract/loadFiles.js.map +1 -0
- package/dist/tests/dataUtils/funds.d.ts +23 -0
- package/dist/tests/dataUtils/funds.d.ts.map +1 -0
- package/dist/tests/dataUtils/funds.js +102 -0
- package/dist/tests/dataUtils/funds.js.map +1 -0
- package/dist/tests/dataUtils/populateDatabase.d.ts +15 -0
- package/dist/tests/dataUtils/populateDatabase.d.ts.map +1 -0
- package/dist/tests/dataUtils/populateDatabase.js +76 -0
- package/dist/tests/dataUtils/populateDatabase.js.map +1 -0
- package/dist/tests/getUser.d.ts +5 -0
- package/dist/tests/getUser.d.ts.map +1 -0
- package/dist/tests/getUser.js +18 -0
- package/dist/tests/getUser.js.map +1 -0
- package/dist/tests/tasks/tasks.test.d.ts +7 -0
- package/dist/tests/tasks/tasks.test.d.ts.map +1 -0
- package/dist/tests/tasks/tasks.test.js +719 -0
- package/dist/tests/tasks/tasks.test.js.map +1 -0
- package/dist/tests/util.test.d.ts +2 -0
- package/dist/tests/util.test.d.ts.map +1 -0
- package/dist/tests/util.test.js +51 -0
- package/dist/tests/util.test.js.map +1 -0
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/package.json +10 -10
package/dist/cjs/util.cjs
CHANGED
|
@@ -16,8 +16,8 @@ function encodeStringAddress(address) {
|
|
|
16
16
|
function shuffleArray(array) {
|
|
17
17
|
for (let arrayIndex = array.length - 1; arrayIndex > 0; arrayIndex--) {
|
|
18
18
|
const randIndex = Math.floor(Math.random() * (arrayIndex + 1));
|
|
19
|
-
const tmp = util$1.at(array, randIndex, {
|
|
20
|
-
array[randIndex] = util$1.at(array, arrayIndex, {
|
|
19
|
+
const tmp = util$1.at(array, randIndex, { optional: true });
|
|
20
|
+
array[randIndex] = util$1.at(array, arrayIndex, { optional: true });
|
|
21
21
|
array[arrayIndex] = tmp;
|
|
22
22
|
}
|
|
23
23
|
return array;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IDappAccount, IProviderAccount } from '@prosopo/types';
|
|
2
|
+
import { ProviderEnvironment } from '@prosopo/types-env';
|
|
3
|
+
import { Tasks } from '../index.js';
|
|
4
|
+
export declare const accountMnemonic: (account: Account) => string;
|
|
5
|
+
export declare const accountAddress: (account: Account) => string;
|
|
6
|
+
export declare const accountContract: (account: Account) => string;
|
|
7
|
+
export type Account = [mnemonic: string, address: string, contractAddress?: string];
|
|
8
|
+
export declare const PROVIDER: IProviderAccount;
|
|
9
|
+
export declare const DAPP: IDappAccount;
|
|
10
|
+
export declare function getSignedTasks(env: ProviderEnvironment, account: Account): Promise<Tasks>;
|
|
11
|
+
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/tests/accounts.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAG/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGnC,eAAO,MAAM,eAAe,8BAAmC,CAAA;AAC/D,eAAO,MAAM,cAAc,8BAAmC,CAAA;AAC9D,eAAO,MAAM,eAAe,wBAAgC,MAK3D,CAAA;AACD,MAAM,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAA;AAEnF,eAAO,MAAM,QAAQ,EAAE,gBAStB,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,YAIlB,CAAA;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAM/F"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// Copyright 2021-2023 Prosopo (UK) Ltd.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import { BN } from '@polkadot/util';
|
|
15
|
+
import { Payee } from '@prosopo/captcha-contract';
|
|
16
|
+
import { Tasks } from '../index.js';
|
|
17
|
+
import { getPair } from '@prosopo/common';
|
|
18
|
+
export const accountMnemonic = (account) => account[0];
|
|
19
|
+
export const accountAddress = (account) => account[1];
|
|
20
|
+
export const accountContract = function (account) {
|
|
21
|
+
if (account[2]) {
|
|
22
|
+
return account[2];
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`Account ${account[1]} does not have a contract`);
|
|
25
|
+
};
|
|
26
|
+
export const PROVIDER = {
|
|
27
|
+
url: 'http://localhost:9229',
|
|
28
|
+
fee: 10,
|
|
29
|
+
payee: Payee.dapp,
|
|
30
|
+
stake: new BN(1000000000000000),
|
|
31
|
+
datasetFile: './data/captchas.json',
|
|
32
|
+
captchaDatasetId: '',
|
|
33
|
+
secret: '',
|
|
34
|
+
address: '',
|
|
35
|
+
};
|
|
36
|
+
export const DAPP = {
|
|
37
|
+
secret: '//Ferdie',
|
|
38
|
+
contractAccount: process.env.DAPP_SITE_KEY || '',
|
|
39
|
+
fundAmount: new BN(1000000000000000),
|
|
40
|
+
};
|
|
41
|
+
export async function getSignedTasks(env, account) {
|
|
42
|
+
const ss58Format = 42;
|
|
43
|
+
const pair = await getPair('sr25519', ss58Format, accountMnemonic(account));
|
|
44
|
+
await env.changeSigner(pair);
|
|
45
|
+
return new Tasks(env);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/tests/accounts.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAGnC,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,OAAgB;IACrD,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE;QACZ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;KACpB;IACD,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAA;AACrE,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,QAAQ,GAAqB;IACtC,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,EAAE;IACP,KAAK,EAAE,KAAK,CAAC,IAAI;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC;IAC/B,WAAW,EAAE,sBAAsB;IACnC,gBAAgB,EAAE,EAAE;IACpB,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACd,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAiB;IAC9B,MAAM,EAAE,UAAU;IAClB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;IAChD,UAAU,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC;CACvC,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAwB,EAAE,OAAgB;IAC3E,MAAM,UAAU,GAAG,EAAE,CAAA;IACrB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,SAAwB,EAAE,UAAU,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;IAE1F,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;IAC5B,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commitments.test.d.ts","sourceRoot":"","sources":["../../../src/tests/batch/commitments.test.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAoC9C,OAAO,QAAQ,QAAQ,CAAC;IAEpB,UAAiB,WAAY,SAAQ,eAAe;KAAG;CAC1D"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
// Copyright 2021-2023 Prosopo (UK) Ltd.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import { AccountKey } from '../dataUtils/DatabaseAccounts.js';
|
|
15
|
+
import { BN, BN_THOUSAND, BN_TWO, bnMin, stringToHex } from '@polkadot/util';
|
|
16
|
+
import { BatchCommitmentsTask } from '../../batch/commitments.js';
|
|
17
|
+
import { ScheduledTaskNames } from '@prosopo/types';
|
|
18
|
+
import { CaptchaStatus } from '@prosopo/captcha-contract';
|
|
19
|
+
import { MockEnvironment } from '@prosopo/env';
|
|
20
|
+
import { ProsopoEnvError, getPair } from '@prosopo/common';
|
|
21
|
+
import { accountAddress, accountContract, accountMnemonic, getSignedTasks } from '../accounts.js';
|
|
22
|
+
import { afterEach, beforeEach, describe, expect, test } from 'vitest';
|
|
23
|
+
import { at } from '@prosopo/util';
|
|
24
|
+
import { getUser } from '../getUser.js';
|
|
25
|
+
import { randomAsHex } from '@polkadot/util-crypto';
|
|
26
|
+
import { sleep } from '../tasks/tasks.test.js';
|
|
27
|
+
import { testConfig } from '@prosopo/config';
|
|
28
|
+
import { wrapQuery } from '@prosopo/contract';
|
|
29
|
+
// Some chains incorrectly use these, i.e. it is set to values such as 0 or even 2
|
|
30
|
+
// Use a low minimum validity threshold to check these against
|
|
31
|
+
const THRESHOLD = BN_THOUSAND.div(BN_TWO);
|
|
32
|
+
const DEFAULT_TIME = new BN(6000);
|
|
33
|
+
const A_DAY = new BN(24 * 60 * 60 * 1000);
|
|
34
|
+
function calcInterval(api) {
|
|
35
|
+
return bnMin(A_DAY,
|
|
36
|
+
// Babe, e.g. Relay chains (Substrate defaults)
|
|
37
|
+
api.consts.babe?.expectedBlockTime ||
|
|
38
|
+
// POW, eg. Kulupu
|
|
39
|
+
api.consts.difficulty?.targetBlockTime ||
|
|
40
|
+
// Subspace
|
|
41
|
+
api.consts.subspace?.expectedBlockTime ||
|
|
42
|
+
// Check against threshold to determine value validity
|
|
43
|
+
(api.consts.timestamp?.minimumPeriod.gte(THRESHOLD)
|
|
44
|
+
? // Default minimum period config
|
|
45
|
+
api.consts.timestamp.minimumPeriod.mul(BN_TWO)
|
|
46
|
+
: api.query.parachainSystem
|
|
47
|
+
? // default guess for a parachain
|
|
48
|
+
DEFAULT_TIME.mul(BN_TWO)
|
|
49
|
+
: // default guess for others
|
|
50
|
+
DEFAULT_TIME));
|
|
51
|
+
}
|
|
52
|
+
describe('BATCH TESTS', function () {
|
|
53
|
+
beforeEach(async function (context) {
|
|
54
|
+
context.ss58Format = 42;
|
|
55
|
+
context.pairType = 'sr25519';
|
|
56
|
+
const alicePair = await getPair(context.pairType, context.ss58Format, '//Alice');
|
|
57
|
+
console.log(testConfig);
|
|
58
|
+
context.env = new MockEnvironment(alicePair, testConfig);
|
|
59
|
+
try {
|
|
60
|
+
await context.env.isReady();
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
throw new ProsopoEnvError(e);
|
|
64
|
+
}
|
|
65
|
+
const promiseStakeDefault = wrapQuery(context.env.getContractInterface().query.getProviderStakeThreshold, context.env.getContractInterface().query)();
|
|
66
|
+
context.providerStakeThreshold = new BN((await promiseStakeDefault).toNumber());
|
|
67
|
+
});
|
|
68
|
+
afterEach(async ({ env }) => {
|
|
69
|
+
if (env && 'db' in env)
|
|
70
|
+
await env.db?.close();
|
|
71
|
+
});
|
|
72
|
+
const commitmentCount = 50;
|
|
73
|
+
test(`Batches ~${commitmentCount} commitments on-chain`, async ({ env, pairType, ss58Format }) => {
|
|
74
|
+
if (env.db) {
|
|
75
|
+
const providerAccount = await getUser(env, AccountKey.providersWithStakeAndDataset);
|
|
76
|
+
await env.changeSigner(await getPair(pairType, ss58Format, accountMnemonic(providerAccount)));
|
|
77
|
+
// contract API must be initialized with an account that has funds or the error StorageDepositLimitExhausted
|
|
78
|
+
// will be thrown when trying to batch commitments
|
|
79
|
+
const contractApi = await env.getContractApi();
|
|
80
|
+
// Remove any existing commitments and solutions from the db
|
|
81
|
+
// FIXME - deleting these can mess with other tests since they're all running asynchronously. The database
|
|
82
|
+
// instance *should* be separate for this batch file but issues have been seen in the past...
|
|
83
|
+
await env.db.tables?.commitment.deleteMany({});
|
|
84
|
+
await env.db.tables?.usersolution.deleteMany({});
|
|
85
|
+
// Get account nonce
|
|
86
|
+
const startNonce = await contractApi.api.call.accountNonceApi.accountNonce(accountAddress(providerAccount));
|
|
87
|
+
// Batcher must be created with the provider account as the pair on the contractApi, otherwise the batcher
|
|
88
|
+
// will fail with `ProviderDoesNotExist` error.
|
|
89
|
+
const batcher = new BatchCommitmentsTask(env.config.batchCommit, await env.getContractApi(), env.db, BigInt(startNonce.toNumber()), env.logger);
|
|
90
|
+
const providerTasks = await getSignedTasks(env, providerAccount);
|
|
91
|
+
const providerDetails = (await providerTasks.contract.query.getProvider(accountAddress(providerAccount))).value
|
|
92
|
+
.unwrap()
|
|
93
|
+
.unwrap();
|
|
94
|
+
const dappAccount = await getUser(env, AccountKey.dappsWithStake);
|
|
95
|
+
const randomCaptchasResult = await providerTasks.db.getRandomCaptcha(false, providerDetails.datasetId);
|
|
96
|
+
if (randomCaptchasResult) {
|
|
97
|
+
const unsolvedCaptcha = at(randomCaptchasResult, 0);
|
|
98
|
+
const solution = [
|
|
99
|
+
at(unsolvedCaptcha.items, 0).hash || '',
|
|
100
|
+
at(unsolvedCaptcha.items, 2).hash || '',
|
|
101
|
+
at(unsolvedCaptcha.items, 3).hash || '',
|
|
102
|
+
];
|
|
103
|
+
const captchaSolution = { ...unsolvedCaptcha, solution, salt: randomAsHex() };
|
|
104
|
+
const commitmentIds = [];
|
|
105
|
+
// Store 10 commitments in the local db
|
|
106
|
+
const completedAt = (await env.getApi().rpc.chain.getBlock()).block.header.number.toNumber();
|
|
107
|
+
const requestedAt = completedAt - 1;
|
|
108
|
+
const requestHash = 'requestHash';
|
|
109
|
+
for (let count = 0; count < commitmentCount; count++) {
|
|
110
|
+
// need to submit different commits under different user accounts to avoid the commitments being
|
|
111
|
+
// trimmed by the contract when the max number of commitments per user is reached (e.g. 10 per user)
|
|
112
|
+
const dappUser = await getUser(env, AccountKey.dappUsers, false);
|
|
113
|
+
// not the real commitment id, which would be calculated as the root of a merkle tree
|
|
114
|
+
const commitmentId = randomAsHex();
|
|
115
|
+
commitmentIds.push(commitmentId);
|
|
116
|
+
const status = count % 2 === 0 ? CaptchaStatus.approved : CaptchaStatus.disapproved;
|
|
117
|
+
const signer = env.keyring.addFromMnemonic(accountMnemonic(dappUser));
|
|
118
|
+
const userSignature = signer.sign(stringToHex(requestHash));
|
|
119
|
+
const commit = {
|
|
120
|
+
id: commitmentId,
|
|
121
|
+
userAccount: accountAddress(dappUser),
|
|
122
|
+
providerAccount: accountAddress(providerAccount),
|
|
123
|
+
datasetId: providerDetails.datasetId.toString(),
|
|
124
|
+
dappContract: accountContract(dappAccount),
|
|
125
|
+
status,
|
|
126
|
+
requestedAt,
|
|
127
|
+
completedAt,
|
|
128
|
+
userSignature: Array.from(userSignature),
|
|
129
|
+
processed: false,
|
|
130
|
+
batched: false,
|
|
131
|
+
};
|
|
132
|
+
await providerTasks.db.storeDappUserSolution([captchaSolution], commit);
|
|
133
|
+
if (status === CaptchaStatus.approved) {
|
|
134
|
+
await providerTasks.db.approveDappUserCommitment(commitmentId);
|
|
135
|
+
}
|
|
136
|
+
await sleep(10);
|
|
137
|
+
const userSolutions = await providerTasks.db.getDappUserSolutionById(commitmentId);
|
|
138
|
+
expect(userSolutions).to.be.not.empty;
|
|
139
|
+
const commitRecord = await providerTasks.db.getDappUserCommitmentById(commitmentId);
|
|
140
|
+
expect(commitRecord).to.be.not.empty;
|
|
141
|
+
}
|
|
142
|
+
// Try to get commitments that are ready to be batched
|
|
143
|
+
const commitmentsBeforeBatching = await batcher.getCommitments();
|
|
144
|
+
expect(commitmentsBeforeBatching.length).to.be.equal(commitmentCount);
|
|
145
|
+
// n/2 commitments should be approved and n/2 disapproved
|
|
146
|
+
expect(commitmentsBeforeBatching
|
|
147
|
+
.map((c) => +(c.status === CaptchaStatus.approved))
|
|
148
|
+
.reduce((prev, next) => prev + next)).to.equal(Math.round(commitmentCount / 2));
|
|
149
|
+
// Commit the commitments to the contract
|
|
150
|
+
await batcher.run();
|
|
151
|
+
// Get the batcher result from the db
|
|
152
|
+
// Records should look like this in the db
|
|
153
|
+
// [
|
|
154
|
+
// {
|
|
155
|
+
// _id: ObjectId("64008a2396cccd8e0b33f5b2"),
|
|
156
|
+
// taskId: '0xa0e53b407a4f2254cc7d9626aff02c2032cf4a48898772a650d9016d880147f0',
|
|
157
|
+
// processName: 'BatchCommitment',
|
|
158
|
+
// datetime: ISODate("2023-03-02T11:36:03.077Z"),
|
|
159
|
+
// status: 'Running',
|
|
160
|
+
// __v: 0
|
|
161
|
+
// },
|
|
162
|
+
// {
|
|
163
|
+
// _id: ObjectId("64008a2596cccd8e0b33f5b7"),
|
|
164
|
+
// taskId: '0xa0e53b407a4f2254cc7d9626aff02c2032cf4a48898772a650d9016d880147f0',
|
|
165
|
+
// processName: 'BatchCommitment',
|
|
166
|
+
// datetime: ISODate("2023-03-02T11:36:05.962Z"),
|
|
167
|
+
// status: 'Completed',
|
|
168
|
+
// result: {
|
|
169
|
+
// data: {
|
|
170
|
+
// commitmentIds: [
|
|
171
|
+
// '0x68b0425027636a9130fae67b6cad16a3686e0ce4afd7bc01ecc2504558cbde23',
|
|
172
|
+
// '0x38ed96eeb240c2c3b5dbb7d29fad276317b5a6bb30094ddf0b845585503dd830', ...
|
|
173
|
+
const batcherResult = await env.db.getLastScheduledTaskStatus(ScheduledTaskNames.BatchCommitment);
|
|
174
|
+
console.log('batcherResult', batcherResult);
|
|
175
|
+
if (!batcherResult ||
|
|
176
|
+
(batcherResult && !batcherResult.result) ||
|
|
177
|
+
(batcherResult && batcherResult.result && !batcherResult.result.data)) {
|
|
178
|
+
expect(true).to.be.false;
|
|
179
|
+
}
|
|
180
|
+
if (batcherResult && batcherResult.result && batcherResult.result.data) {
|
|
181
|
+
const processedCommitmentIds = batcherResult.result.data.commitmentIds;
|
|
182
|
+
const processedCommitments = commitmentsBeforeBatching.filter((commitment) => processedCommitmentIds.indexOf(commitment.id.toString()) > -1);
|
|
183
|
+
// Try to get unbatched commitments after batching
|
|
184
|
+
const commitmentsFromDbAfter = await env.db.getUnbatchedDappUserCommitments();
|
|
185
|
+
// Check that the number of batched commitments is equal to the number of commitments that were
|
|
186
|
+
// processed by the batcher
|
|
187
|
+
expect(commitmentsBeforeBatching.length - processedCommitments.length).to.equal(commitmentsFromDbAfter.length);
|
|
188
|
+
// We have to wait for batched commitments to become available on-chain
|
|
189
|
+
const waitTime = calcInterval(contractApi.api).toNumber() * 2;
|
|
190
|
+
env.logger.debug(`waiting ${waitTime}ms for commitments to be available on-chain`);
|
|
191
|
+
await sleep(waitTime);
|
|
192
|
+
// Check the commitments are in the contract
|
|
193
|
+
let count = 0;
|
|
194
|
+
for (const commitment of processedCommitments) {
|
|
195
|
+
const approved = count % 2 === 0 ? 'Approved' : 'Disapproved';
|
|
196
|
+
env.logger.debug(`Getting commitmentId ${commitment.id} from contract`);
|
|
197
|
+
const contractCommitment = (await contractApi.query.getCommit(commitment.id)).value
|
|
198
|
+
.unwrap()
|
|
199
|
+
.unwrap();
|
|
200
|
+
expect(contractCommitment).to.be.not.empty;
|
|
201
|
+
expect(contractCommitment.status).to.be.equal(approved);
|
|
202
|
+
count++;
|
|
203
|
+
}
|
|
204
|
+
// Check the last batch commitment time
|
|
205
|
+
const lastBatchCommit = await providerTasks.db.getLastScheduledTaskStatus(ScheduledTaskNames.BatchCommitment);
|
|
206
|
+
expect(lastBatchCommit).to.be.not.empty;
|
|
207
|
+
expect(lastBatchCommit.status).to.be.equal('Completed');
|
|
208
|
+
// Expect the last batch commitment time to be within the last 10 seconds
|
|
209
|
+
if (lastBatchCommit !== undefined) {
|
|
210
|
+
expect(+Date.now() - +lastBatchCommit?.datetime).to.be.lessThan(waitTime * 2);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}, 24000);
|
|
216
|
+
});
|
|
217
|
+
//# sourceMappingURL=commitments.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commitments.test.js","sourceRoot":"","sources":["../../../src/tests/batch/commitments.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.test.d.ts","sourceRoot":"","sources":["../../../src/tests/contract/helpers.test.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAM9C,OAAO,QAAQ,QAAQ,CAAC;IAEpB,UAAiB,WAAY,SAAQ,eAAe;KAAG;CAC1D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { BN, hexToU8a } from '@polkadot/util';
|
|
2
|
+
import { LogLevel, ProsopoEnvError, getLogger, getPair } from '@prosopo/common';
|
|
3
|
+
import { MockEnvironment } from '@prosopo/env';
|
|
4
|
+
import { TypeDefInfo } from '@polkadot/types-create';
|
|
5
|
+
import { afterEach, beforeEach, describe, expect, test } from 'vitest';
|
|
6
|
+
import { at } from '@prosopo/util';
|
|
7
|
+
import { encodeStringArgs, wrapQuery } from '@prosopo/contract';
|
|
8
|
+
import { testConfig } from '@prosopo/config';
|
|
9
|
+
describe('CONTRACT HELPERS', function () {
|
|
10
|
+
const log = getLogger(LogLevel.enum.info, 'TEST');
|
|
11
|
+
beforeEach(async function (context) {
|
|
12
|
+
context.ss58Format = 42;
|
|
13
|
+
context.pairType = 'sr25519';
|
|
14
|
+
const alicePair = await getPair(context.pairType, context.ss58Format, '//Alice');
|
|
15
|
+
console.log(testConfig);
|
|
16
|
+
context.env = new MockEnvironment(alicePair, testConfig);
|
|
17
|
+
try {
|
|
18
|
+
await context.env.isReady();
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
// TODO fix error handling
|
|
22
|
+
throw new ProsopoEnvError(e);
|
|
23
|
+
}
|
|
24
|
+
const promiseStakeDefault = wrapQuery(context.env.getContractInterface().query.getProviderStakeThreshold, context.env.getContractInterface().query)();
|
|
25
|
+
context.providerStakeThreshold = new BN((await promiseStakeDefault).toNumber());
|
|
26
|
+
});
|
|
27
|
+
afterEach(async ({ env }) => {
|
|
28
|
+
if (env && 'db' in env)
|
|
29
|
+
await env.db?.close();
|
|
30
|
+
});
|
|
31
|
+
test('Properly encodes `Hash` arguments when passed unhashed', async function ({ env }) {
|
|
32
|
+
try {
|
|
33
|
+
log.info('env ready');
|
|
34
|
+
const args = ['https://localhost:9229'];
|
|
35
|
+
const methodObj = {
|
|
36
|
+
args: [{ type: { type: 'Hash', info: TypeDefInfo.UInt }, name: '' }],
|
|
37
|
+
docs: [],
|
|
38
|
+
fromU8a: function () {
|
|
39
|
+
return {};
|
|
40
|
+
},
|
|
41
|
+
identifier: '',
|
|
42
|
+
index: 0,
|
|
43
|
+
method: '',
|
|
44
|
+
path: [''],
|
|
45
|
+
selector: hexToU8a('0x42b45efa'),
|
|
46
|
+
toU8a: function () {
|
|
47
|
+
return {};
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
expect(at(encodeStringArgs(env.getContractInterface().abi, methodObj, args), 0).toString()).to.equal(hexToU8a('0x0000000000000000000068747470733a2f2f6c6f63616c686f73743a39323239').toString());
|
|
51
|
+
log.info('end of test');
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
throw new Error(String(e));
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=helpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.test.js","sourceRoot":"","sources":["../../../src/tests/contract/helpers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare const captchaData: {
|
|
2
|
+
datasetId: string;
|
|
3
|
+
captchas: ({
|
|
4
|
+
salt: string;
|
|
5
|
+
solution: number[];
|
|
6
|
+
timeLimit: number;
|
|
7
|
+
items: {
|
|
8
|
+
hash: string;
|
|
9
|
+
data: string;
|
|
10
|
+
type: string;
|
|
11
|
+
}[];
|
|
12
|
+
target: string;
|
|
13
|
+
} | {
|
|
14
|
+
salt: string;
|
|
15
|
+
solution: number[];
|
|
16
|
+
items: {
|
|
17
|
+
hash: string;
|
|
18
|
+
data: string;
|
|
19
|
+
type: string;
|
|
20
|
+
}[];
|
|
21
|
+
target: string;
|
|
22
|
+
timeLimit?: undefined;
|
|
23
|
+
} | {
|
|
24
|
+
salt: string;
|
|
25
|
+
items: {
|
|
26
|
+
hash: string;
|
|
27
|
+
data: string;
|
|
28
|
+
type: string;
|
|
29
|
+
}[];
|
|
30
|
+
target: string;
|
|
31
|
+
solution?: undefined;
|
|
32
|
+
timeLimit?: undefined;
|
|
33
|
+
})[];
|
|
34
|
+
format: string;
|
|
35
|
+
timeLimit: number;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=captchas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captchas.d.ts","sourceRoot":"","sources":["../../../src/tests/data/captchas.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAu3BvB,CAAA"}
|