Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 2 additions & 10 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -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:
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
17 changes: 13 additions & 4 deletions scripts/boost/1_add-modules-to-proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -24,19 +24,28 @@ 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 = (
await deployments.get('IexecPocoBoostAccessorsFacet')
).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
Expand Down
17 changes: 13 additions & 4 deletions scripts/sponsoring/1_add-modules-to-proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down
59 changes: 39 additions & 20 deletions scripts/upgrades/upgrade-helper.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
// SPDX-FileCopyrightText: 2024-2025 IEXEC BLOCKCHAIN TECH <contact@iex.ec>
// 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;
}
Expand All @@ -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++;
}
}
}

Expand Down