diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d934a1bd9..8368be445 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,13 +1,5 @@ on: - push: - branches: - - feature/* - - bugfix/* - - develop - - release/* - - hotfix/* - - main - - v5 + pull_request: jobs: # Note: changing the name of the job disables Slither checks with the error: @@ -48,7 +40,7 @@ jobs: - name: Run static analysis with Slither uses: crytic/slither-action@v0.4.0 with: - target: "contracts/tools/testing/slither/" + target: 'contracts/tools/testing/slither/' solc-version: '0.8.21' slither-args: --checklist --markdown-root ${{ github.server_url }}/${{ github.repository }}/blob/${{ github.sha }}/ fail-on: none # TODO set this to high or other diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cf43b2fd..7b7d4776a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Target latest EVM version (#239) - Adapt contracts file tree (#238) - Use namespaced storage (#236, #237) + - Fix script folder (#235) - Format all solidity files (#233) - Rename ERC1538 architure to diamond Proxy architecture(#226, #229, #230, #234) - Remove ENS module (#225) diff --git a/scripts/boost/1_add-modules-to-proxy.ts b/scripts/boost/1_add-modules-to-proxy.ts index 5c0af845a..cfe2485b4 100644 --- a/scripts/boost/1_add-modules-to-proxy.ts +++ b/scripts/boost/1_add-modules-to-proxy.ts @@ -5,8 +5,8 @@ import { time } from '@nomicfoundation/hardhat-network-helpers'; import { BytesLike, ZeroHash } from 'ethers'; import { deployments, ethers } from 'hardhat'; import { - IexecPocoBoostAccessors__factory, - IexecPocoBoost__factory, + IexecPocoBoostAccessorsFacet__factory, + IexecPocoBoostFacet__factory, TimelockController__factory, } from '../../typechain'; import { Ownable__factory } from '../../typechain/factories/rlc-faucet-contract/contracts'; @@ -24,6 +24,9 @@ import { if (!deploymentOptions.DiamondProxy) { throw new Error('DiamondProxy is required'); } + if (!deploymentOptions.IexecLibOrders_v5) { + throw new Error('IexecLibOrders_v5 is required'); + } const diamondProxyAddress = deploymentOptions.DiamondProxy; const iexecPocoBoostFacetAddress = (await deployments.get('IexecPocoBoostFacet')).address; // Bellecour: 0x8425229f979AB3b0dDDe00D475D762cA4d6a5eFc const iexecPocoBoostAccessorsFacetAddress = ( @@ -31,12 +34,18 @@ import { ).address; // Bellecour: 0x56185a2b0dc8b556BBfBAFB702BC971Ed75e868C const [account] = await ethers.getSigners(); const timelockAddress = await Ownable__factory.connect(diamondProxyAddress, account).owner(); // Bellecour: 0x4611B943AA1d656Fc669623b5DA08756A7e288E9 + + const iexecLibOrders = { + ['contracts/libs/IexecLibOrders_v5.sol:IexecLibOrders_v5']: + deploymentOptions.IexecLibOrders_v5, + }; + const iexecPocoBoostProxyUpdate = encodeModuleProxyUpdate( - IexecPocoBoost__factory.createInterface(), + new IexecPocoBoostFacet__factory(iexecLibOrders), iexecPocoBoostFacetAddress, ); const iexecPocoBoostAccessorsProxyUpdate = encodeModuleProxyUpdate( - IexecPocoBoostAccessors__factory.createInterface(), + new IexecPocoBoostAccessorsFacet__factory(), iexecPocoBoostAccessorsFacetAddress, ); // Salt but must be the same for schedule & execute diff --git a/scripts/sponsoring/1_add-modules-to-proxy.ts b/scripts/sponsoring/1_add-modules-to-proxy.ts index e18cec849..393cafac2 100644 --- a/scripts/sponsoring/1_add-modules-to-proxy.ts +++ b/scripts/sponsoring/1_add-modules-to-proxy.ts @@ -32,6 +32,9 @@ export async function addModulesToProxy() { if (!deploymentOptions.DiamondProxy) { throw new Error('DiamondProxy is required'); } + if (!deploymentOptions.IexecLibOrders_v5) { + throw new Error('IexecLibOrders_v5 is required'); + } const diamondProxyAddress = deploymentOptions.DiamondProxy; const iexecOrderManagementAddress = (await hre.deployments.get('IexecOrderManagementFacet')) .address; @@ -46,20 +49,26 @@ export async function addModulesToProxy() { diamondProxyAddress, ethers.provider, ).owner(); + + const iexecLibOrders = { + ['contracts/libs/IexecLibOrders_v5.sol:IexecLibOrders_v5']: + deploymentOptions.IexecLibOrders_v5, + }; + const iexecOrderManagementProxyUpdate = encodeModuleProxyUpdate( - IexecOrderManagementFacet__factory.createInterface(), + new IexecOrderManagementFacet__factory(iexecLibOrders), iexecOrderManagementAddress, ); const iexecPoco1ProxyUpdate = encodeModuleProxyUpdate( - IexecPoco1Facet__factory.createInterface(), + new IexecPoco1Facet__factory(iexecLibOrders), iexecPoco1FacetAddress, ); const iexecPoco2ProxyUpdate = encodeModuleProxyUpdate( - IexecPoco2Facet__factory.createInterface(), + new IexecPoco2Facet__factory(), iexecPoco2FacetAddress, ); const iexecPocoAccessorsProxyUpdate = encodeModuleProxyUpdate( - IexecPocoAccessorsFacet__factory.createInterface(), + new IexecPocoAccessorsFacet__factory(iexecLibOrders), iexecPocoAccessorsFacetAddress, ); // The salt must be the same for a given schedule & execute operation set diff --git a/scripts/upgrades/upgrade-helper.ts b/scripts/upgrades/upgrade-helper.ts index 8b3f9d5ad..829b77c99 100644 --- a/scripts/upgrades/upgrade-helper.ts +++ b/scripts/upgrades/upgrade-helper.ts @@ -1,20 +1,27 @@ // SPDX-FileCopyrightText: 2024-2025 IEXEC BLOCKCHAIN TECH // SPDX-License-Identifier: Apache-2.0 -import { Interface } from 'ethers'; +import { ContractFactory, ZeroAddress } from 'ethers'; import { ethers } from 'hardhat'; -import { ERC1538Query, ERC1538Query__factory, ERC1538Update__factory } from '../../typechain'; - -function encodeModuleProxyUpdate(ModuleInterface: Interface, moduleAddress: string) { - let moduleFunctions = ''; - ModuleInterface.forEachFunction((functionFragment) => { - const func = functionFragment.format(); - console.log(`- ${func}`); - moduleFunctions += func + ';'; - }); - const moduleProxyUpdateData = ERC1538Update__factory.createInterface().encodeFunctionData( - 'updateContract', - [moduleAddress, moduleFunctions, ''], +import { FacetCutAction } from 'hardhat-deploy/dist/types'; +import { DiamondCutFacet__factory, DiamondLoupeFacet__factory } from '../../typechain'; +import { getFunctionSelectors } from '../../utils/proxy-tools'; + +function encodeModuleProxyUpdate(contractFactory: ContractFactory, moduleAddress: string) { + // Get function selectors from the contract factory + const functionSelectors = getFunctionSelectors(contractFactory); + + // Create FacetCut for adding the module + const facetCut = { + facetAddress: moduleAddress, + action: FacetCutAction.Add, + functionSelectors: functionSelectors, + }; + + // Encode diamondCut call + const moduleProxyUpdateData = DiamondCutFacet__factory.createInterface().encodeFunctionData( + 'diamondCut', + [[facetCut], ZeroAddress, '0x'], ); return moduleProxyUpdateData; } @@ -29,17 +36,29 @@ async function printBlockTime() { } } -// TODO: update this function to use DiamondLoup async function printFunctions(diamondProxyAddress: string) { - const diamondQueryInstance: ERC1538Query = ERC1538Query__factory.connect( + const diamondLoupeInstance = DiamondLoupeFacet__factory.connect( diamondProxyAddress, ethers.provider, ); - const functionCount = Number(await diamondQueryInstance.totalFunctions()); - console.log(`DiamondProxy supports ${functionCount} functions:`); - for (let i = 0; i < functionCount; i++) { - const [method, , contract] = await diamondQueryInstance.functionByIndex(i); - console.log(`[${i}] ${contract} ${method}`); + const facets = await diamondLoupeInstance.facets(); + + let totalFunctions = 0; + facets.forEach((facet) => { + totalFunctions += facet.functionSelectors.length; + }); + + console.log(`DiamondProxy supports ${totalFunctions} functions:`); + + let functionIndex = 0; + for (const facet of facets) { + for (const selector of facet.functionSelectors) { + // Try to decode the selector to a readable function signature + // Note: We can't easily get the full function signature from just the selector + // This is a limitation compared to ERC1538Query.functionByIndex + console.log(`[${functionIndex}] ${facet.facetAddress} ${selector}`); + functionIndex++; + } } }