@diamondslab/diamonds 1.3.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"BaseDeploymentStrategy.js","sourceRoot":"","sources":["../../src/strategies/BaseDeploymentStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import '@nomicfoundation/hardhat-ethers';\nimport chalk from 'chalk';\nimport { ethers } from 'ethers';\nimport hre from 'hardhat';\nimport { Diamond } from '../core/Diamond';\nimport { DeployedFacet } from '../schemas';\nimport {\n\tCallbackArgs,\n\tFacetCutAction,\n\tFacetCuts,\n\tFacetDeploymentInfo,\n\tFunctionSelectorRegistryEntry,\n\tNewDeployedFacet,\n\tRegistryFacetCutAction,\n} from '../types';\nimport {\n\tgetContractName,\n\tgetDeployedFacetInterfaces,\n\tgetDiamondContractName,\n\tlogTx,\n} from '../utils';\nimport { DeploymentStrategy } from './DeploymentStrategy';\n\nexport class BaseDeploymentStrategy implements DeploymentStrategy {\n\tconstructor(protected verbose: boolean = false) {}\n\n\tasync preDeployDiamond(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`šŸ”§ Running pre-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.preDeployDiamondTasks(diamond);\n\t}\n\n\tprotected async preDeployDiamondTasks(diamond: Diamond): Promise<void> {}\n\n\tasync deployDiamond(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(\n\t\t\t\t\t`\\nšŸŖ“ Deploying diamond ${diamond.diamondName} with DiamondCutFacet...`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.deployDiamondTasks(diamond);\n\t}\n\n\tprotected async deployDiamondTasks(diamond: Diamond): Promise<void> {\n\t\tconsole.log(\n\t\t\tchalk.blueBright(\n\t\t\t\t`šŸš€ Explicitly deploying DiamondCutFacet and Diamond for ${diamond.diamondName}`,\n\t\t\t),\n\t\t);\n\n\t\t// Deploy the DiamondCutFacet - use contract mapping to get correct name\n\t\tconst diamondCutContractName = await getContractName('DiamondCutFacet', diamond);\n\t\tconst diamondCutFactory = await hre.ethers.getContractFactory(\n\t\t\tdiamondCutContractName,\n\t\t\tdiamond.getSigner()!,\n\t\t);\n\t\tconst diamondCutFacet = await diamondCutFactory.deploy();\n\t\tawait diamondCutFacet.waitForDeployment();\n\n\t\t// Deploy the Diamond - use contract mapping to get correct name\n\t\tconst diamondContractName = await getDiamondContractName(diamond.diamondName, diamond);\n\t\tconst diamondFactory = await hre.ethers.getContractFactory(\n\t\t\tdiamondContractName,\n\t\t\tdiamond.getSigner()!,\n\t\t);\n\t\tconst diamondContract = await diamondFactory.deploy(\n\t\t\tawait diamond.getSigner()!.getAddress(),\n\t\t\tawait diamondCutFacet.getAddress(),\n\t\t);\n\t\tawait diamondContract.waitForDeployment();\n\n\t\t// Get function selectors for DiamondCutFacet\n\t\tconst diamondCutFacetFunctionSelectors: string[] = [];\n\t\tdiamondCutFacet.interface.forEachFunction((func: ethers.FunctionFragment) => {\n\t\t\tdiamondCutFacetFunctionSelectors.push(func.selector);\n\t\t});\n\n\t\t// Get addresses for later use\n\t\tconst diamondCutFacetAddress = await diamondCutFacet.getAddress();\n\t\tconst diamondContractAddress = await diamondContract.getAddress();\n\n\t\t// Register the DiamondCutFacet function selectors\n\t\tconst diamondCutFacetSelectorsRegistry = diamondCutFacetFunctionSelectors.reduce(\n\t\t\t(acc, selector) => {\n\t\t\t\tacc[selector] = {\n\t\t\t\t\tfacetName: 'DiamondCutFacet',\n\t\t\t\t\tpriority: diamond.getFacetsConfig()?.DiamondCutFacet?.priority || 1000, // Default priority if not set\n\t\t\t\t\taddress: diamondCutFacetAddress,\n\t\t\t\t\taction: RegistryFacetCutAction.Deployed,\n\t\t\t\t};\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, Omit<FunctionSelectorRegistryEntry, 'selector'>>,\n\t\t);\n\n\t\tdiamond.registerFunctionSelectors(diamondCutFacetSelectorsRegistry);\n\n\t\t// Update deployed diamond data\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tdeployedDiamondData.DeployerAddress = await diamond.getSigner()!.getAddress();\n\t\tdeployedDiamondData.DiamondAddress = diamondContractAddress;\n\t\tdeployedDiamondData.DeployedFacets = deployedDiamondData.DeployedFacets || {};\n\t\tdeployedDiamondData.DeployedFacets['DiamondCutFacet'] = {\n\t\t\taddress: diamondCutFacetAddress,\n\t\t\ttx_hash: diamondCutFacet.deploymentTransaction()?.hash || '',\n\t\t\tversion: 0,\n\t\t\tfuncSelectors: diamondCutFacetFunctionSelectors,\n\t\t};\n\n\t\tdiamond.updateDeployedDiamondData(deployedDiamondData);\n\n\t\tconsole.log(\n\t\t\tchalk.green(\n\t\t\t\t`āœ… Diamond deployed at ${await diamondContract.getAddress()}, DiamondCutFacet at ${await diamondCutFacet.getAddress()}`,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync postDeployDiamond(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.postDeployDiamondTasks(diamond);\n\t}\n\n\tprotected async postDeployDiamondTasks(diamond: Diamond): Promise<void> {}\n\n\tasync preDeployFacets(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ Running pre-deploy logic for facets of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.preDeployFacetsTasks(diamond);\n\t}\n\n\tprotected async preDeployFacetsTasks(diamond: Diamond): Promise<void> {\n\t\t// This can be overridden by subclasses for custom pre-deploy logic\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ No pre-deploy tasks defined for facets of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync deployFacets(diamond: Diamond): Promise<void> {\n\t\tawait this.deployFacetsTasks(diamond);\n\t}\n\n\tprotected async deployFacetsTasks(diamond: Diamond) {\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst facetsConfig = diamond.getDeployConfig().facets;\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tconst deployedFacets = deployedDiamondData.DeployedFacets || {};\n\t\tconst facetCuts: FacetDeploymentInfo[] = [];\n\n\t\tconst sortedFacetNames = Object.keys(deployConfig.facets).sort((a, b) => {\n\t\t\treturn (\n\t\t\t\t(deployConfig.facets[a].priority || 1000) -\n\t\t\t\t(deployConfig.facets[b].priority || 1000)\n\t\t\t);\n\t\t});\n\n\t\t// Save the facet deployment info\n\t\tfor (const facetName of sortedFacetNames) {\n\t\t\tconst facetConfig = facetsConfig[facetName];\n\t\t\tconst deployedVersion =\n\t\t\t\tdeployedDiamondData.DeployedFacets?.[facetName]?.version ?? -1;\n\t\t\tconst availableVersions = Object.keys(facetConfig.versions || {}).map(Number);\n\t\t\tconst upgradeVersion = Math.max(...availableVersions);\n\t\t\t// Find the original string key that matches the upgrade version number\n\t\t\tconst upgradeVersionKey =\n\t\t\t\tObject.keys(facetConfig.versions || {}).find(\n\t\t\t\t\t(key) => Number(key) === upgradeVersion,\n\t\t\t\t) || String(upgradeVersion);\n\n\t\t\tif (upgradeVersion > deployedVersion || deployedVersion === -1) {\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t`šŸš€ Deploying facet: ${facetName} to version ${upgradeVersion}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Deploy the facet contract - use contract mapping to get correct name\n\t\t\t\tconst signer = diamond.getSigner()!;\n\t\t\t\tconst facetContractName = await getContractName(facetName, diamond);\n\t\t\t\tconst facetFactory = await hre.ethers.getContractFactory(facetContractName, {\n\t\t\t\t\tsigner,\n\t\t\t\t});\n\t\t\t\tconst facetContract = await facetFactory.deploy();\n\t\t\t\tawait facetContract.waitForDeployment();\n\n\t\t\t\tconst deployedFacets = new Map<string, DeployedFacet>();\n\t\t\t\tconst availableVersions = Object.keys(facetConfig.versions ?? {}).map(Number);\n\t\t\t\tconst facetSelectors: string[] = [];\n\t\t\t\tfacetContract.interface.forEachFunction((func: ethers.FunctionFragment) => {\n\t\t\t\t\tfacetSelectors.push(func.selector);\n\t\t\t\t});\n\n\t\t\t\t// Apply deployExclude filter to remove selectors before storing\n\t\t\t\tconst excludeFuncSelectors =\n\t\t\t\t\tfacetConfig.versions?.[upgradeVersionKey]?.deployExclude || [];\n\t\t\t\tfor (const excludeSelector of excludeFuncSelectors) {\n\t\t\t\t\tconst selectorToExclude = ethers.id(excludeSelector).slice(0, 10);\n\t\t\t\t\tconst index = facetSelectors.indexOf(selectorToExclude);\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tfacetSelectors.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply deployInclude filter to only include specified selectors\n\t\t\t\tconst includeFuncSelectors =\n\t\t\t\t\tfacetConfig.versions?.[upgradeVersionKey]?.deployInclude || [];\n\t\t\t\tif (includeFuncSelectors.length > 0) {\n\t\t\t\t\t// Convert include signatures to selectors\n\t\t\t\t\tconst includeSelectors = includeFuncSelectors.map((sig) =>\n\t\t\t\t\t\tethers.id(sig).slice(0, 10),\n\t\t\t\t\t);\n\t\t\t\t\t// Filter facetSelectors to only include the specified ones\n\t\t\t\t\tconst filteredSelectors = facetSelectors.filter((selector) =>\n\t\t\t\t\t\tincludeSelectors.includes(selector),\n\t\t\t\t\t);\n\t\t\t\t\t// Replace facetSelectors with filtered list\n\t\t\t\t\tfacetSelectors.length = 0;\n\t\t\t\t\tfacetSelectors.push(...filteredSelectors);\n\t\t\t\t}\n\n\t\t\t\t// Initializer function Registry\n\t\t\t\tconst deployInit = facetConfig.versions?.[upgradeVersionKey]?.deployInit || '';\n\t\t\t\tconst upgradeInit = facetConfig.versions?.[upgradeVersionKey]?.upgradeInit || '';\n\n\t\t\t\tconst initFn = diamond.newDeployment ? deployInit : upgradeInit;\n\t\t\t\tif (initFn && facetName !== deployConfig.protocolInitFacet) {\n\t\t\t\t\tdiamond.initializerRegistry.set(facetName, initFn);\n\t\t\t\t}\n\n\t\t\t\tconst newFacetData: NewDeployedFacet = {\n\t\t\t\t\tpriority: facetConfig.priority || 1000,\n\t\t\t\t\taddress: await facetContract.getAddress(),\n\t\t\t\t\ttx_hash: facetContract.deploymentTransaction()?.hash || '',\n\t\t\t\t\tversion: upgradeVersion,\n\t\t\t\t\tfuncSelectors: facetSelectors,\n\t\t\t\t\tdeployInclude: facetConfig.versions?.[upgradeVersionKey]?.deployInclude || [],\n\t\t\t\t\tdeployExclude: facetConfig.versions?.[upgradeVersionKey]?.deployExclude || [],\n\t\t\t\t\tinitFunction: initFn,\n\t\t\t\t\tverified: false,\n\t\t\t\t};\n\n\t\t\t\tdiamond.updateNewDeployedFacets(facetName, newFacetData);\n\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.cyan(\n\t\t\t\t\t\t`⛵ ${facetName} deployed at ${await facetContract.getAddress()} with ${facetSelectors.length} selectors.`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\t// Log the deployment transaction and selectors\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(chalk.gray(` Selectors:`), facetSelectors);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync postDeployFacets(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`āœ… Running post-deploy logic for facets of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.postDeployFacetsTasks(diamond);\n\t}\n\n\t// Used by subclasses for facet post-deployment tasks\n\tprotected async postDeployFacetsTasks(diamond: Diamond): Promise<void> {}\n\n\t// Pre-hook for updating function selector registry (can be overridden by subclasses)\n\tasync preUpdateFunctionSelectorRegistry(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ Running pre-update logic for function selector registry of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected async preUpdateFunctionSelectorRegistryTasks(diamond: Diamond): Promise<void> {}\n\n\tasync updateFunctionSelectorRegistry(diamond: Diamond) {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(\n\t\t\t\t\t`\\nšŸŖ“ Updating function selector registry for diamond ${diamond.diamondName}...`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tthis.updateFunctionSelectorRegistryTasks(diamond);\n\t}\n\n\tprotected async updateFunctionSelectorRegistryTasks(diamond: Diamond): Promise<void> {\n\t\tconst registry = diamond.functionSelectorRegistry;\n\t\tconst zeroAddress = ethers.ZeroAddress;\n\n\t\tconst newDeployedFacets = diamond.getNewDeployedFacets();\n\t\tconst newDeployedFacetsByPriority = Object.entries(newDeployedFacets).sort(\n\t\t\t([, a], [, b]) => (a.priority || 1000) - (b.priority || 1000),\n\t\t);\n\n\t\tfor (const [newFacetName, newFacetData] of newDeployedFacetsByPriority) {\n\t\t\tconst currentFacetAddress = newFacetData.address;\n\t\t\tconst priority: number = newFacetData.priority;\n\t\t\tconst includeFuncSelectors: string[] = newFacetData.deployInclude || [];\n\t\t\tconst excludeFuncSelectors: string[] = newFacetData.deployExclude || [];\n\n\t\t\t// Convert function signatures to selectors\n\t\t\tconst includeFuncSelectorsAsSelectors = includeFuncSelectors.map((sig) =>\n\t\t\t\tethers.id(sig).slice(0, 10),\n\t\t\t);\n\t\t\tconst excludeFuncSelectorsAsSelectors = excludeFuncSelectors.map((sig) =>\n\t\t\t\tethers.id(sig).slice(0, 10),\n\t\t\t);\n\n\t\t\t// Initialize funcSelectors if not present\n\t\t\tif (!newFacetData.funcSelectors) {\n\t\t\t\tnewFacetData.funcSelectors = [];\n\t\t\t}\n\t\t\tconst functionSelectors: string[] = newFacetData.funcSelectors;\n\n\t\t\t/* ------------------ Exclusion Filter ------------------ */\n\t\t\tfor (const excludeFuncSelector of excludeFuncSelectorsAsSelectors) {\n\t\t\t\t// remove from the facets functionSelectors\n\t\t\t\tif (functionSelectors.includes(excludeFuncSelector)) {\n\t\t\t\t\tfunctionSelectors.splice(functionSelectors.indexOf(excludeFuncSelector), 1);\n\t\t\t\t}\n\t\t\t\t// update action to remove if excluded from registry where a previous deployment associated with facetname\n\t\t\t\tif (\n\t\t\t\t\tregistry.has(excludeFuncSelector) &&\n\t\t\t\t\tregistry.get(excludeFuncSelector)?.facetName === newFacetName\n\t\t\t\t) {\n\t\t\t\t\tconst existing = registry.get(excludeFuncSelector);\n\t\t\t\t\tif (existing?.facetName === newFacetName) {\n\t\t\t\t\t\tregistry.set(excludeFuncSelector, {\n\t\t\t\t\t\t\tpriority: priority,\n\t\t\t\t\t\t\taddress: currentFacetAddress,\n\t\t\t\t\t\t\taction: RegistryFacetCutAction.Remove,\n\t\t\t\t\t\t\tfacetName: newFacetName,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* ------------ Higher Priority Split of Registry ------------------ */\n\t\t\tconst registryHigherPrioritySplit = Array.from(registry.entries())\n\t\t\t\t.filter(([_, entry]) => entry.priority > priority)\n\t\t\t\t.reduce(\n\t\t\t\t\t(acc, [selector, entry]) => {\n\t\t\t\t\t\tif (!acc[entry.facetName]) {\n\t\t\t\t\t\t\tacc[entry.facetName] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tacc[entry.facetName].push(selector);\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t},\n\t\t\t\t\t{} as Record<string, string[]>,\n\t\t\t\t);\n\n\t\t\t/* ------------------ Inclusion Override Filter ------------------ */\n\t\t\tfor (const includeFuncSelector of includeFuncSelectorsAsSelectors) {\n\t\t\t\t// Force Replace if already registered by higher priority facet\n\t\t\t\tconst higherPriorityFacet = Object.keys(registryHigherPrioritySplit).find(\n\t\t\t\t\t(facetName) => {\n\t\t\t\t\t\treturn registryHigherPrioritySplit[facetName].includes(includeFuncSelector);\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (higherPriorityFacet) {\n\t\t\t\t\tregistry.set(includeFuncSelector, {\n\t\t\t\t\t\tpriority: priority,\n\t\t\t\t\t\taddress: currentFacetAddress,\n\t\t\t\t\t\taction: RegistryFacetCutAction.Replace,\n\t\t\t\t\t\tfacetName: newFacetName,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Add to the registry\n\t\t\t\t\tregistry.set(includeFuncSelector, {\n\t\t\t\t\t\tpriority: priority,\n\t\t\t\t\t\taddress: currentFacetAddress,\n\t\t\t\t\t\taction: RegistryFacetCutAction.Add,\n\t\t\t\t\t\tfacetName: newFacetName,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// remove from the funcSels so it is not modified in Priority Resolution Pass\n\t\t\t\tconst existing = newDeployedFacets[newFacetName];\n\t\t\t\tif (\n\t\t\t\t\texisting &&\n\t\t\t\t\texisting.funcSelectors &&\n\t\t\t\t\texisting.funcSelectors.includes(includeFuncSelector)\n\t\t\t\t) {\n\t\t\t\t\texisting.funcSelectors.splice(\n\t\t\t\t\t\texisting.funcSelectors.indexOf(includeFuncSelector),\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* ------------------ Replace Facet and Priority Resolution Pass ------------- */\n\t\t\tfor (const selector of functionSelectors) {\n\t\t\t\tconst existing = registry.get(selector);\n\t\t\t\tif (existing) {\n\t\t\t\t\tconst existingPriority = existing.priority;\n\n\t\t\t\t\tif (existing.facetName === newFacetName) {\n\t\t\t\t\t\t// Same facet, update the address\n\t\t\t\t\t\tregistry.set(selector, {\n\t\t\t\t\t\t\tpriority: priority,\n\t\t\t\t\t\t\taddress: currentFacetAddress,\n\t\t\t\t\t\t\taction: RegistryFacetCutAction.Replace,\n\t\t\t\t\t\t\tfacetName: newFacetName,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (priority < existingPriority) {\n\t\t\t\t\t\t// Current facet has higher priority, Replace it\n\t\t\t\t\t\tregistry.set(selector, {\n\t\t\t\t\t\t\tpriority: priority,\n\t\t\t\t\t\t\taddress: currentFacetAddress,\n\t\t\t\t\t\t\taction: RegistryFacetCutAction.Replace,\n\t\t\t\t\t\t\tfacetName: newFacetName,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// New selector, simply add\n\t\t\t\t\tregistry.set(selector, {\n\t\t\t\t\t\tpriority: priority,\n\t\t\t\t\t\taddress: currentFacetAddress,\n\t\t\t\t\t\taction: RegistryFacetCutAction.Add,\n\t\t\t\t\t\tfacetName: newFacetName,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* ---------------- Remove Old Function Selectors from facets -------------- */\n\t\t\t// Set functionselectors with the newFacetName and still different address to Remove\n\t\t\tfor (const [selector, entry] of registry.entries()) {\n\t\t\t\tif (entry.facetName === newFacetName && entry.address !== currentFacetAddress) {\n\t\t\t\t\tregistry.set(selector, {\n\t\t\t\t\t\tpriority: entry.priority,\n\t\t\t\t\t\taddress: zeroAddress,\n\t\t\t\t\t\taction: RegistryFacetCutAction.Remove,\n\t\t\t\t\t\tfacetName: newFacetName,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// `Remove` function selectors for facets no longer in config (deleted facets)\n\t\tconst facetsConfig = diamond.getDeployConfig().facets;\n\t\tconst facetNames = Object.keys(facetsConfig);\n\t\tfor (const [selector, entry] of registry.entries()) {\n\t\t\tif (!facetNames.includes(entry.facetName)) {\n\t\t\t\tregistry.set(selector, {\n\t\t\t\t\tpriority: entry.priority,\n\t\t\t\t\taddress: zeroAddress,\n\t\t\t\t\taction: RegistryFacetCutAction.Remove,\n\t\t\t\t\tfacetName: entry.facetName,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tasync postUpdateFunctionSelectorRegistry(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`āœ… Running post-update logic for function selector registry of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync prePerformDiamondCut(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`šŸ”§ Running pre-diamond cut logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.prePerformDiamondCutTasks(diamond);\n\t}\n\n\tprotected async prePerformDiamondCutTasks(diamond: Diamond): Promise<void> {\n\t\t// This can be overridden by subclasses for custom pre-diamond cut logic\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ No pre-diamond cut tasks defined for diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync performDiamondCut(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(\n\t\t\t\t\t`\\nšŸŖ“ Performing diamond cut for diamond ${diamond.diamondName}...`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.performDiamondCutTasks(diamond);\n\t}\n\n\tprotected async performDiamondCutTasks(diamond: Diamond): Promise<void> {\n\t\tconst diamondSignerAddress = await diamond.getSigner()?.getAddress()!;\n\t\tconst signer = await hre.ethers.getSigner(diamondSignerAddress!);\n\t\tconst diamondContract = await hre.ethers.getContractAt(\n\t\t\t'IDiamondCut',\n\t\t\tdiamond.getDeployedDiamondData().DiamondAddress!,\n\t\t);\n\t\tconst signerDiamondContract = diamondContract.connect(signer);\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\n\t\t// Setup initCallData with Atomic Protocol Initializer\n\t\tconst [initCalldata, initAddress] = await this.getInitCalldata(diamond);\n\n\t\t// extract facet cuts from the selector registry\n\t\tconst facetCuts: FacetCuts = await this.getFacetCuts(diamond);\n\n\t\t// Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses\n\t\tawait this.validateNoOrphanedSelectors(facetCuts);\n\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(`\\nšŸŖ“ Performing DiamondCut with ${facetCuts.length} cut(s):`),\n\t\t\t);\n\t\t\tfor (const cut of facetCuts) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.bold(\n\t\t\t\t\t\t`- ${FacetCutAction[cut.action]} for facet ${cut.name} at ${cut.facetAddress}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconsole.log(chalk.gray(` Selectors:`), cut.functionSelectors);\n\t\t\t}\n\t\t\tif (initAddress !== ethers.ZeroAddress) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.cyan(\n\t\t\t\t\t\t`Initializing with functionSelector ${initCalldata} on ProtocolInitFacet ${deployConfig.protocolInitFacet} @ ${initAddress}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t/* -------------------------- Perform the diamond cut -----------------------*/\n\t\tconst facetSelectorCutMap = facetCuts.map((fc) => ({\n\t\t\tfacetAddress: fc.facetAddress,\n\t\t\taction: fc.action,\n\t\t\tfunctionSelectors: fc.functionSelectors,\n\t\t}));\n\t\tconst tx = await (signerDiamondContract as any).diamondCut(\n\t\t\tfacetSelectorCutMap,\n\t\t\tinitAddress,\n\t\t\tinitCalldata,\n\t\t);\n\n\t\t/* --------------------- Update the deployed diamond data ------------------ */\n\t\tconst txHash = tx.hash;\n\t\tawait this.postDiamondCutDeployedDataUpdate(diamond, txHash);\n\n\t\tconst ifaceList = getDeployedFacetInterfaces(deployedDiamondData);\n\t\t// Log the transaction\n\t\tif (this.verbose) {\n\t\t\tawait logTx(tx, 'DiamondCut', ifaceList);\n\t\t} else {\n\t\t\tconsole.log(chalk.blueBright(`šŸ”„ Waiting for DiamondCut transaction to be mined...`));\n\t\t\tawait tx.wait();\n\t\t}\n\n\t\tconsole.log(chalk.green(`āœ… DiamondCut executed: ${tx.hash}`));\n\n\t\tfor (const [facetName, initFunction] of diamond.initializerRegistry.entries()) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.blueBright(`ā–¶ Running ${initFunction} from the ${facetName} facet`),\n\t\t\t);\n\t\t\t// const contract = await ethers.getContractAt(facetName, diamondSignerAddress!);\n\t\t\tconst facetContractName = await getContractName(facetName, diamond);\n\t\t\tconst initContract = await hre.ethers.getContractAt(\n\t\t\t\tfacetContractName,\n\t\t\t\tdiamond.getDeployedDiamondData().DiamondAddress!,\n\t\t\t);\n\t\t\tconst signerDiamondContract = initContract.connect(signer);\n\n\t\t\tconst tx = await initContract[initFunction]();\n\t\t\t// const tx = await signerDiamondContract.initFunction;\n\t\t\tif (this.verbose) {\n\t\t\t\tlogTx(tx, `${facetName}.${initFunction}`, ifaceList);\n\t\t\t} else {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.blueBright(`šŸ”„ Waiting for ${facetName}.${initFunction}} mined...`),\n\t\t\t\t);\n\t\t\t\tawait tx.wait();\n\t\t\t}\n\t\t\tconsole.log(chalk.green(`āœ… ${facetName}.${initFunction} executed`));\n\t\t}\n\t}\n\n\tasync postPerformDiamondCut(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-diamond cut logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.postPerformDiamondCutTasks(diamond);\n\t}\n\n\tprotected async postPerformDiamondCutTasks(diamond: Diamond): Promise<void> {}\n\n\tasync getInitCalldata(diamond: Diamond): Promise<[string, string]> {\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tconst deployConfig = diamond.getDeployConfig();\n\n\t\tlet initAddress = ethers.ZeroAddress;\n\t\tlet initCalldata = '0x';\n\n\t\tconst protocolInitFacet = deployConfig.protocolInitFacet || '';\n\t\tconst protocolVersion = deployConfig.protocolVersion;\n\t\tconst protocolFacetInfo = diamond.getNewDeployedFacets()[protocolInitFacet];\n\n\t\tif (protocolInitFacet && protocolFacetInfo) {\n\t\t\tconst versionCfg =\n\t\t\t\tdeployConfig.facets[protocolInitFacet]?.versions?.[protocolVersion];\n\t\t\tconst initFn = diamond.newDeployment\n\t\t\t\t? versionCfg?.deployInit\n\t\t\t\t: versionCfg?.upgradeInit;\n\n\t\t\tif (initFn) {\n\t\t\t\tconst iface = new ethers.Interface([`function ${initFn}`]);\n\t\t\t\tinitAddress = protocolFacetInfo.address!;\n\t\t\t\tinitCalldata = iface.encodeFunctionData(initFn);\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.cyan(\n\t\t\t\t\t\t\t`šŸ”§ Using protocol-wide initializer: ${protocolInitFacet}.${initFn}()`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (initAddress === ethers.ZeroAddress) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(`āš ļø No protocol-wide initializer found. Using zero address.`),\n\t\t\t);\n\t\t}\n\t\tdiamond.setInitAddress(initAddress);\n\t\treturn [initCalldata, initAddress];\n\t}\n\n\tasync getFacetCuts(diamond: Diamond): Promise<FacetCuts> {\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst selectorRegistry = diamond.functionSelectorRegistry;\n\t\t/* -------------------------- Prepare the facet cuts -----------------------*/\n\t\t// extract facet cuts from the selector registry\n\t\tconst facetCuts = Array.from(selectorRegistry.entries())\n\t\t\t.filter(([_, entry]) => entry.action !== RegistryFacetCutAction.Deployed)\n\t\t\t.map(([selector, entry]) => {\n\t\t\t\treturn {\n\t\t\t\t\tfacetAddress: entry.address,\n\t\t\t\t\taction: entry.action,\n\t\t\t\t\tfunctionSelectors: [selector],\n\t\t\t\t\tname: entry.facetName,\n\t\t\t\t};\n\t\t\t});\n\n\t\treturn facetCuts;\n\t}\n\n\tasync validateNoOrphanedSelectors(facetCuts: FacetCuts): Promise<void> {\n\t\t// Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses\n\t\tconst orphanedSelectors = facetCuts.filter((facetCut) => {\n\t\t\treturn facetCuts.some((otherFacetCut) => {\n\t\t\t\treturn (\n\t\t\t\t\totherFacetCut.facetAddress !== facetCut.facetAddress &&\n\t\t\t\t\totherFacetCut.name === facetCut.name &&\n\t\t\t\t\t(otherFacetCut.action === RegistryFacetCutAction.Add ||\n\t\t\t\t\t\totherFacetCut.action === RegistryFacetCutAction.Replace ||\n\t\t\t\t\t\totherFacetCut.action === RegistryFacetCutAction.Deployed)\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tif (orphanedSelectors.length > 0) {\n\t\t\tconsole.error(\n\t\t\t\tchalk.redBright(\n\t\t\t\t\t`āŒ Orphaned selectors found for facet ${orphanedSelectors[0].name} at address ${orphanedSelectors[0].facetAddress}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconsole.error(chalk.redBright(` - ${orphanedSelectors[0].functionSelectors}`));\n\t\t\tthrow new Error(\n\t\t\t\t`Orphaned selectors found for facet ${orphanedSelectors[0].name} at address ${orphanedSelectors[0].facetAddress}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync postDiamondCutDeployedDataUpdate(diamond: Diamond, txHash: string): Promise<void> {\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tconst selectorRegistry = diamond.functionSelectorRegistry;\n\t\tconst newDeployedFacets = diamond.getNewDeployedFacets();\n\n\t\tdeployedDiamondData.protocolVersion = deployConfig.protocolVersion;\n\n\t\t// Aggregate selectors for each facet\n\t\tconst facetSelectorsMap: Record<string, { address: string; selectors: string[] }> = {};\n\n\t\tfor (const [selector, entry] of selectorRegistry.entries()) {\n\t\t\tconst facetName = entry.facetName;\n\t\t\tif (!facetSelectorsMap[facetName]) {\n\t\t\t\tfacetSelectorsMap[facetName] = { address: entry.address, selectors: [] };\n\t\t\t}\n\t\t\tif (\n\t\t\t\tentry.action === RegistryFacetCutAction.Add ||\n\t\t\t\tentry.action === RegistryFacetCutAction.Replace ||\n\t\t\t\tentry.action === RegistryFacetCutAction.Deployed\n\t\t\t) {\n\t\t\t\tfacetSelectorsMap[facetName].selectors.push(selector);\n\t\t\t}\n\t\t}\n\n\t\t// Update deployed facets with aggregated selectors\n\t\tdeployedDiamondData.DeployedFacets = deployedDiamondData.DeployedFacets || {};\n\t\tfor (const [facetName, { address, selectors }] of Object.entries(facetSelectorsMap)) {\n\t\t\tif (selectors.length > 0) {\n\t\t\t\tlet facetVersion: number;\n\n\t\t\t\tif (newDeployedFacets[facetName]) {\n\t\t\t\t\t// Use the version from newly deployed facet\n\t\t\t\t\tfacetVersion = newDeployedFacets[facetName].version;\n\t\t\t\t} else {\n\t\t\t\t\t// For facets not in newDeployedFacets (like existing deployed facets),\n\t\t\t\t\t// preserve their existing version or use 0 as default\n\t\t\t\t\tfacetVersion = deployedDiamondData.DeployedFacets[facetName]?.version ?? 0;\n\t\t\t\t}\n\n\t\t\t\tdeployedDiamondData.DeployedFacets[facetName] = {\n\t\t\t\t\taddress,\n\t\t\t\t\ttx_hash: txHash,\n\t\t\t\t\tversion: facetVersion,\n\t\t\t\t\tfuncSelectors: selectors,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Remove facets with no selectors\n\t\tfor (const facetName of Object.keys(deployedDiamondData.DeployedFacets)) {\n\t\t\tif (facetSelectorsMap[facetName]?.selectors.length === 0) {\n\t\t\t\tdelete deployedDiamondData.DeployedFacets[facetName];\n\t\t\t}\n\t\t}\n\n\t\tdiamond.updateDeployedDiamondData(deployedDiamondData);\n\t}\n\n\tasync preRunPostDeployCallbacks(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`šŸ”§ Running pre-post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync runPostDeployCallbacks(diamond: Diamond): Promise<void> {\n\t\tawait this.runPostDeployCallbacksTasks(diamond);\n\t}\n\n\tprotected async runPostDeployCallbacksTasks(diamond: Diamond): Promise<void> {\n\t\tconsole.log(`šŸ”„ Running post-deployment callbacks...`);\n\n\t\tconst deployConfig = diamond.getDeployConfig();\n\n\t\tfor (const [facetName, facetConfig] of Object.entries(deployConfig.facets)) {\n\t\t\tif (!facetConfig.versions) continue;\n\n\t\t\tfor (const [version, config] of Object.entries(facetConfig.versions)) {\n\t\t\t\tif (config.callbacks) {\n\t\t\t\t\tconst args: CallbackArgs = {\n\t\t\t\t\t\tdiamond: diamond,\n\t\t\t\t\t};\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.cyanBright(\n\t\t\t\t\t\t\t`Executing callback ${config.callbacks} for facet ${facetName}...`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tawait diamond.callbackManager.executeCallback(facetName, config.callbacks, args);\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.magenta(\n\t\t\t\t\t\t\t`āœ… Callback ${config.callbacks} executed for facet ${facetName}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(chalk.greenBright`āœ… All post-deployment callbacks executed.`);\n\t}\n\n\tasync postRunPostDeployCallbacks(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected async postRunPostDeployCallbacksTasks(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"BaseDeploymentStrategy.js","sourceRoot":"","sources":["../../src/strategies/BaseDeploymentStrategy.ts"],"names":[],"mappings":"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","sourcesContent":["import '@nomicfoundation/hardhat-ethers';\nimport chalk from 'chalk';\nimport { ethers } from 'ethers';\nimport hre from 'hardhat';\nimport { Diamond } from '../core/Diamond';\nimport { DeployedFacet } from '../schemas';\nimport {\n\tCallbackArgs,\n\tFacetCutAction,\n\tFacetCuts,\n\tFacetDeploymentInfo,\n\tFunctionSelectorRegistryEntry,\n\tNewDeployedFacet,\n\tRegistryFacetCutAction,\n} from '../types';\nimport {\n\tgetContractName,\n\tgetDeployedFacetInterfaces,\n\tgetDiamondContractName,\n\tlogTx,\n} from '../utils';\nimport { computeFacetSelectors, resolveFunctionSelectorRegistry } from '../resolution';\nimport { DeploymentStrategy } from './DeploymentStrategy';\n\nexport class BaseDeploymentStrategy implements DeploymentStrategy {\n\tconstructor(protected verbose: boolean = false) {}\n\n\tasync preDeployDiamond(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`šŸ”§ Running pre-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.preDeployDiamondTasks(diamond);\n\t}\n\n\tprotected async preDeployDiamondTasks(diamond: Diamond): Promise<void> {}\n\n\tasync deployDiamond(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(\n\t\t\t\t\t`\\nšŸŖ“ Deploying diamond ${diamond.diamondName} with DiamondCutFacet...`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.deployDiamondTasks(diamond);\n\t}\n\n\tprotected async deployDiamondTasks(diamond: Diamond): Promise<void> {\n\t\tconsole.log(\n\t\t\tchalk.blueBright(\n\t\t\t\t`šŸš€ Explicitly deploying DiamondCutFacet and Diamond for ${diamond.diamondName}`,\n\t\t\t),\n\t\t);\n\n\t\t// Deploy the DiamondCutFacet - use contract mapping to get correct name\n\t\tconst diamondCutContractName = await getContractName('DiamondCutFacet', diamond);\n\t\tconst diamondCutFactory = await hre.ethers.getContractFactory(\n\t\t\tdiamondCutContractName,\n\t\t\tdiamond.getSigner()!,\n\t\t);\n\t\tconst diamondCutFacet = await diamondCutFactory.deploy();\n\t\tawait diamondCutFacet.waitForDeployment();\n\n\t\t// Deploy the Diamond - use contract mapping to get correct name\n\t\tconst diamondContractName = await getDiamondContractName(diamond.diamondName, diamond);\n\t\tconst diamondFactory = await hre.ethers.getContractFactory(\n\t\t\tdiamondContractName,\n\t\t\tdiamond.getSigner()!,\n\t\t);\n\t\tconst diamondContract = await diamondFactory.deploy(\n\t\t\tawait diamond.getSigner()!.getAddress(),\n\t\t\tawait diamondCutFacet.getAddress(),\n\t\t);\n\t\tawait diamondContract.waitForDeployment();\n\n\t\t// Get function selectors for DiamondCutFacet\n\t\tconst diamondCutFacetFunctionSelectors: string[] = [];\n\t\tdiamondCutFacet.interface.forEachFunction((func: ethers.FunctionFragment) => {\n\t\t\tdiamondCutFacetFunctionSelectors.push(func.selector);\n\t\t});\n\n\t\t// Get addresses for later use\n\t\tconst diamondCutFacetAddress = await diamondCutFacet.getAddress();\n\t\tconst diamondContractAddress = await diamondContract.getAddress();\n\n\t\t// Register the DiamondCutFacet function selectors\n\t\tconst diamondCutFacetSelectorsRegistry = diamondCutFacetFunctionSelectors.reduce(\n\t\t\t(acc, selector) => {\n\t\t\t\tacc[selector] = {\n\t\t\t\t\tfacetName: 'DiamondCutFacet',\n\t\t\t\t\tpriority: diamond.getFacetsConfig()?.DiamondCutFacet?.priority || 1000, // Default priority if not set\n\t\t\t\t\taddress: diamondCutFacetAddress,\n\t\t\t\t\taction: RegistryFacetCutAction.Deployed,\n\t\t\t\t};\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, Omit<FunctionSelectorRegistryEntry, 'selector'>>,\n\t\t);\n\n\t\tdiamond.registerFunctionSelectors(diamondCutFacetSelectorsRegistry);\n\n\t\t// Update deployed diamond data\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tdeployedDiamondData.DeployerAddress = await diamond.getSigner()!.getAddress();\n\t\tdeployedDiamondData.DiamondAddress = diamondContractAddress;\n\t\tdeployedDiamondData.DeployedFacets = deployedDiamondData.DeployedFacets || {};\n\t\tdeployedDiamondData.DeployedFacets['DiamondCutFacet'] = {\n\t\t\taddress: diamondCutFacetAddress,\n\t\t\ttx_hash: diamondCutFacet.deploymentTransaction()?.hash || '',\n\t\t\tversion: 0,\n\t\t\tfuncSelectors: diamondCutFacetFunctionSelectors,\n\t\t};\n\n\t\tdiamond.updateDeployedDiamondData(deployedDiamondData);\n\n\t\tconsole.log(\n\t\t\tchalk.green(\n\t\t\t\t`āœ… Diamond deployed at ${await diamondContract.getAddress()}, DiamondCutFacet at ${await diamondCutFacet.getAddress()}`,\n\t\t\t),\n\t\t);\n\t}\n\n\tasync postDeployDiamond(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.postDeployDiamondTasks(diamond);\n\t}\n\n\tprotected async postDeployDiamondTasks(diamond: Diamond): Promise<void> {}\n\n\tasync preDeployFacets(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ Running pre-deploy logic for facets of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.preDeployFacetsTasks(diamond);\n\t}\n\n\tprotected async preDeployFacetsTasks(diamond: Diamond): Promise<void> {\n\t\t// This can be overridden by subclasses for custom pre-deploy logic\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ No pre-deploy tasks defined for facets of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync deployFacets(diamond: Diamond): Promise<void> {\n\t\tawait this.deployFacetsTasks(diamond);\n\t}\n\n\tprotected async deployFacetsTasks(diamond: Diamond) {\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst facetsConfig = diamond.getDeployConfig().facets;\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tconst deployedFacets = deployedDiamondData.DeployedFacets || {};\n\t\tconst facetCuts: FacetDeploymentInfo[] = [];\n\n\t\tconst sortedFacetNames = Object.keys(deployConfig.facets).sort((a, b) => {\n\t\t\treturn (\n\t\t\t\t(deployConfig.facets[a].priority || 1000) -\n\t\t\t\t(deployConfig.facets[b].priority || 1000)\n\t\t\t);\n\t\t});\n\n\t\t// Save the facet deployment info\n\t\tfor (const facetName of sortedFacetNames) {\n\t\t\tconst facetConfig = facetsConfig[facetName];\n\t\t\tconst deployedVersion =\n\t\t\t\tdeployedDiamondData.DeployedFacets?.[facetName]?.version ?? -1;\n\t\t\tconst availableVersions = Object.keys(facetConfig.versions || {}).map(Number);\n\t\t\tconst upgradeVersion = Math.max(...availableVersions);\n\t\t\t// Find the original string key that matches the upgrade version number\n\t\t\tconst upgradeVersionKey =\n\t\t\t\tObject.keys(facetConfig.versions || {}).find(\n\t\t\t\t\t(key) => Number(key) === upgradeVersion,\n\t\t\t\t) || String(upgradeVersion);\n\n\t\t\tif (upgradeVersion > deployedVersion || deployedVersion === -1) {\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.blueBright(\n\t\t\t\t\t\t\t`šŸš€ Deploying facet: ${facetName} to version ${upgradeVersion}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// Deploy the facet contract - use contract mapping to get correct name\n\t\t\t\tconst signer = diamond.getSigner()!;\n\t\t\t\tconst facetContractName = await getContractName(facetName, diamond);\n\t\t\t\tconst facetFactory = await hre.ethers.getContractFactory(facetContractName, {\n\t\t\t\t\tsigner,\n\t\t\t\t});\n\t\t\t\tconst facetContract = await facetFactory.deploy();\n\t\t\t\tawait facetContract.waitForDeployment();\n\n\t\t\t\tconst deployedFacets = new Map<string, DeployedFacet>();\n\t\t\t\tconst availableVersions = Object.keys(facetConfig.versions ?? {}).map(Number);\n\t\t\t\tconst facetSelectors: string[] = [];\n\t\t\t\tfacetContract.interface.forEachFunction((func: ethers.FunctionFragment) => {\n\t\t\t\t\tfacetSelectors.push(func.selector);\n\t\t\t\t});\n\n\t\t\t\t// Apply deployExclude (removal) + deployInclude (whitelist) via the pure\n\t\t\t\t// resolution core. Behavior-preserving (M1-E1); deployInclude stays a\n\t\t\t\t// whitelist here — M2 makes it additive.\n\t\t\t\tconst excludeFuncSelectors =\n\t\t\t\t\tfacetConfig.versions?.[upgradeVersionKey]?.deployExclude || [];\n\t\t\t\tconst includeFuncSelectors =\n\t\t\t\t\tfacetConfig.versions?.[upgradeVersionKey]?.deployInclude || [];\n\t\t\t\tconst resolvedFacetSelectors = computeFacetSelectors(\n\t\t\t\t\tfacetSelectors,\n\t\t\t\t\tincludeFuncSelectors,\n\t\t\t\t\texcludeFuncSelectors,\n\t\t\t\t);\n\t\t\t\tfacetSelectors.length = 0;\n\t\t\t\tfacetSelectors.push(...resolvedFacetSelectors);\n\n\t\t\t\t// Initializer function Registry\n\t\t\t\tconst deployInit = facetConfig.versions?.[upgradeVersionKey]?.deployInit || '';\n\t\t\t\tconst upgradeInit = facetConfig.versions?.[upgradeVersionKey]?.upgradeInit || '';\n\n\t\t\t\tconst initFn = diamond.newDeployment ? deployInit : upgradeInit;\n\t\t\t\tif (initFn && facetName !== deployConfig.protocolInitFacet) {\n\t\t\t\t\tdiamond.initializerRegistry.set(facetName, initFn);\n\t\t\t\t}\n\n\t\t\t\tconst newFacetData: NewDeployedFacet = {\n\t\t\t\t\tpriority: facetConfig.priority || 1000,\n\t\t\t\t\taddress: await facetContract.getAddress(),\n\t\t\t\t\ttx_hash: facetContract.deploymentTransaction()?.hash || '',\n\t\t\t\t\tversion: upgradeVersion,\n\t\t\t\t\tfuncSelectors: facetSelectors,\n\t\t\t\t\tdeployInclude: facetConfig.versions?.[upgradeVersionKey]?.deployInclude || [],\n\t\t\t\t\tdeployExclude: facetConfig.versions?.[upgradeVersionKey]?.deployExclude || [],\n\t\t\t\t\tinitFunction: initFn,\n\t\t\t\t\tverified: false,\n\t\t\t\t};\n\n\t\t\t\tdiamond.updateNewDeployedFacets(facetName, newFacetData);\n\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.cyan(\n\t\t\t\t\t\t`⛵ ${facetName} deployed at ${await facetContract.getAddress()} with ${facetSelectors.length} selectors.`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\t// Log the deployment transaction and selectors\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(chalk.gray(` Selectors:`), facetSelectors);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync postDeployFacets(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`āœ… Running post-deploy logic for facets of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.postDeployFacetsTasks(diamond);\n\t}\n\n\t// Used by subclasses for facet post-deployment tasks\n\tprotected async postDeployFacetsTasks(diamond: Diamond): Promise<void> {}\n\n\t// Pre-hook for updating function selector registry (can be overridden by subclasses)\n\tasync preUpdateFunctionSelectorRegistry(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ Running pre-update logic for function selector registry of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected async preUpdateFunctionSelectorRegistryTasks(diamond: Diamond): Promise<void> {}\n\n\tasync updateFunctionSelectorRegistry(diamond: Diamond) {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(\n\t\t\t\t\t`\\nšŸŖ“ Updating function selector registry for diamond ${diamond.diamondName}...`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tthis.updateFunctionSelectorRegistryTasks(diamond);\n\t}\n\n\tprotected async updateFunctionSelectorRegistryTasks(diamond: Diamond): Promise<void> {\n\t\t// Delegates to the pure resolution core (M1-E1). Behavior-preserving: the dead\n\t\t// `higherPrioritySplit` and the `5b2f7af` Replace branch live there verbatim and are\n\t\t// reconciled in M3. The registry Map is mutated in place, exactly as before.\n\t\tresolveFunctionSelectorRegistry({\n\t\t\tregistry: diamond.functionSelectorRegistry,\n\t\t\tnewDeployedFacets: diamond.getNewDeployedFacets(),\n\t\t\tfacetNames: Object.keys(diamond.getDeployConfig().facets),\n\t\t});\n\t}\n\n\tasync postUpdateFunctionSelectorRegistry(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`āœ… Running post-update logic for function selector registry of diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync prePerformDiamondCut(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`šŸ”§ Running pre-diamond cut logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.prePerformDiamondCutTasks(diamond);\n\t}\n\n\tprotected async prePerformDiamondCutTasks(diamond: Diamond): Promise<void> {\n\t\t// This can be overridden by subclasses for custom pre-diamond cut logic\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(\n\t\t\t\t\t`šŸ”§ No pre-diamond cut tasks defined for diamond ${diamond.diamondName}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync performDiamondCut(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(\n\t\t\t\t\t`\\nšŸŖ“ Performing diamond cut for diamond ${diamond.diamondName}...`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tawait this.performDiamondCutTasks(diamond);\n\t}\n\n\tprotected async performDiamondCutTasks(diamond: Diamond): Promise<void> {\n\t\tconst diamondSignerAddress = await diamond.getSigner()?.getAddress()!;\n\t\tconst signer = await hre.ethers.getSigner(diamondSignerAddress!);\n\t\tconst diamondContract = await hre.ethers.getContractAt(\n\t\t\t'IDiamondCut',\n\t\t\tdiamond.getDeployedDiamondData().DiamondAddress!,\n\t\t);\n\t\tconst signerDiamondContract = diamondContract.connect(signer);\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\n\t\t// Setup initCallData with Atomic Protocol Initializer\n\t\tconst [initCalldata, initAddress] = await this.getInitCalldata(diamond);\n\n\t\t// extract facet cuts from the selector registry\n\t\tconst facetCuts: FacetCuts = await this.getFacetCuts(diamond);\n\n\t\t// Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses\n\t\tawait this.validateNoOrphanedSelectors(facetCuts);\n\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellowBright(`\\nšŸŖ“ Performing DiamondCut with ${facetCuts.length} cut(s):`),\n\t\t\t);\n\t\t\tfor (const cut of facetCuts) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.bold(\n\t\t\t\t\t\t`- ${FacetCutAction[cut.action]} for facet ${cut.name} at ${cut.facetAddress}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconsole.log(chalk.gray(` Selectors:`), cut.functionSelectors);\n\t\t\t}\n\t\t\tif (initAddress !== ethers.ZeroAddress) {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.cyan(\n\t\t\t\t\t\t`Initializing with functionSelector ${initCalldata} on ProtocolInitFacet ${deployConfig.protocolInitFacet} @ ${initAddress}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t/* -------------------------- Perform the diamond cut -----------------------*/\n\t\tconst facetSelectorCutMap = facetCuts.map((fc) => ({\n\t\t\tfacetAddress: fc.facetAddress,\n\t\t\taction: fc.action,\n\t\t\tfunctionSelectors: fc.functionSelectors,\n\t\t}));\n\t\tconst tx = await (signerDiamondContract as any).diamondCut(\n\t\t\tfacetSelectorCutMap,\n\t\t\tinitAddress,\n\t\t\tinitCalldata,\n\t\t);\n\n\t\t/* --------------------- Update the deployed diamond data ------------------ */\n\t\tconst txHash = tx.hash;\n\t\tawait this.postDiamondCutDeployedDataUpdate(diamond, txHash);\n\n\t\tconst ifaceList = getDeployedFacetInterfaces(deployedDiamondData);\n\t\t// Log the transaction\n\t\tif (this.verbose) {\n\t\t\tawait logTx(tx, 'DiamondCut', ifaceList);\n\t\t} else {\n\t\t\tconsole.log(chalk.blueBright(`šŸ”„ Waiting for DiamondCut transaction to be mined...`));\n\t\t\tawait tx.wait();\n\t\t}\n\n\t\tconsole.log(chalk.green(`āœ… DiamondCut executed: ${tx.hash}`));\n\n\t\tfor (const [facetName, initFunction] of diamond.initializerRegistry.entries()) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.blueBright(`ā–¶ Running ${initFunction} from the ${facetName} facet`),\n\t\t\t);\n\t\t\t// const contract = await ethers.getContractAt(facetName, diamondSignerAddress!);\n\t\t\tconst facetContractName = await getContractName(facetName, diamond);\n\t\t\tconst initContract = await hre.ethers.getContractAt(\n\t\t\t\tfacetContractName,\n\t\t\t\tdiamond.getDeployedDiamondData().DiamondAddress!,\n\t\t\t);\n\t\t\tconst signerDiamondContract = initContract.connect(signer);\n\n\t\t\tconst tx = await initContract[initFunction]();\n\t\t\t// const tx = await signerDiamondContract.initFunction;\n\t\t\tif (this.verbose) {\n\t\t\t\tlogTx(tx, `${facetName}.${initFunction}`, ifaceList);\n\t\t\t} else {\n\t\t\t\tconsole.log(\n\t\t\t\t\tchalk.blueBright(`šŸ”„ Waiting for ${facetName}.${initFunction}} mined...`),\n\t\t\t\t);\n\t\t\t\tawait tx.wait();\n\t\t\t}\n\t\t\tconsole.log(chalk.green(`āœ… ${facetName}.${initFunction} executed`));\n\t\t}\n\t}\n\n\tasync postPerformDiamondCut(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-diamond cut logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t\tawait this.postPerformDiamondCutTasks(diamond);\n\t}\n\n\tprotected async postPerformDiamondCutTasks(diamond: Diamond): Promise<void> {}\n\n\tasync getInitCalldata(diamond: Diamond): Promise<[string, string]> {\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tconst deployConfig = diamond.getDeployConfig();\n\n\t\tlet initAddress = ethers.ZeroAddress;\n\t\tlet initCalldata = '0x';\n\n\t\tconst protocolInitFacet = deployConfig.protocolInitFacet || '';\n\t\tconst protocolVersion = deployConfig.protocolVersion;\n\t\tconst protocolFacetInfo = diamond.getNewDeployedFacets()[protocolInitFacet];\n\n\t\tif (protocolInitFacet && protocolFacetInfo) {\n\t\t\tconst versionCfg =\n\t\t\t\tdeployConfig.facets[protocolInitFacet]?.versions?.[protocolVersion];\n\t\t\tconst initFn = diamond.newDeployment\n\t\t\t\t? versionCfg?.deployInit\n\t\t\t\t: versionCfg?.upgradeInit;\n\n\t\t\tif (initFn) {\n\t\t\t\tconst iface = new ethers.Interface([`function ${initFn}`]);\n\t\t\t\tinitAddress = protocolFacetInfo.address!;\n\t\t\t\tinitCalldata = iface.encodeFunctionData(initFn);\n\t\t\t\tif (this.verbose) {\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.cyan(\n\t\t\t\t\t\t\t`šŸ”§ Using protocol-wide initializer: ${protocolInitFacet}.${initFn}()`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (initAddress === ethers.ZeroAddress) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.yellow(`āš ļø No protocol-wide initializer found. Using zero address.`),\n\t\t\t);\n\t\t}\n\t\tdiamond.setInitAddress(initAddress);\n\t\treturn [initCalldata, initAddress];\n\t}\n\n\tasync getFacetCuts(diamond: Diamond): Promise<FacetCuts> {\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst selectorRegistry = diamond.functionSelectorRegistry;\n\t\t/* -------------------------- Prepare the facet cuts -----------------------*/\n\t\t// extract facet cuts from the selector registry\n\t\tconst facetCuts = Array.from(selectorRegistry.entries())\n\t\t\t.filter(([_, entry]) => entry.action !== RegistryFacetCutAction.Deployed)\n\t\t\t.map(([selector, entry]) => {\n\t\t\t\treturn {\n\t\t\t\t\tfacetAddress: entry.address,\n\t\t\t\t\taction: entry.action,\n\t\t\t\t\tfunctionSelectors: [selector],\n\t\t\t\t\tname: entry.facetName,\n\t\t\t\t};\n\t\t\t});\n\n\t\treturn facetCuts;\n\t}\n\n\tasync validateNoOrphanedSelectors(facetCuts: FacetCuts): Promise<void> {\n\t\t// Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses\n\t\tconst orphanedSelectors = facetCuts.filter((facetCut) => {\n\t\t\treturn facetCuts.some((otherFacetCut) => {\n\t\t\t\treturn (\n\t\t\t\t\totherFacetCut.facetAddress !== facetCut.facetAddress &&\n\t\t\t\t\totherFacetCut.name === facetCut.name &&\n\t\t\t\t\t(otherFacetCut.action === RegistryFacetCutAction.Add ||\n\t\t\t\t\t\totherFacetCut.action === RegistryFacetCutAction.Replace ||\n\t\t\t\t\t\totherFacetCut.action === RegistryFacetCutAction.Deployed)\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\tif (orphanedSelectors.length > 0) {\n\t\t\tconsole.error(\n\t\t\t\tchalk.redBright(\n\t\t\t\t\t`āŒ Orphaned selectors found for facet ${orphanedSelectors[0].name} at address ${orphanedSelectors[0].facetAddress}`,\n\t\t\t\t),\n\t\t\t);\n\t\t\tconsole.error(chalk.redBright(` - ${orphanedSelectors[0].functionSelectors}`));\n\t\t\tthrow new Error(\n\t\t\t\t`Orphaned selectors found for facet ${orphanedSelectors[0].name} at address ${orphanedSelectors[0].facetAddress}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync postDiamondCutDeployedDataUpdate(diamond: Diamond, txHash: string): Promise<void> {\n\t\tconst deployConfig = diamond.getDeployConfig();\n\t\tconst deployedDiamondData = diamond.getDeployedDiamondData();\n\t\tconst selectorRegistry = diamond.functionSelectorRegistry;\n\t\tconst newDeployedFacets = diamond.getNewDeployedFacets();\n\n\t\tdeployedDiamondData.protocolVersion = deployConfig.protocolVersion;\n\n\t\t// Aggregate selectors for each facet\n\t\tconst facetSelectorsMap: Record<string, { address: string; selectors: string[] }> = {};\n\n\t\tfor (const [selector, entry] of selectorRegistry.entries()) {\n\t\t\tconst facetName = entry.facetName;\n\t\t\tif (!facetSelectorsMap[facetName]) {\n\t\t\t\tfacetSelectorsMap[facetName] = { address: entry.address, selectors: [] };\n\t\t\t}\n\t\t\tif (\n\t\t\t\tentry.action === RegistryFacetCutAction.Add ||\n\t\t\t\tentry.action === RegistryFacetCutAction.Replace ||\n\t\t\t\tentry.action === RegistryFacetCutAction.Deployed\n\t\t\t) {\n\t\t\t\tfacetSelectorsMap[facetName].selectors.push(selector);\n\t\t\t}\n\t\t}\n\n\t\t// Update deployed facets with aggregated selectors\n\t\tdeployedDiamondData.DeployedFacets = deployedDiamondData.DeployedFacets || {};\n\t\tfor (const [facetName, { address, selectors }] of Object.entries(facetSelectorsMap)) {\n\t\t\tif (selectors.length > 0) {\n\t\t\t\tlet facetVersion: number;\n\n\t\t\t\tif (newDeployedFacets[facetName]) {\n\t\t\t\t\t// Use the version from newly deployed facet\n\t\t\t\t\tfacetVersion = newDeployedFacets[facetName].version;\n\t\t\t\t} else {\n\t\t\t\t\t// For facets not in newDeployedFacets (like existing deployed facets),\n\t\t\t\t\t// preserve their existing version or use 0 as default\n\t\t\t\t\tfacetVersion = deployedDiamondData.DeployedFacets[facetName]?.version ?? 0;\n\t\t\t\t}\n\n\t\t\t\tdeployedDiamondData.DeployedFacets[facetName] = {\n\t\t\t\t\taddress,\n\t\t\t\t\ttx_hash: txHash,\n\t\t\t\t\tversion: facetVersion,\n\t\t\t\t\tfuncSelectors: selectors,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Remove facets with no selectors\n\t\tfor (const facetName of Object.keys(deployedDiamondData.DeployedFacets)) {\n\t\t\tif (facetSelectorsMap[facetName]?.selectors.length === 0) {\n\t\t\t\tdelete deployedDiamondData.DeployedFacets[facetName];\n\t\t\t}\n\t\t}\n\n\t\tdiamond.updateDeployedDiamondData(deployedDiamondData);\n\t}\n\n\tasync preRunPostDeployCallbacks(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`šŸ”§ Running pre-post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync runPostDeployCallbacks(diamond: Diamond): Promise<void> {\n\t\tawait this.runPostDeployCallbacksTasks(diamond);\n\t}\n\n\tprotected async runPostDeployCallbacksTasks(diamond: Diamond): Promise<void> {\n\t\tconsole.log(`šŸ”„ Running post-deployment callbacks...`);\n\n\t\tconst deployConfig = diamond.getDeployConfig();\n\n\t\tfor (const [facetName, facetConfig] of Object.entries(deployConfig.facets)) {\n\t\t\tif (!facetConfig.versions) continue;\n\n\t\t\tfor (const [version, config] of Object.entries(facetConfig.versions)) {\n\t\t\t\tif (config.callbacks) {\n\t\t\t\t\tconst args: CallbackArgs = {\n\t\t\t\t\t\tdiamond: diamond,\n\t\t\t\t\t};\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.cyanBright(\n\t\t\t\t\t\t\t`Executing callback ${config.callbacks} for facet ${facetName}...`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tawait diamond.callbackManager.executeCallback(facetName, config.callbacks, args);\n\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\tchalk.magenta(\n\t\t\t\t\t\t\t`āœ… Callback ${config.callbacks} executed for facet ${facetName}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconsole.log(chalk.greenBright`āœ… All post-deployment callbacks executed.`);\n\t}\n\n\tasync postRunPostDeployCallbacks(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected async postRunPostDeployCallbacksTasks(diamond: Diamond): Promise<void> {\n\t\tif (this.verbose) {\n\t\t\tconsole.log(\n\t\t\t\tchalk.gray(`āœ… Running post-post-deploy logic for diamond ${diamond.diamondName}`),\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/utils/signer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,iCAAiC,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kEAAkE,CAAC;AAEzG;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAIzG;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,iBAK/F;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB1I;AAGD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAU,aAAa,MAAM,EAAE,UAAU,eAAe,iBA0BtF,CAAC"}
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/utils/signer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,iCAAiC,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kEAAkE,CAAC;AAEzG;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzG;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,iBAK/F;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAAC,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB1I;AAGD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAU,aAAa,MAAM,EAAE,UAAU,eAAe,iBA0BtF,CAAC"}
@@ -9,6 +9,7 @@ exports.setEtherBalance = setEtherBalance;
9
9
  exports.impersonateAndFundSigner = impersonateAndFundSigner;
10
10
  const hardhat_1 = __importDefault(require("hardhat"));
11
11
  const common_1 = require("./common");
12
+ const ethers_1 = require("ethers");
12
13
  require("@nomicfoundation/hardhat-ethers");
13
14
  /**
14
15
  * Impersonates a signer account. This is primarily used in Hardhat's testing environment
@@ -20,7 +21,10 @@ require("@nomicfoundation/hardhat-ethers");
20
21
  async function impersonateSigner(signerAddress, provider) {
21
22
  // Request Hardhat to impersonate the account at the specified address
22
23
  await provider.send("hardhat_impersonateAccount", [signerAddress]);
23
- return provider.getSigner(signerAddress); // Return the impersonated signer
24
+ // Construct the signer directly. ethers v6 `provider.getSigner(addr)` validates the
25
+ // address against `eth_accounts` and throws "invalid account" for impersonated accounts
26
+ // (impersonation does NOT add the account to `eth_accounts`).
27
+ return new ethers_1.JsonRpcSigner(provider, signerAddress); // Return the impersonated signer
24
28
  }
25
29
  /**
26
30
  * Sets the Ether balance for a specified address in the Hardhat testing environment.
@@ -45,7 +49,12 @@ async function setEtherBalance(address, amount, provider) {
45
49
  async function impersonateAndFundSigner(deployerAddress, provider) {
46
50
  try {
47
51
  await provider.send('hardhat_impersonateAccount', [deployerAddress]);
48
- const signer = provider.getSigner(deployerAddress);
52
+ // For an ethers JsonRpcProvider, construct the signer directly: ethers v6
53
+ // `getSigner(addr)` validates against `eth_accounts` and throws "invalid account"
54
+ // for impersonated accounts. HardhatEthersProvider has no such issue, so keep its path.
55
+ const signer = provider instanceof ethers_1.JsonRpcProvider
56
+ ? new ethers_1.JsonRpcSigner(provider, deployerAddress)
57
+ : await provider.getSigner(deployerAddress);
49
58
  // Fund the account
50
59
  await provider.send('hardhat_setBalance', [deployerAddress, '0x56BC75E2D63100000']);
51
60
  return signer;
@@ -1 +1 @@
1
- {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/utils/signer.ts"],"names":[],"mappings":";;;;;;AAaA,8CAIC;AASD,0CAKC;AASD,4DAgBC;AAxDD,sDAA0B;AAC1B,qCAAiC;AAEjC,2CAAyC;AAGzC;;;;;;GAMG;AACI,KAAK,UAAU,iBAAiB,CAAC,aAAqB,EAAE,QAAyB;IACtF,sEAAsE;IACtE,MAAM,QAAQ,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,iCAAiC;AAC7E,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,MAAc,EAAE,QAAyB;IAC9F,MAAM,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE;QACxC,OAAO,EAAE,mCAAmC;QAC5C,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,2CAA2C;KACxE,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,wBAAwB,CAAC,eAAuB,EAAE,QAAiD;IACvH,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAEnD,mBAAmB;QACnB,MAAM,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,eAAe,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,wCAAwC,eAAe,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wCAAwC,eAAe,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAGD;;;;;;GAMG;AACI,MAAM,kBAAkB,GAAG,KAAK,EAAE,WAAmB,EAAE,QAAyB,EAAE,EAAE;IACzF,yDAAyD;IACzD,MAAM,QAAQ,GAAG,CAAC,MAAM,iBAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,qFAAqF;IACrF,MAAM,SAAS,GAAG,MAAM,iBAAG,CAAC,MAAM,CAAC,aAAa,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC;IAEtF,6CAA6C;IAC7C,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAEhD,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAEpE,uFAAuF;IACvF,IAAI,eAAe,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzC,QAAQ,CAAC,+BAA+B,eAAe,EAAE,CAAC,CAAC;QAE3D,0EAA0E;QAC1E,MAAM,eAAe,CAAC,eAAe,EAAE,IAAA,cAAK,EAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE5D,MAAO,SAAiB,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrF,MAAO,SAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjF,CAAC;IAED,sCAAsC;IACtC,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AA1BW,QAAA,kBAAkB,sBA0B7B","sourcesContent":["import hre from 'hardhat';\nimport { toWei } from './common';\nimport { JsonRpcProvider, Signer } from 'ethers';\nimport '@nomicfoundation/hardhat-ethers';\nimport { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';\n\n/**\n * Impersonates a signer account. This is primarily used in Hardhat's testing environment\n * to simulate actions from accounts that are not part of the default test accounts.\n *\n * @param signerAddress - The address of the account to impersonate.\n * @returns The impersonated signer object.\n */\nexport async function impersonateSigner(signerAddress: string, provider: JsonRpcProvider): Promise<Signer> {\n // Request Hardhat to impersonate the account at the specified address\n await provider.send(\"hardhat_impersonateAccount\", [signerAddress]);\n return provider.getSigner(signerAddress); // Return the impersonated signer\n}\n\n/**\n * Sets the Ether balance for a specified address in the Hardhat testing environment.\n * This is useful for ensuring test accounts have sufficient funds for transactions.\n *\n * @param address - The address to set the Ether balance for.\n * @param amount - The desired balance as a `BigNumber`.\n */\nexport async function setEtherBalance(address: string, amount: bigint, provider: JsonRpcProvider) {\n await provider.send('hardhat_setBalance', [\n address, // Address to modify the balance of\n '0x' + amount.toString(16), // Amount to set, formatted as a hex string\n ]);\n}\n\n/** \n * Impersonates the deployer account and funds it to a balance that is rounded to the next highest 100 ETH.\n * \n * @param provider - The ethers provider instance.\n * @param deployerAddress - The address of the deployer account.\n * @param balance - The balance to set for the deployer account (in hex format).\n */\nexport async function impersonateAndFundSigner(deployerAddress: string, provider: JsonRpcProvider | HardhatEthersProvider): Promise<Signer> {\n try {\n await provider.send('hardhat_impersonateAccount', [deployerAddress]);\n const signer = provider.getSigner(deployerAddress);\n\n // Fund the account\n await provider.send('hardhat_setBalance', [deployerAddress, '0x56BC75E2D63100000']);\n return signer;\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Impersonation and funding failed for ${deployerAddress}: ${error.message}`);\n } else {\n console.error(`Impersonation and funding failed for ${deployerAddress}: ${String(error)}`);\n }\n throw error;\n }\n}\n\n\n/**\n * Updates the owner of the contract at the specified root address for testing purposes.\n * This involves transferring ownership from the current owner to the default signer in the Hardhat environment.\n *\n * @param rootAddress - The address of the root contract (e.g., GeniusOwnershipFacet).\n * @returns The address of the old owner.\n */\nexport const updateOwnerForTest = async (rootAddress: string, provider: JsonRpcProvider) => {\n // Retrieve the current signer in the Hardhat environment\n const curOwner = (await hre.ethers.getSigners())[0];\n\n // Get a reference to the GeniusOwnershipFacet contract at the specified root address\n const ownership = await hre.ethers.getContractAt('GeniusOwnershipFacet', rootAddress);\n\n // Retrieve the current owner of the contract\n const oldOwnerAddress = await ownership.owner();\n\n // Impersonate the old owner\n const oldOwner = await impersonateSigner(oldOwnerAddress, provider);\n\n // If the old owner is not the current signer, transfer ownership to the current signer\n if (oldOwnerAddress !== curOwner.address) {\n debuglog(`Transferring ownership from ${oldOwnerAddress}`);\n\n // Ensure the old owner has enough Ether to perform the ownership transfer\n await setEtherBalance(oldOwnerAddress, toWei(10), provider);\n\n await (ownership as any).connect(await oldOwner).transferOwnership(curOwner.address);\n await (ownership as any).connect(oldOwner).transferOwnership(curOwner.address);\n }\n\n // Return the address of the old owner\n return oldOwnerAddress;\n};\n"]}
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/utils/signer.ts"],"names":[],"mappings":"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","sourcesContent":["import hre from 'hardhat';\nimport { toWei } from './common';\nimport { JsonRpcProvider, JsonRpcSigner, Signer } from 'ethers';\nimport '@nomicfoundation/hardhat-ethers';\nimport { HardhatEthersProvider } from '@nomicfoundation/hardhat-ethers/internal/hardhat-ethers-provider';\n\n/**\n * Impersonates a signer account. This is primarily used in Hardhat's testing environment\n * to simulate actions from accounts that are not part of the default test accounts.\n *\n * @param signerAddress - The address of the account to impersonate.\n * @returns The impersonated signer object.\n */\nexport async function impersonateSigner(signerAddress: string, provider: JsonRpcProvider): Promise<Signer> {\n // Request Hardhat to impersonate the account at the specified address\n await provider.send(\"hardhat_impersonateAccount\", [signerAddress]);\n // Construct the signer directly. ethers v6 `provider.getSigner(addr)` validates the\n // address against `eth_accounts` and throws \"invalid account\" for impersonated accounts\n // (impersonation does NOT add the account to `eth_accounts`).\n return new JsonRpcSigner(provider, signerAddress); // Return the impersonated signer\n}\n\n/**\n * Sets the Ether balance for a specified address in the Hardhat testing environment.\n * This is useful for ensuring test accounts have sufficient funds for transactions.\n *\n * @param address - The address to set the Ether balance for.\n * @param amount - The desired balance as a `BigNumber`.\n */\nexport async function setEtherBalance(address: string, amount: bigint, provider: JsonRpcProvider) {\n await provider.send('hardhat_setBalance', [\n address, // Address to modify the balance of\n '0x' + amount.toString(16), // Amount to set, formatted as a hex string\n ]);\n}\n\n/** \n * Impersonates the deployer account and funds it to a balance that is rounded to the next highest 100 ETH.\n * \n * @param provider - The ethers provider instance.\n * @param deployerAddress - The address of the deployer account.\n * @param balance - The balance to set for the deployer account (in hex format).\n */\nexport async function impersonateAndFundSigner(deployerAddress: string, provider: JsonRpcProvider | HardhatEthersProvider): Promise<Signer> {\n try {\n await provider.send('hardhat_impersonateAccount', [deployerAddress]);\n // For an ethers JsonRpcProvider, construct the signer directly: ethers v6\n // `getSigner(addr)` validates against `eth_accounts` and throws \"invalid account\"\n // for impersonated accounts. HardhatEthersProvider has no such issue, so keep its path.\n const signer =\n provider instanceof JsonRpcProvider\n ? new JsonRpcSigner(provider, deployerAddress)\n : await provider.getSigner(deployerAddress);\n\n // Fund the account\n await provider.send('hardhat_setBalance', [deployerAddress, '0x56BC75E2D63100000']);\n return signer;\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Impersonation and funding failed for ${deployerAddress}: ${error.message}`);\n } else {\n console.error(`Impersonation and funding failed for ${deployerAddress}: ${String(error)}`);\n }\n throw error;\n }\n}\n\n\n/**\n * Updates the owner of the contract at the specified root address for testing purposes.\n * This involves transferring ownership from the current owner to the default signer in the Hardhat environment.\n *\n * @param rootAddress - The address of the root contract (e.g., GeniusOwnershipFacet).\n * @returns The address of the old owner.\n */\nexport const updateOwnerForTest = async (rootAddress: string, provider: JsonRpcProvider) => {\n // Retrieve the current signer in the Hardhat environment\n const curOwner = (await hre.ethers.getSigners())[0];\n\n // Get a reference to the GeniusOwnershipFacet contract at the specified root address\n const ownership = await hre.ethers.getContractAt('GeniusOwnershipFacet', rootAddress);\n\n // Retrieve the current owner of the contract\n const oldOwnerAddress = await ownership.owner();\n\n // Impersonate the old owner\n const oldOwner = await impersonateSigner(oldOwnerAddress, provider);\n\n // If the old owner is not the current signer, transfer ownership to the current signer\n if (oldOwnerAddress !== curOwner.address) {\n debuglog(`Transferring ownership from ${oldOwnerAddress}`);\n\n // Ensure the old owner has enough Ether to perform the ownership transfer\n await setEtherBalance(oldOwnerAddress, toWei(10), provider);\n\n await (ownership as any).connect(await oldOwner).transferOwnership(curOwner.address);\n await (ownership as any).connect(oldOwner).transferOwnership(curOwner.address);\n }\n\n // Return the address of the old owner\n return oldOwnerAddress;\n};\n"]}
package/package.json CHANGED
@@ -1,11 +1,15 @@
1
1
  {
2
2
  "name": "@diamondslab/diamonds",
3
- "version": "1.3.2",
3
+ "version": "1.4.0",
4
4
  "description": "Tools for deploying and interfacing with ERC-2535 Diamond Proxies",
5
5
  "repository": "github:diamondslab/diamonds",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "module": "dist/index.js",
9
+ "publishConfig": {
10
+ "access": "public",
11
+ "registry": "https://registry.npmjs.org"
12
+ },
9
13
  "exports": {
10
14
  ".": {
11
15
  "types": "./dist/index.d.ts",
@@ -29,7 +33,9 @@
29
33
  "diamond",
30
34
  "diamond-proxy",
31
35
  "diamond-upgradeable",
32
- "blockchain"
36
+ "blockchain",
37
+ "erc-2535",
38
+ "eip-2535"
33
39
  ],
34
40
  "bugs": {
35
41
  "url": "https://github.com/diamondslab/diamonds/issues"
@@ -40,7 +46,7 @@
40
46
  "test:integration": "hardhat test test/integration/**/*.test.ts --config hardhat.config.ts",
41
47
  "test:coverage": "hardhat coverage --config hardhat.config.ts",
42
48
  "test:performance": "hardhat test test/integration/performance/**/*.test.ts --config hardhat.config.ts",
43
- "build": "npx tsc",
49
+ "build": "rimraf dist tsconfig.tsbuildinfo && tsc",
44
50
  "clean": "rimraf artifacts/* cache/* diamond-abi/* typechain-types/* diamond-typechain-types/*",
45
51
  "compile": "npx hardhat compile --config hardhat.config.ts && yarn diamond:generate-abi-typechain",
46
52
  "clean-compile": "yarn clean && yarn compile",
@@ -124,7 +130,7 @@
124
130
  "perf:compare": "bash scripts/devops/devcontainer-performance-benchmark.sh compare"
125
131
  },
126
132
  "bin": {
127
- "diamond-abi": "dist/scripts/diamond-abi-cli.js"
133
+ "diamond-abi": "dist/cli/diamond-abi-cli.js"
128
134
  },
129
135
  "files": [
130
136
  "dist/",
@@ -140,7 +146,7 @@
140
146
  "@ethersproject/providers": "^5.8.0",
141
147
  "@gnus.ai/contracts-upgradeable-diamond": "=4.5.0",
142
148
  "@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
143
- "@nomicfoundation/hardhat-ethers": "*",
149
+ "@nomicfoundation/hardhat-ethers": "^3.1.2",
144
150
  "@nomicfoundation/hardhat-ignition": "^0.15.0",
145
151
  "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0",
146
152
  "@nomicfoundation/hardhat-network-helpers": "^1.0.0",