UNPKG

dop-stick

Version:

Source control tooling for versionable-upgradeable smart contracts

109 lines 4.86 kB
"use strict"; 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