const express = require('express'); const router = express.Router(); const deployParamsService = require('../services/deployParamsService'); /** * Получить адрес контракта в указанной сети для мультичейн голосования * POST /api/dle-core/get-multichain-contracts */ router.post('/get-multichain-contracts', async (req, res) => { try { const { originalContract, targetChainId } = req.body; console.log('🔍 [MULTICHAIN] Поиск контракта для мультичейн голосования:', { originalContract, targetChainId }); if (!originalContract || !targetChainId) { return res.status(400).json({ success: false, error: 'Не указан originalContract или targetChainId' }); } // Ищем контракт в указанной сети // Для мультичейн контрактов с одинаковым адресом (детерминированный деплой) // или контракты в разных сетях с разными адресами // Сначала проверяем, есть ли контракт с таким же адресом в целевой сети const contractsInTargetNetwork = await deployParamsService.getContractsByChainId(targetChainId); console.log('📊 [MULTICHAIN] Контракты в целевой сети:', contractsInTargetNetwork); // Ищем контракт в целевой сети (все контракты в targetChainId уже отфильтрованы) const targetContract = contractsInTargetNetwork[0]; // Берем первый контракт в целевой сети if (targetContract) { console.log('✅ [MULTICHAIN] Найден контракт в целевой сети:', targetContract.dleAddress); return res.json({ success: true, contractAddress: targetContract.dleAddress, chainId: targetChainId, source: 'database' }); } // Если не найден контракт в целевой сети, проверяем мультичейн развертывание // с одинаковым адресом (CREATE2) const { ethers } = require('ethers'); // Получаем RPC URL из параметров деплоя let rpcUrl; try { // Получаем последние параметры деплоя const latestParams = await deployParamsService.getLatestDeployParams(1); if (latestParams.length > 0) { const params = latestParams[0]; const rpcUrls = params.rpcUrls || params.rpc_urls || {}; rpcUrl = rpcUrls[targetChainId]; } // Если не найден в параметрах, используем fallback if (!rpcUrl) { const fallbackConfigs = { '11155111': 'https://1rpc.io/sepolia', '17000': 'https://ethereum-holesky.publicnode.com', '421614': 'https://sepolia-rollup.arbitrum.io/rpc', '84532': 'https://sepolia.base.org' }; rpcUrl = fallbackConfigs[targetChainId]; } if (!rpcUrl) { return res.status(400).json({ success: false, error: `Неподдерживаемая сеть: ${targetChainId}` }); } } catch (error) { console.error('❌ Ошибка получения RPC URL:', error); return res.status(500).json({ success: false, error: 'Ошибка получения конфигурации сети' }); } try { const provider = new ethers.JsonRpcProvider(rpcUrl); const contractCode = await provider.getCode(originalContract); if (contractCode && contractCode !== '0x') { console.log('✅ [MULTICHAIN] Контракт существует в целевой сети с тем же адресом (CREATE2)'); return res.json({ success: true, contractAddress: originalContract, chainId: targetChainId, source: 'blockchain' }); } } catch (blockchainError) { console.warn('⚠️ [MULTICHAIN] Ошибка проверки контракта в блокчейне:', blockchainError.message); } // Контракт не найден console.log('❌ [MULTICHAIN] Контракт не найден в целевой сети'); return res.json({ success: false, error: 'Контракт не найден в целевой сети' }); } catch (error) { console.error('❌ [MULTICHAIN] Ошибка поиска мультичейн контракта:', error); return res.status(500).json({ success: false, error: 'Внутренняя ошибка сервера' }); } }); module.exports = router;