minor edits to aesthetics and functionality
This commit is contained in:
parent
5ae148a2ba
commit
18647091cf
@ -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) {
|
||||
|
@ -1,3 +1,5 @@
|
||||
// Wallet.js
|
||||
|
||||
import db from "../config/database.js";
|
||||
import WalletUtils from "../utils/walletUtils.js";
|
||||
|
||||
|
@ -1,3 +1,6 @@
|
||||
// walletGenerator.js
|
||||
|
||||
|
||||
import bip39 from 'bip39';
|
||||
import HDKey from 'hdkey';
|
||||
import { publicToAddress } from 'ethereumjs-util';
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user