106 lines
3.8 KiB
JavaScript
106 lines
3.8 KiB
JavaScript
/**
|
||
* 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/VC-HB3-Accelerator
|
||
*/
|
||
|
||
const express = require('express');
|
||
const router = express.Router();
|
||
const { spawn } = require('child_process');
|
||
const path = require('path');
|
||
const logger = require('../utils/logger');
|
||
const auth = require('../middleware/auth');
|
||
|
||
/**
|
||
* @route POST /api/compile-contracts
|
||
* @desc Компилировать смарт-контракты через Hardhat
|
||
* @access Private (только для авторизованных пользователей с ролью admin)
|
||
*/
|
||
router.post('/', auth.requireAuth, auth.requireAdmin, async (req, res) => {
|
||
try {
|
||
console.log('🔨 Запуск компиляции смарт-контрактов...');
|
||
|
||
const hardhatProcess = spawn('npx', ['hardhat', 'compile'], {
|
||
cwd: path.join(__dirname, '..'),
|
||
stdio: 'pipe'
|
||
});
|
||
|
||
let stdout = '';
|
||
let stderr = '';
|
||
|
||
hardhatProcess.stdout.on('data', (data) => {
|
||
stdout += data.toString();
|
||
console.log(`[COMPILE] ${data.toString().trim()}`);
|
||
});
|
||
|
||
hardhatProcess.stderr.on('data', (data) => {
|
||
stderr += data.toString();
|
||
console.error(`[COMPILE_ERR] ${data.toString().trim()}`);
|
||
});
|
||
|
||
hardhatProcess.on('close', (code) => {
|
||
if (code === 0) {
|
||
console.log('✅ Компиляция завершена успешно');
|
||
|
||
// Автоматически генерируем ABI для фронтенда
|
||
try {
|
||
const { generateABIFile } = require('../scripts/generate-abi');
|
||
generateABIFile();
|
||
console.log('✅ ABI файл автоматически обновлен');
|
||
} catch (abiError) {
|
||
console.warn('⚠️ Ошибка генерации ABI:', abiError.message);
|
||
}
|
||
|
||
// Автоматически генерируем flattened контракт для верификации
|
||
try {
|
||
const { generateFlattened } = require('../scripts/generate-flattened');
|
||
generateFlattened().then(() => {
|
||
console.log('✅ Flattened контракт автоматически обновлен');
|
||
}).catch((flattenError) => {
|
||
console.warn('⚠️ Ошибка генерации flattened контракта:', flattenError.message);
|
||
});
|
||
} catch (flattenError) {
|
||
console.warn('⚠️ Ошибка генерации flattened контракта:', flattenError.message);
|
||
}
|
||
|
||
res.json({
|
||
success: true,
|
||
message: 'Смарт-контракты скомпилированы успешно',
|
||
data: { stdout, stderr }
|
||
});
|
||
} else {
|
||
console.error('❌ Ошибка компиляции:', stderr);
|
||
res.status(500).json({
|
||
success: false,
|
||
message: 'Ошибка компиляции смарт-контрактов',
|
||
error: stderr
|
||
});
|
||
}
|
||
});
|
||
|
||
hardhatProcess.on('error', (error) => {
|
||
console.error('❌ Ошибка запуска компиляции:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
message: 'Ошибка запуска компиляции',
|
||
error: error.message
|
||
});
|
||
});
|
||
|
||
} catch (error) {
|
||
logger.error('Ошибка компиляции контрактов:', error);
|
||
res.status(500).json({
|
||
success: false,
|
||
message: error.message || 'Произошла ошибка при компиляции контрактов'
|
||
});
|
||
}
|
||
});
|
||
|
||
module.exports = router;
|