Skip to content

Commit ccfe6e5

Browse files
gfournierProLe-Caigneczguesmi
authored
feat: add view assets functions (#262)
Co-authored-by: Robin Le Caignec <[email protected]> Co-authored-by: Zied Guesmi <[email protected]>
1 parent 03c54bc commit ccfe6e5

File tree

10 files changed

+202
-35
lines changed

10 files changed

+202
-35
lines changed

contracts/facets/IexecPocoAccessorsFacet.sol

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import {PocoStorageLib, IRegistry} from "../libs/PocoStorageLib.v8.sol";
77
import {FacetBase} from "./FacetBase.v8.sol";
88
import {IexecLibCore_v5} from "../libs/IexecLibCore_v5.sol";
99
import {IexecLibOrders_v5} from "../libs/IexecLibOrders_v5.sol";
10+
import {IDataset} from "../registries/datasets/IDataset.v8.sol";
11+
import {IApp} from "../registries/apps/IApp.v8.sol";
12+
import {IWorkerpool} from "../registries/workerpools/IWorkerpool.v8.sol";
1013
import {IexecPocoAccessors} from "../interfaces/IexecPocoAccessors.sol";
1114
import {IexecPocoCommon} from "./IexecPocoCommon.sol";
1215
import {SignatureVerifier} from "./SignatureVerifier.v8.sol";
@@ -196,6 +199,51 @@ contract IexecPocoAccessorsFacet is
196199
return $.m_callbackgas;
197200
}
198201

202+
// ========= Dataset Accessors =========
203+
204+
function viewDataset(
205+
address dataset
206+
) external view returns (IexecLibCore_v5.DatasetInfo memory) {
207+
IDataset datasetContract = IDataset(dataset);
208+
return
209+
IexecLibCore_v5.DatasetInfo({
210+
owner: datasetContract.owner(),
211+
m_datasetName: datasetContract.m_datasetName(),
212+
m_datasetMultiaddr: datasetContract.m_datasetMultiaddr(),
213+
m_datasetChecksum: datasetContract.m_datasetChecksum()
214+
});
215+
}
216+
217+
// ========= App Accessors =========
218+
219+
function viewApp(address app) external view returns (IexecLibCore_v5.AppInfo memory) {
220+
IApp appContract = IApp(app);
221+
return
222+
IexecLibCore_v5.AppInfo({
223+
owner: appContract.owner(),
224+
m_appName: appContract.m_appName(),
225+
m_appType: appContract.m_appType(),
226+
m_appMultiaddr: appContract.m_appMultiaddr(),
227+
m_appChecksum: appContract.m_appChecksum(),
228+
m_appMREnclave: appContract.m_appMREnclave()
229+
});
230+
}
231+
232+
// ========= Workerpool Accessors =========
233+
234+
function viewWorkerpool(
235+
address workerpool
236+
) external view returns (IexecLibCore_v5.WorkerpoolInfo memory) {
237+
IWorkerpool workerpoolContract = IWorkerpool(workerpool);
238+
return
239+
IexecLibCore_v5.WorkerpoolInfo({
240+
owner: workerpoolContract.owner(),
241+
m_workerpoolDescription: workerpoolContract.m_workerpoolDescription(),
242+
m_workerStakeRatioPolicy: workerpoolContract.m_workerStakeRatioPolicy(),
243+
m_schedulerRewardRatioPolicy: workerpoolContract.m_schedulerRewardRatioPolicy()
244+
});
245+
}
246+
199247
// ========= Constants Accessors =========
200248

