Skip to content

Commit 266c736

Browse files
Test calls on datapool
1 parent 46b53f5 commit 266c736

File tree

4 files changed

+137
-0
lines changed

4 files changed

+137
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// SPDX-FileCopyrightText: 2023-2024 IEXEC BLOCKCHAIN TECH <[email protected]>
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
pragma solidity ^0.8.0;
5+
6+
contract Datapool {
7+
event DatasetAdded(address dataset, uint256 versionId, uint256 datasetCount);
8+
event DatasetRemoved(address dataset, uint256 versionId, uint256 datasetCount);
9+
10+
uint256 public versionId;
11+
mapping(address dataset => uint256 addedVersionId) public addedVersionId;
12+
address[] public datasets;
13+
mapping(address dataset => uint256 index) public datasetIndexes;
14+
15+
constructor() {}
16+
17+
function datasetCount() external view returns (uint256) {
18+
return datasets.length;
19+
}
20+
21+
function addDataset(address dataset) external {
22+
versionId++;
23+
datasets.push(dataset);
24+
datasetIndexes[dataset] = datasets.length;
25+
addedVersionId[dataset] = versionId;
26+
emit DatasetAdded(dataset, versionId, datasets.length);
27+
}
28+
29+
function removeDataset(address removedDataset) external {
30+
versionId++;
31+
uint256 removedDatasetIndex = datasetIndexes[removedDataset];
32+
address movingDataset = datasets[datasets.length - 1];
33+
datasets[removedDatasetIndex] = movingDataset; // move last dataset to removed index slot
34+
datasetIndexes[movingDataset] = removedDatasetIndex;
35+
datasets.pop(); // removed already moved dataset
36+
datasetIndexes[removedDataset] = 0;
37+
addedVersionId[removedDataset] = 0;
38+
emit DatasetRemoved(removedDataset, versionId, datasets.length);
39+
}
40+
}

package-lock.json

Lines changed: 34 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
"@nomiclabs/hardhat-web3": "^2.0.0",
6060
"@openzeppelin/test-helpers": "^0.5.16",
6161
"@openzeppelin/upgrades-core": "^1.37.1",
62+
"ethers-multicall-provider": "^3.1.2",
6263
"hardhat": "^2.14.1",
6364
"hardhat-dependency-compiler": "^1.2.1",
6465
"hardhat-deploy": "^0.11.43",

scripts/deploy-datapool.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import { MulticallWrapper } from 'ethers-multicall-provider';
2+
import { ethers } from 'hardhat';
3+
import { Datapool, Datapool__factory } from '../typechain';
4+
5+
(async () => {
6+
await deploy();
7+
})();
8+
9+
export async function deploy() {
10+
console.log('Deploying datapool..');
11+
const [deployer] = await ethers.getSigners();
12+
console.log(`Deployer: ${deployer.address}`);
13+
const datapoolAddress = await new Datapool__factory(deployer)
14+
.deploy()
15+
.then((tx) => tx.deployed())
16+
.then((contract) => contract.address);
17+
console.log(`Datapool: ${datapoolAddress}`);
18+
// const provider = ethers.getDefaultProvider();
19+
const provider = MulticallWrapper.wrap(ethers.getDefaultProvider());
20+
// ethers might already use batch-calls provider internally, lets force one
21+
console.log(`Using batch-calls provider ${MulticallWrapper.isMulticallProvider(provider)}`);
22+
let datapool = new ethers.Contract(
23+
datapoolAddress,
24+
new Datapool__factory().interface,
25+
provider,
26+
).connect(deployer) as Datapool;
27+
28+
const datasets = 5;
29+
await addDatasets(datasets);
30+
await getDatasets();
31+
32+
async function addDatasets(datasets: number) {
33+
console.log('From dataset providers:');
34+
console.log(`Requested ${datasets} datasets`);
35+
const addDatasetCalls = [];
36+
for (let i = 0; i < datasets; i++) {
37+
const datasetAddress = await ethers.Wallet.createRandom().getAddress();
38+
addDatasetCalls.push(datapool.addDataset(datasetAddress));
39+
process.stdout.write(`Preparing datasets: ${i + 1}.. \r`);
40+
}
41+
await Promise.all(addDatasetCalls);
42+
const datasetsCount = Number(await datapool.datasetCount());
43+
console.log();
44+
console.log(`Datasets added`);
45+
console.log(`Dataset count is now: ${datasetsCount}`);
46+
}
47+
48+
async function getDatasets() {
49+
console.log('From SMS:');
50+
const start = new Date().getTime();
51+
const datasetsCount = Number(await datapool.datasetCount());
52+
const getDatasetCalls = [];
53+
for (let i = 0; i < datasetsCount; i++) {
54+
getDatasetCalls.push(datapool.datasets(i));
55+
}
56+
const allDatasets = await Promise.all(getDatasetCalls);
57+
console.log(allDatasets);
58+
console.log(`Dataset found: ${allDatasets.length}`);
59+
const end = new Date().getTime();
60+
console.log(`Took ${end - start}ms`);
61+
}
62+
}

0 commit comments

Comments
 (0)