From 6417ddb2f4a27ff68ac101faf72b15bc023cfed6 Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 3 Dec 2024 17:07:50 +0100 Subject: [PATCH 01/10] fix math on IT 000 --- test/000_fullchain.test.ts | 135 +++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 57 deletions(-) diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index ed04223f5..16d79fb63 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -157,22 +157,20 @@ describe('Integration tests', function () { .finalize(taskId, results, resultsCallback); await finalizeTx.wait(); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.COMPLETED); - // Multiply amount by the number of finalized tasks to correctly compute - // stake and reward amounts. - const completedTasks = taskIndex + 1; // Verify token balance changes const expectedProxyBalanceChange = -( - taskPrice * completedTasks + - schedulerStakePerTask * completedTasks + taskPrice + + schedulerStakePerTask + + workerStakePerTask * workers.length ); const expectedWorkerBalanceChange = workerStakePerTask + workerRewardPerTask / workers.length; - expect(finalizeTx).to.changeTokenBalances( + await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], [ expectedProxyBalanceChange, // Proxy - -taskPrice * completedTasks, // Sponsor + 0, // Sponsor 0, // Requester schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider @@ -180,6 +178,9 @@ describe('Integration tests', function () { ...workers.map(() => expectedWorkerBalanceChange), // Workers ], ); + // Multiply amount by the number of finalized tasks to correctly compute + // stake and reward amounts. + const completedTasks = taskIndex + 1; // Calculate expected frozen changes const expectedFrozenChanges = [ 0, // Proxy @@ -223,7 +224,7 @@ describe('Integration tests', function () { const accounts = [requester, scheduler, appProvider, datasetProvider, ...workers]; const accountsInitialFrozens = await getInitialFrozens(accounts); // Finalize each task and check balance changes. - const workerStakePerTask = await iexecPoco + const workerStake = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); for (let taskIndex = 0; taskIndex < volume; taskIndex++) { @@ -248,28 +249,28 @@ describe('Integration tests', function () { .finalize(taskId, results, resultsCallback); await finalizeTx.wait(); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.COMPLETED); - // Multiply amount by the number of finalized tasks to correctly compute - // stake and reward amounts. - const completedTasks = taskIndex + 1; // Verify token balance changes const expectedProxyBalanceChange = -( - taskPrice * completedTasks + - schedulerStakePerTask * completedTasks + taskPrice + + schedulerStakePerTask + + workerStake * workers.length ); - const expectedWorkerBalanceChange = - workerStakePerTask + workerRewardPerTask / workers.length; - expect(finalizeTx).to.changeTokenBalances( + const expectedWorkerBalanceChange = workerStake + workerRewardPerTask / workers.length; + await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], [ expectedProxyBalanceChange, // Proxy - -taskPrice * completedTasks, // Requester + 0, // Requester schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider ...workers.map(() => expectedWorkerBalanceChange), // Workers ], ); + // Multiply amount by the number of finalized tasks to correctly compute + // stake and reward amounts. + const completedTasks = taskIndex + 1; // Calculate expected frozen changes const expectedFrozenChanges = [ 0, // Proxy @@ -326,26 +327,27 @@ describe('Integration tests', function () { .finalize(taskId, results, resultsCallback); await finalizeTx.wait(); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.COMPLETED); - // Multiply amount by the number of finalized tasks to correctly compute - // stake and reward amounts. - const completedTasks = taskIndex + 1; // Verify token balance changes const expectedProxyBalanceChange = -( - taskPrice * completedTasks + - schedulerStakePerTask * completedTasks + taskPrice + + schedulerStakePerTask + + workerStakePerTask ); - expect(finalizeTx).to.changeTokenBalances( + await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, sponsor, scheduler, appProvider, datasetProvider, worker1], [ expectedProxyBalanceChange, // Proxy - -taskPrice * completedTasks, // Sponsor + 0, // Sponsor schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider workerStakePerTask + workerRewardPerTask, // Worker ], ); + // Multiply amount by the number of finalized tasks to correctly compute + // stake and reward amounts. + const completedTasks = taskIndex + 1; // Calculate expected frozen changes const expectedFrozenChanges = [ 0, // Proxy @@ -404,26 +406,28 @@ describe('Integration tests', function () { .finalize(taskId, results, resultsCallback); await finalizeTx.wait(); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.COMPLETED); - // Multiply amount by the number of finalized tasks to correctly compute - // stake and reward amounts. - const completedTasks = taskIndex + 1; + // Verify token balance changes const expectedProxyBalanceChange = -( - taskPrice * completedTasks + - schedulerStakePerTask * completedTasks + taskPrice + + schedulerStakePerTask + + workerStakePerTask ); - expect(finalizeTx).to.changeTokenBalances( + await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, requester, scheduler, appProvider, datasetProvider, worker1], [ expectedProxyBalanceChange, // Proxy - -taskPrice * completedTasks, // Requester + 0, // Requester schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider workerStakePerTask + workerRewardPerTask, // Worker ], ); + // Multiply amount by the number of finalized tasks to correctly compute + // stake and reward amounts. + const completedTasks = taskIndex + 1; // Calculate expected frozen changes const expectedFrozenChanges = [ 0, // Proxy @@ -451,7 +455,6 @@ describe('Integration tests', function () { const { dealId, dealPrice, schedulerStakePerDeal } = await iexecWrapper.signAndMatchOrders( ...orders.toArray(), ); - const taskPrice = appPrice + datasetPrice + workerpoolPrice; const schedulerStakePerTask = schedulerStakePerDeal / volume; const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( dealId, @@ -476,20 +479,18 @@ describe('Integration tests', function () { const finalizeTx = await iexecPoco.connect(scheduler).finalize(taskId, results, '0x'); await finalizeTx.wait(); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.COMPLETED); - // Multiply amount by the number of finalized tasks to correctly compute - // stake and reward amounts. - const completedTasks = taskIndex + 1; // Verify token balance changes const expectedProxyBalanceChange = -( - taskPrice * completedTasks + - schedulerStakePerTask * completedTasks + dealPrice + + schedulerStakePerTask + + workerStakePerTask ); - expect(finalizeTx).to.changeTokenBalances( + await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, requester, scheduler, appProvider, datasetProvider, worker1], [ expectedProxyBalanceChange, // Proxy - -taskPrice * completedTasks, // Requester + 0, // Requester schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider @@ -499,8 +500,8 @@ describe('Integration tests', function () { // Calculate expected frozen changes const expectedFrozenChanges = [ 0, // Proxy - -taskPrice * completedTasks, // Requester - -schedulerStakePerTask * completedTasks, // Scheduler + -dealPrice, // Requester + -schedulerStakePerTask, // Scheduler 0, // AppProvider 0, // DatasetProvider 0, // Worker @@ -540,7 +541,7 @@ describe('Integration tests', function () { } const taskId = await iexecWrapper.initializeTask(dealId, 0); // Finalize each task and check balance changes. - const workerStakePerTask = await iexecPoco + const workerStake = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); @@ -557,13 +558,18 @@ describe('Integration tests', function () { .connect(scheduler) .finalize(taskId, results, '0x'); await finalizeTx.wait(); + const expectedProxyBalanceChange = -( + dealPrice + + schedulerStakePerTask + + workerStake * workers.length + ); const expectedWorkerBalanceChange = - workerStakePerTask + workerRewardPerTask / workerNumber; - expect(finalizeTx).to.changeTokenBalances( + workerStake + workerRewardPerTask / workerNumber; + await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], [ - -(dealPrice + schedulerStakePerDeal), + expectedProxyBalanceChange, 0, schedulerStakePerTask + schedulerRewardPerTask, appPrice, @@ -622,13 +628,7 @@ describe('Integration tests', function () { const { dealId, dealPrice, schedulerStakePerDeal } = await iexecWrapper.signAndMatchOrders( ...orders.toArray(), ); - const taskPrice = appPrice + datasetPrice + workerpoolPrice; const schedulerStakePerTask = schedulerStakePerDeal / volume; - const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( - dealId, - PocoMode.CLASSIC, - ); - const schedulerRewardPerTask = workerpoolPrice - workerRewardPerTask; const accountsInitialFrozens = await getInitialFrozens(accounts); // Check initial balances. for (const contributor of contributions) { @@ -659,19 +659,35 @@ describe('Integration tests', function () { } const finalizeTx = await iexecPoco.connect(scheduler).finalize(taskId, results, '0x'); await finalizeTx.wait(); - const expectedWinningWorkerBalanceChange = + + const totalWorkerPoolReward = workerpoolPrice + workerStake * 1; // bad wrokers lose their stake and add it to the pool price + // compute expected worker reward for current task + const workerRewardPerTask = await computeWorkerRewardForCurrentTask( + totalWorkerPoolReward, + dealId, + ); + const expectedWorkerBalanceChange = workerStake + workerRewardPerTask / winningWorkers.length; - expect(finalizeTx).to.changeTokenBalances( + // compute expected scheduler reward for current task + const schedulerRewardPerTask = totalWorkerPoolReward - workerRewardPerTask; + const expectedSchedulerBalanceChange = schedulerStakePerTask + schedulerRewardPerTask; + + const expectedProxyBalanceChange = -( + dealPrice + + workerStake * workersAvailable.length + + schedulerStakePerTask + ); + await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], [ - -(dealPrice + schedulerStakePerDeal), + expectedProxyBalanceChange, 0, - schedulerStakePerTask + schedulerRewardPerTask, + expectedSchedulerBalanceChange, appPrice, datasetPrice, 0, // losing worker - ...winningWorkers.map(() => expectedWinningWorkerBalanceChange), // winning workers + ...winningWorkers.map(() => expectedWorkerBalanceChange), // winning workers ], ); // checks on losing worker @@ -685,7 +701,7 @@ describe('Integration tests', function () { // checks on frozen balance changes const expectedFrozenChanges = [ 0, - -taskPrice, + -dealPrice, -schedulerStakePerTask, 0, 0, @@ -709,6 +725,11 @@ describe('Integration tests', function () { } return initialFrozens; } + + async function computeWorkerRewardForCurrentTask(totalPoolReward: number, dealId: string) { + const deal = await iexecPoco.viewDeal(dealId); + return (totalPoolReward * (100 - deal.schedulerRewardRatio.toNumber())) / 100; + } }); async function checkFrozenChanges( From b75dffe527b77f7d6434ef8ba1205a224afc3f31 Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 09:40:24 +0100 Subject: [PATCH 02/10] rename to workersRewardPerTask --- test/000_fullchain.test.ts | 42 +++++++++++++++++----------------- test/200_fullchain-bot.test.ts | 6 ++--- test/utils/IexecWrapper.ts | 2 +- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index 16d79fb63..53d590cbd 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -122,11 +122,11 @@ describe('Integration tests', function () { await iexecWrapper.signAndSponsorMatchOrders(...orders.toArray()); const taskPrice = appPrice + datasetPrice + workerpoolPrice; const schedulerStakePerTask = schedulerStakePerDeal / volume; - const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardPerTask( dealId, PocoMode.CLASSIC, ); - const schedulerRewardPerTask = workerpoolPrice - workerRewardPerTask; + const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [sponsor, requester, scheduler, appProvider, datasetProvider, ...workers]; @@ -164,7 +164,7 @@ describe('Integration tests', function () { workerStakePerTask * workers.length ); const expectedWorkerBalanceChange = - workerStakePerTask + workerRewardPerTask / workers.length; + workerStakePerTask + workersRewardPerTask / workers.length; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -214,11 +214,11 @@ describe('Integration tests', function () { ); const taskPrice = appPrice + datasetPrice + workerpoolPrice; const schedulerStakePerTask = schedulerStakePerDeal / volume; - const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardPerTask( dealId, PocoMode.CLASSIC, ); - const schedulerRewardPerTask = workerpoolPrice - workerRewardPerTask; + const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, ...workers]; @@ -255,7 +255,7 @@ describe('Integration tests', function () { schedulerStakePerTask + workerStake * workers.length ); - const expectedWorkerBalanceChange = workerStake + workerRewardPerTask / workers.length; + const expectedWorkerBalanceChange = workerStake + workersRewardPerTask / workers.length; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -301,11 +301,11 @@ describe('Integration tests', function () { await iexecWrapper.signAndSponsorMatchOrders(...orders.toArray()); const taskPrice = appPrice + datasetPrice + workerpoolPrice; const schedulerStakePerTask = schedulerStakePerDeal / volume; - const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardPerTask( dealId, PocoMode.CLASSIC, ); - const schedulerRewardPerTask = workerpoolPrice - workerRewardPerTask; + const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [sponsor, requester, scheduler, appProvider, datasetProvider, worker1]; const accountsInitialFrozens = await getInitialFrozens(accounts); @@ -342,7 +342,7 @@ describe('Integration tests', function () { schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider - workerStakePerTask + workerRewardPerTask, // Worker + workerStakePerTask + workersRewardPerTask, // Worker ], ); // Multiply amount by the number of finalized tasks to correctly compute @@ -380,11 +380,11 @@ describe('Integration tests', function () { ); const taskPrice = appPrice + datasetPrice + workerpoolPrice; const schedulerStakePerTask = schedulerStakePerDeal / volume; - const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardPerTask( dealId, PocoMode.CLASSIC, ); - const schedulerRewardPerTask = workerpoolPrice - workerRewardPerTask; + const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; const accountsInitialFrozens = await getInitialFrozens(accounts); @@ -422,7 +422,7 @@ describe('Integration tests', function () { schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider - workerStakePerTask + workerRewardPerTask, // Worker + workerStakePerTask + workersRewardPerTask, // Worker ], ); // Multiply amount by the number of finalized tasks to correctly compute @@ -456,11 +456,11 @@ describe('Integration tests', function () { ...orders.toArray(), ); const schedulerStakePerTask = schedulerStakePerDeal / volume; - const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardPerTask( dealId, PocoMode.CLASSIC, ); - const schedulerRewardPerTask = workerpoolPrice - workerRewardPerTask; + const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; const accountsInitialFrozens = await getInitialFrozens(accounts); @@ -494,7 +494,7 @@ describe('Integration tests', function () { schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider - workerStakePerTask + workerRewardPerTask, // Worker + workerStakePerTask + workersRewardPerTask, // Worker ], ); // Calculate expected frozen changes @@ -529,11 +529,11 @@ describe('Integration tests', function () { await iexecWrapper.signAndMatchOrders(...orders.toArray()); const taskPrice = appPrice + datasetPrice + workerpoolPrice; const schedulerStakePerTask = schedulerStakePerDeal / volume; - const workerRewardPerTask = await iexecWrapper.computeWorkerRewardPerTask( + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardPerTask( dealId, PocoMode.CLASSIC, ); - const schedulerRewardPerTask = workerpoolPrice - workerRewardPerTask; + const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; const accountsInitialFrozens = await getInitialFrozens(accounts); for (let i = 0; i < workerNumber; i++) { @@ -564,7 +564,7 @@ describe('Integration tests', function () { workerStake * workers.length ); const expectedWorkerBalanceChange = - workerStake + workerRewardPerTask / workerNumber; + workerStake + workersRewardPerTask / workerNumber; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -662,14 +662,14 @@ describe('Integration tests', function () { const totalWorkerPoolReward = workerpoolPrice + workerStake * 1; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task - const workerRewardPerTask = await computeWorkerRewardForCurrentTask( + const workersRewardPerTask = await computeWorkerRewardForCurrentTask( totalWorkerPoolReward, dealId, ); const expectedWorkerBalanceChange = - workerStake + workerRewardPerTask / winningWorkers.length; + workerStake + workersRewardPerTask / winningWorkers.length; // compute expected scheduler reward for current task - const schedulerRewardPerTask = totalWorkerPoolReward - workerRewardPerTask; + const schedulerRewardPerTask = totalWorkerPoolReward - workersRewardPerTask; const expectedSchedulerBalanceChange = schedulerStakePerTask + schedulerRewardPerTask; const expectedProxyBalanceChange = -( diff --git a/test/200_fullchain-bot.test.ts b/test/200_fullchain-bot.test.ts index 6c6180d0d..f7c9cdeff 100644 --- a/test/200_fullchain-bot.test.ts +++ b/test/200_fullchain-bot.test.ts @@ -175,14 +175,14 @@ describe('Integration tests', function () { const totalWorkerPoolReward = workerpoolPrice + workerStakePerTask * loosingWorkers.length; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task - const workerRewardPerTask = await computeWorkersRewardForCurrentTask( + const workersRewardPerTask = await computeWorkersRewardForCurrentTask( totalWorkerPoolReward, dealId, ); const expectedWinningWorkerBalanceChange = - workerStakePerTask + workerRewardPerTask / winningWorkers.length; + workerStakePerTask + workersRewardPerTask / winningWorkers.length; // compute expected scheduler reward for current task - const schedulerRewardPerTask = totalWorkerPoolReward - workerRewardPerTask; + const schedulerRewardPerTask = totalWorkerPoolReward - workersRewardPerTask; const expectedSchedulerBalanceChange = schedulerStakePerTask + schedulerRewardPerTask; const expectedProxyBalanceChange = -( diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index c9baede00..0c5b66c84 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -159,7 +159,7 @@ export class IexecWrapper { * @param mode * @returns */ - async computeWorkerRewardPerTask(dealId: string, mode: PocoMode) { + async computeWorkersRewardPerTask(dealId: string, mode: PocoMode) { if (mode === PocoMode.BOOST) { return ( await IexecPocoBoostAccessors__factory.connect( From 1d93b5e01f635e58f63d76c106d129c96d05efaf Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 10:14:31 +0100 Subject: [PATCH 03/10] create commons file with commons function --- test/000_fullchain.test.ts | 70 ++++++++++------------------------ test/200_fullchain-bot.test.ts | 46 ++++++---------------- test/utils/commons.ts | 46 ++++++++++++++++++++++ 3 files changed, 78 insertions(+), 84 deletions(-) create mode 100644 test/utils/commons.ts diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index 53d590cbd..aeab00e99 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -15,6 +15,11 @@ import { getIexecAccounts, } from '../utils/poco-tools'; import { IexecWrapper } from './utils/IexecWrapper'; +import { + checkFrozenChanges, + computeWorkersRewardForCurrentTask, + getInitialFrozens, +} from './utils/commons'; // +---------+-------------+-------------+-------------+----------+-----+---------------------------------------------+ // | | Sponsorship | Replication | Beneficiary | Callback | BoT | Type | @@ -130,7 +135,7 @@ describe('Integration tests', function () { // Save frozens const accounts = [sponsor, requester, scheduler, appProvider, datasetProvider, ...workers]; - const accountsInitialFrozens = await getInitialFrozens(accounts); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); const workerStakePerTask = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); @@ -191,7 +196,7 @@ describe('Integration tests', function () { 0, // DatasetProvider, ...workers.map(() => 0), // Add 0 for each worker ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); } }); @@ -222,7 +227,7 @@ describe('Integration tests', function () { // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, ...workers]; - const accountsInitialFrozens = await getInitialFrozens(accounts); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); // Finalize each task and check balance changes. const workerStake = await iexecPoco .viewDeal(dealId) @@ -280,7 +285,7 @@ describe('Integration tests', function () { 0, // DatasetProvider ...workers.map(() => 0), // Add 0 for each worker ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); } }); @@ -308,7 +313,7 @@ describe('Integration tests', function () { const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [sponsor, requester, scheduler, appProvider, datasetProvider, worker1]; - const accountsInitialFrozens = await getInitialFrozens(accounts); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); // Finalize each task and check balance changes. for (let taskIndex = 0; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); @@ -358,7 +363,7 @@ describe('Integration tests', function () { 0, // DatasetProvider 0, // Worker ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); } }); @@ -387,7 +392,7 @@ describe('Integration tests', function () { const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; - const accountsInitialFrozens = await getInitialFrozens(accounts); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); // Finalize each task and check balance changes. for (let taskIndex = 0; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); @@ -437,7 +442,7 @@ describe('Integration tests', function () { 0, // DatasetProvider 0, // Worker ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); } }); @@ -463,7 +468,7 @@ describe('Integration tests', function () { const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; - const accountsInitialFrozens = await getInitialFrozens(accounts); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); const taskIndex = 0; const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); const { workerStakePerTask } = await iexecWrapper.contributeToTeeTask( @@ -506,7 +511,7 @@ describe('Integration tests', function () { 0, // DatasetProvider 0, // Worker ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); }); describe('Integration tests array of worker', function () { @@ -534,7 +539,7 @@ describe('Integration tests', function () { PocoMode.CLASSIC, ); const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; - const accountsInitialFrozens = await getInitialFrozens(accounts); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); for (let i = 0; i < workerNumber; i++) { expect(await iexecPoco.viewScore(workers[i].address)).to.be.equal(0); @@ -588,7 +593,7 @@ describe('Integration tests', function () { 0, ...workers.map(() => 0), ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); for (let i = 0; i < workerNumber; i++) { expect(await iexecPoco.viewScore(workers[i].address)).to.be.equal( workerNumber == 1 ? 0 : 1, @@ -629,7 +634,7 @@ describe('Integration tests', function () { ...orders.toArray(), ); const schedulerStakePerTask = schedulerStakePerDeal / volume; - const accountsInitialFrozens = await getInitialFrozens(accounts); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); // Check initial balances. for (const contributor of contributions) { expect(await iexecPoco.viewScore(contributor.signer.address)).to.be.equal(0); @@ -662,7 +667,8 @@ describe('Integration tests', function () { const totalWorkerPoolReward = workerpoolPrice + workerStake * 1; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task - const workersRewardPerTask = await computeWorkerRewardForCurrentTask( + const workersRewardPerTask = await computeWorkersRewardForCurrentTask( + iexecPoco, totalWorkerPoolReward, dealId, ); @@ -707,40 +713,6 @@ describe('Integration tests', function () { 0, ...workersAvailable.map(() => 0), ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); }); - - async function getInitialFrozens(accounts: SignerWithAddress[]) { - let initialFrozens = [ - { - address: proxyAddress, - frozen: (await iexecPoco.frozenOf(proxyAddress)).toNumber(), - }, - ]; - for (const account of accounts) { - initialFrozens.push({ - address: account.address, - frozen: (await iexecPoco.frozenOf(account.address)).toNumber(), - }); - } - return initialFrozens; - } - - async function computeWorkerRewardForCurrentTask(totalPoolReward: number, dealId: string) { - const deal = await iexecPoco.viewDeal(dealId); - return (totalPoolReward * (100 - deal.schedulerRewardRatio.toNumber())) / 100; - } }); - -async function checkFrozenChanges( - accountsInitialFrozens: { address: string; frozen: number }[], - expectedFrozenChanges: number[], -) { - for (let i = 0; i < accountsInitialFrozens.length; i++) { - const message = `Failed with account at index ${i}`; - expect(await iexecPoco.frozenOf(accountsInitialFrozens[i].address)).to.equal( - accountsInitialFrozens[i].frozen + expectedFrozenChanges[i], - message, - ); - } -} diff --git a/test/200_fullchain-bot.test.ts b/test/200_fullchain-bot.test.ts index f7c9cdeff..26b88b36d 100644 --- a/test/200_fullchain-bot.test.ts +++ b/test/200_fullchain-bot.test.ts @@ -9,6 +9,11 @@ import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../typechai import { OrdersActors, OrdersAssets, OrdersPrices, buildOrders } from '../utils/createOrders'; import { TaskStatusEnum, buildUtf8ResultAndDigest, getIexecAccounts } from '../utils/poco-tools'; import { IexecWrapper } from './utils/IexecWrapper'; +import { + checkFrozenChanges, + computeWorkersRewardForCurrentTask, + getInitialFrozens, +} from './utils/commons'; const standardDealTag = '0x0000000000000000000000000000000000000000000000000000000000000000'; const appPrice = 1000; @@ -120,7 +125,10 @@ describe('Integration tests', function () { const schedulerStakePerTask = schedulerStakePerDeal / volume; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider]; - const accountsInitialFrozens = await getInitialFrozens([...accounts, ...workers]); + const accountsInitialFrozens = await getInitialFrozens(iexecPoco, [ + ...accounts, + ...workers, + ]); // Track initial scores // Finalize each task and check balance changes. const workerStakePerTask = await iexecPoco @@ -176,6 +184,7 @@ describe('Integration tests', function () { workerpoolPrice + workerStakePerTask * loosingWorkers.length; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task const workersRewardPerTask = await computeWorkersRewardForCurrentTask( + iexecPoco, totalWorkerPoolReward, dealId, ); @@ -223,7 +232,7 @@ describe('Integration tests', function () { 0, // DatasetProvider ...workers.map(() => 0), // Add 0 for each worker ]; - await checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); + await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); await validateScores( initialScores, winningWorkers, @@ -232,21 +241,6 @@ describe('Integration tests', function () { ); } }); - async function getInitialFrozens(accounts: SignerWithAddress[]) { - let initialFrozens = [ - { - address: proxyAddress, - frozen: (await iexecPoco.frozenOf(proxyAddress)).toNumber(), - }, - ]; - for (const account of accounts) { - initialFrozens.push({ - address: account.address, - frozen: (await iexecPoco.frozenOf(account.address)).toNumber(), - }); - } - return initialFrozens; - } async function getInitialScores( workers: SignerWithAddress[], @@ -257,26 +251,8 @@ describe('Integration tests', function () { } return scores; } - - async function computeWorkersRewardForCurrentTask(totalPoolReward: number, dealId: string) { - const deal = await iexecPoco.viewDeal(dealId); - return (totalPoolReward * (100 - deal.schedulerRewardRatio.toNumber())) / 100; - } }); -async function checkFrozenChanges( - accountsInitialFrozens: { address: string; frozen: number }[], - expectedFrozenChanges: number[], -) { - for (let i = 0; i < accountsInitialFrozens.length; i++) { - const message = `Failed with account at index ${i}`; - expect(await iexecPoco.frozenOf(accountsInitialFrozens[i].address)).to.equal( - accountsInitialFrozens[i].frozen + expectedFrozenChanges[i], - message, - ); - } -} - async function validateScores( initialScores: { [address: string]: number }, winningWorkers: SignerWithAddress[], diff --git a/test/utils/commons.ts b/test/utils/commons.ts new file mode 100644 index 000000000..c232145ac --- /dev/null +++ b/test/utils/commons.ts @@ -0,0 +1,46 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; +import { expect } from 'hardhat'; +import { IexecInterfaceNative } from '../../typechain'; + +export async function getInitialFrozens( + iexecPoco: IexecInterfaceNative, + accounts: SignerWithAddress[], +) { + const proxyAddress = iexecPoco.address; + let initialFrozens = [ + { + address: proxyAddress, + frozen: (await iexecPoco.frozenOf(proxyAddress)).toNumber(), + }, + ]; + for (const account of accounts) { + initialFrozens.push({ + address: account.address, + frozen: (await iexecPoco.frozenOf(account.address)).toNumber(), + }); + } + return initialFrozens; +} + +export async function checkFrozenChanges( + iexecPoco: IexecInterfaceNative, + accountsInitialFrozens: { address: string; frozen: number }[], + expectedFrozenChanges: number[], +) { + for (let i = 0; i < accountsInitialFrozens.length; i++) { + const message = `Failed with account at index ${i}`; + expect(await iexecPoco.frozenOf(accountsInitialFrozens[i].address)).to.equal( + accountsInitialFrozens[i].frozen + expectedFrozenChanges[i], + message, + ); + } +} + +export async function computeWorkersRewardForCurrentTask( + iexecPoco: IexecInterfaceNative, + totalPoolReward: number, + dealId: string, +) { + const deal = await iexecPoco.viewDeal(dealId); + return (totalPoolReward * (100 - deal.schedulerRewardRatio.toNumber())) / 100; +} From 5977f55da62b5ca848067455681b6225d6d6666c Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 10:43:43 +0100 Subject: [PATCH 04/10] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 238f1ca94..8b39cdb51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - 000_fullchain-5workers-1error.js (#160, #162) - Clean ToDo (#163) - 200_fullchain-bot.js (#164) + - Fix math and refactor (#165) - Remove `smock` from unit tests: - IexecEscrow.v8 (#154, #155) - IexecPocoDelegate (#149, #151) From c078242104218ad3a72eae5018789144ad86024f Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 13:49:41 +0100 Subject: [PATCH 05/10] rename to workerStakePerTask --- test/000_fullchain.test.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index aeab00e99..8572d49bb 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -229,7 +229,7 @@ describe('Integration tests', function () { const accounts = [requester, scheduler, appProvider, datasetProvider, ...workers]; const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); // Finalize each task and check balance changes. - const workerStake = await iexecPoco + const workerStakePerTask = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); for (let taskIndex = 0; taskIndex < volume; taskIndex++) { @@ -258,9 +258,10 @@ describe('Integration tests', function () { const expectedProxyBalanceChange = -( taskPrice + schedulerStakePerTask + - workerStake * workers.length + workerStakePerTask * workers.length ); - const expectedWorkerBalanceChange = workerStake + workersRewardPerTask / workers.length; + const expectedWorkerBalanceChange = + workerStakePerTask + workersRewardPerTask / workers.length; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -546,7 +547,7 @@ describe('Integration tests', function () { } const taskId = await iexecWrapper.initializeTask(dealId, 0); // Finalize each task and check balance changes. - const workerStake = await iexecPoco + const workerStakePerTask = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); @@ -566,10 +567,10 @@ describe('Integration tests', function () { const expectedProxyBalanceChange = -( dealPrice + schedulerStakePerTask + - workerStake * workers.length + workerStakePerTask * workers.length ); const expectedWorkerBalanceChange = - workerStake + workersRewardPerTask / workerNumber; + workerStakePerTask + workersRewardPerTask / workerNumber; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -641,7 +642,7 @@ describe('Integration tests', function () { } const taskId = await iexecWrapper.initializeTask(dealId, 0); // Finalize task and check balance changes. - const workerStake = await iexecPoco + const workerStakePerTask = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); for (const contributor of contributions) { @@ -665,7 +666,7 @@ describe('Integration tests', function () { const finalizeTx = await iexecPoco.connect(scheduler).finalize(taskId, results, '0x'); await finalizeTx.wait(); - const totalWorkerPoolReward = workerpoolPrice + workerStake * 1; // bad wrokers lose their stake and add it to the pool price + const totalWorkerPoolReward = workerpoolPrice + workerStakePerTask * 1; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task const workersRewardPerTask = await computeWorkersRewardForCurrentTask( iexecPoco, @@ -673,14 +674,14 @@ describe('Integration tests', function () { dealId, ); const expectedWorkerBalanceChange = - workerStake + workersRewardPerTask / winningWorkers.length; + workerStakePerTask + workersRewardPerTask / winningWorkers.length; // compute expected scheduler reward for current task const schedulerRewardPerTask = totalWorkerPoolReward - workersRewardPerTask; const expectedSchedulerBalanceChange = schedulerStakePerTask + schedulerRewardPerTask; const expectedProxyBalanceChange = -( dealPrice + - workerStake * workersAvailable.length + + workerStakePerTask * workersAvailable.length + schedulerStakePerTask ); await expect(finalizeTx).to.changeTokenBalances( From 689adfce65843bcb0d19317ce113ddd62c467044 Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 13:52:24 +0100 Subject: [PATCH 06/10] rename to allWorkers --- test/000_fullchain.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index 8572d49bb..d2886f2c6 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -519,8 +519,8 @@ describe('Integration tests', function () { for (let workerNumber = 2; workerNumber < 6; workerNumber++) { it(`[6.${workerNumber - 1}] No sponsorship, no beneficiary, no callback, no BoT, up to ${workerNumber} workers`, async function () { const volume = 1; - const disposableWorkers = [worker1, worker2, worker3, worker4, worker5]; - const workers = disposableWorkers.slice(0, workerNumber); + const allWorkers = [worker1, worker2, worker3, worker4, worker5]; + const workers = allWorkers.slice(0, workerNumber); const accounts = [requester, scheduler, appProvider, datasetProvider, ...workers]; // Create deal. const orders = buildOrders({ @@ -605,10 +605,10 @@ describe('Integration tests', function () { }); it(`[7] No sponsorship, no beneficiary, no callback, no BoT, up to 5 workers with 1 bad worker`, async function () { const volume = 1; - const workersAvailable = [worker1, worker2, worker3, worker4, worker5]; + const allWorkers = [worker1, worker2, worker3, worker4, worker5]; const { resultDigest: badResultDigest } = buildUtf8ResultAndDigest('bad-result'); const losingWorker = worker1; - const winningWorkers = workersAvailable.slice(1, workersAvailable.length); + const winningWorkers = allWorkers.slice(1, allWorkers.length); let contributions = [{ signer: worker1, resultDigest: badResultDigest }]; for (const worker of winningWorkers) { contributions.push({ signer: worker, resultDigest: resultDigest }); @@ -681,7 +681,7 @@ describe('Integration tests', function () { const expectedProxyBalanceChange = -( dealPrice + - workerStakePerTask * workersAvailable.length + + workerStakePerTask * allWorkers.length + schedulerStakePerTask ); await expect(finalizeTx).to.changeTokenBalances( @@ -712,7 +712,7 @@ describe('Integration tests', function () { -schedulerStakePerTask, 0, 0, - ...workersAvailable.map(() => 0), + ...allWorkers.map(() => 0), ]; await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); }); From bc3b4a69dbc09f950b8e6bc5e15ab8a70b376974 Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 13:59:48 +0100 Subject: [PATCH 07/10] update expectedWinningWorkerBalanceChange name --- test/000_fullchain.test.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index d2886f2c6..fef7744bb 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -168,7 +168,7 @@ describe('Integration tests', function () { schedulerStakePerTask + workerStakePerTask * workers.length ); - const expectedWorkerBalanceChange = + const expectedWinningWorkerBalanceChange = workerStakePerTask + workersRewardPerTask / workers.length; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, @@ -180,7 +180,7 @@ describe('Integration tests', function () { schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider - ...workers.map(() => expectedWorkerBalanceChange), // Workers + ...workers.map(() => expectedWinningWorkerBalanceChange), // Workers ], ); // Multiply amount by the number of finalized tasks to correctly compute @@ -260,7 +260,7 @@ describe('Integration tests', function () { schedulerStakePerTask + workerStakePerTask * workers.length ); - const expectedWorkerBalanceChange = + const expectedWinningWorkerBalanceChange = workerStakePerTask + workersRewardPerTask / workers.length; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, @@ -271,7 +271,7 @@ describe('Integration tests', function () { schedulerStakePerTask + schedulerRewardPerTask, // Scheduler appPrice, // AppProvider datasetPrice, // DatasetProvider - ...workers.map(() => expectedWorkerBalanceChange), // Workers + ...workers.map(() => expectedWinningWorkerBalanceChange), // Workers ], ); // Multiply amount by the number of finalized tasks to correctly compute @@ -569,7 +569,7 @@ describe('Integration tests', function () { schedulerStakePerTask + workerStakePerTask * workers.length ); - const expectedWorkerBalanceChange = + const expectedWinningWorkerBalanceChange = workerStakePerTask + workersRewardPerTask / workerNumber; await expect(finalizeTx).to.changeTokenBalances( iexecPoco, @@ -580,7 +580,7 @@ describe('Integration tests', function () { schedulerStakePerTask + schedulerRewardPerTask, appPrice, datasetPrice, - ...workers.map(() => expectedWorkerBalanceChange), // Workers + ...workers.map(() => expectedWinningWorkerBalanceChange), // Workers ], ); expect((await iexecPoco.viewTask(taskId)).status).to.equal( @@ -673,7 +673,7 @@ describe('Integration tests', function () { totalWorkerPoolReward, dealId, ); - const expectedWorkerBalanceChange = + const expectedWinningWorkerBalanceChange = workerStakePerTask + workersRewardPerTask / winningWorkers.length; // compute expected scheduler reward for current task const schedulerRewardPerTask = totalWorkerPoolReward - workersRewardPerTask; @@ -694,7 +694,7 @@ describe('Integration tests', function () { appPrice, datasetPrice, 0, // losing worker - ...winningWorkers.map(() => expectedWorkerBalanceChange), // winning workers + ...winningWorkers.map(() => expectedWinningWorkerBalanceChange), // winning workers ], ); // checks on losing worker From df2ebb6df7cd616d51f45e5d969e050dd1ae9ec1 Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 14:08:31 +0100 Subject: [PATCH 08/10] remove commons file --- test/000_fullchain.test.ts | 39 ++++++++++++------------- test/200_fullchain-bot.test.ts | 12 ++------ test/utils/IexecWrapper.ts | 52 +++++++++++++++++++++++++++++++++- test/utils/commons.ts | 46 ------------------------------ 4 files changed, 72 insertions(+), 77 deletions(-) delete mode 100644 test/utils/commons.ts diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index fef7744bb..c06c4046f 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -15,11 +15,6 @@ import { getIexecAccounts, } from '../utils/poco-tools'; import { IexecWrapper } from './utils/IexecWrapper'; -import { - checkFrozenChanges, - computeWorkersRewardForCurrentTask, - getInitialFrozens, -} from './utils/commons'; // +---------+-------------+-------------+-------------+----------+-----+---------------------------------------------+ // | | Sponsorship | Replication | Beneficiary | Callback | BoT | Type | @@ -135,7 +130,7 @@ describe('Integration tests', function () { // Save frozens const accounts = [sponsor, requester, scheduler, appProvider, datasetProvider, ...workers]; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); const workerStakePerTask = await iexecPoco .viewDeal(dealId) .then((deal) => deal.workerStake.toNumber()); @@ -196,7 +191,7 @@ describe('Integration tests', function () { 0, // DatasetProvider, ...workers.map(() => 0), // Add 0 for each worker ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); @@ -227,7 +222,7 @@ describe('Integration tests', function () { // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, ...workers]; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); // Finalize each task and check balance changes. const workerStakePerTask = await iexecPoco .viewDeal(dealId) @@ -286,7 +281,7 @@ describe('Integration tests', function () { 0, // DatasetProvider ...workers.map(() => 0), // Add 0 for each worker ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); @@ -314,7 +309,7 @@ describe('Integration tests', function () { const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [sponsor, requester, scheduler, appProvider, datasetProvider, worker1]; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); // Finalize each task and check balance changes. for (let taskIndex = 0; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); @@ -364,7 +359,7 @@ describe('Integration tests', function () { 0, // DatasetProvider 0, // Worker ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); @@ -393,7 +388,7 @@ describe('Integration tests', function () { const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); // Finalize each task and check balance changes. for (let taskIndex = 0; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); @@ -443,7 +438,7 @@ describe('Integration tests', function () { 0, // DatasetProvider 0, // Worker ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); @@ -469,7 +464,7 @@ describe('Integration tests', function () { const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); const taskIndex = 0; const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); const { workerStakePerTask } = await iexecWrapper.contributeToTeeTask( @@ -512,7 +507,7 @@ describe('Integration tests', function () { 0, // DatasetProvider 0, // Worker ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); }); describe('Integration tests array of worker', function () { @@ -540,7 +535,7 @@ describe('Integration tests', function () { PocoMode.CLASSIC, ); const schedulerRewardPerTask = workerpoolPrice - workersRewardPerTask; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); for (let i = 0; i < workerNumber; i++) { expect(await iexecPoco.viewScore(workers[i].address)).to.be.equal(0); @@ -594,7 +589,10 @@ describe('Integration tests', function () { 0, ...workers.map(() => 0), ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges( + accountsInitialFrozens, + expectedFrozenChanges, + ); for (let i = 0; i < workerNumber; i++) { expect(await iexecPoco.viewScore(workers[i].address)).to.be.equal( workerNumber == 1 ? 0 : 1, @@ -635,7 +633,7 @@ describe('Integration tests', function () { ...orders.toArray(), ); const schedulerStakePerTask = schedulerStakePerDeal / volume; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, accounts); + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); // Check initial balances. for (const contributor of contributions) { expect(await iexecPoco.viewScore(contributor.signer.address)).to.be.equal(0); @@ -668,8 +666,7 @@ describe('Integration tests', function () { const totalWorkerPoolReward = workerpoolPrice + workerStakePerTask * 1; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task - const workersRewardPerTask = await computeWorkersRewardForCurrentTask( - iexecPoco, + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardForCurrentTask( totalWorkerPoolReward, dealId, ); @@ -714,6 +711,6 @@ describe('Integration tests', function () { 0, ...allWorkers.map(() => 0), ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); }); }); diff --git a/test/200_fullchain-bot.test.ts b/test/200_fullchain-bot.test.ts index 26b88b36d..ebbaaed6c 100644 --- a/test/200_fullchain-bot.test.ts +++ b/test/200_fullchain-bot.test.ts @@ -9,11 +9,6 @@ import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../typechai import { OrdersActors, OrdersAssets, OrdersPrices, buildOrders } from '../utils/createOrders'; import { TaskStatusEnum, buildUtf8ResultAndDigest, getIexecAccounts } from '../utils/poco-tools'; import { IexecWrapper } from './utils/IexecWrapper'; -import { - checkFrozenChanges, - computeWorkersRewardForCurrentTask, - getInitialFrozens, -} from './utils/commons'; const standardDealTag = '0x0000000000000000000000000000000000000000000000000000000000000000'; const appPrice = 1000; @@ -125,7 +120,7 @@ describe('Integration tests', function () { const schedulerStakePerTask = schedulerStakePerDeal / volume; // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider]; - const accountsInitialFrozens = await getInitialFrozens(iexecPoco, [ + const accountsInitialFrozens = await iexecWrapper.getInitialFrozens([ ...accounts, ...workers, ]); @@ -183,8 +178,7 @@ describe('Integration tests', function () { const totalWorkerPoolReward = workerpoolPrice + workerStakePerTask * loosingWorkers.length; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task - const workersRewardPerTask = await computeWorkersRewardForCurrentTask( - iexecPoco, + const workersRewardPerTask = await iexecWrapper.computeWorkersRewardForCurrentTask( totalWorkerPoolReward, dealId, ); @@ -232,7 +226,7 @@ describe('Integration tests', function () { 0, // DatasetProvider ...workers.map(() => 0), // Add 0 for each worker ]; - await checkFrozenChanges(iexecPoco, accountsInitialFrozens, expectedFrozenChanges); + await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); await validateScores( initialScores, winningWorkers, diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 0c5b66c84..0765c9c0a 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -5,7 +5,7 @@ import { TypedDataDomain } from '@ethersproject/abstract-signer'; import { AddressZero } from '@ethersproject/constants'; import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { BigNumber, ContractReceipt } from 'ethers'; -import hre, { ethers } from 'hardhat'; +import hre, { ethers, expect } from 'hardhat'; import config from '../../config/config.json'; import { AppRegistry, @@ -464,6 +464,56 @@ export class IexecWrapper { .then((tx) => tx.wait()); return await extractRegistryEntryAddress(workerpoolReceipt, workerpoolRegistry.address); } + async getInitialFrozens(accounts: SignerWithAddress[]) { + const initialFrozens = [ + { + address: this.proxyAddress, + frozen: ( + await IexecInterfaceNative__factory.connect( + this.proxyAddress, + ethers.provider, + ).frozenOf(this.proxyAddress) + ).toNumber(), + }, + ]; + for (const account of accounts) { + initialFrozens.push({ + address: account.address, + frozen: ( + await IexecInterfaceNative__factory.connect( + this.proxyAddress, + ethers.provider, + ).frozenOf(account.address) + ).toNumber(), + }); + } + return initialFrozens; + } + + async checkFrozenChanges( + accountsInitialFrozens: { address: string; frozen: number }[], + expectedFrozenChanges: number[], + ) { + for (let i = 0; i < accountsInitialFrozens.length; i++) { + const actualFrozen = ( + await IexecInterfaceNative__factory.connect( + this.proxyAddress, + ethers.provider, + ).frozenOf(accountsInitialFrozens[i].address) + ).toNumber(); + + const expectedFrozen = accountsInitialFrozens[i].frozen + expectedFrozenChanges[i]; + expect(actualFrozen).to.equal(expectedFrozen, `Mismatch at index ${i}`); + } + } + + async computeWorkersRewardForCurrentTask(totalPoolReward: number, dealId: string) { + const deal = await IexecInterfaceNative__factory.connect( + this.proxyAddress, + ethers.provider, + ).viewDeal(dealId); + return (totalPoolReward * (100 - deal.schedulerRewardRatio.toNumber())) / 100; + } } /** diff --git a/test/utils/commons.ts b/test/utils/commons.ts deleted file mode 100644 index c232145ac..000000000 --- a/test/utils/commons.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; -import { expect } from 'hardhat'; -import { IexecInterfaceNative } from '../../typechain'; - -export async function getInitialFrozens( - iexecPoco: IexecInterfaceNative, - accounts: SignerWithAddress[], -) { - const proxyAddress = iexecPoco.address; - let initialFrozens = [ - { - address: proxyAddress, - frozen: (await iexecPoco.frozenOf(proxyAddress)).toNumber(), - }, - ]; - for (const account of accounts) { - initialFrozens.push({ - address: account.address, - frozen: (await iexecPoco.frozenOf(account.address)).toNumber(), - }); - } - return initialFrozens; -} - -export async function checkFrozenChanges( - iexecPoco: IexecInterfaceNative, - accountsInitialFrozens: { address: string; frozen: number }[], - expectedFrozenChanges: number[], -) { - for (let i = 0; i < accountsInitialFrozens.length; i++) { - const message = `Failed with account at index ${i}`; - expect(await iexecPoco.frozenOf(accountsInitialFrozens[i].address)).to.equal( - accountsInitialFrozens[i].frozen + expectedFrozenChanges[i], - message, - ); - } -} - -export async function computeWorkersRewardForCurrentTask( - iexecPoco: IexecInterfaceNative, - totalPoolReward: number, - dealId: string, -) { - const deal = await iexecPoco.viewDeal(dealId); - return (totalPoolReward * (100 - deal.schedulerRewardRatio.toNumber())) / 100; -} From d0500bd1565213188a677a33ca46bf149359e0c7 Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 14:09:32 +0100 Subject: [PATCH 09/10] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b39cdb51..b70cd3ad0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ - 000_fullchain-5workers-1error.js (#160, #162) - Clean ToDo (#163) - 200_fullchain-bot.js (#164) - - Fix math and refactor (#165) + - Fix balance checks in integration tests (#165) - Remove `smock` from unit tests: - IexecEscrow.v8 (#154, #155) - IexecPocoDelegate (#149, #151) From f3636b0ce292ad96d3ccdb984d5625c26160bd3a Mon Sep 17 00:00:00 2001 From: Gabriel Fournier Date: Tue, 10 Dec 2024 15:58:31 +0100 Subject: [PATCH 10/10] save poco instance internaly in functions --- test/utils/IexecWrapper.ts | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 0765c9c0a..f5ca9e840 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -464,27 +464,19 @@ export class IexecWrapper { .then((tx) => tx.wait()); return await extractRegistryEntryAddress(workerpoolReceipt, workerpoolRegistry.address); } + async getInitialFrozens(accounts: SignerWithAddress[]) { + let iexecPoco = IexecInterfaceNative__factory.connect(this.proxyAddress, ethers.provider); const initialFrozens = [ { address: this.proxyAddress, - frozen: ( - await IexecInterfaceNative__factory.connect( - this.proxyAddress, - ethers.provider, - ).frozenOf(this.proxyAddress) - ).toNumber(), + frozen: (await iexecPoco.frozenOf(this.proxyAddress)).toNumber(), }, ]; for (const account of accounts) { initialFrozens.push({ address: account.address, - frozen: ( - await IexecInterfaceNative__factory.connect( - this.proxyAddress, - ethers.provider, - ).frozenOf(account.address) - ).toNumber(), + frozen: (await iexecPoco.frozenOf(account.address)).toNumber(), }); } return initialFrozens; @@ -494,12 +486,10 @@ export class IexecWrapper { accountsInitialFrozens: { address: string; frozen: number }[], expectedFrozenChanges: number[], ) { + let iexecPoco = IexecInterfaceNative__factory.connect(this.proxyAddress, ethers.provider); for (let i = 0; i < accountsInitialFrozens.length; i++) { const actualFrozen = ( - await IexecInterfaceNative__factory.connect( - this.proxyAddress, - ethers.provider, - ).frozenOf(accountsInitialFrozens[i].address) + await iexecPoco.frozenOf(accountsInitialFrozens[i].address) ).toNumber(); const expectedFrozen = accountsInitialFrozens[i].frozen + expectedFrozenChanges[i];