From 7677ebba6121717e8340b6b25877bf4286b8e7f3 Mon Sep 17 00:00:00 2001 From: Giorgi Lagidze Date: Mon, 16 Dec 2024 17:10:52 +0400 Subject: [PATCH 1/5] add update to 1.4.0 --- .../deploy/update/to_v1.4.0/10_DAOFactory.ts | 68 ++++++++++++++++++ .../to_v1.4.0/11_DAOFactory_conclude.ts | 22 ++++++ .../update/to_v1.4.0/20_PluginRepoFactory.ts | 70 +++++++++++++++++++ .../21_PluginRepoFactory_conclude.ts | 28 ++++++++ .../deploy/update/to_v1.4.0/90_ManagingDAO.ts | 44 ++++++++++++ .../99_conclude/00_save-contract-addresses.ts | 10 +-- packages/contracts/hardhat.config.ts | 6 ++ 7 files changed, 244 insertions(+), 4 deletions(-) create mode 100644 packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts create mode 100644 packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts create mode 100644 packages/contracts/deploy/update/to_v1.4.0/20_PluginRepoFactory.ts create mode 100644 packages/contracts/deploy/update/to_v1.4.0/21_PluginRepoFactory_conclude.ts create mode 100644 packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts diff --git a/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts b/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts new file mode 100644 index 000000000..3cf33160a --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts @@ -0,0 +1,68 @@ +import daoFactoryArtifact from '../../../artifacts/src/framework/dao/DAOFactory.sol/DAOFactory.json'; +import {DAO__factory} from '../../../typechain'; +import {getLatestContractAddress} from '../../helpers'; +import {Operation} from '@aragon/osx-commons-sdk'; +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nUpdating DAOFactory'); + const {deployments, ethers} = hre; + const {deploy} = deployments; + const [deployer] = await ethers.getSigners(); + + const managementDAOAddress = getLatestContractAddress( + 'ManagementDAOProxy', + hre + ); + const pluginSetupProcessorAddress = getLatestContractAddress( + 'PluginSetupProcessor', + hre + ); + const daoRegistryAddress = getLatestContractAddress('DAORegistryProxy', hre); + const previousDAOFactoryAddress = getLatestContractAddress('DAOFactory', hre); + console.log(`Using managementDAO ${managementDAOAddress}`); + console.log(`Using PluginSetupProcessor ${pluginSetupProcessorAddress}`); + console.log(`Using DAORegistry ${daoRegistryAddress}`); + console.log(`Using PreviousDAOFactory ${previousDAOFactoryAddress}`); + + const deployResult = await deploy('DAOFactory', { + contract: daoFactoryArtifact, + from: deployer.address, + args: [daoRegistryAddress, pluginSetupProcessorAddress], + log: true, + }); + + const daoInterface = DAO__factory.createInterface(); + const calldata = daoInterface.encodeFunctionData( + 'applyMultiTargetPermissions', + [ + [ + { + who: previousDAOFactoryAddress, + where: daoRegistryAddress, + operation: Operation.Revoke, + permissionId: ethers.utils.id('REGISTER_DAO_PERMISSION'), + condition: ethers.constants.AddressZero, + }, + { + who: deployResult.address, + where: daoRegistryAddress, + operation: Operation.Grant, + permissionId: ethers.utils.id('REGISTER_DAO_PERMISSION'), + condition: ethers.constants.AddressZero, + }, + ], + ] + ); + // update permissions actions + hre.managementDAOActions.push({ + to: managementDAOAddress, + value: 0, + data: calldata, + description: `Moves the REGISTER_DAO_PERMISSION_ID permission on the DAORegistry (${daoRegistryAddress}) from the old DAOFactory (${previousDAOFactoryAddress}) to the new DAOFactory (${deployResult.address}).`, + }); +}; +export default func; +func.tags = ['DAOFactory', 'v1.4.0']; +func.dependencies = ['Env']; diff --git a/packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts b/packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts new file mode 100644 index 000000000..82926ed88 --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/11_DAOFactory_conclude.ts @@ -0,0 +1,22 @@ +import {DAOFactory__factory} from '../../../typechain'; +import {getContractAddress} from '../../helpers'; +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nConcluding DAOFactory update'); + const {deployments, ethers} = hre; + const [deployer] = await ethers.getSigners(); + + const daoFactoryAddress = await getContractAddress('DAOFactory', hre); + const daoFactory = DAOFactory__factory.connect(daoFactoryAddress, deployer); + const daoBase = await daoFactory.callStatic.daoBase(); + + hre.aragonToVerifyContracts.push(await deployments.get('DAOFactory')); + hre.aragonToVerifyContracts.push({ + address: daoBase, + args: [], + }); +}; +export default func; +func.tags = ['DAOFactory', 'Verify', 'v1.4.0']; diff --git a/packages/contracts/deploy/update/to_v1.4.0/20_PluginRepoFactory.ts b/packages/contracts/deploy/update/to_v1.4.0/20_PluginRepoFactory.ts new file mode 100644 index 000000000..7eb42616c --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/20_PluginRepoFactory.ts @@ -0,0 +1,70 @@ +import pluginRepoFactoryArtifact from '../../../artifacts/src/framework/plugin/repo/PluginRepoFactory.sol/PluginRepoFactory.json'; +import {PluginRepo__factory} from '../../../typechain'; +import {getLatestContractAddress} from '../../helpers'; +import {Operation} from '@aragon/osx-commons-sdk'; +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nUpdating PluginRepoFactory'); + const {deployments, ethers} = hre; + const {deploy} = deployments; + const [deployer] = await ethers.getSigners(); + + const managementDAOAddress = getLatestContractAddress( + 'ManagementDAOProxy', + hre + ); + const pluginRepoRegistryAddress = getLatestContractAddress( + 'PluginRepoRegistryProxy', + hre + ); + const previousPluginRepoFactoryAddress = getLatestContractAddress( + 'PluginRepoFactory', + hre + ); + console.log(`Using managementDAO ${managementDAOAddress}`); + console.log(`Using PluginRepoRegistry ${pluginRepoRegistryAddress}`); + console.log( + `Using PreviousPluginRepoFactory ${previousPluginRepoFactoryAddress}` + ); + + const deployResult = await deploy('PluginRepoFactory', { + contract: pluginRepoFactoryArtifact, + from: deployer.address, + args: [pluginRepoRegistryAddress], + log: true, + }); + + const pluginRepoInterface = PluginRepo__factory.createInterface(); + const calldata = pluginRepoInterface.encodeFunctionData( + 'applyMultiTargetPermissions', + [ + [ + { + who: previousPluginRepoFactoryAddress, + where: pluginRepoRegistryAddress, + operation: Operation.Revoke, + permissionId: ethers.utils.id('REGISTER_PLUGIN_REPO_PERMISSION'), + condition: ethers.constants.AddressZero, + }, + { + who: deployResult.address, + where: pluginRepoRegistryAddress, + operation: Operation.Grant, + permissionId: ethers.utils.id('REGISTER_PLUGIN_REPO_PERMISSION'), + condition: ethers.constants.AddressZero, + }, + ], + ] + ); + // update permissions actions + hre.managementDAOActions.push({ + to: managementDAOAddress, + value: 0, + data: calldata, + description: `Moves the REGISTER_PLUGIN_REPO_PERMISSION permission on the PluginRepoRegistry (${pluginRepoRegistryAddress}) from the old PluginRepoFactory (${previousPluginRepoFactoryAddress}) to the new PluginRepoFactory (${deployResult.address}).`, + }); +}; +export default func; +func.tags = ['PluginRepoFactory', 'v1.4.0']; diff --git a/packages/contracts/deploy/update/to_v1.4.0/21_PluginRepoFactory_conclude.ts b/packages/contracts/deploy/update/to_v1.4.0/21_PluginRepoFactory_conclude.ts new file mode 100644 index 000000000..9668b1933 --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/21_PluginRepoFactory_conclude.ts @@ -0,0 +1,28 @@ +import {PluginRepoFactory__factory} from '../../../typechain'; +import {getContractAddress} from '../../helpers'; +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nConcluding PluginRepoFactory update'); + const {deployments, ethers} = hre; + const [deployer] = await ethers.getSigners(); + + const pluginRepoFactoryAddress = await getContractAddress( + 'PluginRepoFactory', + hre + ); + const pluginRepoFactory = PluginRepoFactory__factory.connect( + pluginRepoFactoryAddress, + deployer + ); + const pluginRepoBase = await pluginRepoFactory.callStatic.pluginRepoBase(); + + hre.aragonToVerifyContracts.push(await deployments.get('PluginRepoFactory')); + hre.aragonToVerifyContracts.push({ + address: pluginRepoBase, + args: [], + }); +}; +export default func; +func.tags = ['PluginRepoFactory', 'Verify', 'v1.4.0']; diff --git a/packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts b/packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts new file mode 100644 index 000000000..e09beaf51 --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/90_ManagingDAO.ts @@ -0,0 +1,44 @@ +import {DAOFactory__factory, DAO__factory} from '../../../typechain'; +import {getContractAddress} from '../../helpers'; +import {getProtocolVersion} from '@aragon/osx-commons-sdk'; +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nUpgrade the management DAO to new Implementation'); + + const daoFactoryAddress = await getContractAddress('DAOFactory', hre); + const newDaoImplementation = await DAOFactory__factory.connect( + daoFactoryAddress, + hre.ethers.provider + ).daoBase(); + + const managementDAOAddress = await getContractAddress( + 'ManagementDAOProxy', + hre + ); + const managementDAO = DAO__factory.connect( + managementDAOAddress, + hre.ethers.provider + ); + + const upgradeTX = await managementDAO.populateTransaction.upgradeToAndCall( + newDaoImplementation, + managementDAO.interface.encodeFunctionData('initializeFrom', [ + await getProtocolVersion(managementDAO), + [], + ]) + ); + + if (!upgradeTX.to || !upgradeTX.data) { + throw new Error(`Failed to populate upgradeToAndCall transaction`); + } + hre.managementDAOActions.push({ + to: upgradeTX.to, + data: upgradeTX.data, + value: 0, + description: `Upgrade the management DAO (${managementDAOAddress}) to the new implementation (${newDaoImplementation}).`, + }); +}; +export default func; +func.tags = ['ManagementDAO', 'v1.4.0']; diff --git a/packages/contracts/deploy/verification/99_conclude/00_save-contract-addresses.ts b/packages/contracts/deploy/verification/99_conclude/00_save-contract-addresses.ts index f05871342..20782b6aa 100644 --- a/packages/contracts/deploy/verification/99_conclude/00_save-contract-addresses.ts +++ b/packages/contracts/deploy/verification/99_conclude/00_save-contract-addresses.ts @@ -42,10 +42,12 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { console.log(`${pluginRepo}: ${aragonPluginRepos[pluginRepo]}`); } - await fs.writeFile( - 'deployed_contracts.json', - JSON.stringify(deployedContractAddresses) - ); + const storeInfo = { + deployedContractAddresses, + managementDAOActions: hre.managementDAOActions, + }; + + await fs.writeFile('deployed_contracts.json', JSON.stringify(storeInfo)); }; export default func; func.tags = ['New', 'Conclude', 'ConcludeEnd']; diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 17fc8a56d..18bceb282 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -36,6 +36,12 @@ for (const network of Object.keys(hardhatNetworks) as SupportedNetworks[]) { if (network === SupportedNetworks.LOCAL) { continue; } + + if (networkExtensions[network] == undefined) { + console.log(`WARNING: newtork ${network} is not found in networks.ts file`); + continue; + } + hardhatNetworks[network].accounts = accounts; hardhatNetworks[network].deploy = networkExtensions[network].deploy; } From b2a2f1549cc0103a2ecb458e7729e7272795c880 Mon Sep 17 00:00:00 2001 From: Giorgi Lagidze Date: Tue, 17 Dec 2024 13:29:56 +0400 Subject: [PATCH 2/5] add tests --- .../contracts/test/deploy/update-1.4.0.ts | 155 ++++++++++++++++++ packages/contracts/test/test-utils/fixture.ts | 6 +- 2 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 packages/contracts/test/deploy/update-1.4.0.ts diff --git a/packages/contracts/test/deploy/update-1.4.0.ts b/packages/contracts/test/deploy/update-1.4.0.ts new file mode 100644 index 000000000..0617d8b86 --- /dev/null +++ b/packages/contracts/test/deploy/update-1.4.0.ts @@ -0,0 +1,155 @@ +import {getLatestContractAddress} from '../../deploy/helpers'; +import {DAO, DAO__factory} from '../../typechain'; +import { + initForkForOsxVersion, + initializeDeploymentFixture, + initializeFork, +} from '../test-utils/fixture'; +import {SignerWithAddress} from '@nomiclabs/hardhat-ethers/signers'; +import {expect} from 'chai'; +import hre, {ethers, deployments} from 'hardhat'; + +async function forkSepolia() { + hre.network.deploy = ['./deploy/update/to_v1.4.0']; + + // console.log(hre); + await initForkForOsxVersion('sepolia', { + version: '1.3.0', + forkBlockNumber: 7296100, + activeContracts: [], + }); +} + +function getAddress(name: string) { + return getLatestContractAddress(name, hre); +} + +type Permission = { + where: string; + who: string; + isSet: boolean; +}; + +async function validatePermissions(dao: DAO, p1: Permission, p2: Permission) { + const registerDAOPermission = ethers.utils.id('REGISTER_DAO_PERMISSION'); + const registerPluginRepoPermission = ethers.utils.id( + 'REGISTER_PLUGIN_REPO_PERMISSION' + ); + + expect( + await dao.hasPermission(p1.where, p1.who, registerDAOPermission, '0x') + ).to.be.equal(p1.isSet); + expect( + await dao.hasPermission( + p2.where, + p2.who, + registerPluginRepoPermission, + '0x' + ) + ).to.be.equal(p2.isSet); +} + +async function impersonateAccount(addr: string) { + await hre.network.provider.send('hardhat_setBalance', [ + addr, + '0x100000000000000', + ]); + + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [addr], + }); + + return ethers.getSigner(addr); +} + +// This will need to be skipped after managing dao and framework is upgraded to 1.4.0 +// and addresses are added in osx-commons. This is because update script and the below tests +// use `getLatestContractAddress` which is currently 1.3.0, but once update to 1.4.0 happens, +// getLatestContractAddress then will return 1.4.0 addresses. +describe('Update to 1.4.0', function () { + let deployer: SignerWithAddress; + + before(async () => { + await forkSepolia(); + + [deployer] = await ethers.getSigners(); + }); + + it('should update dao and set permissions correctly', async () => { + const daoRegistryAddress = getAddress('DAORegistryProxy'); + const previousDAOFactoryAddress = getAddress('DAOFactory'); + + const pluginRepoRegistry = getAddress('PluginRepoRegistryProxy'); + const previousPluginRepoFactory = getAddress('PluginRepoFactory'); + + const managementDAOAddress = getAddress('ManagementDAOProxy'); + + const dao = DAO__factory.connect(managementDAOAddress, deployer); + + const multisigAddr = '0xfcead61339e3e73090b587968fce8b090e0600ef'; + + await validatePermissions( + dao, + { + where: daoRegistryAddress, + who: previousDAOFactoryAddress, + isSet: true, + }, + { + where: pluginRepoRegistry, + who: previousPluginRepoFactory, + isSet: true, + } + ); + + expect(await dao.protocolVersion()).to.deep.equal([1, 3, 0]); + + await initializeDeploymentFixture('v1.4.0'); + + let actions = hre.managementDAOActions.map(item => { + return {to: item.to, value: item.value, data: item.data}; + }); + + const signer = await impersonateAccount(multisigAddr); + + await dao + .connect(signer) + .execute(ethers.utils.id('someCallId'), actions, 0); + + await validatePermissions( + dao, + { + where: daoRegistryAddress, + who: previousDAOFactoryAddress, + isSet: false, + }, + { + where: pluginRepoRegistry, + who: previousPluginRepoFactory, + isSet: false, + } + ); + + const newDAOFactoryAddress = (await deployments.get('DAOFactory')).address; + const newPluginRepoFactoryAddress = ( + await deployments.get('PluginRepoFactory') + ).address; + + await validatePermissions( + dao, + { + where: daoRegistryAddress, + who: newDAOFactoryAddress, + isSet: true, + }, + { + where: pluginRepoRegistry, + who: newPluginRepoFactoryAddress, + isSet: true, + } + ); + + expect(await dao.protocolVersion()).to.deep.equal([1, 4, 0]); + }); +}); diff --git a/packages/contracts/test/test-utils/fixture.ts b/packages/contracts/test/test-utils/fixture.ts index 54b5ac409..1b2b206de 100644 --- a/packages/contracts/test/test-utils/fixture.ts +++ b/packages/contracts/test/test-utils/fixture.ts @@ -12,7 +12,9 @@ export async function initializeFork( forkNetwork: string, blockNumber: number ): Promise { - if (getNetworkByNameOrAlias(forkNetwork) === null) { + const networkSettings = getNetworkByNameOrAlias(forkNetwork); + + if (networkSettings === null) { throw new Error(`No info found for network '${forkNetwork}'.`); } @@ -21,7 +23,7 @@ export async function initializeFork( params: [ { forking: { - jsonRpcUrl: `${(networks as any)[forkNetwork].url}`, + jsonRpcUrl: networkSettings.url, blockNumber: blockNumber, }, }, From ecf68b10d5e197b09ecba7d6cb31b833e640e0ec Mon Sep 17 00:00:00 2001 From: Giorgi Lagidze Date: Fri, 10 Jan 2025 11:37:37 +0400 Subject: [PATCH 3/5] remove ens --- packages/contracts/hardhat.config.ts | 2 +- .../src/framework/dao/DAORegistry.sol | 7 ++++ .../plugin/repo/PluginRepoRegistry.sol | 22 ++++++------ .../test/framework/dao/dao-registry.ts | 21 ++++++++++++ .../framework/plugin/plugin-repo-factory.ts | 28 --------------- .../framework/plugin/plugin-repo-registry.ts | 34 +++++++++++++++++++ 6 files changed, 75 insertions(+), 39 deletions(-) diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 17fc8a56d..15a824ad6 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -37,7 +37,7 @@ for (const network of Object.keys(hardhatNetworks) as SupportedNetworks[]) { continue; } hardhatNetworks[network].accounts = accounts; - hardhatNetworks[network].deploy = networkExtensions[network].deploy; + // hardhatNetworks[network].deploy = networkExtensions[network].deploy; } // Extend HardhatRuntimeEnvironment diff --git a/packages/contracts/src/framework/dao/DAORegistry.sol b/packages/contracts/src/framework/dao/DAORegistry.sol index 1e4c5976b..816cfaf7b 100644 --- a/packages/contracts/src/framework/dao/DAORegistry.sol +++ b/packages/contracts/src/framework/dao/DAORegistry.sol @@ -23,6 +23,9 @@ contract DAORegistry is InterfaceBasedRegistry, ProtocolVersion { /// @notice Thrown if the DAO subdomain doesn't match the regex `[0-9a-z\-]` error InvalidDaoSubdomain(string subdomain); + /// @notice Thrown if the subdomain is present, but registrar is address(0). + error ENSNotSupported(); + /// @notice Emitted when a new DAO is registered. /// @param dao The address of the DAO contract. /// @param creator The address of the creator. @@ -61,6 +64,10 @@ contract DAORegistry is InterfaceBasedRegistry, ProtocolVersion { _register(daoAddr); if ((bytes(subdomain).length > 0)) { + if (address(subdomainRegistrar) == address(0)) { + revert ENSNotSupported(); + } + if (!isSubdomainValid(subdomain)) { revert InvalidDaoSubdomain({subdomain: subdomain}); } diff --git a/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol b/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol index deca396b7..6f58e8df3 100644 --- a/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol +++ b/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol @@ -29,8 +29,8 @@ contract PluginRepoRegistry is InterfaceBasedRegistry, ProtocolVersion { /// @notice Thrown if the plugin subdomain doesn't match the regex `[0-9a-z\-]` error InvalidPluginSubdomain(string subdomain); - /// @notice Thrown if the plugin repository subdomain is empty. - error EmptyPluginRepoSubdomain(); + /// @notice Thrown if the subdomain is present, but registrar is address(0). + error ENSNotSupported(); /// @dev Used to disallow initializing the implementation contract by an attacker for extra safety. /// @custom:oz-upgrades-unsafe-allow constructor @@ -55,16 +55,18 @@ contract PluginRepoRegistry is InterfaceBasedRegistry, ProtocolVersion { string calldata subdomain, address pluginRepo ) external auth(REGISTER_PLUGIN_REPO_PERMISSION_ID) { - if (!(bytes(subdomain).length > 0)) { - revert EmptyPluginRepoSubdomain(); - } + if (bytes(subdomain).length > 0) { + if (address(subdomainRegistrar) == address(0)) { + revert ENSNotSupported(); + } - if (!isSubdomainValid(subdomain)) { - revert InvalidPluginSubdomain({subdomain: subdomain}); - } + if (!isSubdomainValid(subdomain)) { + revert InvalidPluginSubdomain({subdomain: subdomain}); + } - bytes32 labelhash = keccak256(bytes(subdomain)); - subdomainRegistrar.registerSubnode(labelhash, pluginRepo); + bytes32 labelhash = keccak256(bytes(subdomain)); + subdomainRegistrar.registerSubnode(labelhash, pluginRepo); + } _register(pluginRepo); diff --git a/packages/contracts/test/framework/dao/dao-registry.ts b/packages/contracts/test/framework/dao/dao-registry.ts index 0db18d55b..c5c52ee1b 100644 --- a/packages/contracts/test/framework/dao/dao-registry.ts +++ b/packages/contracts/test/framework/dao/dao-registry.ts @@ -165,6 +165,27 @@ describe('DAORegistry', function () { .withArgs(daoDomainHash, ensSubdomainRegistrar.address); }); + it('Should revert if ens is not supported, but subdomain is still non empty', async function () { + const Registry = new DAORegistry__factory(signers[0]); + + const daoRegistry = (await deployWithProxy(Registry)) as DAORegistry; + + await daoRegistry.initialize( + managingDao.address, + ethers.constants.AddressZero + ); + + await managingDao.grant( + daoRegistry.address, + ownerAddress, + DAO_REGISTRY_PERMISSIONS.REGISTER_DAO_PERMISSION_ID + ); + + await expect( + daoRegistry.register(targetDao.address, ownerAddress, 'some') + ).to.be.revertedWithCustomError(daoRegistry, 'ENSNotSupported'); + }); + // without mocking we have to repeat the tests here to make sure the validation is correct describe('subdomain validation', () => { it('should validate the passed subdomain correctly (< 32 bytes long subdomain)', async () => { diff --git a/packages/contracts/test/framework/plugin/plugin-repo-factory.ts b/packages/contracts/test/framework/plugin/plugin-repo-factory.ts index de985f09c..73fadfa6d 100644 --- a/packages/contracts/test/framework/plugin/plugin-repo-factory.ts +++ b/packages/contracts/test/framework/plugin/plugin-repo-factory.ts @@ -140,17 +140,6 @@ describe('PluginRepoFactory: ', function () { ); }); - it('fail to create new pluginRepo with empty subdomain', async () => { - const pluginRepoSubdomain = ''; - - await expect( - pluginRepoFactory.createPluginRepo(pluginRepoSubdomain, ownerAddress) - ).to.be.revertedWithCustomError( - pluginRepoRegistry, - 'EmptyPluginRepoSubdomain' - ); - }); - it('creates new pluginRepo and sets up correct permissions', async () => { const pluginRepoSubdomain = 'my-plugin-repo'; const expectedRepoAddress = await getExpectedRepoAddress( @@ -224,23 +213,6 @@ describe('PluginRepoFactory: ', function () { ); }); - it('fail to create new pluginRepo with empty subdomain', async () => { - const pluginRepoSubdomain = ''; - - await expect( - pluginRepoFactory.createPluginRepoWithFirstVersion( - pluginRepoSubdomain, - ownerAddress, - ownerAddress, - '0x', - '0x' - ) - ).to.be.revertedWithCustomError( - pluginRepoRegistry, - 'EmptyPluginRepoSubdomain' - ); - }); - it('creates new pluginRepo with correct permissions', async () => { const pluginRepoSubdomain = 'my-plugin-repo'; const pluginSetupMock = await deployMockPluginSetup(signers[0]); diff --git a/packages/contracts/test/framework/plugin/plugin-repo-registry.ts b/packages/contracts/test/framework/plugin/plugin-repo-registry.ts index df044a39d..f86f7ff3d 100644 --- a/packages/contracts/test/framework/plugin/plugin-repo-registry.ts +++ b/packages/contracts/test/framework/plugin/plugin-repo-registry.ts @@ -106,6 +106,40 @@ describe('PluginRepoRegistry', function () { expect(await pluginRepoRegistry.entries(pluginRepo.address)).to.equal(true); }); + it('Should register a new pluginRepo successfully even if subdomain is empty', async function () { + const subdomain = ''; + + await expect( + await pluginRepoRegistry.registerPluginRepo(subdomain, pluginRepo.address) + ) + .to.emit(pluginRepoRegistry, EVENTS.PluginRepoRegistered) + .withArgs(subdomain, pluginRepo.address); + + expect(await pluginRepoRegistry.entries(pluginRepo.address)).to.equal(true); + }); + + it('Should revert if ens is not supported, but subdomain is still non empty', async function () { + const PluginRepoRegistry = new PluginRepoRegistry__factory(signers[0]); + pluginRepoRegistry = await deployWithProxy( + PluginRepoRegistry + ); + + await pluginRepoRegistry.initialize( + managingDAO.address, + ethers.constants.AddressZero + ); + + await managingDAO.grant( + pluginRepoRegistry.address, + ownerAddress, + PLUGIN_REGISTRY_PERMISSIONS.REGISTER_PLUGIN_REPO_PERMISSION_ID + ); + + await expect( + pluginRepoRegistry.registerPluginRepo('some', pluginRepo.address) + ).to.be.revertedWithCustomError(pluginRepoRegistry, 'ENSNotSupported'); + }); + it('fail to register if the sender lacks the required role', async () => { // Register a plugin successfully await pluginRepoRegistry.registerPluginRepo( From a0af1c18d4b1fafc3f4542c6f5af65b1af3426f7 Mon Sep 17 00:00:00 2001 From: Giorgi Lagidze Date: Fri, 10 Jan 2025 13:25:38 +0400 Subject: [PATCH 4/5] add upgrades for daoregistry+pluginreporegistry --- .../deploy/update/to_v1.4.0/10_DAOFactory.ts | 1 + .../deploy/update/to_v1.4.0/31_DAORegistry.ts | 50 ++++ .../update/to_v1.4.0/41_PluginRepoRegistry.ts | 53 +++++ packages/contracts/hardhat.config.ts | 2 +- packages/contracts/package.json | 2 +- .../contracts/test/deploy/update-1.4.0.ts | 100 ++++++-- packages/contracts/test/test-utils/fixture.ts | 1 - yarn.lock | 218 ++++++++++++++---- 8 files changed, 368 insertions(+), 59 deletions(-) create mode 100644 packages/contracts/deploy/update/to_v1.4.0/31_DAORegistry.ts create mode 100644 packages/contracts/deploy/update/to_v1.4.0/41_PluginRepoRegistry.ts diff --git a/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts b/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts index 3cf33160a..24ee600eb 100644 --- a/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts +++ b/packages/contracts/deploy/update/to_v1.4.0/10_DAOFactory.ts @@ -19,6 +19,7 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { 'PluginSetupProcessor', hre ); + const daoRegistryAddress = getLatestContractAddress('DAORegistryProxy', hre); const previousDAOFactoryAddress = getLatestContractAddress('DAOFactory', hre); console.log(`Using managementDAO ${managementDAOAddress}`); diff --git a/packages/contracts/deploy/update/to_v1.4.0/31_DAORegistry.ts b/packages/contracts/deploy/update/to_v1.4.0/31_DAORegistry.ts new file mode 100644 index 000000000..11c3fc678 --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/31_DAORegistry.ts @@ -0,0 +1,50 @@ +import daoRegistryArtifact from '../../../artifacts/src/framework/dao/DAORegistry.sol/DAORegistry.json'; +import { + DAOFactory__factory, + DAORegistry__factory, + DAO__factory, +} from '../../../typechain'; +import {DAORegistry} from '../../../typechain/@aragon/osx-v1.0.1/framework/dao/DAORegistry.sol'; +import {getContractAddress} from '../../helpers'; +import {getProtocolVersion} from '@aragon/osx-commons-sdk'; +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nUpgrade the DAORegistry to new Implementation'); + + const {deployments, ethers} = hre; + const {deploy} = deployments; + const [deployer] = await ethers.getSigners(); + + const daoRegistryAddress = await getContractAddress('DAORegistryProxy', hre); + const daoRegistry = DAORegistry__factory.connect( + daoRegistryAddress, + hre.ethers.provider + ); + + const result = await deploy('DAORegistryImplementation', { + contract: daoRegistryArtifact, + from: deployer.address, + args: [], + log: true, + }); + + const upgradeTX = await daoRegistry.populateTransaction.upgradeTo( + result.address + ); + + if (!upgradeTX.to || !upgradeTX.data) { + throw new Error(`Failed to populate upgradeToAndCall transaction`); + } + + console.log(result.address, ' fuck 2'); + hre.managementDAOActions.push({ + to: upgradeTX.to, + data: upgradeTX.data, + value: 0, + description: `Upgrade the DaoRegistry (${daoRegistryAddress}) to the new implementation (${result.address}).`, + }); +}; +export default func; +func.tags = ['DAORegistry', 'v1.4.0']; diff --git a/packages/contracts/deploy/update/to_v1.4.0/41_PluginRepoRegistry.ts b/packages/contracts/deploy/update/to_v1.4.0/41_PluginRepoRegistry.ts new file mode 100644 index 000000000..6bc116c1b --- /dev/null +++ b/packages/contracts/deploy/update/to_v1.4.0/41_PluginRepoRegistry.ts @@ -0,0 +1,53 @@ +import pluginRepoRegistryArtifact from '../../../artifacts/src/framework/plugin/repo/PluginRepoRegistry.sol/PluginRepoRegistry.json'; +import { + DAOFactory__factory, + DAORegistry__factory, + DAO__factory, + PluginRepoRegistry__factory, +} from '../../../typechain'; +import {DAORegistry} from '../../../typechain/@aragon/osx-v1.0.1/framework/dao/DAORegistry.sol'; +import {getContractAddress} from '../../helpers'; +import {getProtocolVersion} from '@aragon/osx-commons-sdk'; +import {DeployFunction} from 'hardhat-deploy/types'; +import {HardhatRuntimeEnvironment} from 'hardhat/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + console.log('\nUpgrade the pluginRepoRegistry to new Implementation'); + + const {deployments, ethers} = hre; + const {deploy} = deployments; + const [deployer] = await ethers.getSigners(); + + const pluginRepoRegistryAddress = await getContractAddress( + 'PluginRepoRegistryProxy', + hre + ); + const pluginRepoRegistry = PluginRepoRegistry__factory.connect( + pluginRepoRegistryAddress, + hre.ethers.provider + ); + + const result = await deploy('PluginRepoRegistryImplementation', { + contract: pluginRepoRegistryArtifact, + from: deployer.address, + args: [], + log: true, + }); + + const upgradeTX = await pluginRepoRegistry.populateTransaction.upgradeTo( + result.address + ); + + if (!upgradeTX.to || !upgradeTX.data) { + throw new Error(`Failed to populate upgradeToAndCall transaction`); + } + + hre.managementDAOActions.push({ + to: upgradeTX.to, + data: upgradeTX.data, + value: 0, + description: `Upgrade the PluginRepoRegistry (${pluginRepoRegistryAddress}) to the new implementation (${result.address}).`, + }); +}; +export default func; +func.tags = ['PluginRepoRegistry', 'v1.4.0']; diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 01fcfc704..18bceb282 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -43,7 +43,7 @@ for (const network of Object.keys(hardhatNetworks) as SupportedNetworks[]) { } hardhatNetworks[network].accounts = accounts; - // hardhatNetworks[network].deploy = networkExtensions[network].deploy; + hardhatNetworks[network].deploy = networkExtensions[network].deploy; } // Extend HardhatRuntimeEnvironment diff --git a/packages/contracts/package.json b/packages/contracts/package.json index f5f51ec84..81db2d7a8 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -77,7 +77,7 @@ "eslint-plugin-promise": "^5.1.1", "ethereumjs-util": "^7.1.4", "ethers": "^5.7.0", - "hardhat": "^2.12.7", + "hardhat": "^2.22.15", "hardhat-deploy": "^0.9.26", "hardhat-gas-reporter": "^1.0.4", "ipfs-http-client": "51.0.0", diff --git a/packages/contracts/test/deploy/update-1.4.0.ts b/packages/contracts/test/deploy/update-1.4.0.ts index 0617d8b86..aab499b78 100644 --- a/packages/contracts/test/deploy/update-1.4.0.ts +++ b/packages/contracts/test/deploy/update-1.4.0.ts @@ -1,14 +1,25 @@ import {getLatestContractAddress} from '../../deploy/helpers'; -import {DAO, DAO__factory} from '../../typechain'; +import { + DAO, + DAO__factory, + DAOFactory__factory, + DAORegistry__factory, + PluginRepoRegistry__factory, +} from '../../typechain'; import { initForkForOsxVersion, initializeDeploymentFixture, initializeFork, } from '../test-utils/fixture'; import {SignerWithAddress} from '@nomiclabs/hardhat-ethers/signers'; +import {getContractAddress} from '@openzeppelin/hardhat-upgrades/dist/utils'; import {expect} from 'chai'; +import {defaultAbiCoder} from 'ethers/lib/utils'; import hre, {ethers, deployments} from 'hardhat'; +const IMPLEMENTATION_ADDRESS_SLOT = + '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc'; + async function forkSepolia() { hre.network.deploy = ['./deploy/update/to_v1.4.0']; @@ -24,6 +35,17 @@ function getAddress(name: string) { return getLatestContractAddress(name, hre); } +async function assertImplementation(contract: string, expected: string) { + const actual = defaultAbiCoder + .decode( + ['address'], + await ethers.provider.getStorageAt(contract, IMPLEMENTATION_ADDRESS_SLOT) + )[0] + .toLowerCase(); + + expect(actual).to.equal(expected.toLowerCase()); +} + type Permission = { where: string; who: string; @@ -76,34 +98,60 @@ describe('Update to 1.4.0', function () { [deployer] = await ethers.getSigners(); }); - it('should update dao and set permissions correctly', async () => { - const daoRegistryAddress = getAddress('DAORegistryProxy'); - const previousDAOFactoryAddress = getAddress('DAOFactory'); - - const pluginRepoRegistry = getAddress('PluginRepoRegistryProxy'); + it('should update dao, daoRegistry, PluginRepoRegistry and set permissions correctly', async () => { const previousPluginRepoFactory = getAddress('PluginRepoFactory'); + const previousDAOFactoryAddress = getAddress('DAOFactory'); - const managementDAOAddress = getAddress('ManagementDAOProxy'); - - const dao = DAO__factory.connect(managementDAOAddress, deployer); + const dao = DAO__factory.connect( + getAddress('ManagementDAOProxy'), + deployer + ); + const daoRegistry = DAORegistry__factory.connect( + getAddress('DAORegistryProxy'), + deployer + ); + const pluginRepoRegistry = PluginRepoRegistry__factory.connect( + getAddress('PluginRepoRegistryProxy'), + deployer + ); const multisigAddr = '0xfcead61339e3e73090b587968fce8b090e0600ef'; await validatePermissions( dao, { - where: daoRegistryAddress, + where: daoRegistry.address, who: previousDAOFactoryAddress, isSet: true, }, { - where: pluginRepoRegistry, + where: pluginRepoRegistry.address, who: previousPluginRepoFactory, isSet: true, } ); expect(await dao.protocolVersion()).to.deep.equal([1, 3, 0]); + await expect(daoRegistry.protocolVersion()).to.be.reverted; + await expect(pluginRepoRegistry.protocolVersion()).to.be.reverted; + + const oldDaoImplementation = await DAOFactory__factory.connect( + previousDAOFactoryAddress, + hre.ethers.provider + ).daoBase(); + + await assertImplementation( + dao.address, + getLatestContractAddress('ManagementDAOImplementation', hre) + ); + await assertImplementation( + daoRegistry.address, + getLatestContractAddress('DAORegistryImplementation', hre) + ); + await assertImplementation( + pluginRepoRegistry.address, + getLatestContractAddress('PluginRepoRegistryImplementation', hre) + ); await initializeDeploymentFixture('v1.4.0'); @@ -120,12 +168,12 @@ describe('Update to 1.4.0', function () { await validatePermissions( dao, { - where: daoRegistryAddress, + where: daoRegistry.address, who: previousDAOFactoryAddress, isSet: false, }, { - where: pluginRepoRegistry, + where: pluginRepoRegistry.address, who: previousPluginRepoFactory, isSet: false, } @@ -139,17 +187,39 @@ describe('Update to 1.4.0', function () { await validatePermissions( dao, { - where: daoRegistryAddress, + where: daoRegistry.address, who: newDAOFactoryAddress, isSet: true, }, { - where: pluginRepoRegistry, + where: pluginRepoRegistry.address, who: newPluginRepoFactoryAddress, isSet: true, } ); expect(await dao.protocolVersion()).to.deep.equal([1, 4, 0]); + expect(await daoRegistry.protocolVersion()).to.deep.equal([1, 4, 0]); + expect(await pluginRepoRegistry.protocolVersion()).to.deep.equal([1, 4, 0]); + + const daoFactoryAddress = (await deployments.get('DAOFactory')).address; + const newDaoImplementation = await DAOFactory__factory.connect( + daoFactoryAddress, + hre.ethers.provider + ).daoBase(); + + await assertImplementation(dao.address, newDaoImplementation); + await assertImplementation( + daoRegistry.address, + ( + await deployments.get('DAORegistryImplementation') + ).address + ); + await assertImplementation( + pluginRepoRegistry.address, + ( + await deployments.get('PluginRepoRegistryImplementation') + ).address + ); }); }); diff --git a/packages/contracts/test/test-utils/fixture.ts b/packages/contracts/test/test-utils/fixture.ts index 1b2b206de..116c4f10f 100644 --- a/packages/contracts/test/test-utils/fixture.ts +++ b/packages/contracts/test/test-utils/fixture.ts @@ -1,4 +1,3 @@ -import networks from '../../networks'; import {getNetworkByNameOrAlias} from '@aragon/osx-commons-configs'; import hre, {network, deployments} from 'hardhat'; diff --git a/yarn.lock b/yarn.lock index 70ecd24fc..5f0a1f1c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,7 +17,7 @@ dependencies: tslib "^2.6.2" -"@aragon/osx-commons-contracts@^1.4.0-alpha.5": +"@aragon/osx-commons-contracts@1.4.0-alpha.5": version "1.4.0-alpha.5" resolved "https://registry.yarnpkg.com/@aragon/osx-commons-contracts/-/osx-commons-contracts-1.4.0-alpha.5.tgz#37a28085677c21216628ba0a05f5fe09489eb71c" integrity sha512-F2JWWxmUNmiJsaXcTDyd6F2GUIgnc313vvWTp/cSmSVkccT2pfMleWqxIi4LIodX3ueFUYfE02rLj8Gjp1jljA== @@ -2702,6 +2702,54 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/edr-darwin-arm64@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz#37a31565d7ef42bed9028ac44aed82144de30bd1" + integrity sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw== + +"@nomicfoundation/edr-darwin-x64@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz#3252f6e86397af460b7a480bfe1b889464d75b89" + integrity sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w== + +"@nomicfoundation/edr-linux-arm64-gnu@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz#e7dc2934920b6cfabeb5ee7a5e26c8fb0d4964ac" + integrity sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A== + +"@nomicfoundation/edr-linux-arm64-musl@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz#00459cd53e9fb7bd5b7e32128b508a6e89079d89" + integrity sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ== + +"@nomicfoundation/edr-linux-x64-gnu@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz#5c9e4e2655caba48e0196977cba395bbde6fe97d" + integrity sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg== + +"@nomicfoundation/edr-linux-x64-musl@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz#9c220751b66452dc43a365f380e1e236a0a8c5a9" + integrity sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A== + +"@nomicfoundation/edr-win32-x64-msvc@0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz#90d3ac2a6a8a687522bda5ff2e92dd97e68126ea" + integrity sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A== + +"@nomicfoundation/edr@^0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.6.5.tgz#b3b1ebcdd0148cfe67cca128e7ebe8092e200359" + integrity sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.6.5" + "@nomicfoundation/edr-darwin-x64" "0.6.5" + "@nomicfoundation/edr-linux-arm64-gnu" "0.6.5" + "@nomicfoundation/edr-linux-arm64-musl" "0.6.5" + "@nomicfoundation/edr-linux-x64-gnu" "0.6.5" + "@nomicfoundation/edr-linux-x64-musl" "0.6.5" + "@nomicfoundation/edr-win32-x64-msvc" "0.6.5" + "@nomicfoundation/ethereumjs-block@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" @@ -2732,6 +2780,13 @@ lru-cache "^5.1.1" memory-level "^1.0.0" +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/ethereumjs-common@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" @@ -2766,6 +2821,11 @@ mcl-wasm "^0.7.1" rustbn.js "~0.2.0" +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== + "@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": version "4.0.0" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" @@ -2794,6 +2854,16 @@ ethereum-cryptography "0.1.3" readable-stream "^3.6.0" +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + ethereum-cryptography "0.1.3" + "@nomicfoundation/ethereumjs-tx@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" @@ -2804,6 +2874,14 @@ "@nomicfoundation/ethereumjs-util" "^8.0.0" ethereum-cryptography "0.1.3" +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + ethereum-cryptography "0.1.3" + "@nomicfoundation/ethereumjs-util@^8.0.0", "@nomicfoundation/ethereumjs-util@^8.0.0-rc.3": version "8.0.0" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" @@ -2812,7 +2890,7 @@ "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-vm@^6.0.0", "@nomicfoundation/ethereumjs-vm@^6.0.0-rc.3": +"@nomicfoundation/ethereumjs-vm@^6.0.0-rc.3": version "6.0.0" resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== @@ -3984,6 +4062,13 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" @@ -4519,6 +4604,20 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4813,7 +4912,7 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -5061,7 +5160,7 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" -chokidar@^3.4.0, chokidar@^3.5.2: +chokidar@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== @@ -5076,6 +5175,13 @@ chokidar@^3.4.0, chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + chownr@^1.0.1, chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -5138,6 +5244,11 @@ clean-stack@^3.0.1: dependencies: escape-string-regexp "4.0.0" +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -5354,16 +5465,16 @@ commander@2.18.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" integrity sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ== -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-tags@1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" @@ -7115,6 +7226,11 @@ fbjs@^3.0.0: setimmediate "^1.0.5" ua-parser-js "^1.0.35" +fdir@^6.4.2: + version "6.4.2" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -7197,7 +7313,7 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -7932,57 +8048,51 @@ hardhat-gas-reporter@^1.0.4: eth-gas-reporter "^0.2.20" sha1 "^1.1.1" -hardhat@^2.12.7: - version "2.12.7" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.7.tgz#d8de2dc32e9a2956d53cf26ef4cd5857e57a3138" - integrity sha512-voWoN6zn5d8BOEaczSyK/1PyfdeOeI3SbGCFb36yCHTJUt6OIqLb+ZDX30VhA1UsYKzLqG7UnWl3fKJUuANc6A== +hardhat@^2.22.15: + version "2.22.17" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.17.tgz#96036bbe6bad8eb6a6b65c54dc5fbc1324541612" + integrity sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@nomicfoundation/ethereumjs-vm" "^6.0.0" + "@nomicfoundation/edr" "^0.6.5" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" - chalk "^2.4.2" - chokidar "^3.4.0" + boxen "^5.1.2" + chokidar "^4.0.0" ci-info "^2.0.0" debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - find-up "^2.1.0" + find-up "^5.0.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + json-stream-stringify "^3.1.4" keccak "^3.0.2" lodash "^4.17.11" mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" + picocolors "^1.1.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - solc "0.7.3" + solc "0.8.26" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" + tinyglobby "^0.2.6" tsort "0.0.1" undici "^5.14.0" uuid "^8.3.2" @@ -9288,6 +9398,11 @@ json-stable-stringify@^1.0.1: jsonify "^0.0.1" object-keys "^1.1.1" +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -10960,6 +11075,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" @@ -10970,6 +11090,11 @@ picomatch@^2.2.2, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -11200,7 +11325,7 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: +qs@^6.4.0, qs@^6.9.4: version "6.10.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== @@ -11329,6 +11454,11 @@ readable-stream@~1.0.26-4: isarray "0.0.1" string_decoder "~0.10.x" +readdirp@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" + integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== + readdirp@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" @@ -11486,7 +11616,7 @@ require-from-string@^1.1.0: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= -require-from-string@^2.0.0, require-from-string@^2.0.2: +require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -12058,18 +12188,16 @@ snake-case@^3.0.4: dot-case "^3.0.4" tslib "^2.0.3" -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" - commander "3.0.2" + commander "^8.1.0" follow-redirects "^1.12.1" - fs-extra "^0.30.0" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -12313,7 +12441,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -12672,6 +12800,14 @@ timeout-abort-controller@^2.0.0: native-abort-controller "^1.0.4" retimer "^3.0.0" +tinyglobby@^0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.10.tgz#e712cf2dc9b95a1f5c5bbd159720e15833977a0f" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + title-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" From 29634df5e165dedceb0c444426805006da1a662f Mon Sep 17 00:00:00 2001 From: Giorgi Lagidze Date: Fri, 10 Jan 2025 13:27:16 +0400 Subject: [PATCH 5/5] comment --- .../contracts/src/framework/plugin/repo/PluginRepoRegistry.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol b/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol index 6f58e8df3..83d0b1789 100644 --- a/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol +++ b/packages/contracts/src/framework/plugin/repo/PluginRepoRegistry.sol @@ -49,6 +49,7 @@ contract PluginRepoRegistry is InterfaceBasedRegistry, ProtocolVersion { } /// @notice Registers a plugin repository with a subdomain and address. + /// @dev If subdomain is empty, registration on ENS is skipped. /// @param subdomain The subdomain of the PluginRepo. /// @param pluginRepo The address of the PluginRepo contract. function registerPluginRepo(