dop-stick
Version:
Source control tooling for versionable-upgradeable smart contracts
109 lines • 4.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.InitializationHelper = void 0;
const ethers_1 = require("ethers");
const hardhatHelpers_1 = require("./hardhatHelpers");
const logger_1 = require("./logsAndMetrics/core/logger");
class InitializationHelper {
constructor(config) {
this.config = config;
this.defaultConfig = {
enabled: false,
deployNew: false
};
}
async prepareInitialization() {
// Merge with defaults
const initConfig = {
...this.defaultConfig,
...this.config.initialization
};
if (!initConfig.enabled) {
logger_1.Logger.info('Initialization disabled, skipping...');
return {
initializerAddress: ethers_1.ethers.constants.AddressZero,
initializerData: '0x'
};
}
try {
const { initializerContract, initializerFunction, initializerArgs = [], deployNew = false, existingAddress, gasLimit } = initConfig;
if (!initializerContract || !initializerFunction) {
throw new Error('Initializer configuration is incomplete. ' +
'Required: initializerContract and initializerFunction');
}
// Get the contract factory
const InitializerFactory = await (0, hardhatHelpers_1.getContractFactory)(initializerContract);
// Encode the initialization call
const initializerData = InitializerFactory.interface.encodeFunctionData(initializerFunction, initializerArgs);
let initializerAddress;
if (deployNew) {
logger_1.Logger.info('Deploying new initializer...');
const initializer = await InitializerFactory.deploy();
await initializer.deployed();
initializerAddress = initializer.address;
logger_1.Logger.success(`Initializer deployed at: ${initializerAddress}`);
}
else if (existingAddress) {
logger_1.Logger.info('Using existing initializer...');
// Validate existing initializer
const provider = await (0, hardhatHelpers_1.getProvider)();
const code = await provider.getCode(existingAddress);
if (code === '0x') {
throw new Error(`No code found at initializer address: ${existingAddress}`);
}
initializerAddress = existingAddress;
}
else {
throw new Error('Must either deploy new initializer or provide existing address');
}
// Validate initialization data
try {
const initializer = new ethers_1.Contract(initializerAddress, InitializerFactory.interface, await (0, hardhatHelpers_1.getProvider)());
// Estimate gas for initialization to ensure it's valid
const gasEstimateOptions = gasLimit ? { gasLimit } : {};
await initializer.estimateGas[initializerFunction](...initializerArgs, gasEstimateOptions);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
logger_1.Logger.error(`Failed to validate initialization data: ${errorMessage}`);
throw error;
}
logger_1.Logger.info('Initialization prepared successfully');
return {
initializerAddress,
initializerData
};
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
logger_1.Logger.error(`Failed to prepare initialization: ${errorMessage}`);
throw error;
}
}
async validateInitialization(data) {
const initConfig = {
...this.defaultConfig,
...this.config.initialization
};
if (!initConfig.enabled)
return true;
try {
const provider = await (0, hardhatHelpers_1.getProvider)();
const code = await provider.getCode(data.initializerAddress);
if (code === '0x') {
throw new Error('Initializer contract not deployed');
}
if (data.initializerData === '0x') {
throw new Error('Invalid initialization data');
}
return true;
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
logger_1.Logger.error(`Initialization validation failed: ${errorMessage}`);
throw error;
}
}
}
exports.InitializationHelper = InitializationHelper;
//# sourceMappingURL=initialization.js.map