From 9c4afac85f6c6e5f72d801db628de334e1dadc23 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Fri, 24 May 2024 07:50:01 +0000 Subject: [PATCH 01/19] add ignition experiment --- .gitignore | 4 +++- .vscode/settings.json | 2 +- hardhat.config.ts | 9 ++++++++- ignition/modules/Token.ts | 30 ++++++++++++++++++++++++++++++ package-lock.json | 2 +- package.json | 1 + 6 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 ignition/modules/Token.ts diff --git a/.gitignore b/.gitignore index 6e1d007f6..f736f74b0 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,6 @@ test_brownie/__pycache__ *.log deployment_state_*.json lcov.info -.*.drawio.bkp \ No newline at end of file +.*.drawio.bkp + +ignition/deployments/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index c3212f98d..0a5b05108 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,6 +17,7 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "todo-tree.tree.scanMode": "workspace only", "solidity.compileUsingLocalVersion": "/workspaces/gif-next/soljson-v0.8.20+commit.a1b79de6.js", + "asciidoc.antora.enableAntoraSupport": true, "workbench.colorCustomizations": { "activityBar.activeBackground": "#f18500", "activityBar.background": "#f18500", @@ -36,5 +37,4 @@ "titleBar.inactiveBackground": "#be690099", "titleBar.inactiveForeground": "#e7e7e799" }, - "asciidoc.antora.enableAntoraSupport": true, } diff --git a/hardhat.config.ts b/hardhat.config.ts index c035d805e..fbf52a830 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -9,6 +9,13 @@ import { config as dotEnvConfig } from "dotenv"; dotEnvConfig(); const config: HardhatUserConfig = { + ignition: { + strategyConfig: { + create2: { + salt: "0x0000000000000000000000000000000000000000000000000000000000000000", + } + } + }, solidity: { version: "0.8.20", settings: { @@ -23,7 +30,7 @@ const config: HardhatUserConfig = { networks: { hardhat: { }, - anvil: { + devchain: { chainId: 1337, url: "http://anvil:7545", accounts: { diff --git a/ignition/modules/Token.ts b/ignition/modules/Token.ts new file mode 100644 index 000000000..10656619d --- /dev/null +++ b/ignition/modules/Token.ts @@ -0,0 +1,30 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("Token", (m) => { + const dip = m.contract("Dip", []); + + const secondsLib = m.library("SecondsLib"); + const tslib = m.library("TimestampLib", { + libraries: { + SecondsLib: secondsLib + } + }); + const key32Lib = m.library("Key32Lib"); + const roleIdLib = m.library("RoleIdLib", { + libraries: { + Key32Lib: key32Lib + }, + + }); + // m.call(apollo, "launch", []); + const ra = m.contract("RegistryAdmin", [], + { + libraries: { + TimestampLib: tslib, + RoleIdLib: roleIdLib + }, + } + ); + + return { dip, ra }; +}); diff --git a/package-lock.json b/package-lock.json index 2fe12ab75..0d2aea2c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-foundry": "^1.1.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.4", "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@nomicfoundation/hardhat-verify": "^2.0.1", "@typescript-eslint/eslint-plugin": "^7.1.0", @@ -1003,7 +1004,6 @@ "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.4.tgz", "integrity": "sha512-vY30V4b788GSziW/nOd0L/4IPw6mwpluahLs4+gPUUKWaHHGMA8OIeHaYpRRljM1i0M/Kg1yIozrDM/aeRebkg==", "dev": true, - "peer": true, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/hardhat-ignition": "^0.15.4", diff --git a/package.json b/package.json index 2e62f0cfd..c5af5099c 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "homepage": "https://github.com/etherisc/gif-next#readme", "devDependencies": { "@nomicfoundation/hardhat-foundry": "^1.1.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.4", "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@nomicfoundation/hardhat-verify": "^2.0.1", "@typescript-eslint/eslint-plugin": "^7.1.0", From f0543f26c6c86eefd74fa75869a5b3fbcf0c70c7 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Fri, 24 May 2024 12:16:47 +0000 Subject: [PATCH 02/19] more ignition stuff --- hardhat.config.ts | 4 ++-- ignition/modules/Libraries.ts | 19 +++++++++++++++++++ ignition/modules/Token.ts | 16 +++------------- scripts/deploy_with_ignite.ts | 15 +++++++++++++++ 4 files changed, 39 insertions(+), 15 deletions(-) create mode 100644 ignition/modules/Libraries.ts create mode 100644 scripts/deploy_with_ignite.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index fbf52a830..b95c860fa 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -12,7 +12,7 @@ const config: HardhatUserConfig = { ignition: { strategyConfig: { create2: { - salt: "0x0000000000000000000000000000000000000000000000000000000000000000", + salt: "0x0000000000000000000000000000000000000000000000000000000000000001", } } }, @@ -30,7 +30,7 @@ const config: HardhatUserConfig = { networks: { hardhat: { }, - devchain: { + anvil: { chainId: 1337, url: "http://anvil:7545", accounts: { diff --git a/ignition/modules/Libraries.ts b/ignition/modules/Libraries.ts new file mode 100644 index 000000000..cb7d20591 --- /dev/null +++ b/ignition/modules/Libraries.ts @@ -0,0 +1,19 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("Libraries", (m) => { + const secondsLib = m.library("SecondsLib"); + const tslib = m.library("TimestampLib", { + libraries: { + SecondsLib: secondsLib + } + }); + const key32Lib = m.library("Key32Lib"); + const roleIdLib = m.library("RoleIdLib", { + libraries: { + Key32Lib: key32Lib + }, + + }); + + return { secondsLib, tslib, key32Lib, roleIdLib }; +}); diff --git a/ignition/modules/Token.ts b/ignition/modules/Token.ts index 10656619d..c5ae13bed 100644 --- a/ignition/modules/Token.ts +++ b/ignition/modules/Token.ts @@ -1,21 +1,11 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import LibraryModule from "./Libraries"; export default buildModule("Token", (m) => { + const { roleIdLib, tslib } = m.useModule(LibraryModule); + const dip = m.contract("Dip", []); - const secondsLib = m.library("SecondsLib"); - const tslib = m.library("TimestampLib", { - libraries: { - SecondsLib: secondsLib - } - }); - const key32Lib = m.library("Key32Lib"); - const roleIdLib = m.library("RoleIdLib", { - libraries: { - Key32Lib: key32Lib - }, - - }); // m.call(apollo, "launch", []); const ra = m.contract("RegistryAdmin", [], { diff --git a/scripts/deploy_with_ignite.ts b/scripts/deploy_with_ignite.ts new file mode 100644 index 000000000..2cd3fb3d2 --- /dev/null +++ b/scripts/deploy_with_ignite.ts @@ -0,0 +1,15 @@ +import hre from "hardhat"; +import TokenModule from "../ignition/modules/Token"; + +async function main() { + const { dip } = await hre.ignition.deploy(TokenModule, { + strategy: "create2", + strategyConfig: { + salt: "0x0000000000000000000000000000000000000000000000000000000000000002" + } + }); + + console.log(`Dip deployed to: ${await dip.getAddress()}`); +} + +main().catch(console.error); \ No newline at end of file From e68c764f2c26d0652dd573450e3da5d503556031 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Fri, 24 May 2024 13:25:25 +0000 Subject: [PATCH 03/19] deploy StakingServiceManager via ignition --- ignition/modules/Services.ts | 47 ++++++++++++++++++++++++++++++++++++ scripts/libs/services.ts | 41 ++++++++++++++++++++++++++++--- 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 ignition/modules/Services.ts diff --git a/ignition/modules/Services.ts b/ignition/modules/Services.ts new file mode 100644 index 000000000..3d1ad49a3 --- /dev/null +++ b/ignition/modules/Services.ts @@ -0,0 +1,47 @@ +// const { address: stakingServiceManagerAddress, contract: stakingServiceManagerBaseContract, } = await deployContract( +// "StakingServiceManager", +// owner, +// [ +// release.accessManager, +// registry.registryAddress, +// release.salt +// ], +// { libraries: { +// AmountLib: libraries.amountLibAddress, +// NftIdLib: libraries.nftIdLibAddress, +// TimestampLib: libraries.timestampLibAddress, +// VersionLib: libraries.versionLibAddress, +// VersionPartLib: libraries.versionPartLibAddress, +// TargetManagerLib: libraries.targetManagerLibAddress, +// }}); + + +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; + +export default buildModule("Services", (m) => { + const amountLib = m.contractAt("AmountLib", m.getParameter("amountLibAddress")); + const nftIdLib = m.contractAt("NftIdLib", m.getParameter("nftIdLibAddress")); + const timestampLib = m.contractAt("TimestampLib", m.getParameter("timestampLibAddress")); + const versionLib = m.contractAt("VersionLib", m.getParameter("versionLibAddress")); + const versionPartLib = m.contractAt("VersionPartLib", m.getParameter("versionPartLibAddress")); + const targetManagerLib = m.contractAt("TargetManagerLib", m.getParameter("targetManagerLibAddress")); + + const stakingServiceManagerFuture = m.contract("StakingServiceManager", [ + m.getParameter("accessManager"), + m.getParameter("registryAddress"), + m.getParameter("salt") + ], + { + libraries: { + AmountLib: amountLib, + NftIdLib: nftIdLib, + TimestampLib: timestampLib, + VersionLib: versionLib, + VersionPartLib: versionPartLib, + TargetManagerLib: targetManagerLib, + }, + from: m.getAccount(0) // TODO: make this configurable + }); + + return { stakingServiceManagerFuture }; +}); diff --git a/scripts/libs/services.ts b/scripts/libs/services.ts index 0a09264f5..be94df399 100644 --- a/scripts/libs/services.ts +++ b/scripts/libs/services.ts @@ -1,5 +1,4 @@ - -import { AddressLike, BytesLike, Signer, resolveAddress, id } from "ethers"; +import { AddressLike, BytesLike, Signer, id } from "ethers"; import { DistributionService, DistributionServiceManager, DistributionService__factory, InstanceService, InstanceServiceManager, InstanceService__factory, @@ -13,7 +12,7 @@ import { OracleService, OracleServiceManager, OracleService__factory, PricingService, PricingServiceManager, PricingService__factory, RegistryService, RegistryService__factory, RegistryServiceManager, - StakingService, StakingServiceManager, StakingService__factory + StakingService, StakingServiceManager, StakingService__factory, } from "../../typechain-types"; import { logger } from "../logger"; import { deployContract } from "./deployment"; @@ -150,6 +149,42 @@ export async function deployAndRegisterServices(owner: Signer, registry: Registr VersionPartLib: libraries.versionPartLibAddress, }}); + // TODO: use ignition? + // const { stakingServiceManagerFuture } = await hre.ignition.deploy(ServicesModule, { + // parameters: { + // "Services": { + // "accessManager": await resolveAddress(release.accessManager), + // "registryAddress": await resolveAddress(registry.registryAddress), + // "salt": release.salt as string, + // "amountLibAddress": await resolveAddress(libraries.amountLibAddress), + // "nftIdLibAddress": await resolveAddress(libraries.nftIdLibAddress), + // "timestampLibAddress": await resolveAddress(libraries.timestampLibAddress), + // "versionLibAddress": await resolveAddress(libraries.versionLibAddress), + // "versionPartLibAddress": await resolveAddress(libraries.versionPartLibAddress), + // "targetManagerLibAddress": await resolveAddress(libraries.targetManagerLibAddress), + // } + // } + // // strategy: "create2", + // // strategyConfig: { + // // salt: "0x0000000000000000000000000000000000000000000000000000000000000002" + // // } + // }); + + + // const amountLib = m.contractAt("AmountLib", m.getParameter("amountLibAddress")); + // const nftIdLib = m.contractAt("NftIdLib", m.getParameter("nftIdLibAddress")); + // const timestampLib = m.contractAt("TimestampLib", m.getParameter("timestampLibAddress")); + // const versionLib = m.contractAt("VersionLib", m.getParameter("versionLibAddress")); + // const versionPartLib = m.contractAt("VersionPartLib", m.getParameter("versionPartLibAddress")); + // const targetManagerLib = m.contractAt("TargetManagerLib", m.getParameter("targetManagerLibAddress")); + + // const stakingServiceManager = m.contract("RegistryAdmin", [ + // m.getParameter("accessManager"), + // m.getParameter("registryAddress"), + // m.getParameter("salt") + + // const stakingServiceManagerAddress = await stakingServiceManagerFuture.getAddress(); + // logger.debug("deployed at " + stakingServiceManagerAddress); const stakingServiceManager = stakingServiceManagerBaseContract as StakingServiceManager; const stakingServiceAddress = await stakingServiceManager.getStakingService(); const stakingService = StakingService__factory.connect(stakingServiceAddress, owner); From 99a4111ad129bdf29d25856ce9895452fd594efe Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Mon, 27 May 2024 12:37:21 +0000 Subject: [PATCH 04/19] add GifCore module (#364) --- ignition/modules/GifCore.ts | 121 ++++++++++++++++++++++++++++++++++ ignition/modules/Libraries.ts | 55 +++++++++++++++- 2 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 ignition/modules/GifCore.ts diff --git a/ignition/modules/GifCore.ts b/ignition/modules/GifCore.ts new file mode 100644 index 000000000..2fb318c00 --- /dev/null +++ b/ignition/modules/GifCore.ts @@ -0,0 +1,121 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import LibraryModule from "./Libraries"; + +export default buildModule("GifCore", (m) => { + const stakingOwner = m.getAccount(0); + + const { + amountLib, + blocknumberLib, + key32Lib, + nftIdLib, + nftIdSetLib, + objectTypeLib, + roleIdLib, + secondsLib, + stakeManagerLib, + stateIdLib, + targetManagerLib, + timestamplib, + uFixedLib, + versionLib, + versionPartLib, + } = m.useModule(LibraryModule); + + // 1) deploy dip token + const dip = m.contract("Dip", []); + + // 2) deploy registry admin + const registryAdmin = m.contract("RegistryAdmin", [], + { + libraries: { + TimestampLib: timestamplib, + RoleIdLib: roleIdLib, + }, + } + ); + + const registry = m.contract("Registry", + [registryAdmin], + { + libraries: { + NftIdLib: nftIdLib, + ObjectTypeLib: objectTypeLib, + }, + } + ); + + const releaseManager = m.contract("ReleaseManager", + [registry], + { + libraries: { + NftIdLib: nftIdLib, + RoleIdLib: roleIdLib, + SecondsLib: secondsLib, + TimestampLib: timestamplib, + VersionLib: versionLib, + VersionPartLib: versionPartLib, + }, + } + ); + + const tokenRegistry = m.contract("TokenRegistry", + [registry, dip], + { + libraries: { + VersionPartLib: versionPartLib, + }, + } + ); + + const stakingReader = m.contract("StakingReader", + [registry], + { + libraries: { + NftIdLib: nftIdLib, + }, + } + ); + + const stakingStore = m.contract("StakingStore", + [registry, stakingReader], + { + libraries: { + AmountLib: amountLib, + BlocknumberLib: blocknumberLib, + Key32Lib: key32Lib, + LibNftIdSet: nftIdSetLib, + NftIdLib: nftIdLib, + ObjectTypeLib: objectTypeLib, + StateIdLib: stateIdLib, + TimestampLib: timestamplib, + UFixedLib: uFixedLib, + }, + } + ); + + const stakingManager = m.contract("StakingManager", + [registry, tokenRegistry, stakingStore, stakingOwner], + { + libraries: { + AmountLib: amountLib, + NftIdLib: nftIdLib, + StakeManagerLib: stakeManagerLib, + TargetManagerLib: targetManagerLib, + TimestampLib: timestamplib, + VersionLib: versionLib, + }, + } + ); + + return { + dip, + registryAdmin, + registry, + releaseManager, + stakingManager, + stakingStore, + stakingReader, + tokenRegistry, + }; +}); diff --git a/ignition/modules/Libraries.ts b/ignition/modules/Libraries.ts index cb7d20591..eaa1fa7db 100644 --- a/ignition/modules/Libraries.ts +++ b/ignition/modules/Libraries.ts @@ -2,7 +2,7 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; export default buildModule("Libraries", (m) => { const secondsLib = m.library("SecondsLib"); - const tslib = m.library("TimestampLib", { + const timestamplib = m.library("TimestampLib", { libraries: { SecondsLib: secondsLib } @@ -12,8 +12,57 @@ export default buildModule("Libraries", (m) => { libraries: { Key32Lib: key32Lib }, - + }); + const nftIdLib = m.library("NftIdLib", { + libraries: { + Key32Lib: key32Lib + }, + }); + const objectTypeLib = m.library("ObjectTypeLib"); + const versionLib = m.library("VersionLib"); + const versionPartLib = m.library("VersionPartLib"); + const blocknumberLib = m.library("BlocknumberLib"); + const nftIdSetLib = m.library("LibNftIdSet"); + const stateIdLib = m.library("StateIdLib"); + const uFixedLib = m.library("UFixedLib"); + const amountLib = m.library("AmountLib", { + libraries: { + UFixedLib: uFixedLib + } + }); + const targetManagerLib = m.library("TargetManagerLib", { + libraries: { + AmountLib: amountLib, + NftIdLib: nftIdLib, + SecondsLib: secondsLib, + UFixedLib: uFixedLib + } + }); + const stakeManagerLib = m.library("StakeManagerLib", { + libraries: { + AmountLib: amountLib, + SecondsLib: secondsLib, + TimestampLib: timestamplib, + UFixedLib: uFixedLib + } + }); - return { secondsLib, tslib, key32Lib, roleIdLib }; + return { + amountLib, + blocknumberLib, + key32Lib, + nftIdLib, + nftIdSetLib, + objectTypeLib, + stateIdLib, + roleIdLib, + secondsLib, + stakeManagerLib, + targetManagerLib, + timestamplib, + uFixedLib, + versionLib, + versionPartLib, + }; }); From 01f69b7e9a1c6acef9c31bd9e1ef2ef0647d8ec4 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Mon, 27 May 2024 12:58:02 +0000 Subject: [PATCH 05/19] finalize gifcore module (#364) --- ignition/modules/GifCore.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/ignition/modules/GifCore.ts b/ignition/modules/GifCore.ts index 2fb318c00..f001fe7b1 100644 --- a/ignition/modules/GifCore.ts +++ b/ignition/modules/GifCore.ts @@ -2,6 +2,8 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; import LibraryModule from "./Libraries"; export default buildModule("GifCore", (m) => { + const gifAdmin = m.getAccount(0); + const gifManager = m.getAccount(0); const stakingOwner = m.getAccount(0); const { @@ -35,6 +37,7 @@ export default buildModule("GifCore", (m) => { } ); + // 3) deploy registry const registry = m.contract("Registry", [registryAdmin], { @@ -45,6 +48,7 @@ export default buildModule("GifCore", (m) => { } ); + // 4) deploy release manager const releaseManager = m.contract("ReleaseManager", [registry], { @@ -59,6 +63,7 @@ export default buildModule("GifCore", (m) => { } ); + // 5) deploy token registry const tokenRegistry = m.contract("TokenRegistry", [registry, dip], { @@ -68,6 +73,7 @@ export default buildModule("GifCore", (m) => { } ); + // 6) deploy staking reader const stakingReader = m.contract("StakingReader", [registry], { @@ -77,6 +83,7 @@ export default buildModule("GifCore", (m) => { } ); + // 7) deploy staking store const stakingStore = m.contract("StakingStore", [registry, stakingReader], { @@ -94,6 +101,7 @@ export default buildModule("GifCore", (m) => { } ); + // 8) deploy staking manager and staking component const stakingManager = m.contract("StakingManager", [registry, tokenRegistry, stakingStore, stakingOwner], { @@ -108,6 +116,27 @@ export default buildModule("GifCore", (m) => { } ); + const stakingAddress = m.staticCall(stakingManager, "getStaking"); + const staking = m.contractAt("Staking", stakingAddress); + + // 9) initialize instance reader + const stakingReaderInitialize = m.call(stakingReader, "initialize", [staking, stakingStore], { + after: [staking], + }); + + // 10) intialize registry and register staking component + const registryInitialize = m.call(registry, "initialize", [releaseManager, tokenRegistry, staking], { + after: [stakingReaderInitialize], + }); + const stakingLinkToRegisteredNftId = m.call(staking, "linkToRegisteredNftId", [], { + after: [registryInitialize], + }); + + // 11) initialize registry admin + m.call(registryAdmin, "initialize", [registry, gifAdmin, gifManager], { + after: [stakingLinkToRegisteredNftId] + }); + return { dip, registryAdmin, From 6441c7637eb41270b70709c88ec727d47153912e Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 07:44:27 +0000 Subject: [PATCH 06/19] add amoy network (#364) --- hardhat.config.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index b95c860fa..c4bf9cfb6 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -12,7 +12,7 @@ const config: HardhatUserConfig = { ignition: { strategyConfig: { create2: { - salt: "0x0000000000000000000000000000000000000000000000000000000000000001", + salt: "0x0000000000000000000000000000000000000000000000000000000000000002", } } }, @@ -38,10 +38,9 @@ const config: HardhatUserConfig = { count: 20, }, }, - mumbai: { - chainId: 80001, - gasPrice: 3100000000, - url: process.env.NETWORK_URL || 'https://polygon-mumbai.infura.io/v3/' + process.env.WEB3_INFURA_PROJECT_ID, + polygonAmoy: { + chainId: 80002, + url: process.env.NETWORK_URL, accounts: { mnemonic: process.env.WALLET_MNEMONIC || "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", count: 20, @@ -54,8 +53,18 @@ const config: HardhatUserConfig = { }, etherscan: { apiKey: { - polygonMumbai: process.env.POLYGONSCAN_API_KEY || "", + polygonAmoy: process.env.POLYGONSCAN_API_KEY || "", }, + customChains: [ + { + network: "polygonAmoy", + chainId: 80002, + urls: { + apiURL: "https://api-amoy.polygonscan.com/api", + browserURL: "https://amoy.polygonscan.com" + }, + } + ] }, }; From d8bc316fe44275f235505334b619a88446f54cc6 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 07:45:49 +0000 Subject: [PATCH 07/19] XXXX patch InitializableCustom to work with createX (do not merge) (#364) --- contracts/registry/Registry.sol | 4 ++-- contracts/shared/InitializableCustom.sol | 11 ++++++----- contracts/staking/StakingReader.sol | 2 +- ignition/modules/GifCore.ts | 6 +++--- test/base/GifDeployer.sol | 4 ++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/contracts/registry/Registry.sol b/contracts/registry/Registry.sol index 846bb54ca..aab823ab3 100644 --- a/contracts/registry/Registry.sol +++ b/contracts/registry/Registry.sol @@ -82,8 +82,8 @@ contract Registry is } - constructor(RegistryAdmin admin) - InitializableCustom() + constructor(RegistryAdmin admin, address initialOwner) + InitializableCustom(initialOwner) { _admin = admin; // deploy NFT diff --git a/contracts/shared/InitializableCustom.sol b/contracts/shared/InitializableCustom.sol index df2fba068..30674cc53 100644 --- a/contracts/shared/InitializableCustom.sol +++ b/contracts/shared/InitializableCustom.sol @@ -73,9 +73,10 @@ abstract contract InitializableCustom { // solhint-disable-next-line var-name-mixedcase InitializableCustomStorage storage $ = _getInitializableCustomStorage(); - if($._initializeOwner != msg.sender) { - revert InvalidInitializationCaller(); - } + // FIXME: DO NOT MERGE WITH THIS!!!! + // if($._initializeOwner != msg.sender) { + // revert InvalidInitializationCaller(); + // } // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; @@ -115,10 +116,10 @@ abstract contract InitializableCustom { /** * @dev Constructor sets the caller of protected initializer function. */ - constructor() { + constructor(address initialOwner) { // solhint-disable-previous-line var-name-mixedcase InitializableCustomStorage storage $ = _getInitializableCustomStorage(); - $._initializeOwner = msg.sender; + $._initializeOwner = initialOwner; } /** diff --git a/contracts/staking/StakingReader.sol b/contracts/staking/StakingReader.sol index 3471e254b..9bdb73a4c 100644 --- a/contracts/staking/StakingReader.sol +++ b/contracts/staking/StakingReader.sol @@ -29,7 +29,7 @@ contract StakingReader is IStaking private _staking; StakingStore private _store; - constructor(IRegistry registry) InitializableCustom() { + constructor(IRegistry registry, address initialOwner) InitializableCustom(initialOwner) { _registry = registry; } diff --git a/ignition/modules/GifCore.ts b/ignition/modules/GifCore.ts index f001fe7b1..28e9bdf21 100644 --- a/ignition/modules/GifCore.ts +++ b/ignition/modules/GifCore.ts @@ -28,7 +28,7 @@ export default buildModule("GifCore", (m) => { const dip = m.contract("Dip", []); // 2) deploy registry admin - const registryAdmin = m.contract("RegistryAdmin", [], + const registryAdmin = m.contract("RegistryAdmin", [stakingOwner], { libraries: { TimestampLib: timestamplib, @@ -39,7 +39,7 @@ export default buildModule("GifCore", (m) => { // 3) deploy registry const registry = m.contract("Registry", - [registryAdmin], + [registryAdmin, stakingOwner], { libraries: { NftIdLib: nftIdLib, @@ -75,7 +75,7 @@ export default buildModule("GifCore", (m) => { // 6) deploy staking reader const stakingReader = m.contract("StakingReader", - [registry], + [registry, stakingOwner], { libraries: { NftIdLib: nftIdLib, diff --git a/test/base/GifDeployer.sol b/test/base/GifDeployer.sol index 1e639a547..f199fdde3 100644 --- a/test/base/GifDeployer.sol +++ b/test/base/GifDeployer.sol @@ -144,7 +144,7 @@ contract GifDeployer is Test { registryAdmin = new RegistryAdmin(); // 3) deploy registry - registry = new Registry(registryAdmin); + registry = new Registry(registryAdmin, address(this)); // 4) deploy release manager releaseManager = new ReleaseManager(registry); @@ -153,7 +153,7 @@ contract GifDeployer is Test { tokenRegistry = new TokenRegistry(registry, dip); // 6) deploy staking reader - StakingReader stakingReader = new StakingReader(registry); + StakingReader stakingReader = new StakingReader(registry, address(this)); // 7) deploy staking store StakingStore stakingStore = new StakingStore(registry, stakingReader); From b5eec3758bcace0f9d008bdf65bfe64982f0c487 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 09:50:59 +0000 Subject: [PATCH 08/19] Update mnemonic in hardhat.config.ts (#364) --- hardhat.config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index c4bf9cfb6..f08d5cdda 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -12,7 +12,7 @@ const config: HardhatUserConfig = { ignition: { strategyConfig: { create2: { - salt: "0x0000000000000000000000000000000000000000000000000000000000000002", + salt: "0x0000000000000000000000000000000000000000000000000000000000000004", } } }, @@ -34,7 +34,7 @@ const config: HardhatUserConfig = { chainId: 1337, url: "http://anvil:7545", accounts: { - mnemonic: "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", + mnemonic: process.env.WALLET_MNEMONIC || "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", count: 20, }, }, From ee982b5bfefd33c0cef40d4d839e8cdaebf5b138 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 11:41:18 +0000 Subject: [PATCH 09/19] fix owners (#364) --- contracts/shared/InitializableCustom.sol | 7 +++---- test/base/GifDeployer.sol | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/contracts/shared/InitializableCustom.sol b/contracts/shared/InitializableCustom.sol index 30674cc53..d67f17bc0 100644 --- a/contracts/shared/InitializableCustom.sol +++ b/contracts/shared/InitializableCustom.sol @@ -73,10 +73,9 @@ abstract contract InitializableCustom { // solhint-disable-next-line var-name-mixedcase InitializableCustomStorage storage $ = _getInitializableCustomStorage(); - // FIXME: DO NOT MERGE WITH THIS!!!! - // if($._initializeOwner != msg.sender) { - // revert InvalidInitializationCaller(); - // } + if($._initializeOwner != msg.sender) { + revert InvalidInitializationCaller(); + } // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; diff --git a/test/base/GifDeployer.sol b/test/base/GifDeployer.sol index f199fdde3..d04b6df38 100644 --- a/test/base/GifDeployer.sol +++ b/test/base/GifDeployer.sol @@ -144,7 +144,7 @@ contract GifDeployer is Test { registryAdmin = new RegistryAdmin(); // 3) deploy registry - registry = new Registry(registryAdmin, address(this)); + registry = new Registry(registryAdmin, gifAdmin); // 4) deploy release manager releaseManager = new ReleaseManager(registry); @@ -153,8 +153,8 @@ contract GifDeployer is Test { tokenRegistry = new TokenRegistry(registry, dip); // 6) deploy staking reader - StakingReader stakingReader = new StakingReader(registry, address(this)); - + StakingReader stakingReader = new StakingReader(registry, gifAdmin); + // 7) deploy staking store StakingStore stakingStore = new StakingStore(registry, stakingReader); From ce156cd8a2b196d1a35cdb6703b2c7ea6ffd91ca Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 11:56:00 +0000 Subject: [PATCH 10/19] chore: Update hardhat.config.ts with Amoy network URL --- hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.ts b/hardhat.config.ts index f08d5cdda..599823ea8 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -40,7 +40,7 @@ const config: HardhatUserConfig = { }, polygonAmoy: { chainId: 80002, - url: process.env.NETWORK_URL, + url: process.env.NETWORK_URL || 'https://rpc-amoy.polygon.technology/', accounts: { mnemonic: process.env.WALLET_MNEMONIC || "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", count: 20, From 99346698993503bddffe681cff61475c88a52304 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 12:47:21 +0000 Subject: [PATCH 11/19] fix deployment script (#364) --- scripts/libs/registry.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/libs/registry.ts b/scripts/libs/registry.ts index e5603acc4..5804766a0 100644 --- a/scripts/libs/registry.ts +++ b/scripts/libs/registry.ts @@ -81,7 +81,7 @@ export async function deployAndInitializeRegistry(owner: Signer, libraries: Libr const { address: registryAdminAddress, contract: registryAdminBaseContract } = await deployContract( "RegistryAdmin", owner, // GIF_ADMIN_ROLE - [], + [owner], { libraries: { ObjectTypeLib: libraries.objectTypeLibAddress, @@ -102,7 +102,7 @@ export async function deployAndInitializeRegistry(owner: Signer, libraries: Libr const { address: registryAddress, contract: registryBaseContract } = await deployContract( "Registry", owner, // GIF_ADMIN_ROLE - [registryAdminAddress], + [registryAdminAddress, owner], { libraries: { NftIdLib: libraries.nftIdLibAddress, @@ -156,7 +156,7 @@ export async function deployAndInitializeRegistry(owner: Signer, libraries: Libr const { address: stakingReaderAddress, contract: stakingReaderBaseContract } = await deployContract( "StakingReader", owner, - [registryAddress], + [registryAddress, owner], { libraries: { NftIdLib: libraries.nftIdLibAddress, From a6ca0320e3a9ca4d7c46d10ee9df13092084b206 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 12:49:10 +0000 Subject: [PATCH 12/19] Add ignition deployment for GifCore module (#364) --- .github/workflows/build.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bba68c089..f0bcd65ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -147,4 +147,33 @@ jobs: env: SKIP_VERIFICATION: true run: hh run scripts/deploy_all.ts + + deployment_ignition: + name: Execute ignition deployment on local chain + runs-on: ubuntu-latest + permissions: + contents: read + # id-token: write + needs: [build_hardhat, build_foundry] + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Setup node environment + uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: | + npm install + + - name: Run deployment script + run: npx hardhat ignition deploy ignition/modules/GifCore.ts --strategy create2 \ No newline at end of file From 19d761d0c8852e3973c760db5c0c6271b471670d Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 28 May 2024 12:58:35 +0000 Subject: [PATCH 13/19] dont wait for forge tests for finish for deployment jobs (#364) --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f0bcd65ee..ffbbc2f57 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -122,7 +122,7 @@ jobs: permissions: contents: read # id-token: write - needs: [build_hardhat, build_foundry] + needs: [build_hardhat] steps: - name: Checkout uses: actions/checkout@v4 @@ -154,7 +154,7 @@ jobs: permissions: contents: read # id-token: write - needs: [build_hardhat, build_foundry] + needs: [build_hardhat] steps: - name: Checkout uses: actions/checkout@v4 From ed0350c6f914b46128c25aa9c1e902835c60f2c0 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Thu, 6 Jun 2024 08:01:00 +0000 Subject: [PATCH 14/19] Update hardhat.config.ts for base sepolia --- hardhat.config.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/hardhat.config.ts b/hardhat.config.ts index 599823ea8..cbdd82553 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -50,6 +50,14 @@ const config: HardhatUserConfig = { chainId: 1, url: process.env.NETWORK_URL || 'https://mainnet.infura.io/v3/' + process.env.WEB3_INFURA_PROJECT_ID, }, + baseSepolia: { + chainId: 84532, + url: process.env.NETWORK_URL || "https://sepolia.base.org", + accounts: { + mnemonic: process.env.WALLET_MNEMONIC || "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", + count: 20, + }, + } }, etherscan: { apiKey: { From 18e10503136db9cba0781785647445c7609f5d80 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Fri, 7 Jun 2024 13:27:36 +0000 Subject: [PATCH 15/19] unit test for ignition deployment module GifCore (#364) --- hardhat.config.ts | 3 ++ ignition/modules/GifCore.ts | 16 +++---- test_hardhat/deployment.test.ts | 80 +++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 test_hardhat/deployment.test.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index cbdd82553..20c0118ad 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -16,6 +16,9 @@ const config: HardhatUserConfig = { } } }, + "paths": { + "tests": "./test_hardhat", + }, solidity: { version: "0.8.20", settings: { diff --git a/ignition/modules/GifCore.ts b/ignition/modules/GifCore.ts index 28e9bdf21..4662d35f3 100644 --- a/ignition/modules/GifCore.ts +++ b/ignition/modules/GifCore.ts @@ -138,13 +138,13 @@ export default buildModule("GifCore", (m) => { }); return { - dip, - registryAdmin, - registry, - releaseManager, - stakingManager, - stakingStore, - stakingReader, - tokenRegistry, + dipContract: dip, + registryAdminContract: registryAdmin, + registryContract: registry, + releaseManagerContract: releaseManager, + stakingManagerContract: stakingManager, + stakingStoreContract: stakingStore, + stakingReaderContract: stakingReader, + tokenRegistryContract: tokenRegistry, }; }); diff --git a/test_hardhat/deployment.test.ts b/test_hardhat/deployment.test.ts new file mode 100644 index 000000000..d31fa1a8f --- /dev/null +++ b/test_hardhat/deployment.test.ts @@ -0,0 +1,80 @@ +import { expect } from "chai"; +import hre, { ignition } from "hardhat"; +import GifCore from "../ignition/modules/GifCore"; +import { Registry, StakingManager, StakingReader, TokenRegistry } from "../typechain-types"; + +describe("Ignition deployment", function () { + it("deploys all contracts", async function () { + const { + dipContract, + registryAdminContract, + registryContract, + releaseManagerContract, + stakingManagerContract, + stakingStoreContract, + stakingReaderContract, + tokenRegistryContract, + } = await ignition.deploy(GifCore); + + expect(await dipContract.getAddress()).to.be.properAddress; + expect(await registryAdminContract.getAddress()).to.be.properAddress; + expect(await registryContract.getAddress()).to.be.properAddress; + expect(await releaseManagerContract.getAddress()).to.be.properAddress; + expect(await stakingManagerContract.getAddress()).to.be.properAddress; + expect(await stakingStoreContract.getAddress()).to.be.properAddress; + expect(await stakingReaderContract.getAddress()).to.be.properAddress; + expect(await tokenRegistryContract.getAddress()).to.be.properAddress; + + // check that the dip token address is set correctly in the token registry + const tokenRegistry = tokenRegistryContract as unknown as TokenRegistry; + expect(await tokenRegistry.getDipTokenAddress()).to.equal(await dipContract.getAddress()); + + const stakingManager = stakingManagerContract as unknown as StakingManager; + const stakingAddress = await stakingManager.getStaking(); + + // check that staking reader has the correct addresses of registry and staking + const stakingReader = stakingReaderContract as unknown as StakingReader; + expect(await stakingReader.getRegistry()).to.equal(await registryContract.getAddress()); + expect(await stakingReader.getStaking()).to.equal(stakingAddress); + + // check that the registry has the correct number of objects (4 - protocol, global registry, registry, staking) + const registry = registryContract as unknown as Registry; + expect(await registry.getObjectCount()).to.equal(4, "registry should have 4 objects"); + + + const protocolNftId = "1101"; + const globalRegistryNftId = "2101"; + + // check that the registry has the correct nftid (2nd nft) + const registryNftId = calculateNftID(2); + expect(await registry["getNftId()"]()).to.equal(registryNftId, "registry nftid invalid"); + expect(await registry.getProtocolNftId()).to.equal(protocolNftId, "protocol nftid invalid"); + await expectParentNftId(registry, registryNftId, globalRegistryNftId); + + // check that the staking contract has the correct registry and nftid (3rd nft) + const staking = await hre.ethers.getContractAt("Staking", stakingAddress); + expect(await staking.getRegistry()).to.equal(await registryContract.getAddress()); + const stakingNftId = calculateNftID(3); + expect(await staking.getNftId()).to.equal(stakingNftId, "staking nftid invalid"); + expectParentNftId(registry, stakingNftId, registryNftId); + + // check that the registry contains an entry for the global registry (nft id 2101) with address 0x and its parent is the protocol nft id + const { objectAddress, parentNftId } = await registry["getObjectInfo(uint96)"](globalRegistryNftId); + expect(objectAddress).to.equal("0x0000000000000000000000000000000000000000"); + expect(parentNftId).to.equal(protocolNftId); + + // check that the parent nft id of the protocol nft id is 0 + await expectParentNftId(registry, protocolNftId, "0"); + }); +}); + +function calculateNftID(nftNum: number): string { + const chainId = hre.network.config.chainId || 1; + const chainIdLength = chainId.toString().length.toString().padStart(2, "0"); + return `${nftNum}${chainId}${chainIdLength}`; +} + +async function expectParentNftId(registry: Registry, nftId: string, expectedParentNftId: string) { + const { parentNftId: registryParentNftId } = await registry["getObjectInfo(uint96)"](nftId); + expect(registryParentNftId).to.equal(expectedParentNftId, "parent nftid invalid"); +} \ No newline at end of file From 27de2e1a25ea8e1b84120bb46595053e7f5b443a Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Mon, 17 Jun 2024 07:27:08 +0000 Subject: [PATCH 16/19] fix old ignition script --- ignition/modules/Token.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ignition/modules/Token.ts b/ignition/modules/Token.ts index c5ae13bed..dbdcdb21d 100644 --- a/ignition/modules/Token.ts +++ b/ignition/modules/Token.ts @@ -2,7 +2,7 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; import LibraryModule from "./Libraries"; export default buildModule("Token", (m) => { - const { roleIdLib, tslib } = m.useModule(LibraryModule); + const { roleIdLib, timestamplib } = m.useModule(LibraryModule); const dip = m.contract("Dip", []); @@ -10,7 +10,7 @@ export default buildModule("Token", (m) => { const ra = m.contract("RegistryAdmin", [], { libraries: { - TimestampLib: tslib, + TimestampLib: timestamplib, RoleIdLib: roleIdLib }, } From c91df5a6f676c9d839524469cfb7acb9554a9754 Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Mon, 17 Jun 2024 07:49:03 +0000 Subject: [PATCH 17/19] fix ignition deployment (#364) --- README.md | 7 ++ ignition/modules/GifCore.ts | 17 +++-- ignition/modules/Libraries.ts | 16 +++-- package-lock.json | 131 ---------------------------------- scripts/libs/registry.ts | 2 +- 5 files changed, 33 insertions(+), 140 deletions(-) diff --git a/README.md b/README.md index fb0ffae35..becb74fc2 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,13 @@ export SKIP_VERIFICATION=true hh run scripts/deploy_all.ts ``` +Deployment via ignition + +```bash +npx hardhat ignition deploy ignition/modules/GifCore.ts +hh ignition deploy ignition/modules/GifCore.ts +``` + ```bash # set appropriate values vor env variables (see below) diff --git a/ignition/modules/GifCore.ts b/ignition/modules/GifCore.ts index 4662d35f3..5af1ad7e5 100644 --- a/ignition/modules/GifCore.ts +++ b/ignition/modules/GifCore.ts @@ -15,8 +15,11 @@ export default buildModule("GifCore", (m) => { objectTypeLib, roleIdLib, secondsLib, + selectorLib, + selectorSetLib, stakeManagerLib, stateIdLib, + strLib, targetManagerLib, timestamplib, uFixedLib, @@ -28,11 +31,17 @@ export default buildModule("GifCore", (m) => { const dip = m.contract("Dip", []); // 2) deploy registry admin - const registryAdmin = m.contract("RegistryAdmin", [stakingOwner], + const registryAdmin = m.contract("RegistryAdmin", [], { libraries: { - TimestampLib: timestamplib, + ObjectTypeLib: objectTypeLib, RoleIdLib: roleIdLib, + SelectorLib: selectorLib, + SelectorSetLib: selectorSetLib, + StrLib: strLib, + TimestampLib: timestamplib, + VersionLib: versionLib, + VersionPartLib: versionPartLib, }, } ); @@ -54,7 +63,6 @@ export default buildModule("GifCore", (m) => { { libraries: { NftIdLib: nftIdLib, - RoleIdLib: roleIdLib, SecondsLib: secondsLib, TimestampLib: timestamplib, VersionLib: versionLib, @@ -95,6 +103,7 @@ export default buildModule("GifCore", (m) => { NftIdLib: nftIdLib, ObjectTypeLib: objectTypeLib, StateIdLib: stateIdLib, + TargetManagerLib: targetManagerLib, TimestampLib: timestamplib, UFixedLib: uFixedLib, }, @@ -133,7 +142,7 @@ export default buildModule("GifCore", (m) => { }); // 11) initialize registry admin - m.call(registryAdmin, "initialize", [registry, gifAdmin, gifManager], { + m.call(registryAdmin, "completeSetup", [registry, gifAdmin, gifManager], { after: [stakingLinkToRegisteredNftId] }); diff --git a/ignition/modules/Libraries.ts b/ignition/modules/Libraries.ts index eaa1fa7db..9ede3c8be 100644 --- a/ignition/modules/Libraries.ts +++ b/ignition/modules/Libraries.ts @@ -1,16 +1,24 @@ import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; export default buildModule("Libraries", (m) => { + const selectorLib = m.library("SelectorLib"); + const selectorSetLib = m.library("SelectorSetLib"); const secondsLib = m.library("SecondsLib"); + const strLib = m.library("StrLib"); const timestamplib = m.library("TimestampLib", { libraries: { SecondsLib: secondsLib } }); const key32Lib = m.library("Key32Lib"); + const objectTypeLib = m.library("ObjectTypeLib"); + const versionLib = m.library("VersionLib"); + const versionPartLib = m.library("VersionPartLib"); const roleIdLib = m.library("RoleIdLib", { libraries: { - Key32Lib: key32Lib + Key32Lib: key32Lib, + ObjectTypeLib: objectTypeLib, + VersionPartLib: versionPartLib, }, }); const nftIdLib = m.library("NftIdLib", { @@ -18,9 +26,6 @@ export default buildModule("Libraries", (m) => { Key32Lib: key32Lib }, }); - const objectTypeLib = m.library("ObjectTypeLib"); - const versionLib = m.library("VersionLib"); - const versionPartLib = m.library("VersionPartLib"); const blocknumberLib = m.library("BlocknumberLib"); const nftIdSetLib = m.library("LibNftIdSet"); const stateIdLib = m.library("StateIdLib"); @@ -58,7 +63,10 @@ export default buildModule("Libraries", (m) => { stateIdLib, roleIdLib, secondsLib, + selectorLib, + selectorSetLib, stakeManagerLib, + strLib, targetManagerLib, timestamplib, uFixedLib, diff --git a/package-lock.json b/package-lock.json index 0d2aea2c6..fa9f3328a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2109,23 +2109,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", - "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", @@ -2267,103 +2250,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", - "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", @@ -2517,23 +2403,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", - "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.10.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", diff --git a/scripts/libs/registry.ts b/scripts/libs/registry.ts index 5804766a0..df5f3c1a0 100644 --- a/scripts/libs/registry.ts +++ b/scripts/libs/registry.ts @@ -81,7 +81,7 @@ export async function deployAndInitializeRegistry(owner: Signer, libraries: Libr const { address: registryAdminAddress, contract: registryAdminBaseContract } = await deployContract( "RegistryAdmin", owner, // GIF_ADMIN_ROLE - [owner], + [], { libraries: { ObjectTypeLib: libraries.objectTypeLibAddress, From bdbfba0c95ddd835155b458833745251fab4d13c Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Mon, 17 Jun 2024 08:38:10 +0000 Subject: [PATCH 18/19] Add deployer as constructor parameter in AccessAdmin (#364) --- contracts/registry/RegistryAdmin.sol | 2 +- contracts/shared/AccessAdmin.sol | 4 ++-- ignition/modules/GifCore.ts | 2 +- scripts/libs/registry.ts | 2 +- test/base/GifDeployer.sol | 2 +- test/shared/AccessAdmin.t.sol | 11 +++++++---- test/shared/AccessAdminManageMock.t.sol | 4 ++-- 7 files changed, 15 insertions(+), 12 deletions(-) diff --git a/contracts/registry/RegistryAdmin.sol b/contracts/registry/RegistryAdmin.sol index ca2738520..6a657d132 100644 --- a/contracts/registry/RegistryAdmin.sol +++ b/contracts/registry/RegistryAdmin.sol @@ -54,7 +54,7 @@ contract RegistryAdmin is address private _stakingStore; bool private _setupCompleted; - constructor() AccessAdmin() { } + constructor(address deployer) AccessAdmin(deployer) { } function completeSetup( IRegistry registry, diff --git a/contracts/shared/AccessAdmin.sol b/contracts/shared/AccessAdmin.sol index 58e09a5f8..c388406e2 100644 --- a/contracts/shared/AccessAdmin.sol +++ b/contracts/shared/AccessAdmin.sol @@ -110,8 +110,8 @@ contract AccessAdmin is _; } - constructor() { - _deployer = msg.sender; + constructor(address deployer) { + _deployer = deployer; _authority = new AccessManager(address(this)); _setAuthority(address(_authority)); diff --git a/ignition/modules/GifCore.ts b/ignition/modules/GifCore.ts index 5af1ad7e5..66068538e 100644 --- a/ignition/modules/GifCore.ts +++ b/ignition/modules/GifCore.ts @@ -31,7 +31,7 @@ export default buildModule("GifCore", (m) => { const dip = m.contract("Dip", []); // 2) deploy registry admin - const registryAdmin = m.contract("RegistryAdmin", [], + const registryAdmin = m.contract("RegistryAdmin", [gifAdmin], { libraries: { ObjectTypeLib: objectTypeLib, diff --git a/scripts/libs/registry.ts b/scripts/libs/registry.ts index df5f3c1a0..5804766a0 100644 --- a/scripts/libs/registry.ts +++ b/scripts/libs/registry.ts @@ -81,7 +81,7 @@ export async function deployAndInitializeRegistry(owner: Signer, libraries: Libr const { address: registryAdminAddress, contract: registryAdminBaseContract } = await deployContract( "RegistryAdmin", owner, // GIF_ADMIN_ROLE - [], + [owner], { libraries: { ObjectTypeLib: libraries.objectTypeLibAddress, diff --git a/test/base/GifDeployer.sol b/test/base/GifDeployer.sol index d04b6df38..b16c3fba2 100644 --- a/test/base/GifDeployer.sol +++ b/test/base/GifDeployer.sol @@ -141,7 +141,7 @@ contract GifDeployer is Test { dip = new Dip(); // 2) deploy registry admin - registryAdmin = new RegistryAdmin(); + registryAdmin = new RegistryAdmin(gifAdmin); // 3) deploy registry registry = new Registry(registryAdmin, gifAdmin); diff --git a/test/shared/AccessAdmin.t.sol b/test/shared/AccessAdmin.t.sol index 452aebd90..55d55d53b 100644 --- a/test/shared/AccessAdmin.t.sol +++ b/test/shared/AccessAdmin.t.sol @@ -17,7 +17,7 @@ import {Timestamp, TimestampLib} from "../../contracts/type/Timestamp.sol"; contract AccessAdminForTesting is AccessAdmin { - constructor() { + constructor(address deployer) AccessAdmin(deployer) { // super constructor called implicitly // grant manager role access to createRoleSimple Function[] memory functions = new Function[](1); @@ -42,6 +42,9 @@ contract AccessAdminForTesting is AccessAdmin { contract AccessAdminCloneable is AccessAdminForTesting { + constructor(address deployer) AccessAdminForTesting(deployer) { + } + /// @dev initializer with externally provided accessManager /// IMPORTANT cloning and initialization needs to be done in a single transaction function initializeWithAccessManager(address accessManager) public initializer() { @@ -81,10 +84,10 @@ contract AccessAdminTest is Test { function setUp() public { vm.startPrank(accessAdminDeployer); - accessAdmin = new AccessAdminForTesting(); + accessAdmin = new AccessAdminForTesting(accessAdminDeployer); accessAdmin.createTarget(address(accessAdmin), "AccessAdmin"); - aaMaster = new AccessAdminCloneable(); + aaMaster = new AccessAdminCloneable(accessAdminDeployer); vm.stopPrank(); } @@ -1034,7 +1037,7 @@ contract AccessAdminTest is Test { // GIVEN (just setup) // WHEN vm.startPrank(accessAdminDeployer); - AccessAdminForTesting aat = new AccessAdminForTesting(); + AccessAdminForTesting aat = new AccessAdminForTesting(accessAdminDeployer); vm.stopPrank(); // THEN diff --git a/test/shared/AccessAdminManageMock.t.sol b/test/shared/AccessAdminManageMock.t.sol index 538aae6d4..a30972d6c 100644 --- a/test/shared/AccessAdminManageMock.t.sol +++ b/test/shared/AccessAdminManageMock.t.sol @@ -18,7 +18,7 @@ import {Timestamp, TimestampLib} from "../../contracts/type/Timestamp.sol"; contract AccessAdminForTesting is AccessAdmin { - constructor() { + constructor(address deployer) AccessAdmin(deployer) { // super constructor called implicitly // grant manager role access to createRoleSimple Function[] memory functions = new Function[](1); @@ -55,7 +55,7 @@ contract AccessAdminManageMockTest is Test { function setUp() public { vm.startPrank(accessAdminDeployer); // deploy access admin - accessAdmin = new AccessAdminForTesting(); + accessAdmin = new AccessAdminForTesting(accessAdminDeployer); // deploy access managed mock using authority of access admin managedMock = new AccessManagedMock(accessAdmin.authority()); From 8e6f713b38c2eb0bbb5f66c0e0988c456fd8b80c Mon Sep 17 00:00:00 2001 From: Marc Doerflinger Date: Tue, 18 Jun 2024 11:32:06 +0000 Subject: [PATCH 19/19] update ignition and docs --- README.md | 6 ++++++ hardhat.config.ts | 6 +++++- package-lock.json | 34 +++++++++++++++++----------------- package.json | 2 +- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index becb74fc2..8b734abd2 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,12 @@ Deployment via ignition ```bash npx hardhat ignition deploy ignition/modules/GifCore.ts hh ignition deploy ignition/modules/GifCore.ts + +hh ignition deploy ignition/modules/GifCore.ts --strategy create2 +hh ignition deploy ignition/modules/GifCore.ts --strategy create2 --verify + +npx hardhat ignition verify chain-84532 --network baseSepolia + ``` ```bash diff --git a/hardhat.config.ts b/hardhat.config.ts index 20c0118ad..a9fd62c73 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -12,7 +12,7 @@ const config: HardhatUserConfig = { ignition: { strategyConfig: { create2: { - salt: "0x0000000000000000000000000000000000000000000000000000000000000004", + salt: "0x0000000000000000000000000000000000000000000000000000000000000006", } } }, @@ -44,6 +44,8 @@ const config: HardhatUserConfig = { polygonAmoy: { chainId: 80002, url: process.env.NETWORK_URL || 'https://rpc-amoy.polygon.technology/', + gas: 1000000000, + gasPrice: 1000000000, accounts: { mnemonic: process.env.WALLET_MNEMONIC || "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", count: 20, @@ -56,6 +58,8 @@ const config: HardhatUserConfig = { baseSepolia: { chainId: 84532, url: process.env.NETWORK_URL || "https://sepolia.base.org", + gas: 200000000, + gasPrice: 2000000000, accounts: { mnemonic: process.env.WALLET_MNEMONIC || "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", count: 20, diff --git a/package-lock.json b/package-lock.json index fa9f3328a..74048605c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-foundry": "^1.1.1", - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.4", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.5", "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@nomicfoundation/hardhat-verify": "^2.0.1", "@typescript-eslint/eslint-plugin": "^7.1.0", @@ -981,14 +981,14 @@ } }, "node_modules/@nomicfoundation/hardhat-ignition": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.4.tgz", - "integrity": "sha512-x1lhLN9ZRSJ9eiNY9AoinMdeQeU4LDQSQOIw90W9DiZIG/g9YUzcTEIY58QTi2TZOF8YFiF6vJqLSePCpi8R1Q==", + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.5.tgz", + "integrity": "sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==", "dev": true, "peer": true, "dependencies": { - "@nomicfoundation/ignition-core": "^0.15.4", - "@nomicfoundation/ignition-ui": "^0.15.4", + "@nomicfoundation/ignition-core": "^0.15.5", + "@nomicfoundation/ignition-ui": "^0.15.5", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -1000,14 +1000,14 @@ } }, "node_modules/@nomicfoundation/hardhat-ignition-ethers": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.4.tgz", - "integrity": "sha512-vY30V4b788GSziW/nOd0L/4IPw6mwpluahLs4+gPUUKWaHHGMA8OIeHaYpRRljM1i0M/Kg1yIozrDM/aeRebkg==", + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.5.tgz", + "integrity": "sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==", "dev": true, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.15.4", - "@nomicfoundation/ignition-core": "^0.15.4", + "@nomicfoundation/hardhat-ignition": "^0.15.5", + "@nomicfoundation/ignition-core": "^0.15.5", "ethers": "^6.7.0", "hardhat": "^2.18.0" } @@ -1227,9 +1227,9 @@ } }, "node_modules/@nomicfoundation/ignition-core": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.4.tgz", - "integrity": "sha512-i379lH+xOLFdaDv0KiNma550ZXCHc5ZkmKYhM44xyLMKBlvX6skUVFkgUjjN1gvprgOIxc17GVQXlR1R5FhGZA==", + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.5.tgz", + "integrity": "sha512-FgvuoIXhakRSP524JzNQ4BviyzBBKpsFaOWubPZ4XACLT4/7vGqlJ/7DIn0D2NL2anQ2qs98/BNBY9WccXUX1Q==", "dev": true, "peer": true, "dependencies": { @@ -1320,9 +1320,9 @@ } }, "node_modules/@nomicfoundation/ignition-ui": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.4.tgz", - "integrity": "sha512-cHbmuxmhso5n2zdIaaIW4p8NNzrFj0mrnv8ufhAZfM3s3IFrRoGc1zo8hI/n1CiOTPuqUbdZcB79d+2tCKtCNw==", + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.5.tgz", + "integrity": "sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ==", "dev": true, "peer": true }, diff --git a/package.json b/package.json index c5af5099c..fc1ac9c02 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "homepage": "https://github.com/etherisc/gif-next#readme", "devDependencies": { "@nomicfoundation/hardhat-foundry": "^1.1.1", - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.4", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.5", "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@nomicfoundation/hardhat-verify": "^2.0.1", "@typescript-eslint/eslint-plugin": "^7.1.0",