diff --git a/CHANGELOG.md b/CHANGELOG.md index cb86dff95..36f604982 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## vNEXT +- Clean some TODOs and harmonize unit tests. (#123) - Add `set-callback-gas.ts` script. (#121) - Accept any signature format in `SignatureVerifier.v8` when the account is a smart contract. (#120) - Update UML class diagrams. (#112) diff --git a/contracts/libs/IexecLibCore_v5.sol b/contracts/libs/IexecLibCore_v5.sol index 1fd3bda78..edf566315 100644 --- a/contracts/libs/IexecLibCore_v5.sol +++ b/contracts/libs/IexecLibCore_v5.sol @@ -1,21 +1,5 @@ // SPDX-FileCopyrightText: 2020-2024 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -// TODO: Remove header bellow -/****************************************************************************** - * Copyright 2020 IEXEC BLOCKCHAIN TECH * - * * - * Licensed under the Apache License, Version 2.0 (the "License"); * - * you may not use this file except in compliance with the License. * - * You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, software * - * distributed under the License is distributed on an "AS IS" BASIS, * - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * - * See the License for the specific language governing permissions and * - * limitations under the License. * - ******************************************************************************/ pragma solidity >=0.6.0; diff --git a/test/000_fullchain-boost.test.ts b/test/000_fullchain-boost.test.ts index fd588628e..1c5324161 100644 --- a/test/000_fullchain-boost.test.ts +++ b/test/000_fullchain-boost.test.ts @@ -19,7 +19,6 @@ import { } from '../typechain'; import constants from '../utils/constants'; import { - Orders, OrdersActors, OrdersAssets, OrdersPrices, @@ -131,7 +130,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { describe('MatchOrders', function () { it('Should match orders (TEE)', async function () { const callbackAddress = ethers.Wallet.createRandom().address; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, beneficiary: beneficiary.address, @@ -139,6 +138,12 @@ describe('IexecPocoBoostDelegate (IT)', function () { prices: ordersPrices, callback: callbackAddress, }); + const { + appOrder, + datasetOrder, + workerpoolOrder, + requesterOrder: requestOrder, + } = orders.toObject(); const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * // task price 1; // volume @@ -157,17 +162,11 @@ describe('IexecPocoBoostDelegate (IT)', function () { await signOrders(domain, orders, ordersActors); const dealId = getDealId(domain, requestOrder, taskIndex); const startTime = await setNextBlockTimestamp(); - const matchOrdersArgs = [ - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ] as Orders; expect( - await iexecPocoBoostInstance.callStatic.matchOrdersBoost(...matchOrdersArgs), + await iexecPocoBoostInstance.callStatic.matchOrdersBoost(...orders.toArray()), ).to.equal(dealId); - await expect(iexecPocoBoostInstance.matchOrdersBoost(...matchOrdersArgs)) + await expect(iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray())) .to.emit(iexecPocoBoostInstance, 'SchedulerNoticeBoost') .withArgs( workerpoolAddress, @@ -237,7 +236,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { requester: requester.address, beneficiary: beneficiary.address, tag: teeDealTag, - }); + }).toObject(); await iexecOrderManagementInstance.connect(appProvider).manageAppOrder({ order: appOrder, operation: 0, @@ -292,7 +291,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { it('Should sponsor match orders (TEE)', async function () { const callbackAddress = ethers.Wallet.createRandom().address; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, beneficiary: beneficiary.address, @@ -300,6 +299,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { prices: ordersPrices, callback: callbackAddress, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * // task price 1; // volume @@ -320,20 +320,16 @@ describe('IexecPocoBoostDelegate (IT)', function () { await signOrders(domain, orders, ordersActors); const dealId = getDealId(domain, requestOrder, taskIndex); const startTime = await setNextBlockTimestamp(); - const matchOrdersArgs = [ - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ] as Orders; expect( await iexecPocoBoostInstance .connect(sponsor) - .callStatic.sponsorMatchOrdersBoost(...matchOrdersArgs), + .callStatic.sponsorMatchOrdersBoost(...orders.toArray()), ).to.equal(dealId); await expect( - iexecPocoBoostInstance.connect(sponsor).sponsorMatchOrdersBoost(...matchOrdersArgs), + iexecPocoBoostInstance + .connect(sponsor) + .sponsorMatchOrdersBoost(...orders.toArray()), ) .to.emit(iexecPocoBoostInstance, 'SchedulerNoticeBoost') .withArgs( @@ -402,11 +398,12 @@ describe('IexecPocoBoostDelegate (IT)', function () { describe('PushResult', function () { it('Should push result (TEE & callback)', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); const oracleConsumerInstance = await new TestClient__factory() .connect(anyone) .deploy() @@ -458,13 +455,14 @@ describe('IexecPocoBoostDelegate (IT)', function () { it('Should push result (TEE with contribution authorization signed by scheduler)', async function () { const volume = 3; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, prices: ordersPrices, volume: volume, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * volume; await iexecWrapper.depositInIexecAccount(requester, dealPrice); @@ -569,10 +567,11 @@ describe('IexecPocoBoostDelegate (IT)', function () { it('Should push result (TEE with contribution authorization signed by broker)', async function () { await iexecWrapper.setTeeBroker(teeBroker.address); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); await signOrders(domain, orders, ordersActors); const dealId = getDealId(domain, requestOrder, taskIndex); const taskId = getTaskId(dealId, taskIndex); @@ -616,13 +615,14 @@ describe('IexecPocoBoostDelegate (IT)', function () { const claimedTasks = 1; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * expectedVolume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, prices: ordersPrices, volume: expectedVolume, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); await signOrders(domain, orders, ordersActors); const dealId = getDealId(domain, requestOrder, taskIndex); const taskId = getTaskId(dealId, taskIndex); @@ -697,13 +697,14 @@ describe('IexecPocoBoostDelegate (IT)', function () { const claimedTasks = 1; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * expectedVolume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, prices: ordersPrices, volume: expectedVolume, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); await signOrders(domain, orders, ordersActors); const dealId = getDealId(domain, requestOrder, taskIndex); const taskId = getTaskId(dealId, taskIndex); diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index 85e2e6f24..e187d1c87 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -102,7 +102,7 @@ describe('IexecPoco (IT)', function () { describe('MatchOrders', function () { it('Should sponsor match orders (TEE)', async function () { const callbackAddress = ethers.Wallet.createRandom().address; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, beneficiary: beneficiary.address, diff --git a/test/byContract/IexecOrderManagement/IexecOrderManagement.test.ts b/test/byContract/IexecOrderManagement/IexecOrderManagement.test.ts index a98cd2b07..243f73868 100644 --- a/test/byContract/IexecOrderManagement/IexecOrderManagement.test.ts +++ b/test/byContract/IexecOrderManagement/IexecOrderManagement.test.ts @@ -68,7 +68,7 @@ describe('OrderManagement', async () => { requester: requester.address, prices: ordersPrices, volume, - })); + }).toObject()); appOrderHash = iexecWrapper.hashOrder(appOrder); datasetOrderHash = iexecWrapper.hashOrder(datasetOrder); workerpoolOrderHash = iexecWrapper.hashOrder(workerpoolOrder); diff --git a/test/byContract/IexecPoco/01_initialize.test.ts b/test/byContract/IexecPoco/01_initialize.test.ts index 96d54a6b7..9e91063f3 100644 --- a/test/byContract/IexecPoco/01_initialize.test.ts +++ b/test/byContract/IexecPoco/01_initialize.test.ts @@ -21,7 +21,7 @@ const appPrice = 1000; const datasetPrice = 1_000_000; const workerpoolPrice = 1_000_000_000; -describe('Poco', async () => { +describe('IexecPoco2#initialize', async () => { let proxyAddress: string; let iexecPoco: IexecInterfaceNative; let iexecPocoAsAnyone: IexecInterfaceNative; @@ -60,13 +60,14 @@ describe('Poco', async () => { describe('Initialize', function () { it('Should initialize', async function () { - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); - const { dealId, taskId, taskIndex, startTime } = - await iexecWrapper.signAndMatchOrders(orders); + const { dealId, taskId, taskIndex, startTime } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); expect((await iexecPoco.viewTask(taskId)).status).equal(TaskStatusEnum.UNSET); expect(await iexecPocoAsAnyone.callStatic.initialize(dealId, taskIndex)).to.equal( @@ -93,7 +94,7 @@ describe('Poco', async () => { requester: requester.address, prices: ordersPrices, volume: 10, - }); + }).toObject(); const workerpoolOrder0 = { ...createEmptyWorkerpoolOrder(), workerpool: workerpoolAddress, @@ -107,18 +108,18 @@ describe('Poco', async () => { volume: 9, }; // Request order is matched in 2 deals - const { dealId: dealId0 } = await iexecWrapper.signAndMatchOrders({ - app: appOrder, - dataset: datasetOrder, - workerpool: workerpoolOrder0, - requester: requestOrder, - }); - const { dealId: dealId1 } = await iexecWrapper.signAndMatchOrders({ - app: appOrder, - dataset: datasetOrder, - workerpool: workerpoolOrder1, - requester: requestOrder, - }); + const { dealId: dealId0 } = await iexecWrapper.signAndMatchOrders( + appOrder, + datasetOrder, + workerpoolOrder0, + requestOrder, + ); + const { dealId: dealId1 } = await iexecWrapper.signAndMatchOrders( + appOrder, + datasetOrder, + workerpoolOrder1, + requestOrder, + ); expect((await iexecPoco.viewDeal(dealId0)).botFirst).equal(0); expect((await iexecPoco.viewDeal(dealId1)).botFirst).equal(1); @@ -127,12 +128,12 @@ describe('Poco', async () => { }); it('Should not initialize since index is too high', async function () { - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); - const { dealId } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId } = await iexecWrapper.signAndMatchOrders(...orders.toArray()); const deal = await iexecPoco.viewDeal(dealId); expect(deal.botFirst).equal(0); expect(deal.botSize).equal(1); @@ -142,12 +143,14 @@ describe('Poco', async () => { }); it('Should not initialize twice', async function () { - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); - const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); expect((await iexecPoco.viewTask(taskId)).status).equal(TaskStatusEnum.ACTIVE); @@ -160,13 +163,13 @@ describe('Poco', async () => { describe('Initialize array', function () { it('Should initialize array', async function () { const volume = 3; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, }); - const { dealId } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId } = await iexecWrapper.signAndMatchOrders(...orders.toArray()); const dealIds = [dealId, dealId, dealId]; const taskIndexes = [0, 1, 2]; for (const taskIndex of taskIndexes) { @@ -196,13 +199,13 @@ describe('Poco', async () => { it('Should not initialize array if one specific fails', async function () { const volume = 2; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, }); - const { dealId } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId } = await iexecWrapper.signAndMatchOrders(...orders.toArray()); const taskIndex0 = 0; const taskIndex1 = 1; await iexecPocoAsAnyone // Make first task already initialized diff --git a/test/byContract/IexecPoco/02_contribute.test.ts b/test/byContract/IexecPoco/02_contribute.test.ts index b1d697648..2abbde4c8 100644 --- a/test/byContract/IexecPoco/02_contribute.test.ts +++ b/test/byContract/IexecPoco/02_contribute.test.ts @@ -88,28 +88,28 @@ describe('IexecPoco2#contribute', () => { dataset: datasetPrice, workerpool: workerpoolPrice, }; - ({ orders: defaultOrders } = buildOrders({ + defaultOrders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 0, tag: standardDealTag, - })); + }); } describe('Contribute', () => { it('Should contribute TEE task with multiple workers and broker', async () => { await iexecWrapper.setTeeBroker(sms.address); const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 3, tag: teeDealTag, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco @@ -206,14 +206,14 @@ describe('IexecPoco2#contribute', () => { it('Should contribute TEE task with one worker', async () => { const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 0, tag: teeDealTag, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco @@ -243,8 +243,9 @@ describe('IexecPoco2#contribute', () => { }); it('Should contribute standard task', async () => { - const { dealId, taskIndex, taskId } = - await iexecWrapper.signAndMatchOrders(defaultOrders); + const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( + ...defaultOrders.toArray(), + ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) @@ -273,7 +274,7 @@ describe('IexecPoco2#contribute', () => { }); it('Should not contribute when task not active', async () => { - const { taskId } = await iexecWrapper.signAndMatchOrders(defaultOrders); + const { taskId } = await iexecWrapper.signAndMatchOrders(...defaultOrders.toArray()); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -297,8 +298,9 @@ describe('IexecPoco2#contribute', () => { }); it('Should not contribute after deadline', async () => { - const { dealId, taskIndex, taskId } = - await iexecWrapper.signAndMatchOrders(defaultOrders); + const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( + ...defaultOrders.toArray(), + ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); expect((await iexecPoco.viewTask(taskId)).status).equal(TaskStatusEnum.ACTIVE); const task = await iexecPoco.viewTask(taskId); @@ -329,14 +331,14 @@ describe('IexecPoco2#contribute', () => { it('Should not contribute twice', async () => { const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 3, // so consensus is not yet reached on first contribution tag: standardDealTag, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco @@ -387,14 +389,14 @@ describe('IexecPoco2#contribute', () => { it('Should not contribute when enclave challenge for TEE task is missing', async () => { const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 0, tag: teeDealTag, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -422,8 +424,9 @@ describe('IexecPoco2#contribute', () => { }); it('Should not contribute when scheduler signature is invalid', async () => { - const { dealId, taskIndex, taskId } = - await iexecWrapper.signAndMatchOrders(defaultOrders); + const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( + ...defaultOrders.toArray(), + ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, @@ -451,14 +454,14 @@ describe('IexecPoco2#contribute', () => { it('Should not contribute when enclave signature is invalid', async () => { const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 0, tag: teeDealTag, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -491,8 +494,9 @@ describe('IexecPoco2#contribute', () => { }); it('Should not contribute when no deposit', async () => { - const { dealId, taskIndex, taskId } = - await iexecWrapper.signAndMatchOrders(defaultOrders); + const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( + ...defaultOrders.toArray(), + ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, diff --git a/test/byContract/IexecPoco/03_reveal.test.ts b/test/byContract/IexecPoco/03_reveal.test.ts index 39ef8cb65..f275cb7b4 100644 --- a/test/byContract/IexecPoco/03_reveal.test.ts +++ b/test/byContract/IexecPoco/03_reveal.test.ts @@ -74,15 +74,17 @@ describe('IexecPoco2#reveal', () => { dataset: datasetPrice, workerpool: workerpoolPrice, }; - ({ orders } = buildOrders({ + orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 1, tag: standardDealTag, - })); - ({ dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders(orders)); + }); + ({ dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + )); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) @@ -190,7 +192,7 @@ describe('IexecPoco2#reveal', () => { it('Should not reveal when outside consensus', async () => { const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -198,7 +200,7 @@ describe('IexecPoco2#reveal', () => { trust: 3, tag: standardDealTag, salt: ethers.utils.hexZeroPad('0x' + Date.now().toString(), 32), // make - }).orders, // app and dataset orders unique since already matched in + }).toArray(), // app and dataset orders unique since already matched in // beforeEach. A useless salt is also added to workerpool and request // orders to get an easy one-liner declaration. ); diff --git a/test/byContract/IexecPoco/04_finalize.test.ts b/test/byContract/IexecPoco/04_finalize.test.ts index 392b4f801..1705f2644 100644 --- a/test/byContract/IexecPoco/04_finalize.test.ts +++ b/test/byContract/IexecPoco/04_finalize.test.ts @@ -96,7 +96,7 @@ describe('IexecPoco2#finalize', async () => { .deploy() .then((contract) => contract.deployed()); const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -105,7 +105,7 @@ describe('IexecPoco2#finalize', async () => { callback: oracleConsumerInstance.address, }); const { dealId, taskId, taskIndex, dealPrice } = - await iexecWrapper.signAndSponsorMatchOrders(orders); + await iexecWrapper.signAndSponsorMatchOrders(...orders.toArray()); const schedulerDealStake = await iexecWrapper.computeSchedulerDealStake( workerpoolPrice, expectedVolume, @@ -289,7 +289,7 @@ describe('IexecPoco2#finalize', async () => { }); it('Should finalize task of deal payed by requester (no callback, no dataset)', async () => { - const { orders } = buildOrders({ + const orders = buildOrders({ assets: { app: appAddress, dataset: AddressZero, @@ -299,7 +299,9 @@ describe('IexecPoco2#finalize', async () => { prices: ordersPrices, }); const taskPrice = appPrice + workerpoolPrice; - const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) @@ -356,14 +358,16 @@ describe('IexecPoco2#finalize', async () => { it('Should finalize task after reveal deadline with at least one reveal', async () => { const volume = 1; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, trust: 3, }); - const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) @@ -412,10 +416,10 @@ describe('IexecPoco2#finalize', async () => { it('Should not finalize when caller is not scheduler', async () => { const { dealId, taskId } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, - }).orders, + }).toArray(), ); const deal = await iexecPoco.viewDeal(dealId); expect(deal.workerpool.owner).to.equal(scheduler.address).not.equal(anyone.address); @@ -427,10 +431,10 @@ describe('IexecPoco2#finalize', async () => { it('Should not finalize task when task status is not revealing', async () => { const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const task = await iexecPoco.viewTask(taskId); @@ -444,10 +448,10 @@ describe('IexecPoco2#finalize', async () => { it('Should not finalize task after final deadline', async () => { const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco @@ -488,11 +492,11 @@ describe('IexecPoco2#finalize', async () => { it('Should not finalize when winner counter is not reached nor at least one worker revealed', async () => { const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, trust: 3, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco @@ -538,10 +542,10 @@ describe('IexecPoco2#finalize', async () => { it('Should not finalize task when resultsCallback is not expected', async () => { const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( - buildOrders({ + ...buildOrders({ assets: ordersAssets, requester: requester.address, - }).orders, + }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco diff --git a/test/byContract/IexecPoco/06_claim.test.ts b/test/byContract/IexecPoco/06_claim.test.ts index 020923009..707dcb7fe 100644 --- a/test/byContract/IexecPoco/06_claim.test.ts +++ b/test/byContract/IexecPoco/06_claim.test.ts @@ -27,23 +27,14 @@ const workerpoolPrice = 1_000_000_000; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const enclaveAddress = ethers.constants.AddressZero; -describe('Poco', async () => { +describe('IexecPoco2#claim', async () => { let proxyAddress: string; let iexecPoco: IexecInterfaceNative; let iexecPocoAsAnyone: IexecInterfaceNative; let iexecWrapper: IexecWrapper; let [appAddress, datasetAddress, workerpoolAddress]: string[] = []; - let [ - iexecAdmin, - requester, - sponsor, - appProvider, - datasetProvider, - scheduler, - worker1, - worker2, - anyone, - ]: SignerWithAddress[] = []; + let [iexecAdmin, requester, sponsor, scheduler, worker1, worker2, anyone]: SignerWithAddress[] = + []; let ordersAssets: OrdersAssets; let ordersPrices: OrdersPrices; @@ -56,17 +47,7 @@ describe('Poco', async () => { async function initFixture() { const accounts = await getIexecAccounts(); - ({ - iexecAdmin, - requester, - sponsor, - appProvider, - datasetProvider, - scheduler, - worker1, - worker2, - anyone, - } = accounts); + ({ iexecAdmin, requester, sponsor, scheduler, worker1, worker2, anyone } = accounts); iexecWrapper = new IexecWrapper(proxyAddress, accounts); ({ appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets()); await iexecWrapper.setTeeBroker('0x0000000000000000000000000000000000000000'); @@ -84,15 +65,14 @@ describe('Poco', async () => { }; } - // TODO: Wrap tests inside `describe('Claim ' [...]` /** * Generic claim test (longest code path) where it should claim a revealing * task after deadline. The task comes from a deal payed by a sponsor. */ - it('Should claim task of deal payed by sponsor', async function () { + it('Should claim task of deal payed by sponsor', async () => { const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice const claimedTasks = 1; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -100,7 +80,7 @@ describe('Poco', async () => { trust: 4, // Consensus is reachable with 2 fresh workers }); const { dealId, taskId, taskIndex, dealPrice, startTime } = - await iexecWrapper.signAndSponsorMatchOrders(orders); + await iexecWrapper.signAndSponsorMatchOrders(...orders.toArray()); const schedulerDealStake = await iexecWrapper.computeSchedulerDealStake( workerpoolPrice, expectedVolume, @@ -210,14 +190,14 @@ describe('Poco', async () => { await expect(iexecPocoAsAnyone.claim(taskId)).to.be.revertedWithoutReason(); }); - it('Should claim task of deal payed by requester', async function () { - const { orders } = buildOrders({ + it('Should claim task of deal payed by requester', async () => { + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); const { dealId, taskId, taskIndex, dealPrice, startTime } = - await iexecWrapper.signAndMatchOrders(orders); + await iexecWrapper.signAndMatchOrders(...orders.toArray()); await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); expect(await iexecPoco.balanceOf(requester.address)).to.be.equal(0); expect(await iexecPoco.frozenOf(requester.address)).to.be.equal(dealPrice); @@ -237,14 +217,15 @@ describe('Poco', async () => { expect(await iexecPoco.frozenOf(sponsor.address)).to.be.equal(0); }); - it('Should claim active task after deadline', async function () { - const { orders } = buildOrders({ + it('Should claim active task after deadline', async () => { + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); - const { dealId, taskId, taskIndex, startTime } = - await iexecWrapper.signAndMatchOrders(orders); + const { dealId, taskId, taskIndex, startTime } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.ACTIVE); await time.setNextBlockTimestamp(startTime + maxDealDuration); @@ -252,26 +233,28 @@ describe('Poco', async () => { await expect(iexecPocoAsAnyone.claim(taskId)).to.emit(iexecPoco, 'TaskClaimed'); }); - it('Should not claim unset task', async function () { - const { orders } = buildOrders({ + it('Should not claim unset task', async () => { + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); - const { taskId } = await iexecWrapper.signAndMatchOrders(orders); + const { taskId } = await iexecWrapper.signAndMatchOrders(...orders.toArray()); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.UNSET); await expect(iexecPocoAsAnyone.claim(taskId)).to.be.revertedWithoutReason(); }); - it('Should not claim completed task', async function () { - const { orders } = buildOrders({ + it('Should not claim completed task', async () => { + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, trust: 0, }); - const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker1.address, @@ -300,29 +283,33 @@ describe('Poco', async () => { await expect(iexecPocoAsAnyone.claim(taskId)).to.be.revertedWithoutReason(); }); - it('Should not claim before deadline', async function () { - const { orders } = buildOrders({ + it('Should not claim before deadline', async () => { + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); - const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); // No time traveling after deadline await expect(iexecPocoAsAnyone.claim(taskId)).to.be.revertedWithoutReason(); }); - describe('Claim array', function () { - it('Should claim array', async function () { + describe('Claim array', () => { + it('Should claim array', async () => { const volume = 3; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, }); - const { dealId, startTime } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, startTime } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); const taskIds = []; for (let taskIndex = 0; taskIndex < volume; taskIndex++) { taskIds.push(getTaskId(dealId, taskIndex)); @@ -340,15 +327,17 @@ describe('Poco', async () => { } }); - it('Should not claim array when one is not claimable', async function () { + it('Should not claim array when one is not claimable', async () => { const volume = 2; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, }); - const { dealId, startTime } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, startTime } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); const taskIndex1 = 0; const taskIndex2 = 1; const taskId1 = getTaskId(dealId, taskIndex1); @@ -364,16 +353,18 @@ describe('Poco', async () => { await expect(iexecPoco.claimArray([taskId1, taskId2])).to.be.revertedWithoutReason(); }); - describe('Initialize and claim array', function () { - it('Should initialize and claim array', async function () { + describe('Initialize and claim array', () => { + it('Should initialize and claim array', async () => { const volume = 3; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, }); - const { dealId, startTime } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, startTime } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); const dealIds = [dealId, dealId, dealId]; const taskIndexes = [0, 1, 2]; await time.setNextBlockTimestamp(startTime + maxDealDuration).then(() => mine()); @@ -397,22 +388,24 @@ describe('Poco', async () => { } }); - it('Should not initialize and claim array if incompatible length of inputs', async function () { + it('Should not initialize and claim array if incompatible length of inputs', async () => { const dealId = ethers.utils.hashMessage('dealId'); await expect( iexecPoco.initializeAndClaimArray([dealId, dealId], [0]), ).to.be.revertedWithoutReason(); }); - it('Should not initialize and claim array if one specific fails', async function () { + it('Should not initialize and claim array if one specific fails', async () => { const volume = 2; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, volume, }); - const { dealId, startTime } = await iexecWrapper.signAndMatchOrders(orders); + const { dealId, startTime } = await iexecWrapper.signAndMatchOrders( + ...orders.toArray(), + ); const taskIndex0 = 0; const taskIndex1 = 1; await iexecPoco // Make first task already initialized diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index 9f277542d..889439bc0 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -108,13 +108,13 @@ describe('IexecPoco1', () => { dataset: datasetPrice, workerpool: workerpoolPrice, }; - ({ orders } = buildOrders({ + orders = buildOrders({ assets: ordersAssets, prices: ordersPrices, requester: requester.address, tag: teeDealTag, volume: volume, - })); + }); const randomWallet = ethers.Wallet.createRandom(); randomAddress = randomWallet.address; randomSignature = await randomWallet.signMessage('random'); @@ -216,7 +216,7 @@ describe('IexecPoco1', () => { const category = 2; const params = ''; // Use orders with full configuration. - const { orders: fullConfigOrders } = buildOrders({ + const fullConfigOrders = buildOrders({ assets: ordersAssets, prices: ordersPrices, requester: requester.address, @@ -322,7 +322,7 @@ describe('IexecPoco1', () => { const category = 2; const params = ''; // Use orders with full configuration. - const { orders: standardOrders } = buildOrders({ + const standardOrders = buildOrders({ assets: ordersAssets, prices: ordersPrices, requester: requester.address, @@ -473,6 +473,7 @@ describe('IexecPoco1', () => { } it(`Should match orders with ${assetName} restriction in ${orderName} order`, async () => { // e.g. orders.app.datasetrestrict = orders.dataset.dataset + // @ts-ignore orders[orderName][assetName + 'restrict'] = orders[assetName][assetName]; await depositForRequesterAndSchedulerWithDefaultPrices(volume); // Sign and match orders. @@ -635,11 +636,13 @@ describe('IexecPoco1', () => { it(`Should fail when ${orderName} order mismatches ${assetName} restriction (EOA, SC)`, async () => { const message = revertMessages[orderName][assetName]; // EOA + // @ts-ignore orders[orderName][assetName + 'restrict'] = randomAddress; // e.g. orders.app.datasetrestrict = 0xEOA await expect(iexecPoco.matchOrders(...orders.toArray())).to.be.revertedWith( message, ); // SC + // @ts-ignore orders[orderName][assetName + 'restrict'] = randomContract.address; // e.g. orders.app.datasetrestrict = 0xSC await expect(iexecPoco.matchOrders(...orders.toArray())).to.be.revertedWith( message, diff --git a/test/byContract/IexecPoco/IexecPocoDelegate.test.ts b/test/byContract/IexecPoco/IexecPocoDelegate.test.ts index 72da93bb9..2db8fdbd0 100644 --- a/test/byContract/IexecPoco/IexecPocoDelegate.test.ts +++ b/test/byContract/IexecPoco/IexecPocoDelegate.test.ts @@ -26,7 +26,6 @@ import { Workerpool__factory, } from '../../../typechain'; import { - Orders, OrdersActors, OrdersAssets, buildDomain, @@ -141,9 +140,9 @@ describe('IexecPocoDelegate', function () { }; }); - describe('Match Orders', function () { + describe('Match orders', function () { it('Should sponsor match orders ', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, beneficiary: beneficiary.address, @@ -151,6 +150,7 @@ describe('IexecPocoDelegate', function () { 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; @@ -186,22 +186,16 @@ describe('IexecPocoDelegate', function () { const datasetOrderHash = hashOrder(domain, datasetOrder); const workerpoolOrderHash = hashOrder(domain, workerpoolOrder); const requestOrderHash = hashOrder(domain, requestOrder); - const matchOrdersArgs = [ - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ] as Orders; expect( await iexecPocoInstance .connect(sponsor) - .callStatic.sponsorMatchOrders(...matchOrdersArgs), + .callStatic.sponsorMatchOrders(...orders.toArray()), ).to.equal(dealId); expect( - await iexecPocoInstance.callStatic.computeDealVolume(...matchOrdersArgs), + await iexecPocoInstance.callStatic.computeDealVolume(...orders.toArray()), ).to.equal(expectedVolume); // Send tx - await expect(iexecPocoInstance.connect(sponsor).sponsorMatchOrders(...matchOrdersArgs)) + await expect(iexecPocoInstance.connect(sponsor).sponsorMatchOrders(...orders.toArray())) .to.emit(iexecPocoInstance, 'OrdersMatched') .withArgs( dealId, diff --git a/test/byContract/IexecPocoBoost/IexecPocoBoostDelegate.test.ts b/test/byContract/IexecPocoBoost/IexecPocoBoostDelegate.test.ts index 8b29b5778..7c46e81ea 100644 --- a/test/byContract/IexecPocoBoost/IexecPocoBoostDelegate.test.ts +++ b/test/byContract/IexecPocoBoost/IexecPocoBoostDelegate.test.ts @@ -36,7 +36,7 @@ import { IERC1271 } from '../../../typechain/@openzeppelin/contracts-v5/interfac import { IERC1271__factory } from '../../../typechain/factories/@openzeppelin/contracts-v5/interfaces'; import constants from '../../../utils/constants'; import { - Orders, + IexecOrders, OrdersActors, OrdersAssets, OrdersPrices, @@ -222,14 +222,14 @@ describe('IexecPocoBoostDelegate', function () { workerpoolRegistry.isRegistered.whenCalledWith(workerpoolInstance.address).returns(true); }); - describe('Match Orders Boost', function () { + describe('Match orders Boost', function () { it('Should match orders (TEE)', async function () { appInstance.owner.returns(appProvider.address); workerpoolInstance.owner.returns(scheduler.address); datasetInstance.owner.returns(datasetProvider.address); workerpoolInstance.m_schedulerRewardRatioPolicy.returns(schedulerRewardRatio); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, beneficiary: beneficiary.address, @@ -237,6 +237,12 @@ describe('IexecPocoBoostDelegate', function () { prices: ordersPrices, callback: ethers.Wallet.createRandom().address, }); + const { + appOrder, + datasetOrder, + workerpoolOrder, + requesterOrder: requestOrder, + } = orders.toObject(); // Should match orders with low app order volume // Set volumes appOrder.volume = 2; // smallest unconsumed volume among all orders @@ -290,17 +296,11 @@ describe('IexecPocoBoostDelegate', function () { await expectOrderConsumed(iexecPocoBoostInstance, workerpoolOrderHash, undefined); await expectOrderConsumed(iexecPocoBoostInstance, requestOrderHash, undefined); const startTime = await setNextBlockTimestamp(); - const matchOrdersArgs = [ - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ] as Orders; expect( - await iexecPocoBoostInstance.callStatic.matchOrdersBoost(...matchOrdersArgs), + await iexecPocoBoostInstance.callStatic.matchOrdersBoost(...orders.toArray()), ).to.equal(dealId); - await expect(iexecPocoBoostInstance.matchOrdersBoost(...matchOrdersArgs)) + await expect(iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray())) .to.emit(iexecPocoBoostInstance, 'SchedulerNoticeBoost') .withArgs( workerpoolInstance.address, @@ -399,7 +399,7 @@ describe('IexecPocoBoostDelegate', function () { datasetInstance.owner.returns(datasetProvider.address); workerpoolInstance.m_schedulerRewardRatioPolicy.returns(schedulerRewardRatio); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, beneficiary: beneficiary.address, @@ -407,6 +407,7 @@ describe('IexecPocoBoostDelegate', function () { prices: ordersPrices, callback: ethers.Wallet.createRandom().address, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); // Should match orders with low app order volume // Set volumes appOrder.volume = 2; // smallest unconsumed volume among all orders @@ -466,23 +467,19 @@ describe('IexecPocoBoostDelegate', function () { await expectOrderConsumed(iexecPocoBoostInstance, workerpoolOrderHash, undefined); await expectOrderConsumed(iexecPocoBoostInstance, requestOrderHash, undefined); const startTime = await setNextBlockTimestamp(); - const matchOrdersArgs = [ - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ] as Orders; expect( await iexecPocoBoostInstance .connect(sponsor) - .callStatic.sponsorMatchOrdersBoost(...matchOrdersArgs), + .callStatic.sponsorMatchOrdersBoost(...orders.toArray()), ).to.equal(dealId); expect( - await iexecPocoBoostInstance.callStatic.computeDealVolume(...matchOrdersArgs), + await iexecPocoBoostInstance.callStatic.computeDealVolume(...orders.toArray()), ).to.equal(expectedVolume); await expect( - iexecPocoBoostInstance.connect(sponsor).sponsorMatchOrdersBoost(...matchOrdersArgs), + iexecPocoBoostInstance + .connect(sponsor) + .sponsorMatchOrdersBoost(...orders.toArray()), ) .to.emit(iexecPocoBoostInstance, 'SchedulerNoticeBoost') .withArgs( @@ -574,10 +571,11 @@ describe('IexecPocoBoostDelegate', function () { workerpoolInstance.owner.returns(scheduler.address); datasetInstance.owner.returns(datasetProvider.address); // Build orders - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); // Change trust. requestOrder.trust = 1; // Sign & hash orders. @@ -652,12 +650,7 @@ describe('IexecPocoBoostDelegate', function () { requestOrder.volume = volume; await signOrders( domain, - { - app: appOrder, - dataset: datasetOrder, - workerpool: workerpoolOrder, - requester: requestOrder, - }, + new IexecOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder), ordersActors, ); @@ -695,7 +688,7 @@ describe('IexecPocoBoostDelegate', function () { const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ assets: ordersAssets, requester: requester.address, - }); + }).toObject(); const erc1271Instance = await createFakeERC1271(); erc1271Instance.isValidSignature.returns('0x1626ba7e'); appInstance.owner.returns(erc1271Instance.address); @@ -732,7 +725,7 @@ describe('IexecPocoBoostDelegate', function () { requester: requester.address, beneficiary: beneficiary.address, tag: teeDealTag, - }); + }).toObject(); const appOrderHash = hashOrder(domain, appOrder); const datasetOrderHash = hashOrder(domain, datasetOrder); const workerpoolOrderHash = hashOrder(domain, workerpoolOrder); @@ -798,7 +791,7 @@ describe('IexecPocoBoostDelegate', function () { workerpool: workerpoolPrice, }, tag: teeDealTag, - }); + }).toObject(); await signOrder(domain, appOrder, appProvider); await signOrder(domain, workerpoolOrder, scheduler); await signOrder(domain, requestOrder, requester); @@ -843,10 +836,11 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); workerpoolInstance.owner.returns(scheduler.address); datasetInstance.owner.returns(datasetProvider.address); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); // Set volumes appOrder.volume = 5; datasetOrder.volume = 4; @@ -890,10 +884,11 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); workerpoolInstance.owner.returns(scheduler.address); datasetInstance.owner.returns(datasetProvider.address); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); // Set volumes appOrder.volume = 7; datasetOrder.volume = 6; @@ -937,10 +932,11 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); workerpoolInstance.owner.returns(scheduler.address); datasetInstance.owner.returns(datasetProvider.address); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); // Set volumes appOrder.volume = 6; datasetOrder.volume = 5; // smallest unconsumed volume among all orders @@ -984,10 +980,11 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); workerpoolInstance.owner.returns(scheduler.address); datasetInstance.owner.returns(datasetProvider.address); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); + const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); appOrder.volume = 8; datasetOrder.volume = 8; requestOrder.volume = 8; @@ -1053,209 +1050,148 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should fail when trust is greater than 1', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); // Set bad trust (> 1). - requestOrder.trust = 2; - + orders.requester.trust = 2; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Bad trust level'); }); it('Should fail when categories are different', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); // Set different categories - requestOrder.category = 1; - workerpoolOrder.category = 2; - + orders.requester.category = 1; + orders.workerpool.category = 2; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Category mismatch'); }); it('Should fail when category unknown', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); // Unknown category - requestOrder.category = 1; - workerpoolOrder.category = 1; - + orders.requester.category = 1; + orders.workerpool.category = 1; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Unknown category'); }); it('Should fail when app max price is less than app price', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - appOrder.appprice = 200; - requestOrder.appmaxprice = 100; - + orders.app.appprice = 200; + orders.requester.appmaxprice = 100; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Overpriced app'); }); it('Should fail when dataset max price is less than dataset price', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - // Set dataset price higher than dataset max price - datasetOrder.datasetprice = 300; - requestOrder.datasetmaxprice = 200; - + orders.dataset.datasetprice = 300; + orders.requester.datasetmaxprice = 200; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Overpriced dataset'); }); it('Should fail when workerpool max price is less than workerpool price', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - // Set workerpool price higher than workerpool max price - workerpoolOrder.workerpoolprice = 400; - requestOrder.workerpoolmaxprice = 300; - + orders.workerpool.workerpoolprice = 400; + orders.requester.workerpoolmaxprice = 300; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Overpriced workerpool'); }); it('Should fail when workerpool tag does not satisfy app, dataset and request requirements', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, }); // Manually set the tags for app, dataset, and request orders - appOrder.tag = '0x0000000000000000000000000000000000000000000000000000000000000001'; // 0b0001 - datasetOrder.tag = '0x0000000000000000000000000000000000000000000000000000000000000002'; // 0b0010 - requestOrder.tag = '0x0000000000000000000000000000000000000000000000000000000000000003'; // 0b0011 - + orders.app.tag = '0x0000000000000000000000000000000000000000000000000000000000000001'; // 0b0001 + orders.dataset.tag = + '0x0000000000000000000000000000000000000000000000000000000000000002'; // 0b0010 + orders.requester.tag = + '0x0000000000000000000000000000000000000000000000000000000000000003'; // 0b0011 // Set the workerpool tag to a different value - workerpoolOrder.tag = + orders.workerpool.tag = '0x0000000000000000000000000000000000000000000000000000000000000004'; // 0b0100 - await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Workerpool tag does not match demand'); }); it('Should fail when the last bit of app tag does not satisfy dataset or request requirements', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, }); - // Manually set the tags for app, dataset, and request orders // The last bit of dataset and request tag is 1, but app tag does not set it - appOrder.tag = '0x0000000000000000000000000000000000000000000000000000000000000002'; // 0b0010 - datasetOrder.tag = '0x0000000000000000000000000000000000000000000000000000000000000003'; // 0b0011 - requestOrder.tag = '0x0000000000000000000000000000000000000000000000000000000000000003'; // 0b0011 - + orders.app.tag = '0x0000000000000000000000000000000000000000000000000000000000000002'; // 0b0010 + orders.dataset.tag = + '0x0000000000000000000000000000000000000000000000000000000000000003'; // 0b0011 + orders.requester.tag = + '0x0000000000000000000000000000000000000000000000000000000000000003'; // 0b0011 // Set the workerpool tag to pass first tag check - workerpoolOrder.tag = + orders.workerpool.tag = '0x0000000000000000000000000000000000000000000000000000000000000003'; // 0b0011 - await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: App tag does not match demand'); }); it('Should fail when app are different', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); // Request another app address - requestOrder.app = '0x0000000000000000000000000000000000000001'; - + orders.requester.app = '0x0000000000000000000000000000000000000001'; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: App mismatch'); }); it('Should fail when dataset are different', async function () { - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); // Request another dataset address - requestOrder.dataset = '0x0000000000000000000000000000000000000001'; - + orders.requester.dataset = '0x0000000000000000000000000000000000000001'; await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Dataset mismatch'); }); it('Should fail when request order workerpool mismatches workerpool order workerpool (EOA, SC)', async function () { - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); @@ -1286,17 +1222,19 @@ describe('IexecPocoBoostDelegate', function () { const capitalizedAssetName = assetName.charAt(0).toUpperCase() + assetName.substring(1); // app => App const revertMessage = `PocoBoost: ${capitalizedAssetName} restricted by ${orderName} order`; - const { orders } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); // EOA // E.g. changes orders['app']['apprestrict'] = 0xAddress + // @ts-ignore orders[orderName][assetName + 'restrict'] = randomEOAAddress; await expect( iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith(revertMessage); // SC + // @ts-ignore orders[orderName][assetName + 'restrict'] = someContractInstance.address; await expect( iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), @@ -1307,49 +1245,39 @@ describe('IexecPocoBoostDelegate', function () { it('Should fail when app not registered', async function () { appRegistry.isRegistered.whenCalledWith(appInstance.address).returns(false); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - await signOrder(domain, appOrder, anyone); + await signOrder(domain, orders.app, anyone); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: App not registered'); }); it('Should fail when invalid app order signature from EOA', async function () { appInstance.owner.returns(appProvider.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - await signOrder(domain, appOrder, anyone); + await signOrder(domain, orders.app, anyone); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid app order signature'); }); it('Should fail when invalid app order signature from contract', async function () { const erc1271Instance = await createFakeERC1271(); appInstance.owner.returns(erc1271Instance.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - appOrder.sign = someSignature; - const appOrderHash = hashOrder(domain, appOrder); + orders.app.sign = someSignature; + const appOrderHash = hashOrder(domain, orders.app); whenERC1271CalledThenReplyInvalidSignature( erc1271Instance, appOrderHash, @@ -1357,12 +1285,7 @@ describe('IexecPocoBoostDelegate', function () { ); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid app order signature'); await expectERC1271CalledOnceWith(erc1271Instance, appOrderHash, someSignature); }); @@ -1370,39 +1293,29 @@ describe('IexecPocoBoostDelegate', function () { it('Should fail when dataset not registered', async function () { appInstance.owner.returns(appProvider.address); datasetRegistry.isRegistered.whenCalledWith(datasetInstance.address).returns(false); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Dataset not registered'); }); it('Should fail when invalid dataset order signature from EOA', async function () { appInstance.owner.returns(appProvider.address); datasetInstance.owner.returns(datasetProvider.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - await signOrder(domain, appOrder, appProvider); - await signOrder(domain, datasetOrder, anyone); + await signOrder(domain, orders.app, appProvider); + await signOrder(domain, orders.dataset, anyone); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid dataset order signature'); }); @@ -1410,13 +1323,13 @@ describe('IexecPocoBoostDelegate', function () { const erc1271Instance = await createFakeERC1271(); appInstance.owner.returns(appProvider.address); datasetInstance.owner.returns(erc1271Instance.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - await signOrder(domain, appOrder, appProvider); - datasetOrder.sign = someSignature; - const datasetOrderHash = hashOrder(domain, datasetOrder); + await signOrder(domain, orders.app, appProvider); + orders.dataset.sign = someSignature; + const datasetOrderHash = hashOrder(domain, orders.dataset); whenERC1271CalledThenReplyInvalidSignature( erc1271Instance, datasetOrderHash, @@ -1424,12 +1337,7 @@ describe('IexecPocoBoostDelegate', function () { ); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid dataset order signature'); await expectERC1271CalledOnceWith(erc1271Instance, datasetOrderHash, someSignature); }); @@ -1440,19 +1348,14 @@ describe('IexecPocoBoostDelegate', function () { workerpoolRegistry.isRegistered .whenCalledWith(workerpoolInstance.address) .returns(false); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Workerpool not registered'); }); @@ -1460,21 +1363,16 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); datasetInstance.owner.returns(datasetProvider.address); workerpoolInstance.owner.returns(scheduler.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - await signOrder(domain, appOrder, appProvider); - await signOrder(domain, datasetOrder, datasetProvider); - await signOrder(domain, workerpoolOrder, anyone); + await signOrder(domain, orders.app, appProvider); + await signOrder(domain, orders.dataset, datasetProvider); + await signOrder(domain, orders.workerpool, anyone); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid workerpool order signature'); }); @@ -1483,14 +1381,14 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); datasetInstance.owner.returns(datasetProvider.address); workerpoolInstance.owner.returns(erc1271Instance.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - await signOrder(domain, appOrder, appProvider); - await signOrder(domain, datasetOrder, datasetProvider); - workerpoolOrder.sign = someSignature; - const workerpoolOrderHash = hashOrder(domain, workerpoolOrder); + await signOrder(domain, orders.app, appProvider); + await signOrder(domain, orders.dataset, datasetProvider); + orders.workerpool.sign = someSignature; + const workerpoolOrderHash = hashOrder(domain, orders.workerpool); whenERC1271CalledThenReplyInvalidSignature( erc1271Instance, workerpoolOrderHash, @@ -1498,12 +1396,7 @@ describe('IexecPocoBoostDelegate', function () { ); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid workerpool order signature'); await expectERC1271CalledOnceWith(erc1271Instance, workerpoolOrderHash, someSignature); }); @@ -1512,22 +1405,17 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); datasetInstance.owner.returns(datasetProvider.address); workerpoolInstance.owner.returns(scheduler.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); - await signOrder(domain, appOrder, appProvider); - await signOrder(domain, datasetOrder, datasetProvider); - await signOrder(domain, workerpoolOrder, scheduler); - await signOrder(domain, requestOrder, anyone); + await signOrder(domain, orders.app, appProvider); + await signOrder(domain, orders.dataset, datasetProvider); + await signOrder(domain, orders.workerpool, scheduler); + await signOrder(domain, orders.requester, anyone); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid request order signature'); }); @@ -1536,15 +1424,15 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); datasetInstance.owner.returns(datasetProvider.address); workerpoolInstance.owner.returns(scheduler.address); - const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: erc1271Instance.address, }); - await signOrder(domain, appOrder, appProvider); - await signOrder(domain, datasetOrder, datasetProvider); - await signOrder(domain, workerpoolOrder, scheduler); - requestOrder.sign = someSignature; - const requestOrderHash = hashOrder(domain, requestOrder); + await signOrder(domain, orders.app, appProvider); + await signOrder(domain, orders.dataset, datasetProvider); + await signOrder(domain, orders.workerpool, scheduler); + orders.requester.sign = someSignature; + const requestOrderHash = hashOrder(domain, orders.requester); whenERC1271CalledThenReplyInvalidSignature( erc1271Instance, requestOrderHash, @@ -1552,12 +1440,7 @@ describe('IexecPocoBoostDelegate', function () { ); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: Invalid request order signature'); await expectERC1271CalledOnceWith(erc1271Instance, requestOrderHash, someSignature); }); @@ -1566,21 +1449,16 @@ describe('IexecPocoBoostDelegate', function () { appInstance.owner.returns(appProvider.address); workerpoolInstance.owner.returns(scheduler.address); datasetInstance.owner.returns(datasetProvider.address); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); // Set volumes - appOrder.volume = 0; // nothing to consume + orders.app.volume = 0; // nothing to consume await signOrders(domain, orders, ordersActors); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('PocoBoost: One or more orders consumed'); }); @@ -1590,7 +1468,7 @@ describe('IexecPocoBoostDelegate', function () { datasetInstance.owner.returns(datasetProvider.address); const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * volume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -1608,12 +1486,7 @@ describe('IexecPocoBoostDelegate', function () { await signOrders(domain, orders, ordersActors); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('IexecEscrow: Transfer amount exceeds balance'); }); @@ -1623,7 +1496,7 @@ describe('IexecPocoBoostDelegate', function () { datasetInstance.owner.returns(datasetProvider.address); const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * volume; const schedulerStake = computeSchedulerDealStake(workerpoolPrice, volume); - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -1648,12 +1521,7 @@ describe('IexecPocoBoostDelegate', function () { await signOrders(domain, orders, ordersActors); await expect( - iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ), + iexecPocoBoostInstance.matchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('IexecEscrow: Transfer amount exceeds balance'); }); it('Should fail when sponsor has insufficient balance', async () => { @@ -1662,17 +1530,11 @@ describe('IexecPocoBoostDelegate', function () { datasetInstance.owner.returns(datasetProvider.address); const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * volume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, }); - const matchOrdersArgs = [ - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ] as Orders; const initialSponsorBalance = 2; await iexecPocoBoostInstance.setVariables({ @@ -1686,7 +1548,9 @@ describe('IexecPocoBoostDelegate', function () { await signOrders(domain, orders, ordersActors); await expect( - iexecPocoBoostInstance.connect(sponsor).sponsorMatchOrdersBoost(...matchOrdersArgs), + iexecPocoBoostInstance + .connect(sponsor) + .sponsorMatchOrdersBoost(...orders.toArray()), ).to.be.revertedWith('IexecEscrow: Transfer amount exceeds balance'); }); }); @@ -1706,7 +1570,7 @@ describe('IexecPocoBoostDelegate', function () { const taskPrice = appPrice + datasetPrice + workerpoolPrice; const volume = 3; const dealPrice = taskPrice * volume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, @@ -1747,15 +1611,12 @@ describe('IexecPocoBoostDelegate', function () { }, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); const startTime = await setNextBlockTimestamp(); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, taskId, @@ -1931,20 +1792,17 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should push result (TEE with contribution authorization signed by scheduler)', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, taskId, @@ -1976,7 +1834,7 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should push result (TEE with contribution authorization signed by broker)', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, @@ -1985,14 +1843,11 @@ describe('IexecPocoBoostDelegate', function () { await iexecPocoBoostInstance.setVariable('m_teebroker', teeBrokerAddr); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const teeBrokerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, taskId, @@ -2024,19 +1879,16 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should push result', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const emptyEnclaveAddress = constants.NULL.ADDRESS; const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, @@ -2063,28 +1915,25 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should push result even if callback target is not a contract', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, callback: ethers.Wallet.createRandom().address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const resultsCallback = '0xab'; await expect( iexecPocoBoostInstance .connect(worker) .pushResultBoost( - getDealId(domain, requestOrder, taskIndex), + dealId, taskIndex, results, resultsCallback, @@ -2106,21 +1955,18 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should push result even if callback reverts', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, callback: oracleConsumerInstance.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const resultsCallback = '0xab'; oracleConsumerInstance.receiveResult.reverts(); @@ -2128,7 +1974,7 @@ describe('IexecPocoBoostDelegate', function () { iexecPocoBoostInstance .connect(worker) .pushResultBoost( - getDealId(domain, requestOrder, taskIndex), + dealId, taskIndex, results, resultsCallback, @@ -2159,20 +2005,17 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should push result even if callback consumes maximum gas', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, callback: gasWasterClientInstance.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const { resultsCallback } = buildResultCallbackAndDigest(123); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, @@ -2222,18 +2065,15 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result if out-of-range task index', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + const dealId = getDealId(domain, orders.requester, taskIndex); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); await expect( iexecPocoBoostInstance.connect(worker).pushResultBoost( @@ -2249,19 +2089,16 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result twice', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const emptyEnclaveAddress = constants.NULL.ADDRESS; const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, @@ -2273,7 +2110,7 @@ describe('IexecPocoBoostDelegate', function () { iexecPocoBoostInstance .connect(worker) .pushResultBoost( - getDealId(domain, requestOrder, taskIndex), + dealId, taskIndex, results, constants.NULL.BYTES32, @@ -2289,25 +2126,22 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result after deadline', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); const startTime = await setNextBlockTimestamp(); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); await time.setNextBlockTimestamp(startTime + 7 * 60); // push result on deadline await expect( iexecPocoBoostInstance .connect(worker) .pushResultBoost( - getDealId(domain, requestOrder, taskIndex), + getDealId(domain, orders.requester, taskIndex), taskIndex, results, constants.NULL.BYTES32, @@ -2319,19 +2153,16 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result without enclave challenge for TEE task', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + const dealId = getDealId(domain, orders.requester, taskIndex); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); await expect( iexecPocoBoostInstance @@ -2349,24 +2180,21 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result with invalid scheduler signature', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const anyoneSignature = anyone.signMessage(constants.NULL.BYTES32); await expect( iexecPocoBoostInstance .connect(worker) .pushResultBoost( - getDealId(domain, requestOrder, taskIndex), + getDealId(domain, orders.requester, taskIndex), taskIndex, results, constants.NULL.BYTES32, @@ -2378,26 +2206,23 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result with invalid broker signature', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await iexecPocoBoostInstance.setVariable('m_teebroker', teeBroker.address); await signOrders(domain, orders, ordersActors); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const anyoneSignature = anyone.signMessage(constants.NULL.BYTES32); await expect( iexecPocoBoostInstance .connect(worker) .pushResultBoost( - getDealId(domain, requestOrder, taskIndex), + getDealId(domain, orders.requester, taskIndex), taskIndex, results, constants.NULL.BYTES32, @@ -2409,20 +2234,17 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result with invalid enclave signature', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + const dealId = getDealId(domain, orders.requester, taskIndex); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, getTaskId(dealId, taskIndex), @@ -2447,21 +2269,18 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result with missing data for callback', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, tag: teeDealTag, callback: ethers.Wallet.createRandom().address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, taskId, @@ -2480,7 +2299,7 @@ describe('IexecPocoBoostDelegate', function () { iexecPocoBoostInstance .connect(worker) .pushResultBoost( - getDealId(domain, requestOrder, taskIndex), + dealId, taskIndex, results, resultsCallback, @@ -2492,20 +2311,17 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not push result without enough gas for callback', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, callback: gasWasterClientInstance.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const { resultsCallback } = buildResultCallbackAndDigest(123); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, @@ -2552,7 +2368,7 @@ describe('IexecPocoBoostDelegate', function () { const claimedTasks = 1; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * expectedVolume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -2581,15 +2397,12 @@ describe('IexecPocoBoostDelegate', function () { [kittyAddress]: initialFrozenKitty, }, }); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); const startTime = await setNextBlockTimestamp(); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); // Check poco boost balance await expectBalance( iexecPocoBoostInstance, @@ -2672,7 +2485,7 @@ describe('IexecPocoBoostDelegate', function () { const tasksToClaim = 2; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * expectedVolume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -2701,15 +2514,12 @@ describe('IexecPocoBoostDelegate', function () { [kittyAddress]: initialFrozenKitty, }, }); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); const startTime = await setNextBlockTimestamp(); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); // Check poco boost balance await expectBalance( iexecPocoBoostInstance, @@ -2784,7 +2594,7 @@ describe('IexecPocoBoostDelegate', function () { const claimedTasks = 1; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * expectedVolume; - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, @@ -2817,12 +2627,13 @@ describe('IexecPocoBoostDelegate', function () { [kittyAddress]: initialFrozenKitty, }, }); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); const startTime = await setNextBlockTimestamp(); await iexecPocoBoostInstance .connect(sponsor) - .sponsorMatchOrdersBoost(appOrder, datasetOrder, workerpoolOrder, requestOrder); + .sponsorMatchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); // Check poco boost balance await expectBalance( iexecPocoBoostInstance, @@ -2918,18 +2729,15 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not claim if out-of-range task index', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + const dealId = getDealId(domain, orders.requester, taskIndex); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); await expect( iexecPocoBoostInstance.connect(worker).claimBoost( @@ -2941,19 +2749,16 @@ describe('IexecPocoBoostDelegate', function () { // Different test than other `Should not claim if task not unset` test it('Should not claim twice', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const startTime = await setNextBlockTimestamp(); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); await time.setNextBlockTimestamp(startTime + 7 * 60); // Claim await expect( @@ -2966,19 +2771,16 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not claim if task not unset', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const taskId = getTaskId(dealId, taskIndex); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); const schedulerSignature = await buildAndSignContributionAuthorizationMessage( worker.address, taskId, @@ -3003,19 +2805,16 @@ describe('IexecPocoBoostDelegate', function () { }); it('Should not claim before deadline', async function () { - const { orders, appOrder, datasetOrder, workerpoolOrder, requestOrder } = buildOrders({ + const orders = buildOrders({ assets: ordersAssets, requester: requester.address, }); await signOrders(domain, orders, ordersActors); - const dealId = getDealId(domain, requestOrder, taskIndex); + const dealId = getDealId(domain, orders.requester, taskIndex); const startTime = await setNextBlockTimestamp(); - await iexecPocoBoostInstance.matchOrdersBoost( - appOrder, - datasetOrder, - workerpoolOrder, - requestOrder, - ); + await iexecPocoBoostInstance + .matchOrdersBoost(...orders.toArray()) + .then((tx) => tx.wait()); await time.setNextBlockTimestamp( startTime + 7 * 60 - // claim diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 0759ae1b7..fac69ee9e 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -13,6 +13,7 @@ import { DatasetRegistry__factory, IexecAccessors__factory, IexecInterfaceNative__factory, + IexecLibOrders_v5, IexecMaintenanceDelegate__factory, RLC__factory, WorkerpoolRegistry, @@ -23,7 +24,6 @@ import { IexecPoco1__factory } from '../../typechain/factories/contracts/modules import { IexecOrders, OrderOperation, - Orders, hashOrder, signOrderOperation, signOrders, @@ -175,12 +175,28 @@ export class IexecWrapper { return signOrderOperation(this.domain, orderOperation, signer); } - async signAndSponsorMatchOrders(orders: IexecOrders) { - return this._signAndMatchOrders(orders, true); + async signAndSponsorMatchOrders( + appOrder: IexecLibOrders_v5.AppOrderStruct, + datasetOrder: IexecLibOrders_v5.DatasetOrderStruct, + workerpoolOrder: IexecLibOrders_v5.WorkerpoolOrderStruct, + requestOrder: IexecLibOrders_v5.RequestOrderStruct, + ) { + return this._signAndMatchOrders( + new IexecOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder), + true, + ); } - async signAndMatchOrders(orders: IexecOrders) { - return this._signAndMatchOrders(orders, false); + async signAndMatchOrders( + appOrder: IexecLibOrders_v5.AppOrderStruct, + datasetOrder: IexecLibOrders_v5.DatasetOrderStruct, + workerpoolOrder: IexecLibOrders_v5.WorkerpoolOrderStruct, + requestOrder: IexecLibOrders_v5.RequestOrderStruct, + ) { + return this._signAndMatchOrders( + new IexecOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder), + false, + ); } /** @@ -221,11 +237,10 @@ export class IexecWrapper { ); const startTime = await setNextBlockTimestamp(); const iexecPocoAsDealPayer = IexecPoco1__factory.connect(this.proxyAddress, dealPayer); - const matchOrdersArgs = [appOrder, datasetOrder, workerpoolOrder, requestOrder] as Orders; await ( withSponsor - ? iexecPocoAsDealPayer.sponsorMatchOrders(...matchOrdersArgs) - : iexecPocoAsDealPayer.matchOrders(...matchOrdersArgs) + ? iexecPocoAsDealPayer.sponsorMatchOrders(...orders.toArray()) + : iexecPocoAsDealPayer.matchOrders(...orders.toArray()) ).then((tx) => tx.wait()); return { dealId, taskId, taskIndex, dealPrice, startTime }; } diff --git a/utils/createOrders.ts b/utils/createOrders.ts index 94d64f620..e33e4e0ea 100644 --- a/utils/createOrders.ts +++ b/utils/createOrders.ts @@ -10,15 +10,6 @@ import constants, { NULL } from './constants'; import { utils } from './odb-tools'; import { OrderOperationEnum } from './poco-tools'; -// TODO use IexecOrders.toArray() for spreading and remove this -// if not needed anymore. -export type Orders = [ - IexecLibOrders_v5.AppOrderStruct, - IexecLibOrders_v5.DatasetOrderStruct, - IexecLibOrders_v5.WorkerpoolOrderStruct, - IexecLibOrders_v5.RequestOrderStruct, -]; - export interface OrdersAssets { app: string; dataset: string; @@ -58,9 +49,6 @@ export class IexecOrders { workerpool: IexecLibOrders_v5.WorkerpoolOrderStruct; requester: IexecLibOrders_v5.RequestOrderStruct; - // Index signature to allow dynamic string keys - [key: string]: any; - constructor( app: IexecLibOrders_v5.AppOrderStruct, dataset: IexecLibOrders_v5.DatasetOrderStruct, @@ -88,7 +76,7 @@ export class IexecOrders { } /** - * Convert this instance to an object to simplify destructuring. + * Convert this instance to a JS object to simplify destructuring. * const { appOrder } = orders.toObject(); * @returns an object with all orders */ @@ -98,6 +86,9 @@ export class IexecOrders { datasetOrder: this.dataset, workerpoolOrder: this.workerpool, requesterOrder: this.requester, + // An alias for convenience + // TODO use requestOrder instead of requesterOrder everywhere. + requestOrder: this.requester, }; } } @@ -256,17 +247,7 @@ export function buildOrders(matchOrdersArgs: MatchOrdersArgs) { workerpoolOrder.salt = matchOrdersArgs.salt; requestOrder.salt = matchOrdersArgs.salt; } - return { - orders: new IexecOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder), - // TODO remove these additional return values and use function toObject() for - // deserialization: - // const {appOrder, ...} = orders.toObject(); - // Expose orders differently to make them easier to use in tests - appOrder: appOrder, - datasetOrder: datasetOrder, - workerpoolOrder: workerpoolOrder, - requestOrder: requestOrder, - }; + return new IexecOrders(appOrder, datasetOrder, workerpoolOrder, requestOrder); } /**