201249
function contribution_deadline_ratio() external pure returns (uint256) {

contracts/interfaces/IexecAccessors.sol

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,17 @@ interface IexecAccessors is IOracle {
4646
function kitty_address() external view returns (address);
4747
function groupmember_purpose() external view returns (uint256);
4848
function eip712domain_separator() external view returns (bytes32);
49+
50+
// ========= Dataset Accessors =========
51+
function viewDataset(
52+
address dataset
53+
) external view returns (IexecLibCore_v5.DatasetInfo memory);
54+
55+
// ========= App Accessors =========
56+
function viewApp(address app) external view returns (IexecLibCore_v5.AppInfo memory);
57+
58+
// ========= Workerpool Accessors =========
59+
function viewWorkerpool(
60+
address workerpool
61+
) external view returns (IexecLibCore_v5.WorkerpoolInfo memory);
4962
}

contracts/interfaces/IexecPocoAccessors.sol

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,19 @@ interface IexecPocoAccessors {
5555
function teebroker() external view returns (address);
5656
function callbackgas() external view returns (uint256);
5757

58+
// ========= Dataset Accessors =========
59+
function viewDataset(
60+
address dataset
61+
) external view returns (IexecLibCore_v5.DatasetInfo memory);
62+
63+
// ========= App Accessors =========
64+
function viewApp(address app) external view returns (IexecLibCore_v5.AppInfo memory);
65+
66+
// ========= Workerpool Accessors =========
67+
function viewWorkerpool(
68+
address workerpool
69+
) external view returns (IexecLibCore_v5.WorkerpoolInfo memory);
70+
5871
// ========= Constants Accessors =========
5972
function contribution_deadline_ratio() external view returns (uint256);
6073
function reveal_deadline_ratio() external view returns (uint256);

contracts/libs/IexecLibCore_v5.sol

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,28 @@ library IexecLibCore_v5 {
1616
string description;
1717
uint256 workClockTimeRef;
1818
}
19+
struct DatasetInfo {
20+
address owner;
21+
string m_datasetName;
22+
bytes m_datasetMultiaddr;
23+
bytes32 m_datasetChecksum;
24+
}
25+
26+
struct AppInfo {
27+
address owner;
28+
string m_appName;
29+
string m_appType;
30+
bytes m_appMultiaddr;
31+
bytes32 m_appChecksum;
32+
bytes m_appMREnclave;
33+
}
34+
35+
struct WorkerpoolInfo {
36+
address owner;
37+
string m_workerpoolDescription;
38+
uint256 m_workerStakeRatioPolicy;
39+
uint256 m_schedulerRewardRatioPolicy;
40+
}
1941

2042
/**
2143
* Clerk - Deals
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// SPDX-FileCopyrightText: 2023-2025 IEXEC BLOCKCHAIN TECH <[email protected]>
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
pragma solidity ^0.8.0;
5+
interface IApp {
6+
function owner() external view returns (address);
7+
function m_appName() external view returns (string memory);
8+
function m_appType() external view returns (string memory);
9+
function m_appMultiaddr() external view returns (bytes memory);
10+
function m_appChecksum() external view returns (bytes32);
11+
function m_appMREnclave() external view returns (bytes memory);
12+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// SPDX-FileCopyrightText: 2023-2025 IEXEC BLOCKCHAIN TECH <[email protected]>
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
pragma solidity ^0.8.0;
5+
interface IDataset {
6+
function owner() external view returns (address);
7+
function m_datasetName() external view returns (string memory);
8+
function m_datasetMultiaddr() external view returns (bytes memory);
9+
function m_datasetChecksum() external view returns (bytes32);
10+
}

contracts/registries/workerpools/IWorkerpool.v8.sol

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
pragma solidity ^0.8.0;
55

66
interface IWorkerpool {
7-
function m_schedulerRewardRatioPolicy() external returns (uint256);
8-
9-
function m_workerStakeRatioPolicy() external returns (uint256);
7+
function owner() external view returns (address);
8+
function m_workerpoolDescription() external view returns (string memory);
9+
function m_schedulerRewardRatioPolicy() external view returns (uint256);
10+
function m_workerStakeRatioPolicy() external view returns (uint256);
1011
}

scripts/upgrades/accessors/deploy-and-update-accessor-facet.ts

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import { printFunctions } from '../upgrade-helper';
3939

4040
// Use impersonated signer only for fork testing, otherwise use account signer
4141
const proxyOwnerSigner =
42-
process.env.ARBITRUM_FORK === 'true'
42+
process.env.ARBITRUM_FORK === 'true' || process.env.ARBITRUM_SEPOLIA_FORK === 'true'
4343
? await ethers.getImpersonatedSigner(proxyOwnerAddress)
4444
: account;
4545
const diamondProxyAsOwner = DiamondCutFacet__factory.connect(
@@ -73,27 +73,31 @@ import { printFunctions } from '../upgrade-helper';
7373
await printFunctions(diamondProxyAddress);
7474

7575
const removalCuts: IDiamond.FacetCutStruct[] = [];
76-
const constantFunctionSignatures = [
77-
'CONTRIBUTION_DEADLINE_RATIO()',
78-
'FINAL_DEADLINE_RATIO()',
79-
'GROUPMEMBER_PURPOSE()',
80-
'KITTY_ADDRESS()',
81-
'KITTY_MIN()',
82-
'KITTY_RATIO()',
83-
'REVEAL_DEADLINE_RATIO()',
84-
'WORKERPOOL_STAKE_RATIO()',
85-
];
86-
const constantFunctionsToRemove = constantFunctionSignatures.map((sig) =>
87-
ethers.id(sig).slice(0, 10),
88-
);
89-
console.log(
90-
`Removing specific constant functions from diamond Proxy - will remove ${constantFunctionsToRemove.length} specific constant functions`,
91-
);
92-
removalCuts.push({
93-
facetAddress: ZeroAddress,
94-
action: FacetCutAction.Remove,
95-
functionSelectors: constantFunctionsToRemove,
96-
});
76+
77+
// constant functions are deployed within IexecAccessorsFacet on arbitrum sepolia
78+
if (process.env.ARBITRUM_FORK === 'true' || chainId == 42161n) {
79+
const constantFunctionSignatures = [
80+
'CONTRIBUTION_DEADLINE_RATIO()',
81+
'FINAL_DEADLINE_RATIO()',
82+
'GROUPMEMBER_PURPOSE()',
83+
'KITTY_ADDRESS()',
84+
'KITTY_MIN()',
85+
'KITTY_RATIO()',
86+
'REVEAL_DEADLINE_RATIO()',
87+
'WORKERPOOL_STAKE_RATIO()',
88+
];
89+
const constantFunctionsToRemove = constantFunctionSignatures.map((sig) =>
90+
ethers.id(sig).slice(0, 10),
91+
);
92+
console.log(
93+
`Removing specific constant functions from diamond Proxy - will remove ${constantFunctionsToRemove.length} specific constant functions`,
94+
);
95+
removalCuts.push({
96+
facetAddress: ZeroAddress,
97+
action: FacetCutAction.Remove,
98+
functionSelectors: constantFunctionsToRemove,
99+
});
100+
}
97101

98102
const oldAccessorFacets = [
99103
'0xEa232be31ab0112916505Aeb7A2a94b5571DCc6b', //IexecAccessorsFacet

test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,23 @@ import {
2626
getIexecAccounts,
2727
getTaskId,
2828
} from '../../../utils/poco-tools';
29-
import { IexecWrapper } from '../../utils/IexecWrapper';
29+
import {
30+
APP_CHECKSUM,
31+
APP_MR_ENCLAVE,
32+
APP_MULTIADDR,
33+
DATASET_CHECKSUM,
34+
DATASET_MULTIADDR,
35+
IexecWrapper,
36+
} from '../../utils/IexecWrapper';
3037
import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer';
3138
import { hashDomain, randomAddress } from '../../utils/utils';
3239

3340
/**
3441
* Test state view functions.
3542
*/
3643

44+
// Asset test data constants
45+
3746
const appPrice = 1000n;
3847
const datasetPrice = 1_000_000n;
3948
const workerpoolPrice = 1_000_000_000n;
@@ -243,6 +252,32 @@ describe('IexecPocoAccessors', async () => {
243252
expect(await iexecPoco.callbackgas()).to.equal(100_000n);
244253
});
245254

255+
it('viewDataset', async function () {
256+
const datasetInfo = await iexecPoco.viewDataset(datasetAddress);
257+
expect(datasetInfo.owner).to.equal(datasetProvider.address);
258+
expect(datasetInfo.m_datasetName).to.equal('my-dataset');
259+
expect(datasetInfo.m_datasetMultiaddr).to.equal(DATASET_MULTIADDR);
260+
expect(datasetInfo.m_datasetChecksum).to.equal(DATASET_CHECKSUM);
261+
});
262+
263+
it('viewApp', async function () {
264+
const appInfo = await iexecPoco.viewApp(appAddress);
265+
expect(appInfo.owner).to.equal(appProvider.address);
266+
expect(appInfo.m_appName).to.equal('my-app');
267+
expect(appInfo.m_appType).to.equal('APP_TYPE_0');
268+
expect(appInfo.m_appMultiaddr).to.equal(APP_MULTIADDR);
269+
expect(appInfo.m_appChecksum).to.equal(APP_CHECKSUM);
270+
expect(appInfo.m_appMREnclave).to.equal(APP_MR_ENCLAVE);
271+
});
272+
273+
it('viewWorkerpool', async function () {
274+
const workerpoolInfo = await iexecPoco.viewWorkerpool(workerpoolAddress);
275+
expect(workerpoolInfo.owner).to.equal(scheduler.address);
276+
expect(workerpoolInfo.m_workerpoolDescription).to.equal('my-workerpool');
277+
expect(workerpoolInfo.m_workerStakeRatioPolicy).to.equal(30n);
278+
expect(workerpoolInfo.m_schedulerRewardRatioPolicy).to.equal(1n);
279+
});
280+
246281
it('contributionDeadlineRatio', async function () {
247282
expect(await iexecPoco.contribution_deadline_ratio()).to.equal(7);
248283
});

test/utils/IexecWrapper.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import {
1010
Interface,
1111
TypedDataDomain,
1212
ZeroAddress,
13-
ZeroHash,
1413
} from 'ethers';
1514
import hre, { ethers } from 'hardhat';
1615
import {
1716
AppRegistry,
1817
AppRegistry__factory,
1918
DatasetRegistry,
2019
DatasetRegistry__factory,
20+
IWorkerpool__factory,
2121
IexecAccessors__factory,
2222
IexecConfigurationFacet__factory,
2323
IexecInterfaceNative__factory,
@@ -29,7 +29,6 @@ import {
2929
Registry__factory,
3030
WorkerpoolRegistry,
3131
WorkerpoolRegistry__factory,
32-
Workerpool__factory,
3332
} from '../../typechain';
3433
import { TransferEvent } from '../../typechain/contracts/registries/IRegistry';
3534
import { IexecPoco1__factory } from '../../typechain/factories/contracts/interfaces/IexecPoco1.v8.sol/IexecPoco1__factory';
@@ -52,6 +51,12 @@ import {
5251
setNextBlockTimestamp,
5352
} from '../../utils/poco-tools';
5453

54+
export const APP_MULTIADDR = '0x68656c6c6f20776f726c64'; // "hello world" in hex
55+
export const APP_CHECKSUM = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef';
56+
export const APP_MR_ENCLAVE = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890';
57+
export const DATASET_MULTIADDR = '0x646174617365742064617461'; // "dataset data" in hex
58+
export const DATASET_CHECKSUM =
59+
'0xfedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321';
5560
export class IexecWrapper {
5661
proxyAddress: string;
5762
accounts: IexecAccounts;
@@ -129,8 +134,7 @@ export class IexecWrapper {
129134
* @returns value of worker stake
130135
*/
131136
async computeWorkerTaskStake(workerpoolAddress: string, workerpoolPrice: bigint) {
132-
// TODO make "m_workerStakeRatioPolicy()" as view function in IWorkerpool.v8 and use it.
133-
const workerStakeRatio = await Workerpool__factory.connect(
137+
const workerStakeRatio = await IWorkerpool__factory.connect(
134138
workerpoolAddress,
135139
this.accounts.anyone,
136140
).m_workerStakeRatioPolicy();
@@ -143,7 +147,7 @@ export class IexecWrapper {
143147
* @returns value of the reward
144148
*/
145149
async getSchedulerRewardRatio(workerpoolAddress: string) {
146-
return await Workerpool__factory.connect(
150+
return await IWorkerpool__factory.connect(
147151
workerpoolAddress,
148152
this.accounts.anyone,
149153
).m_schedulerRewardRatioPolicy();
@@ -302,9 +306,9 @@ export class IexecWrapper {
302306
this.accounts.appProvider.address,
303307
'my-app',
304308
'APP_TYPE_0',
305-
ZeroHash,
306-
ZeroHash,
307-
ZeroHash,
309+
APP_MULTIADDR,
310+
APP_CHECKSUM,
311+
APP_MR_ENCLAVE,
308312
)
309313
.then((tx) => tx.wait());
310314
return await extractRegistryEntryAddress(appReceipt);
@@ -317,7 +321,12 @@ export class IexecWrapper {
317321
this.accounts.datasetProvider,
318322
);
319323
const datasetReceipt = await datasetRegistry
320-
.createDataset(this.accounts.datasetProvider.address, 'my-dataset', ZeroHash, ZeroHash)
324+
.createDataset(
325+
this.accounts.datasetProvider.address,
326+
'my-dataset',
327+
DATASET_MULTIADDR,
328+
DATASET_CHECKSUM,
329+
)
321330
.then((tx) => tx.wait());
322331
return await extractRegistryEntryAddress(datasetReceipt);
323332
}

0 commit comments

Comments
 (0)