diff --git a/backend/app.js b/backend/app.js index 7b08e85..79e658f 100644 --- a/backend/app.js +++ b/backend/app.js @@ -87,6 +87,7 @@ const russianClassifiersRoutes = require('./routes/russian-classifiers'); // Д const ollamaRoutes = require('./routes/ollama'); // Добавляем импорт Ollama маршрутов const aiQueueRoutes = require('./routes/ai-queue'); // Добавляем импорт AI Queue маршрутов const tagsRoutes = require('./routes/tags'); // Добавляем импорт маршрутов тегов +const blockchainRoutes = require('./routes/blockchain'); // Добавляем импорт blockchain маршрутов const app = express(); @@ -212,6 +213,7 @@ app.use('/api/russian-classifiers', russianClassifiersRoutes); // Добавля app.use('/api/ollama', ollamaRoutes); // Добавляем маршрут Ollama app.use('/api/ai-queue', aiQueueRoutes); // Добавляем маршрут AI Queue app.use('/api/tags', tagsRoutes); // Добавляем маршрут тегов +app.use('/api/blockchain', blockchainRoutes); // Добавляем маршрут blockchain app.use('/api/messages', messagesRoutes); app.use('/api/identities', identitiesRoutes); app.use('/api/rag', ragRoutes); // Подключаем роут diff --git a/backend/routes/blockchain.js b/backend/routes/blockchain.js new file mode 100644 index 0000000..fd9e11e --- /dev/null +++ b/backend/routes/blockchain.js @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2024-2025 Тарабанов Александр Викторович + * All rights reserved. + * + * This software is proprietary and confidential. + * Unauthorized copying, modification, or distribution is prohibited. + * + * For licensing inquiries: info@hb3-accelerator.com + * Website: https://hb3-accelerator.com + * GitHub: https://github.com/HB3-ACCELERATOR + */ + +const express = require('express'); +const router = express.Router(); +const { ethers } = require('ethers'); +const rpcProviderService = require('../services/rpcProviderService'); + +// Чтение данных DLE из блокчейна +router.post('/read-dle-info', async (req, res) => { + try { + const { dleAddress } = req.body; + + if (!dleAddress) { + return res.status(400).json({ + success: false, + error: 'Адрес DLE обязателен' + }); + } + + console.log(`[Blockchain] Чтение данных DLE из блокчейна: ${dleAddress}`); + + // Получаем RPC URL для Sepolia + const rpcUrl = await rpcProviderService.getRpcUrlByChainId(11155111); + if (!rpcUrl) { + return res.status(500).json({ + success: false, + error: 'RPC URL для Sepolia не найден' + }); + } + + const provider = new ethers.JsonRpcProvider(rpcUrl); + + // ABI для чтения данных DLE + const dleAbi = [ + "function getDLEInfo() external view returns (tuple(string name, string symbol, string location, string coordinates, uint256 jurisdiction, uint256 oktmo, string[] okvedCodes, uint256 kpp, uint256 creationTimestamp, bool isActive))", + "function totalSupply() external view returns (uint256)", + "function balanceOf(address account) external view returns (uint256)", + "function quorumPercentage() external view returns (uint256)", + "function getCurrentChainId() external view returns (uint256)" + ]; + + const dle = new ethers.Contract(dleAddress, dleAbi, provider); + + // Читаем данные DLE + const dleInfo = await dle.getDLEInfo(); + const totalSupply = await dle.totalSupply(); + const quorumPercentage = await dle.quorumPercentage(); + const currentChainId = await dle.getCurrentChainId(); + + // Проверяем баланс создателя (адрес, который деплоил контракт) + const deployer = "0xF45aa4917b3775bA37f48Aeb3dc1a943561e9e0B"; + const deployerBalance = await dle.balanceOf(deployer); + + // Определяем количество участников (держателей токенов) + let participantCount = 0; + if (deployerBalance > 0) { + participantCount++; + } + + // Проверяем, есть ли другие держатели токенов + // Для простоты считаем, что если создатель имеет меньше 100% токенов, то есть другие участники + const deployerPercentage = (Number(deployerBalance) / Number(totalSupply)) * 100; + if (deployerPercentage < 100) { + participantCount = Math.max(participantCount, 2); // Минимум 2 участника + } + + const blockchainData = { + name: dleInfo.name, + symbol: dleInfo.symbol, + location: dleInfo.location, + coordinates: dleInfo.coordinates, + jurisdiction: Number(dleInfo.jurisdiction), + oktmo: Number(dleInfo.oktmo), + okvedCodes: dleInfo.okvedCodes, + kpp: Number(dleInfo.kpp), + creationTimestamp: Number(dleInfo.creationTimestamp), + isActive: dleInfo.isActive, + totalSupply: ethers.formatUnits(totalSupply, 18), + deployerBalance: ethers.formatUnits(deployerBalance, 18), + quorumPercentage: Number(quorumPercentage), + currentChainId: Number(currentChainId), + participantCount: participantCount + }; + + console.log(`[Blockchain] Данные DLE прочитаны из блокчейна:`, blockchainData); + + res.json({ + success: true, + data: blockchainData + }); + + } catch (error) { + console.error('[Blockchain] Ошибка при чтении данных DLE из блокчейна:', error); + res.status(500).json({ + success: false, + error: 'Ошибка при чтении данных из блокчейна: ' + error.message + }); + } +}); + +module.exports = router; \ No newline at end of file diff --git a/backend/routes/dleV2.js b/backend/routes/dleV2.js index 031d270..5819322 100644 --- a/backend/routes/dleV2.js +++ b/backend/routes/dleV2.js @@ -188,12 +188,50 @@ router.delete('/:dleAddress', auth.requireAuth, auth.requireAdmin, async (req, r } }); +/** + * @route GET /api/dle-v2/check-admin-tokens + * @desc Проверить баланс админских токенов для адреса + * @access Public + */ +router.get('/check-admin-tokens', async (req, res, next) => { + try { + const { address } = req.query; + + if (!address) { + return res.status(400).json({ + success: false, + message: 'Адрес кошелька не передан' + }); + } + + // Проверяем баланс токенов + const { checkAdminRole } = require('../services/admin-role'); + const isAdmin = await checkAdminRole(address); + + res.json({ + success: true, + data: { + isAdmin: isAdmin, + address: address, + message: isAdmin ? 'Админские токены найдены' : 'Админские токены не найдены' + } + }); + + } catch (error) { + logger.error('Ошибка при проверке админских токенов:', error); + res.status(500).json({ + success: false, + message: error.message || 'Произошла ошибка при проверке админских токенов' + }); + } +}); + /** * @route POST /api/dle-v2/validate-private-key * @desc Валидировать приватный ключ и получить адрес кошелька - * @access Private + * @access Public */ -router.post('/validate-private-key', auth.requireAuth, async (req, res, next) => { +router.post('/validate-private-key', async (req, res, next) => { try { const { privateKey } = req.body; @@ -207,6 +245,8 @@ router.post('/validate-private-key', auth.requireAuth, async (req, res, next) => // Логируем входящий ключ (только для отладки) logger.info('Получен приватный ключ для валидации:', privateKey); logger.info('Длина входящего ключа:', privateKey.length); + logger.info('Тип входящего ключа:', typeof privateKey); + logger.info('Полный объект запроса:', JSON.stringify(req.body)); try { // Очищаем ключ от префикса 0x если есть diff --git a/backend/scripts/deploy/create-dle-v2.js b/backend/scripts/deploy/create-dle-v2.js index 56f98d4..d0ce62d 100644 --- a/backend/scripts/deploy/create-dle-v2.js +++ b/backend/scripts/deploy/create-dle-v2.js @@ -20,36 +20,72 @@ async function main() { const deployParams = getDeployParams(); console.log("Начинаем создание современного DLE v2..."); - console.log("Параметры DLE:"); - console.log(JSON.stringify(deployParams, null, 2)); + console.log("Параметры DLE:"); + console.log(JSON.stringify(deployParams, null, 2)); + + // Преобразуем initialAmounts в wei + const initialAmountsInWei = deployParams.initialAmounts.map(amount => ethers.parseUnits(amount.toString(), 18)); + console.log("Initial amounts в wei:"); + console.log(initialAmountsInWei.map(wei => ethers.formatUnits(wei, 18) + " токенов")); - // Получаем аккаунт деплоя - const [deployer] = await ethers.getSigners(); + // Получаем RPC URL и приватный ключ из переменных окружения + const rpcUrl = process.env.RPC_URL; + const privateKey = process.env.PRIVATE_KEY; + + if (!rpcUrl || !privateKey) { + throw new Error('RPC_URL и PRIVATE_KEY должны быть установлены в переменных окружения'); + } + + // Создаем провайдер и кошелек + const provider = new ethers.JsonRpcProvider(rpcUrl); + const deployer = new ethers.Wallet(privateKey, provider); + console.log(`Адрес деплоера: ${deployer.address}`); - console.log(`Баланс деплоера: ${ethers.formatEther(await deployer.provider.getBalance(deployer.address))} ETH`); + const balance = await provider.getBalance(deployer.address); + console.log(`Баланс деплоера: ${ethers.formatEther(balance)} ETH`); + + // Проверяем, достаточно ли баланса для деплоя (минимум 0.00001 ETH для тестирования) + const minBalance = ethers.parseEther("0.00001"); + if (balance < minBalance) { + throw new Error(`Недостаточно ETH для деплоя. Баланс: ${ethers.formatEther(balance)} ETH, требуется минимум: ${ethers.formatEther(minBalance)} ETH. Пополните кошелек через Sepolia faucet.`); + } try { // 1. Создаем единый контракт DLE console.log("\n1. Деплой единого контракта DLE v2..."); - const DLE = await ethers.getContractFactory("DLE"); + const DLE = await ethers.getContractFactory("DLE", deployer); - // Создаем структуру DLEConfig + // Создаем структуру DLEConfig с полными данными const dleConfig = { name: deployParams.name, symbol: deployParams.symbol, location: deployParams.location, coordinates: deployParams.coordinates || "0,0", jurisdiction: deployParams.jurisdiction || 1, - oktmo: deployParams.oktmo || 45000000000, + oktmo: parseInt(deployParams.oktmo) || 45000000000, okvedCodes: deployParams.okvedCodes || [], - kpp: deployParams.kpp || 770101001, + kpp: parseInt(deployParams.kpp) || 770101001, quorumPercentage: deployParams.quorumPercentage || 51, initialPartners: deployParams.initialPartners, - initialAmounts: deployParams.initialAmounts, + initialAmounts: deployParams.initialAmounts.map(amount => ethers.parseUnits(amount.toString(), 18)), supportedChainIds: deployParams.supportedChainIds || [1, 137, 56, 42161] // Ethereum, Polygon, BSC, Arbitrum }; + console.log("Конфигурация DLE для записи в блокчейн:"); + console.log("Название:", dleConfig.name); + console.log("Символ:", dleConfig.symbol); + console.log("Местонахождение:", dleConfig.location); + console.log("Координаты:", dleConfig.coordinates); + console.log("Юрисдикция:", dleConfig.jurisdiction); + console.log("ОКТМО:", dleConfig.oktmo); + console.log("Коды ОКВЭД:", dleConfig.okvedCodes.join(', ')); + console.log("КПП:", dleConfig.kpp); + console.log("Кворум:", dleConfig.quorumPercentage + "%"); + console.log("Партнеры:", dleConfig.initialPartners.join(', ')); + console.log("Количества токенов:", dleConfig.initialAmounts.map(amount => ethers.formatUnits(amount, 18) + " токенов").join(', ')); + console.log("Поддерживаемые сети:", dleConfig.supportedChainIds.join(', ')); + const currentChainId = deployParams.currentChainId || 1; // По умолчанию Ethereum const dle = await DLE.deploy(dleConfig, currentChainId); @@ -58,17 +94,33 @@ async function main() { const dleAddress = await dle.getAddress(); console.log(`DLE v2 задеплоен по адресу: ${dleAddress}`); - // 2. Получаем информацию о DLE + // 2. Получаем информацию о DLE из блокчейна const dleInfo = await dle.getDLEInfo(); - console.log("\n2. Информация о DLE:"); + console.log("\n2. Информация о DLE из блокчейна:"); console.log(`Название: ${dleInfo.name}`); console.log(`Символ: ${dleInfo.symbol}`); console.log(`Местонахождение: ${dleInfo.location}`); - console.log(`Коды деятельности: ${dleInfo.okvedCodes.join(', ')}`); - console.log(`Дата создания: ${new Date(dleInfo.creationTimestamp * 1000).toISOString()}`); + console.log(`Координаты: ${dleInfo.coordinates}`); + console.log(`Юрисдикция: ${dleInfo.jurisdiction}`); + console.log(`ОКТМО: ${dleInfo.oktmo}`); + console.log(`Коды ОКВЭД: ${dleInfo.okvedCodes.join(', ')}`); + console.log(`КПП: ${dleInfo.kpp}`); + console.log(`Дата создания: ${new Date(Number(dleInfo.creationTimestamp) * 1000).toISOString()}`); + console.log(`Активен: ${dleInfo.isActive}`); + + // Проверяем, что данные записались правильно + console.log("\n3. Проверка записи данных в блокчейн:"); + if (dleInfo.name === deployParams.name && + dleInfo.location === deployParams.location && + dleInfo.jurisdiction === deployParams.jurisdiction) { + console.log("✅ Все данные DLE успешно записаны в блокчейн!"); + console.log("Теперь эти данные видны на Etherscan в разделе 'Contract' -> 'Read Contract'"); + } else { + console.log("❌ Ошибка: данные не записались правильно в блокчейн"); + } - // 3. Сохраняем информацию о созданном DLE - console.log("\n3. Сохранение информации о DLE v2..."); + // 4. Сохраняем информацию о созданном DLE + console.log("\n4. Сохранение информации о DLE v2..."); const dleData = { name: deployParams.name, symbol: deployParams.symbol, @@ -76,13 +128,16 @@ async function main() { coordinates: deployParams.coordinates || "0,0", jurisdiction: deployParams.jurisdiction || 1, oktmo: deployParams.oktmo || 45000000000, - okvedCodes: deployParams.isicCodes || [], + okvedCodes: deployParams.okvedCodes || [], kpp: deployParams.kpp || 770101001, dleAddress: dleAddress, - creationBlock: (await dle.provider.getBlockNumber()), - creationTimestamp: (await dle.provider.getBlock()).timestamp, + creationBlock: Number(await provider.getBlockNumber()), + creationTimestamp: Number((await provider.getBlock()).timestamp), deployedManually: true, version: "v2", + // Сохраняем информацию о партнерах + initialPartners: deployParams.initialPartners || [], + initialAmounts: deployParams.initialAmounts || [], governanceSettings: { quorumPercentage: deployParams.quorumPercentage || 51, supportedChainIds: deployParams.supportedChainIds || [1, 137, 56, 42161], diff --git a/backend/scripts/utils/get-rpc-url.js b/backend/scripts/utils/get-rpc-url.js new file mode 100644 index 0000000..1069cd5 --- /dev/null +++ b/backend/scripts/utils/get-rpc-url.js @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2024-2025 Тарабанов Александр Викторович + * All rights reserved. + * + * This software is proprietary and confidential. + * Unauthorized copying, modification, or distribution is prohibited. + * + * For licensing inquiries: info@hb3-accelerator.com + * Website: https://hb3-accelerator.com + * GitHub: https://github.com/HB3-ACCELERATOR + */ + +const rpcProviderService = require('../../services/rpcProviderService'); + +async function main() { + try { + console.log('🔍 Получение RPC URL из базы данных...\n'); + + // Получаем все RPC провайдеры + const providers = await rpcProviderService.getAllRpcProviders(); + + console.log('📋 Все RPC провайдеры:'); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + + for (const provider of providers) { + console.log(`🌐 Сеть: ${provider.network_id}`); + console.log(`🔗 Chain ID: ${provider.chain_id}`); + console.log(`📡 RPC URL: ${provider.rpc_url}`); + console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); + } + + // Получаем конкретный RPC URL для Sepolia + console.log('\n🎯 RPC URL для Sepolia (chain_id: 11155111):'); + const sepoliaRpc = await rpcProviderService.getRpcUrlByChainId(11155111); + + if (sepoliaRpc) { + console.log(`✅ Найден: ${sepoliaRpc}`); + } else { + console.log('❌ RPC URL для Sepolia не найден'); + } + + } catch (error) { + console.error('❌ Ошибка при получении RPC URL:', error); + throw error; + } +} + +main() + .then(() => { + console.log('\n✅ Скрипт завершен успешно'); + process.exit(0); + }) + .catch((error) => { + console.error('\n❌ Скрипт завершен с ошибкой:', error); + process.exit(1); + }); \ No newline at end of file diff --git a/backend/scripts/utils/read-dle-info.js b/backend/scripts/utils/read-dle-info.js new file mode 100644 index 0000000..01f0a4e --- /dev/null +++ b/backend/scripts/utils/read-dle-info.js @@ -0,0 +1,107 @@ +/** + * Copyright (c) 2024-2025 Тарабанов Александр Викторович + * All rights reserved. + * + * This software is proprietary and confidential. + * Unauthorized copying, modification, or distribution is prohibited. + * + * For licensing inquiries: info@hb3-accelerator.com + * Website: https://hb3-accelerator.com + * GitHub: https://github.com/HB3-ACCELERATOR + */ + +// Скрипт для чтения данных DLE из блокчейна +const { ethers } = require("hardhat"); + +async function main() { + // Адрес DLE контракта (замените на ваш адрес) + const dleAddress = process.env.DLE_ADDRESS || "0x219f9665e713476B0B080bd73b8465B39dAB1E41"; + + console.log(`Читаем данные DLE из блокчейна по адресу: ${dleAddress}`); + + // Получаем RPC URL из переменных окружения или используем дефолтный для Sepolia + const rpcUrl = process.env.RPC_URL || 'https://eth-sepolia.nodereal.io/v1/56dec8028bae4f26b76099a42dae2b52'; + + // Создаем провайдер + const provider = new ethers.JsonRpcProvider(rpcUrl); + + try { + // Получаем ABI контракта DLE + const DLE = await ethers.getContractFactory("DLE"); + const dle = DLE.attach(dleAddress).connect(provider); + + // Читаем данные DLE из блокчейна + console.log("\n📋 Чтение данных DLE из блокчейна..."); + + const dleInfo = await dle.getDLEInfo(); + + console.log("\n✅ Данные DLE из блокчейна:"); + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + console.log(`🏢 Название: ${dleInfo.name}`); + console.log(`💎 Символ: ${dleInfo.symbol}`); + console.log(`📍 Местонахождение: ${dleInfo.location}`); + console.log(`🌍 Координаты: ${dleInfo.coordinates}`); + console.log(`🏛️ Юрисдикция: ${dleInfo.jurisdiction}`); + console.log(`📊 ОКТМО: ${dleInfo.oktmo}`); + console.log(`🏭 Коды ОКВЭД: ${dleInfo.okvedCodes.join(', ')}`); + console.log(`🏢 КПП: ${dleInfo.kpp}`); + console.log(`📅 Дата создания: ${new Date(Number(dleInfo.creationTimestamp) * 1000).toISOString()}`); + console.log(`✅ Активен: ${dleInfo.isActive}`); + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + + // Дополнительная информация + console.log("\n📊 Дополнительная информация:"); + const quorumPercentage = await dle.quorumPercentage(); + const currentChainId = await dle.getCurrentChainId(); + const totalSupply = await dle.totalSupply(); + + console.log(`🗳️ Кворум: ${quorumPercentage}%`); + console.log(`🔗 Текущая сеть: ${currentChainId}`); + console.log(`💰 Общий запас токенов: ${ethers.formatUnits(totalSupply, 18)}`); + + // Проверяем информацию о токенах + console.log("\n👥 Информация о токенах:"); + try { + const totalSupply = await dle.totalSupply(); + console.log(`💰 Общий запас: ${ethers.formatUnits(totalSupply, 18)} токенов`); + + // Проверим баланс создателя контракта (адрес, который деплоил контракт) + const deployer = "0xF45aa4917b3775bA37f48Aeb3dc1a943561e9e0B"; // Адрес из логов + const deployerBalance = await dle.balanceOf(deployer); + if (deployerBalance > 0) { + console.log(`👤 Создатель (${deployer}): ${ethers.formatUnits(deployerBalance, 18)} токенов`); + } else { + console.log(`👤 Создатель (${deployer}): 0 токенов`); + } + + // Проверим, есть ли другие держатели токенов + console.log("\n🔍 Проверка распределения токенов:"); + console.log("💡 Партнеры не сохраняются в блокчейне как отдельные данные."); + console.log("💡 Они используются только для первоначального распределения токенов."); + console.log("💡 Информация о партнерах хранится в локальных файлах JSON."); + + } catch (error) { + console.log("⚠️ Не удалось прочитать информацию о токенах:", error.message); + } + + console.log("\n🌐 Ссылка на Etherscan:"); + console.log(`https://sepolia.etherscan.io/address/${dleAddress}#readContract`); + console.log("\n💡 На Etherscan перейдите в раздел 'Contract' -> 'Read Contract'"); + console.log(" и вызовите функцию 'getDLEInfo' чтобы увидеть эти данные!"); + + } catch (error) { + console.error("❌ Ошибка при чтении данных DLE:", error); + throw error; + } +} + +// Запускаем скрипт +main() + .then(() => { + console.log("\n✅ Скрипт завершен успешно"); + process.exit(0); + }) + .catch((error) => { + console.error("\n❌ Скрипт завершен с ошибкой:", error); + process.exit(1); + }); \ No newline at end of file diff --git a/backend/services/dleV2Service.js b/backend/services/dleV2Service.js index da5623d..e9f0ceb 100644 --- a/backend/services/dleV2Service.js +++ b/backend/services/dleV2Service.js @@ -55,19 +55,52 @@ class DLEV2Service { : 1; // По умолчанию Ethereum // Получаем rpc_url из базы по chain_id + logger.info(`Поиск RPC URL для chain_id: ${chainId}`); const rpcUrl = await getRpcUrlByChainId(chainId); if (!rpcUrl) { + logger.error(`RPC URL для сети с chain_id ${chainId} не найден в базе данных`); throw new Error(`RPC URL для сети с chain_id ${chainId} не найден в базе данных`); } + logger.info(`Найден RPC URL для chain_id ${chainId}: ${rpcUrl}`); + + // Проверяем баланс кошелька + const { ethers } = require('ethers'); + const provider = new ethers.JsonRpcProvider(rpcUrl); + const walletAddress = dleParams.privateKey ? new ethers.Wallet(dleParams.privateKey, provider).address : null; + + if (walletAddress) { + const balance = await provider.getBalance(walletAddress); + const minBalance = ethers.parseEther("0.00001"); // Временно уменьшено для тестирования + logger.info(`Баланс кошелька ${walletAddress}: ${ethers.formatEther(balance)} ETH`); + + if (balance < minBalance) { + logger.warn(`Недостаточно ETH для деплоя. Баланс: ${ethers.formatEther(balance)} ETH, требуется минимум: ${ethers.formatEther(minBalance)} ETH`); + throw new Error(`Недостаточно ETH для деплоя. Баланс: ${ethers.formatEther(balance)} ETH, требуется минимум: ${ethers.formatEther(minBalance)} ETH. Пополните кошелек через Sepolia faucet: https://sepoliafaucet.com/`); + } + } if (!dleParams.privateKey) { throw new Error('Приватный ключ для деплоя не передан'); } + // Маппинг chain_id к именам сетей в Hardhat + const chainIdToNetworkName = { + 1: 'ethereum', + 137: 'polygon', + 56: 'bsc', + 42161: 'arbitrum', + 11155111: 'sepolia' + }; + + const networkName = chainIdToNetworkName[chainId]; + if (!networkName) { + throw new Error(`Сеть с chain_id ${chainId} не поддерживается для деплоя`); + } + // Запускаем скрипт деплоя с нужными переменными окружения const result = await this.runDeployScript(paramsFile, { rpcUrl, privateKey: dleParams.privateKey, - networkId: chainId.toString(), + networkId: networkName, envNetworkKey: chainId.toString().toUpperCase() }); @@ -204,15 +237,15 @@ class DLEV2Service { return; } - // Формируем универсальные переменные окружения + // Формируем переменные окружения для скрипта деплоя const envVars = { ...process.env, - [`${extraEnv.envNetworkKey}_RPC_URL`]: extraEnv.rpcUrl, - [`${extraEnv.envNetworkKey}_PRIVATE_KEY`]: extraEnv.privateKey + RPC_URL: extraEnv.rpcUrl, + PRIVATE_KEY: extraEnv.privateKey }; - // Запускаем скрипт с нужной сетью - const hardhatProcess = spawn('npx', ['hardhat', 'run', scriptPath, '--network', extraEnv.networkId], { + // Запускаем скрипт без указания сети, передаем RPC URL и приватный ключ через переменные окружения + const hardhatProcess = spawn('npx', ['hardhat', 'run', scriptPath], { cwd: path.join(__dirname, '..'), env: envVars, stdio: 'pipe' @@ -232,17 +265,17 @@ class DLEV2Service { }); hardhatProcess.on('close', (code) => { - if (code === 0) { - try { - // Пытаемся извлечь результат из stdout - const result = this.extractDeployResult(stdout); - resolve(result); - } catch (error) { - logger.error('Ошибка при извлечении результатов деплоя DLE v2:', error); + try { + // Пытаемся извлечь результат из stdout независимо от кода завершения + const result = this.extractDeployResult(stdout); + resolve(result); + } catch (error) { + logger.error('Ошибка при извлечении результатов деплоя DLE v2:', error); + if (code === 0) { reject(new Error('Не удалось найти информацию о созданном DLE v2')); + } else { + reject(new Error(`Скрипт деплоя DLE v2 завершился с кодом ${code}: ${stderr}`)); } - } else { - reject(new Error(`Скрипт деплоя DLE v2 завершился с кодом ${code}: ${stderr}`)); } }); @@ -272,6 +305,8 @@ class DLEV2Service { }; } + // Если не нашли адрес, выводим весь stdout для отладки + console.log('Полный вывод скрипта:', stdout); throw new Error('Не удалось извлечь адрес DLE из вывода скрипта'); } diff --git a/backend/services/rpcProviderService.js b/backend/services/rpcProviderService.js index b3492cc..3b03a56 100644 --- a/backend/services/rpcProviderService.js +++ b/backend/services/rpcProviderService.js @@ -63,7 +63,14 @@ async function getRpcUrlByNetworkId(networkId) { } async function getRpcUrlByChainId(chainId) { + console.log(`[RPC Service] Поиск RPC URL для chain_id: ${chainId}`); const providers = await encryptedDb.getData('rpc_providers', { chain_id: chainId }, 1); + console.log(`[RPC Service] Найдено провайдеров: ${providers.length}`); + if (providers.length > 0) { + console.log(`[RPC Service] Найден RPC URL: ${providers[0].rpc_url}`); + } else { + console.log(`[RPC Service] RPC URL для chain_id ${chainId} не найден`); + } return providers[0]?.rpc_url || null; } diff --git a/frontend/src/views/ManagementView.vue b/frontend/src/views/ManagementView.vue index 1075bf5..2ad4215 100644 --- a/frontend/src/views/ManagementView.vue +++ b/frontend/src/views/ManagementView.vue @@ -25,26 +25,102 @@ - -
Загрузка деплоированных DLE...
+Деплоированных DLE пока нет
+Создайте новый DLE на странице Деплой DLE
+Создание, подписание, выполнение
- +Балансы, трансферы, распределение
- +Настройки голосования
- +Установка, настройка, управление
- -Интеграция с другими DLE, участие в кворумах
- +Управление средствами
- + +Графики, статистика, отчеты
+Графики, статистика, отчеты
- -Лог операций, события, транзакции
- +Параметры DLE, конфигурация
- + +Управление мультиподписью
+Один приватный ключ создаст одинаковый адрес во всех EVM-совместимых сетях. Это упрощает управление и позволяет использовать один кошелек для всех операций.
-{{ deployStatus }}
+Добавление DLE контрактов администраторами
Установленных модулей пока нет
-Модули, которые можно установить в вашем DLE
- -{{ availableModule.description }}
-Балансы, трансферы и распределение токенов
+