From 51d4e2302515aea0327b76d885dd335a573d4133 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Mon, 17 Feb 2025 12:42:31 +0100 Subject: [PATCH 01/32] Update changelog, package scripts, and migrate test files for IexecPoco integration --- .github/workflows/main.yml | 3 +- CHANGELOG.md | 1 + package.json | 2 +- test/byContract/IexecPoco/IexecPoco1.test.ts | 131 +++++++++--------- .../IexecPoco/IexecPoco2-claim.test.ts | 42 +++--- ...IexecPoco2-contribute-and-finalize.test.ts | 31 +++-- .../IexecPoco/IexecPoco2-contribute.test.ts | 18 +-- .../IexecPoco/IexecPoco2-finalize.test.ts | 58 ++++---- .../IexecPoco/IexecPoco2-initialize.test.ts | 8 +- .../IexecPoco/IexecPoco2-reopen.test.ts | 12 +- .../IexecPoco/IexecPoco2-reveal.test.ts | 15 +- utils/poco-tools.ts | 4 +- utils/tools.ts | 15 +- 13 files changed, 168 insertions(+), 172 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c88d022cc..121665d96 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -36,8 +36,9 @@ jobs: - name: Run test run: | npm run test \ + test/*fullchain* \ test/byContract/IexecAccessors/** \ - test/*fullchain* + test/byContract/IexecPoco/** - name: Run deployment # Basic deployment to make sure everything is ok. # Could be removed in the future if not relevant. diff --git a/CHANGELOG.md b/CHANGELOG.md index dae7c93b7..2d8e9a0ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Tests - test/*fullchain* (#190) - IexecAccessors (#189, #191) + - IexecPoco (#189, #191) - Migrate scripts to TypeScript: (#184) - `getFunctionSignatures.js`, `common-test-snapshot.js`, `test-storage.js`, `timelock.js` - Migrated utility files to TypeScript : (#183) diff --git a/package.json b/package.json index d98118a8b..9bcea5d20 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "main": "", "scripts": { "prepare": "husky", - "build": "npx hardhat compile", + "build": "npx hardhat clean && npx hardhat compile", "deploy": "npx hardhat deploy", "deploy:timelock": "hardhat run scripts/deploy-timelock.ts", "test-storage-layout": "npx hardhat run scripts/test-storage.ts", diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index 768952715..c98d88809 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -1,12 +1,11 @@ // SPDX-FileCopyrightText: 2020-2024 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { AddressZero, HashZero } from '@ethersproject/constants'; -import { Contract, ContractTransaction } from '@ethersproject/contracts'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; -import { ethers } from 'hardhat'; +import { Contract, ContractTransactionResponse, ZeroAddress, ZeroHash, ethers } from 'ethers'; +import { Address } from 'hardhat-deploy/dist/types'; import { ERC1271Mock, ERC1271Mock__factory, @@ -16,7 +15,6 @@ import { IexecLibOrders_v5, IexecPocoAccessors, IexecPocoAccessors__factory, - OwnableMock, OwnableMock__factory, } from '../../../typechain'; import { IexecPoco1 } from '../../../typechain/contracts/modules/interfaces/IexecPoco1.v8.sol/IexecPoco1'; @@ -84,11 +82,12 @@ describe('IexecPoco1', () => { let ordersPrices: OrdersPrices; let orders: IexecOrders; let [randomAddress, randomSignature]: string[] = []; - let randomContract: OwnableMock; + let randomContractAddress: Address; let erc1271MockContract: ERC1271Mock; + let erc1271MockContractAddress: Address; let orderManagement: { [key: string]: { - iexecPocoSignManageOrder: () => Promise; + iexecPocoSignManageOrder: () => Promise; providerAddress: string; order: | IexecLibOrders_v5.AppOrderStruct @@ -115,7 +114,7 @@ describe('IexecPoco1', () => { iexecPocoAsRequester = iexecPoco.connect(requester); iexecPocoAsSponsor = IexecPoco1__factory.connect(proxyAddress, sponsor); iexecPocoAccessors = IexecPocoAccessors__factory.connect(proxyAddress, ethers.provider); - iexecPocoContract = iexecPoco as Contract; + iexecPocoContract = iexecPoco as unknown as Contract; ordersActors = { appOwner: appProvider, datasetOwner: datasetProvider, @@ -142,14 +141,16 @@ describe('IexecPoco1', () => { const randomWallet = ethers.Wallet.createRandom(); randomAddress = randomWallet.address; randomSignature = await randomWallet.signMessage('random'); - randomContract = await new OwnableMock__factory() + randomContractAddress = await new OwnableMock__factory() .connect(anyone) .deploy() - .then((contract) => contract.deployed()); + .then((contract) => contract.waitForDeployment()) + .then((deployedContract) => deployedContract.getAddress()); erc1271MockContract = await new ERC1271Mock__factory() .connect(anyone) .deploy() - .then((contract) => contract.deployed()); + .then((contract) => contract.waitForDeployment()); + erc1271MockContractAddress = await erc1271MockContract.getAddress(); } describe('Verify signature', () => { @@ -157,9 +158,9 @@ describe('IexecPoco1', () => { it(`Should ${verifySignatureFunction} of smart contract`, async () => { expect( await iexecPocoContract[verifySignatureFunction]( - erc1271MockContract.address, - HashZero, // any is fine here - ethers.utils.id('valid-signature'), + erc1271MockContractAddress, + ZeroHash, // any is fine here + ethers.id('valid-signature'), ), ).to.be.true; }); @@ -167,9 +168,9 @@ describe('IexecPoco1', () => { it(`Should fail to ${verifySignatureFunction} of smart contract when validation returns false`, async () => { expect( await iexecPocoContract[verifySignatureFunction]( - erc1271MockContract.address, - HashZero, // any is fine here - ethers.utils.id('invalid-signature'), + erc1271MockContractAddress, + ZeroHash, // any is fine here + ethers.id('invalid-signature'), ), ).to.be.false; }); @@ -177,9 +178,9 @@ describe('IexecPoco1', () => { it(`Should fail to ${verifySignatureFunction} of smart contract when validation reverts`, async () => { expect( await iexecPocoContract[verifySignatureFunction]( - erc1271MockContract.address, - HashZero, // any is fine here - ethers.utils.id('reverting-signature'), + erc1271MockContractAddress, + ZeroHash, // any is fine here + ethers.id('reverting-signature'), ), ).to.be.false; }); @@ -188,7 +189,7 @@ describe('IexecPoco1', () => { expect( await iexecPocoContract[verifySignatureFunction]( someWallet.address, - ethers.utils.hashMessage(someMessage), + ethers.hashMessage(someMessage), someWallet.signMessage(someMessage), ), ).to.be.true; @@ -198,11 +199,11 @@ describe('IexecPoco1', () => { const compactEoaSignature = compactSignature( await someWallet.signMessage(someMessage), ); - expect(ethers.utils.arrayify(compactEoaSignature).length).equal(64); + expect(ethers.getBytes(compactEoaSignature).length).equal(64); expect( await iexecPocoContract[verifySignatureFunction]( someWallet.address, - ethers.utils.hashMessage(someMessage), + ethers.hashMessage(someMessage), compactEoaSignature, ), ).to.be.true; @@ -212,7 +213,7 @@ describe('IexecPoco1', () => { await expect( iexecPocoContract[verifySignatureFunction]( someWallet.address, - ethers.utils.hashMessage(someMessage), + ethers.hashMessage(someMessage), '0x01', // bad signature format ), ).to.be.revertedWith('invalid-signature-format'); @@ -222,7 +223,7 @@ describe('IexecPoco1', () => { expect( await iexecPocoContract[verifySignatureFunction]( someWallet.address, // some EOA - ethers.utils.hashMessage(someMessage), + ethers.hashMessage(someMessage), ethers.Wallet.createRandom() // signature from another EOA .signMessage(someMessage), ), @@ -331,9 +332,7 @@ describe('IexecPoco1', () => { it(`Should fail to ${verifyPresignatureFunction} for an unknown messageHash for ${asset}`, async () => { const { providerAddress } = orderManagement[asset]; - const unknownMessageHash = ethers.utils.keccak256( - ethers.utils.toUtf8Bytes('unknown'), - ); + const unknownMessageHash = ethers.keccak256(ethers.toUtf8Bytes('unknown')); const args = [ providerAddress, @@ -386,8 +385,8 @@ describe('IexecPoco1', () => { await iexecWrapper.depositInIexecAccount(requester, dealPrice); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); // Save frozen balances before match. - const requesterFrozenBefore = (await iexecPoco.frozenOf(requester.address)).toNumber(); - const schedulerFrozenBefore = (await iexecPoco.frozenOf(scheduler.address)).toNumber(); + const requesterFrozenBefore = Number(await iexecPoco.frozenOf(requester.address)); + const schedulerFrozenBefore = Number(await iexecPoco.frozenOf(scheduler.address)); // Sign and match orders. const startTime = await setNextBlockTimestamp(); await signOrders(iexecWrapper.getDomain(), fullConfigOrders, ordersActors); @@ -398,7 +397,7 @@ describe('IexecPoco1', () => { await iexecPocoAccessors.computeDealVolume(...fullConfigOrders.toArray()), ).to.equal(botVolume); - expect(await iexecPoco.callStatic.matchOrders(...fullConfigOrders.toArray())).to.equal( + expect(await iexecPoco.matchOrders.staticCall(...fullConfigOrders.toArray())).to.equal( dealId, ); const tx = iexecPocoAsRequester.matchOrders(...fullConfigOrders.toArray()); @@ -522,15 +521,15 @@ describe('IexecPoco1', () => { ); // Check deal const deal = await iexecPoco.viewDeal(dealId); - expect(deal.beneficiary).to.equal(AddressZero); + expect(deal.beneficiary).to.equal(ZeroAddress); expect(deal.botSize).to.equal(1); - expect(deal.callback).to.equal(AddressZero); + expect(deal.callback).to.equal(ZeroAddress); expect(deal.trust).to.equal(1); }); it('Should match orders without: dataset', async () => { - orders.dataset.dataset = AddressZero; - orders.requester.dataset = AddressZero; + orders.dataset.dataset = ZeroAddress; + orders.requester.dataset = ZeroAddress; // Set dataset volume lower than other assets to make sure // it does not impact final volume computation. orders.dataset.volume = botVolume - 1; @@ -547,7 +546,7 @@ describe('IexecPoco1', () => { await iexecWrapper.depositInIexecAccount(requester, dealPrice); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); // Save frozen balances before match. - const requesterFrozenBefore = (await iexecPoco.frozenOf(requester.address)).toNumber(); + const requesterFrozenBefore = Number(await iexecPoco.frozenOf(requester.address)); // Sign and match orders. await signOrders(iexecWrapper.getDomain(), orders, ordersActors); const dealId = getDealId(iexecWrapper.getDomain(), orders.requester); @@ -566,8 +565,8 @@ describe('IexecPoco1', () => { await expect(tx).to.emit(iexecPoco, 'OrdersMatched'); // Check deal const deal = await iexecPoco.viewDeal(dealId); - expect(deal.dataset.pointer).to.equal(AddressZero); - expect(deal.dataset.owner).to.equal(AddressZero); + expect(deal.dataset.pointer).to.equal(ZeroAddress); + expect(deal.dataset.owner).to.equal(ZeroAddress); expect(deal.dataset.price).to.equal(0); // BoT size should not be impacted even if the dataset order is the order with the lowest volume expect(deal.botSize).to.equal(botVolume); @@ -625,7 +624,7 @@ describe('IexecPoco1', () => { }); it(`Should match orders with any workerpool when request order has no workerpool restriction`, async () => { - orders.requester.workerpool = AddressZero; // No restriction. + orders.requester.workerpool = ZeroAddress; // No restriction. await depositForRequesterAndSchedulerWithDefaultPrices(volume); // Sign and match orders. await signOrders(iexecWrapper.getDomain(), orders, ordersActors); @@ -651,7 +650,7 @@ describe('IexecPoco1', () => { }); it('Should fail when category is unknown', async () => { - const lastCategoryIndex = (await iexecPoco.countCategory()).toNumber() - 1; + const lastCategoryIndex = Number(await iexecPoco.countCategory()) - 1; orders.requester.category = lastCategoryIndex + 1; orders.workerpool.category = lastCategoryIndex + 1; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( @@ -738,7 +737,7 @@ describe('IexecPoco1', () => { await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x12', ); - orders.requester.workerpool = randomContract.address; + orders.requester.workerpool = randomContractAddress; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x12', ); @@ -783,7 +782,7 @@ describe('IexecPoco1', () => { ); // SC // @ts-ignore - orders[orderName][assetName + 'restrict'] = randomContract.address; // e.g. orders.app.datasetrestrict = 0xSC + orders[orderName][assetName + 'restrict'] = randomContractAddress; // e.g. orders.app.datasetrestrict = 0xSC await expect(iexecPoco.matchOrders(...orders.toArray())).to.be.revertedWith( message, ); @@ -792,8 +791,8 @@ describe('IexecPoco1', () => { }); it('Should fail when app is not registered', async () => { - orders.app.app = randomContract.address; // Must be an Ownable contract. - orders.requester.app = randomContract.address; + orders.app.app = randomContractAddress; // Must be an Ownable contract. + orders.requester.app = randomContractAddress; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x20', ); @@ -814,16 +813,16 @@ describe('IexecPoco1', () => { await IERC721__factory.connect(await iexecPoco.appregistry(), appProvider) .transferFrom( appProvider.address, - erc1271MockContract.address, + erc1271MockContractAddress, appAddress, // tokenId ) .then((tx) => tx.wait()); // Make sure the test does not fail because of another reason. - const signerAddress = ethers.utils.verifyMessage( + const signerAddress = ethers.verifyMessage( hashOrder(iexecWrapper.getDomain(), orders.app), orders.app.sign as any, ); - expect(signerAddress).to.not.equal(erc1271MockContract.address); // owner of app. + expect(signerAddress).to.not.equal(erc1271MockContractAddress); // owner of app. // Match orders. await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x21', @@ -831,8 +830,8 @@ describe('IexecPoco1', () => { }); it('Should fail when dataset is not registered', async () => { - orders.dataset.dataset = randomContract.address; // Must be an Ownable contract. - orders.requester.dataset = randomContract.address; + orders.dataset.dataset = randomContractAddress; // Must be an Ownable contract. + orders.requester.dataset = randomContractAddress; await signOrder(iexecWrapper.getDomain(), orders.app, appProvider); await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x30', @@ -854,16 +853,16 @@ describe('IexecPoco1', () => { await IERC721__factory.connect(await iexecPoco.datasetregistry(), datasetProvider) .transferFrom( datasetProvider.address, - erc1271MockContract.address, + erc1271MockContractAddress, datasetAddress, // tokenId ) .then((tx) => tx.wait()); // Make sure the test does not fail because of another reason. - const signerAddress = ethers.utils.verifyMessage( + const signerAddress = ethers.verifyMessage( hashOrder(iexecWrapper.getDomain(), orders.dataset), orders.dataset.sign as any, ); - expect(signerAddress).to.not.equal(erc1271MockContract.address); // owner of dataset. + expect(signerAddress).to.not.equal(erc1271MockContractAddress); // owner of dataset. // Match orders. await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x31', @@ -871,8 +870,8 @@ describe('IexecPoco1', () => { }); it('Should fail when workerpool is not registered', async () => { - orders.workerpool.workerpool = randomContract.address; // Must be an Ownable contract. - orders.requester.workerpool = randomContract.address; + orders.workerpool.workerpool = randomContractAddress; // Must be an Ownable contract. + orders.requester.workerpool = randomContractAddress; await signOrder(iexecWrapper.getDomain(), orders.app, appProvider); await signOrder(iexecWrapper.getDomain(), orders.dataset, datasetProvider); await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( @@ -895,16 +894,16 @@ describe('IexecPoco1', () => { await IERC721__factory.connect(await iexecPoco.workerpoolregistry(), scheduler) .transferFrom( scheduler.address, - erc1271MockContract.address, + erc1271MockContractAddress, workerpoolAddress, // tokenId ) .then((tx) => tx.wait()); // Make sure the test does not fail because of another reason. - const signerAddress = ethers.utils.verifyMessage( + const signerAddress = ethers.verifyMessage( hashOrder(iexecWrapper.getDomain(), orders.workerpool), orders.workerpool.sign as any, ); - expect(signerAddress).to.not.equal(erc1271MockContract.address); // owner of workerpool. + expect(signerAddress).to.not.equal(erc1271MockContractAddress); // owner of workerpool. // Match orders. await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x41', @@ -923,13 +922,13 @@ describe('IexecPoco1', () => { await signOrders(iexecWrapper.getDomain(), orders, ordersActors); orders.requester.sign = randomSignature; // Override signature. // Set the smart contract as the requester. - orders.requester.requester = erc1271MockContract.address; + orders.requester.requester = erc1271MockContractAddress; // Make sure the test does not fail because of another reason. - const signerAddress = ethers.utils.verifyMessage( + const signerAddress = ethers.verifyMessage( hashOrder(iexecWrapper.getDomain(), orders.requester), orders.requester.sign as any, ); - expect(signerAddress).to.not.equal(erc1271MockContract.address); // Requester. + expect(signerAddress).to.not.equal(erc1271MockContractAddress); // Requester. // Match orders. await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x50', @@ -942,8 +941,8 @@ describe('IexecPoco1', () => { // Needs more debugging. // // const appOrderHash = iexecWrapper.hashOrder(orders.app); - // const appOrderConsumedSlotIndex = ethers.utils.keccak256( - // ethers.utils.concat([ + // const appOrderConsumedSlotIndex = ethers.keccak256( + // ethers.concat([ // appOrderHash, // key in the mapping. // '0x12', // m_consumed mapping index. // ]) @@ -952,7 +951,7 @@ describe('IexecPoco1', () => { // await setStorageAt( // iexecPoco.address, // appOrderConsumedSlotIndex, - // ethers.utils.hexlify(Number(orders.app.volume)), + // ethers.hexlify(Number(orders.app.volume)), // ); await depositForRequesterAndSchedulerWithDefaultPrices(botVolume); await signOrders(iexecWrapper.getDomain(), orders, ordersActors); @@ -1019,15 +1018,15 @@ describe('IexecPoco1', () => { await iexecWrapper.depositInIexecAccount(sponsor, dealPrice); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); // Save frozen balances before match. - const sponsorFrozenBefore = (await iexecPoco.frozenOf(sponsor.address)).toNumber(); + const sponsorFrozenBefore = Number(await iexecPoco.frozenOf(sponsor.address)); // Sign and match orders. await signOrders(domain, orders, ordersActors); const dealId = getDealId(domain, orders.requester); expect( - await iexecPocoAsSponsor.callStatic.sponsorMatchOrders(...orders.toArray()), + await iexecPocoAsSponsor.sponsorMatchOrders.staticCall(...orders.toArray()), ).to.equal(dealId); expect( - await iexecPocoAccessors.callStatic.computeDealVolume(...orders.toArray()), + await iexecPocoAccessors.computeDealVolume.staticCall(...orders.toArray()), ).to.equal(expectedVolume); const tx = iexecPocoAsSponsor.sponsorMatchOrders(...orders.toArray()); // Check balances and frozen. diff --git a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts index 499d492c5..e4e6e7ec3 100644 --- a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts @@ -1,10 +1,11 @@ // SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, mine, time } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; -import { ethers } from 'hardhat'; +import { ZeroAddress, ethers } from 'ethers'; +import { Address } from 'hardhat-deploy/dist/types'; import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../../../typechain'; import { OrdersAssets, OrdersPrices, buildOrders } from '../../../utils/createOrders'; import { @@ -26,11 +27,12 @@ const appPrice = 1000; const datasetPrice = 1_000_000; const workerpoolPrice = 1_000_000_000; const taskPrice = appPrice + datasetPrice + workerpoolPrice; -const enclaveAddress = ethers.constants.AddressZero; +const enclaveAddress = ZeroAddress; describe('IexecPoco2#claim', async () => { let proxyAddress: string; let iexecPoco: IexecInterfaceNative; + let iexecPocoAddress: Address; let iexecPocoAsAnyone: IexecInterfaceNative; let iexecWrapper: IexecWrapper; let [appAddress, datasetAddress, workerpoolAddress]: string[] = []; @@ -53,6 +55,7 @@ describe('IexecPoco2#claim', async () => { ({ appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets()); await iexecWrapper.setTeeBroker('0x0000000000000000000000000000000000000000'); iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, iexecAdmin); + iexecPocoAddress = await iexecPoco.getAddress(); iexecPocoAsAnyone = iexecPoco.connect(anyone); ordersAssets = { app: appAddress, @@ -91,7 +94,7 @@ describe('IexecPoco2#claim', async () => { await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const workers = [worker1, worker2]; for (const worker of workers) { const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -108,17 +111,10 @@ describe('IexecPoco2#claim', async () => { await iexecWrapper.depositInIexecAccount(worker, workerTaskStake); await iexecPoco .connect(worker) - .contribute( - taskId, - resultHash, - resultSeal, - ethers.constants.AddressZero, - '0x', - schedulerSignature, - ) + .contribute(taskId, resultHash, resultSeal, ZeroAddress, '0x', schedulerSignature) .then((tx) => tx.wait()); } - expect(await iexecPoco.balanceOf(iexecPoco.address)).to.be.equal( + expect(await iexecPoco.balanceOf(iexecPocoAddress)).to.be.equal( dealPrice + schedulerDealStake + workerTaskStake * workers.length, ); expect(await iexecPoco.balanceOf(requester.address)).to.be.equal(0); @@ -140,7 +136,7 @@ describe('IexecPoco2#claim', async () => { await claimTx.wait(); await expect(claimTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, sponsor.address, taskPrice) + .withArgs(iexecPocoAddress, sponsor.address, taskPrice) .to.emit(iexecPoco, 'Unlock') .withArgs(sponsor.address, taskPrice) .to.emit(iexecPoco, 'Seize') @@ -152,7 +148,7 @@ describe('IexecPoco2#claim', async () => { for (const worker of workers) { await expect(claimTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, worker.address, workerTaskStake) + .withArgs(iexecPocoAddress, worker.address, workerTaskStake) .to.emit(iexecPoco, 'Unlock') .withArgs(worker.address, workerTaskStake); } @@ -160,7 +156,7 @@ describe('IexecPoco2#claim', async () => { expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.FAILED); const remainingTasksToClaim = expectedVolume - claimedTasks; - expect(await iexecPoco.balanceOf(iexecPoco.address)).to.be.equal( + expect(await iexecPoco.balanceOf(iexecPocoAddress)).to.be.equal( taskPrice * remainingTasksToClaim + // sponsor has 2nd & 3rd task locked schedulerDealStake, // kitty value since 1st task seized ); @@ -204,7 +200,7 @@ describe('IexecPoco2#claim', async () => { await expect(iexecPocoAsAnyone.claim(taskId)) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, requester.address, taskPrice) + .withArgs(iexecPocoAddress, requester.address, taskPrice) .to.emit(iexecPoco, 'Unlock') .withArgs(requester.address, taskPrice) .to.emit(iexecPoco, 'TaskClaimed'); @@ -261,7 +257,7 @@ describe('IexecPoco2#claim', async () => { ); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); await iexecWrapper.depositInIexecAccount(worker1, workerTaskStake); await iexecPoco .connect(worker1) @@ -316,7 +312,7 @@ describe('IexecPoco2#claim', async () => { // Mine empty block so timestamp is accurate when static call is made await mine(); - expect(await iexecPocoAsAnyone.callStatic.claimArray(taskIds)).to.be.true; + expect(await iexecPocoAsAnyone.claimArray.staticCall(taskIds)).to.be.true; const claimArrayTx = await iexecPocoAsAnyone.claimArray(taskIds); await claimArrayTx.wait(); for (let taskId of taskIds) { @@ -344,8 +340,8 @@ describe('IexecPoco2#claim', async () => { await time.setNextBlockTimestamp(startTime + maxDealDuration); // Check first task is claimable and second task is not claimable - await expect(iexecPoco.estimateGas.claim(taskId1)).to.not.be.revertedWithoutReason(); - await expect(iexecPoco.estimateGas.claim(taskId2)).to.be.revertedWithoutReason(); + await expect(iexecPoco.claim.estimateGas(taskId1)).to.not.be.revertedWithoutReason(); + await expect(iexecPoco.claim.estimateGas(taskId2)).to.be.revertedWithoutReason(); // Claim array will fail await expect(iexecPoco.claimArray([taskId1, taskId2])).to.be.revertedWithoutReason(); }); @@ -369,7 +365,7 @@ describe('IexecPoco2#claim', async () => { expect( await iexecPoco .connect(anyone) - .callStatic.initializeAndClaimArray(dealIds, taskIndexes), + .initializeAndClaimArray.staticCall(dealIds, taskIndexes), ).to.be.true; const initializeAndClaimArrayTx = await iexecPoco .connect(anyone) @@ -386,7 +382,7 @@ describe('IexecPoco2#claim', async () => { }); it('Should not initialize and claim array if incompatible length of inputs', async () => { - const dealId = ethers.utils.hashMessage('dealId'); + const dealId = ethers.hashMessage('dealId'); await expect( iexecPoco.initializeAndClaimArray([dealId, dealId], [0]), ).to.be.revertedWithoutReason(); diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts index 7d0d4142d..a48f5bc39 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts @@ -1,11 +1,10 @@ // SPDX-FileCopyrightText: 2020-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { AddressZero, HashZero } from '@ethersproject/constants'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; -import { ethers } from 'hardhat'; +import { Wallet, ZeroAddress, ZeroHash, ethers } from 'ethers'; import { IexecInterfaceNative, IexecInterfaceNative__factory, @@ -35,8 +34,8 @@ const timeRef = CONFIG.categories[0].workClockTimeRef; const trust = 1; const volume = 1; const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; -const standardDealTag = HashZero; -const emptyEnclaveAddress = AddressZero; +const standardDealTag = ZeroHash; +const emptyEnclaveAddress = ZeroAddress; const emptyEnclaveSignature = '0x'; const noCallbackData = '0x'; const noResultsData = '0x'; @@ -94,7 +93,8 @@ describe('IexecPoco2#contributeAndFinalize', () => { const callbackConsumer = await new TestClient__factory() .connect(anyone) .deploy() - .then((contract) => contract.deployed()); + .then((contract) => contract.waitForDeployment()); + const callbackConsumerAddress = await callbackConsumer.getAddress(); // Create deal and task. const { dealId, taskIndex, taskId } = await iexecWrapper.signAndMatchOrders( ...buildOrders({ @@ -104,7 +104,7 @@ describe('IexecPoco2#contributeAndFinalize', () => { volume, trust, tag: teeDealTag, - callback: callbackConsumer.address, + callback: callbackConsumerAddress, }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); @@ -190,27 +190,28 @@ describe('IexecPoco2#contributeAndFinalize', () => { ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); // Check events. + const iexecPocoAddress = await iexecPoco.getAddress(); await expect(contributeAndFinalizeTx) .to.emit(iexecPoco, 'Seize') .withArgs(requester.address, taskPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, appProvider.address, appPrice) + .withArgs(iexecPocoAddress, appProvider.address, appPrice) .to.emit(iexecPoco, 'Reward') .withArgs(appProvider.address, appPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, datasetProvider.address, datasetPrice) + .withArgs(iexecPocoAddress, datasetProvider.address, datasetPrice) .to.emit(iexecPoco, 'Reward') .withArgs(datasetProvider.address, datasetPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, scheduler.address, schedulerStake) + .withArgs(iexecPocoAddress, scheduler.address, schedulerStake) .to.emit(iexecPoco, 'Unlock') .withArgs(scheduler.address, schedulerStake) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, worker.address, workersReward) + .withArgs(iexecPocoAddress, worker.address, workersReward) .to.emit(iexecPoco, 'Reward') .withArgs(worker.address, workersReward, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, scheduler.address, schedulerReward) + .withArgs(iexecPocoAddress, scheduler.address, schedulerReward) .to.emit(iexecPoco, 'Reward') .withArgs(scheduler.address, schedulerReward, taskId); // Task events. @@ -267,7 +268,7 @@ describe('IexecPoco2#contributeAndFinalize', () => { const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.COMPLETED); expect(task.resultDigest).to.equal(resultDigest); - expect(task.results).to.equal(ethers.utils.hexlify(results)); + expect(task.results).to.equal(ethers.toBeHex(ethers.toBigInt(results))); expect(task.resultsCallback).to.equal(noCallbackData); // Check events. await expect(contributeAndFinalizeTx) @@ -397,7 +398,7 @@ describe('IexecPoco2#contributeAndFinalize', () => { volume, trust, tag: standardDealTag, - callback: ethers.Wallet.createRandom().address, // Using callback + callback: Wallet.createRandom().address, // Using callback }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); @@ -408,7 +409,7 @@ describe('IexecPoco2#contributeAndFinalize', () => { taskId, resultsCallbackDigest, noResultsData, - ethers.utils.hexlify(ethers.utils.randomBytes(32)), // Bad callback data. + ethers.toBeHex(ethers.toBigInt(ethers.randomBytes(32))), // Bad callback data. emptyEnclaveAddress, emptyEnclaveSignature, await buildAndSignContributionAuthorizationMessage( diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts index 4364a8980..11ff9984d 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2020-2024 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { AddressZero, HashZero } from '@ethersproject/constants'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { assert, expect } from 'chai'; +import { ZeroAddress, ZeroHash } from 'ethers'; import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../../../typechain'; import { NULL } from '../../../utils/constants'; import { IexecOrders, OrdersAssets, OrdersPrices, buildOrders } from '../../../utils/createOrders'; @@ -26,10 +26,10 @@ const CONFIG = require('../../../config/config.json'); const timeRef = CONFIG.categories[0].workClockTimeRef; const volume = 3; const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; -const standardDealTag = HashZero; +const standardDealTag = ZeroHash; const { resultDigest } = buildUtf8ResultAndDigest('result'); const { resultDigest: badResultDigest } = buildUtf8ResultAndDigest('bad-result'); -const emptyEnclaveAddress = AddressZero; +const emptyEnclaveAddress = ZeroAddress; const emptyEnclaveSignature = NULL.SIGNATURE; describe('IexecPoco2#contribute', () => { @@ -114,7 +114,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const workers = [ { signer: worker1, resultDigest: resultDigest }, { signer: worker2, resultDigest: badResultDigest }, @@ -126,7 +126,7 @@ describe('IexecPoco2#contribute', () => { let task; let contributeBlockTimestamp; const viewFrozenOf = (address: string) => - iexecPoco.frozenOf(address).then((frozen) => frozen.toNumber()); + iexecPoco.frozenOf(address).then((frozen) => Number(frozen)); for (let i = 0; i < workers.length; i++) { const worker = workers[i]; const workerAddress = worker.signer.address; @@ -218,7 +218,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -249,7 +249,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -343,7 +343,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index 189133fc6..b8745d452 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -1,10 +1,10 @@ // SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { AddressZero } from '@ethersproject/constants'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, setStorageAt, time } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; +import { AbiCoder, Wallet, ZeroAddress } from 'ethers'; import { ethers } from 'hardhat'; import { IexecInterfaceNative, @@ -25,14 +25,14 @@ import { IexecWrapper } from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; const { results, resultDigest } = buildUtf8ResultAndDigest('result'); -const hexResults = ethers.utils.hexlify(results); +const hexResults = ethers.hexlify(results); const { resultsCallback, callbackResultDigest } = buildResultCallbackAndDigest(123); const appPrice = 1000; const datasetPrice = 1_000_000; const workerpoolPrice = 1_000_000_000; const taskPrice = appPrice + datasetPrice + workerpoolPrice; -const emptyEnclaveAddress = AddressZero; +const emptyEnclaveAddress = ZeroAddress; const emptyEnclaveSignature = '0x'; describe('IexecPoco2#finalize', async () => { @@ -96,7 +96,7 @@ describe('IexecPoco2#finalize', async () => { const oracleConsumerInstance = await new TestClient__factory() .connect(anyone) .deploy() - .then((contract) => contract.deployed()); + .then((contract) => contract.waitForDeployment()); const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice const orders = buildOrders({ assets: ordersAssets, @@ -117,7 +117,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { callbackResultDigest: wrongCallbackResultDigest } = buildResultCallbackAndDigest(567); const workers = [ @@ -167,14 +167,14 @@ describe('IexecPoco2#finalize', async () => { .then((tx) => tx.wait()); } const requesterFrozenBefore = await iexecPoco.frozenOf(requester.address); - const sponsorFrozenBefore = (await iexecPoco.frozenOf(sponsor.address)).toNumber(); - const schedulerFrozenBefore = (await iexecPoco.frozenOf(scheduler.address)).toNumber(); + const sponsorFrozenBefore = Number(await iexecPoco.frozenOf(sponsor.address)); + const schedulerFrozenBefore = Number(await iexecPoco.frozenOf(scheduler.address)); const workersFrozenBefore: { [name: string]: number } = {}; for (const worker of workers) { const workerAddress = worker.signer.address; workersFrozenBefore[workerAddress] = await iexecPoco .frozenOf(workerAddress) - .then((frozen) => frozen.toNumber()); + .then((frozen) => Number(frozen)); expect(await iexecPoco.viewScore(workerAddress)).to.be.equal(1); } const kittyFrozenBefore = await iexecPoco.frozenOf(kittyAddress); @@ -294,7 +294,7 @@ describe('IexecPoco2#finalize', async () => { const orders = buildOrders({ assets: { app: appAddress, - dataset: AddressZero, + dataset: ZeroAddress, workerpool: workerpoolAddress, }, requester: requester.address, @@ -307,7 +307,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -359,7 +359,7 @@ describe('IexecPoco2#finalize', async () => { }); it('Should finalize task when callback address is EOA', async () => { - const callbackEOAAddress = ethers.Wallet.createRandom().address; + const callbackEOAAddress = Wallet.createRandom().address; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -373,7 +373,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, callbackResultDigest, @@ -411,7 +411,7 @@ describe('IexecPoco2#finalize', async () => { const nonEip1154RandomContract = await new OwnableMock__factory() .connect(anyone) .deploy() - .then((contract) => contract.deployed()); + .then((contract) => contract.waitForDeployment()); const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -425,7 +425,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, callbackResultDigest, @@ -507,13 +507,13 @@ describe('IexecPoco2#finalize', async () => { workerpool: workerpoolPriceToFillKitty, // 30% will go to kitty }, volume: kittyFillingDealVolume, - salt: ethers.utils.id(new Date().toISOString()), + salt: ethers.id(new Date().toISOString()), }).toArray(), ); await iexecPoco .initialize(kittyFillingDeal.dealId, kittyFillingDeal.taskIndex) .then((tx) => tx.wait()); - const kittyFrozenBeforeClaim = (await iexecPoco.frozenOf(kittyAddress)).toNumber(); + const kittyFrozenBeforeClaim = Number(await iexecPoco.frozenOf(kittyAddress)); await time.setNextBlockTimestamp( (await iexecPoco.viewTask(kittyFillingDeal.taskId)).finalDeadline, ); @@ -530,7 +530,7 @@ describe('IexecPoco2#finalize', async () => { .withArgs(kittyAddress, kittyFillingSchedulerTaskStake, kittyFillingDeal.taskId) .to.emit(iexecPoco, 'Lock') .withArgs(kittyAddress, kittyFillingSchedulerTaskStake); - const kittyFrozenAfterClaim = (await iexecPoco.frozenOf(kittyAddress)).toNumber(); + const kittyFrozenAfterClaim = Number(await iexecPoco.frozenOf(kittyAddress)); expect(kittyFrozenAfterClaim).to.equal( kittyFrozenBeforeClaim + kittyFillingSchedulerTaskStake, ); @@ -546,7 +546,7 @@ describe('IexecPoco2#finalize', async () => { workerpool: 0, }, volume: 1, - salt: ethers.utils.id(new Date().toISOString()), + salt: ethers.id(new Date().toISOString()), }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); @@ -566,7 +566,7 @@ describe('IexecPoco2#finalize', async () => { await buildAndSignContributionAuthorizationMessage( worker1.address, taskId, - AddressZero, + ZeroAddress, scheduler, ), ) @@ -614,7 +614,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const workers = [worker1, worker2]; for (const worker of workers) { const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -699,7 +699,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -744,7 +744,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const workers = [worker1, worker2]; for (const worker of workers) { const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -793,7 +793,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -836,7 +836,7 @@ describe('IexecPoco2#finalize', async () => { const oracleConsumerInstance = await new TestClient__factory() .connect(anyone) .deploy() - .then((contract) => contract.deployed()); + .then((contract) => contract.waitForDeployment()); const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -850,7 +850,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, callbackResultDigest, @@ -891,9 +891,9 @@ describe('IexecPoco2#finalize', async () => { }); async function setWorkerScoreInStorage(worker: string, score: number) { - const workerScoreSlot = ethers.utils.hexStripZeros( - ethers.utils.keccak256( - ethers.utils.defaultAbiCoder.encode( + const workerScoreSlot = ethers.stripZerosLeft( + ethers.keccak256( + AbiCoder.defaultAbiCoder().encode( ['address', 'uint256'], [ worker, diff --git a/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts b/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts index ffcdf55cc..2ce32966f 100644 --- a/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts @@ -1,8 +1,8 @@ // SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; import { ethers } from 'hardhat'; import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../../../typechain'; @@ -71,7 +71,7 @@ describe('IexecPoco2#initialize', async () => { ); expect((await iexecPoco.viewTask(taskId)).status).equal(TaskStatusEnum.UNSET); - expect(await iexecPocoAsAnyone.callStatic.initialize(dealId, taskIndex)).to.equal( + expect(await iexecPocoAsAnyone.initialize.staticCall(dealId, taskIndex)).to.equal( taskId, ); const initialize = await iexecPocoAsAnyone.initialize(dealId, taskIndex); @@ -178,7 +178,7 @@ describe('IexecPoco2#initialize', async () => { expect((await iexecPoco.viewTask(taskId)).status).equal(TaskStatusEnum.UNSET); } - expect(await iexecPocoAsAnyone.callStatic.initializeArray(dealIds, taskIndexes)).to.be + expect(await iexecPocoAsAnyone.initializeArray.staticCall(dealIds, taskIndexes)).to.be .true; const initializeArrayTx = await iexecPocoAsAnyone.initializeArray(dealIds, taskIndexes); await initializeArrayTx.wait(); @@ -192,7 +192,7 @@ describe('IexecPoco2#initialize', async () => { }); it('Should not initialize array if incompatible length of inputs', async function () { - const dealId = ethers.utils.hashMessage('dealId'); + const dealId = ethers.hashMessage('dealId'); await expect( iexecPoco.initializeArray([dealId, dealId], [0]), ).to.be.revertedWithoutReason(); diff --git a/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts b/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts index 53681fad6..a1e14d369 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts @@ -1,11 +1,11 @@ -// SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH +// SPDX-FileCopyrightText: 2024-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { AddressZero, HashZero } from '@ethersproject/constants'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, mine, time } from '@nomicfoundation/hardhat-network-helpers'; import { setNextBlockTimestamp } from '@nomicfoundation/hardhat-network-helpers/dist/src/helpers/time'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; +import { ZeroAddress, ZeroHash } from 'ethers'; import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../../../typechain'; import { OrdersAssets, OrdersPrices, buildOrders } from '../../../utils/createOrders'; import { @@ -125,7 +125,7 @@ describe('IexecPoco2#reopen', async () => { // No getter for m_consensus. const taskAfter = await iexecPoco.viewTask(taskId); expect(taskAfter.status).to.equal(TaskStatusEnum.ACTIVE); - expect(taskAfter.consensusValue).to.equal(HashZero); + expect(taskAfter.consensusValue).to.equal(ZeroHash); expect(taskAfter.revealCounter).to.equal(0); expect(taskAfter.winnerCounter).to.equal(0); }); @@ -242,11 +242,11 @@ describe('IexecPoco2#reopen', async () => { * @param resultDigest */ async function contribute(worker: SignerWithAddress, resultDigest: string) { - const emptyEnclaveAddress = AddressZero; + const emptyEnclaveAddress = ZeroAddress; const emptyEnclaveSignature = '0x'; const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); await iexecWrapper.depositInIexecAccount(worker, workerTaskStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, diff --git a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts index dca3cbb30..862143cf0 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts @@ -1,11 +1,10 @@ // SPDX-FileCopyrightText: 2020-2024 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { AddressZero, HashZero } from '@ethersproject/constants'; +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers'; -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; import { expect } from 'chai'; -import { ethers } from 'hardhat'; +import { ZeroAddress, ZeroHash, ethers } from 'ethers'; import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../../../typechain'; import { NULL } from '../../../utils/constants'; import { IexecOrders, OrdersAssets, OrdersPrices, buildOrders } from '../../../utils/createOrders'; @@ -22,10 +21,10 @@ import { IexecWrapper } from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; const volume = 1; -const standardDealTag = HashZero; +const standardDealTag = ZeroHash; const { resultDigest } = buildUtf8ResultAndDigest('result'); const { resultDigest: badResultDigest } = buildUtf8ResultAndDigest('bad-result'); -const emptyEnclaveAddress = AddressZero; +const emptyEnclaveAddress = ZeroAddress; const emptyEnclaveSignature = NULL.SIGNATURE; describe('IexecPoco2#reveal', () => { @@ -89,7 +88,7 @@ describe('IexecPoco2#reveal', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); await iexecWrapper.depositInIexecAccount(worker, workerTaskStake); ({ resultHash, resultSeal } = buildResultHashAndResultSeal(taskId, resultDigest, worker)); schedulerSignature = await buildAndSignContributionAuthorizationMessage( @@ -200,7 +199,7 @@ describe('IexecPoco2#reveal', () => { volume, trust: 3, tag: standardDealTag, - salt: ethers.utils.hexZeroPad('0x' + Date.now().toString(), 32), // make + salt: ethers.zeroPadValue('0x' + Date.now().toString(), 32), // make }).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. @@ -208,7 +207,7 @@ describe('IexecPoco2#reveal', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => deal.workerStake.toNumber()); + .then((deal) => Number(deal.workerStake)); const workers = [ { signer: worker1, resultDigest: resultDigest }, { signer: worker2, resultDigest: badResultDigest }, diff --git a/utils/poco-tools.ts b/utils/poco-tools.ts index 497319057..54245c7c1 100644 --- a/utils/poco-tools.ts +++ b/utils/poco-tools.ts @@ -3,7 +3,7 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { time } from '@nomicfoundation/hardhat-network-helpers'; -import { TypedDataDomain } from 'ethers'; +import { toUtf8Bytes, TypedDataDomain } from 'ethers'; import { ethers } from 'hardhat'; import { IexecLibOrders_v5 } from '../typechain'; import { hashOrder } from './createOrders'; @@ -117,7 +117,7 @@ function buildContributionAuthorizationMessage( } export function buildUtf8ResultAndDigest(resultPayload: string) { - const results = ethers.toUtf8Bytes(resultPayload); + const results = toUtf8Bytes(resultPayload); const resultDigest = ethers.keccak256(results); return { results, resultDigest }; } diff --git a/utils/tools.ts b/utils/tools.ts index d0555c1b1..527dc6f9b 100644 --- a/utils/tools.ts +++ b/utils/tools.ts @@ -1,19 +1,18 @@ // SPDX-FileCopyrightText: 2020-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import type { BigNumber } from 'ethers'; +import { toBeHex, type BigNumberish } from 'ethers'; import { ethers } from 'hardhat'; export function compactSignature(signature: string): string { - const split = ethers.utils.splitSignature(signature); - let vs = ethers.utils.arrayify(split.s); - if (split.v == 1 || split.v == 28) { + const split = ethers.Signature.from(signature); + let vs = ethers.getBytes(split.s); + if (split.v == 27 || split.v == 28) { vs[0] |= 0x80; } - return ethers.utils.hexlify(ethers.utils.concat([split.r, vs])); + return ethers.hexlify(ethers.concat([split.r, vs])); } -export function BN2Address(bignumber: BigNumber) { - const lowercaseAddress = ethers.utils.hexZeroPad(bignumber.toHexString(), 20); - return ethers.utils.getAddress(lowercaseAddress); +export function BN2Address(bignumber: BigNumberish) { + return ethers.getAddress(toBeHex(bignumber)); } From 21dab8e8bb130e6a79ee53286d185d9a457dd2ec Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Mon, 17 Feb 2025 13:00:42 +0100 Subject: [PATCH 02/32] Update copyright years in IexecPoco test files and adjust variable types --- CHANGELOG.md | 2 +- test/byContract/IexecPoco/IexecPoco1.test.ts | 7 +- .../IexecPoco/IexecPoco2-claim.test.ts | 2 +- .../IexecPoco/IexecPoco2-contribute.test.ts | 14 +-- .../IexecPoco/IexecPoco2-finalize.test.ts | 100 ++++++++++-------- .../IexecPoco/IexecPoco2-initialize.test.ts | 2 +- .../IexecPoco/IexecPoco2-reopen.test.ts | 2 +- .../IexecPoco/IexecPoco2-reveal.test.ts | 4 +- 8 files changed, 71 insertions(+), 62 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d8e9a0ff..67f9085c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ - Tests - test/*fullchain* (#190) - IexecAccessors (#189, #191) - - IexecPoco (#189, #191) + - IexecPoco (#196) - Migrate scripts to TypeScript: (#184) - `getFunctionSignatures.js`, `common-test-snapshot.js`, `test-storage.js`, `timelock.js` - Migrated utility files to TypeScript : (#183) diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index c98d88809..a60affdcb 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -1,10 +1,11 @@ -// SPDX-FileCopyrightText: 2020-2024 IEXEC BLOCKCHAIN TECH +// SPDX-FileCopyrightText: 2020-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; -import { Contract, ContractTransactionResponse, ZeroAddress, ZeroHash, ethers } from 'ethers'; +import { Contract, ContractTransactionResponse, Wallet, ZeroAddress, ZeroHash } from 'ethers'; +import { ethers } from 'hardhat'; import { Address } from 'hardhat-deploy/dist/types'; import { ERC1271Mock, @@ -52,7 +53,7 @@ const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000 const volume = 1; const botVolume = 321; const someMessage = 'some-message'; -const someWallet = ethers.Wallet.createRandom(); +const someWallet = Wallet.createRandom(); /** * Note: TEE is the default in tests. diff --git a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts index e4e6e7ec3..edad51a76 100644 --- a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH +// SPDX-FileCopyrightText: 2024-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts index 11ff9984d..28324a7a7 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2020-2024 IEXEC BLOCKCHAIN TECH +// SPDX-FileCopyrightText: 2020-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; @@ -166,12 +166,14 @@ describe('IexecPoco2#contribute', () => { task = await iexecPoco.viewTask(taskId); expect(task.contributors.length).equal(i + 1); expect(task.contributors[i]).equal(workerAddress); + + // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers + await expect(tx).to.changeTokenBalances( + iexecPoco, + [workerAddress, proxyAddress], + [-workerTaskStake, workerTaskStake], + ); await expect(tx) - .to.changeTokenBalances( - iexecPoco, - [workerAddress, proxyAddress], - [-workerTaskStake, workerTaskStake], - ) .to.emit(iexecPoco, 'Transfer') .withArgs(workerAddress, proxyAddress, workerTaskStake); expect(await viewFrozenOf(workerAddress)).equal(frozenBefore + workerTaskStake); diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index b8745d452..1187a5d4b 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH +// SPDX-FileCopyrightText: 2024-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; @@ -97,6 +97,7 @@ describe('IexecPoco2#finalize', async () => { .connect(anyone) .deploy() .then((contract) => contract.waitForDeployment()); + const oracleConsumerInstanceAddress = await oracleConsumerInstance.getAddress(); const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice const orders = buildOrders({ assets: ordersAssets, @@ -104,7 +105,7 @@ describe('IexecPoco2#finalize', async () => { prices: ordersPrices, volume: expectedVolume, trust: 3, - callback: oracleConsumerInstance.address, + callback: oracleConsumerInstanceAddress, }); const { dealId, taskId, taskIndex, dealPrice } = await iexecWrapper.signAndSponsorMatchOrders(...orders.toArray()); @@ -184,30 +185,31 @@ describe('IexecPoco2#finalize', async () => { const finalizeTx = await iexecPocoAsScheduler.finalize(taskId, results, resultsCallback); await finalizeTx.wait(); + const iexecPocoAddress = await iexecPoco.getAddress(); await expect(finalizeTx) .to.emit(iexecPoco, 'Seize') .withArgs(sponsor.address, taskPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, appProvider.address, appPrice) + .withArgs(iexecPocoAddress, appProvider.address, appPrice) .to.emit(iexecPoco, 'Reward') .withArgs(appProvider.address, appPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, datasetProvider.address, datasetPrice) + .withArgs(iexecPocoAddress, datasetProvider.address, datasetPrice) .to.emit(iexecPoco, 'Reward') .withArgs(datasetProvider.address, datasetPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, scheduler.address, schedulerTaskStake) + .withArgs(iexecPocoAddress, scheduler.address, schedulerTaskStake) .to.emit(iexecPoco, 'Unlock') .withArgs(scheduler.address, schedulerTaskStake); const workerReward = 429000000; for (const worker of winningWorkers) { await expect(finalizeTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, worker.address, workerTaskStake) + .withArgs(iexecPocoAddress, worker.address, workerTaskStake) .to.emit(iexecPoco, 'Unlock') .withArgs(worker.address, workerTaskStake) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, worker.address, workerReward) + .withArgs(iexecPocoAddress, worker.address, workerReward) .to.emit(iexecPoco, 'Reward') .withArgs(worker.address, workerReward, taskId) .to.emit(iexecPoco, 'AccurateContribution') @@ -224,7 +226,7 @@ describe('IexecPoco2#finalize', async () => { workerTaskStake; // losing worker stake await expect(finalizeTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPoco.address, scheduler.address, schedulerReward) + .withArgs(iexecPocoAddress, scheduler.address, schedulerReward) .to.emit(iexecPoco, 'Reward') .withArgs(scheduler.address, schedulerReward, taskId) .to.emit(iexecPoco, 'TaskFinalize') @@ -335,21 +337,22 @@ describe('IexecPoco2#finalize', async () => { .connect(worker1) .reveal(taskId, resultDigest) .then((tx) => tx.wait()); - const requesterFrozenBefore = (await iexecPoco.frozenOf(requester.address)).toNumber(); + const requesterFrozenBefore = Number(await iexecPoco.frozenOf(requester.address)); const sponsorFrozenBefore = await iexecPoco.frozenOf(sponsor.address); - await expect(iexecPocoAsScheduler.finalize(taskId, results, '0x')) - .to.changeTokenBalances( - iexecPoco, - [requester, sponsor, appProvider, datasetProvider], - [ - 0, // requester balance is unchanged, only frozen is changed - 0, - appPrice, // app provider is rewarded - 0, // but dataset provider is not rewarded - ], - ) - .to.emit(iexecPoco, 'TaskFinalize'); + // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers + const txFinalize = iexecPocoAsScheduler.finalize(taskId, results, '0x'); + await expect(txFinalize).to.changeTokenBalances( + iexecPoco, + [requester, sponsor, appProvider, datasetProvider], + [ + 0, // requester balance is unchanged, only frozen is changed + 0, + appPrice, // app provider is rewarded + 0, // but dataset provider is not rewarded + ], + ); + await expect(txFinalize).to.emit(iexecPoco, 'TaskFinalize'); expect(await iexecPoco.frozenOf(requester.address)).to.be.equal( requesterFrozenBefore - taskPrice, ); @@ -408,15 +411,16 @@ describe('IexecPoco2#finalize', async () => { }); it('Should finalize task when callback address is non-EIP1154 contract', async () => { - const nonEip1154RandomContract = await new OwnableMock__factory() + const nonEip1154RandomContractAddress = await new OwnableMock__factory() .connect(anyone) .deploy() - .then((contract) => contract.waitForDeployment()); + .then((contract) => contract.waitForDeployment()) + .then((deployedContract) => deployedContract.getAddress()); const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, - callback: nonEip1154RandomContract.address, + callback: nonEip1154RandomContractAddress, }); const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( @@ -517,15 +521,17 @@ describe('IexecPoco2#finalize', async () => { await time.setNextBlockTimestamp( (await iexecPoco.viewTask(kittyFillingDeal.taskId)).finalDeadline, ); - await expect(iexecPoco.claim(kittyFillingDeal.taskId)) - .to.changeTokenBalances( - iexecPoco, - [iexecPoco, kittyAddress], - [ - -workerpoolPriceToFillKitty, // deal payer is refunded - 0, - ], - ) + const tx = iexecPoco.claim(kittyFillingDeal.taskId); + // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers + await expect(tx).to.changeTokenBalances( + iexecPoco, + [iexecPoco, kittyAddress], + [ + -workerpoolPriceToFillKitty, // deal payer is refunded + 0, + ], + ); + await expect(tx) .to.emit(iexecPoco, 'Reward') .withArgs(kittyAddress, kittyFillingSchedulerTaskStake, kittyFillingDeal.taskId) .to.emit(iexecPoco, 'Lock') @@ -575,21 +581,20 @@ describe('IexecPoco2#finalize', async () => { .connect(worker1) .reveal(taskId, resultDigest) .then((tx) => tx.wait()); - await expect(iexecPocoAsScheduler.finalize(taskId, results, '0x')) - .to.changeTokenBalances( - iexecPoco, - [iexecPoco, scheduler, kittyAddress], - [-expectedSchedulerKittyPartReward, expectedSchedulerKittyPartReward, 0], - ) + const iexecPocoAddress = await iexecPoco.getAddress(); + // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers + const txFinalize = iexecPocoAsScheduler.finalize(taskId, results, '0x'); + await expect(txFinalize).to.changeTokenBalances( + iexecPoco, + [iexecPoco, scheduler, kittyAddress], + [-expectedSchedulerKittyPartReward, expectedSchedulerKittyPartReward, 0], + ); + await expect(txFinalize) .to.emit(iexecPoco, 'TaskFinalize') .to.emit(iexecPoco, 'Seize') .withArgs(kittyAddress, expectedSchedulerKittyPartReward, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs( - iexecPoco.address, - scheduler.address, - expectedSchedulerKittyPartReward, - ) + .withArgs(iexecPocoAddress, scheduler.address, expectedSchedulerKittyPartReward) .to.emit(iexecPoco, 'Reward') .withArgs(scheduler.address, expectedSchedulerKittyPartReward, taskId); expect(await iexecPoco.frozenOf(kittyAddress)).to.equal( @@ -833,15 +838,16 @@ describe('IexecPoco2#finalize', async () => { }); it('Should not finalize task when result callback is bad', async () => { - const oracleConsumerInstance = await new TestClient__factory() + const oracleConsumerInstanceAddress = await new TestClient__factory() .connect(anyone) .deploy() - .then((contract) => contract.waitForDeployment()); + .then((contract) => contract.waitForDeployment()) + .then((deployedContract) => deployedContract.getAddress()); const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, - callback: oracleConsumerInstance.address, + callback: oracleConsumerInstanceAddress, }); const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( diff --git a/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts b/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts index 2ce32966f..036db7fa3 100644 --- a/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2024 IEXEC BLOCKCHAIN TECH +// SPDX-FileCopyrightText: 2024-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; diff --git a/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts b/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts index a1e14d369..dbd979883 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts @@ -43,7 +43,7 @@ describe('IexecPoco2#reopen', async () => { let ordersAssets: OrdersAssets; let ordersPrices: OrdersPrices; let [dealId, taskId]: string[] = []; - let taskIndex: number; + let taskIndex: bigint; beforeEach('Deploy', async () => { // Deploy all contracts diff --git a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts index 862143cf0..a9bf1905a 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2020-2024 IEXEC BLOCKCHAIN TECH +// SPDX-FileCopyrightText: 2020-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; @@ -45,7 +45,7 @@ describe('IexecPoco2#reveal', () => { let ordersPrices: OrdersPrices; let orders: IexecOrders; let [dealId, taskId]: string[] = []; - let taskIndex: number; + let taskIndex: bigint; let [resultHash, resultSeal]: string[] = []; let schedulerSignature: string; From e29ecfcb77a18362ba30e816bc15eeddcd938397 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Mon, 17 Feb 2025 13:01:58 +0100 Subject: [PATCH 03/32] reduce PR diff --- utils/poco-tools.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/poco-tools.ts b/utils/poco-tools.ts index 54245c7c1..497319057 100644 --- a/utils/poco-tools.ts +++ b/utils/poco-tools.ts @@ -3,7 +3,7 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { time } from '@nomicfoundation/hardhat-network-helpers'; -import { toUtf8Bytes, TypedDataDomain } from 'ethers'; +import { TypedDataDomain } from 'ethers'; import { ethers } from 'hardhat'; import { IexecLibOrders_v5 } from '../typechain'; import { hashOrder } from './createOrders'; @@ -117,7 +117,7 @@ function buildContributionAuthorizationMessage( } export function buildUtf8ResultAndDigest(resultPayload: string) { - const results = toUtf8Bytes(resultPayload); + const results = ethers.toUtf8Bytes(resultPayload); const resultDigest = ethers.keccak256(results); return { results, resultDigest }; } From 5e9b26846c5759080985dc4da7760430545ca30b Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Mon, 17 Feb 2025 13:02:59 +0100 Subject: [PATCH 04/32] reduce diff again --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9bcea5d20..d98118a8b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "main": "", "scripts": { "prepare": "husky", - "build": "npx hardhat clean && npx hardhat compile", + "build": "npx hardhat compile", "deploy": "npx hardhat deploy", "deploy:timelock": "hardhat run scripts/deploy-timelock.ts", "test-storage-layout": "npx hardhat run scripts/test-storage.ts", From a3631ea80910ba6cbe59b15057e5a0732e4d65e9 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Mon, 17 Feb 2025 13:08:07 +0100 Subject: [PATCH 05/32] fix conversion issue --- test/byContract/IexecPoco/IexecPoco2-reveal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts index a9bf1905a..a372f0d99 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts @@ -199,7 +199,7 @@ describe('IexecPoco2#reveal', () => { volume, trust: 3, tag: standardDealTag, - salt: ethers.zeroPadValue('0x' + Date.now().toString(), 32), // make + salt: ethers.zeroPadValue(ethers.toBeHex(Date.now().toString()), 32), // make }).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. From 9dc67150b26ef9ab7cff0df9d0f10b57ff7385bb Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Mon, 17 Feb 2025 13:15:01 +0100 Subject: [PATCH 06/32] fix salt generation in IexecPoco2 reveal test --- test/byContract/IexecPoco/IexecPoco2-reveal.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts index a372f0d99..ddeb299bd 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts @@ -199,7 +199,7 @@ describe('IexecPoco2#reveal', () => { volume, trust: 3, tag: standardDealTag, - salt: ethers.zeroPadValue(ethers.toBeHex(Date.now().toString()), 32), // make + salt: ethers.zeroPadValue(ethers.toBeHex(Date.now()), 32), // make }).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. From 278dd83726a9972aa22d8435ad27526f53f33d9c Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Mon, 17 Feb 2025 14:47:35 +0100 Subject: [PATCH 07/32] update compactSignature to use yParity for high bit check --- utils/tools.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/utils/tools.ts b/utils/tools.ts index 527dc6f9b..8706466ea 100644 --- a/utils/tools.ts +++ b/utils/tools.ts @@ -7,7 +7,8 @@ import { ethers } from 'hardhat'; export function compactSignature(signature: string): string { const split = ethers.Signature.from(signature); let vs = ethers.getBytes(split.s); - if (split.v == 27 || split.v == 28) { + // Check if we need to set the high bit + if (split.yParity === 1) { vs[0] |= 0x80; } return ethers.hexlify(ethers.concat([split.r, vs])); From 8b7ae826de3938703d872f9466507886620a5f14 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 10:16:23 +0100 Subject: [PATCH 08/32] refactor: replace Address type with string in IexecPoco tests --- test/byContract/IexecPoco/IexecPoco1.test.ts | 5 ++--- test/byContract/IexecPoco/IexecPoco2-claim.test.ts | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index a60affdcb..4db53c365 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -6,7 +6,6 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; import { Contract, ContractTransactionResponse, Wallet, ZeroAddress, ZeroHash } from 'ethers'; import { ethers } from 'hardhat'; -import { Address } from 'hardhat-deploy/dist/types'; import { ERC1271Mock, ERC1271Mock__factory, @@ -83,9 +82,9 @@ describe('IexecPoco1', () => { let ordersPrices: OrdersPrices; let orders: IexecOrders; let [randomAddress, randomSignature]: string[] = []; - let randomContractAddress: Address; + let randomContractAddress: string; let erc1271MockContract: ERC1271Mock; - let erc1271MockContractAddress: Address; + let erc1271MockContractAddress: string; let orderManagement: { [key: string]: { iexecPocoSignManageOrder: () => Promise; diff --git a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts index edad51a76..c7ee5d83c 100644 --- a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts @@ -5,7 +5,6 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, mine, time } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; import { ZeroAddress, ethers } from 'ethers'; -import { Address } from 'hardhat-deploy/dist/types'; import { IexecInterfaceNative, IexecInterfaceNative__factory } from '../../../typechain'; import { OrdersAssets, OrdersPrices, buildOrders } from '../../../utils/createOrders'; import { @@ -32,7 +31,7 @@ const enclaveAddress = ZeroAddress; describe('IexecPoco2#claim', async () => { let proxyAddress: string; let iexecPoco: IexecInterfaceNative; - let iexecPocoAddress: Address; + let iexecPocoAddress: string; let iexecPocoAsAnyone: IexecInterfaceNative; let iexecWrapper: IexecWrapper; let [appAddress, datasetAddress, workerpoolAddress]: string[] = []; From 604d985cb5fb28096a5490e5de6a99ea81fa913d Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 10:20:24 +0100 Subject: [PATCH 09/32] refactor: replace iexecPocoAddress with proxyAddress in IexecPoco2 tests --- .../IexecPoco/IexecPoco2-claim.test.ts | 13 ++++++------- .../IexecPoco/IexecPoco2-finalize.test.ts | 17 ++++++++--------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts index c7ee5d83c..694f41e70 100644 --- a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts @@ -31,7 +31,6 @@ const enclaveAddress = ZeroAddress; describe('IexecPoco2#claim', async () => { let proxyAddress: string; let iexecPoco: IexecInterfaceNative; - let iexecPocoAddress: string; let iexecPocoAsAnyone: IexecInterfaceNative; let iexecWrapper: IexecWrapper; let [appAddress, datasetAddress, workerpoolAddress]: string[] = []; @@ -54,7 +53,7 @@ describe('IexecPoco2#claim', async () => { ({ appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets()); await iexecWrapper.setTeeBroker('0x0000000000000000000000000000000000000000'); iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, iexecAdmin); - iexecPocoAddress = await iexecPoco.getAddress(); + proxyAddress = await iexecPoco.getAddress(); iexecPocoAsAnyone = iexecPoco.connect(anyone); ordersAssets = { app: appAddress, @@ -113,7 +112,7 @@ describe('IexecPoco2#claim', async () => { .contribute(taskId, resultHash, resultSeal, ZeroAddress, '0x', schedulerSignature) .then((tx) => tx.wait()); } - expect(await iexecPoco.balanceOf(iexecPocoAddress)).to.be.equal( + expect(await iexecPoco.balanceOf(proxyAddress)).to.be.equal( dealPrice + schedulerDealStake + workerTaskStake * workers.length, ); expect(await iexecPoco.balanceOf(requester.address)).to.be.equal(0); @@ -135,7 +134,7 @@ describe('IexecPoco2#claim', async () => { await claimTx.wait(); await expect(claimTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, sponsor.address, taskPrice) + .withArgs(proxyAddress, sponsor.address, taskPrice) .to.emit(iexecPoco, 'Unlock') .withArgs(sponsor.address, taskPrice) .to.emit(iexecPoco, 'Seize') @@ -147,7 +146,7 @@ describe('IexecPoco2#claim', async () => { for (const worker of workers) { await expect(claimTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, worker.address, workerTaskStake) + .withArgs(proxyAddress, worker.address, workerTaskStake) .to.emit(iexecPoco, 'Unlock') .withArgs(worker.address, workerTaskStake); } @@ -155,7 +154,7 @@ describe('IexecPoco2#claim', async () => { expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.FAILED); const remainingTasksToClaim = expectedVolume - claimedTasks; - expect(await iexecPoco.balanceOf(iexecPocoAddress)).to.be.equal( + expect(await iexecPoco.balanceOf(proxyAddress)).to.be.equal( taskPrice * remainingTasksToClaim + // sponsor has 2nd & 3rd task locked schedulerDealStake, // kitty value since 1st task seized ); @@ -199,7 +198,7 @@ describe('IexecPoco2#claim', async () => { await expect(iexecPocoAsAnyone.claim(taskId)) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, requester.address, taskPrice) + .withArgs(proxyAddress, requester.address, taskPrice) .to.emit(iexecPoco, 'Unlock') .withArgs(requester.address, taskPrice) .to.emit(iexecPoco, 'TaskClaimed'); diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index 1187a5d4b..5afad6c7e 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -185,31 +185,30 @@ describe('IexecPoco2#finalize', async () => { const finalizeTx = await iexecPocoAsScheduler.finalize(taskId, results, resultsCallback); await finalizeTx.wait(); - const iexecPocoAddress = await iexecPoco.getAddress(); await expect(finalizeTx) .to.emit(iexecPoco, 'Seize') .withArgs(sponsor.address, taskPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, appProvider.address, appPrice) + .withArgs(proxyAddress, appProvider.address, appPrice) .to.emit(iexecPoco, 'Reward') .withArgs(appProvider.address, appPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, datasetProvider.address, datasetPrice) + .withArgs(proxyAddress, datasetProvider.address, datasetPrice) .to.emit(iexecPoco, 'Reward') .withArgs(datasetProvider.address, datasetPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, scheduler.address, schedulerTaskStake) + .withArgs(proxyAddress, scheduler.address, schedulerTaskStake) .to.emit(iexecPoco, 'Unlock') .withArgs(scheduler.address, schedulerTaskStake); const workerReward = 429000000; for (const worker of winningWorkers) { await expect(finalizeTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, worker.address, workerTaskStake) + .withArgs(proxyAddress, worker.address, workerTaskStake) .to.emit(iexecPoco, 'Unlock') .withArgs(worker.address, workerTaskStake) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, worker.address, workerReward) + .withArgs(proxyAddress, worker.address, workerReward) .to.emit(iexecPoco, 'Reward') .withArgs(worker.address, workerReward, taskId) .to.emit(iexecPoco, 'AccurateContribution') @@ -226,7 +225,7 @@ describe('IexecPoco2#finalize', async () => { workerTaskStake; // losing worker stake await expect(finalizeTx) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, scheduler.address, schedulerReward) + .withArgs(proxyAddress, scheduler.address, schedulerReward) .to.emit(iexecPoco, 'Reward') .withArgs(scheduler.address, schedulerReward, taskId) .to.emit(iexecPoco, 'TaskFinalize') @@ -581,7 +580,7 @@ describe('IexecPoco2#finalize', async () => { .connect(worker1) .reveal(taskId, resultDigest) .then((tx) => tx.wait()); - const iexecPocoAddress = await iexecPoco.getAddress(); + const proxyAddress = await iexecPoco.getAddress(); // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers const txFinalize = iexecPocoAsScheduler.finalize(taskId, results, '0x'); await expect(txFinalize).to.changeTokenBalances( @@ -594,7 +593,7 @@ describe('IexecPoco2#finalize', async () => { .to.emit(iexecPoco, 'Seize') .withArgs(kittyAddress, expectedSchedulerKittyPartReward, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, scheduler.address, expectedSchedulerKittyPartReward) + .withArgs(proxyAddress, scheduler.address, expectedSchedulerKittyPartReward) .to.emit(iexecPoco, 'Reward') .withArgs(scheduler.address, expectedSchedulerKittyPartReward, taskId); expect(await iexecPoco.frozenOf(kittyAddress)).to.equal( From 374077278b18c41b5724b3d723403dc3982d0541 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 10:27:27 +0100 Subject: [PATCH 10/32] refactor: update callback address retrieval in IexecPoco2 finalize test --- test/byContract/IexecPoco/IexecPoco2-finalize.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index 5afad6c7e..c759427c0 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -97,7 +97,6 @@ describe('IexecPoco2#finalize', async () => { .connect(anyone) .deploy() .then((contract) => contract.waitForDeployment()); - const oracleConsumerInstanceAddress = await oracleConsumerInstance.getAddress(); const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice const orders = buildOrders({ assets: ordersAssets, @@ -105,7 +104,7 @@ describe('IexecPoco2#finalize', async () => { prices: ordersPrices, volume: expectedVolume, trust: 3, - callback: oracleConsumerInstanceAddress, + callback: await oracleConsumerInstance.getAddress(), }); const { dealId, taskId, taskIndex, dealPrice } = await iexecWrapper.signAndSponsorMatchOrders(...orders.toArray()); From c5aa92bd8bc9debdd14bcc58ce0bfab1a9b77900 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 10:28:45 +0100 Subject: [PATCH 11/32] remove useless comment --- test/byContract/IexecPoco/IexecPoco2-finalize.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index c759427c0..e671ab8ef 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -520,7 +520,7 @@ describe('IexecPoco2#finalize', async () => { (await iexecPoco.viewTask(kittyFillingDeal.taskId)).finalDeadline, ); const tx = iexecPoco.claim(kittyFillingDeal.taskId); - // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers + await expect(tx).to.changeTokenBalances( iexecPoco, [iexecPoco, kittyAddress], @@ -580,7 +580,7 @@ describe('IexecPoco2#finalize', async () => { .reveal(taskId, resultDigest) .then((tx) => tx.wait()); const proxyAddress = await iexecPoco.getAddress(); - // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers + const txFinalize = iexecPocoAsScheduler.finalize(taskId, results, '0x'); await expect(txFinalize).to.changeTokenBalances( iexecPoco, From fae693bbc1819ff3e7869d41ddfb9f4acc3a2dab Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 10:29:56 +0100 Subject: [PATCH 12/32] remove comment again --- test/byContract/IexecPoco/IexecPoco2-finalize.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index e671ab8ef..295a2b35e 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -338,7 +338,6 @@ describe('IexecPoco2#finalize', async () => { const requesterFrozenBefore = Number(await iexecPoco.frozenOf(requester.address)); const sponsorFrozenBefore = await iexecPoco.frozenOf(sponsor.address); - // The matcher 'emit' cannot be chained after 'changeTokenBalances' - https://hardhat.org/chaining-async-matchers const txFinalize = iexecPocoAsScheduler.finalize(taskId, results, '0x'); await expect(txFinalize).to.changeTokenBalances( iexecPoco, From ff86e7c00bf77b34b230047623fbb76fa518f3c4 Mon Sep 17 00:00:00 2001 From: Robin Le Caignec <72495599+Le-Caignec@users.noreply.github.com> Date: Tue, 18 Feb 2025 16:30:31 +0700 Subject: [PATCH 13/32] Update utils/tools.ts Co-authored-by: Zied Guesmi <26070035+zguesmi@users.noreply.github.com> --- utils/tools.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/tools.ts b/utils/tools.ts index 8706466ea..71b83cff4 100644 --- a/utils/tools.ts +++ b/utils/tools.ts @@ -11,7 +11,7 @@ export function compactSignature(signature: string): string { if (split.yParity === 1) { vs[0] |= 0x80; } - return ethers.hexlify(ethers.concat([split.r, vs])); + return ethers.toBeHex(ethers.concat([split.r, vs])); } export function BN2Address(bignumber: BigNumberish) { From 863ca18b6b312bca079565233a11ed2343187663 Mon Sep 17 00:00:00 2001 From: Robin Le Caignec <72495599+Le-Caignec@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:13:02 +0700 Subject: [PATCH 14/32] Update utils/tools.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémy (James) Toussaint <33313130+jeremyjams@users.noreply.github.com> --- utils/tools.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/utils/tools.ts b/utils/tools.ts index 71b83cff4..4dc7414ae 100644 --- a/utils/tools.ts +++ b/utils/tools.ts @@ -5,10 +5,7 @@ import { toBeHex, type BigNumberish } from 'ethers'; import { ethers } from 'hardhat'; export function compactSignature(signature: string): string { - const split = ethers.Signature.from(signature); - let vs = ethers.getBytes(split.s); - // Check if we need to set the high bit - if (split.yParity === 1) { + return Signature.from(signature).compactSerialized; vs[0] |= 0x80; } return ethers.toBeHex(ethers.concat([split.r, vs])); From 264b87aa6a0a4d7a7ef89305caced71e66212cb5 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 13:16:30 +0100 Subject: [PATCH 15/32] fix compactSignature --- utils/tools.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/utils/tools.ts b/utils/tools.ts index 4dc7414ae..0e17a3184 100644 --- a/utils/tools.ts +++ b/utils/tools.ts @@ -1,14 +1,11 @@ // SPDX-FileCopyrightText: 2020-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { toBeHex, type BigNumberish } from 'ethers'; +import { Signature, toBeHex, type BigNumberish } from 'ethers'; import { ethers } from 'hardhat'; export function compactSignature(signature: string): string { return Signature.from(signature).compactSerialized; - vs[0] |= 0x80; - } - return ethers.toBeHex(ethers.concat([split.r, vs])); } export function BN2Address(bignumber: BigNumberish) { From bf68e03c516bfd3a43fc02cb2bfbc509f5e40615 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 13:37:17 +0100 Subject: [PATCH 16/32] refactor: rename BN2Address to bigintToAddress and update parameter type --- utils/tools.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/tools.ts b/utils/tools.ts index 0e17a3184..495873357 100644 --- a/utils/tools.ts +++ b/utils/tools.ts @@ -1,13 +1,13 @@ // SPDX-FileCopyrightText: 2020-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { Signature, toBeHex, type BigNumberish } from 'ethers'; +import { Signature } from 'ethers'; import { ethers } from 'hardhat'; export function compactSignature(signature: string): string { return Signature.from(signature).compactSerialized; } -export function BN2Address(bignumber: BigNumberish) { - return ethers.getAddress(toBeHex(bignumber)); +export function bigintToAddress(bigint: bigint) { + return ethers.getAddress(ethers.toBeHex(bigint)); } From 937b143ae1af8c4586e7628b060e545b78b377d9 Mon Sep 17 00:00:00 2001 From: Robin Le Caignec <72495599+Le-Caignec@users.noreply.github.com> Date: Tue, 18 Feb 2025 21:17:22 +0700 Subject: [PATCH 17/32] Update test/byContract/IexecPoco/IexecPoco2-finalize.test.ts Co-authored-by: Zied Guesmi <26070035+zguesmi@users.noreply.github.com> --- test/byContract/IexecPoco/IexecPoco2-finalize.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index 295a2b35e..b182f5a03 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -519,7 +519,6 @@ describe('IexecPoco2#finalize', async () => { (await iexecPoco.viewTask(kittyFillingDeal.taskId)).finalDeadline, ); const tx = iexecPoco.claim(kittyFillingDeal.taskId); - await expect(tx).to.changeTokenBalances( iexecPoco, [iexecPoco, kittyAddress], From 5359f018a4843765e6a5dc9d40b60892f373681b Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 15:18:27 +0100 Subject: [PATCH 18/32] fix: replace iexecPocoAddress with proxyAddress in event assertions --- .../IexecPoco2-contribute-and-finalize.test.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts index a48f5bc39..e86b5929d 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts @@ -190,28 +190,27 @@ describe('IexecPoco2#contributeAndFinalize', () => { ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); // Check events. - const iexecPocoAddress = await iexecPoco.getAddress(); await expect(contributeAndFinalizeTx) .to.emit(iexecPoco, 'Seize') .withArgs(requester.address, taskPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, appProvider.address, appPrice) + .withArgs(proxyAddress, appProvider.address, appPrice) .to.emit(iexecPoco, 'Reward') .withArgs(appProvider.address, appPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, datasetProvider.address, datasetPrice) + .withArgs(proxyAddress, datasetProvider.address, datasetPrice) .to.emit(iexecPoco, 'Reward') .withArgs(datasetProvider.address, datasetPrice, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, scheduler.address, schedulerStake) + .withArgs(proxyAddress, scheduler.address, schedulerStake) .to.emit(iexecPoco, 'Unlock') .withArgs(scheduler.address, schedulerStake) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, worker.address, workersReward) + .withArgs(proxyAddress, worker.address, workersReward) .to.emit(iexecPoco, 'Reward') .withArgs(worker.address, workersReward, taskId) .to.emit(iexecPoco, 'Transfer') - .withArgs(iexecPocoAddress, scheduler.address, schedulerReward) + .withArgs(proxyAddress, scheduler.address, schedulerReward) .to.emit(iexecPoco, 'Reward') .withArgs(scheduler.address, schedulerReward, taskId); // Task events. From 0e7c668fdd79b148b4304b60d22d55b9187c87bc Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 15:49:47 +0100 Subject: [PATCH 19/32] fix: remove unused proxyAddress retrieval in IexecPoco2 finalize test --- test/byContract/IexecPoco/IexecPoco2-finalize.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index b182f5a03..2ca614180 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -577,7 +577,6 @@ describe('IexecPoco2#finalize', async () => { .connect(worker1) .reveal(taskId, resultDigest) .then((tx) => tx.wait()); - const proxyAddress = await iexecPoco.getAddress(); const txFinalize = iexecPocoAsScheduler.finalize(taskId, results, '0x'); await expect(txFinalize).to.changeTokenBalances( From 671cd4e8e362bb740b5f3f9f1069f4a7ff8cd96e Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 15:55:41 +0100 Subject: [PATCH 20/32] refactor: remove unused erc1271Mock variable and streamline contract address retrieval --- test/byContract/IexecPoco/IexecPoco1.test.ts | 8 +++----- test/byContract/IexecPoco/IexecPoco2-claim.test.ts | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index 4db53c365..8b5456dda 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -7,7 +7,6 @@ import { expect } from 'chai'; import { Contract, ContractTransactionResponse, Wallet, ZeroAddress, ZeroHash } from 'ethers'; import { ethers } from 'hardhat'; import { - ERC1271Mock, ERC1271Mock__factory, IERC721__factory, IexecInterfaceNative, @@ -83,7 +82,6 @@ describe('IexecPoco1', () => { let orders: IexecOrders; let [randomAddress, randomSignature]: string[] = []; let randomContractAddress: string; - let erc1271MockContract: ERC1271Mock; let erc1271MockContractAddress: string; let orderManagement: { [key: string]: { @@ -146,11 +144,11 @@ describe('IexecPoco1', () => { .deploy() .then((contract) => contract.waitForDeployment()) .then((deployedContract) => deployedContract.getAddress()); - erc1271MockContract = await new ERC1271Mock__factory() + erc1271MockContractAddress = await new ERC1271Mock__factory() .connect(anyone) .deploy() - .then((contract) => contract.waitForDeployment()); - erc1271MockContractAddress = await erc1271MockContract.getAddress(); + .then((contract) => contract.waitForDeployment()) + .then((deployedContract) => deployedContract.getAddress()); } describe('Verify signature', () => { diff --git a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts index 694f41e70..afa5cee0b 100644 --- a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts @@ -53,7 +53,6 @@ describe('IexecPoco2#claim', async () => { ({ appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets()); await iexecWrapper.setTeeBroker('0x0000000000000000000000000000000000000000'); iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, iexecAdmin); - proxyAddress = await iexecPoco.getAddress(); iexecPocoAsAnyone = iexecPoco.connect(anyone); ordersAssets = { app: appAddress, From f9bc1f0462fc6af1ae349e59d7649f5f56faba90 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 16:11:06 +0100 Subject: [PATCH 21/32] fix: update comment to reflect correct ethers function for volume conversion --- test/byContract/IexecPoco/IexecPoco1.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index 8b5456dda..e52b18bcf 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -949,7 +949,7 @@ describe('IexecPoco1', () => { // await setStorageAt( // iexecPoco.address, // appOrderConsumedSlotIndex, - // ethers.hexlify(Number(orders.app.volume)), + // ethers.toBeHex(orders.app.volume), // ); await depositForRequesterAndSchedulerWithDefaultPrices(botVolume); await signOrders(iexecWrapper.getDomain(), orders, ordersActors); From 93b5b235bc08b99830afa37650360cb9a63302ae Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Tue, 18 Feb 2025 18:21:21 +0100 Subject: [PATCH 22/32] migrate Number to BigInt --- test/000_fullchain-boost.test.ts | 52 ++++---- test/000_fullchain.test.ts | 118 +++++++++--------- test/200_fullchain-bot.test.ts | 50 ++++---- test/201_fullchain-multi-orders.test.ts | 45 +++---- test/300_fullchain-reopen.test.ts | 28 ++--- .../IexecAccessors/IexecAccessors.test.ts | 30 ++--- test/byContract/IexecPoco/IexecPoco1.test.ts | 52 ++++---- .../IexecPoco/IexecPoco2-claim.test.ts | 32 +++-- ...IexecPoco2-contribute-and-finalize.test.ts | 20 +-- .../IexecPoco/IexecPoco2-contribute.test.ts | 18 +-- .../IexecPoco/IexecPoco2-finalize.test.ts | 99 ++++++--------- .../IexecPoco/IexecPoco2-initialize.test.ts | 21 ++-- .../IexecPoco/IexecPoco2-reopen.test.ts | 10 +- .../IexecPoco/IexecPoco2-reveal.test.ts | 16 +-- test/utils/IexecWrapper.ts | 106 ++++++++-------- utils/createOrders.ts | 8 +- utils/poco-tools.ts | 4 +- utils/tools.ts | 8 ++ 18 files changed, 342 insertions(+), 375 deletions(-) diff --git a/test/000_fullchain-boost.test.ts b/test/000_fullchain-boost.test.ts index 991a43c76..bebc0a50b 100644 --- a/test/000_fullchain-boost.test.ts +++ b/test/000_fullchain-boost.test.ts @@ -39,12 +39,12 @@ import { IexecWrapper } from './utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from './utils/hardhat-fixture-deployer'; const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; -const taskIndex = 0; -const volume = taskIndex + 1; +const taskIndex = 0n; +const volume = taskIndex + 1n; const { results, resultDigest } = buildUtf8ResultAndDigest('result'); -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; describe('IexecPocoBoostDelegate (IT)', function () { let domain: TypedDataDomain; @@ -146,7 +146,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { } = orders.toObject(); const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * // task price - 1; // volume + 1n; // volume expect(await iexecInstance.balanceOf(proxyAddress)).to.be.equal(0); await iexecWrapper.depositInIexecAccount(requester, dealPrice); expect(await iexecInstance.balanceOf(requester.address)).to.be.equal(dealPrice); @@ -203,14 +203,12 @@ describe('IexecPocoBoostDelegate (IT)', function () { expect(deal.workerpoolOwner).to.be.equal(scheduler.address); expect(deal.workerpoolPrice).to.be.equal(workerpoolPrice); expect(deal.requester).to.be.equal(requester.address); - const schedulerRewardRatio = Number( - await WorkerpoolInterface__factory.connect( - workerpoolAddress, - anyone, - ).m_schedulerRewardRatioPolicy(), - ); + const schedulerRewardRatio = await WorkerpoolInterface__factory.connect( + workerpoolAddress, + anyone, + ).m_schedulerRewardRatioPolicy(); expect(deal.workerReward) - .to.be.equal((workerpoolPrice * (100 - schedulerRewardRatio)) / 100) + .to.be.equal((workerpoolPrice * (100n - schedulerRewardRatio)) / 100n) .to.be.greaterThan(0); expect(deal.deadline).to.be.equal(startTime + 7 * 300); // Category 0 expect(deal.botFirst).to.be.equal(0); @@ -302,7 +300,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * // task price - 1; // volume + 1n; // volume expect(await iexecInstance.balanceOf(proxyAddress)).to.be.equal(0); expect(await iexecInstance.balanceOf(requester.address)).to.be.equal(0); expect(await iexecInstance.frozenOf(requester.address)).to.be.equal(0); @@ -370,14 +368,12 @@ describe('IexecPocoBoostDelegate (IT)', function () { expect(deal.workerpoolPrice).to.be.equal(workerpoolPrice); expect(deal.requester).to.be.equal(requester.address); expect(deal.sponsor).to.be.equal(sponsor.address); - const schedulerRewardRatio = Number( - await WorkerpoolInterface__factory.connect( - workerpoolAddress, - anyone, - ).m_schedulerRewardRatioPolicy(), - ); + const schedulerRewardRatio = await WorkerpoolInterface__factory.connect( + workerpoolAddress, + anyone, + ).m_schedulerRewardRatioPolicy(); expect(deal.workerReward) - .to.be.equal((workerpoolPrice * (100 - schedulerRewardRatio)) / 100) + .to.be.equal((workerpoolPrice * (100n - schedulerRewardRatio)) / 100n) .to.be.greaterThan(0); expect(deal.deadline).to.be.equal(startTime + 7 * 300); // Category 0 expect(deal.botFirst).to.be.equal(0); @@ -454,7 +450,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { }); it('Should push result (TEE with contribution authorization signed by scheduler)', async function () { - const volume = 3; + const volume = 3n; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -503,7 +499,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { expect(await iexecInstance.balanceOf(datasetProvider.address)).to.be.equal(0); expect(await iexecInstance.balanceOf(scheduler.address)).to.be.equal(0); expect(await iexecInstance.frozenOf(scheduler.address)).to.be.equal(schedulerDealStake); - const expectedWorkerReward = Number((await viewDealBoost(dealId)).workerReward); + const expectedWorkerReward = (await viewDealBoost(dealId)).workerReward; const schedulerBaseReward = workerpoolPrice - expectedWorkerReward; await expect( @@ -543,7 +539,7 @@ describe('IexecPocoBoostDelegate (IT)', function () { .withArgs(scheduler.address, schedulerBaseReward, taskId) .to.emit(iexecPocoBoostInstance, 'ResultPushedBoost') .withArgs(dealId, taskIndex, results); - const remainingTasksToPush = volume - 1; + const remainingTasksToPush = volume - 1n; expect(await iexecInstance.balanceOf(proxyAddress)).to.be.equal( (taskPrice + schedulerTaskStake) * remainingTasksToPush, ); @@ -611,8 +607,8 @@ describe('IexecPocoBoostDelegate (IT)', function () { describe('Claim', function () { it('Should refund requester on claim of non sponsored deal (TEE)', async function () { - const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice - const claimedTasks = 1; + const expectedVolume = 3n; // > 1 to explicit taskPrice vs dealPrice + const claimedTasks = 1n; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * expectedVolume; const orders = buildOrders({ @@ -693,8 +689,8 @@ describe('IexecPocoBoostDelegate (IT)', function () { }); it('Should refund sponsor on claim of a sponsored deal (TEE)', async function () { - const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice - const claimedTasks = 1; + const expectedVolume = 3n; // > 1 to explicit taskPrice vs dealPrice + const claimedTasks = 1n; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const dealPrice = taskPrice * expectedVolume; const orders = buildOrders({ diff --git a/test/000_fullchain.test.ts b/test/000_fullchain.test.ts index f3a6e583f..c48c72c1f 100644 --- a/test/000_fullchain.test.ts +++ b/test/000_fullchain.test.ts @@ -31,9 +31,9 @@ import { loadHardhatFixtureDeployment } from './utils/hardhat-fixture-deployer'; const standardDealTag = '0x0000000000000000000000000000000000000000000000000000000000000000'; const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const callbackAddress = ethers.Wallet.createRandom().address; const { results, resultDigest } = buildUtf8ResultAndDigest('result'); const { resultsCallback, callbackResultDigest } = buildResultCallbackAndDigest(123); @@ -106,7 +106,7 @@ describe('Integration tests', function () { } it('[1] Sponsorship, beneficiary, callback, BoT, replication', async function () { - const volume = 3; + const volume = 3n; // Create deal. const workers = [worker1, worker2]; const orders = buildOrders({ @@ -135,9 +135,9 @@ describe('Integration tests', function () { const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); const workerStakePerTask = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); // Finalize each task and check balance changes. - for (let taskIndex = 0; taskIndex < volume; taskIndex++) { + for (let taskIndex = 0n; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); for (const worker of workers) { await iexecWrapper.contributeToTask( @@ -163,10 +163,10 @@ describe('Integration tests', function () { const expectedProxyBalanceChange = -( taskPrice + schedulerStakePerTask + - workerStakePerTask * workers.length + workerStakePerTask * BigInt(workers.length) ); const expectedWinningWorkerBalanceChange = - workerStakePerTask + workersRewardPerTask / workers.length; + workerStakePerTask + workersRewardPerTask / BigInt(workers.length); await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -182,22 +182,22 @@ describe('Integration tests', function () { ); // Multiply amount by the number of finalized tasks to correctly compute // stake and reward amounts. - const completedTasks = taskIndex + 1; + const completedTasks = taskIndex + 1n; // Calculate expected frozen changes const expectedFrozenChanges = [ -taskPrice * completedTasks, // Sponsor - 0, // Requester + 0n, // Requester -schedulerStakePerTask * completedTasks, // Scheduler - 0, // AppProvider - 0, // DatasetProvider, - ...workers.map(() => 0), // Add 0 for each worker + 0n, // AppProvider + 0n, // DatasetProvider, + ...workers.map(() => 0n), // Add 0 for each worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); it('[2] No sponsorship, beneficiary, callback, BoT, replication', async function () { - const volume = 3; + const volume = 3n; // Create deal. const workers = [worker1, worker2]; const orders = buildOrders({ @@ -227,8 +227,8 @@ describe('Integration tests', function () { // Finalize each task and check balance changes. const workerStakePerTask = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); - for (let taskIndex = 0; taskIndex < volume; taskIndex++) { + .then((deal) => deal.workerStake); + for (let taskIndex = 0n; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); for (const worker of workers) { await iexecWrapper.contributeToTask( @@ -254,10 +254,10 @@ describe('Integration tests', function () { const expectedProxyBalanceChange = -( taskPrice + schedulerStakePerTask + - workerStakePerTask * workers.length + workerStakePerTask * BigInt(workers.length) ); const expectedWinningWorkerBalanceChange = - workerStakePerTask + workersRewardPerTask / workers.length; + workerStakePerTask + workersRewardPerTask / BigInt(workers.length); await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -272,21 +272,21 @@ describe('Integration tests', function () { ); // Multiply amount by the number of finalized tasks to correctly compute // stake and reward amounts. - const completedTasks = taskIndex + 1; + const completedTasks = taskIndex + 1n; // Calculate expected frozen changes const expectedFrozenChanges = [ -taskPrice * completedTasks, // Requester -schedulerStakePerTask * completedTasks, // Scheduler - 0, // AppProvider - 0, // DatasetProvider - ...workers.map(() => 0), // Add 0 for each worker + 0n, // AppProvider + 0n, // DatasetProvider + ...workers.map(() => 0n), // Add 0 for each worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); it('[3] Sponsorship, beneficiary, callback, BoT, no replication', async function () { - const volume = 3; + const volume = 3n; // Create deal. const orders = buildOrders({ assets: ordersAssets, @@ -312,7 +312,7 @@ describe('Integration tests', function () { const accounts = [sponsor, requester, scheduler, appProvider, datasetProvider, worker1]; const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); // Finalize each task and check balance changes. - for (let taskIndex = 0; taskIndex < volume; taskIndex++) { + for (let taskIndex = 0n; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); const { workerStakePerTask } = await iexecWrapper.contributeToTeeTask( dealId, @@ -349,22 +349,22 @@ describe('Integration tests', function () { ); // Multiply amount by the number of finalized tasks to correctly compute // stake and reward amounts. - const completedTasks = taskIndex + 1; + const completedTasks = taskIndex + 1n; // Calculate expected frozen changes const expectedFrozenChanges = [ -taskPrice * completedTasks, // Sponsor - 0, // Requester + 0n, // Requester -schedulerStakePerTask * completedTasks, // Scheduler - 0, // AppProvider - 0, // DatasetProvider - 0, // Worker + 0n, // AppProvider + 0n, // DatasetProvider + 0n, // Worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); it('[4] No sponsorship, beneficiary, callback, BoT, no replication', async function () { - const volume = 3; + const volume = 3n; // Create deal. const orders = buildOrders({ assets: ordersAssets, @@ -390,7 +390,7 @@ describe('Integration tests', function () { const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); // Finalize each task and check balance changes. - for (let taskIndex = 0; taskIndex < volume; taskIndex++) { + for (let taskIndex = 0n; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); const { workerStakePerTask } = await iexecWrapper.contributeToTeeTask( dealId, @@ -428,21 +428,21 @@ describe('Integration tests', function () { ); // Multiply amount by the number of finalized tasks to correctly compute // stake and reward amounts. - const completedTasks = taskIndex + 1; + const completedTasks = taskIndex + 1n; // Calculate expected frozen changes const expectedFrozenChanges = [ -taskPrice * completedTasks, // Requester -schedulerStakePerTask * completedTasks, // Scheduler - 0, // AppProvider - 0, // DatasetProvider - 0, // Worker + 0n, // AppProvider + 0n, // DatasetProvider + 0n, // Worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } }); it('[5] No sponsorship, no beneficiary, no callback, no BoT, no replication', async function () { - const volume = 1; + const volume = 1n; // Create deal. const orders = buildOrders({ assets: ordersAssets, @@ -464,7 +464,7 @@ describe('Integration tests', function () { // Save frozens const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; const accountsInitialFrozens = await iexecWrapper.getInitialFrozens(accounts); - const taskIndex = 0; + const taskIndex = 0n; const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); const { workerStakePerTask } = await iexecWrapper.contributeToTeeTask( dealId, @@ -501,9 +501,9 @@ describe('Integration tests', function () { const expectedFrozenChanges = [ -dealPrice, // Requester -schedulerStakePerTask, // Scheduler - 0, // AppProvider - 0, // DatasetProvider - 0, // Worker + 0n, // AppProvider + 0n, // DatasetProvider + 0n, // Worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); }); @@ -511,7 +511,7 @@ describe('Integration tests', function () { describe('Integration tests array of worker', function () { for (let workerNumber = 2; workerNumber < 6; workerNumber++) { it(`[6.${workerNumber - 1}] No sponsorship, no beneficiary, no callback, no BoT, up to ${workerNumber} workers`, async function () { - const volume = 1; + const volume = 1n; const allWorkers = [worker1, worker2, worker3, worker4, worker5]; const workers = allWorkers.slice(0, workerNumber); const accounts = [requester, scheduler, appProvider, datasetProvider, ...workers]; @@ -538,14 +538,14 @@ describe('Integration tests', function () { for (let i = 0; i < workerNumber; i++) { expect(await iexecPoco.viewScore(workers[i].address)).to.be.equal(0); } - const taskId = await iexecWrapper.initializeTask(dealId, 0); + const taskId = await iexecWrapper.initializeTask(dealId, 0n); // Finalize each task and check balance changes. const workerStakePerTask = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); for (let i = 0; i < workerNumber; i++) { - await iexecWrapper.contributeToTask(dealId, 0, resultDigest, workers[i]); + await iexecWrapper.contributeToTask(dealId, 0n, resultDigest, workers[i]); } for (let i = 0; i < workerNumber; i++) { await iexecPoco @@ -560,10 +560,10 @@ describe('Integration tests', function () { const expectedProxyBalanceChange = -( dealPrice + schedulerStakePerTask + - workerStakePerTask * workers.length + workerStakePerTask * BigInt(workers.length) ); const expectedWinningWorkerBalanceChange = - workerStakePerTask + workersRewardPerTask / workerNumber; + workerStakePerTask + workersRewardPerTask / BigInt(workerNumber); await expect(finalizeTx).to.changeTokenBalances( iexecPoco, [proxyAddress, ...accounts], @@ -582,9 +582,9 @@ describe('Integration tests', function () { const expectedFrozenChanges = [ -taskPrice, -schedulerStakePerTask, - 0, - 0, - ...workers.map(() => 0), + 0n, + 0n, + ...workers.map(() => 0n), ]; await iexecWrapper.checkFrozenChanges( accountsInitialFrozens, @@ -600,7 +600,7 @@ describe('Integration tests', function () { }); it('[7] No sponsorship, no beneficiary, no callback, no BoT, up to 5 workers with 1 bad worker', async function () { - const volume = 1; + const volume = 1n; const allWorkers = [worker1, worker2, worker3, worker4, worker5]; const { resultDigest: badResultDigest } = buildUtf8ResultAndDigest('bad-result'); const losingWorker = worker1; @@ -636,15 +636,15 @@ describe('Integration tests', function () { for (const contributor of contributions) { expect(await iexecPoco.viewScore(contributor.signer.address)).to.be.equal(0); } - const taskId = await iexecWrapper.initializeTask(dealId, 0); + const taskId = await iexecWrapper.initializeTask(dealId, 0n); // Finalize task and check balance changes. const workerStakePerTask = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); for (const contributor of contributions) { await iexecWrapper.contributeToTask( dealId, - 0, + 0n, contributor.resultDigest, contributor.signer, ); @@ -662,21 +662,21 @@ describe('Integration tests', function () { const finalizeTx = await iexecPoco.connect(scheduler).finalize(taskId, results, '0x'); await finalizeTx.wait(); - const totalWorkerPoolReward = workerpoolPrice + workerStakePerTask * 1; // bad wrokers lose their stake and add it to the pool price + const totalWorkerPoolReward = workerpoolPrice + workerStakePerTask * 1n; // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task const workersRewardPerTask = await iexecWrapper.computeWorkersRewardForCurrentTask( totalWorkerPoolReward, dealId, ); const expectedWinningWorkerBalanceChange = - workerStakePerTask + workersRewardPerTask / winningWorkers.length; + workerStakePerTask + workersRewardPerTask / BigInt(winningWorkers.length); // compute expected scheduler reward for current task const schedulerRewardPerTask = totalWorkerPoolReward - workersRewardPerTask; const expectedSchedulerBalanceChange = schedulerStakePerTask + schedulerRewardPerTask; const expectedProxyBalanceChange = -( dealPrice + - workerStakePerTask * allWorkers.length + + workerStakePerTask * BigInt(allWorkers.length) + schedulerStakePerTask ); await expect(finalizeTx).to.changeTokenBalances( @@ -704,9 +704,9 @@ describe('Integration tests', function () { const expectedFrozenChanges = [ -dealPrice, -schedulerStakePerTask, - 0, - 0, - ...allWorkers.map(() => 0), + 0n, + 0n, + ...allWorkers.map(() => 0n), ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); }); diff --git a/test/200_fullchain-bot.test.ts b/test/200_fullchain-bot.test.ts index d4cdb76fd..fec2268cf 100644 --- a/test/200_fullchain-bot.test.ts +++ b/test/200_fullchain-bot.test.ts @@ -11,9 +11,9 @@ import { IexecWrapper } from './utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from './utils/hardhat-fixture-deployer'; const standardDealTag = '0x0000000000000000000000000000000000000000000000000000000000000000'; -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; let proxyAddress: string; let iexecPoco: IexecInterfaceNative; @@ -81,7 +81,7 @@ describe('Integration tests', function () { it('Task Lifecycle with BoT Replication and Error Handling', async function () { const workers = [worker1, worker2, worker3, worker4, worker5]; // Create deal. - const volume = 3; + const volume = 3n; const tasksAndWorkers: { [key: number]: { worker: SignerWithAddress; @@ -128,11 +128,11 @@ describe('Integration tests', function () { // Finalize each task and check balance changes. const workerStakePerTask = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); - for (let taskIndex = 0; taskIndex < volume; taskIndex++) { + .then((deal) => deal.workerStake); + for (let taskIndex = 0n; taskIndex < volume; taskIndex++) { const taskId = await iexecWrapper.initializeTask(dealId, taskIndex); const initialScores = await getInitialScores(workers); - const contributions = tasksAndWorkers[taskIndex]; + const contributions = tasksAndWorkers[Number(taskIndex)]; for (const contribution of contributions) { const { worker, useEnclave, result } = contribution; const { resultDigest } = buildUtf8ResultAndDigest(result); @@ -154,7 +154,9 @@ describe('Integration tests', function () { .then((tx) => tx.wait()); } } - const { results } = buildUtf8ResultAndDigest(tasksAndWorkers[taskIndex][0].result); + const { results } = buildUtf8ResultAndDigest( + tasksAndWorkers[Number(taskIndex)][0].result, + ); const finalizeTx = await iexecPoco.connect(scheduler).finalize(taskId, results, '0x'); await finalizeTx.wait(); expect((await iexecPoco.viewTask(taskId)).status).to.equal(TaskStatusEnum.COMPLETED); @@ -176,21 +178,21 @@ describe('Integration tests', function () { (worker) => !nonParticipantWorkers.includes(worker), ); const totalWorkerPoolReward = - workerpoolPrice + workerStakePerTask * loosingWorkers.length; // bad wrokers lose their stake and add it to the pool price + workerpoolPrice + workerStakePerTask * BigInt(loosingWorkers.length); // bad wrokers lose their stake and add it to the pool price // compute expected worker reward for current task const workersRewardPerTask = await iexecWrapper.computeWorkersRewardForCurrentTask( totalWorkerPoolReward, dealId, ); const expectedWinningWorkerBalanceChange = - workerStakePerTask + workersRewardPerTask / winningWorkers.length; + workerStakePerTask + workersRewardPerTask / BigInt(winningWorkers.length); // compute expected scheduler reward for current task const schedulerRewardPerTask = totalWorkerPoolReward - workersRewardPerTask; const expectedSchedulerBalanceChange = schedulerStakePerTask + schedulerRewardPerTask; const expectedProxyBalanceChange = -( taskPrice + - workerStakePerTask * participantWorkers.length + + workerStakePerTask * BigInt(participantWorkers.length) + schedulerStakePerTask ); @@ -216,14 +218,14 @@ describe('Integration tests', function () { ); // Multiply amount by the number of finalized tasks to correctly compute // stake and reward amounts. - const completedTasks = taskIndex + 1; + const completedTasks = taskIndex + 1n; // Calculate expected frozen changes const expectedFrozenChanges = [ -taskPrice * completedTasks, // Requester -schedulerStakePerTask * completedTasks, // Scheduler - 0, // AppProvider - 0, // DatasetProvider - ...workers.map(() => 0), // Add 0 for each worker + 0n, // AppProvider + 0n, // DatasetProvider + ...workers.map(() => 0n), // Add 0 for each worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); await validateScores( @@ -237,35 +239,35 @@ describe('Integration tests', function () { async function getInitialScores( workers: SignerWithAddress[], - ): Promise<{ [address: string]: number }> { - const scores: { [address: string]: number } = {}; + ): Promise<{ [address: string]: bigint }> { + const scores: { [address: string]: bigint } = {}; for (const worker of workers) { - scores[worker.address] = Number(await iexecPoco.viewScore(worker.address)); + scores[worker.address] = await iexecPoco.viewScore(worker.address); } return scores; } }); async function validateScores( - initialScores: { [address: string]: number }, + initialScores: { [address: string]: bigint }, winningWorkers: SignerWithAddress[], loosingWorkers: SignerWithAddress[], nonParticipantWorkers: SignerWithAddress[], ) { for (const winningWorker of winningWorkers) { - const currentScore = Number(await iexecPoco.viewScore(winningWorker.address)); + const currentScore = await iexecPoco.viewScore(winningWorker.address); expect(currentScore, `Worker ${winningWorker.address} score mismatch`).to.equal( - initialScores[winningWorker.address] + 1, + initialScores[winningWorker.address] + 1n, ); } for (const loosingWorker of loosingWorkers) { - const currentScore = Number(await iexecPoco.viewScore(loosingWorker.address)); + const currentScore = await iexecPoco.viewScore(loosingWorker.address); expect(currentScore, `Worker ${loosingWorker.address} score mismatch`).to.equal( - initialScores[loosingWorker.address] - 1, + initialScores[loosingWorker.address] - 1n, ); } for (const nonParticipantWorker of nonParticipantWorkers) { - const currentScore = Number(await iexecPoco.viewScore(nonParticipantWorker.address)); + const currentScore = await iexecPoco.viewScore(nonParticipantWorker.address); expect(currentScore, `Worker ${nonParticipantWorker.address} score mismatch`).to.equal( initialScores[nonParticipantWorker.address], ); diff --git a/test/201_fullchain-multi-orders.test.ts b/test/201_fullchain-multi-orders.test.ts index 63b1ff150..12a1fb3e8 100644 --- a/test/201_fullchain-multi-orders.test.ts +++ b/test/201_fullchain-multi-orders.test.ts @@ -24,14 +24,15 @@ import { buildUtf8ResultAndDigest, getIexecAccounts, } from '../utils/poco-tools'; +import { maxBigInt, minBigInt } from '../utils/tools'; import { IexecWrapper } from './utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from './utils/hardhat-fixture-deployer'; const standardDealTag = '0x0000000000000000000000000000000000000000000000000000000000000000'; -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice1 = 1_000_000_015; -const workerpoolPrice2 = 1_000_000_025; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice1 = 1_000_000_015n; +const workerpoolPrice2 = 1_000_000_025n; const { results, resultDigest } = buildUtf8ResultAndDigest('result'); let proxyAddress: string; @@ -73,7 +74,7 @@ describe('Integration tests', function () { ordersPrices = { app: appPrice, dataset: datasetPrice, - workerpool: 0, // Overridden below. + workerpool: 0n, // Overridden below. }; } @@ -82,11 +83,11 @@ describe('Integration tests', function () { * for the same workerpool and only 1 request order. */ it('[1] No sponsorship, no beneficiary, no callback, BoT, no replication, 2 workerpool orders', async function () { - const volume = 3; - const workerpoolOrderVolume1 = 2; - const workerpoolOrderVolume2 = 10; - const dealVolume1 = Math.min(workerpoolOrderVolume1, volume); // min(2, 3); - const dealVolume2 = Math.min(workerpoolOrderVolume2, volume - dealVolume1); // min(10, 1) + const volume = 3n; + const workerpoolOrderVolume1 = 2n; + const workerpoolOrderVolume2 = 10n; + const dealVolume1 = minBigInt(workerpoolOrderVolume1, volume); // min(2, 3); + const dealVolume2 = minBigInt(workerpoolOrderVolume2, volume - dealVolume1); // min(10, 1) const taskPrice1 = appPrice + datasetPrice + workerpoolPrice1; const taskPrice2 = appPrice + datasetPrice + workerpoolPrice2; // Create default orders. @@ -109,7 +110,7 @@ describe('Integration tests', function () { workerpoolOrder1.workerpoolprice = workerpoolPrice1; workerpoolOrder2.volume = workerpoolOrderVolume2; workerpoolOrder2.workerpoolprice = workerpoolPrice2; - requestOrder.workerpoolmaxprice = Math.max(workerpoolPrice1, workerpoolPrice2); + requestOrder.workerpoolmaxprice = maxBigInt(workerpoolPrice1, workerpoolPrice2); // Match both workerpool orders with the same request order. const dealOrders1 = new IexecOrders( appOrder, @@ -167,7 +168,7 @@ describe('Integration tests', function () { // Finalize each task and run checks. await runTaskThenCheckBalancesAndVolumes( dealId1, - Number(taskIndex1), + taskIndex1, taskPrice1, schedulerStakePerTaskOfDeal1, schedulerRewardPerTaskOfDeal1, @@ -175,7 +176,7 @@ describe('Integration tests', function () { ); await runTaskThenCheckBalancesAndVolumes( dealId1, - Number(taskIndex1) + 1, + taskIndex1 + 1n, taskPrice1, schedulerStakePerTaskOfDeal1, schedulerRewardPerTaskOfDeal1, @@ -183,7 +184,7 @@ describe('Integration tests', function () { ); await runTaskThenCheckBalancesAndVolumes( dealId2, - Number(taskIndex2), + taskIndex2, taskPrice2, schedulerStakePerTaskOfDeal2, schedulerRewardPerTaskOfDeal2, @@ -201,11 +202,11 @@ describe('Integration tests', function () { async function runTaskThenCheckBalancesAndVolumes( dealId: string, - taskIndex: number, - taskPrice: number, - schedulerStake: number, - schedulerReward: number, - workerReward: number, + taskIndex: bigint, + taskPrice: bigint, + schedulerStake: bigint, + schedulerReward: bigint, + workerReward: bigint, ) { // Save frozens before task execution. const accounts = [requester, scheduler, appProvider, datasetProvider, worker1]; @@ -246,9 +247,9 @@ describe('Integration tests', function () { const expectedFrozenChanges = [ -taskPrice, // Requester -schedulerStake, // Scheduler - 0, // AppProvider - 0, // DatasetProvider - 0, // Worker + 0n, // AppProvider + 0n, // DatasetProvider + 0n, // Worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); } diff --git a/test/300_fullchain-reopen.test.ts b/test/300_fullchain-reopen.test.ts index 4babbaa77..0ea76dced 100644 --- a/test/300_fullchain-reopen.test.ts +++ b/test/300_fullchain-reopen.test.ts @@ -20,9 +20,9 @@ import { import { IexecWrapper } from './utils/IexecWrapper'; const standardDealTag = '0x0000000000000000000000000000000000000000000000000000000000000000'; -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const { results, resultDigest } = buildUtf8ResultAndDigest('result'); let proxyAddress: string; @@ -101,7 +101,7 @@ describe('Integration tests', function () { * - Verify that winning workers receive a positive score, while losing workers do not. */ it(`[1] Task lifecycle with contributions and reopening`, async function () { - const volume = 1; + const volume = 1n; const workers = [worker1, worker2, worker3, worker4]; const firstContributors = workers.slice(0, 2); const secondContributors = workers.slice(2, 4); @@ -126,12 +126,12 @@ describe('Integration tests', function () { for (const worker of workers) { expect(await iexecPoco.viewScore(worker.address)).to.be.equal(0); } - const taskId = await iexecWrapper.initializeTask(dealId, 0); + const taskId = await iexecWrapper.initializeTask(dealId, 0n); const workerStakePerTask = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); for (const contributor of firstContributors) { - await iexecWrapper.contributeToTask(dealId, 0, resultDigest, contributor); + await iexecWrapper.contributeToTask(dealId, 0n, resultDigest, contributor); } const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.REVEALING); @@ -170,7 +170,7 @@ describe('Integration tests', function () { } // Contribute and reveal with new workers. for (const contributor of secondContributors) { - await iexecWrapper.contributeToTask(dealId, 0, resultDigest, contributor); + await iexecWrapper.contributeToTask(dealId, 0n, resultDigest, contributor); } for (const contributor of secondContributors) { await iexecPoco @@ -182,20 +182,20 @@ describe('Integration tests', function () { await finalizeTx.wait(); // Bad workers lose their stake and add it to the pool price const totalWorkerPoolReward = - workerpoolPrice + workerStakePerTask * firstContributors.length; + workerpoolPrice + workerStakePerTask * BigInt(firstContributors.length); const workersRewardPerTask = await iexecWrapper.computeWorkersRewardForCurrentTask( totalWorkerPoolReward, dealId, ); const expectedWinningWorkerBalanceChange = - workerStakePerTask + workersRewardPerTask / secondContributors.length; + workerStakePerTask + workersRewardPerTask / BigInt(secondContributors.length); // compute expected scheduler reward for current task const schedulerRewardPerTask = totalWorkerPoolReward - workersRewardPerTask; const expectedProxyBalanceChange = -( dealPrice + - workerStakePerTask * workers.length + + workerStakePerTask * BigInt(workers.length) + schedulerStakePerTask ); await expect(finalizeTx).to.changeTokenBalances( @@ -215,9 +215,9 @@ describe('Integration tests', function () { const expectedFrozenChanges = [ -taskPrice, -schedulerStakePerTask, - 0, - 0, - ...workers.map(() => 0), + 0n, + 0n, + ...workers.map(() => 0n), ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); diff --git a/test/byContract/IexecAccessors/IexecAccessors.test.ts b/test/byContract/IexecAccessors/IexecAccessors.test.ts index 99c58ae09..dc102f55a 100644 --- a/test/byContract/IexecAccessors/IexecAccessors.test.ts +++ b/test/byContract/IexecAccessors/IexecAccessors.test.ts @@ -34,9 +34,9 @@ import { hashDomain } from '../IexecMaintenance/IexecMaintenance.test'; * Test state view functions. */ -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const { results, resultDigest } = buildUtf8ResultAndDigest('result'); const { resultsCallback, callbackResultDigest } = buildResultCallbackAndDigest(123); @@ -91,7 +91,7 @@ describe('IexecAccessors', async () => { }); it('balanceOf', async function () { - const amount = 3; + const amount = 3n; await iexecWrapper.depositInIexecAccount(anyone, amount); expect(await iexecPoco.balanceOf(anyone.address)).to.equal(amount); }); @@ -103,7 +103,7 @@ describe('IexecAccessors', async () => { }); it('allowance', async function () { - const amount = 10; + const amount = 10n; const spender = ethers.Wallet.createRandom().address; await iexecWrapper.depositInIexecAccount(anyone, amount); await iexecPoco.connect(anyone).approve(spender, amount); @@ -114,7 +114,7 @@ describe('IexecAccessors', async () => { await createDeal(); // Lock some requester funds. const dealPrice = appPrice + datasetPrice + workerpoolPrice; // Stake some funds. - const stakedBalance = 3; + const stakedBalance = 3n; await iexecWrapper.depositInIexecAccount(requester, stakedBalance); // Check staked and locked amounts. const account = await iexecPoco.viewAccount(requester.address); @@ -176,8 +176,8 @@ describe('IexecAccessors', async () => { const { dealId, taskId, taskIndex, startTime, timeRef } = await createDeal(); await iexecWrapper.initializeTask(dealId, taskIndex); - const contributionDeadlineRatio = Number(await iexecPoco.contribution_deadline_ratio()); - const finalDeadlineRatio = Number(await iexecPoco.final_deadline_ratio()); + const contributionDeadlineRatio = await iexecPoco.contribution_deadline_ratio(); + const finalDeadlineRatio = await iexecPoco.final_deadline_ratio(); const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.ACTIVE); @@ -314,13 +314,13 @@ describe('IexecAccessors', async () => { }); it('Should not get result when task is not completed', async function () { - const { dealId } = await createDeal(3); + const { dealId } = await createDeal(3n); - const unsetTaskId = getTaskId(dealId, 0); - const activeTaskId = await iexecWrapper.initializeTask(dealId, 1); + const unsetTaskId = getTaskId(dealId, 0n); + const activeTaskId = await iexecWrapper.initializeTask(dealId, 1n); const { taskId: revealingTaskId } = await iexecWrapper - .initializeTask(dealId, 2) - .then(() => iexecWrapper.contributeToTask(dealId, 2, resultDigest, worker1)); + .initializeTask(dealId, 2n) + .then(() => iexecWrapper.contributeToTask(dealId, 2n, resultDigest, worker1)); await verifyTaskStatusAndResult(unsetTaskId, TaskStatusEnum.UNSET); await verifyTaskStatusAndResult(activeTaskId, TaskStatusEnum.ACTIVE); @@ -332,7 +332,7 @@ describe('IexecAccessors', async () => { /** * Helper function to create a deal with a specific volume. */ -async function createDeal(volume: number = 1) { +async function createDeal(volume: bigint = 1n) { const orders = buildOrders({ assets: ordersAssets, prices: ordersPrices, @@ -343,7 +343,7 @@ async function createDeal(volume: number = 1) { ...orders.toArray(), ); const dealCategory = (await iexecPoco.viewDeal(dealId)).category; - const timeRef = Number((await iexecPoco.viewCategory(dealCategory)).workClockTimeRef); + const timeRef = (await iexecPoco.viewCategory(dealCategory)).workClockTimeRef; return { dealId, taskId, taskIndex, startTime, timeRef, orders }; } diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index e52b18bcf..4bcb572e7 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -43,13 +43,13 @@ import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deploy * TODO add Standard tests. */ -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const standardDealTag = '0x0000000000000000000000000000000000000000000000000000000000000000'; const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; -const volume = 1; -const botVolume = 321; +const volume = 1n; +const botVolume = 321n; const someMessage = 'some-message'; const someWallet = Wallet.createRandom(); @@ -383,8 +383,8 @@ describe('IexecPoco1', () => { await iexecWrapper.depositInIexecAccount(requester, dealPrice); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); // Save frozen balances before match. - const requesterFrozenBefore = Number(await iexecPoco.frozenOf(requester.address)); - const schedulerFrozenBefore = Number(await iexecPoco.frozenOf(scheduler.address)); + const requesterFrozenBefore = await iexecPoco.frozenOf(requester.address); + const schedulerFrozenBefore = await iexecPoco.frozenOf(scheduler.address); // Sign and match orders. const startTime = await setNextBlockTimestamp(); await signOrders(iexecWrapper.getDomain(), fullConfigOrders, ordersActors); @@ -408,10 +408,10 @@ describe('IexecPoco1', () => { // TODO use predicate `(change) => boolean` when migrating to a recent version of Hardhat. // See https://github.com/NomicFoundation/hardhat/blob/main/packages/hardhat-chai-matchers/src/internal/changeTokenBalance.ts#L42 expect(await iexecPoco.frozenOf(requester.address)).to.equal( - requesterFrozenBefore + dealPrice, + requesterFrozenBefore + BigInt(dealPrice), ); expect(await iexecPoco.frozenOf(scheduler.address)).to.equal( - schedulerFrozenBefore + schedulerStake, + schedulerFrozenBefore + BigInt(schedulerStake), ); // Check events. await expect(tx) @@ -530,7 +530,7 @@ describe('IexecPoco1', () => { orders.requester.dataset = ZeroAddress; // Set dataset volume lower than other assets to make sure // it does not impact final volume computation. - orders.dataset.volume = botVolume - 1; + orders.dataset.volume = botVolume - 1n; orders.app.volume = botVolume; orders.workerpool.volume = botVolume; orders.requester.volume = botVolume; @@ -544,7 +544,7 @@ describe('IexecPoco1', () => { await iexecWrapper.depositInIexecAccount(requester, dealPrice); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); // Save frozen balances before match. - const requesterFrozenBefore = Number(await iexecPoco.frozenOf(requester.address)); + const requesterFrozenBefore = await iexecPoco.frozenOf(requester.address); // Sign and match orders. await signOrders(iexecWrapper.getDomain(), orders, ordersActors); const dealId = getDealId(iexecWrapper.getDomain(), orders.requester); @@ -641,44 +641,44 @@ describe('IexecPoco1', () => { // - multiple matches of the same order it('Should fail when categories are different', async () => { - orders.requester.category = Number(orders.workerpool.category) + 1; // Valid but different category. + orders.requester.category = BigInt(orders.workerpool.category) + 1n; // Valid but different category. await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x00', ); }); it('Should fail when category is unknown', async () => { - const lastCategoryIndex = Number(await iexecPoco.countCategory()) - 1; - orders.requester.category = lastCategoryIndex + 1; - orders.workerpool.category = lastCategoryIndex + 1; + const lastCategoryIndex = (await iexecPoco.countCategory()) - 1n; + orders.requester.category = lastCategoryIndex + 1n; + orders.workerpool.category = lastCategoryIndex + 1n; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x01', ); }); it('Should fail when requested trust is above workerpool trust', async () => { - orders.requester.trust = Number(orders.workerpool.trust) + 1; + orders.requester.trust = BigInt(orders.workerpool.trust) + 1n; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x02', ); }); it('Should fail when app max price is less than app price', async () => { - orders.requester.appmaxprice = Number(orders.app.appprice) - 1; + orders.requester.appmaxprice = BigInt(orders.app.appprice) - 1n; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x03', ); }); it('Should fail when dataset max price is less than dataset price', async () => { - orders.requester.datasetmaxprice = Number(orders.dataset.datasetprice) - 1; + orders.requester.datasetmaxprice = BigInt(orders.dataset.datasetprice) - 1n; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x04', ); }); it('Should fail when workerpool max price is less than workerpool price', async () => { - orders.requester.workerpoolmaxprice = Number(orders.workerpool.workerpoolprice) - 1; + orders.requester.workerpoolmaxprice = BigInt(orders.workerpool.workerpoolprice) - 1n; await expect(iexecPocoAsRequester.matchOrders(...orders.toArray())).to.be.revertedWith( 'iExecV5-matchOrders-0x05', ); @@ -965,7 +965,7 @@ describe('IexecPoco1', () => { volume, ); // Deposit less than deal price in the requester's account. - await iexecWrapper.depositInIexecAccount(requester, dealPrice - 1); + await iexecWrapper.depositInIexecAccount(requester, dealPrice - 1n); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); expect(await iexecPoco.balanceOf(requester.address)).to.be.lessThan(dealPrice); expect(await iexecPoco.balanceOf(scheduler.address)).to.equal(schedulerStake); @@ -983,7 +983,7 @@ describe('IexecPoco1', () => { ); await iexecWrapper.depositInIexecAccount(requester, dealPrice); // Deposit less than stake value in the scheduler's account. - await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake - 1); + await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake - 1n); expect(await iexecPoco.balanceOf(requester.address)).to.equal(dealPrice); expect(await iexecPoco.balanceOf(scheduler.address)).to.be.lessThan(schedulerStake); await signOrders(iexecWrapper.getDomain(), orders, ordersActors); @@ -999,7 +999,7 @@ describe('IexecPoco1', () => { const { appOrder, datasetOrder, workerpoolOrder, requestOrder } = orders.toObject(); // override volumes and set different value for each order // to make sure the smallest volume is considered. - const expectedVolume = 2; + const expectedVolume = 2n; appOrder.volume = 2; // smallest unconsumed volume among all orders datasetOrder.volume = 3; workerpoolOrder.volume = 4; @@ -1016,7 +1016,7 @@ describe('IexecPoco1', () => { await iexecWrapper.depositInIexecAccount(sponsor, dealPrice); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); // Save frozen balances before match. - const sponsorFrozenBefore = Number(await iexecPoco.frozenOf(sponsor.address)); + const sponsorFrozenBefore = await iexecPoco.frozenOf(sponsor.address); // Sign and match orders. await signOrders(domain, orders, ordersActors); const dealId = getDealId(domain, orders.requester); @@ -1035,7 +1035,7 @@ describe('IexecPoco1', () => { ); expect(await iexecPoco.frozenOf(requester.address)).to.equal(0); expect(await iexecPoco.frozenOf(sponsor.address)).to.equal( - sponsorFrozenBefore + dealPrice, + sponsorFrozenBefore + BigInt(dealPrice), ); // Check events. await expect(tx) @@ -1065,7 +1065,7 @@ describe('IexecPoco1', () => { volume, ); // Deposit less than deal price in the sponsor's account. - await iexecWrapper.depositInIexecAccount(sponsor, dealPrice - 1); + await iexecWrapper.depositInIexecAccount(sponsor, dealPrice - 1n); await iexecWrapper.depositInIexecAccount(scheduler, schedulerStake); // Sign and match orders. await signOrders(iexecWrapper.getDomain(), orders, ordersActors); @@ -1079,7 +1079,7 @@ describe('IexecPoco1', () => { * Helper function to deposit requester and scheduler stakes with * default prices for tests that do not rely on custom prices. */ - async function depositForRequesterAndSchedulerWithDefaultPrices(volume: number) { + async function depositForRequesterAndSchedulerWithDefaultPrices(volume: bigint) { const dealPrice = (appPrice + datasetPrice + workerpoolPrice) * volume; const schedulerStake = await iexecWrapper.computeSchedulerDealStake( workerpoolPrice, diff --git a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts index afa5cee0b..4d79bb2d3 100644 --- a/test/byContract/IexecPoco/IexecPoco2-claim.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-claim.test.ts @@ -19,12 +19,12 @@ import { IexecWrapper } from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; import * as constants from './../../../utils/constants'; -const categoryTime = 300; -const maxDealDuration = 10 * categoryTime; +const categoryTime = 300n; +const maxDealDuration = 10n * categoryTime; const { results, resultDigest } = buildUtf8ResultAndDigest('result'); -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const enclaveAddress = ZeroAddress; @@ -71,8 +71,8 @@ describe('IexecPoco2#claim', async () => { * task after deadline. The task comes from a deal payed by a sponsor. */ it('Should claim task of deal payed by sponsor', async () => { - const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice - const claimedTasks = 1; + const expectedVolume = 3n; // > 1 to explicit taskPrice vs dealPrice + const claimedTasks = 1n; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -89,9 +89,7 @@ describe('IexecPoco2#claim', async () => { const schedulerTaskStake = schedulerDealStake / expectedVolume; const kittyAddress = await iexecPoco.kitty_address(); await iexecPocoAsAnyone.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const workers = [worker1, worker2]; for (const worker of workers) { const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -112,7 +110,7 @@ describe('IexecPoco2#claim', async () => { .then((tx) => tx.wait()); } expect(await iexecPoco.balanceOf(proxyAddress)).to.be.equal( - dealPrice + schedulerDealStake + workerTaskStake * workers.length, + dealPrice + schedulerDealStake + workerTaskStake * BigInt(workers.length), ); expect(await iexecPoco.balanceOf(requester.address)).to.be.equal(0); expect(await iexecPoco.frozenOf(requester.address)).to.be.equal(0); @@ -252,9 +250,7 @@ describe('IexecPoco2#claim', async () => { enclaveAddress, scheduler, ); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); await iexecWrapper.depositInIexecAccount(worker1, workerTaskStake); await iexecPoco .connect(worker1) @@ -290,7 +286,7 @@ describe('IexecPoco2#claim', async () => { describe('Claim array', () => { it('Should claim array', async () => { - const volume = 3; + const volume = 3n; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -318,7 +314,7 @@ describe('IexecPoco2#claim', async () => { }); it('Should not claim array when one is not claimable', async () => { - const volume = 2; + const volume = 2n; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -345,7 +341,7 @@ describe('IexecPoco2#claim', async () => { describe('Initialize and claim array', () => { it('Should initialize and claim array', async () => { - const volume = 3; + const volume = 3n; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -386,7 +382,7 @@ describe('IexecPoco2#claim', async () => { }); it('Should not initialize and claim array if one specific fails', async () => { - const volume = 2; + const volume = 2n; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts index e86b5929d..e23ed396e 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts @@ -26,13 +26,13 @@ import { IexecWrapper } from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; const CONFIG = require('../../../config/config.json'); -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const timeRef = CONFIG.categories[0].workClockTimeRef; const trust = 1; -const volume = 1; +const volume = 1n; const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; const standardDealTag = ZeroHash; const emptyEnclaveAddress = ZeroAddress; @@ -73,9 +73,9 @@ describe('IexecPoco2#contributeAndFinalize', () => { const { appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets(); iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, anyone); iexecPocoAsWorker = iexecPoco.connect(worker); - const appPrice = 1000; - const datasetPrice = 1_000_000; - const workerpoolPrice = 1_000_000_000; + const appPrice = 1000n; + const datasetPrice = 1_000_000n; + const workerpoolPrice = 1_000_000_000n; ordersAssets = { app: appAddress, dataset: datasetAddress, @@ -183,10 +183,10 @@ describe('IexecPoco2#contributeAndFinalize', () => { // Check frozen changes. const expectedFrozenChanges = [ -taskPrice, // Requester (dealPrice) - 0, // App provider - 0, // Dataset provider + 0n, // App provider + 0n, // Dataset provider -schedulerStake, // Scheduler - 0, // Worker + 0n, // Worker ]; await iexecWrapper.checkFrozenChanges(accountsInitialFrozens, expectedFrozenChanges); // Check events. diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts index 28324a7a7..dd2fb4b81 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts @@ -24,7 +24,7 @@ import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deploy const CONFIG = require('../../../config/config.json'); const timeRef = CONFIG.categories[0].workClockTimeRef; -const volume = 3; +const volume = 3n; const teeDealTag = '0x0000000000000000000000000000000000000000000000000000000000000001'; const standardDealTag = ZeroHash; const { resultDigest } = buildUtf8ResultAndDigest('result'); @@ -75,9 +75,9 @@ describe('IexecPoco2#contribute', () => { const { appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets(); iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, anyone); iexecPocoAsWorker = iexecPoco.connect(worker); - const appPrice = 1000; - const datasetPrice = 1_000_000; - const workerpoolPrice = 1_000_000_000; + const appPrice = 1000n; + const datasetPrice = 1_000_000n; + const workerpoolPrice = 1_000_000_000n; ordersAssets = { app: appAddress, dataset: datasetAddress, @@ -114,7 +114,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); const workers = [ { signer: worker1, resultDigest: resultDigest }, { signer: worker2, resultDigest: badResultDigest }, @@ -126,7 +126,7 @@ describe('IexecPoco2#contribute', () => { let task; let contributeBlockTimestamp; const viewFrozenOf = (address: string) => - iexecPoco.frozenOf(address).then((frozen) => Number(frozen)); + iexecPoco.frozenOf(address).then((frozen) => frozen); for (let i = 0; i < workers.length; i++) { const worker = workers[i]; const workerAddress = worker.signer.address; @@ -220,7 +220,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -251,7 +251,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -345,7 +345,7 @@ describe('IexecPoco2#contribute', () => { await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); const workerTaskStake = await iexecPoco .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index 2ca614180..10fd00e4b 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -28,9 +28,9 @@ const { results, resultDigest } = buildUtf8ResultAndDigest('result'); const hexResults = ethers.hexlify(results); const { resultsCallback, callbackResultDigest } = buildResultCallbackAndDigest(123); -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const taskPrice = appPrice + datasetPrice + workerpoolPrice; const emptyEnclaveAddress = ZeroAddress; const emptyEnclaveSignature = '0x'; @@ -97,7 +97,7 @@ describe('IexecPoco2#finalize', async () => { .connect(anyone) .deploy() .then((contract) => contract.waitForDeployment()); - const expectedVolume = 3; // > 1 to explicit taskPrice vs dealPrice + const expectedVolume = 3n; // > 1 to explicit taskPrice vs dealPrice const orders = buildOrders({ assets: ordersAssets, requester: requester.address, @@ -115,9 +115,7 @@ describe('IexecPoco2#finalize', async () => { const schedulerTaskStake = schedulerDealStake / expectedVolume; const kittyAddress = await iexecPoco.kitty_address(); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const { callbackResultDigest: wrongCallbackResultDigest } = buildResultCallbackAndDigest(567); const workers = [ @@ -167,14 +165,14 @@ describe('IexecPoco2#finalize', async () => { .then((tx) => tx.wait()); } const requesterFrozenBefore = await iexecPoco.frozenOf(requester.address); - const sponsorFrozenBefore = Number(await iexecPoco.frozenOf(sponsor.address)); - const schedulerFrozenBefore = Number(await iexecPoco.frozenOf(scheduler.address)); - const workersFrozenBefore: { [name: string]: number } = {}; + const sponsorFrozenBefore = await iexecPoco.frozenOf(sponsor.address); + const schedulerFrozenBefore = await iexecPoco.frozenOf(scheduler.address); + const workersFrozenBefore: { [name: string]: bigint } = {}; for (const worker of workers) { const workerAddress = worker.signer.address; workersFrozenBefore[workerAddress] = await iexecPoco .frozenOf(workerAddress) - .then((frozen) => Number(frozen)); + .then((frozen) => frozen); expect(await iexecPoco.viewScore(workerAddress)).to.be.equal(1); } const kittyFrozenBefore = await iexecPoco.frozenOf(kittyAddress); @@ -199,7 +197,7 @@ describe('IexecPoco2#finalize', async () => { .withArgs(proxyAddress, scheduler.address, schedulerTaskStake) .to.emit(iexecPoco, 'Unlock') .withArgs(scheduler.address, schedulerTaskStake); - const workerReward = 429000000; + const workerReward = 429000000n; for (const worker of winningWorkers) { await expect(finalizeTx) .to.emit(iexecPoco, 'Transfer') @@ -220,7 +218,7 @@ describe('IexecPoco2#finalize', async () => { .withArgs(losingWorker.address, taskId); const schedulerReward = workerpoolPrice - - winningWorkers.length * workerReward + // winning workers rewards + BigInt(winningWorkers.length) * workerReward + // winning workers rewards workerTaskStake; // losing worker stake await expect(finalizeTx) .to.emit(iexecPoco, 'Transfer') @@ -256,7 +254,7 @@ describe('IexecPoco2#finalize', async () => { datasetPrice + workerpoolPrice + schedulerTaskStake + - workerTaskStake * workers.length + workerTaskStake * BigInt(workers.length) ), 0, // requester is unrelated to this test 0, // sponsor balance is unchanged, only frozen is changed @@ -305,9 +303,7 @@ describe('IexecPoco2#finalize', async () => { ...orders.toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -335,7 +331,7 @@ describe('IexecPoco2#finalize', async () => { .connect(worker1) .reveal(taskId, resultDigest) .then((tx) => tx.wait()); - const requesterFrozenBefore = Number(await iexecPoco.frozenOf(requester.address)); + const requesterFrozenBefore = await iexecPoco.frozenOf(requester.address); const sponsorFrozenBefore = await iexecPoco.frozenOf(sponsor.address); const txFinalize = iexecPocoAsScheduler.finalize(taskId, results, '0x'); @@ -371,9 +367,7 @@ describe('IexecPoco2#finalize', async () => { ...orders.toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, callbackResultDigest, @@ -424,9 +418,7 @@ describe('IexecPoco2#finalize', async () => { ...orders.toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, callbackResultDigest, @@ -465,21 +457,21 @@ describe('IexecPoco2#finalize', async () => { { testInfo: 'scheduler gets 10% of the kitty when these 10% are greater than MIN_KITTY', // (MIN_KITTY=1RLC) - workerpoolPriceToFillKitty: 33_333_333_367, - expectedKittyBeforeFinalize: 10_000_000_010, // ~10 RLC - expectedSchedulerKittyPartReward: 1_000_000_001, // ~1.01 RLC (expectedKittyBeforeFinalize x 10%) + workerpoolPriceToFillKitty: 33_333_333_367n, + expectedKittyBeforeFinalize: 10_000_000_010n, // ~10 RLC + expectedSchedulerKittyPartReward: 1_000_000_001n, // ~1.01 RLC (expectedKittyBeforeFinalize x 10%) }, { testInfo: 'scheduler gets at least MIN_KITTY if available', - workerpoolPriceToFillKitty: 3_333_333_334, - expectedKittyBeforeFinalize: 1_000_000_000, // 1 RLC - expectedSchedulerKittyPartReward: 1_000_000_000, + workerpoolPriceToFillKitty: 3_333_333_334n, + expectedKittyBeforeFinalize: 1_000_000_000n, // 1 RLC + expectedSchedulerKittyPartReward: 1_000_000_000n, }, { testInfo: 'scheduler gets all kitty when the kitty is lower than MIN_KITTY', - workerpoolPriceToFillKitty: 3_333_333_330, - expectedKittyBeforeFinalize: 999_999_999, // ~0.99 RLC - expectedSchedulerKittyPartReward: 999_999_999, + workerpoolPriceToFillKitty: 3_333_333_330n, + expectedKittyBeforeFinalize: 999_999_999n, // ~0.99 RLC + expectedSchedulerKittyPartReward: 999_999_999n, }, ].forEach((testArgs) => { const { @@ -491,7 +483,7 @@ describe('IexecPoco2#finalize', async () => { it(`Should finalize task with scheduler kitty part reward where ${testInfo}`, async () => { // Fill kitty const kittyAddress = await iexecPoco.kitty_address(); - const kittyFillingDealVolume = 1; + const kittyFillingDealVolume = 1n; const kittyFillingSchedulerDealStake = await iexecWrapper.computeSchedulerDealStake( workerpoolPriceToFillKitty, kittyFillingDealVolume, @@ -503,8 +495,8 @@ describe('IexecPoco2#finalize', async () => { assets: ordersAssets, requester: requester.address, prices: { - app: 0, - dataset: 0, + app: 0n, + dataset: 0n, workerpool: workerpoolPriceToFillKitty, // 30% will go to kitty }, volume: kittyFillingDealVolume, @@ -514,7 +506,7 @@ describe('IexecPoco2#finalize', async () => { await iexecPoco .initialize(kittyFillingDeal.dealId, kittyFillingDeal.taskIndex) .then((tx) => tx.wait()); - const kittyFrozenBeforeClaim = Number(await iexecPoco.frozenOf(kittyAddress)); + const kittyFrozenBeforeClaim = await iexecPoco.frozenOf(kittyAddress); await time.setNextBlockTimestamp( (await iexecPoco.viewTask(kittyFillingDeal.taskId)).finalDeadline, ); @@ -532,7 +524,7 @@ describe('IexecPoco2#finalize', async () => { .withArgs(kittyAddress, kittyFillingSchedulerTaskStake, kittyFillingDeal.taskId) .to.emit(iexecPoco, 'Lock') .withArgs(kittyAddress, kittyFillingSchedulerTaskStake); - const kittyFrozenAfterClaim = Number(await iexecPoco.frozenOf(kittyAddress)); + const kittyFrozenAfterClaim = await iexecPoco.frozenOf(kittyAddress); expect(kittyFrozenAfterClaim).to.equal( kittyFrozenBeforeClaim + kittyFillingSchedulerTaskStake, ); @@ -543,11 +535,11 @@ describe('IexecPoco2#finalize', async () => { assets: ordersAssets, requester: requester.address, prices: { - app: 0, - dataset: 0, - workerpool: 0, + app: 0n, + dataset: 0n, + workerpool: 0n, }, - volume: 1, + volume: 1n, salt: ethers.id(new Date().toISOString()), }).toArray(), ); @@ -600,21 +592,18 @@ describe('IexecPoco2#finalize', async () => { }); it('Should finalize task after reveal deadline with at least one reveal', async () => { - const volume = 1; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, - volume, + volume: 1n, trust: 3, }); const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders( ...orders.toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const workers = [worker1, worker2]; for (const worker of workers) { const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -697,9 +686,7 @@ describe('IexecPoco2#finalize', async () => { }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -742,9 +729,7 @@ describe('IexecPoco2#finalize', async () => { }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const workers = [worker1, worker2]; for (const worker of workers) { const { resultHash, resultSeal } = buildResultHashAndResultSeal( @@ -791,9 +776,7 @@ describe('IexecPoco2#finalize', async () => { }).toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -849,9 +832,7 @@ describe('IexecPoco2#finalize', async () => { ...orders.toArray(), ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, callbackResultDigest, diff --git a/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts b/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts index 036db7fa3..6a21bb582 100644 --- a/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-initialize.test.ts @@ -16,11 +16,10 @@ import { TaskStatusEnum, getIexecAccounts, getTaskId } from '../../../utils/poco import { IexecWrapper } from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; -const categoryTime = 300; -const maxDealDuration = 10 * categoryTime; -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const categoryTime = 300n; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; describe('IexecPoco2#initialize', async () => { let proxyAddress: string; @@ -84,8 +83,8 @@ describe('IexecPoco2#initialize', async () => { expect(task.dealid).equal(dealId); expect(task.idx).equal(taskIndex); expect(task.timeref).equal(categoryTime); - expect(task.contributionDeadline).equal(startTime + 7 * categoryTime); - expect(task.finalDeadline).equal(startTime + 10 * categoryTime); + expect(task.contributionDeadline).equal(startTime + 7n * categoryTime); + expect(task.finalDeadline).equal(startTime + 10n * categoryTime); // m_consensus does not have any getter }); @@ -94,7 +93,7 @@ describe('IexecPoco2#initialize', async () => { assets: ordersAssets, requester: requester.address, prices: ordersPrices, - volume: 10, + volume: 10n, }).toObject(); const workerpoolOrder0 = { ...createEmptyWorkerpoolOrder(), @@ -163,12 +162,11 @@ describe('IexecPoco2#initialize', async () => { describe('Initialize array', function () { it('Should initialize array', async function () { - const volume = 3; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, - volume, + volume: 3n, }); const { dealId } = await iexecWrapper.signAndMatchOrders(...orders.toArray()); const dealIds = [dealId, dealId, dealId]; @@ -199,12 +197,11 @@ describe('IexecPoco2#initialize', async () => { }); it('Should not initialize array if one specific fails', async function () { - const volume = 2; const orders = buildOrders({ assets: ordersAssets, requester: requester.address, prices: ordersPrices, - volume, + volume: 2n, }); const { dealId } = await iexecWrapper.signAndMatchOrders(...orders.toArray()); const taskIndex0 = 0; diff --git a/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts b/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts index dbd979883..7aee3af1e 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reopen.test.ts @@ -20,9 +20,9 @@ import { import { IexecWrapper } from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; -const appPrice = 1000; -const datasetPrice = 1_000_000; -const workerpoolPrice = 1_000_000_000; +const appPrice = 1000n; +const datasetPrice = 1_000_000n; +const workerpoolPrice = 1_000_000_000n; const resultDigest = buildUtf8ResultAndDigest('result').resultDigest; describe('IexecPoco2#reopen', async () => { @@ -244,9 +244,7 @@ describe('IexecPoco2#reopen', async () => { async function contribute(worker: SignerWithAddress, resultDigest: string) { const emptyEnclaveAddress = ZeroAddress; const emptyEnclaveSignature = '0x'; - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); await iexecWrapper.depositInIexecAccount(worker, workerTaskStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, diff --git a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts index ddeb299bd..b613d77ca 100644 --- a/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-reveal.test.ts @@ -20,7 +20,7 @@ import { import { IexecWrapper } from '../../utils/IexecWrapper'; import { loadHardhatFixtureDeployment } from '../../utils/hardhat-fixture-deployer'; -const volume = 1; +const volume = 1n; const standardDealTag = ZeroHash; const { resultDigest } = buildUtf8ResultAndDigest('result'); const { resultDigest: badResultDigest } = buildUtf8ResultAndDigest('bad-result'); @@ -61,9 +61,9 @@ describe('IexecPoco2#reveal', () => { const { appAddress, datasetAddress, workerpoolAddress } = await iexecWrapper.createAssets(); iexecPoco = IexecInterfaceNative__factory.connect(proxyAddress, anyone); iexecPocoAsWorker = iexecPoco.connect(worker); - const appPrice = 1000; - const datasetPrice = 1_000_000; - const workerpoolPrice = 1_000_000_000; + const appPrice = 1000n; + const datasetPrice = 1_000_000n; + const workerpoolPrice = 1_000_000_000n; ordersAssets = { app: appAddress, dataset: datasetAddress, @@ -86,9 +86,7 @@ describe('IexecPoco2#reveal', () => { ...orders.toArray(), )); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); await iexecWrapper.depositInIexecAccount(worker, workerTaskStake); ({ resultHash, resultSeal } = buildResultHashAndResultSeal(taskId, resultDigest, worker)); schedulerSignature = await buildAndSignContributionAuthorizationMessage( @@ -205,9 +203,7 @@ describe('IexecPoco2#reveal', () => { // orders to get an easy one-liner declaration. ); await iexecPoco.initialize(dealId, taskIndex).then((tx) => tx.wait()); - const workerTaskStake = await iexecPoco - .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + const workerTaskStake = await iexecPoco.viewDeal(dealId).then((deal) => deal.workerStake); const workers = [ { signer: worker1, resultDigest: resultDigest }, { signer: worker2, resultDigest: badResultDigest }, diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 4c676673f..998f1d4f6 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -81,12 +81,12 @@ export class IexecWrapper { * @param value The value to deposit. * @param account Deposit value for an account. */ - async depositInIexecAccount(account: SignerWithAddress, value: number) { + async depositInIexecAccount(account: SignerWithAddress, value: bigint) { switch (DEPLOYMENT_CONFIG.asset) { case 'Native': await IexecInterfaceNative__factory.connect(this.proxyAddress, account) .deposit({ - value: (value * 10 ** 9).toString(), + value: (value * 10n ** 9n).toString(), }) .then((tx) => tx.wait()); break; @@ -99,9 +99,12 @@ export class IexecWrapper { this.accounts.iexecAdmin, ); // Transfer RLC from owner to recipient - await rlc.transfer(account.address, value); + await rlc.transfer(account.address, value).then((tx) => tx.wait()); // Deposit - await rlc.connect(account).approveAndCall(this.proxyAddress, value, '0x'); + await rlc + .connect(account) + .approveAndCall(this.proxyAddress, value, '0x') + .then((tx) => tx.wait()); break; default: break; @@ -118,14 +121,12 @@ export class IexecWrapper { * @param volume number of tasks of a deal * @returns total amount to stake by the scheduler */ - async computeSchedulerDealStake(workerpoolPrice: number, volume: number): Promise { - const stakeRatio = Number( - await IexecAccessors__factory.connect( - this.proxyAddress, - this.accounts.anyone, - ).workerpool_stake_ratio(), - ); - return Math.floor((workerpoolPrice * stakeRatio) / 100) * volume; + async computeSchedulerDealStake(workerpoolPrice: bigint, volume: bigint): Promise { + const stakeRatio = await IexecAccessors__factory.connect( + this.proxyAddress, + this.accounts.anyone, + ).workerpool_stake_ratio(); + return ((workerpoolPrice * stakeRatio) / 100n) * volume; } /** @@ -135,15 +136,13 @@ export class IexecWrapper { * @param workerpoolPrice price of the workerpool * @returns value of worker stake */ - async computeWorkerTaskStake(workerpoolAddress: string, workerpoolPrice: number) { + async computeWorkerTaskStake(workerpoolAddress: string, workerpoolPrice: bigint) { // TODO make "m_workerStakeRatioPolicy()" as view function in IWorkerpool.v8 and use it. - const workerStakeRatio = Number( - await Workerpool__factory.connect( - workerpoolAddress, - this.accounts.anyone, - ).m_workerStakeRatioPolicy(), - ); - return Math.floor((workerpoolPrice * workerStakeRatio) / 100); + const workerStakeRatio = await Workerpool__factory.connect( + workerpoolAddress, + this.accounts.anyone, + ).m_workerStakeRatioPolicy(); + return (workerpoolPrice * workerStakeRatio) / 100n; } /** @@ -169,14 +168,12 @@ export class IexecWrapper { */ async computeWorkersRewardPerTask(dealId: string, mode: PocoMode) { if (mode === PocoMode.BOOST) { - return Number( - ( - await IexecPocoBoostAccessors__factory.connect( - this.proxyAddress, - ethers.provider, - ).viewDealBoost(dealId) - ).workerReward, - ); + return ( + await IexecPocoBoostAccessors__factory.connect( + this.proxyAddress, + ethers.provider, + ).viewDealBoost(dealId) + ).workerReward; } // CLASSIC mode. const deal = await IexecAccessors__factory.connect( @@ -184,8 +181,8 @@ export class IexecWrapper { ethers.provider, ).viewDeal(dealId); // reward = (workerpoolPrice * workersRatio) / 100 - const workersRewardRatio = 100 - Number(deal.schedulerRewardRatio); - return Math.floor((Number(deal.workerpool.price) * workersRewardRatio) / 100); + const workersRewardRatio = 100n - deal.schedulerRewardRatio; + return (deal.workerpool.price * workersRewardRatio) / 100n; } async setTeeBroker(brokerAddress: string) { @@ -268,27 +265,25 @@ export class IexecWrapper { this.proxyAddress, ethers.provider, ).viewConsumed(this.hashOrder(requestOrder)); - const dealId = getDealId(this.domain, requestOrder, Number(taskIndex)); - const taskId = getTaskId(dealId, Number(taskIndex)); - const volume = Number( - await IexecPocoAccessors__factory.connect( - this.proxyAddress, - ethers.provider, - ).computeDealVolume(appOrder, datasetOrder, workerpoolOrder, requestOrder), - ); + const dealId = getDealId(this.domain, requestOrder, taskIndex); + const taskId = getTaskId(dealId, taskIndex); + const volume = await IexecPocoAccessors__factory.connect( + this.proxyAddress, + ethers.provider, + ).computeDealVolume(appOrder, datasetOrder, workerpoolOrder, requestOrder); const taskPrice = - Number(appOrder.appprice) + - Number(datasetOrder.datasetprice) + - Number(workerpoolOrder.workerpoolprice); + BigInt(appOrder.appprice) + + BigInt(datasetOrder.datasetprice) + + BigInt(workerpoolOrder.workerpoolprice); const dealPrice = taskPrice * volume; const dealPayer = withSponsor ? this.accounts.sponsor : this.accounts.requester; await this.depositInIexecAccount(dealPayer, dealPrice); const schedulerStakePerDeal = await this.computeSchedulerDealStake( - Number(workerpoolOrder.workerpoolprice), + BigInt(workerpoolOrder.workerpoolprice), volume, ); await this.depositInIexecAccount(this.accounts.scheduler, schedulerStakePerDeal); - const startTime = await setNextBlockTimestamp(); + const startTime = BigInt(await setNextBlockTimestamp()); const iexecPocoAsDealPayer = IexecPoco1__factory.connect(this.proxyAddress, dealPayer); await ( withSponsor @@ -348,7 +343,7 @@ export class IexecWrapper { * @param taskIndex index of the task * @returns */ - async initializeTask(dealId: string, taskIndex: number) { + async initializeTask(dealId: string, taskIndex: bigint) { await IexecPoco2__factory.connect(this.proxyAddress, this.accounts.anyone) .initialize(dealId, taskIndex) .then((tx) => tx.wait()); @@ -367,7 +362,7 @@ export class IexecWrapper { */ async contributeToTask( dealId: string, - taskIndex: number, + taskIndex: bigint, resultDigest: string, contributor: SignerWithAddress, ) { @@ -393,7 +388,7 @@ export class IexecWrapper { */ async contributeToTeeTask( dealId: string, - taskIndex: number, + taskIndex: bigint, resultDigest: string, contributor: SignerWithAddress, ) { @@ -420,7 +415,7 @@ export class IexecWrapper { */ async _contributeToTask( dealId: string, - taskIndex: number, + taskIndex: bigint, resultDigest: string, contributor: SignerWithAddress, useEnclave: Boolean, @@ -431,7 +426,7 @@ export class IexecWrapper { ethers.provider, ) .viewDeal(dealId) - .then((deal) => Number(deal.workerStake)); + .then((deal) => deal.workerStake); const { resultHash, resultSeal } = buildResultHashAndResultSeal( taskId, resultDigest, @@ -483,33 +478,30 @@ export class IexecWrapper { for (const account of accounts) { initialFrozens.push({ address: account.address, - frozen: Number(await iexecPoco.frozenOf(account.address)), + frozen: await iexecPoco.frozenOf(account.address), }); } return initialFrozens; } async checkFrozenChanges( - accountsInitialFrozens: { address: string; frozen: number }[], - expectedFrozenChanges: number[], + accountsInitialFrozens: { address: string; frozen: bigint }[], + expectedFrozenChanges: bigint[], ) { let iexecPoco = IexecInterfaceNative__factory.connect(this.proxyAddress, ethers.provider); for (let i = 0; i < accountsInitialFrozens.length; i++) { - const actualFrozen = Number( - await iexecPoco.frozenOf(accountsInitialFrozens[i].address), - ); - + const actualFrozen = await iexecPoco.frozenOf(accountsInitialFrozens[i].address); const expectedFrozen = accountsInitialFrozens[i].frozen + expectedFrozenChanges[i]; expect(actualFrozen).to.equal(expectedFrozen, `Mismatch at index ${i}`); } } - async computeWorkersRewardForCurrentTask(totalPoolReward: number, dealId: string) { + async computeWorkersRewardForCurrentTask(totalPoolReward: bigint, dealId: string) { const deal = await IexecInterfaceNative__factory.connect( this.proxyAddress, ethers.provider, ).viewDeal(dealId); - return (totalPoolReward * (100 - Number(deal.schedulerRewardRatio))) / 100; + return (totalPoolReward * (100n - deal.schedulerRewardRatio)) / 100n; } } diff --git a/utils/createOrders.ts b/utils/createOrders.ts index a165cc097..7356e1aca 100644 --- a/utils/createOrders.ts +++ b/utils/createOrders.ts @@ -15,9 +15,9 @@ export interface OrdersAssets { } export interface OrdersPrices { - app?: number; - dataset?: number; - workerpool?: number; + app?: bigint; + dataset?: bigint; + workerpool?: bigint; } export interface MatchOrdersArgs { @@ -26,7 +26,7 @@ export interface MatchOrdersArgs { beneficiary?: string; tag?: string; prices?: OrdersPrices; - volume?: number; + volume?: bigint; callback?: string; trust?: number; category?: number; diff --git a/utils/poco-tools.ts b/utils/poco-tools.ts index 497319057..e24c1fbc7 100644 --- a/utils/poco-tools.ts +++ b/utils/poco-tools.ts @@ -83,7 +83,7 @@ export async function getIexecAccounts(): Promise { export function getDealId( domain: TypedDataDomain, requestOrder: IexecLibOrders_v5.RequestOrderStruct, - firstTaskIndex: number = 0, + firstTaskIndex: bigint = 0n, ): string { return ethers.solidityPackedKeccak256( ['bytes32', 'uint256'], @@ -91,7 +91,7 @@ export function getDealId( ); } -export function getTaskId(dealId: string, taskIndex: number): string { +export function getTaskId(dealId: string, taskIndex: bigint): string { return ethers.solidityPackedKeccak256(['bytes32', 'uint256'], [dealId, taskIndex]); } diff --git a/utils/tools.ts b/utils/tools.ts index 495873357..937ccced6 100644 --- a/utils/tools.ts +++ b/utils/tools.ts @@ -11,3 +11,11 @@ export function compactSignature(signature: string): string { export function bigintToAddress(bigint: bigint) { return ethers.getAddress(ethers.toBeHex(bigint)); } + +export function minBigInt(a: bigint, b: bigint) { + return a < b ? a : b; +} + +export function maxBigInt(a: bigint, b: bigint) { + return a > b ? a : b; +} From 4158636cca4bf14496cd86f453e047804360affb Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 19 Feb 2025 15:00:53 +0100 Subject: [PATCH 23/32] fix: remove unnecessary BigInt conversion in IexecPoco1 tests --- test/byContract/IexecPoco/IexecPoco1.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco1.test.ts b/test/byContract/IexecPoco/IexecPoco1.test.ts index 4bcb572e7..a05b0f25f 100644 --- a/test/byContract/IexecPoco/IexecPoco1.test.ts +++ b/test/byContract/IexecPoco/IexecPoco1.test.ts @@ -112,7 +112,7 @@ describe('IexecPoco1', () => { iexecPocoAsRequester = iexecPoco.connect(requester); iexecPocoAsSponsor = IexecPoco1__factory.connect(proxyAddress, sponsor); iexecPocoAccessors = IexecPocoAccessors__factory.connect(proxyAddress, ethers.provider); - iexecPocoContract = iexecPoco as unknown as Contract; + iexecPocoContract = iexecPoco as Contract; ordersActors = { appOwner: appProvider, datasetOwner: datasetProvider, @@ -408,10 +408,10 @@ describe('IexecPoco1', () => { // TODO use predicate `(change) => boolean` when migrating to a recent version of Hardhat. // See https://github.com/NomicFoundation/hardhat/blob/main/packages/hardhat-chai-matchers/src/internal/changeTokenBalance.ts#L42 expect(await iexecPoco.frozenOf(requester.address)).to.equal( - requesterFrozenBefore + BigInt(dealPrice), + requesterFrozenBefore + dealPrice, ); expect(await iexecPoco.frozenOf(scheduler.address)).to.equal( - schedulerFrozenBefore + BigInt(schedulerStake), + schedulerFrozenBefore + schedulerStake, ); // Check events. await expect(tx) @@ -1035,7 +1035,7 @@ describe('IexecPoco1', () => { ); expect(await iexecPoco.frozenOf(requester.address)).to.equal(0); expect(await iexecPoco.frozenOf(sponsor.address)).to.equal( - sponsorFrozenBefore + BigInt(dealPrice), + sponsorFrozenBefore + dealPrice, ); // Check events. await expect(tx) From 46df5dba832ca08e3d185bf514d3d05f50f3b6b4 Mon Sep 17 00:00:00 2001 From: Robin Le Caignec <72495599+Le-Caignec@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:27:00 +0700 Subject: [PATCH 24/32] Update test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémy (James) Toussaint <33313130+jeremyjams@users.noreply.github.com> --- .../IexecPoco/IexecPoco2-contribute-and-finalize.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts index e23ed396e..1957aba98 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts @@ -267,7 +267,7 @@ describe('IexecPoco2#contributeAndFinalize', () => { const task = await iexecPoco.viewTask(taskId); expect(task.status).to.equal(TaskStatusEnum.COMPLETED); expect(task.resultDigest).to.equal(resultDigest); - expect(task.results).to.equal(ethers.toBeHex(ethers.toBigInt(results))); + expect(task.results).to.equal(ethers.hexlify(results)); expect(task.resultsCallback).to.equal(noCallbackData); // Check events. await expect(contributeAndFinalizeTx) From 2b293d940ae199675801b6060a08a692ccfb6e64 Mon Sep 17 00:00:00 2001 From: Robin Le Caignec <72495599+Le-Caignec@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:27:13 +0700 Subject: [PATCH 25/32] Update test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémy (James) Toussaint <33313130+jeremyjams@users.noreply.github.com> --- .../IexecPoco/IexecPoco2-contribute-and-finalize.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts index 1957aba98..4bc89d472 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute-and-finalize.test.ts @@ -408,7 +408,7 @@ describe('IexecPoco2#contributeAndFinalize', () => { taskId, resultsCallbackDigest, noResultsData, - ethers.toBeHex(ethers.toBigInt(ethers.randomBytes(32))), // Bad callback data. + ethers.hexlify(ethers.randomBytes(32)), // Bad callback data. emptyEnclaveAddress, emptyEnclaveSignature, await buildAndSignContributionAuthorizationMessage( From ecbcbe545ae8164188b2a4c926701e5bcde4d21b Mon Sep 17 00:00:00 2001 From: Robin Le Caignec <72495599+Le-Caignec@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:27:41 +0700 Subject: [PATCH 26/32] Update test/byContract/IexecPoco/IexecPoco2-contribute.test.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jérémy (James) Toussaint <33313130+jeremyjams@users.noreply.github.com> --- test/byContract/IexecPoco/IexecPoco2-contribute.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts index dd2fb4b81..c60308a6b 100644 --- a/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-contribute.test.ts @@ -126,7 +126,7 @@ describe('IexecPoco2#contribute', () => { let task; let contributeBlockTimestamp; const viewFrozenOf = (address: string) => - iexecPoco.frozenOf(address).then((frozen) => frozen); + iexecPoco.frozenOf(address); for (let i = 0; i < workers.length; i++) { const worker = workers[i]; const workerAddress = worker.signer.address; From 124164dfe95469af63239557116f53d23103f3b0 Mon Sep 17 00:00:00 2001 From: Robin Le Caignec <72495599+Le-Caignec@users.noreply.github.com> Date: Wed, 19 Feb 2025 21:36:07 +0700 Subject: [PATCH 27/32] Update CHANGELOG.md Co-authored-by: gfournieriExec <100280020+gfournieriExec@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 903616a27..1f79deaf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ - Deployment scripts (#187) - Tests - ENSIntegration, IexecOrderManagement, IexecRelay (#195) - - IexecCategoryManager, IexecERC20 (#192) + - test/*fullchain* (#190, #196) - test/*fullchain* (#190) - IexecAccessors (#189, #191) - IexecPoco (#196) From 0ba93d79c8eaf32f5fd9056fea44e5018389b714 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 19 Feb 2025 15:37:39 +0100 Subject: [PATCH 28/32] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f79deaf1..0a664092c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,8 @@ - Deployment scripts (#187) - Tests - ENSIntegration, IexecOrderManagement, IexecRelay (#195) + - IexecCategoryManager, IexecERC20 (#192) - test/*fullchain* (#190, #196) - - test/*fullchain* (#190) - IexecAccessors (#189, #191) - IexecPoco (#196) - Migrate scripts to TypeScript: (#184) From 1397ec33acf044370da47cf9f004e7165561ca28 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 19 Feb 2025 15:39:14 +0100 Subject: [PATCH 29/32] minor fix in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a664092c..e9c41a743 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ - ENSIntegration, IexecOrderManagement, IexecRelay (#195) - IexecCategoryManager, IexecERC20 (#192) - test/*fullchain* (#190, #196) - - IexecAccessors (#189, #191) + - IexecAccessors (#189, #191, #196) - IexecPoco (#196) - Migrate scripts to TypeScript: (#184) - `getFunctionSignatures.js`, `common-test-snapshot.js`, `test-storage.js`, `timelock.js` From cd14b8d83cea60b12572a5e0b389cfcce1cf1274 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 19 Feb 2025 16:23:32 +0100 Subject: [PATCH 30/32] refactor: update timestamp handling in IexecWrapper and poco-tools --- test/utils/IexecWrapper.ts | 2 +- utils/poco-tools.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 998f1d4f6..4d49bf6d1 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -283,7 +283,7 @@ export class IexecWrapper { volume, ); await this.depositInIexecAccount(this.accounts.scheduler, schedulerStakePerDeal); - const startTime = BigInt(await setNextBlockTimestamp()); + const startTime = await setNextBlockTimestamp(); const iexecPocoAsDealPayer = IexecPoco1__factory.connect(this.proxyAddress, dealPayer); await ( withSponsor diff --git a/utils/poco-tools.ts b/utils/poco-tools.ts index e24c1fbc7..65ea2ef8f 100644 --- a/utils/poco-tools.ts +++ b/utils/poco-tools.ts @@ -221,5 +221,5 @@ export async function signMessage(signerAccount: SignerWithAddress, message: str export async function setNextBlockTimestamp() { const startTime = (await time.latest()) + 10; await time.setNextBlockTimestamp(startTime); - return startTime; + return BigInt(startTime); } From ab51546253e373e6dfaaddf76fb4a61025304c4e Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 19 Feb 2025 16:29:16 +0100 Subject: [PATCH 31/32] Revert "refactor: update timestamp handling in IexecWrapper and poco-tools" This reverts commit cd14b8d83cea60b12572a5e0b389cfcce1cf1274. --- test/utils/IexecWrapper.ts | 2 +- utils/poco-tools.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/utils/IexecWrapper.ts b/test/utils/IexecWrapper.ts index 4d49bf6d1..998f1d4f6 100644 --- a/test/utils/IexecWrapper.ts +++ b/test/utils/IexecWrapper.ts @@ -283,7 +283,7 @@ export class IexecWrapper { volume, ); await this.depositInIexecAccount(this.accounts.scheduler, schedulerStakePerDeal); - const startTime = await setNextBlockTimestamp(); + const startTime = BigInt(await setNextBlockTimestamp()); const iexecPocoAsDealPayer = IexecPoco1__factory.connect(this.proxyAddress, dealPayer); await ( withSponsor diff --git a/utils/poco-tools.ts b/utils/poco-tools.ts index 65ea2ef8f..e24c1fbc7 100644 --- a/utils/poco-tools.ts +++ b/utils/poco-tools.ts @@ -221,5 +221,5 @@ export async function signMessage(signerAccount: SignerWithAddress, message: str export async function setNextBlockTimestamp() { const startTime = (await time.latest()) + 10; await time.setNextBlockTimestamp(startTime); - return BigInt(startTime); + return startTime; } From eb062875ef2d16df12d2d49fba63e4c0a4411a44 Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Wed, 19 Feb 2025 16:32:00 +0100 Subject: [PATCH 32/32] refactor: rename oracleConsumerInstanceAddress to oracleConsumerAddress in IexecPoco2 finalize tests --- test/byContract/IexecPoco/IexecPoco2-finalize.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts index 10fd00e4b..915bd3242 100644 --- a/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts +++ b/test/byContract/IexecPoco/IexecPoco2-finalize.test.ts @@ -816,7 +816,7 @@ describe('IexecPoco2#finalize', async () => { }); it('Should not finalize task when result callback is bad', async () => { - const oracleConsumerInstanceAddress = await new TestClient__factory() + const oracleConsumerAddress = await new TestClient__factory() .connect(anyone) .deploy() .then((contract) => contract.waitForDeployment()) @@ -825,7 +825,7 @@ describe('IexecPoco2#finalize', async () => { assets: ordersAssets, requester: requester.address, prices: ordersPrices, - callback: oracleConsumerInstanceAddress, + callback: oracleConsumerAddress, }); const { dealId, taskId, taskIndex } = await iexecWrapper.signAndMatchOrders(