@@ -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 _typ e === '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 archivedDat e = '' ;
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 ) {