176 lines
7.7 KiB
JavaScript
176 lines
7.7 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
|
||
*/
|
||
|
||
/**
|
||
* Централизованный генератор параметров конструктора для DLE контракта
|
||
* Обеспечивает одинаковые параметры для деплоя и верификации
|
||
*/
|
||
|
||
/**
|
||
* Генерирует параметры конструктора для DLE контракта
|
||
* @param {Object} params - Параметры деплоя из базы данных
|
||
* @param {number} chainId - ID сети для деплоя (опционально)
|
||
* @returns {Object} Объект с параметрами конструктора
|
||
*/
|
||
function generateDLEConstructorArgs(params, chainId = null) {
|
||
// Валидация обязательных параметров
|
||
if (!params) {
|
||
throw new Error('Параметры деплоя не переданы');
|
||
}
|
||
|
||
// Базовые параметры DLE
|
||
const dleConfig = {
|
||
name: params.name || '',
|
||
symbol: params.symbol || '',
|
||
location: params.location || '',
|
||
coordinates: params.coordinates || '',
|
||
jurisdiction: params.jurisdiction ? BigInt(String(params.jurisdiction)) : 0n,
|
||
okvedCodes: (params.okvedCodes || params.okved_codes || []).map(code => {
|
||
// OKVED коды должны оставаться строками, так как в контракте DLE.sol
|
||
// поле okvedCodes определено как string[], а не uint256[]
|
||
if (typeof code === 'string') {
|
||
return code;
|
||
}
|
||
return code.toString();
|
||
}),
|
||
kpp: params.kpp ? BigInt(String(params.kpp)) : 0n,
|
||
quorumPercentage: params.quorumPercentage ? BigInt(String(params.quorumPercentage)) : 50n,
|
||
initialPartners: params.initialPartners || params.initial_partners || [],
|
||
// Умножаем initialAmounts на 1e18 для конвертации в wei
|
||
initialAmounts: (params.initialAmounts || params.initial_amounts || []).map(amount => BigInt(String(amount)) * BigInt(1e18)),
|
||
supportedChainIds: (params.supportedChainIds || params.supported_chain_ids || []).map(id => BigInt(String(id)))
|
||
};
|
||
|
||
// Определяем initializer
|
||
const initializer = params.initializer || params.initialPartners?.[0] || "0x0000000000000000000000000000000000000000";
|
||
|
||
return {
|
||
dleConfig,
|
||
initializer
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Генерирует параметры конструктора для верификации (с преобразованием в строки)
|
||
* @param {Object} params - Параметры деплоя из базы данных
|
||
* @param {number} chainId - ID сети для верификации (опционально)
|
||
* @returns {Array} Массив параметров конструктора для верификации
|
||
*/
|
||
function generateVerificationArgs(params, chainId = null) {
|
||
const { dleConfig, initializer } = generateDLEConstructorArgs(params, chainId);
|
||
|
||
// Для верификации нужно преобразовать BigInt в строки
|
||
const verificationConfig = {
|
||
...dleConfig,
|
||
initialAmounts: dleConfig.initialAmounts.map(amount => amount.toString()),
|
||
supportedChainIds: dleConfig.supportedChainIds.map(id => id.toString())
|
||
};
|
||
|
||
return [
|
||
verificationConfig,
|
||
initializer
|
||
];
|
||
}
|
||
|
||
/**
|
||
* Генерирует параметры конструктора для деплоя (с BigInt)
|
||
* @param {Object} params - Параметры деплоя из базы данных
|
||
* @param {number} chainId - ID сети для деплоя (опционально)
|
||
* @returns {Object} Объект с параметрами конструктора для деплоя
|
||
*/
|
||
function generateDeploymentArgs(params, chainId = null) {
|
||
const { dleConfig, initializer } = generateDLEConstructorArgs(params, chainId);
|
||
|
||
return {
|
||
dleConfig,
|
||
initializer
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Валидирует параметры конструктора
|
||
* @param {Object} params - Параметры деплоя
|
||
* @returns {Object} Результат валидации
|
||
*/
|
||
function validateConstructorArgs(params) {
|
||
const errors = [];
|
||
const warnings = [];
|
||
|
||
// Проверяем обязательные поля
|
||
if (!params.name) errors.push('name не указан');
|
||
if (!params.symbol) errors.push('symbol не указан');
|
||
if (!params.location) errors.push('location не указан');
|
||
if (!params.coordinates) errors.push('coordinates не указаны');
|
||
if (!params.jurisdiction) errors.push('jurisdiction не указан');
|
||
if ((!params.okvedCodes || !Array.isArray(params.okvedCodes)) && (!params.okved_codes || !Array.isArray(params.okved_codes))) {
|
||
errors.push('okvedCodes не указан или не является массивом');
|
||
}
|
||
if (!params.initialPartners || !Array.isArray(params.initialPartners)) errors.push('initialPartners не указан или не является массивом');
|
||
if (!params.initialAmounts || !Array.isArray(params.initialAmounts)) errors.push('initialAmounts не указан или не является массивом');
|
||
if (!params.supportedChainIds || !Array.isArray(params.supportedChainIds)) errors.push('supportedChainIds не указан или не является массивом');
|
||
|
||
// Проверяем соответствие массивов
|
||
if (params.initialPartners && params.initialAmounts &&
|
||
params.initialPartners.length !== params.initialAmounts.length) {
|
||
errors.push('Количество initialPartners не соответствует количеству initialAmounts');
|
||
}
|
||
|
||
// Проверяем значения
|
||
if (params.quorumPercentage && (params.quorumPercentage < 1 || params.quorumPercentage > 100)) {
|
||
warnings.push('quorumPercentage должен быть от 1 до 100');
|
||
}
|
||
|
||
if (params.initialAmounts) {
|
||
const negativeAmounts = params.initialAmounts.filter(amount => amount < 0);
|
||
if (negativeAmounts.length > 0) {
|
||
errors.push('initialAmounts содержит отрицательные значения');
|
||
}
|
||
}
|
||
|
||
return {
|
||
isValid: errors.length === 0,
|
||
errors,
|
||
warnings
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Логирует параметры конструктора для отладки
|
||
* @param {Object} params - Параметры деплоя
|
||
* @param {string} context - Контекст (deployment/verification)
|
||
*/
|
||
function logConstructorArgs(params, context = 'unknown') {
|
||
console.log(`📊 [${context.toUpperCase()}] Параметры конструктора:`);
|
||
console.log(` name: "${params.name}"`);
|
||
console.log(` symbol: "${params.symbol}"`);
|
||
console.log(` location: "${params.location}"`);
|
||
console.log(` coordinates: "${params.coordinates}"`);
|
||
console.log(` jurisdiction: ${params.jurisdiction}`);
|
||
const okvedCodes = params.okvedCodes || params.okved_codes || [];
|
||
console.log(` okvedCodes: [${okvedCodes.join(', ')}]`);
|
||
console.log(` kpp: ${params.kpp}`);
|
||
console.log(` quorumPercentage: ${params.quorumPercentage}`);
|
||
console.log(` initialPartners: [${params.initialPartners.join(', ')}]`);
|
||
console.log(` initialAmounts: [${params.initialAmounts.join(', ')}]`);
|
||
console.log(` supportedChainIds: [${params.supportedChainIds.join(', ')}]`);
|
||
console.log(` governanceChainId: 1 (Ethereum)`);
|
||
console.log(` initializer: ${params.initializer}`);
|
||
}
|
||
|
||
module.exports = {
|
||
generateDLEConstructorArgs,
|
||
generateVerificationArgs,
|
||
generateDeploymentArgs,
|
||
validateConstructorArgs,
|
||
logConstructorArgs
|
||
};
|