ваше сообщение коммита

This commit is contained in:
2025-08-16 22:12:00 +03:00
parent fe0dc6509b
commit 1d636c113f
28 changed files with 6809 additions and 525 deletions

View File

@@ -751,4 +751,79 @@ export async function loadDeactivationProposals(dleAddress) {
console.error('Ошибка загрузки предложений деактивации:', error);
return [];
}
}
/**
* Создать предложение о переводе токенов через governance
* @param {string} dleAddress - Адрес DLE контракта
* @param {Object} transferData - Данные перевода
* @param {string} transferData.recipient - Адрес получателя
* @param {number} transferData.amount - Количество токенов
* @param {string} transferData.description - Описание предложения
* @param {number} transferData.duration - Длительность голосования в секундах
* @param {number} transferData.governanceChainId - ID сети для голосования
* @param {Array<number>} transferData.targetChains - Целевые сети для исполнения
* @returns {Promise<Object>} - Результат создания предложения
*/
export async function createTransferTokensProposal(dleAddress, transferData) {
try {
// Проверяем наличие браузерного кошелька
if (!window.ethereum) {
throw new Error('Браузерный кошелек не установлен');
}
// Запрашиваем подключение к кошельку
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
const provider = new ethers.BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
// ABI для создания предложения
const dleAbi = [
"function createProposal(string memory _description, uint256 _duration, bytes memory _operation, uint256 _governanceChainId, uint256[] memory _targetChains, uint256 _timelockDelay) external returns (uint256)"
];
const dle = new ethers.Contract(dleAddress, dleAbi, signer);
// Кодируем операцию перевода токенов
const transferFunctionSelector = ethers.id("_transferTokens(address,uint256)");
const transferDataEncoded = ethers.AbiCoder.defaultAbiCoder().encode(
["address", "uint256"],
[transferData.recipient, ethers.parseUnits(transferData.amount.toString(), 18)]
);
// Объединяем селектор и данные
const operation = ethers.concat([transferFunctionSelector, transferDataEncoded]);
console.log('Создание предложения о переводе токенов:', {
recipient: transferData.recipient,
amount: transferData.amount,
description: transferData.description,
operation: operation
});
// Создаем предложение
const tx = await dle.createProposal(
transferData.description,
transferData.duration,
operation,
transferData.governanceChainId,
transferData.targetChains || [],
0 // timelockDelay
);
// Ждем подтверждения транзакции
const receipt = await tx.wait();
console.log('Предложение о переводе токенов создано, tx hash:', tx.hash);
return {
proposalId: receipt.logs[0]?.topics[1] || '0', // Извлекаем ID предложения из события
txHash: tx.hash,
blockNumber: receipt.blockNumber
};
} catch (error) {
console.error('Ошибка создания предложения о переводе токенов:', error);
throw error;
}
}