@diamondslab/diamonds 1.3.0 → 1.3.2
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.
- package/dist/repositories/FileDeploymentRepository.d.ts.map +1 -1
- package/dist/repositories/FileDeploymentRepository.js +5 -3
- package/dist/repositories/FileDeploymentRepository.js.map +1 -1
- package/dist/strategies/BaseDeploymentStrategy.d.ts +4 -4
- package/dist/strategies/BaseDeploymentStrategy.d.ts.map +1 -1
- package/dist/strategies/BaseDeploymentStrategy.js +85 -47
- package/dist/strategies/BaseDeploymentStrategy.js.map +1 -1
- package/dist/utils/contractMapping.d.ts.map +1 -1
- package/dist/utils/contractMapping.js +36 -33
- package/dist/utils/contractMapping.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileDeploymentRepository.d.ts","sourceRoot":"","sources":["../../src/repositories/FileDeploymentRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,qBAAa,wBAAyB,YAAW,oBAAoB;
|
|
1
|
+
{"version":3,"file":"FileDeploymentRepository.d.ts","sourceRoot":"","sources":["../../src/repositories/FileDeploymentRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,qBAAa,wBAAyB,YAAW,oBAAoB;IACpE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,2BAA2B,CAAS;IAC5C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,wBAAwB,CAAU;IAC1C,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,aAAa;IA2B1B,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIjD,2BAA2B,IAAI,OAAO;IAI7C,uBAAuB,IAAI,mBAAmB;IAI9C,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAYxD,gBAAgB,IAAI,YAAY;IAIzB,eAAe,IAAI,MAAM;CAGhC"}
|
|
@@ -14,9 +14,11 @@ class FileDeploymentRepository {
|
|
|
14
14
|
writeDeployedDiamondData;
|
|
15
15
|
deploymentId;
|
|
16
16
|
constructor(config) {
|
|
17
|
-
this.deploymentDataPath = config.deploymentsPath
|
|
17
|
+
this.deploymentDataPath = config.deploymentsPath ?? 'diamonds';
|
|
18
18
|
this.writeDeployedDiamondData = config.writeDeployedDiamondData ?? true;
|
|
19
|
-
|
|
19
|
+
const networkName = config.networkName ?? 'unknown';
|
|
20
|
+
const chainId = config.chainId ?? 0;
|
|
21
|
+
this.deploymentId = `${config.diamondName.toLowerCase()}-${networkName.toLowerCase()}-${chainId.toString()}`;
|
|
20
22
|
if (config.deployedDiamondDataFilePath) {
|
|
21
23
|
this.deployedDiamondDataFilePath = config.deployedDiamondDataFilePath;
|
|
22
24
|
}
|
|
@@ -44,7 +46,7 @@ class FileDeploymentRepository {
|
|
|
44
46
|
(0, jsonFileHandler_1.writeDeployInfo)(this.deployedDiamondDataFilePath, info);
|
|
45
47
|
}
|
|
46
48
|
else {
|
|
47
|
-
console.log(chalk_1.default.cyanBright(
|
|
49
|
+
console.log(chalk_1.default.cyanBright('Skipping write of diamond deployment data. Set writeDeployedDiamondData to true to enable.'));
|
|
48
50
|
}
|
|
49
51
|
}
|
|
50
52
|
loadDeployConfig() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileDeploymentRepository.js","sourceRoot":"","sources":["../../src/repositories/FileDeploymentRepository.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,+BAA4B;AAI5B,uDAAsF;AAEtF,MAAa,wBAAwB;
|
|
1
|
+
{"version":3,"file":"FileDeploymentRepository.js","sourceRoot":"","sources":["../../src/repositories/FileDeploymentRepository.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,+BAA4B;AAI5B,uDAAsF;AAEtF,MAAa,wBAAwB;IAC5B,kBAAkB,CAAS;IAC3B,2BAA2B,CAAS;IACpC,cAAc,CAAS;IACvB,wBAAwB,CAAU;IAClC,YAAY,CAAS;IAE7B,YAAY,MAAqB;QAChC,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,eAAe,IAAI,UAAU,CAAC;QAC/D,IAAI,CAAC,wBAAwB,GAAG,MAAM,CAAC,wBAAwB,IAAI,IAAI,CAAC;QACxE,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,SAAS,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,WAAW,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QAE7G,IAAI,MAAM,CAAC,2BAA2B,EAAE,CAAC;YACxC,IAAI,CAAC,2BAA2B,GAAG,MAAM,CAAC,2BAA2B,CAAC;QACvE,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,2BAA2B,GAAG,IAAA,WAAI,EACtC,IAAI,CAAC,kBAAkB,EACvB,MAAM,CAAC,WAAW,EAClB,eAAe,IAAI,CAAC,YAAY,OAAO,CACvC,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,cAAc,GAAG,IAAA,WAAI,EACzB,IAAI,CAAC,kBAAkB,EACvB,MAAM,CAAC,WAAW,EAClB,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,cAAc,CACjD,CAAC;QACH,CAAC;IACF,CAAC;IAEM,2BAA2B,CAAC,KAAc;QAChD,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;IACvC,CAAC;IAEM,2BAA2B;QACjC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACtC,CAAC;IAED,uBAAuB;QACtB,OAAO,IAAA,gCAAc,EAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC,CAAC,gCAAgC;IACjG,CAAC;IAED,uBAAuB,CAAC,IAAyB;QAChD,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,IAAA,iCAAe,EAAC,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CACV,eAAK,CAAC,UAAU,CACf,4FAA4F,CAC5F,CACD,CAAC;QACH,CAAC;IACF,CAAC;IAED,gBAAgB;QACf,OAAO,IAAA,kCAAgB,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC;IAEM,eAAe;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;CACD;AAjED,4DAiEC","sourcesContent":["import chalk from 'chalk';\nimport { join } from 'path';\nimport { DeployConfig, DeployedDiamondData } from '../schemas';\nimport { DiamondConfig } from '../types';\nimport { DeploymentRepository } from './DeploymentRepository';\nimport { readDeployConfig, readDeployFile, writeDeployInfo } from './jsonFileHandler';\n\nexport class FileDeploymentRepository implements DeploymentRepository {\n\tprivate deploymentDataPath: string;\n\tprivate deployedDiamondDataFilePath: string;\n\tprivate configFilePath: string;\n\tprivate writeDeployedDiamondData: boolean;\n\tprivate deploymentId: string;\n\n\tconstructor(config: DiamondConfig) {\n\t\tthis.deploymentDataPath = config.deploymentsPath ?? 'diamonds';\n\t\tthis.writeDeployedDiamondData = config.writeDeployedDiamondData ?? true;\n\t\tconst networkName = config.networkName ?? 'unknown';\n\t\tconst chainId = config.chainId ?? 0;\n\t\tthis.deploymentId = `${config.diamondName.toLowerCase()}-${networkName.toLowerCase()}-${chainId.toString()}`;\n\n\t\tif (config.deployedDiamondDataFilePath) {\n\t\t\tthis.deployedDiamondDataFilePath = config.deployedDiamondDataFilePath;\n\t\t} else {\n\t\t\tthis.deployedDiamondDataFilePath = join(\n\t\t\t\tthis.deploymentDataPath,\n\t\t\t\tconfig.diamondName,\n\t\t\t\t`deployments/${this.deploymentId}.json`,\n\t\t\t);\n\t\t}\n\t\tif (config.configFilePath) {\n\t\t\tthis.configFilePath = config.configFilePath;\n\t\t} else {\n\t\t\tthis.configFilePath = join(\n\t\t\t\tthis.deploymentDataPath,\n\t\t\t\tconfig.diamondName,\n\t\t\t\t`${config.diamondName.toLowerCase()}.config.json`,\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic setWriteDeployedDiamondData(write: boolean): void {\n\t\tthis.writeDeployedDiamondData = write;\n\t}\n\n\tpublic getWriteDeployedDiamondData(): boolean {\n\t\treturn this.writeDeployedDiamondData;\n\t}\n\n\tloadDeployedDiamondData(): DeployedDiamondData {\n\t\treturn readDeployFile(this.deployedDiamondDataFilePath, false); // Never create file during load\n\t}\n\n\tsaveDeployedDiamondData(info: DeployedDiamondData): void {\n\t\tif (this.writeDeployedDiamondData) {\n\t\t\twriteDeployInfo(this.deployedDiamondDataFilePath, info);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\tchalk.cyanBright(\n\t\t\t\t\t'Skipping write of diamond deployment data. Set writeDeployedDiamondData to true to enable.',\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\tloadDeployConfig(): DeployConfig {\n\t\treturn readDeployConfig(this.configFilePath);\n\t}\n\n\tpublic getDeploymentId(): string {\n\t\treturn this.deploymentId;\n\t}\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Diamond } from
|
|
3
|
-
import { FacetCuts } from
|
|
4
|
-
import { DeploymentStrategy } from
|
|
1
|
+
import '@nomicfoundation/hardhat-ethers';
|
|
2
|
+
import { Diamond } from '../core/Diamond';
|
|
3
|
+
import { FacetCuts } from '../types';
|
|
4
|
+
import { DeploymentStrategy } from './DeploymentStrategy';
|
|
5
5
|
export declare class BaseDeploymentStrategy implements DeploymentStrategy {
|
|
6
6
|
protected verbose: boolean;
|
|
7
7
|
constructor(verbose?: boolean);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseDeploymentStrategy.d.ts","sourceRoot":"","sources":["../../src/strategies/BaseDeploymentStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C,OAAO,
|
|
1
|
+
{"version":3,"file":"BaseDeploymentStrategy.d.ts","sourceRoot":"","sources":["../../src/strategies/BaseDeploymentStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,7 @@ class BaseDeploymentStrategy {
|
|
|
31
31
|
async deployDiamondTasks(diamond) {
|
|
32
32
|
console.log(chalk_1.default.blueBright(`🚀 Explicitly deploying DiamondCutFacet and Diamond for ${diamond.diamondName}`));
|
|
33
33
|
// Deploy the DiamondCutFacet - use contract mapping to get correct name
|
|
34
|
-
const diamondCutContractName = await (0, utils_1.getContractName)(
|
|
34
|
+
const diamondCutContractName = await (0, utils_1.getContractName)('DiamondCutFacet', diamond);
|
|
35
35
|
const diamondCutFactory = await hardhat_1.default.ethers.getContractFactory(diamondCutContractName, diamond.getSigner());
|
|
36
36
|
const diamondCutFacet = await diamondCutFactory.deploy();
|
|
37
37
|
await diamondCutFacet.waitForDeployment();
|
|
@@ -51,7 +51,7 @@ class BaseDeploymentStrategy {
|
|
|
51
51
|
// Register the DiamondCutFacet function selectors
|
|
52
52
|
const diamondCutFacetSelectorsRegistry = diamondCutFacetFunctionSelectors.reduce((acc, selector) => {
|
|
53
53
|
acc[selector] = {
|
|
54
|
-
facetName:
|
|
54
|
+
facetName: 'DiamondCutFacet',
|
|
55
55
|
priority: diamond.getFacetsConfig()?.DiamondCutFacet?.priority || 1000, // Default priority if not set
|
|
56
56
|
address: diamondCutFacetAddress,
|
|
57
57
|
action: types_1.RegistryFacetCutAction.Deployed,
|
|
@@ -64,9 +64,9 @@ class BaseDeploymentStrategy {
|
|
|
64
64
|
deployedDiamondData.DeployerAddress = await diamond.getSigner().getAddress();
|
|
65
65
|
deployedDiamondData.DiamondAddress = diamondContractAddress;
|
|
66
66
|
deployedDiamondData.DeployedFacets = deployedDiamondData.DeployedFacets || {};
|
|
67
|
-
deployedDiamondData.DeployedFacets[
|
|
67
|
+
deployedDiamondData.DeployedFacets['DiamondCutFacet'] = {
|
|
68
68
|
address: diamondCutFacetAddress,
|
|
69
|
-
tx_hash: diamondCutFacet.deploymentTransaction()?.hash ||
|
|
69
|
+
tx_hash: diamondCutFacet.deploymentTransaction()?.hash || '',
|
|
70
70
|
version: 0,
|
|
71
71
|
funcSelectors: diamondCutFacetFunctionSelectors,
|
|
72
72
|
};
|
|
@@ -101,9 +101,9 @@ class BaseDeploymentStrategy {
|
|
|
101
101
|
const deployedDiamondData = diamond.getDeployedDiamondData();
|
|
102
102
|
const deployedFacets = deployedDiamondData.DeployedFacets || {};
|
|
103
103
|
const facetCuts = [];
|
|
104
|
-
const sortedFacetNames = Object.keys(deployConfig.facets)
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
const sortedFacetNames = Object.keys(deployConfig.facets).sort((a, b) => {
|
|
105
|
+
return ((deployConfig.facets[a].priority || 1000) -
|
|
106
|
+
(deployConfig.facets[b].priority || 1000));
|
|
107
107
|
});
|
|
108
108
|
// Save the facet deployment info
|
|
109
109
|
for (const facetName of sortedFacetNames) {
|
|
@@ -111,6 +111,8 @@ class BaseDeploymentStrategy {
|
|
|
111
111
|
const deployedVersion = deployedDiamondData.DeployedFacets?.[facetName]?.version ?? -1;
|
|
112
112
|
const availableVersions = Object.keys(facetConfig.versions || {}).map(Number);
|
|
113
113
|
const upgradeVersion = Math.max(...availableVersions);
|
|
114
|
+
// Find the original string key that matches the upgrade version number
|
|
115
|
+
const upgradeVersionKey = Object.keys(facetConfig.versions || {}).find((key) => Number(key) === upgradeVersion) || String(upgradeVersion);
|
|
114
116
|
if (upgradeVersion > deployedVersion || deployedVersion === -1) {
|
|
115
117
|
if (this.verbose) {
|
|
116
118
|
console.log(chalk_1.default.blueBright(`🚀 Deploying facet: ${facetName} to version ${upgradeVersion}`));
|
|
@@ -118,7 +120,9 @@ class BaseDeploymentStrategy {
|
|
|
118
120
|
// Deploy the facet contract - use contract mapping to get correct name
|
|
119
121
|
const signer = diamond.getSigner();
|
|
120
122
|
const facetContractName = await (0, utils_1.getContractName)(facetName, diamond);
|
|
121
|
-
const facetFactory = await hardhat_1.default.ethers.getContractFactory(facetContractName, {
|
|
123
|
+
const facetFactory = await hardhat_1.default.ethers.getContractFactory(facetContractName, {
|
|
124
|
+
signer,
|
|
125
|
+
});
|
|
122
126
|
const facetContract = await facetFactory.deploy();
|
|
123
127
|
await facetContract.waitForDeployment();
|
|
124
128
|
const deployedFacets = new Map();
|
|
@@ -127,9 +131,29 @@ class BaseDeploymentStrategy {
|
|
|
127
131
|
facetContract.interface.forEachFunction((func) => {
|
|
128
132
|
facetSelectors.push(func.selector);
|
|
129
133
|
});
|
|
134
|
+
// Apply deployExclude filter to remove selectors before storing
|
|
135
|
+
const excludeFuncSelectors = facetConfig.versions?.[upgradeVersionKey]?.deployExclude || [];
|
|
136
|
+
for (const excludeSelector of excludeFuncSelectors) {
|
|
137
|
+
const selectorToExclude = ethers_1.ethers.id(excludeSelector).slice(0, 10);
|
|
138
|
+
const index = facetSelectors.indexOf(selectorToExclude);
|
|
139
|
+
if (index !== -1) {
|
|
140
|
+
facetSelectors.splice(index, 1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Apply deployInclude filter to only include specified selectors
|
|
144
|
+
const includeFuncSelectors = facetConfig.versions?.[upgradeVersionKey]?.deployInclude || [];
|
|
145
|
+
if (includeFuncSelectors.length > 0) {
|
|
146
|
+
// Convert include signatures to selectors
|
|
147
|
+
const includeSelectors = includeFuncSelectors.map((sig) => ethers_1.ethers.id(sig).slice(0, 10));
|
|
148
|
+
// Filter facetSelectors to only include the specified ones
|
|
149
|
+
const filteredSelectors = facetSelectors.filter((selector) => includeSelectors.includes(selector));
|
|
150
|
+
// Replace facetSelectors with filtered list
|
|
151
|
+
facetSelectors.length = 0;
|
|
152
|
+
facetSelectors.push(...filteredSelectors);
|
|
153
|
+
}
|
|
130
154
|
// Initializer function Registry
|
|
131
|
-
const deployInit = facetConfig.versions?.[
|
|
132
|
-
const upgradeInit = facetConfig.versions?.[
|
|
155
|
+
const deployInit = facetConfig.versions?.[upgradeVersionKey]?.deployInit || '';
|
|
156
|
+
const upgradeInit = facetConfig.versions?.[upgradeVersionKey]?.upgradeInit || '';
|
|
133
157
|
const initFn = diamond.newDeployment ? deployInit : upgradeInit;
|
|
134
158
|
if (initFn && facetName !== deployConfig.protocolInitFacet) {
|
|
135
159
|
diamond.initializerRegistry.set(facetName, initFn);
|
|
@@ -137,11 +161,11 @@ class BaseDeploymentStrategy {
|
|
|
137
161
|
const newFacetData = {
|
|
138
162
|
priority: facetConfig.priority || 1000,
|
|
139
163
|
address: await facetContract.getAddress(),
|
|
140
|
-
tx_hash: facetContract.deploymentTransaction()?.hash ||
|
|
164
|
+
tx_hash: facetContract.deploymentTransaction()?.hash || '',
|
|
141
165
|
version: upgradeVersion,
|
|
142
166
|
funcSelectors: facetSelectors,
|
|
143
|
-
deployInclude: facetConfig.versions?.[
|
|
144
|
-
deployExclude: facetConfig.versions?.[
|
|
167
|
+
deployInclude: facetConfig.versions?.[upgradeVersionKey]?.deployInclude || [],
|
|
168
|
+
deployExclude: facetConfig.versions?.[upgradeVersionKey]?.deployExclude || [],
|
|
145
169
|
initFunction: initFn,
|
|
146
170
|
verified: false,
|
|
147
171
|
};
|
|
@@ -183,19 +207,27 @@ class BaseDeploymentStrategy {
|
|
|
183
207
|
for (const [newFacetName, newFacetData] of newDeployedFacetsByPriority) {
|
|
184
208
|
const currentFacetAddress = newFacetData.address;
|
|
185
209
|
const priority = newFacetData.priority;
|
|
186
|
-
const functionSelectors = newFacetData.funcSelectors || [];
|
|
187
210
|
const includeFuncSelectors = newFacetData.deployInclude || [];
|
|
188
211
|
const excludeFuncSelectors = newFacetData.deployExclude || [];
|
|
212
|
+
// Convert function signatures to selectors
|
|
213
|
+
const includeFuncSelectorsAsSelectors = includeFuncSelectors.map((sig) => ethers_1.ethers.id(sig).slice(0, 10));
|
|
214
|
+
const excludeFuncSelectorsAsSelectors = excludeFuncSelectors.map((sig) => ethers_1.ethers.id(sig).slice(0, 10));
|
|
215
|
+
// Initialize funcSelectors if not present
|
|
216
|
+
if (!newFacetData.funcSelectors) {
|
|
217
|
+
newFacetData.funcSelectors = [];
|
|
218
|
+
}
|
|
219
|
+
const functionSelectors = newFacetData.funcSelectors;
|
|
189
220
|
/* ------------------ Exclusion Filter ------------------ */
|
|
190
|
-
for (const excludeFuncSelector of
|
|
221
|
+
for (const excludeFuncSelector of excludeFuncSelectorsAsSelectors) {
|
|
191
222
|
// remove from the facets functionSelectors
|
|
192
|
-
if (excludeFuncSelector
|
|
223
|
+
if (functionSelectors.includes(excludeFuncSelector)) {
|
|
193
224
|
functionSelectors.splice(functionSelectors.indexOf(excludeFuncSelector), 1);
|
|
194
225
|
}
|
|
195
226
|
// update action to remove if excluded from registry where a previous deployment associated with facetname
|
|
196
|
-
if (
|
|
227
|
+
if (registry.has(excludeFuncSelector) &&
|
|
228
|
+
registry.get(excludeFuncSelector)?.facetName === newFacetName) {
|
|
197
229
|
const existing = registry.get(excludeFuncSelector);
|
|
198
|
-
if (existing
|
|
230
|
+
if (existing?.facetName === newFacetName) {
|
|
199
231
|
registry.set(excludeFuncSelector, {
|
|
200
232
|
priority: priority,
|
|
201
233
|
address: currentFacetAddress,
|
|
@@ -216,20 +248,18 @@ class BaseDeploymentStrategy {
|
|
|
216
248
|
return acc;
|
|
217
249
|
}, {});
|
|
218
250
|
/* ------------------ Inclusion Override Filter ------------------ */
|
|
219
|
-
for (const includeFuncSelector of
|
|
251
|
+
for (const includeFuncSelector of includeFuncSelectorsAsSelectors) {
|
|
220
252
|
// Force Replace if already registered by higher priority facet
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
253
|
+
const higherPriorityFacet = Object.keys(registryHigherPrioritySplit).find((facetName) => {
|
|
254
|
+
return registryHigherPrioritySplit[facetName].includes(includeFuncSelector);
|
|
255
|
+
});
|
|
256
|
+
if (higherPriorityFacet) {
|
|
257
|
+
registry.set(includeFuncSelector, {
|
|
258
|
+
priority: priority,
|
|
259
|
+
address: currentFacetAddress,
|
|
260
|
+
action: types_1.RegistryFacetCutAction.Replace,
|
|
261
|
+
facetName: newFacetName,
|
|
224
262
|
});
|
|
225
|
-
if (higherPriorityFacet) {
|
|
226
|
-
registry.set(includeFuncSelector, {
|
|
227
|
-
priority: priority,
|
|
228
|
-
address: currentFacetAddress,
|
|
229
|
-
action: types_1.RegistryFacetCutAction.Replace,
|
|
230
|
-
facetName: newFacetName,
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
263
|
}
|
|
234
264
|
else {
|
|
235
265
|
// Add to the registry
|
|
@@ -241,11 +271,11 @@ class BaseDeploymentStrategy {
|
|
|
241
271
|
});
|
|
242
272
|
}
|
|
243
273
|
// remove from the funcSels so it is not modified in Priority Resolution Pass
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
274
|
+
const existing = newDeployedFacets[newFacetName];
|
|
275
|
+
if (existing &&
|
|
276
|
+
existing.funcSelectors &&
|
|
277
|
+
existing.funcSelectors.includes(includeFuncSelector)) {
|
|
278
|
+
existing.funcSelectors.splice(existing.funcSelectors.indexOf(includeFuncSelector), 1);
|
|
249
279
|
}
|
|
250
280
|
}
|
|
251
281
|
/* ------------------ Replace Facet and Priority Resolution Pass ------------- */
|
|
@@ -335,13 +365,13 @@ class BaseDeploymentStrategy {
|
|
|
335
365
|
async performDiamondCutTasks(diamond) {
|
|
336
366
|
const diamondSignerAddress = await diamond.getSigner()?.getAddress();
|
|
337
367
|
const signer = await hardhat_1.default.ethers.getSigner(diamondSignerAddress);
|
|
338
|
-
const diamondContract = await hardhat_1.default.ethers.getContractAt(
|
|
368
|
+
const diamondContract = await hardhat_1.default.ethers.getContractAt('IDiamondCut', diamond.getDeployedDiamondData().DiamondAddress);
|
|
339
369
|
const signerDiamondContract = diamondContract.connect(signer);
|
|
340
370
|
const deployConfig = diamond.getDeployConfig();
|
|
341
371
|
const deployedDiamondData = diamond.getDeployedDiamondData();
|
|
342
372
|
// Setup initCallData with Atomic Protocol Initializer
|
|
343
373
|
const [initCalldata, initAddress] = await this.getInitCalldata(diamond);
|
|
344
|
-
// extract facet cuts from the selector registry
|
|
374
|
+
// extract facet cuts from the selector registry
|
|
345
375
|
const facetCuts = await this.getFacetCuts(diamond);
|
|
346
376
|
// Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses
|
|
347
377
|
await this.validateNoOrphanedSelectors(facetCuts);
|
|
@@ -356,7 +386,11 @@ class BaseDeploymentStrategy {
|
|
|
356
386
|
}
|
|
357
387
|
}
|
|
358
388
|
/* -------------------------- Perform the diamond cut -----------------------*/
|
|
359
|
-
const facetSelectorCutMap = facetCuts.map(fc => ({
|
|
389
|
+
const facetSelectorCutMap = facetCuts.map((fc) => ({
|
|
390
|
+
facetAddress: fc.facetAddress,
|
|
391
|
+
action: fc.action,
|
|
392
|
+
functionSelectors: fc.functionSelectors,
|
|
393
|
+
}));
|
|
360
394
|
const tx = await signerDiamondContract.diamondCut(facetSelectorCutMap, initAddress, initCalldata);
|
|
361
395
|
/* --------------------- Update the deployed diamond data ------------------ */
|
|
362
396
|
const txHash = tx.hash;
|
|
@@ -364,7 +398,7 @@ class BaseDeploymentStrategy {
|
|
|
364
398
|
const ifaceList = (0, utils_1.getDeployedFacetInterfaces)(deployedDiamondData);
|
|
365
399
|
// Log the transaction
|
|
366
400
|
if (this.verbose) {
|
|
367
|
-
await (0, utils_1.logTx)(tx,
|
|
401
|
+
await (0, utils_1.logTx)(tx, 'DiamondCut', ifaceList);
|
|
368
402
|
}
|
|
369
403
|
else {
|
|
370
404
|
console.log(chalk_1.default.blueBright(`🔄 Waiting for DiamondCut transaction to be mined...`));
|
|
@@ -400,13 +434,15 @@ class BaseDeploymentStrategy {
|
|
|
400
434
|
const deployedDiamondData = diamond.getDeployedDiamondData();
|
|
401
435
|
const deployConfig = diamond.getDeployConfig();
|
|
402
436
|
let initAddress = ethers_1.ethers.ZeroAddress;
|
|
403
|
-
let initCalldata =
|
|
404
|
-
const protocolInitFacet = deployConfig.protocolInitFacet ||
|
|
437
|
+
let initCalldata = '0x';
|
|
438
|
+
const protocolInitFacet = deployConfig.protocolInitFacet || '';
|
|
405
439
|
const protocolVersion = deployConfig.protocolVersion;
|
|
406
440
|
const protocolFacetInfo = diamond.getNewDeployedFacets()[protocolInitFacet];
|
|
407
441
|
if (protocolInitFacet && protocolFacetInfo) {
|
|
408
442
|
const versionCfg = deployConfig.facets[protocolInitFacet]?.versions?.[protocolVersion];
|
|
409
|
-
const initFn = diamond.newDeployment
|
|
443
|
+
const initFn = diamond.newDeployment
|
|
444
|
+
? versionCfg?.deployInit
|
|
445
|
+
: versionCfg?.upgradeInit;
|
|
410
446
|
if (initFn) {
|
|
411
447
|
const iface = new ethers_1.ethers.Interface([`function ${initFn}`]);
|
|
412
448
|
initAddress = protocolFacetInfo.address;
|
|
@@ -426,7 +462,7 @@ class BaseDeploymentStrategy {
|
|
|
426
462
|
const deployConfig = diamond.getDeployConfig();
|
|
427
463
|
const selectorRegistry = diamond.functionSelectorRegistry;
|
|
428
464
|
/* -------------------------- Prepare the facet cuts -----------------------*/
|
|
429
|
-
// extract facet cuts from the selector registry
|
|
465
|
+
// extract facet cuts from the selector registry
|
|
430
466
|
const facetCuts = Array.from(selectorRegistry.entries())
|
|
431
467
|
.filter(([_, entry]) => entry.action !== types_1.RegistryFacetCutAction.Deployed)
|
|
432
468
|
.map(([selector, entry]) => {
|
|
@@ -441,8 +477,8 @@ class BaseDeploymentStrategy {
|
|
|
441
477
|
}
|
|
442
478
|
async validateNoOrphanedSelectors(facetCuts) {
|
|
443
479
|
// Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses
|
|
444
|
-
const orphanedSelectors = facetCuts.filter(facetCut => {
|
|
445
|
-
return facetCuts.some(otherFacetCut => {
|
|
480
|
+
const orphanedSelectors = facetCuts.filter((facetCut) => {
|
|
481
|
+
return facetCuts.some((otherFacetCut) => {
|
|
446
482
|
return (otherFacetCut.facetAddress !== facetCut.facetAddress &&
|
|
447
483
|
otherFacetCut.name === facetCut.name &&
|
|
448
484
|
(otherFacetCut.action === types_1.RegistryFacetCutAction.Add ||
|
|
@@ -469,7 +505,9 @@ class BaseDeploymentStrategy {
|
|
|
469
505
|
if (!facetSelectorsMap[facetName]) {
|
|
470
506
|
facetSelectorsMap[facetName] = { address: entry.address, selectors: [] };
|
|
471
507
|
}
|
|
472
|
-
if (entry.action === types_1.RegistryFacetCutAction.Add ||
|
|
508
|
+
if (entry.action === types_1.RegistryFacetCutAction.Add ||
|
|
509
|
+
entry.action === types_1.RegistryFacetCutAction.Replace ||
|
|
510
|
+
entry.action === types_1.RegistryFacetCutAction.Deployed) {
|
|
473
511
|
facetSelectorsMap[facetName].selectors.push(selector);
|
|
474
512
|
}
|
|
475
513
|
}
|
|
@@ -497,7 +535,7 @@ class BaseDeploymentStrategy {
|
|
|
497
535
|
}
|
|
498
536
|
// Remove facets with no selectors
|
|
499
537
|
for (const facetName of Object.keys(deployedDiamondData.DeployedFacets)) {
|
|
500
|
-
if (
|
|
538
|
+
if (facetSelectorsMap[facetName]?.selectors.length === 0) {
|
|
501
539
|
delete deployedDiamondData.DeployedFacets[facetName];
|
|
502
540
|
}
|
|
503
541
|
}
|
|
@@ -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 CallbackArgs,\n FacetCutAction,\n FacetCuts,\n FacetDeploymentInfo,\n FunctionSelectorRegistryEntry,\n NewDeployedFacet,\n RegistryFacetCutAction\n} from \"../types\";\nimport { getContractName, getDeployedFacetInterfaces, getDiamondContractName, logTx } from \"../utils\";\nimport { DeploymentStrategy } from \"./DeploymentStrategy\";\n\nexport class BaseDeploymentStrategy implements DeploymentStrategy {\n constructor(protected verbose: boolean = false) { }\n\n async preDeployDiamond(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`🔧 Running pre-deploy logic for diamond ${diamond.diamondName}`));\n }\n await this.preDeployDiamondTasks(diamond);\n }\n\n protected async preDeployDiamondTasks(diamond: Diamond): Promise<void> { }\n\n async deployDiamond(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.yellowBright(`\\n🪓 Deploying diamond ${diamond.diamondName} with DiamondCutFacet...`));\n }\n await this.deployDiamondTasks(diamond);\n }\n\n protected async deployDiamondTasks(diamond: Diamond): Promise<void> {\n console.log(chalk.blueBright(`🚀 Explicitly deploying DiamondCutFacet and Diamond for ${diamond.diamondName}`));\n\n // Deploy the DiamondCutFacet - use contract mapping to get correct name\n const diamondCutContractName = await getContractName(\"DiamondCutFacet\", diamond);\n const diamondCutFactory = await hre.ethers.getContractFactory(diamondCutContractName, diamond.getSigner()!);\n const diamondCutFacet = await diamondCutFactory.deploy();\n await diamondCutFacet.waitForDeployment();\n\n // Deploy the Diamond - use contract mapping to get correct name\n const diamondContractName = await getDiamondContractName(diamond.diamondName, diamond);\n const diamondFactory = await hre.ethers.getContractFactory(diamondContractName, diamond.getSigner()!);\n const diamondContract = await diamondFactory.deploy(await diamond.getSigner()!.getAddress(), await diamondCutFacet.getAddress());\n await diamondContract.waitForDeployment();\n\n // Get function selectors for DiamondCutFacet\n const diamondCutFacetFunctionSelectors: string[] = [];\n diamondCutFacet.interface.forEachFunction((func: ethers.FunctionFragment) => {\n diamondCutFacetFunctionSelectors.push(func.selector);\n });\n\n // Get addresses for later use\n const diamondCutFacetAddress = await diamondCutFacet.getAddress();\n const diamondContractAddress = await diamondContract.getAddress();\n\n // Register the DiamondCutFacet function selectors\n const diamondCutFacetSelectorsRegistry = diamondCutFacetFunctionSelectors.reduce((acc, selector) => {\n acc[selector] = {\n facetName: \"DiamondCutFacet\",\n priority: diamond.getFacetsConfig()?.DiamondCutFacet?.priority || 1000, // Default priority if not set\n address: diamondCutFacetAddress,\n action: RegistryFacetCutAction.Deployed,\n };\n return acc;\n }, {} as Record<string, Omit<FunctionSelectorRegistryEntry, \"selector\">>);\n\n diamond.registerFunctionSelectors(diamondCutFacetSelectorsRegistry);\n\n // Update deployed diamond data\n const deployedDiamondData = diamond.getDeployedDiamondData();\n deployedDiamondData.DeployerAddress = await diamond.getSigner()!.getAddress();\n deployedDiamondData.DiamondAddress = diamondContractAddress;\n deployedDiamondData.DeployedFacets = deployedDiamondData.DeployedFacets || {};\n deployedDiamondData.DeployedFacets[\"DiamondCutFacet\"] = {\n address: diamondCutFacetAddress,\n tx_hash: diamondCutFacet.deploymentTransaction()?.hash || \"\",\n version: 0,\n funcSelectors: diamondCutFacetFunctionSelectors,\n };\n\n diamond.updateDeployedDiamondData(deployedDiamondData);\n\n console.log(chalk.green(`✅ Diamond deployed at ${await diamondContract.getAddress()}, DiamondCutFacet at ${await diamondCutFacet.getAddress()}`));\n }\n\n async postDeployDiamond(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`✅ Running post-deploy logic for diamond ${diamond.diamondName}`));\n }\n await this.postDeployDiamondTasks(diamond);\n }\n\n protected async postDeployDiamondTasks(diamond: Diamond): Promise<void> { }\n\n async preDeployFacets(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`🔧 Running pre-deploy logic for facets of diamond ${diamond.diamondName}`));\n }\n await this.preDeployFacetsTasks(diamond);\n }\n\n protected async preDeployFacetsTasks(diamond: Diamond): Promise<void> {\n // This can be overridden by subclasses for custom pre-deploy logic\n if (this.verbose) {\n console.log(chalk.gray(`🔧 No pre-deploy tasks defined for facets of diamond ${diamond.diamondName}`));\n }\n }\n\n async deployFacets(diamond: Diamond): Promise<void> {\n await this.deployFacetsTasks(diamond);\n }\n\n protected async deployFacetsTasks(diamond: Diamond) {\n const deployConfig = diamond.getDeployConfig();\n const facetsConfig = diamond.getDeployConfig().facets;\n const deployedDiamondData = diamond.getDeployedDiamondData();\n const deployedFacets = deployedDiamondData.DeployedFacets || {};\n const facetCuts: FacetDeploymentInfo[] = [];\n\n const sortedFacetNames = Object.keys(deployConfig.facets)\n .sort((a, b) => {\n return (deployConfig.facets[a].priority || 1000) - (deployConfig.facets[b].priority || 1000);\n });\n\n // Save the facet deployment info\n for (const facetName of sortedFacetNames) {\n const facetConfig = facetsConfig[facetName];\n const deployedVersion = deployedDiamondData.DeployedFacets?.[facetName]?.version ?? -1;\n const availableVersions = Object.keys(facetConfig.versions || {}).map(Number);\n const upgradeVersion = Math.max(...availableVersions);\n\n if (upgradeVersion > deployedVersion || deployedVersion === -1) {\n if (this.verbose) {\n console.log(chalk.blueBright(`🚀 Deploying facet: ${facetName} to version ${upgradeVersion}`));\n }\n // Deploy the facet contract - use contract mapping to get correct name\n const signer = diamond.getSigner()!;\n const facetContractName = await getContractName(facetName, diamond);\n const facetFactory = await hre.ethers.getContractFactory(facetContractName, { signer });\n const facetContract = await facetFactory.deploy();\n await facetContract.waitForDeployment();\n\n const deployedFacets = new Map<string, DeployedFacet>();\n const availableVersions = Object.keys(facetConfig.versions ?? {}).map(Number);\n const facetSelectors: string[] = [];\n facetContract.interface.forEachFunction((func: ethers.FunctionFragment) => {\n facetSelectors.push(func.selector);\n });\n\n // Initializer function Registry\n const deployInit = facetConfig.versions?.[upgradeVersion]?.deployInit || \"\";\n const upgradeInit = facetConfig.versions?.[upgradeVersion]?.upgradeInit || \"\";\n\n const initFn = diamond.newDeployment ? deployInit : upgradeInit;\n if (initFn && facetName !== deployConfig.protocolInitFacet) {\n diamond.initializerRegistry.set(facetName, initFn);\n }\n\n const newFacetData: NewDeployedFacet = {\n priority: facetConfig.priority || 1000,\n address: await facetContract.getAddress(),\n tx_hash: facetContract.deploymentTransaction()?.hash || \"\",\n version: upgradeVersion,\n funcSelectors: facetSelectors,\n deployInclude: facetConfig.versions?.[upgradeVersion]?.deployInclude || [],\n deployExclude: facetConfig.versions?.[upgradeVersion]?.deployExclude || [],\n initFunction: initFn,\n verified: false,\n };\n\n diamond.updateNewDeployedFacets(facetName, newFacetData);\n\n console.log(chalk.cyan(`⛵ ${facetName} deployed at ${await facetContract.getAddress()} with ${facetSelectors.length} selectors.`));\n // Log the deployment transaction and selectors\n if (this.verbose) {\n console.log(chalk.gray(` Selectors:`), facetSelectors);\n }\n }\n\n }\n }\n\n async postDeployFacets(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`✅ Running post-deploy logic for facets of diamond ${diamond.diamondName}`));\n }\n await this.postDeployFacetsTasks(diamond);\n }\n\n // Used by subclasses for facet post-deployment tasks\n protected async postDeployFacetsTasks(diamond: Diamond): Promise<void> { }\n\n // Pre-hook for updating function selector registry (can be overridden by subclasses)\n async preUpdateFunctionSelectorRegistry(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`🔧 Running pre-update logic for function selector registry of diamond ${diamond.diamondName}`));\n }\n }\n\n protected async preUpdateFunctionSelectorRegistryTasks(diamond: Diamond): Promise<void> { }\n\n async updateFunctionSelectorRegistry(diamond: Diamond) {\n if (this.verbose) {\n console.log(chalk.yellowBright(`\\n🪓 Updating function selector registry for diamond ${diamond.diamondName}...`));\n }\n this.updateFunctionSelectorRegistryTasks(diamond);\n }\n\n protected async updateFunctionSelectorRegistryTasks(\n diamond: Diamond,\n ): Promise<void> {\n const registry = diamond.functionSelectorRegistry;\n const zeroAddress = ethers.ZeroAddress;\n\n const newDeployedFacets = diamond.getNewDeployedFacets();\n const newDeployedFacetsByPriority = Object.entries(newDeployedFacets).sort(([, a], [, b]) =>\n (a.priority || 1000) - (b.priority || 1000)\n );\n\n for (const [newFacetName, newFacetData] of newDeployedFacetsByPriority) {\n const currentFacetAddress = newFacetData.address;\n const priority: number = newFacetData.priority;\n const functionSelectors: string[] = newFacetData.funcSelectors || [];\n const includeFuncSelectors: string[] = newFacetData.deployInclude || [];\n const excludeFuncSelectors: string[] = newFacetData.deployExclude || [];\n\n /* ------------------ Exclusion Filter ------------------ */\n for (const excludeFuncSelector of excludeFuncSelectors) {\n // remove from the facets functionSelectors\n if (excludeFuncSelector in functionSelectors) {\n functionSelectors.splice(functionSelectors.indexOf(excludeFuncSelector), 1);\n }\n // update action to remove if excluded from registry where a previous deployment associated with facetname\n if (excludeFuncSelector in registry && registry.get(excludeFuncSelector)?.facetName === newFacetName) {\n const existing = registry.get(excludeFuncSelector);\n if (existing && existing.facetName === newFacetName) {\n registry.set(excludeFuncSelector, {\n priority: priority,\n address: currentFacetAddress,\n action: RegistryFacetCutAction.Remove,\n facetName: newFacetName,\n });\n }\n }\n }\n\n /* ------------ Higher Priority Split of Registry ------------------ */\n const registryHigherPrioritySplit = Array.from(registry.entries())\n .filter(([_, entry]) => entry.priority > priority)\n .reduce((acc, [selector, entry]) => {\n if (!acc[entry.facetName]) {\n acc[entry.facetName] = [];\n }\n acc[entry.facetName].push(selector);\n return acc;\n }, {} as Record<string, string[]>);\n\n /* ------------------ Inclusion Override Filter ------------------ */\n for (const includeFuncSelector of includeFuncSelectors) {\n // Force Replace if already registered by higher priority facet\n if (includeFuncSelector in registryHigherPrioritySplit) {\n const higherPriorityFacet = Object.keys(registryHigherPrioritySplit).find(facetName => {\n return registryHigherPrioritySplit[facetName].includes(includeFuncSelector);\n });\n if (higherPriorityFacet) {\n registry.set(includeFuncSelector, {\n priority: priority,\n address: currentFacetAddress,\n action: RegistryFacetCutAction.Replace,\n facetName: newFacetName,\n });\n }\n } else {\n // Add to the registry\n registry.set(includeFuncSelector, {\n priority: priority,\n address: currentFacetAddress,\n action: RegistryFacetCutAction.Add,\n facetName: newFacetName,\n });\n }\n\n // remove from the funcSels so it is not modified in Priority Resolution Pass\n if (includeFuncSelector in newDeployedFacets) {\n const existing = newDeployedFacets[newFacetName];\n if (existing && existing.funcSelectors) {\n existing.funcSelectors.splice(existing.funcSelectors.indexOf(includeFuncSelector), 1);\n }\n }\n }\n\n /* ------------------ Replace Facet and Priority Resolution Pass ------------- */\n for (const selector of functionSelectors) {\n const existing = registry.get(selector);\n if (existing) {\n const existingPriority = existing.priority;\n\n if (existing.facetName === newFacetName) {\n // Same facet, update the address\n registry.set(selector, {\n priority: priority,\n address: currentFacetAddress,\n action: RegistryFacetCutAction.Replace,\n facetName: newFacetName,\n });\n } else if (priority < existingPriority) {\n // Current facet has higher priority, Replace it\n registry.set(selector, {\n priority: priority,\n address: currentFacetAddress,\n action: RegistryFacetCutAction.Replace,\n facetName: newFacetName,\n });\n }\n\n } else {\n // New selector, simply add\n registry.set(selector, {\n priority: priority,\n address: currentFacetAddress,\n action: RegistryFacetCutAction.Add,\n facetName: newFacetName,\n });\n }\n }\n\n /* ---------------- Remove Old Function Selectors from facets -------------- */\n // Set functionselectors with the newFacetName and still different address to Remove\n for (const [selector, entry] of registry.entries()) {\n if (entry.facetName === newFacetName && entry.address !== currentFacetAddress) {\n registry.set(selector, {\n priority: entry.priority,\n address: zeroAddress,\n action: RegistryFacetCutAction.Remove,\n facetName: newFacetName,\n });\n }\n }\n }\n\n // `Remove` function selectors for facets no longer in config (deleted facets)\n const facetsConfig = diamond.getDeployConfig().facets;\n const facetNames = Object.keys(facetsConfig);\n for (const [selector, entry] of registry.entries()) {\n if (!facetNames.includes(entry.facetName)) {\n registry.set(selector, {\n priority: entry.priority,\n address: zeroAddress,\n action: RegistryFacetCutAction.Remove,\n facetName: entry.facetName,\n });\n }\n }\n }\n\n async postUpdateFunctionSelectorRegistry(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`✅ Running post-update logic for function selector registry of diamond ${diamond.diamondName}`));\n }\n }\n\n async prePerformDiamondCut(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`🔧 Running pre-diamond cut logic for diamond ${diamond.diamondName}`));\n }\n await this.prePerformDiamondCutTasks(diamond);\n }\n\n protected async prePerformDiamondCutTasks(diamond: Diamond): Promise<void> {\n // This can be overridden by subclasses for custom pre-diamond cut logic\n if (this.verbose) {\n console.log(chalk.gray(`🔧 No pre-diamond cut tasks defined for diamond ${diamond.diamondName}`));\n }\n }\n\n async performDiamondCut(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.yellowBright(`\\n🪓 Performing diamond cut for diamond ${diamond.diamondName}...`));\n }\n await this.performDiamondCutTasks(diamond);\n }\n\n protected async performDiamondCutTasks(diamond: Diamond): Promise<void> {\n const diamondSignerAddress = await diamond.getSigner()?.getAddress()!;\n const signer = await hre.ethers.getSigner(diamondSignerAddress!);\n const diamondContract = await hre.ethers.getContractAt(\"IDiamondCut\", diamond.getDeployedDiamondData().DiamondAddress!);\n const signerDiamondContract = diamondContract.connect(signer);\n const deployConfig = diamond.getDeployConfig();\n const deployedDiamondData = diamond.getDeployedDiamondData();\n\n // Setup initCallData with Atomic Protocol Initializer\n const [initCalldata, initAddress] = await this.getInitCalldata(diamond);\n\n // extract facet cuts from the selector registry \n const facetCuts: FacetCuts = await this.getFacetCuts(diamond);\n\n // Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses\n await this.validateNoOrphanedSelectors(facetCuts);\n\n if (this.verbose) {\n console.log(chalk.yellowBright(`\\n🪓 Performing DiamondCut with ${facetCuts.length} cut(s):`));\n for (const cut of facetCuts) {\n console.log(chalk.bold(`- ${FacetCutAction[cut.action]} for facet ${cut.name} at ${cut.facetAddress}`));\n console.log(chalk.gray(` Selectors:`), cut.functionSelectors);\n }\n if (initAddress !== ethers.ZeroAddress) {\n console.log(chalk.cyan(`Initializing with functionSelector ${initCalldata} on ProtocolInitFacet ${deployConfig.protocolInitFacet} @ ${initAddress}`));\n }\n }\n\n /* -------------------------- Perform the diamond cut -----------------------*/\n const facetSelectorCutMap = facetCuts.map(fc => ({ facetAddress: fc.facetAddress, action: fc.action, functionSelectors: fc.functionSelectors }));\n const tx = await (signerDiamondContract as any).diamondCut(\n facetSelectorCutMap,\n initAddress,\n initCalldata\n );\n\n /* --------------------- Update the deployed diamond data ------------------ */\n const txHash = tx.hash;\n await this.postDiamondCutDeployedDataUpdate(diamond, txHash);\n\n const ifaceList = getDeployedFacetInterfaces(deployedDiamondData);\n // Log the transaction\n if (this.verbose) {\n await logTx(tx, \"DiamondCut\", ifaceList);\n } else {\n console.log(chalk.blueBright(`🔄 Waiting for DiamondCut transaction to be mined...`));\n await tx.wait();\n }\n\n\n console.log(chalk.green(`✅ DiamondCut executed: ${tx.hash}`));\n\n for (const [facetName, initFunction] of diamond.initializerRegistry.entries()) {\n console.log(chalk.blueBright(`▶ Running ${initFunction} from the ${facetName} facet`));\n // const contract = await ethers.getContractAt(facetName, diamondSignerAddress!);\n const facetContractName = await getContractName(facetName, diamond);\n const initContract = await hre.ethers.getContractAt(facetContractName, diamond.getDeployedDiamondData().DiamondAddress!);\n const signerDiamondContract = initContract.connect(signer);\n\n const tx = await initContract[initFunction]();\n // const tx = await signerDiamondContract.initFunction;\n if (this.verbose) {\n logTx(tx, `${facetName}.${initFunction}`, ifaceList);\n } else {\n console.log(chalk.blueBright(`🔄 Waiting for ${facetName}.${initFunction}} mined...`));\n await tx.wait();\n }\n console.log(chalk.green(`✅ ${facetName}.${initFunction} executed`));\n }\n }\n\n async postPerformDiamondCut(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`✅ Running post-diamond cut logic for diamond ${diamond.diamondName}`));\n }\n await this.postPerformDiamondCutTasks(diamond);\n }\n\n protected async postPerformDiamondCutTasks(diamond: Diamond): Promise<void> { }\n\n async getInitCalldata(diamond: Diamond): Promise<[string, string]> {\n const deployedDiamondData = diamond.getDeployedDiamondData();\n const deployConfig = diamond.getDeployConfig();\n\n let initAddress = ethers.ZeroAddress;\n let initCalldata = \"0x\";\n\n const protocolInitFacet = deployConfig.protocolInitFacet || \"\";\n const protocolVersion = deployConfig.protocolVersion;\n const protocolFacetInfo = diamond.getNewDeployedFacets()[protocolInitFacet];\n\n if (protocolInitFacet && protocolFacetInfo) {\n const versionCfg = deployConfig.facets[protocolInitFacet]?.versions?.[protocolVersion];\n const initFn = diamond.newDeployment ? versionCfg?.deployInit : versionCfg?.upgradeInit;\n\n if (initFn) {\n const iface = new ethers.Interface([`function ${initFn}`]);\n initAddress = protocolFacetInfo.address!;\n initCalldata = iface.encodeFunctionData(initFn);\n if (this.verbose) {\n console.log(\n chalk.cyan(`🔧 Using protocol-wide initializer: ${protocolInitFacet}.${initFn}()`)\n );\n }\n }\n }\n\n if (initAddress === ethers.ZeroAddress) {\n console.log(chalk.yellow(`⚠️ No protocol-wide initializer found. Using zero address.`));\n }\n diamond.setInitAddress(initAddress);\n return [initCalldata, initAddress];\n }\n\n async getFacetCuts(diamond: Diamond): Promise<FacetCuts> {\n const deployConfig = diamond.getDeployConfig();\n const selectorRegistry = diamond.functionSelectorRegistry;\n /* -------------------------- Prepare the facet cuts -----------------------*/\n // extract facet cuts from the selector registry \n const facetCuts = Array.from(selectorRegistry.entries())\n .filter(([_, entry]) => entry.action !== RegistryFacetCutAction.Deployed)\n .map(([selector, entry]) => {\n return {\n facetAddress: entry.address,\n action: entry.action,\n functionSelectors: [selector],\n name: entry.facetName,\n };\n });\n\n return facetCuts;\n }\n\n async validateNoOrphanedSelectors(facetCuts: FacetCuts): Promise<void> {\n // Validate no orphaned selectors, i.e. 'Add', 'Replace' or 'Deployed' selectors with the same facetNames but different addresses\n const orphanedSelectors = facetCuts.filter(facetCut => {\n return facetCuts.some(otherFacetCut => {\n return (\n otherFacetCut.facetAddress !== facetCut.facetAddress &&\n otherFacetCut.name === facetCut.name &&\n (otherFacetCut.action === RegistryFacetCutAction.Add ||\n otherFacetCut.action === RegistryFacetCutAction.Replace ||\n otherFacetCut.action === RegistryFacetCutAction.Deployed)\n );\n });\n });\n\n if (orphanedSelectors.length > 0) {\n console.error(chalk.redBright(`❌ Orphaned selectors found for facet ${orphanedSelectors[0].name} at address ${orphanedSelectors[0].facetAddress}`));\n console.error(chalk.redBright(` - ${orphanedSelectors[0].functionSelectors}`));\n throw new Error(`Orphaned selectors found for facet ${orphanedSelectors[0].name} at address ${orphanedSelectors[0].facetAddress}`);\n }\n }\n\n async postDiamondCutDeployedDataUpdate(diamond: Diamond, txHash: string): Promise<void> {\n const deployConfig = diamond.getDeployConfig();\n const deployedDiamondData = diamond.getDeployedDiamondData();\n const selectorRegistry = diamond.functionSelectorRegistry;\n const newDeployedFacets = diamond.getNewDeployedFacets();\n\n deployedDiamondData.protocolVersion = deployConfig.protocolVersion;\n\n // Aggregate selectors for each facet\n const facetSelectorsMap: Record<string, { address: string, selectors: string[] }> = {};\n\n for (const [selector, entry] of selectorRegistry.entries()) {\n const facetName = entry.facetName;\n if (!facetSelectorsMap[facetName]) {\n facetSelectorsMap[facetName] = { address: entry.address, selectors: [] };\n }\n if (entry.action === RegistryFacetCutAction.Add || entry.action === RegistryFacetCutAction.Replace || entry.action === RegistryFacetCutAction.Deployed) {\n facetSelectorsMap[facetName].selectors.push(selector);\n }\n }\n\n // Update deployed facets with aggregated selectors\n deployedDiamondData.DeployedFacets = deployedDiamondData.DeployedFacets || {};\n for (const [facetName, { address, selectors }] of Object.entries(facetSelectorsMap)) {\n if (selectors.length > 0) {\n let facetVersion: number;\n\n if (newDeployedFacets[facetName]) {\n // Use the version from newly deployed facet\n facetVersion = newDeployedFacets[facetName].version;\n } else {\n // For facets not in newDeployedFacets (like existing deployed facets),\n // preserve their existing version or use 0 as default\n facetVersion = deployedDiamondData.DeployedFacets[facetName]?.version ?? 0;\n }\n\n deployedDiamondData.DeployedFacets[facetName] = {\n address,\n tx_hash: txHash,\n version: facetVersion,\n funcSelectors: selectors,\n };\n }\n }\n\n // Remove facets with no selectors\n for (const facetName of Object.keys(deployedDiamondData.DeployedFacets)) {\n if (!facetSelectorsMap[facetName] || facetSelectorsMap[facetName].selectors.length === 0) {\n delete deployedDiamondData.DeployedFacets[facetName];\n }\n }\n\n diamond.updateDeployedDiamondData(deployedDiamondData);\n }\n\n async preRunPostDeployCallbacks(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`🔧 Running pre-post-deploy logic for diamond ${diamond.diamondName}`));\n }\n }\n\n async runPostDeployCallbacks(diamond: Diamond): Promise<void> {\n await this.runPostDeployCallbacksTasks(diamond);\n }\n\n protected async runPostDeployCallbacksTasks(diamond: Diamond): Promise<void> {\n console.log(`🔄 Running post-deployment callbacks...`);\n\n const deployConfig = diamond.getDeployConfig();\n\n for (const [facetName, facetConfig] of Object.entries(deployConfig.facets)) {\n if (!facetConfig.versions) continue;\n\n for (const [version, config] of Object.entries(facetConfig.versions)) {\n if (config.callbacks) {\n const args: CallbackArgs = {\n diamond: diamond,\n };\n\n console.log(chalk.cyanBright(`Executing callback ${config.callbacks} for facet ${facetName}...`));\n await diamond.callbackManager.executeCallback(\n facetName,\n config.callbacks,\n args\n );\n\n console.log(chalk.magenta(`✅ Callback ${config.callbacks} executed for facet ${facetName}`));\n }\n }\n }\n\n console.log(chalk.greenBright`✅ All post-deployment callbacks executed.`);\n }\n\n async postRunPostDeployCallbacks(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`✅ Running post-post-deploy logic for diamond ${diamond.diamondName}`));\n }\n }\n\n protected async postRunPostDeployCallbacksTasks(diamond: Diamond): Promise<void> {\n if (this.verbose) {\n console.log(chalk.gray(`✅ Running post-post-deploy logic for diamond ${diamond.diamondName}`));\n }\n }\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 { 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contractMapping.d.ts","sourceRoot":"","sources":["../../src/utils/contractMapping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contractMapping.d.ts","sourceRoot":"","sources":["../../src/utils/contractMapping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;GAGG;AACH,wBAAsB,eAAe,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CA6GjB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC3C,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,CAqFjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC,CAInB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;CAMrB,CAAC;AAEX;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG/D"}
|
|
@@ -20,22 +20,23 @@ async function getContractName(logicalName, diamond) {
|
|
|
20
20
|
}
|
|
21
21
|
// Special diamond mappings for test environments
|
|
22
22
|
const testDiamondMappings = {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
TestDiamond: 'MockDiamond',
|
|
24
|
+
AdvancedTestDiamond: 'MockDiamond',
|
|
25
|
+
ConfigTestDiamond: 'MockDiamond',
|
|
26
|
+
ProxyDiamond: 'MockDiamond',
|
|
27
|
+
BenchmarkDiamond: 'BenchmarkDiamond',
|
|
28
|
+
ConcurrentDiamond0: 'MockDiamond',
|
|
29
|
+
ConcurrentDiamond1: 'MockDiamond',
|
|
30
|
+
ConcurrentDiamond2: 'MockDiamond',
|
|
31
|
+
ConcurrentDiamond3: 'MockDiamond',
|
|
32
|
+
ConcurrentDiamond4: 'MockDiamond',
|
|
33
33
|
};
|
|
34
34
|
// Check if there's a diamond mapping first
|
|
35
|
-
if (testDiamondMappings
|
|
35
|
+
if (logicalName in testDiamondMappings) {
|
|
36
36
|
try {
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const mappedName = testDiamondMappings[logicalName];
|
|
38
|
+
await hardhat_1.artifacts.readArtifact(mappedName);
|
|
39
|
+
return mappedName;
|
|
39
40
|
}
|
|
40
41
|
catch (error) {
|
|
41
42
|
// Fall through to normal logic if mapped artifact doesn't exist
|
|
@@ -128,22 +129,23 @@ async function getContractName(logicalName, diamond) {
|
|
|
128
129
|
async function getDiamondContractName(diamondName, diamond) {
|
|
129
130
|
// Special mappings for test environments
|
|
130
131
|
const testMappings = {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
132
|
+
TestDiamond: 'MockDiamond',
|
|
133
|
+
AdvancedTestDiamond: 'MockDiamond',
|
|
134
|
+
ConfigTestDiamond: 'MockDiamond',
|
|
135
|
+
ProxyDiamond: 'MockDiamond',
|
|
136
|
+
BenchmarkDiamond: 'BenchmarkDiamond',
|
|
137
|
+
ConcurrentDiamond0: 'MockDiamond',
|
|
138
|
+
ConcurrentDiamond1: 'MockDiamond',
|
|
139
|
+
ConcurrentDiamond2: 'MockDiamond',
|
|
140
|
+
ConcurrentDiamond3: 'MockDiamond',
|
|
141
|
+
ConcurrentDiamond4: 'MockDiamond',
|
|
141
142
|
};
|
|
142
143
|
// Check if there's a test mapping first
|
|
143
|
-
if (testMappings
|
|
144
|
+
if (diamondName in testMappings) {
|
|
144
145
|
try {
|
|
145
|
-
|
|
146
|
-
|
|
146
|
+
const mappedName = testMappings[diamondName];
|
|
147
|
+
await hardhat_1.artifacts.readArtifact(mappedName);
|
|
148
|
+
return mappedName;
|
|
147
149
|
}
|
|
148
150
|
catch (error) {
|
|
149
151
|
// Fall through to normal logic if mapped artifact doesn't exist
|
|
@@ -156,9 +158,10 @@ async function getDiamondContractName(diamondName, diamond) {
|
|
|
156
158
|
}
|
|
157
159
|
catch (error) {
|
|
158
160
|
// If there are multiple artifacts with the same name, try to resolve using fully qualified names
|
|
159
|
-
|
|
161
|
+
const err = error;
|
|
162
|
+
if (err.code === 'HH701' && err.message.includes('multiple artifacts')) {
|
|
160
163
|
// Extract the fully qualified names from the error message
|
|
161
|
-
const errorMessage =
|
|
164
|
+
const errorMessage = err.message;
|
|
162
165
|
const fqnMatches = errorMessage.match(/contracts\/[^:\s]+\.sol:[^\s]+/g);
|
|
163
166
|
if (fqnMatches && fqnMatches.length > 0) {
|
|
164
167
|
// Prefer the one from gnus-ai directory
|
|
@@ -219,10 +222,10 @@ async function getContractArtifact(logicalName, diamond) {
|
|
|
219
222
|
* Standard mapping for common facet types
|
|
220
223
|
*/
|
|
221
224
|
exports.FACET_TYPE_MAPPING = {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
225
|
+
DiamondCutFacet: 'DiamondCutFacet',
|
|
226
|
+
DiamondLoupeFacet: 'DiamondLoupeFacet',
|
|
227
|
+
TestFacet: 'TestFacet',
|
|
228
|
+
OwnershipFacet: 'OwnershipFacet',
|
|
226
229
|
// Add more mappings as needed
|
|
227
230
|
};
|
|
228
231
|
/**
|
|
@@ -230,6 +233,6 @@ exports.FACET_TYPE_MAPPING = {
|
|
|
230
233
|
*/
|
|
231
234
|
async function getAvailableContracts() {
|
|
232
235
|
const names = await hardhat_1.artifacts.getAllFullyQualifiedNames();
|
|
233
|
-
return names.map(name => name.split(':').pop()
|
|
236
|
+
return names.map((name) => name.split(':').pop() ?? name);
|
|
234
237
|
}
|
|
235
238
|
//# sourceMappingURL=contractMapping.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contractMapping.js","sourceRoot":"","sources":["../../src/utils/contractMapping.ts"],"names":[],"mappings":"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","sourcesContent":["import { artifacts } from 'hardhat';\nimport { HardhatRuntimeEnvironment } from 'hardhat/types';\nimport { Artifact } from 'hardhat/types';\nimport { Diamond } from '../core/Diamond';\n\n/**\n * Maps logical facet names to actual contract names available in artifacts.\n * This handles both production contracts and mock contracts for testing.\n */\nexport async function getContractName(logicalName: string, diamond?: Diamond): Promise<string> {\n // If diamond is provided, check for diamond-specific contract mappings\n if (diamond) {\n // Try to load diamond-specific ABI first\n const diamondAbiFilePath = diamond.getDiamondAbiFilePath();\n \n // For now, we'll still fall back to the standard mapping logic\n // but this provides a hook for future diamond-specific mappings\n }\n // Special diamond mappings for test environments\n const testDiamondMappings: Record<string, string> = {\n 'TestDiamond': 'MockDiamond',\n 'AdvancedTestDiamond': 'MockDiamond',\n 'ConfigTestDiamond': 'MockDiamond',\n 'ProxyDiamond': 'MockDiamond',\n 'BenchmarkDiamond': 'BenchmarkDiamond',\n 'ConcurrentDiamond0': 'MockDiamond',\n 'ConcurrentDiamond1': 'MockDiamond',\n 'ConcurrentDiamond2': 'MockDiamond',\n 'ConcurrentDiamond3': 'MockDiamond',\n 'ConcurrentDiamond4': 'MockDiamond',\n };\n\n // Check if there's a diamond mapping first\n if (testDiamondMappings[logicalName]) {\n try {\n await artifacts.readArtifact(testDiamondMappings[logicalName]);\n return testDiamondMappings[logicalName];\n } catch (error) {\n // Fall through to normal logic if mapped artifact doesn't exist\n }\n }\n\n // Special test facet mappings for performance tests\n if (logicalName.match(/^TestFacet\\d+$/)) {\n // Map TestFacet1, TestFacet2, etc. to available test facets\n try {\n await artifacts.readArtifact('TestFacet2');\n return 'TestFacet2';\n } catch (error) {\n try {\n await artifacts.readArtifact('MockTestFacet');\n return 'MockTestFacet';\n } catch (mockError) {\n // Fall back to the original logic\n }\n }\n }\n\n // Map BenchmarkFacet test names to available contracts\n if (logicalName.startsWith('BenchmarkFacet')) {\n // Extract the number from BenchmarkFacet1, BenchmarkFacet2, etc.\n const match = logicalName.match(/BenchmarkFacet(\\d+)/);\n if (match) {\n const num = parseInt(match[1], 10);\n // Map to available mock benchmark facets (MockBenchmarkFacet1-20)\n const mockFacetNum = ((num - 1) % 20) + 1;\n const mockFacetName = `MockBenchmarkFacet${mockFacetNum}`;\n try {\n await artifacts.readArtifact(mockFacetName);\n return mockFacetName;\n } catch (error) {\n try {\n await artifacts.readArtifact('TestFacet2');\n return 'TestFacet2';\n } catch (error2) {\n try {\n await artifacts.readArtifact('MockTestFacet');\n return 'MockTestFacet';\n } catch (mockError) {\n // Fall back to the original logic\n }\n }\n }\n }\n }\n\n // Map SlowFacet to a real facet for timeout tests\n if (logicalName === 'SlowFacet') {\n try {\n await artifacts.readArtifact('TestFacet2');\n return 'TestFacet2';\n } catch (error) {\n try {\n await artifacts.readArtifact('MockTestFacet');\n return 'MockTestFacet';\n } catch (mockError) {\n // Fall back to the original logic\n }\n }\n }\n\n // Try the logical name first (for production)\n try {\n await artifacts.readArtifact(logicalName);\n return logicalName;\n } catch (error) {\n // If logical name fails, try Mock prefixed version (for testing)\n const mockName = `Mock${logicalName}`;\n try {\n await artifacts.readArtifact(mockName);\n return mockName;\n } catch (mockError) {\n // If both fail, throw the original error\n throw error;\n }\n }\n}\n\n/**\n * Maps logical diamond name to actual contract name available in artifacts.\n */\nexport async function getDiamondContractName(diamondName: string, diamond?: Diamond): Promise<string> {\n // Special mappings for test environments\n const testMappings: Record<string, string> = {\n 'TestDiamond': 'MockDiamond',\n 'AdvancedTestDiamond': 'MockDiamond',\n 'ConfigTestDiamond': 'MockDiamond',\n 'ProxyDiamond': 'MockDiamond',\n 'BenchmarkDiamond': 'BenchmarkDiamond',\n 'ConcurrentDiamond0': 'MockDiamond',\n 'ConcurrentDiamond1': 'MockDiamond',\n 'ConcurrentDiamond2': 'MockDiamond',\n 'ConcurrentDiamond3': 'MockDiamond',\n 'ConcurrentDiamond4': 'MockDiamond',\n };\n\n // Check if there's a test mapping first\n if (testMappings[diamondName]) {\n try {\n await artifacts.readArtifact(testMappings[diamondName]);\n return testMappings[diamondName];\n } catch (error) {\n // Fall through to normal logic if mapped artifact doesn't exist\n }\n }\n\n // Try the diamond name first (for production)\n try {\n await artifacts.readArtifact(diamondName);\n return diamondName;\n } catch (error) {\n // If there are multiple artifacts with the same name, try to resolve using fully qualified names\n if ((error as any).code === 'HH701' && (error as any).message.includes('multiple artifacts')) {\n // Extract the fully qualified names from the error message\n const errorMessage = (error as any).message;\n const fqnMatches = errorMessage.match(/contracts\\/[^:\\s]+\\.sol:[^\\s]+/g);\n \n if (fqnMatches && fqnMatches.length > 0) {\n // Prefer the one from gnus-ai directory\n const gnusAiFqn = fqnMatches.find((fqn: string) => fqn.includes('gnus-ai'));\n if (gnusAiFqn) {\n try {\n await artifacts.readArtifact(gnusAiFqn);\n return gnusAiFqn; // Return the fully qualified name\n } catch (fqnError) {\n // Continue to fallback\n }\n }\n \n // If no gnus-ai version, prefer non-diamond-abi artifacts for deployment\n const nonDiamondAbiFqn = fqnMatches.find((fqn: string) => !fqn.includes('diamond-abi'));\n if (nonDiamondAbiFqn) {\n try {\n await artifacts.readArtifact(nonDiamondAbiFqn);\n return nonDiamondAbiFqn; // Return the fully qualified name\n } catch (fqnError) {\n // Continue to fallback\n }\n }\n \n // Fallback: try the first available\n for (const fqn of fqnMatches) {\n try {\n await artifacts.readArtifact(fqn);\n return fqn; // Return the fully qualified name\n } catch (fqnError) {\n // Continue to next option\n }\n }\n }\n }\n \n // If diamond name fails, try Mock prefixed version (for testing)\n const mockName = `Mock${diamondName}`;\n try {\n await artifacts.readArtifact(mockName);\n return mockName;\n } catch (mockError) {\n // If both fail, throw the original error\n throw error;\n }\n }\n}\n\n/**\n * Gets the contract artifact for a logical name, trying both production and mock versions\n */\nexport async function getContractArtifact(logicalName: string, diamond?: Diamond): Promise<Artifact> {\n // Use the same mapping logic as getContractName\n const mappedName = await getContractName(logicalName, diamond);\n return await artifacts.readArtifact(mappedName);\n}\n\n/**\n * Standard mapping for common facet types\n */\nexport const FACET_TYPE_MAPPING = {\n 'DiamondCutFacet': 'DiamondCutFacet',\n 'DiamondLoupeFacet': 'DiamondLoupeFacet',\n 'TestFacet': 'TestFacet',\n 'OwnershipFacet': 'OwnershipFacet',\n // Add more mappings as needed\n} as const;\n\n/**\n * Get all available contract names from artifacts\n */\nexport async function getAvailableContracts(): Promise<string[]> {\n const names = await artifacts.getAllFullyQualifiedNames();\n return names.map(name => name.split(':').pop() || name);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"contractMapping.js","sourceRoot":"","sources":["../../src/utils/contractMapping.ts"],"names":[],"mappings":";;;AAQA,0CAgHC;AAKD,wDAwFC;AAKD,kDAOC;AAgBD,sDAGC;AApPD,qCAAoC;AAIpC;;;GAGG;AACI,KAAK,UAAU,eAAe,CACpC,WAAmB,EACnB,OAAiB;IAEjB,uEAAuE;IACvE,IAAI,OAAO,EAAE,CAAC;QACb,yCAAyC;QACzC,MAAM,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAE3D,+DAA+D;QAC/D,gEAAgE;IACjE,CAAC;IACD,iDAAiD;IACjD,MAAM,mBAAmB,GAA2B;QACnD,WAAW,EAAE,aAAa;QAC1B,mBAAmB,EAAE,aAAa;QAClC,iBAAiB,EAAE,aAAa;QAChC,YAAY,EAAE,aAAa;QAC3B,gBAAgB,EAAE,kBAAkB;QACpC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;KACjC,CAAC;IAEF,2CAA2C;IAC3C,IAAI,WAAW,IAAI,mBAAmB,EAAE,CAAC;QACxC,IAAI,CAAC;YACJ,MAAM,UAAU,GACf,mBAAmB,CAAC,WAA+C,CAAC,CAAC;YACtE,MAAM,mBAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACzC,OAAO,UAAU,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,gEAAgE;QACjE,CAAC;IACF,CAAC;IAED,oDAAoD;IACpD,IAAI,WAAW,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzC,4DAA4D;QAC5D,IAAI,CAAC;YACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,YAAY,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC;gBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;gBAC9C,OAAO,eAAe,CAAC;YACxB,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACpB,kCAAkC;YACnC,CAAC;QACF,CAAC;IACF,CAAC;IAED,uDAAuD;IACvD,IAAI,WAAW,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC9C,iEAAiE;QACjE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACvD,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,kEAAkE;YAClE,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,aAAa,GAAG,qBAAqB,YAAY,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5C,OAAO,aAAa,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;oBAC3C,OAAO,YAAY,CAAC;gBACrB,CAAC;gBAAC,OAAO,MAAM,EAAE,CAAC;oBACjB,IAAI,CAAC;wBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;wBAC9C,OAAO,eAAe,CAAC;oBACxB,CAAC;oBAAC,OAAO,SAAS,EAAE,CAAC;wBACpB,kCAAkC;oBACnC,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,kDAAkD;IAClD,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3C,OAAO,YAAY,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC;gBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;gBAC9C,OAAO,eAAe,CAAC;YACxB,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACpB,kCAAkC;YACnC,CAAC;QACF,CAAC;IACF,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC;QACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1C,OAAO,WAAW,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,iEAAiE;QACjE,MAAM,QAAQ,GAAG,OAAO,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC;YACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACpB,yCAAyC;YACzC,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;AACF,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAC3C,WAAmB,EACnB,OAAiB;IAEjB,yCAAyC;IACzC,MAAM,YAAY,GAA2B;QAC5C,WAAW,EAAE,aAAa;QAC1B,mBAAmB,EAAE,aAAa;QAClC,iBAAiB,EAAE,aAAa;QAChC,YAAY,EAAE,aAAa;QAC3B,gBAAgB,EAAE,kBAAkB;QACpC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;QACjC,kBAAkB,EAAE,aAAa;KACjC,CAAC;IAEF,wCAAwC;IACxC,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,MAAM,UAAU,GAAG,YAAY,CAAC,WAAwC,CAAC,CAAC;YAC1E,MAAM,mBAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACzC,OAAO,UAAU,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,gEAAgE;QACjE,CAAC;IACF,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC;QACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAC1C,OAAO,WAAW,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,iGAAiG;QACjG,MAAM,GAAG,GAAG,KAAkC,CAAC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACxE,2DAA2D;YAC3D,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC;YACjC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAEzE,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,wCAAwC;gBACxC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC5E,IAAI,SAAS,EAAE,CAAC;oBACf,IAAI,CAAC;wBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;wBACxC,OAAO,SAAS,CAAC,CAAC,kCAAkC;oBACrD,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBACnB,uBAAuB;oBACxB,CAAC;gBACF,CAAC;gBAED,yEAAyE;gBACzE,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CACvC,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC7C,CAAC;gBACF,IAAI,gBAAgB,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;wBAC/C,OAAO,gBAAgB,CAAC,CAAC,kCAAkC;oBAC5D,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBACnB,uBAAuB;oBACxB,CAAC;gBACF,CAAC;gBAED,oCAAoC;gBACpC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;wBAClC,OAAO,GAAG,CAAC,CAAC,kCAAkC;oBAC/C,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBACnB,0BAA0B;oBAC3B,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QAED,iEAAiE;QACjE,MAAM,QAAQ,GAAG,OAAO,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC;YACJ,MAAM,mBAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACpB,yCAAyC;YACzC,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;AACF,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACxC,WAAmB,EACnB,OAAiB;IAEjB,gDAAgD;IAChD,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,MAAM,mBAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACU,QAAA,kBAAkB,GAAG;IACjC,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,cAAc,EAAE,gBAAgB;IAChC,8BAA8B;CACrB,CAAC;AAEX;;GAEG;AACI,KAAK,UAAU,qBAAqB;IAC1C,MAAM,KAAK,GAAG,MAAM,mBAAS,CAAC,yBAAyB,EAAE,CAAC;IAC1D,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["import { artifacts } from 'hardhat';\nimport { Artifact } from 'hardhat/types';\nimport { Diamond } from '../core/Diamond';\n\n/**\n * Maps logical facet names to actual contract names available in artifacts.\n * This handles both production contracts and mock contracts for testing.\n */\nexport async function getContractName(\n\tlogicalName: string,\n\tdiamond?: Diamond,\n): Promise<string> {\n\t// If diamond is provided, check for diamond-specific contract mappings\n\tif (diamond) {\n\t\t// Try to load diamond-specific ABI first\n\t\tconst diamondAbiFilePath = diamond.getDiamondAbiFilePath();\n\n\t\t// For now, we'll still fall back to the standard mapping logic\n\t\t// but this provides a hook for future diamond-specific mappings\n\t}\n\t// Special diamond mappings for test environments\n\tconst testDiamondMappings: Record<string, string> = {\n\t\tTestDiamond: 'MockDiamond',\n\t\tAdvancedTestDiamond: 'MockDiamond',\n\t\tConfigTestDiamond: 'MockDiamond',\n\t\tProxyDiamond: 'MockDiamond',\n\t\tBenchmarkDiamond: 'BenchmarkDiamond',\n\t\tConcurrentDiamond0: 'MockDiamond',\n\t\tConcurrentDiamond1: 'MockDiamond',\n\t\tConcurrentDiamond2: 'MockDiamond',\n\t\tConcurrentDiamond3: 'MockDiamond',\n\t\tConcurrentDiamond4: 'MockDiamond',\n\t};\n\n\t// Check if there's a diamond mapping first\n\tif (logicalName in testDiamondMappings) {\n\t\ttry {\n\t\t\tconst mappedName =\n\t\t\t\ttestDiamondMappings[logicalName as keyof typeof testDiamondMappings];\n\t\t\tawait artifacts.readArtifact(mappedName);\n\t\t\treturn mappedName;\n\t\t} catch (error) {\n\t\t\t// Fall through to normal logic if mapped artifact doesn't exist\n\t\t}\n\t}\n\n\t// Special test facet mappings for performance tests\n\tif (logicalName.match(/^TestFacet\\d+$/)) {\n\t\t// Map TestFacet1, TestFacet2, etc. to available test facets\n\t\ttry {\n\t\t\tawait artifacts.readArtifact('TestFacet2');\n\t\t\treturn 'TestFacet2';\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tawait artifacts.readArtifact('MockTestFacet');\n\t\t\t\treturn 'MockTestFacet';\n\t\t\t} catch (mockError) {\n\t\t\t\t// Fall back to the original logic\n\t\t\t}\n\t\t}\n\t}\n\n\t// Map BenchmarkFacet test names to available contracts\n\tif (logicalName.startsWith('BenchmarkFacet')) {\n\t\t// Extract the number from BenchmarkFacet1, BenchmarkFacet2, etc.\n\t\tconst match = logicalName.match(/BenchmarkFacet(\\d+)/);\n\t\tif (match) {\n\t\t\tconst num = parseInt(match[1], 10);\n\t\t\t// Map to available mock benchmark facets (MockBenchmarkFacet1-20)\n\t\t\tconst mockFacetNum = ((num - 1) % 20) + 1;\n\t\t\tconst mockFacetName = `MockBenchmarkFacet${mockFacetNum}`;\n\t\t\ttry {\n\t\t\t\tawait artifacts.readArtifact(mockFacetName);\n\t\t\t\treturn mockFacetName;\n\t\t\t} catch (error) {\n\t\t\t\ttry {\n\t\t\t\t\tawait artifacts.readArtifact('TestFacet2');\n\t\t\t\t\treturn 'TestFacet2';\n\t\t\t\t} catch (error2) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait artifacts.readArtifact('MockTestFacet');\n\t\t\t\t\t\treturn 'MockTestFacet';\n\t\t\t\t\t} catch (mockError) {\n\t\t\t\t\t\t// Fall back to the original logic\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Map SlowFacet to a real facet for timeout tests\n\tif (logicalName === 'SlowFacet') {\n\t\ttry {\n\t\t\tawait artifacts.readArtifact('TestFacet2');\n\t\t\treturn 'TestFacet2';\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tawait artifacts.readArtifact('MockTestFacet');\n\t\t\t\treturn 'MockTestFacet';\n\t\t\t} catch (mockError) {\n\t\t\t\t// Fall back to the original logic\n\t\t\t}\n\t\t}\n\t}\n\n\t// Try the logical name first (for production)\n\ttry {\n\t\tawait artifacts.readArtifact(logicalName);\n\t\treturn logicalName;\n\t} catch (error) {\n\t\t// If logical name fails, try Mock prefixed version (for testing)\n\t\tconst mockName = `Mock${logicalName}`;\n\t\ttry {\n\t\t\tawait artifacts.readArtifact(mockName);\n\t\t\treturn mockName;\n\t\t} catch (mockError) {\n\t\t\t// If both fail, throw the original error\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\n/**\n * Maps logical diamond name to actual contract name available in artifacts.\n */\nexport async function getDiamondContractName(\n\tdiamondName: string,\n\tdiamond?: Diamond,\n): Promise<string> {\n\t// Special mappings for test environments\n\tconst testMappings: Record<string, string> = {\n\t\tTestDiamond: 'MockDiamond',\n\t\tAdvancedTestDiamond: 'MockDiamond',\n\t\tConfigTestDiamond: 'MockDiamond',\n\t\tProxyDiamond: 'MockDiamond',\n\t\tBenchmarkDiamond: 'BenchmarkDiamond',\n\t\tConcurrentDiamond0: 'MockDiamond',\n\t\tConcurrentDiamond1: 'MockDiamond',\n\t\tConcurrentDiamond2: 'MockDiamond',\n\t\tConcurrentDiamond3: 'MockDiamond',\n\t\tConcurrentDiamond4: 'MockDiamond',\n\t};\n\n\t// Check if there's a test mapping first\n\tif (diamondName in testMappings) {\n\t\ttry {\n\t\t\tconst mappedName = testMappings[diamondName as keyof typeof testMappings];\n\t\t\tawait artifacts.readArtifact(mappedName);\n\t\t\treturn mappedName;\n\t\t} catch (error) {\n\t\t\t// Fall through to normal logic if mapped artifact doesn't exist\n\t\t}\n\t}\n\n\t// Try the diamond name first (for production)\n\ttry {\n\t\tawait artifacts.readArtifact(diamondName);\n\t\treturn diamondName;\n\t} catch (error) {\n\t\t// If there are multiple artifacts with the same name, try to resolve using fully qualified names\n\t\tconst err = error as Error & { code?: string };\n\t\tif (err.code === 'HH701' && err.message.includes('multiple artifacts')) {\n\t\t\t// Extract the fully qualified names from the error message\n\t\t\tconst errorMessage = err.message;\n\t\t\tconst fqnMatches = errorMessage.match(/contracts\\/[^:\\s]+\\.sol:[^\\s]+/g);\n\n\t\t\tif (fqnMatches && fqnMatches.length > 0) {\n\t\t\t\t// Prefer the one from gnus-ai directory\n\t\t\t\tconst gnusAiFqn = fqnMatches.find((fqn: string) => fqn.includes('gnus-ai'));\n\t\t\t\tif (gnusAiFqn) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait artifacts.readArtifact(gnusAiFqn);\n\t\t\t\t\t\treturn gnusAiFqn; // Return the fully qualified name\n\t\t\t\t\t} catch (fqnError) {\n\t\t\t\t\t\t// Continue to fallback\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If no gnus-ai version, prefer non-diamond-abi artifacts for deployment\n\t\t\t\tconst nonDiamondAbiFqn = fqnMatches.find(\n\t\t\t\t\t(fqn: string) => !fqn.includes('diamond-abi'),\n\t\t\t\t);\n\t\t\t\tif (nonDiamondAbiFqn) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait artifacts.readArtifact(nonDiamondAbiFqn);\n\t\t\t\t\t\treturn nonDiamondAbiFqn; // Return the fully qualified name\n\t\t\t\t\t} catch (fqnError) {\n\t\t\t\t\t\t// Continue to fallback\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fallback: try the first available\n\t\t\t\tfor (const fqn of fqnMatches) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait artifacts.readArtifact(fqn);\n\t\t\t\t\t\treturn fqn; // Return the fully qualified name\n\t\t\t\t\t} catch (fqnError) {\n\t\t\t\t\t\t// Continue to next option\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If diamond name fails, try Mock prefixed version (for testing)\n\t\tconst mockName = `Mock${diamondName}`;\n\t\ttry {\n\t\t\tawait artifacts.readArtifact(mockName);\n\t\t\treturn mockName;\n\t\t} catch (mockError) {\n\t\t\t// If both fail, throw the original error\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\n/**\n * Gets the contract artifact for a logical name, trying both production and mock versions\n */\nexport async function getContractArtifact(\n\tlogicalName: string,\n\tdiamond?: Diamond,\n): Promise<Artifact> {\n\t// Use the same mapping logic as getContractName\n\tconst mappedName = await getContractName(logicalName, diamond);\n\treturn await artifacts.readArtifact(mappedName);\n}\n\n/**\n * Standard mapping for common facet types\n */\nexport const FACET_TYPE_MAPPING = {\n\tDiamondCutFacet: 'DiamondCutFacet',\n\tDiamondLoupeFacet: 'DiamondLoupeFacet',\n\tTestFacet: 'TestFacet',\n\tOwnershipFacet: 'OwnershipFacet',\n\t// Add more mappings as needed\n} as const;\n\n/**\n * Get all available contract names from artifacts\n */\nexport async function getAvailableContracts(): Promise<string[]> {\n\tconst names = await artifacts.getAllFullyQualifiedNames();\n\treturn names.map((name) => name.split(':').pop() ?? name);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diamondslab/diamonds",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
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",
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
"@ethersproject/providers": "^5.8.0",
|
|
141
141
|
"@gnus.ai/contracts-upgradeable-diamond": "=4.5.0",
|
|
142
142
|
"@nomicfoundation/hardhat-chai-matchers": "^2.0.0",
|
|
143
|
-
"@nomicfoundation/hardhat-ethers": "
|
|
143
|
+
"@nomicfoundation/hardhat-ethers": "*",
|
|
144
144
|
"@nomicfoundation/hardhat-ignition": "^0.15.0",
|
|
145
145
|
"@nomicfoundation/hardhat-ignition-ethers": "^0.15.0",
|
|
146
146
|
"@nomicfoundation/hardhat-network-helpers": "^1.0.0",
|