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

This commit is contained in:
2025-04-21 16:52:32 +03:00
parent ab05988017
commit 4648aab7d5
20 changed files with 4206 additions and 4068 deletions

View File

@@ -5,56 +5,57 @@ import { SiweMessage } from 'siwe';
export const connectWallet = async () => {
try {
console.log('Starting wallet connection...');
// Проверяем наличие MetaMask или другого Ethereum провайдера
if (!window.ethereum) {
console.error('No Ethereum provider (like MetaMask) detected!');
return {
success: false,
error: 'Не найден кошелек MetaMask или другой Ethereum провайдер. Пожалуйста, установите расширение MetaMask.'
return {
success: false,
error:
'Не найден кошелек MetaMask или другой Ethereum провайдер. Пожалуйста, установите расширение MetaMask.',
};
}
console.log('MetaMask detected, requesting accounts...');
// Запрашиваем доступ к аккаунтам
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
console.log('Got accounts:', accounts);
if (!accounts || accounts.length === 0) {
return {
success: false,
error: 'Не удалось получить доступ к аккаунтам. Пожалуйста, разрешите доступ в MetaMask.'
return {
success: false,
error: 'Не удалось получить доступ к аккаунтам. Пожалуйста, разрешите доступ в MetaMask.',
};
}
// Берем первый аккаунт в списке
const address = accounts[0];
// Нормализуем адрес (приводим к нижнему регистру для последующих сравнений)
const normalizedAddress = ethers.utils.getAddress(address);
console.log('Normalized address:', normalizedAddress);
// Запрашиваем nonce с сервера
console.log('Requesting nonce...');
const nonceResponse = await axios.get(`/api/auth/nonce?address=${normalizedAddress}`);
const nonce = nonceResponse.data.nonce;
console.log('Got nonce:', nonce);
if (!nonce) {
return {
success: false,
error: 'Не удалось получить nonce от сервера.'
return {
success: false,
error: 'Не удалось получить nonce от сервера.',
};
}
// Создаем провайдер Ethers
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
// Создаем сообщение для подписи
const domain = window.location.host;
const origin = window.location.origin;
// Создаем SIWE сообщение
const message = new SiweMessage({
domain,
@@ -65,37 +66,37 @@ export const connectWallet = async () => {
chainId: 1, // Ethereum mainnet
nonce: nonce,
issuedAt: new Date().toISOString(),
resources: [`${origin}/api/auth/verify`]
resources: [`${origin}/api/auth/verify`],
});
// Получаем строку сообщения для подписи
const messageToSign = message.prepareMessage();
console.log('SIWE message:', messageToSign);
// Запрашиваем подпись
console.log('Requesting signature...');
const signature = await signer.signMessage(messageToSign);
if (!signature) {
return {
success: false,
error: 'Подпись не была получена. Пожалуйста, подпишите сообщение в MetaMask.'
return {
success: false,
error: 'Подпись не была получена. Пожалуйста, подпишите сообщение в MetaMask.',
};
}
console.log('Got signature:', signature);
// Отправляем верификацию на сервер
console.log('Sending verification request...');
const verifyResponse = await axios.post('/api/auth/verify', {
address: normalizedAddress,
signature,
nonce
nonce,
});
// Обновляем интерфейс для отображения подключенного состояния
document.body.classList.add('wallet-connected');
// Обновляем отображение адреса кошелька в UI
const authDisplayEl = document.getElementById('auth-display');
if (authDisplayEl) {
@@ -103,35 +104,35 @@ export const connectWallet = async () => {
authDisplayEl.innerHTML = `Кошелек: <strong>${shortAddress}</strong>`;
authDisplayEl.style.display = 'inline-block';
}
// Скрываем кнопки авторизации и показываем кнопку выхода
const authButtonsEl = document.getElementById('auth-buttons');
const logoutButtonEl = document.getElementById('logout-button');
if (authButtonsEl) authButtonsEl.style.display = 'none';
if (logoutButtonEl) logoutButtonEl.style.display = 'inline-block';
console.log('Verification response:', verifyResponse.data);
if (verifyResponse.data.success) {
return {
success: true,
return {
success: true,
address: normalizedAddress,
userId: verifyResponse.data.userId,
isAdmin: verifyResponse.data.isAdmin
isAdmin: verifyResponse.data.isAdmin,
};
} else {
return {
success: false,
error: verifyResponse.data.error || 'Ошибка верификации на сервере.'
return {
success: false,
error: verifyResponse.data.error || 'Ошибка верификации на сервере.',
};
}
} catch (error) {
console.error('Error connecting wallet:', error);
// Формируем понятное сообщение об ошибке
let errorMessage = 'Произошла ошибка при подключении кошелька.';
if (error.code === 4001) {
errorMessage = 'Вы отклонили запрос на подпись в MetaMask.';
} else if (error.response && error.response.data && error.response.data.error) {
@@ -139,10 +140,10 @@ export const connectWallet = async () => {
} else if (error.message) {
errorMessage = error.message;
}
return {
success: false,
error: errorMessage
return {
success: false,
error: errorMessage,
};
}
};
};