184 lines
6.3 KiB
JavaScript
184 lines
6.3 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
|
||
*/
|
||
|
||
import api from '@/api/axios';
|
||
|
||
/**
|
||
* Получить информацию о мультиконтрактном предложении
|
||
* @param {string} dleAddress - Адрес DLE контракта
|
||
* @param {number} proposalId - ID предложения
|
||
* @param {number} governanceChainId - ID сети голосования
|
||
* @returns {Promise<Object>} - Информация о предложении
|
||
*/
|
||
export async function getProposalMultichainInfo(dleAddress, proposalId, governanceChainId) {
|
||
try {
|
||
const response = await api.post('/dle-multichain-execution/get-proposal-multichain-info', {
|
||
dleAddress,
|
||
proposalId,
|
||
governanceChainId
|
||
});
|
||
|
||
if (response.data.success) {
|
||
return response.data.data;
|
||
} else {
|
||
throw new Error(response.data.error || 'Не удалось получить информацию о мультиконтрактном предложении');
|
||
}
|
||
} catch (error) {
|
||
console.error('Ошибка получения информации о мультиконтрактном предложении:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Исполнить предложение во всех целевых сетях
|
||
* @param {string} dleAddress - Адрес DLE контракта
|
||
* @param {number} proposalId - ID предложения
|
||
* @param {string} deploymentId - ID деплоя
|
||
* @param {string} userAddress - Адрес пользователя
|
||
* @returns {Promise<Object>} - Результат исполнения
|
||
*/
|
||
export async function executeInAllTargetChains(dleAddress, proposalId, deploymentId, userAddress) {
|
||
try {
|
||
const response = await api.post('/dle-multichain-execution/execute-in-all-target-chains', {
|
||
dleAddress,
|
||
proposalId,
|
||
deploymentId,
|
||
userAddress
|
||
});
|
||
|
||
if (response.data.success) {
|
||
return response.data.data;
|
||
} else {
|
||
throw new Error(response.data.error || 'Не удалось исполнить предложение во всех целевых сетях');
|
||
}
|
||
} catch (error) {
|
||
console.error('Ошибка исполнения во всех целевых сетях:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Исполнить предложение в конкретной целевой сети
|
||
* @param {string} dleAddress - Адрес DLE контракта
|
||
* @param {number} proposalId - ID предложения
|
||
* @param {number} targetChainId - ID целевой сети
|
||
* @param {string} deploymentId - ID деплоя
|
||
* @param {string} userAddress - Адрес пользователя
|
||
* @returns {Promise<Object>} - Результат исполнения
|
||
*/
|
||
export async function executeInTargetChain(dleAddress, proposalId, targetChainId, deploymentId, userAddress) {
|
||
try {
|
||
const response = await api.post('/dle-multichain-execution/execute-in-target-chain', {
|
||
dleAddress,
|
||
proposalId,
|
||
targetChainId,
|
||
deploymentId,
|
||
userAddress
|
||
});
|
||
|
||
if (response.data.success) {
|
||
return response.data.data;
|
||
} else {
|
||
throw new Error(response.data.error || 'Не удалось исполнить предложение в целевой сети');
|
||
}
|
||
} catch (error) {
|
||
console.error('Ошибка исполнения в целевой сети:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Получить deploymentId по адресу DLE
|
||
* @param {string} dleAddress - Адрес DLE контракта
|
||
* @returns {Promise<string>} - ID деплоя
|
||
*/
|
||
export async function getDeploymentId(dleAddress) {
|
||
try {
|
||
const response = await api.post('/dle-modules/get-deployment-id', {
|
||
dleAddress
|
||
});
|
||
|
||
if (response.data.success) {
|
||
return response.data.data.deploymentId;
|
||
} else {
|
||
throw new Error(response.data.error || 'Не удалось получить ID деплоя');
|
||
}
|
||
} catch (error) {
|
||
console.error('Ошибка получения ID деплоя:', error);
|
||
throw error;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Проверить, является ли предложение мультиконтрактным
|
||
* @param {Object} proposal - Предложение
|
||
* @returns {boolean} - Является ли мультиконтрактным
|
||
*/
|
||
export function isMultichainProposal(proposal) {
|
||
return proposal.targetChains && proposal.targetChains.length > 0;
|
||
}
|
||
|
||
/**
|
||
* Получить название сети по ID
|
||
* @param {number} chainId - ID сети
|
||
* @returns {string} - Название сети
|
||
*/
|
||
export function getChainName(chainId) {
|
||
const chainNames = {
|
||
1: 'Ethereum Mainnet',
|
||
11155111: 'Sepolia',
|
||
17000: 'Holesky',
|
||
421614: 'Arbitrum Sepolia',
|
||
84532: 'Base Sepolia',
|
||
137: 'Polygon',
|
||
80001: 'Polygon Mumbai',
|
||
56: 'BSC',
|
||
97: 'BSC Testnet'
|
||
};
|
||
|
||
return chainNames[chainId] || `Chain ${chainId}`;
|
||
}
|
||
|
||
/**
|
||
* Форматировать результат исполнения
|
||
* @param {Object} result - Результат исполнения
|
||
* @returns {string} - Отформатированный результат
|
||
*/
|
||
export function formatExecutionResult(result) {
|
||
const { summary, executionResults } = result;
|
||
|
||
if (summary.successful === summary.total) {
|
||
return `✅ Успешно исполнено во всех ${summary.total} сетях`;
|
||
} else if (summary.successful > 0) {
|
||
return `⚠️ Частично исполнено: ${summary.successful}/${summary.total} сетей`;
|
||
} else {
|
||
return `❌ Не удалось исполнить ни в одной сети`;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Получить детали ошибок исполнения
|
||
* @param {Object} result - Результат исполнения
|
||
* @returns {Array} - Массив ошибок
|
||
*/
|
||
export function getExecutionErrors(result) {
|
||
return result.executionResults
|
||
.filter(r => !r.success)
|
||
.map(r => ({
|
||
chainId: r.chainId,
|
||
chainName: getChainName(r.chainId),
|
||
error: r.error
|
||
}));
|
||
}
|
||
|
||
|