From ebb3b467c3b353500a11dfb20e9a462046372278 Mon Sep 17 00:00:00 2001 From: Zied <26070035+zguesmi@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:27:32 +0200 Subject: [PATCH 1/3] Remove skipped test file --- .../IexecPoco/IexecPocoDelegate.test.ts.skip | 329 ------------------ 1 file changed, 329 deletions(-) delete mode 100644 test/byContract/IexecPoco/IexecPocoDelegate.test.ts.skip diff --git a/test/byContract/IexecPoco/IexecPocoDelegate.test.ts.skip b/test/byContract/IexecPoco/IexecPocoDelegate.test.ts.skip deleted file mode 100644 index 2db8fdbd0..000000000 --- a/test/byContract/IexecPoco/IexecPocoDelegate.test.ts.skip +++ /dev/null @@ -1,329 +0,0 @@ -// SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH -// SPDX-License-Identifier: Apache-2.0 - -import { FakeContract, MockContract, smock } from '@defi-wonderland/smock'; -import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import chai, { expect } from 'chai'; -import { ethers } from 'hardhat'; -import { - App, - AppRegistry, - AppRegistry__factory, - App__factory, - Dataset, - DatasetRegistry, - DatasetRegistry__factory, - Dataset__factory, - IexecLibOrders_v5__factory, - IexecPoco1Delegate, - IexecPocoAccessorsDelegate__factory, - IexecPocoCompositeDelegate, - IexecPocoCompositeDelegate__factory, - Workerpool, - WorkerpoolRegistry, - WorkerpoolRegistry__factory, - Workerpool__factory, -} from '../../../typechain'; -import { - OrdersActors, - OrdersAssets, - buildDomain, - buildOrders, - hashOrder, - signOrders, -} from '../../../utils/createOrders'; -import { createMock } from '../../../utils/mock-tools'; -import { getDealId } from '../../../utils/poco-tools'; - -chai.use(smock.matchers); - -const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; -const taskIndex = 0; -const schedulerRewardRatio = 1; -const EIP712DOMAIN_SEPARATOR = 'EIP712DOMAIN_SEPARATOR'; -const BALANCES = 'm_balances'; -const FROZENS = 'm_frozens'; -const WORKERPOOL_STAKE_RATIO = 30; -const CALLBACK_GAS = 100000; -const { domain, domainSeparator } = buildDomain(); -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; -const ordersPrices = { - app: appPrice, - dataset: datasetPrice, - workerpool: workerpoolPrice, -}; -let [admin, requester, sponsor, beneficiary, appProvider, datasetProvider, scheduler, anyone] = - [] as SignerWithAddress[]; -let ordersActors: OrdersActors; -let iexecPocoInstance: MockContract; -let appRegistry: FakeContract; -let appInstance: MockContract; -let datasetRegistry: FakeContract; -let datasetInstance: MockContract; -let workerpoolRegistry: FakeContract; -let workerpoolInstance: MockContract; -let ordersAssets: OrdersAssets; - -describe('IexecPocoDelegate', function () { - beforeEach('Setup accounts & contracts', async () => { - // Setup accounts - [admin, requester, sponsor, beneficiary, appProvider, datasetProvider, scheduler, anyone] = - await ethers.getSigners(); - ordersActors = { - appOwner: appProvider, - datasetOwner: datasetProvider, - workerpoolOwner: scheduler, - requester: requester, - }; - // Deploy contracts with fixture to ensure blockchain is always restored - // to a snapshot without redeploying everything - const deployFixture = async () => { - const iexecLibOrdersInstanceAddress = await new IexecLibOrders_v5__factory() - .connect(admin) - .deploy() - .then((instance) => instance.deployed()) - .then((instance) => instance.address); - // Using native smock call here for understandability purposes (also works with - // the custom `createMock` method) - iexecPocoInstance = (await smock - .mock('IexecPocoCompositeDelegate', { - libraries: { - ['contracts/libs/IexecLibOrders_v5.sol:IexecLibOrders_v5']: - iexecLibOrdersInstanceAddress, - }, - }) - .then((instance) => instance.deploy()) - .then((instance) => - instance.deployed(), - )) as MockContract; - // A global domain separator needs to be set since current contract is being - // unit tested here (hence no proxy) - await iexecPocoInstance.setVariable('m_callbackgas', CALLBACK_GAS); - await iexecPocoInstance.setVariable(EIP712DOMAIN_SEPARATOR, domainSeparator); - await iexecPocoInstance.setVariable('m_categories', [ - { - // Category 0 - name: 'some-name', - description: 'some-description', - workClockTimeRef: 60, - }, - ]); - }; - await loadFixture(deployFixture); - // Setup app registry and add app entry - appRegistry = await smock.fake(AppRegistry__factory); - await iexecPocoInstance.setVariable('m_appregistry', appRegistry.address); - appInstance = await createMock('App'); - appRegistry.isRegistered.whenCalledWith(appInstance.address).returns(true); - appInstance.owner.returns(appProvider.address); - // Setup dataset registry and add dataset entry - datasetInstance = await createMock('Dataset'); - datasetRegistry = await smock.fake(DatasetRegistry__factory); - await iexecPocoInstance.setVariable('m_datasetregistry', datasetRegistry.address); - datasetRegistry.isRegistered.whenCalledWith(datasetInstance.address).returns(true); - datasetInstance.owner.returns(datasetProvider.address); - // Setup workerpool registry and add workerpool entry - workerpoolRegistry = await smock.fake(WorkerpoolRegistry__factory); - await iexecPocoInstance.setVariable('m_workerpoolregistry', workerpoolRegistry.address); - workerpoolInstance = await createMock('Workerpool'); - workerpoolRegistry.isRegistered.whenCalledWith(workerpoolInstance.address).returns(true); - workerpoolInstance.owner.returns(scheduler.address); - workerpoolInstance.m_schedulerRewardRatioPolicy.returns(schedulerRewardRatio); - // Bundle assets together for simplicity purposes - ordersAssets = { - app: appInstance.address, - dataset: datasetInstance.address, - workerpool: workerpoolInstance.address, - }; - }); - - describe('Match orders', function () { - it('Should sponsor match orders ', async function () { - const orders = buildOrders({ - assets: ordersAssets, - requester: requester.address, - beneficiary: beneficiary.address, - tag: teeDealTag, - prices: ordersPrices, - callback: ethers.Wallet.createRandom().address, - }); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); - // Set volumes for each order - appOrder.volume = 2; // smallest unconsumed volume among all orders - datasetOrder.volume = 3; - workerpoolOrder.volume = 4; - requestOrder.volume = 5; - const expectedVolume = 2; - // Set balance & frozen for each actor - const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * expectedVolume; - const initialIexecPocoBalance = 1; - const initialRequesterBalance = 2; - const initialRequesterFrozen = 3; - const initialSchedulerBalance = 4; - const initialSchedulerFrozen = 5; - const initialSponsorBalance = 6; - const initialSponsorFrozen = 7; - const schedulerStake = computeSchedulerDealStake(workerpoolPrice, expectedVolume); - await iexecPocoInstance.setVariables({ - [BALANCES]: { - [iexecPocoInstance.address]: initialIexecPocoBalance, - [requester.address]: initialRequesterBalance, - [sponsor.address]: initialSponsorBalance + dealPrice, - [scheduler.address]: initialSchedulerBalance + schedulerStake, - }, - [FROZENS]: { - [requester.address]: initialRequesterFrozen, - [sponsor.address]: initialSponsorFrozen, - [scheduler.address]: initialSchedulerFrozen, - }, - }); - await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); - const appOrderHash = hashOrder(domain, appOrder); - const datasetOrderHash = hashOrder(domain, datasetOrder); - const workerpoolOrderHash = hashOrder(domain, workerpoolOrder); - const requestOrderHash = hashOrder(domain, requestOrder); - expect( - await iexecPocoInstance - .connect(sponsor) - .callStatic.sponsorMatchOrders(...orders.toArray()), - ).to.equal(dealId); - expect( - await iexecPocoInstance.callStatic.computeDealVolume(...orders.toArray()), - ).to.equal(expectedVolume); - // Send tx - await expect(iexecPocoInstance.connect(sponsor).sponsorMatchOrders(...orders.toArray())) - .to.emit(iexecPocoInstance, 'OrdersMatched') - .withArgs( - dealId, - appOrderHash, - datasetOrderHash, - workerpoolOrderHash, - requestOrderHash, - expectedVolume, - ) - .to.emit(iexecPocoInstance, 'DealSponsored') - .withArgs(dealId, sponsor.address); - // Verify Poco contract balance - await expectBalance( - iexecPocoInstance, - iexecPocoInstance.address, - initialIexecPocoBalance + dealPrice + schedulerStake, - ); - // Verify requester balance & frozen - await expectBalance(iexecPocoInstance, requester.address, initialRequesterBalance); - await expectFrozen(iexecPocoInstance, requester.address, initialRequesterFrozen); - // Verify sponsor balance & frozen - await expectBalance(iexecPocoInstance, sponsor.address, initialSponsorBalance); - await expectFrozen( - iexecPocoInstance, - sponsor.address, - initialSponsorFrozen + dealPrice, - ); - // Verify scheduler balance & frozen - await expectBalance(iexecPocoInstance, scheduler.address, initialSchedulerBalance); - await expectFrozen( - iexecPocoInstance, - scheduler.address, - initialSchedulerFrozen + schedulerStake, - ); - // Verify stored deal - expect((await viewDeal(dealId)).sponsor).to.equal(sponsor.address); - }); - - it('Should get task', async function () { - const randomBytes = ethers.utils.randomBytes; - const hexlify = ethers.utils.hexlify; - - const taskId = hexlify(randomBytes(32)); - const dealId = hexlify(randomBytes(32)); - const index = 3; - const timeref = 250; - const contributionDeadline = Date.now() + 1; - const revealDeadline = Date.now() + 2; - const finalDeadline = Date.now() + 3; - const consensusValue = hexlify(randomBytes(32)); - const revealCounter = 2; - const winnerCounter = 2; - const contributor = ethers.Wallet.createRandom().address; - const resultDigest = hexlify(randomBytes(32)); - const results = hexlify(randomBytes(9)); - const resultsTimestamp = Date.now() + 4; - const resultsCallback = hexlify(randomBytes(9)); - - await iexecPocoInstance.setVariables({ - m_tasks: { - [taskId]: { - // status => Enum causes a smock error. - dealid: dealId, - idx: index, - timeref: timeref, - contributionDeadline: contributionDeadline, - revealDeadline: revealDeadline, - finalDeadline: finalDeadline, - consensusValue: consensusValue, - revealCounter: revealCounter, - winnerCounter: winnerCounter, - contributors: [contributor], - resultDigest: resultDigest, - results: results, - resultsTimestamp: resultsTimestamp, - resultsCallback: resultsCallback, - }, - }, - }); - const task = await IexecPocoAccessorsDelegate__factory.connect( - iexecPocoInstance.address, - anyone, - ).viewTask(taskId); - - expect(task.dealid).to.equal(dealId); - expect(task.idx).to.equal(index); - expect(task.timeref).to.equal(timeref); - expect(task.contributionDeadline).to.equal(contributionDeadline); - expect(task.revealDeadline).to.equal(revealDeadline); - expect(task.finalDeadline).to.equal(finalDeadline); - expect(task.consensusValue).to.equal(consensusValue); - expect(task.revealCounter).to.equal(revealCounter); - expect(task.winnerCounter).to.equal(winnerCounter); - expect(task.contributors[0]).to.equal(contributor); - expect(task.resultDigest).to.equal(resultDigest); - expect(task.results).to.equal(results); - expect(task.resultsTimestamp).to.equal(resultsTimestamp); - expect(task.resultsCallback).to.equal(resultsCallback); - }); - }); - - /** - * @notice Smock does not support getting struct variable from a mapping. - */ - async function viewDeal(dealId: string) { - return await IexecPocoAccessorsDelegate__factory.connect( - iexecPocoInstance.address, - anyone, - ).viewDeal(dealId); - } -}); - -function computeSchedulerDealStake(workerpoolPrice: number, volume: number) { - return ((workerpoolPrice * WORKERPOOL_STAKE_RATIO) / 100) * volume; -} - -async function expectBalance( - iexecPocoInstance: MockContract, - account: string, - expectedBalanceValue: number, -) { - expect(await iexecPocoInstance.getVariable(BALANCES, [account])).to.equal(expectedBalanceValue); -} - -async function expectFrozen( - iexecPocoInstance: MockContract, - account: string, - expectedFrozenValue: number, -) { - expect(await iexecPocoInstance.getVariable(FROZENS, [account])).to.equal(expectedFrozenValue); -} From 7c76333f0c24ca263f7c67c47e32e5ce10d03576 Mon Sep 17 00:00:00 2001 From: Zied <26070035+zguesmi@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:27:58 +0200 Subject: [PATCH 2/3] Rename iexecPoco instance --- .../IexecAccessors/IexecAccessors.test.ts | 80 +++++++++---------- 1 file changed, 38 insertions(+), 42 deletions(-) diff --git a/test/byContract/IexecAccessors/IexecAccessors.test.ts b/test/byContract/IexecAccessors/IexecAccessors.test.ts index 17385da7e..61b59d3b6 100644 --- a/test/byContract/IexecAccessors/IexecAccessors.test.ts +++ b/test/byContract/IexecAccessors/IexecAccessors.test.ts @@ -31,7 +31,7 @@ const { results, resultDigest } = buildUtf8ResultAndDigest('result'); const { resultsCallback, callbackResultDigest } = buildResultCallbackAndDigest(123); let proxyAddress: string; -let iexecPocoAsAnyone: IexecInterfaceNative; +let iexecPoco: IexecInterfaceNative; let iexecWrapper: IexecWrapper; let [appAddress, datasetAddress, workerpoolAddress]: string[] = []; let [requester, scheduler, worker1, anyone]: SignerWithAddress[] = []; @@ -51,7 +51,7 @@ describe('IexecAccessors', async () => { ({ requester, scheduler, worker1, anyone } = accounts); iexecWrapper = new IexecWrapper(proxyAddress, accounts); ({ appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets()); - iexecPocoAsAnyone = IexecInterfaceNative__factory.connect(proxyAddress, anyone); + iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, anyone); ordersAssets = { app: appAddress, dataset: datasetAddress, @@ -65,26 +65,24 @@ describe('IexecAccessors', async () => { } it('name', async function () { - expect(await iexecPocoAsAnyone.name()).to.equal('Staked RLC'); + expect(await iexecPoco.name()).to.equal('Staked RLC'); }); it('symbol', async function () { - expect(await iexecPocoAsAnyone.symbol()).to.equal('SRLC'); + expect(await iexecPoco.symbol()).to.equal('SRLC'); }); it('decimals', async function () { - expect(await iexecPocoAsAnyone.decimals()).to.equal(9n); + expect(await iexecPoco.decimals()).to.equal(9n); }); it('totalSupply', async function () { - expect(await iexecPocoAsAnyone.totalSupply()).to.equal(0n); + expect(await iexecPoco.totalSupply()).to.equal(0n); }); // TODO test the case where token() == 0x0 in native mode. it('token', async function () { - expect(await iexecPocoAsAnyone.token()).to.equal( - '0x5FbDB2315678afecb367f032d93F642f64180aa3', - ); + expect(await iexecPoco.token()).to.equal('0x5FbDB2315678afecb367f032d93F642f64180aa3'); }); it('viewTask', async function () { @@ -92,11 +90,11 @@ describe('IexecAccessors', async () => { await initializeTask(dealId, taskIndex); const contributionDeadlineRatio = ( - await iexecPocoAsAnyone.contribution_deadline_ratio() + await iexecPoco.contribution_deadline_ratio() ).toNumber(); - const finalDeadlineRatio = (await iexecPocoAsAnyone.final_deadline_ratio()).toNumber(); + const finalDeadlineRatio = (await iexecPoco.final_deadline_ratio()).toNumber(); - const task = await iexecPocoAsAnyone.viewTask(taskId); + const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.ACTIVE); expect(task.dealid).to.equal(dealId); expect(task.idx).to.equal(taskIndex); @@ -115,71 +113,71 @@ describe('IexecAccessors', async () => { }); it('countCategory', async function () { - expect(await iexecPocoAsAnyone.countCategory()).to.equal(5); + expect(await iexecPoco.countCategory()).to.equal(5); }); it('appRegistry', async function () { - expect(await iexecPocoAsAnyone.appregistry()).to.equal( + expect(await iexecPoco.appregistry()).to.equal( (await deployments.get('AppRegistry')).address, ); }); it('datasetRegistry', async function () { - expect(await iexecPocoAsAnyone.datasetregistry()).to.equal( + expect(await iexecPoco.datasetregistry()).to.equal( (await deployments.get('DatasetRegistry')).address, ); }); it('workerpoolRegistry', async function () { - expect(await iexecPocoAsAnyone.workerpoolregistry()).to.equal( + expect(await iexecPoco.workerpoolregistry()).to.equal( (await deployments.get('WorkerpoolRegistry')).address, ); }); it('teeBroker', async function () { - expect(await iexecPocoAsAnyone.teebroker()).to.equal(ethers.constants.AddressZero); + expect(await iexecPoco.teebroker()).to.equal(ethers.constants.AddressZero); }); it('callbackGas', async function () { - expect(await iexecPocoAsAnyone.callbackgas()).to.equal(100_000n); + expect(await iexecPoco.callbackgas()).to.equal(100_000n); }); it('contributionDeadlineRatio', async function () { - expect(await iexecPocoAsAnyone.contribution_deadline_ratio()).to.equal(7); + expect(await iexecPoco.contribution_deadline_ratio()).to.equal(7); }); it('revealDeadlineRatio', async function () { - expect(await iexecPocoAsAnyone.reveal_deadline_ratio()).to.equal(2n); + expect(await iexecPoco.reveal_deadline_ratio()).to.equal(2n); }); it('finalDeadlineRatio', async function () { - expect(await iexecPocoAsAnyone.final_deadline_ratio()).to.equal(10n); + expect(await iexecPoco.final_deadline_ratio()).to.equal(10n); }); it('workerpoolStakeRatio', async function () { - expect(await iexecPocoAsAnyone.workerpool_stake_ratio()).to.equal(30n); + expect(await iexecPoco.workerpool_stake_ratio()).to.equal(30n); }); it('kittyRatio', async function () { - expect(await iexecPocoAsAnyone.kitty_ratio()).to.equal(10n); + expect(await iexecPoco.kitty_ratio()).to.equal(10n); }); it('kittyMin', async function () { - expect(await iexecPocoAsAnyone.kitty_min()).to.equal(1_000_000_000n); + expect(await iexecPoco.kitty_min()).to.equal(1_000_000_000n); }); it('kittyAddress', async function () { - expect(await iexecPocoAsAnyone.kitty_address()).to.equal( + expect(await iexecPoco.kitty_address()).to.equal( '0x99c2268479b93fDe36232351229815DF80837e23', ); }); it('groupMemberPurpose', async function () { - expect(await iexecPocoAsAnyone.groupmember_purpose()).to.equal(4n); + expect(await iexecPoco.groupmember_purpose()).to.equal(4n); }); it('eip712domainSeparator', async function () { - expect(await iexecPocoAsAnyone.eip712domain_separator()).to.equal( + expect(await iexecPoco.eip712domain_separator()).to.equal( '0xfc2178d8b8300e657cb9f8b5a4d1957174cf1392e294f3575b82a9cea1da1c4b', ); }); @@ -191,17 +189,17 @@ describe('IexecAccessors', async () => { await initializeTask(dealId, taskIndex).then(() => contributeToTask(dealId, taskIndex, callbackResultDigest), ); - await iexecPocoAsAnyone + await iexecPoco .connect(worker1) .reveal(taskId, callbackResultDigest) .then((tx) => tx.wait()); - await iexecPocoAsAnyone + await iexecPoco .connect(scheduler) .finalize(taskId, results, resultsCallback) .then((tx) => tx.wait()); - const task = await iexecPocoAsAnyone.viewTask(taskId); + const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.COMPLETED); - expect(await iexecPocoAsAnyone.callStatic.resultFor(taskId)).to.equal(resultsCallback); + expect(await iexecPoco.callStatic.resultFor(taskId)).to.equal(resultsCallback); }); it('Should not get result when task is not completed', async function () { @@ -233,10 +231,8 @@ async function createDeal(volume: number = 1) { const { dealId, taskId, taskIndex, startTime } = await iexecWrapper.signAndMatchOrders( ...orders.toArray(), ); - const dealCategory = (await iexecPocoAsAnyone.viewDeal(dealId)).category; - const timeRef = ( - await iexecPocoAsAnyone.viewCategory(dealCategory) - ).workClockTimeRef.toNumber(); + const dealCategory = (await iexecPoco.viewDeal(dealId)).category; + const timeRef = (await iexecPoco.viewCategory(dealCategory)).workClockTimeRef.toNumber(); return { dealId, taskId, taskIndex, startTime, timeRef }; } @@ -244,7 +240,7 @@ async function createDeal(volume: number = 1) { * Helper function to initialize a task. */ async function initializeTask(dealId: string, taskIndex: number) { - await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); + await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); return getTaskId(dealId, taskIndex); } @@ -253,7 +249,7 @@ async function initializeTask(dealId: string, taskIndex: number) { */ async function contributeToTask(dealId: string, taskIndex: number, resultDigest: string) { const taskId = getTaskId(dealId, taskIndex); - const workerTaskStake = await iexecPocoAsAnyone + const workerTaskStake = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); const { resultHash, resultSeal } = buildResultHashAndResultSeal(taskId, resultDigest, worker1); @@ -264,15 +260,15 @@ async function contributeToTask(dealId: string, taskIndex: number, resultDigest: scheduler, ); await iexecWrapper.depositInIexecAccount(worker1, workerTaskStake); - await iexecPocoAsAnyone + await iexecPoco .connect(worker1) .contribute(taskId, resultHash, resultSeal, AddressZero, '0x', schedulerSignature) .then((tx) => tx.wait()); return taskId; } -const verifyTaskStatusAndResult = async (taskId: string, expectedStatus: number) => { - const task = await iexecPocoAsAnyone.viewTask(taskId); +async function verifyTaskStatusAndResult(taskId: string, expectedStatus: number) { + const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(expectedStatus); - await expect(iexecPocoAsAnyone.resultFor(taskId)).to.be.revertedWith('task-pending'); -}; + await expect(iexecPoco.resultFor(taskId)).to.be.revertedWith('task-pending'); +} From 2b030503bd3a5603aa57466be3a439f327f7bc74 Mon Sep 17 00:00:00 2001 From: Zied <26070035+zguesmi@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:31:29 +0200 Subject: [PATCH 3/3] Update changlog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d25d9dac1..05a3c562c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## vNEXT - Remove `smock` from unit tests: - - IexecPocoDelegate (#149) + - IexecPocoDelegate (#149, #151) - IexecPocoBoost (#148) - Migrate unit test files to Typescript & Hardhat: - ERC1154 (#145, #146, #147)