diff --git a/contracts/facets/IexecPocoAccessorsFacet.sol b/contracts/facets/IexecPocoAccessorsFacet.sol index 4c3426c94..9377ecf13 100644 --- a/contracts/facets/IexecPocoAccessorsFacet.sol +++ b/contracts/facets/IexecPocoAccessorsFacet.sol @@ -7,6 +7,9 @@ import {PocoStorageLib, IRegistry} from "../libs/PocoStorageLib.v8.sol"; import {FacetBase} from "./FacetBase.v8.sol"; import {IexecLibCore_v5} from "../libs/IexecLibCore_v5.sol"; import {IexecLibOrders_v5} from "../libs/IexecLibOrders_v5.sol"; +import {IDataset} from "../registries/datasets/IDataset.v8.sol"; +import {IApp} from "../registries/apps/IApp.v8.sol"; +import {IWorkerpool} from "../registries/workerpools/IWorkerpool.v8.sol"; import {IexecPocoAccessors} from "../interfaces/IexecPocoAccessors.sol"; import {IexecPocoCommon} from "./IexecPocoCommon.sol"; import {SignatureVerifier} from "./SignatureVerifier.v8.sol"; @@ -196,6 +199,51 @@ contract IexecPocoAccessorsFacet is return $.m_callbackgas; } + // ========= Dataset Accessors ========= + + function viewDataset( + address dataset + ) external view returns (IexecLibCore_v5.DatasetInfo memory) { + IDataset datasetContract = IDataset(dataset); + return + IexecLibCore_v5.DatasetInfo({ + owner: datasetContract.owner(), + m_datasetName: datasetContract.m_datasetName(), + m_datasetMultiaddr: datasetContract.m_datasetMultiaddr(), + m_datasetChecksum: datasetContract.m_datasetChecksum() + }); + } + + // ========= App Accessors ========= + + function viewApp(address app) external view returns (IexecLibCore_v5.AppInfo memory) { + IApp appContract = IApp(app); + return + IexecLibCore_v5.AppInfo({ + owner: appContract.owner(), + m_appName: appContract.m_appName(), + m_appType: appContract.m_appType(), + m_appMultiaddr: appContract.m_appMultiaddr(), + m_appChecksum: appContract.m_appChecksum(), + m_appMREnclave: appContract.m_appMREnclave() + }); + } + + // ========= Workerpool Accessors ========= + + function viewWorkerpool( + address workerpool + ) external view returns (IexecLibCore_v5.WorkerpoolInfo memory) { + IWorkerpool workerpoolContract = IWorkerpool(workerpool); + return + IexecLibCore_v5.WorkerpoolInfo({ + owner: workerpoolContract.owner(), + m_workerpoolDescription: workerpoolContract.m_workerpoolDescription(), + m_workerStakeRatioPolicy: workerpoolContract.m_workerStakeRatioPolicy(), + m_schedulerRewardRatioPolicy: workerpoolContract.m_schedulerRewardRatioPolicy() + }); + } + // ========= Constants Accessors ========= function contribution_deadline_ratio() external pure returns (uint256) { diff --git a/contracts/interfaces/IexecAccessors.sol b/contracts/interfaces/IexecAccessors.sol index 337e2406d..1c0bf0045 100644 --- a/contracts/interfaces/IexecAccessors.sol +++ b/contracts/interfaces/IexecAccessors.sol @@ -46,4 +46,17 @@ interface IexecAccessors is IOracle { function kitty_address() external view returns (address); function groupmember_purpose() external view returns (uint256); function eip712domain_separator() external view returns (bytes32); + + // ========= Dataset Accessors ========= + function viewDataset( + address dataset + ) external view returns (IexecLibCore_v5.DatasetInfo memory); + + // ========= App Accessors ========= + function viewApp(address app) external view returns (IexecLibCore_v5.AppInfo memory); + + // ========= Workerpool Accessors ========= + function viewWorkerpool( + address workerpool + ) external view returns (IexecLibCore_v5.WorkerpoolInfo memory); } diff --git a/contracts/interfaces/IexecPocoAccessors.sol b/contracts/interfaces/IexecPocoAccessors.sol index 09593f881..01dd4c61d 100644 --- a/contracts/interfaces/IexecPocoAccessors.sol +++ b/contracts/interfaces/IexecPocoAccessors.sol @@ -55,6 +55,19 @@ interface IexecPocoAccessors { function teebroker() external view returns (address); function callbackgas() external view returns (uint256); + // ========= Dataset Accessors ========= + function viewDataset( + address dataset + ) external view returns (IexecLibCore_v5.DatasetInfo memory); + + // ========= App Accessors ========= + function viewApp(address app) external view returns (IexecLibCore_v5.AppInfo memory); + + // ========= Workerpool Accessors ========= + function viewWorkerpool( + address workerpool + ) external view returns (IexecLibCore_v5.WorkerpoolInfo memory); + // ========= Constants Accessors ========= function contribution_deadline_ratio() external view returns (uint256); function reveal_deadline_ratio() external view returns (uint256); diff --git a/contracts/libs/IexecLibCore_v5.sol b/contracts/libs/IexecLibCore_v5.sol index edf566315..a32c551c0 100644 --- a/contracts/libs/IexecLibCore_v5.sol +++ b/contracts/libs/IexecLibCore_v5.sol @@ -16,6 +16,28 @@ library IexecLibCore_v5 { string description; uint256 workClockTimeRef; } + struct DatasetInfo { + address owner; + string m_datasetName; + bytes m_datasetMultiaddr; + bytes32 m_datasetChecksum; + } + + struct AppInfo { + address owner; + string m_appName; + string m_appType; + bytes m_appMultiaddr; + bytes32 m_appChecksum; + bytes m_appMREnclave; + } + + struct WorkerpoolInfo { + address owner; + string m_workerpoolDescription; + uint256 m_workerStakeRatioPolicy; + uint256 m_schedulerRewardRatioPolicy; + } /** * Clerk - Deals diff --git a/contracts/registries/apps/IApp.v8.sol b/contracts/registries/apps/IApp.v8.sol new file mode 100644 index 000000000..2be83f8fb --- /dev/null +++ b/contracts/registries/apps/IApp.v8.sol @@ -0,0 +1,12 @@ +// SPDX-FileCopyrightText: 2023-2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.0; +interface IApp { + function owner() external view returns (address); + function m_appName() external view returns (string memory); + function m_appType() external view returns (string memory); + function m_appMultiaddr() external view returns (bytes memory); + function m_appChecksum() external view returns (bytes32); + function m_appMREnclave() external view returns (bytes memory); +} diff --git a/contracts/registries/datasets/IDataset.v8.sol b/contracts/registries/datasets/IDataset.v8.sol new file mode 100644 index 000000000..d6ede1f9e --- /dev/null +++ b/contracts/registries/datasets/IDataset.v8.sol @@ -0,0 +1,10 @@ +// SPDX-FileCopyrightText: 2023-2025 IEXEC BLOCKCHAIN TECH +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.0; +interface IDataset { + function owner() external view returns (address); + function m_datasetName() external view returns (string memory); + function m_datasetMultiaddr() external view returns (bytes memory); + function m_datasetChecksum() external view returns (bytes32); +} diff --git a/contracts/registries/workerpools/IWorkerpool.v8.sol b/contracts/registries/workerpools/IWorkerpool.v8.sol index 4d428a550..b86f452fd 100644 --- a/contracts/registries/workerpools/IWorkerpool.v8.sol +++ b/contracts/registries/workerpools/IWorkerpool.v8.sol @@ -4,7 +4,8 @@ pragma solidity ^0.8.0; interface IWorkerpool { - function m_schedulerRewardRatioPolicy() external returns (uint256); - - function m_workerStakeRatioPolicy() external returns (uint256); + function owner() external view returns (address); + function m_workerpoolDescription() external view returns (string memory); + function m_schedulerRewardRatioPolicy() external view returns (uint256); + function m_workerStakeRatioPolicy() external view returns (uint256); } diff --git a/scripts/upgrades/accessors/deploy-and-update-accessor-facet.ts b/scripts/upgrades/accessors/deploy-and-update-accessor-facet.ts index bb21614aa..f94e2c435 100644 --- a/scripts/upgrades/accessors/deploy-and-update-accessor-facet.ts +++ b/scripts/upgrades/accessors/deploy-and-update-accessor-facet.ts @@ -39,7 +39,7 @@ import { printFunctions } from '../upgrade-helper'; // Use impersonated signer only for fork testing, otherwise use account signer const proxyOwnerSigner = - process.env.ARBITRUM_FORK === 'true' + process.env.ARBITRUM_FORK === 'true' || process.env.ARBITRUM_SEPOLIA_FORK === 'true' ? await ethers.getImpersonatedSigner(proxyOwnerAddress) : account; const diamondProxyAsOwner = DiamondCutFacet__factory.connect( @@ -73,27 +73,31 @@ import { printFunctions } from '../upgrade-helper'; await printFunctions(diamondProxyAddress); const removalCuts: IDiamond.FacetCutStruct[] = []; - const constantFunctionSignatures = [ - 'CONTRIBUTION_DEADLINE_RATIO()', - 'FINAL_DEADLINE_RATIO()', - 'GROUPMEMBER_PURPOSE()', - 'KITTY_ADDRESS()', - 'KITTY_MIN()', - 'KITTY_RATIO()', - 'REVEAL_DEADLINE_RATIO()', - 'WORKERPOOL_STAKE_RATIO()', - ]; - const constantFunctionsToRemove = constantFunctionSignatures.map((sig) => - ethers.id(sig).slice(0, 10), - ); - console.log( - `Removing specific constant functions from diamond Proxy - will remove ${constantFunctionsToRemove.length} specific constant functions`, - ); - removalCuts.push({ - facetAddress: ZeroAddress, - action: FacetCutAction.Remove, - functionSelectors: constantFunctionsToRemove, - }); + + // constant functions are deployed within IexecAccessorsFacet on arbitrum sepolia + if (process.env.ARBITRUM_FORK === 'true' || chainId == 42161n) { + const constantFunctionSignatures = [ + 'CONTRIBUTION_DEADLINE_RATIO()', + 'FINAL_DEADLINE_RATIO()', + 'GROUPMEMBER_PURPOSE()', + 'KITTY_ADDRESS()', + 'KITTY_MIN()', + 'KITTY_RATIO()', + 'REVEAL_DEADLINE_RATIO()', + 'WORKERPOOL_STAKE_RATIO()', + ]; + const constantFunctionsToRemove = constantFunctionSignatures.map((sig) => + ethers.id(sig).slice(0, 10), + ); + console.log( + `Removing specific constant functions from diamond Proxy - will remove ${constantFunctionsToRemove.length} specific constant functions`, + ); + removalCuts.push({ + facetAddress: ZeroAddress, + action: FacetCutAction.Remove, + functionSelectors: constantFunctionsToRemove, + }); + } const oldAccessorFacets = [ '0xEa232be31ab0112916505Aeb7A2a94b5571DCc6b', //IexecAccessorsFacet diff --git a/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts b/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts index a6238244c..f88951231 100644 --- a/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts +++ b/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts @@ -26,7 +26,14 @@ import { getIexecAccounts, getTaskId, } from '../../../utils/poco-tools'; -import { IexecWrapper } from '../../utils/IexecWrapper'; +import { + APP_CHECKSUM, + APP_MR_ENCLAVE, + APP_MULTIADDR, + DATASET_CHECKSUM, + DATASET_MULTIADDR, + IexecWrapper, +} from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; import { hashDomain, randomAddress } from '../../utils/utils'; @@ -34,6 +41,8 @@ import { hashDomain, randomAddress } from '../../utils/utils'; * Test state view functions. */ +// Asset test data constants + const appPrice = 1000n; const datasetPrice = 1_000_000n; const workerpoolPrice = 1_000_000_000n; @@ -243,6 +252,32 @@ describe('IexecPocoAccessors', async () => { expect(await iexecPoco.callbackgas()).to.equal(100_000n); }); + it('viewDataset', async function () { + const datasetInfo = await iexecPoco.viewDataset(datasetAddress); + expect(datasetInfo.owner).to.equal(datasetProvider.address); + expect(datasetInfo.m_datasetName).to.equal('my-dataset'); + expect(datasetInfo.m_datasetMultiaddr).to.equal(DATASET_MULTIADDR); + expect(datasetInfo.m_datasetChecksum).to.equal(DATASET_CHECKSUM); + }); + + it('viewApp', async function () { + const appInfo = await iexecPoco.viewApp(appAddress); + expect(appInfo.owner).to.equal(appProvider.address); + expect(appInfo.m_appName).to.equal('my-app'); + expect(appInfo.m_appType).to.equal('APP_TYPE_0'); + expect(appInfo.m_appMultiaddr).to.equal(APP_MULTIADDR); + expect(appInfo.m_appChecksum).to.equal(APP_CHECKSUM); + expect(appInfo.m_appMREnclave).to.equal(APP_MR_ENCLAVE); + }); + + it('viewWorkerpool', async function () { + const workerpoolInfo = await iexecPoco.viewWorkerpool(workerpoolAddress); + expect(workerpoolInfo.owner).to.equal(scheduler.address); + expect(workerpoolInfo.m_workerpoolDescription).to.equal('my-workerpool'); + expect(workerpoolInfo.m_workerStakeRatioPolicy).to.equal(30n); + expect(workerpoolInfo.m_schedulerRewardRatioPolicy).to.equal(1n); + }); + it('contributionDeadlineRatio', async function () { expect(await iexecPoco.contribution_deadline_ratio()).to.equal(7); }); diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 5370fdeeb..2674eb96f 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -10,7 +10,6 @@ import { Interface, TypedDataDomain, ZeroAddress, - ZeroHash, } from 'ethers'; import hre, { ethers } from 'hardhat'; import { @@ -18,6 +17,7 @@ import { AppRegistry__factory, DatasetRegistry, DatasetRegistry__factory, + IWorkerpool__factory, IexecAccessors__factory, IexecConfigurationFacet__factory, IexecInterfaceNative__factory, @@ -29,7 +29,6 @@ import { Registry__factory, WorkerpoolRegistry, WorkerpoolRegistry__factory, - Workerpool__factory, } from '../../typechain'; import { TransferEvent } from '../../typechain/contracts/registries/IRegistry'; import { IexecPoco1__factory } from '../../typechain/factories/contracts/interfaces/IexecPoco1.v8.sol/IexecPoco1__factory'; @@ -52,6 +51,12 @@ import { setNextBlockTimestamp, } from '../../utils/poco-tools'; +export const APP_MULTIADDR = '0x68656c6c6f20776f726c64'; // "hello world" in hex +export const APP_CHECKSUM = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef'; +export const APP_MR_ENCLAVE = '0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890'; +export const DATASET_MULTIADDR = '0x646174617365742064617461'; // "dataset data" in hex +export const DATASET_CHECKSUM = + '0xfedcba0987654321fedcba0987654321fedcba0987654321fedcba0987654321'; export class IexecWrapper { proxyAddress: string; accounts: IexecAccounts; @@ -129,8 +134,7 @@ export class IexecWrapper { * @returns value of worker stake */ async computeWorkerTaskStake(workerpoolAddress: string, workerpoolPrice: bigint) { - // TODO make "m_workerStakeRatioPolicy()" as view function in IWorkerpool.v8 and use it. - const workerStakeRatio = await Workerpool__factory.connect( + const workerStakeRatio = await IWorkerpool__factory.connect( workerpoolAddress, this.accounts.anyone, ).m_workerStakeRatioPolicy(); @@ -143,7 +147,7 @@ export class IexecWrapper { * @returns value of the reward */ async getSchedulerRewardRatio(workerpoolAddress: string) { - return await Workerpool__factory.connect( + return await IWorkerpool__factory.connect( workerpoolAddress, this.accounts.anyone, ).m_schedulerRewardRatioPolicy(); @@ -302,9 +306,9 @@ export class IexecWrapper { this.accounts.appProvider.address, 'my-app', 'APP_TYPE_0', - ZeroHash, - ZeroHash, - ZeroHash, + APP_MULTIADDR, + APP_CHECKSUM, + APP_MR_ENCLAVE, ) .then((tx) => tx.wait()); return await extractRegistryEntryAddress(appReceipt); @@ -317,7 +321,12 @@ export class IexecWrapper { this.accounts.datasetProvider, ); const datasetReceipt = await datasetRegistry - .createDataset(this.accounts.datasetProvider.address, 'my-dataset', ZeroHash, ZeroHash) + .createDataset( + this.accounts.datasetProvider.address, + 'my-dataset', + DATASET_MULTIADDR, + DATASET_CHECKSUM, + ) .then((tx) => tx.wait()); return await extractRegistryEntryAddress(datasetReceipt); }