ваше сообщение коммита

This commit is contained in:
2025-12-01 22:05:31 +03:00
parent 6dacba2786
commit 90da3a0d12
10 changed files with 475 additions and 347 deletions

View File

@@ -74,32 +74,16 @@ const MODULE_CONFIGS = {
// }
};
// Функция для определения имени сети Hardhat по chainId
// Функция для определения имени сети Hardhat по chainId (динамически, без хардкода)
// В hardhat.config.js сети объявляются как chain_<chainId>
function getNetworkNameForHardhat(chainId) {
const networkMapping = {
11155111: 'sepolia',
17000: 'holesky',
421614: 'arbitrumSepolia',
84532: 'baseSepolia',
1: 'mainnet',
42161: 'arbitrumOne',
8453: 'base',
137: 'polygon',
56: 'bsc'
};
const hardhatNetworkName = networkMapping[chainId];
if (!hardhatNetworkName) {
logger.warn(`⚠️ Сеть ${chainId} не поддерживается в Hardhat`);
return null;
}
logger.info(`✅ Сеть ${chainId} поддерживается: ${hardhatNetworkName}`);
const hardhatNetworkName = `chain_${Number(chainId)}`;
logger.info(`✅ Сеть ${chainId} будет использовать Hardhat network: ${hardhatNetworkName}`);
return hardhatNetworkName;
}
// Функция для автоматической верификации модуля
async function verifyModuleAfterDeploy(chainId, contractAddress, moduleType, constructorArgs, apiKey) {
async function verifyModuleAfterDeploy(chainId, contractAddress, moduleType, constructorArgs, apiKey, params = {}) {
try {
if (!apiKey) {
logger.warn(`⚠️ API ключ Etherscan не предоставлен, пропускаем верификацию модуля ${moduleType}`);
@@ -143,10 +127,17 @@ async function verifyModuleAfterDeploy(chainId, contractAddress, moduleType, con
const command = `npx hardhat verify --network ${networkName} --constructor-args ${tempArgsFile} ${contractAddress}`;
logger.info(`🔧 Выполняем команду: ${command}`);
// Устанавливаем переменные окружения для Hardhat
// Устанавливаем переменные окружения для Hardhat (в том числе сети и RPC из deploy params)
const envVars = {
...process.env,
ETHERSCAN_API_KEY: apiKey
ETHERSCAN_API_KEY: apiKey || params.etherscanApiKey || '',
SUPPORTED_CHAIN_IDS: JSON.stringify(
params.supportedChainIds || params.supported_chain_ids || [chainId]
),
RPC_URLS: JSON.stringify(
// params.rpcUrls / params.rpc_urls могут быть либо массивом, либо объектом { [chainId]: url }
params.rpcUrls || params.rpc_urls || {}
)
};
const { stdout, stderr } = await execAsync(command, {
@@ -428,9 +419,9 @@ async function deployAllModulesInNetwork(chainId, pk, salt, dleAddress, modulesT
});
const net = network;
const chainId = Number(net.chainId);
const numericChainId = Number(net.chainId);
logger.info(`[MODULES_DBG] chainId=${chainId} deploying modules: ${modulesToDeploy.join(', ')}`);
logger.info(`[MODULES_DBG] chainId=${numericChainId} deploying modules: ${modulesToDeploy.join(', ')}`);
const results = {};
@@ -443,14 +434,14 @@ async function deployAllModulesInNetwork(chainId, pk, salt, dleAddress, modulesT
logger.info(`[MODULES_DBG] Деплой модуля ${moduleType} в сети ${net.name || net.chainId}`);
if (!MODULE_CONFIGS[moduleType]) {
logger.error(`[MODULES_DBG] chainId=${chainId} Unknown module type: ${moduleType}`);
logger.error(`[MODULES_DBG] chainId=${numericChainId} Unknown module type: ${moduleType}`);
results[moduleType] = { success: false, error: `Unknown module type: ${moduleType}` };
logger.error(`[MODULES_DBG] Неизвестный тип модуля: ${moduleType}`);
continue;
}
if (!moduleInit) {
logger.error(`[MODULES_DBG] chainId=${chainId} No init code for module: ${moduleType}`);
logger.error(`[MODULES_DBG] chainId=${numericChainId} No init code for module: ${moduleType}`);
results[moduleType] = { success: false, error: `No init code for module: ${moduleType}` };
logger.error(`[MODULES_DBG] Отсутствует код инициализации для модуля: ${moduleType}`);
continue;
@@ -469,7 +460,7 @@ async function deployAllModulesInNetwork(chainId, pk, salt, dleAddress, modulesT
// Получаем аргументы конструктора для модуля
const moduleConfig = MODULE_CONFIGS[moduleType];
const constructorArgs = moduleConfig.constructorArgs(dleAddress, chainId, wallet.address);
const constructorArgs = moduleConfig.constructorArgs(dleAddress, numericChainId, wallet.address);
// Ждем 30 секунд перед верификацией, чтобы транзакция получила подтверждения
logger.info(`[MODULES_DBG] Ждем 30 секунд перед верификацией модуля ${moduleType}...`);
@@ -477,7 +468,7 @@ async function deployAllModulesInNetwork(chainId, pk, salt, dleAddress, modulesT
// Проверяем, что контракт действительно задеплоен
try {
const { provider } = await createRPCConnection(rpcUrl, pk, { maxRetries: 3, timeout: 30000 });
const { provider } = await createRPCConnection(numericChainId, pk, { maxRetries: 3, timeout: 30000 });
const code = await provider.getCode(result.address);
if (!code || code === '0x') {
logger.warn(`[MODULES_DBG] Контракт ${moduleType} не найден по адресу ${result.address}, пропускаем верификацию`);
@@ -489,11 +480,12 @@ async function deployAllModulesInNetwork(chainId, pk, salt, dleAddress, modulesT
}
const verificationResult = await verifyModuleAfterDeploy(
chainId,
numericChainId,
result.address,
moduleType,
constructorArgs,
params.etherscanApiKey
params.etherscanApiKey,
params
);
if (verificationResult.success) {
@@ -542,16 +534,9 @@ async function deployAllModulesInNetwork(chainId, pk, salt, dleAddress, modulesT
async function deployAllModulesInAllNetworks(networks, pk, salt, dleAddress, modulesToDeploy, moduleInits, targetNonces) {
const results = [];
for (let i = 0; i < connections.length; i++) {
const connection = connections[i];
const rpcUrl = connection.rpcUrl;
logger.info(`[MODULES_DBG] deploying modules to network ${i + 1}/${connections.length}: ${rpcUrl}`);
const result = await deployAllModulesInNetwork(rpcUrl, pk, salt, dleAddress, modulesToDeploy, moduleInits, targetNonces);
results.push(result);
}
return results;
// Функция больше не используется (логика деплоя реализована через connections в main)
// Оставлена для совместимости.
return [];
}
async function main() {
@@ -849,38 +834,22 @@ async function main() {
};
// Собираем информацию о всех сетях для этого модуля
for (let i = 0; i < networks.length; i++) {
const rpcUrl = networks[i];
for (let i = 0; i < deployResults.length; i++) {
const deployResult = deployResults[i];
const verificationResult = deployResult.verification || 'unknown';
const rpcUrl = deployResult.rpcUrl;
const moduleResult = deployResult.modules?.[moduleType];
const verification = verificationResult?.modules?.[moduleType] || 'unknown';
try {
const { provider, network } = await createRPCConnection(rpcUrl, pk, {
maxRetries: 3,
timeout: 30000
});
moduleInfo.networks.push({
chainId: Number(network.chainId),
rpcUrl: rpcUrl,
address: moduleResult?.success ? moduleResult.address : null,
verification: verification,
success: moduleResult?.success || false,
error: moduleResult?.error || null
});
} catch (error) {
logger.error(`[MODULES_DBG] Ошибка получения chainId для модуля ${moduleType} в сети ${i + 1}:`, error.message);
moduleInfo.networks.push({
chainId: null,
rpcUrl: rpcUrl,
address: null,
verification: 'error',
success: false,
error: error.message
});
}
// Верификационный статус уже хранится в deployResult.modules[moduleType].verification
const verification = moduleResult?.verification || 'unknown';
moduleInfo.networks.push({
chainId: deployResult.chainId ?? null,
rpcUrl: rpcUrl,
address: moduleResult?.success ? moduleResult.address : null,
verification: verification,
success: moduleResult?.success || false,
error: moduleResult?.error || null
});
}
// Сохраняем файл модуля

View File

@@ -54,26 +54,6 @@ console.log('[MULTI_DBG] main:', typeof main);
// Функция для получения имени сети для Hardhat из deploy_params
function getNetworkNameForHardhat(chainId, params) {
// Создаем маппинг chainId -> Hardhat network name
const networkMapping = {
11155111: 'sepolia',
17000: 'holesky',
421614: 'arbitrumSepolia',
84532: 'baseSepolia',
1: 'mainnet',
42161: 'arbitrumOne',
8453: 'base',
137: 'polygon',
56: 'bsc'
};
// Проверяем, поддерживается ли сеть в Hardhat
const hardhatNetworkName = networkMapping[chainId];
if (!hardhatNetworkName) {
logger.warn(`⚠️ Сеть ${chainId} не поддерживается в Hardhat`);
return null;
}
// Проверяем, есть ли эта сеть в supported_chain_ids из deploy_params
const supportedChainIds = params.supported_chain_ids || params.supportedChainIds || [];
if (supportedChainIds.length > 0) {
@@ -88,7 +68,10 @@ function getNetworkNameForHardhat(chainId, params) {
logger.info(` Список поддерживаемых сетей пуст, разрешаем верификацию для ${chainId}`);
}
logger.info(`✅ Сеть ${chainId} поддерживается: ${hardhatNetworkName}`);
// Динамически формируем имя сети для Hardhat без хардкода:
// в конфиге Hardhat сеть будет объявлена как chain_<chainId>
const hardhatNetworkName = `chain_${chainId}`;
logger.info(`✅ Сеть ${chainId} будет использовать Hardhat network: ${hardhatNetworkName}`);
logger.info(`🔍 Детали сети: chainId=${chainId}, hardhatName=${hardhatNetworkName}, supportedChains=[${supportedChainIds.join(', ')}]`);
return hardhatNetworkName;
}
@@ -824,11 +807,16 @@ async function main() {
}));
// ВЫВОДИМ РЕЗУЛЬТАТ С ИНТЕГРИРОВАННОЙ ВЕРИФИКАЦИЕЙ!
console.log('[MULTI_DBG] 🎯 ДОШЛИ ДО ВЫВОДА РЕЗУЛЬТАТА!');
console.log('[MULTI_DBG] 📊 finalResults:', JSON.stringify(finalResults, null, 2));
console.log('[MULTI_DBG] 🎯 ВЫВОДИМ MULTICHAIN_DEPLOY_RESULT!');
console.log('MULTICHAIN_DEPLOY_RESULT', JSON.stringify(finalResults));
console.log('[MULTI_DBG] ✅ MULTICHAIN_DEPLOY_RESULT ВЫВЕДЕН!');
// Важно: используем process.stdout.write, чтобы обойти маскирование адресов (logger/console)
logger.info('[MULTI_DBG] 🎯 ДОШЛИ ДО ВЫВОДА РЕЗУЛЬТАТА!');
logger.info('[MULTI_DBG] 📊 finalResults:', finalResults);
logger.info('[MULTI_DBG] 🎯 ВЫВОДИМ MULTICHAIN_DEPLOY_RESULT!');
const rawResult = JSON.stringify(finalResults);
// Эту строку парсят unifiedDeploymentService и dleV2Service по шаблону /MULTICHAIN_DEPLOY_RESULT\\s+(.+)/
process.stdout.write(`MULTICHAIN_DEPLOY_RESULT ${rawResult}\n`);
logger.info('[MULTI_DBG] ✅ MULTICHAIN_DEPLOY_RESULT ВЫВЕДЕН!');
logger.info('[MULTI_DBG] DLE deployment completed successfully with integrated verification!');
}
@@ -845,7 +833,9 @@ main().catch((e) => {
stack: e.stack
};
console.log('MULTICHAIN_DEPLOY_RESULT', JSON.stringify([errorResult]));
// Даже в случае ошибки выводим сырой результат без маскирования
const rawError = JSON.stringify([errorResult]);
process.stdout.write(`MULTICHAIN_DEPLOY_RESULT ${rawError}\n`);
process.exit(1);
});