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/deploy/0_deploy.ts b/deploy/0_deploy.ts index dcd9467d7..1d877b7e6 100644 --- a/deploy/0_deploy.ts +++ b/deploy/0_deploy.ts @@ -14,7 +14,6 @@ import { DiamondLoupeFacet__factory, Diamond__factory, IexecAccessorsABILegacyFacet__factory, - IexecAccessors__factory, IexecCategoryManagerFacet__factory, IexecCategoryManager__factory, IexecConfigurationExtraFacet__factory, @@ -27,6 +26,7 @@ import { IexecPoco1Facet__factory, IexecPoco2Facet__factory, IexecPocoAccessorsFacet__factory, + IexecPocoAccessors__factory, IexecPocoBoostAccessorsFacet__factory, IexecPocoBoostFacet__factory, IexecRelayFacet__factory, @@ -186,7 +186,10 @@ export default async function deploy() { } // Set main configuration - const iexecAccessorsInstance = IexecAccessors__factory.connect(diamondProxyAddress, deployer); + const iexecAccessorsInstance = IexecPocoAccessors__factory.connect( + diamondProxyAddress, + deployer, + ); const iexecInitialized = (await iexecAccessorsInstance.eip712domain_separator()) != ZeroHash; if (!iexecInitialized) { // TODO replace this with DiamondInit.init(). diff --git a/scripts/set-callback-gas.ts b/scripts/set-callback-gas.ts index 6ef0d5a07..f840e96df 100644 --- a/scripts/set-callback-gas.ts +++ b/scripts/set-callback-gas.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { deployments, ethers } from 'hardhat'; -import { IexecAccessors__factory, IexecConfigurationFacet__factory } from '../typechain'; +import { IexecConfigurationFacet__factory, IexecPocoAccessors__factory } from '../typechain'; (async () => { const requestedCallbackGas = Number(process.env.CALLBACK_GAS); @@ -14,7 +14,7 @@ import { IexecAccessors__factory, IexecConfigurationFacet__factory } from '../ty const [owner] = await ethers.getSigners(); const diamondProxyAddress = (await deployments.get('Diamond')).address; const viewCallbackGas = async () => - (await IexecAccessors__factory.connect(diamondProxyAddress, owner).callbackgas()) + (await IexecPocoAccessors__factory.connect(diamondProxyAddress, owner).callbackgas()) .toNumber() .toLocaleString(); const callbackGasBefore = await viewCallbackGas(); 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/000_fullchain-boost.test.ts b/test/000_fullchain-boost.test.ts index 3e006017e..d45d0bccc 100644 --- a/test/000_fullchain-boost.test.ts +++ b/test/000_fullchain-boost.test.ts @@ -7,9 +7,9 @@ import { expect } from 'chai'; import { TypedDataDomain } from 'ethers'; import hre from 'hardhat'; import { - IexecAccessors, - IexecAccessors__factory, IexecOrderManagement__factory, + IexecPocoAccessors, + IexecPocoAccessors__factory, IexecPocoBoostAccessorsFacet__factory, IexecPocoBoostFacet, IexecPocoBoostFacet__factory, @@ -50,7 +50,7 @@ const workerpoolPrice = 1_000_000_000n; describe('IexecPocoBoostFacet (IT)', function () { let domain: TypedDataDomain; let proxyAddress: string; - let iexecInstance: IexecAccessors; + let iexecInstance: IexecPocoAccessors; let iexecPocoBoostInstance: IexecPocoBoostFacet; let iexecWrapper: IexecWrapper; let appAddress = ''; @@ -88,7 +88,7 @@ describe('IexecPocoBoostFacet (IT)', function () { requester: requester, }; iexecPocoBoostInstance = IexecPocoBoostFacet__factory.connect(proxyAddress, owner); - iexecInstance = IexecAccessors__factory.connect(proxyAddress, anyone); + iexecInstance = IexecPocoAccessors__factory.connect(proxyAddress, anyone); domain = { name: 'iExecODB', version: '5.0.0', diff --git a/test/byContract/IexecPocoBoost/IexecPocoBoost.test.ts b/test/byContract/IexecPocoBoost/IexecPocoBoost.test.ts index a21a415f8..cd99577c4 100644 --- a/test/byContract/IexecPocoBoost/IexecPocoBoost.test.ts +++ b/test/byContract/IexecPocoBoost/IexecPocoBoost.test.ts @@ -14,12 +14,11 @@ import { GasWasterClient__factory, IERC721__factory, IOracleConsumer__factory, - IexecAccessors, - IexecAccessors__factory, IexecConfiguration, IexecConfiguration__factory, IexecOrderManagement__factory, IexecPoco2__factory, + IexecPocoAccessors, IexecPocoAccessors__factory, IexecPocoBoostAccessorsFacet__factory, IexecPocoBoostFacet, @@ -75,7 +74,7 @@ const randomEOAAddress = randomAddress(); let proxyAddress: string; let iexecPocoBoostInstance: IexecPocoBoostFacet; let iexecConfigurationAsAdmin: IexecConfiguration; -let iexecAccessor: IexecAccessors; +let iexecPocoAccessor: IexecPocoAccessors; let oracleConsumerInstance: TestClient; let gasWasterClientInstance: GasWasterClient; let gasWasterClientAddress: string; @@ -130,7 +129,7 @@ describe('IexecPocoBoost', function () { proxyAddress, accounts.iexecAdmin, ); - iexecAccessor = IexecAccessors__factory.connect(proxyAddress, ethers.provider); + iexecPocoAccessor = IexecPocoAccessors__factory.connect(proxyAddress, ethers.provider); ordersActors = { appOwner: appProvider, datasetOwner: datasetProvider, @@ -161,9 +160,9 @@ describe('IexecPocoBoost', function () { dataset: datasetPrice, workerpool: workerpoolPrice, }; - workerpoolStakeRatio = await iexecAccessor.workerpool_stake_ratio(); - kittyAddress = await iexecAccessor.kitty_address(); - categoryTime = (await iexecAccessor.viewCategory(category)).workClockTimeRef; + workerpoolStakeRatio = await iexecPocoAccessor.workerpool_stake_ratio(); + kittyAddress = await iexecPocoAccessor.kitty_address(); + categoryTime = (await iexecPocoAccessor.viewCategory(category)).workClockTimeRef; } describe('Match orders Boost', function () { @@ -286,7 +285,7 @@ describe('IexecPocoBoost', function () { // Check balances and frozens await expect(matchOrdersBoostTx).to.changeTokenBalances( - iexecAccessor, + iexecPocoAccessor, [proxyAddress, requester.address, scheduler.address], [ dealPrice + schedulerStake, // Poco proxy @@ -413,7 +412,7 @@ describe('IexecPocoBoost', function () { // Check balances and frozens await expect(sponsorMatchOrdersBoostTx).to.changeTokenBalances( - iexecAccessor, + iexecPocoAccessor, [proxyAddress, requester.address, sponsor.address, scheduler.address], [ dealPrice + schedulerStake, // Poco proxy @@ -526,13 +525,16 @@ describe('IexecPocoBoost', function () { requester: requester.address, }).toObject(); const erc1271Address = await deployErc1271MockContract(); - await IERC721__factory.connect(await iexecAccessor.appregistry(), appProvider) + await IERC721__factory.connect(await iexecPocoAccessor.appregistry(), appProvider) .transferFrom(appProvider.address, erc1271Address, appAddress) .then((tx) => tx.wait()); - await IERC721__factory.connect(await iexecAccessor.datasetregistry(), datasetProvider) + await IERC721__factory.connect( + await iexecPocoAccessor.datasetregistry(), + datasetProvider, + ) .transferFrom(datasetProvider.address, erc1271Address, datasetAddress) .then((tx) => tx.wait()); - await IERC721__factory.connect(await iexecAccessor.workerpoolregistry(), scheduler) + await IERC721__factory.connect(await iexecPocoAccessor.workerpoolregistry(), scheduler) .transferFrom(scheduler.address, erc1271Address, workerpoolAddress) .then((tx) => tx.wait()); requestOrder.requester = erc1271Address; @@ -1105,7 +1107,7 @@ describe('IexecPocoBoost', function () { it('Should fail when invalid app order signature from contract', async function () { const erc1271Address = await deployErc1271MockContract(); - await IERC721__factory.connect(await iexecAccessor.appregistry(), appProvider) + await IERC721__factory.connect(await iexecPocoAccessor.appregistry(), appProvider) .transferFrom(appProvider.address, erc1271Address, appAddress) .then((tx) => tx.wait()); const orders = buildOrders({ @@ -1150,7 +1152,10 @@ describe('IexecPocoBoost', function () { it('Should fail when invalid dataset order signature from contract', async function () { const erc1271Address = await deployErc1271MockContract(); - await IERC721__factory.connect(await iexecAccessor.datasetregistry(), datasetProvider) + await IERC721__factory.connect( + await iexecPocoAccessor.datasetregistry(), + datasetProvider, + ) .transferFrom(datasetProvider.address, erc1271Address, datasetAddress) .then((tx) => tx.wait()); const orders = buildOrders({ @@ -1197,7 +1202,7 @@ describe('IexecPocoBoost', function () { it('Should fail when invalid workerpool order signature from contract', async function () { const erc1271Address = await deployErc1271MockContract(); - await IERC721__factory.connect(await iexecAccessor.workerpoolregistry(), scheduler) + await IERC721__factory.connect(await iexecPocoAccessor.workerpoolregistry(), scheduler) .transferFrom(scheduler.address, erc1271Address, workerpoolAddress) .then((tx) => tx.wait()); const orders = buildOrders({ @@ -1268,7 +1273,7 @@ describe('IexecPocoBoost', function () { const initialRequesterBalance = 2n; await iexecWrapper.depositInIexecAccount(requester, initialRequesterBalance); - expect(await iexecAccessor.balanceOf(requester.address)).to.be.lessThan(dealPrice); + expect(await iexecPocoAccessor.balanceOf(requester.address)).to.be.lessThan(dealPrice); await signOrders(domain, orders, ordersActors); await expect( @@ -1293,9 +1298,13 @@ describe('IexecPocoBoost', function () { ); await iexecWrapper.depositInIexecAccount(scheduler, initialSchedulerBalance); // Make sure the tx does not fail because of requester's balance. - expect(await iexecAccessor.balanceOf(requester.address)).to.be.greaterThan(dealPrice); + expect(await iexecPocoAccessor.balanceOf(requester.address)).to.be.greaterThan( + dealPrice, + ); // Make sure the scheduler does not have enough to stake. - expect(await iexecAccessor.balanceOf(scheduler.address)).to.be.lessThan(schedulerStake); + expect(await iexecPocoAccessor.balanceOf(scheduler.address)).to.be.lessThan( + schedulerStake, + ); await signOrders(domain, orders, ordersActors); await expect( @@ -1312,7 +1321,7 @@ describe('IexecPocoBoost', function () { const initialSponsorBalance = 2n; await iexecWrapper.depositInIexecAccount(sponsor, initialSponsorBalance); - expect(await iexecAccessor.balanceOf(sponsor.address)).to.be.lessThan(dealPrice); + expect(await iexecPocoAccessor.balanceOf(sponsor.address)).to.be.lessThan(dealPrice); await signOrders(domain, orders, ordersActors); await expect( @@ -1350,7 +1359,7 @@ describe('IexecPocoBoost', function () { }).toArray(), ); await time.setNextBlockTimestamp( - (await iexecAccessor.viewDeal(kittyFillingDeal.dealId)).startTime + + (await iexecPocoAccessor.viewDeal(kittyFillingDeal.dealId)).startTime + 10n * categoryTime, ); await IexecPoco2__factory.connect(proxyAddress, anyone) @@ -1444,7 +1453,7 @@ describe('IexecPocoBoost', function () { .to.emit(iexecPocoBoostInstance, 'ResultPushedBoost') .withArgs(dealId, taskIndex, results); // Check task status - const task = await iexecAccessor.viewTask(taskId); + const task = await iexecPocoAccessor.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.COMPLETED); expect(task.dealid).to.equal(HashZero); expect(task.idx).to.equal(0); @@ -1462,7 +1471,7 @@ describe('IexecPocoBoost', function () { expect(task.resultsCallback).to.equal('0x'); // Check balances and frozens await expect(pushResultBoostTx).to.changeTokenBalances( - iexecAccessor, + iexecPocoAccessor, [ proxyAddress, requester.address, @@ -2041,7 +2050,7 @@ describe('IexecPocoBoost', function () { .connect(worker) .pushResultBoost.estimateGas(...pushResultArgs); const failingTxGaslimit = - successfulTxGasLimit - (await iexecAccessor.callbackgas()) / 63n; + successfulTxGasLimit - (await iexecPocoAccessor.callbackgas()) / 63n; // Forward to consumer contract less gas than it has the right to consume const pushResultBoost = iexecPocoBoostInstance @@ -2102,7 +2111,7 @@ describe('IexecPocoBoost', function () { .to.emit(iexecPocoBoostInstance, 'TaskClaimed') .withArgs(taskId); // Check task status - const task = await iexecAccessor.viewTask(taskId); + const task = await iexecPocoAccessor.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.FAILED); expect(task.dealid).to.equal(HashZero); expect(task.idx).to.equal(0); @@ -2120,7 +2129,7 @@ describe('IexecPocoBoost', function () { expect(task.resultsCallback).to.equal('0x'); // Check balances and frozens await expect(claimBoostTx).to.changeTokenBalances( - iexecAccessor, + iexecPocoAccessor, [proxyAddress, requester.address, scheduler.address], [ -taskPrice, // PoCo proxy @@ -2169,7 +2178,7 @@ describe('IexecPocoBoost', function () { // Verifications after claiming "claimedTasks" tasks. // Check balances and frozens await expect(claimBoostTx).to.changeTokenBalances( - iexecAccessor, + iexecPocoAccessor, [proxyAddress, requester.address, scheduler.address], [ -taskPrice, // PoCo proxy @@ -2238,10 +2247,12 @@ describe('IexecPocoBoost', function () { .withArgs(taskId); // Check task status - expect((await iexecAccessor.viewTask(taskId)).status).to.equal(TaskStatusEnum.FAILED); + expect((await iexecPocoAccessor.viewTask(taskId)).status).to.equal( + TaskStatusEnum.FAILED, + ); // Check balances and frozens await expect(claimBoostTx).to.changeTokenBalances( - iexecAccessor, + iexecPocoAccessor, [proxyAddress, requester.address, sponsor.address, scheduler.address], [ -taskPrice, // PoCo proxy @@ -2392,7 +2403,10 @@ async function whenIdentityContractCalledForCandidateInGroupThenReturnTrue( candidate: string, ) { await erc734IdentityContractInstance - .setKeyHasPurpose(addressToBytes32(candidate), await iexecAccessor.groupmember_purpose()) + .setKeyHasPurpose( + addressToBytes32(candidate), + await iexecPocoAccessor.groupmember_purpose(), + ) .then((tx) => tx.wait()); } @@ -2431,11 +2445,11 @@ function computeSchedulerDealStake(workerpoolPrice: bigint, volume: bigint) { } async function expectOrderConsumed(orderHash: string, expectedConsumedVolume: bigint) { - expect(await iexecAccessor.viewConsumed(orderHash)).to.equal(expectedConsumedVolume); + expect(await iexecPocoAccessor.viewConsumed(orderHash)).to.equal(expectedConsumedVolume); } async function frozenOf(account: string) { - return await iexecAccessor.frozenOf(account); + return await iexecPocoAccessor.frozenOf(account); } async function expectFrozen(account: string, expectedFrozenValue: bigint) { diff --git a/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts b/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts index a6238244c..e8db4ff97 100644 --- a/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts +++ b/test/byContract/iexecPocoAccessors/IexecPocoAccessors.test.ts @@ -10,6 +10,8 @@ import { IexecInterfaceNative, IexecInterfaceNative__factory, IexecLibOrders_v5, + IexecPocoAccessors, + IexecPocoAccessors__factory, } from '../../../typechain'; import { OrdersAssets, @@ -42,6 +44,7 @@ const { resultsCallback, callbackResultDigest } = buildResultCallbackAndDigest(1 let proxyAddress: string; let iexecPoco: IexecInterfaceNative; +let iexecPocoAccessors: IexecPocoAccessors; let iexecWrapper: IexecWrapper; let [appAddress, datasetAddress, workerpoolAddress]: string[] = []; let [requester, appProvider, datasetProvider, scheduler, worker1, anyone]: SignerWithAddress[] = []; @@ -62,6 +65,7 @@ describe('IexecPocoAccessors', async () => { iexecWrapper = new IexecWrapper(proxyAddress, accounts); ({ appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets()); iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, ethers.provider); + iexecPocoAccessors = IexecPocoAccessors__factory.connect(proxyAddress, ethers.provider); ordersAssets = { app: appAddress, dataset: datasetAddress, @@ -75,31 +79,31 @@ describe('IexecPocoAccessors', async () => { } it('name', async function () { - expect(await iexecPoco.name()).to.equal('Staked RLC'); + expect(await iexecPocoAccessors.name()).to.equal('Staked RLC'); }); it('symbol', async function () { - expect(await iexecPoco.symbol()).to.equal('SRLC'); + expect(await iexecPocoAccessors.symbol()).to.equal('SRLC'); }); it('decimals', async function () { - expect(await iexecPoco.decimals()).to.equal(9n); + expect(await iexecPocoAccessors.decimals()).to.equal(9n); }); it('totalSupply', async function () { - expect(await iexecPoco.totalSupply()).to.equal(0n); + expect(await iexecPocoAccessors.totalSupply()).to.equal(0n); }); it('balanceOf', async function () { const amount = 3n; await iexecWrapper.depositInIexecAccount(anyone, amount); - expect(await iexecPoco.balanceOf(anyone.address)).to.equal(amount); + expect(await iexecPocoAccessors.balanceOf(anyone.address)).to.equal(amount); }); it('frozenOf', async function () { await createDeal(); // Lock some requester funds. const dealPrice = appPrice + datasetPrice + workerpoolPrice; // volume == 1 - expect(await iexecPoco.frozenOf(requester.address)).to.equal(dealPrice); + expect(await iexecPocoAccessors.frozenOf(requester.address)).to.equal(dealPrice); }); it('allowance', async function () { @@ -107,7 +111,7 @@ describe('IexecPocoAccessors', async () => { const spender = randomAddress(); await iexecWrapper.depositInIexecAccount(anyone, amount); await iexecPoco.connect(anyone).approve(spender, amount); - expect(await iexecPoco.allowance(anyone.address, spender)).to.equal(amount); + expect(await iexecPocoAccessors.allowance(anyone.address, spender)).to.equal(amount); }); it('viewAccount', async function () { @@ -117,19 +121,19 @@ describe('IexecPocoAccessors', async () => { const stakedBalance = 3n; await iexecWrapper.depositInIexecAccount(requester, stakedBalance); // Check staked and locked amounts. - const account = await iexecPoco.viewAccount(requester.address); + const account = await iexecPocoAccessors.viewAccount(requester.address); expect(account.stake).to.equal(stakedBalance); expect(account.locked).to.equal(dealPrice); }); // TODO test the case where token() == 0x0 in native mode. it('token', async function () { - expect(await iexecPoco.token()).to.equal((await deployments.get('RLC')).address); + expect(await iexecPocoAccessors.token()).to.equal((await deployments.get('RLC')).address); }); it('viewDeal', async function () { const { dealId } = await createDeal(); - const deal = await iexecPoco.viewDeal(dealId); + const deal = await iexecPocoAccessors.viewDeal(dealId); expect(deal.app.pointer).to.equal(appAddress); expect(deal.app.owner).to.equal(appProvider.address); expect(deal.app.price).to.equal(appPrice); @@ -156,7 +160,9 @@ describe('IexecPocoAccessors', async () => { it('viewConsumed', async function () { const { orders } = await createDeal(); - expect(await iexecPoco.viewConsumed(iexecWrapper.hashOrder(orders.app))).to.equal(1); + expect(await iexecPocoAccessors.viewConsumed(iexecWrapper.hashOrder(orders.app))).to.equal( + 1, + ); }); it('viewPresigned', async function () { @@ -167,7 +173,7 @@ describe('IexecPocoAccessors', async () => { .connect(appProvider) .manageAppOrder(orderOperation) .then((tx) => tx.wait()); - expect(await iexecPoco.viewPresigned(iexecWrapper.hashOrder(appOrder))).equal( + expect(await iexecPocoAccessors.viewPresigned(iexecWrapper.hashOrder(appOrder))).equal( appProvider.address, ); }); @@ -176,10 +182,10 @@ describe('IexecPocoAccessors', async () => { const { dealId, taskId, taskIndex, startTime, timeRef } = await createDeal(); await iexecWrapper.initializeTask(dealId, taskIndex); - const contributionDeadlineRatio = await iexecPoco.contribution_deadline_ratio(); - const finalDeadlineRatio = await iexecPoco.final_deadline_ratio(); + const contributionDeadlineRatio = await iexecPocoAccessors.contribution_deadline_ratio(); + const finalDeadlineRatio = await iexecPocoAccessors.final_deadline_ratio(); - const task = await iexecPoco.viewTask(taskId); + const task = await iexecPocoAccessors.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.ACTIVE); expect(task.dealid).to.equal(dealId); expect(task.idx).to.equal(taskIndex); @@ -201,7 +207,7 @@ describe('IexecPocoAccessors', async () => { const { dealId, taskIndex, taskId } = await createDeal(); await iexecWrapper.initializeTask(dealId, taskIndex); await iexecWrapper.contributeToTask(dealId, taskIndex, resultDigest, worker1); - const contribution = await iexecPoco.viewContribution(taskId, worker1.address); + const contribution = await iexecPocoAccessors.viewContribution(taskId, worker1.address); expect(contribution.status).to.equal(ContributionStatusEnum.CONTRIBUTED); expect(contribution.resultHash.length).to.equal(66); expect(contribution.resultSeal.length).to.equal(66); @@ -210,75 +216,101 @@ describe('IexecPocoAccessors', async () => { }); it.skip('[TODO] viewScore', async function () { - expect(await iexecPoco.viewScore(worker1.address)).to.equal(0); + expect(await iexecPocoAccessors.viewScore(worker1.address)).to.equal(0); }); it('countCategory', async function () { - expect(await iexecPoco.countCategory()).to.equal(5); + expect(await iexecPocoAccessors.countCategory()).to.equal(5); }); it('appRegistry', async function () { - expect(await iexecPoco.appregistry()).to.equal( + expect(await iexecPocoAccessors.appregistry()).to.equal( (await deployments.get('AppRegistry')).address, ); }); it('datasetRegistry', async function () { - expect(await iexecPoco.datasetregistry()).to.equal( + expect(await iexecPocoAccessors.datasetregistry()).to.equal( (await deployments.get('DatasetRegistry')).address, ); }); it('workerpoolRegistry', async function () { - expect(await iexecPoco.workerpoolregistry()).to.equal( + expect(await iexecPocoAccessors.workerpoolregistry()).to.equal( (await deployments.get('WorkerpoolRegistry')).address, ); }); it('teeBroker', async function () { - expect(await iexecPoco.teebroker()).to.equal(ZeroAddress); + expect(await iexecPocoAccessors.teebroker()).to.equal(ZeroAddress); }); it('callbackGas', async function () { - expect(await iexecPoco.callbackgas()).to.equal(100_000n); + expect(await iexecPocoAccessors.callbackgas()).to.equal(100_000n); + }); + + it('viewDataset', async function () { + const datasetInfo = await iexecPocoAccessors.viewDataset(datasetAddress); + expect(datasetInfo.owner).to.equal(datasetProvider.address); + expect(datasetInfo.m_datasetName).to.equal('my-dataset'); + expect(datasetInfo.m_datasetMultiaddr).to.equal(ZeroHash); + expect(datasetInfo.m_datasetChecksum).to.equal(ZeroHash); + }); + + it('viewApp', async function () { + const appInfo = await iexecPocoAccessors.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(ZeroHash); + expect(appInfo.m_appChecksum).to.equal(ZeroHash); + expect(appInfo.m_appMREnclave).to.equal(ZeroHash); + }); + + it('viewWorkerpool', async function () { + const workerpoolInfo = await iexecPocoAccessors.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); + expect(await iexecPocoAccessors.contribution_deadline_ratio()).to.equal(7); }); it('revealDeadlineRatio', async function () { - expect(await iexecPoco.reveal_deadline_ratio()).to.equal(2n); + expect(await iexecPocoAccessors.reveal_deadline_ratio()).to.equal(2n); }); it('finalDeadlineRatio', async function () { - expect(await iexecPoco.final_deadline_ratio()).to.equal(10n); + expect(await iexecPocoAccessors.final_deadline_ratio()).to.equal(10n); }); it('workerpoolStakeRatio', async function () { - expect(await iexecPoco.workerpool_stake_ratio()).to.equal(30n); + expect(await iexecPocoAccessors.workerpool_stake_ratio()).to.equal(30n); }); it('kittyRatio', async function () { - expect(await iexecPoco.kitty_ratio()).to.equal(10n); + expect(await iexecPocoAccessors.kitty_ratio()).to.equal(10n); }); it('kittyMin', async function () { - expect(await iexecPoco.kitty_min()).to.equal(1_000_000_000n); + expect(await iexecPocoAccessors.kitty_min()).to.equal(1_000_000_000n); }); it('kittyAddress', async function () { - expect(await iexecPoco.kitty_address()).to.equal( + expect(await iexecPocoAccessors.kitty_address()).to.equal( '0x99c2268479b93fDe36232351229815DF80837e23', ); }); it('groupMemberPurpose', async function () { - expect(await iexecPoco.groupmember_purpose()).to.equal(4n); + expect(await iexecPocoAccessors.groupmember_purpose()).to.equal(4n); }); it('eip712domainSeparator', async function () { - expect(await iexecPoco.eip712domain_separator()).equal( + expect(await iexecPocoAccessors.eip712domain_separator()).equal( await hashDomain({ // TODO use IexecWrapper.getDomain() (with some modifications). name: 'iExecODB', @@ -309,7 +341,7 @@ describe('IexecPocoAccessors', async () => { .then((tx) => tx.wait()); const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.COMPLETED); - expect(await iexecPoco.resultFor(taskId)).to.equal(resultsCallback); + expect(await iexecPocoAccessors.resultFor(taskId)).to.equal(resultsCallback); }); it('Should not get result when task is not completed', async function () { @@ -341,13 +373,13 @@ async function createDeal(volume: bigint = 1n) { const { dealId, taskId, taskIndex, startTime } = await iexecWrapper.signAndMatchOrders( ...orders.toArray(), ); - const dealCategory = (await iexecPoco.viewDeal(dealId)).category; - const timeRef = (await iexecPoco.viewCategory(dealCategory)).workClockTimeRef; + const dealCategory = (await iexecPocoAccessors.viewDeal(dealId)).category; + const timeRef = (await iexecPocoAccessors.viewCategory(dealCategory)).workClockTimeRef; return { dealId, taskId, taskIndex, startTime, timeRef, orders }; } async function verifyTaskStatusAndResult(taskId: string, expectedStatus: number) { - const task = await iexecPoco.viewTask(taskId); + const task = await iexecPocoAccessors.viewTask(taskId); expect(task.status).to.equal(expectedStatus); - await expect(iexecPoco.resultFor(taskId)).to.be.revertedWith('task-pending'); + await expect(iexecPocoAccessors.resultFor(taskId)).to.be.revertedWith('task-pending'); } diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 5370fdeeb..9775b529c 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -18,7 +18,6 @@ import { AppRegistry__factory, DatasetRegistry, DatasetRegistry__factory, - IexecAccessors__factory, IexecConfigurationFacet__factory, IexecInterfaceNative__factory, IexecLibOrders_v5, @@ -91,7 +90,10 @@ export class IexecWrapper { return; } const rlc = RLC__factory.connect( - await IexecAccessors__factory.connect(this.proxyAddress, this.accounts.anyone).token(), + await IexecPocoAccessors__factory.connect( + this.proxyAddress, + this.accounts.anyone, + ).token(), this.accounts.iexecAdmin, ); // Transfer RLC from owner to recipient @@ -114,7 +116,7 @@ export class IexecWrapper { * @returns total amount to stake by the scheduler */ async computeSchedulerDealStake(workerpoolPrice: bigint, volume: bigint): Promise { - const stakeRatio = await IexecAccessors__factory.connect( + const stakeRatio = await IexecPocoAccessors__factory.connect( this.proxyAddress, this.accounts.anyone, ).workerpool_stake_ratio(); @@ -166,7 +168,7 @@ export class IexecWrapper { ).workerReward; } // CLASSIC mode. - const deal = await IexecAccessors__factory.connect( + const deal = await IexecPocoAccessors__factory.connect( this.proxyAddress, ethers.provider, ).viewDeal(dealId); @@ -251,7 +253,7 @@ export class IexecWrapper { const datasetOrder = orders.dataset; const workerpoolOrder = orders.workerpool; const requestOrder = orders.requester; - const taskIndex = await IexecAccessors__factory.connect( + const taskIndex = await IexecPocoAccessors__factory.connect( this.proxyAddress, ethers.provider, ).viewConsumed(this.hashOrder(requestOrder)); @@ -292,7 +294,7 @@ export class IexecWrapper { } async createApp() { - const iexec = IexecAccessors__factory.connect(this.proxyAddress, this.accounts.anyone); + const iexec = IexecPocoAccessors__factory.connect(this.proxyAddress, this.accounts.anyone); const appRegistry: AppRegistry = AppRegistry__factory.connect( await iexec.appregistry(), this.accounts.appProvider, @@ -311,7 +313,7 @@ export class IexecWrapper { } async createDataset() { - const iexec = IexecAccessors__factory.connect(this.proxyAddress, this.accounts.anyone); + const iexec = IexecPocoAccessors__factory.connect(this.proxyAddress, this.accounts.anyone); const datasetRegistry: DatasetRegistry = DatasetRegistry__factory.connect( await iexec.datasetregistry(), this.accounts.datasetProvider, @@ -406,7 +408,7 @@ export class IexecWrapper { useEnclave: Boolean, ) { const taskId = getTaskId(dealId, taskIndex); - const workerStakePerTask = await IexecAccessors__factory.connect( + const workerStakePerTask = await IexecPocoAccessors__factory.connect( this.proxyAddress, ethers.provider, ) @@ -446,7 +448,7 @@ export class IexecWrapper { } async createWorkerpool() { - const iexec = IexecAccessors__factory.connect(this.proxyAddress, this.accounts.anyone); + const iexec = IexecPocoAccessors__factory.connect(this.proxyAddress, this.accounts.anyone); const workerpoolRegistry: WorkerpoolRegistry = WorkerpoolRegistry__factory.connect( await iexec.workerpoolregistry(), this.accounts.scheduler,