From 18647091cf2a28f51abcbb7ff4b6061c580663a5 Mon Sep 17 00:00:00 2001 From: NW Date: Wed, 8 Jan 2025 18:26:50 +0000 Subject: [PATCH] minor edits to aesthetics and functionality --- .../adminHandlers/adminWalletsHandler.js | 194 ++++++++++++------ src/models/Wallet.js | 2 + src/utils/walletGenerator.js | 3 + src/utils/walletUtils.js | 12 +- 4 files changed, 151 insertions(+), 60 deletions(-) diff --git a/src/handlers/adminHandlers/adminWalletsHandler.js b/src/handlers/adminHandlers/adminWalletsHandler.js index 11627ef..bc201c2 100644 --- a/src/handlers/adminHandlers/adminWalletsHandler.js +++ b/src/handlers/adminHandlers/adminWalletsHandler.js @@ -1,3 +1,6 @@ +// adminWalletsHandler.js + + import bot from "../../context/bot.js"; import config from '../../config/config.js'; import WalletService from '../../services/walletService.js'; @@ -28,8 +31,8 @@ export default class AdminWalletsHandler { { text: 'Litecoin (LTC)', callback_data: 'wallet_type_LTC' } ], [ - { text: 'Tether (USDT)', callback_data: 'wallet_type_USDT' }, - { text: 'USD Coin (USDC)', callback_data: 'wallet_type_USDC' }, + { text: 'USDT ERC20', callback_data: 'wallet_type_USDT' }, + { text: 'USDC ERC20', callback_data: 'wallet_type_USDC' }, { text: 'Ethereum (ETH)', callback_data: 'wallet_type_ETH' } ] ] @@ -73,24 +76,55 @@ export default class AdminWalletsHandler { const endIndex = startIndex + pageSize; const walletsPage = wallets.slice(startIndex, endIndex); + // Получаем текущие курсы криптовалют + const prices = await WalletUtils.getCryptoPrices(); + // Формируем список кошельков с балансами let walletList = ''; for (const wallet of walletsPage) { - const walletUtilsInstance = new WalletUtils( - wallet.wallet_type === 'BTC' ? wallet.address : null, - wallet.wallet_type === 'LTC' ? wallet.address : null, - wallet.wallet_type === 'ETH' || wallet.wallet_type === 'USDT' || wallet.wallet_type === 'USDC' ? wallet.address : null, - null, // userId не нужен для админки - Date.now() - 30 * 24 * 60 * 60 * 1000 - ); - - const balances = await walletUtilsInstance.getAllBalances(); + // Определяем базовый тип кошелька (например, USDT_1735846098129 -> USDT) const baseType = WalletUtils.getBaseWalletType(wallet.wallet_type); - const balance = balances[baseType] || { amount: 0, usdValue: 0 }; - walletList += `💰 *${wallet.wallet_type}*\n`; - walletList += `├ Balance: ${balance.amount.toFixed(8)} ${wallet.wallet_type}\n`; - walletList += `├ Value: $${balance.usdValue.toFixed(2)}\n`; + // Определяем, является ли кошелек архивным + const isArchived = wallet.wallet_type.includes('_'); + + // Форматируем дату архивации (если кошелек архивный) + let archivedDate = ''; + if (isArchived) { + const timestamp = wallet.wallet_type.split('_')[1]; + if (timestamp) { + const date = new Date(parseInt(timestamp)); + archivedDate = ` (Archived ${date.toLocaleString()})`; + } + } + + // Получаем баланс из поля balance + const balance = wallet.balance || 0; + + // Рассчитываем значение в долларах + let usdValue = 0; + switch (baseType) { + case 'BTC': + usdValue = balance * prices.btc; + break; + case 'LTC': + usdValue = balance * prices.ltc; + break; + case 'ETH': + usdValue = balance * prices.eth; + break; + case 'USDT': + usdValue = balance; // USDT привязан к доллару + break; + case 'USDC': + usdValue = balance; // USDC привязан к доллару + break; + } + + // Формируем строку для кошелька + walletList += `💰 ${baseType}${archivedDate}\n`; + walletList += `├ Balance: ${balance.toFixed(8)} ${baseType}\n`; + walletList += `├ Value: $${usdValue.toFixed(2)}\n`; walletList += `└ Address: \`${wallet.address}\`\n\n`; } @@ -131,20 +165,38 @@ export default class AdminWalletsHandler { static async calculateTotalBalance(wallets) { let totalBalance = 0; - - for (const wallet of wallets) { - const walletUtilsInstance = new WalletUtils( - wallet.wallet_type === 'BTC' ? wallet.address : null, - wallet.wallet_type === 'LTC' ? wallet.address : null, - wallet.wallet_type === 'ETH' || wallet.wallet_type === 'USDT' || wallet.wallet_type === 'USDC' ? wallet.address : null, - null, // userId не нужен для админки - Date.now() - 30 * 24 * 60 * 60 * 1000 - ); - const balances = await walletUtilsInstance.getAllBalances(); + // Получаем текущие курсы криптовалют + const prices = await WalletUtils.getCryptoPrices(); + + for (const wallet of wallets) { + // Определяем базовый тип кошелька (например, USDT_1735846098129 -> USDT) const baseType = WalletUtils.getBaseWalletType(wallet.wallet_type); - const balance = balances[baseType] || { usdValue: 0 }; - totalBalance += balance.usdValue; + + // Получаем баланс из поля balance + const balance = wallet.balance || 0; + + // Рассчитываем значение в долларах + let usdValue = 0; + switch (baseType) { + case 'BTC': + usdValue = balance * prices.btc; + break; + case 'LTC': + usdValue = balance * prices.ltc; + break; + case 'ETH': + usdValue = balance * prices.eth; + break; + case 'USDT': + usdValue = balance; // USDT привязан к доллару + break; + case 'USDC': + usdValue = balance; // USDC привязан к доллару + break; + } + + totalBalance += usdValue; } return totalBalance; @@ -187,62 +239,86 @@ export default class AdminWalletsHandler { const action = callbackQuery.data; const chatId = callbackQuery.message.chat.id; const walletType = action.split('_').pop(); - + try { // Удаляем предыдущее сообщение перед отправкой нового await bot.deleteMessage(chatId, callbackQuery.message.message_id); - - // Получаем все кошельки выбранного типа + + // Получаем все кошельки выбранного типа (активные и архивные) const wallets = await WalletService.getWalletsByType(walletType); - + if (wallets.length === 0) { await bot.sendMessage(chatId, `No wallets found for ${walletType}.`); return; } - - // Расшифровываем мнемоническую фразу и получаем балансы + + // Получаем текущие курсы криптовалют + const prices = await WalletUtils.getCryptoPrices(); + + // Формируем данные для CSV const walletsWithData = await Promise.all(wallets.map(async (wallet) => { - if (!wallet.mnemonic) { - console.error(`Mnemonic is missing for wallet with ID ${wallet.id}`); - return null; // Пропускаем кошелек, если mnemonic отсутствует + // Определяем базовый тип кошелька (например, USDT1735846098129 -> USDT) + const baseType = WalletUtils.getBaseWalletType(wallet.wallet_type); + + // Получаем баланс из поля balance + const balance = wallet.balance || 0; + + // Рассчитываем значение в долларах + let usdValue = 0; + switch (baseType) { + case 'BTC': + usdValue = balance * prices.btc; + break; + case 'LTC': + usdValue = balance * prices.ltc; + break; + case 'ETH': + usdValue = balance * prices.eth; + break; + case 'USDT': + usdValue = balance; // USDT привязан к доллару + break; + case 'USDC': + usdValue = balance; // USDC привязан к доллару + break; } - - const walletUtilsInstance = new WalletUtils( - wallet.wallet_type === 'BTC' ? wallet.address : null, - wallet.wallet_type === 'LTC' ? wallet.address : null, - wallet.wallet_type === 'ETH' || wallet.wallet_type === 'USDT' || wallet.wallet_type === 'USDC' ? wallet.address : null, - null, // userId не нужен для админки - Date.now() - 30 * 24 * 60 * 60 * 1000 - ); - - const balances = await walletUtilsInstance.getAllBalances(); - const balance = balances[wallet.wallet_type] || { amount: 0, usdValue: 0 }; - + + // Форматируем дату архивации (если кошелек архивный) + let archivedDate = ''; + if (wallet.wallet_type.includes('_')) { + const timestamp = wallet.wallet_type.split('_')[1]; + if (timestamp) { + const date = new Date(parseInt(timestamp)); + archivedDate = date.toLocaleString(); + } + } + return { address: wallet.address, - balance: balance.amount.toFixed(8), - mnemonic: wallet.mnemonic + balance: balance.toFixed(8), + usdValue: usdValue.toFixed(2), + status: wallet.wallet_type.includes('_') ? 'Archived' : 'Active', + archivedDate: archivedDate }; })); - - // Убираем null значения из массива - const filteredWallets = walletsWithData.filter(wallet => wallet !== null); - + // Создаем CSV-файл const csv = csvWriter.createObjectCsvWriter({ path: `wallets_${walletType}.csv`, header: [ { id: 'address', title: 'Address' }, { id: 'balance', title: 'Balance' }, - { id: 'mnemonic', title: 'Mnemonic' } + { id: 'usdValue', title: 'Value (USD)' }, + { id: 'status', title: 'Status' }, + { id: 'archivedDate', title: 'Archived Date' } ] }); - - await csv.writeRecords(filteredWallets); - + + await csv.writeRecords(walletsWithData); + // Отправляем файл пользователю await bot.sendDocument(chatId, fs.createReadStream(`wallets_${walletType}.csv`)); - + // Удаляем временный файл fs.unlinkSync(`wallets_${walletType}.csv`); } catch (error) { diff --git a/src/models/Wallet.js b/src/models/Wallet.js index 1f8c8a6..a489b64 100644 --- a/src/models/Wallet.js +++ b/src/models/Wallet.js @@ -1,3 +1,5 @@ +// Wallet.js + import db from "../config/database.js"; import WalletUtils from "../utils/walletUtils.js"; diff --git a/src/utils/walletGenerator.js b/src/utils/walletGenerator.js index 4bccf25..172fab7 100644 --- a/src/utils/walletGenerator.js +++ b/src/utils/walletGenerator.js @@ -1,3 +1,6 @@ +// walletGenerator.js + + import bip39 from 'bip39'; import HDKey from 'hdkey'; import { publicToAddress } from 'ethereumjs-util'; diff --git a/src/utils/walletUtils.js b/src/utils/walletUtils.js index a35f70b..5c45080 100644 --- a/src/utils/walletUtils.js +++ b/src/utils/walletUtils.js @@ -76,7 +76,17 @@ export default class WalletUtils { } static getBaseWalletType(walletType) { - if (walletType.includes('ERC-20')) return 'ETH'; + // Убираем суффикс ERC-20, если он есть + if (walletType.includes('ERC-20')) { + return 'ETH'; + } + + // Убираем суффикс с таймштампом (например, USDT_1735846098129 -> USDT) + if (walletType.includes('_')) { + return walletType.split('_')[0]; + } + + // Возвращаем исходный тип, если это не ERC-20 и не архивный кошелек return walletType; }