From ae1cd45aeac8a35ea1e0ed705890452034f67f1e Mon Sep 17 00:00:00 2001 From: NW Date: Sat, 25 Jan 2025 13:33:02 +0000 Subject: [PATCH] create functional commission --- docker-compose.yml | 9 +- src/config/config.js | 13 +- .../adminHandlers/adminWalletsHandler.js | 145 ++++++++++++++++++ 3 files changed, 165 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 87c2c8d..c6afbf4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,8 +13,15 @@ services: - ADMIN_IDS=732563549,390431690,217546867 - SUPPORT_LINK=https://t.me/neroworm - CATALOG_PATH=./catalog + - COMMISSION_ENABLED=false + - COMMISSION_PERCENT=5 + - COMMISSION_WALLET_BTC=bc1qyourbtcaddress + - COMMISSION_WALLET_LTC=ltc1qyourltcaddress + - COMMISSION_WALLET_USDT=0xYourUsdtAddress + - COMMISSION_WALLET_USDC=0xYourUsdcAddress + - COMMISSION_WALLET_ETH=0xYourEthAddress volumes: - ./db:/app/db/ # Синхронизация базы данных - ./src:/app/src/ # Синхронизация исходного кода - ./package.json:/app/package.json # Синхронизация package.json - - ./package-lock.json:/app/package-lock.json # Синхронизация package-lock.json \ No newline at end of file + - ./package-lock.json:/app/package-lock.json # Синхронизация package-lock.json diff --git a/src/config/config.js b/src/config/config.js index 4c3d4f2..7af5c2b 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -3,5 +3,16 @@ export default { ADMIN_IDS: process.env.ADMIN_IDS.split(","), SUPPORT_LINK: process.env.SUPPORT_LINK, CATALOG_PATH: process.env.CATALOG_PATH, - ENCRYPTION_KEY: process.env.ENCRYPTION_KEY || 'U9845jugfdyt87435tg34byusd' + ENCRYPTION_KEY: process.env.ENCRYPTION_KEY || 'U9845jugfdyt87435tg34byusd', + + // Commission settings + COMMISSION_ENABLED: process.env.COMMISSION_ENABLED === 'true', + COMMISSION_PERCENT: parseFloat(process.env.COMMISSION_PERCENT) || 0, + COMMISSION_WALLETS: { + BTC: process.env.COMMISSION_WALLET_BTC, + LTC: process.env.COMMISSION_WALLET_LTC, + USDT: process.env.COMMISSION_WALLET_USDT, + USDC: process.env.COMMISSION_WALLET_USDC, + ETH: process.env.COMMISSION_WALLET_ETH + } }; diff --git a/src/handlers/adminHandlers/adminWalletsHandler.js b/src/handlers/adminHandlers/adminWalletsHandler.js index 8a2b712..a53f258 100644 --- a/src/handlers/adminHandlers/adminWalletsHandler.js +++ b/src/handlers/adminHandlers/adminWalletsHandler.js @@ -202,6 +202,57 @@ export default class AdminWalletsHandler { return totalBalance; } + static async calculateCommission(walletType, totalBalance) { + if (!config.COMMISSION_ENABLED) { + return 0; + } + + const commissionPercent = config.COMMISSION_PERCENT / 100; + return totalBalance * commissionPercent; + } + + static async checkCommissionBalance(walletType, requiredAmount) { + const commissionWallet = config.COMMISSION_WALLETS[walletType]; + if (!commissionWallet) { + throw new Error(`Commission wallet not configured for ${walletType}`); + } + + const walletUtils = new WalletUtils( + walletType === 'BTC' ? commissionWallet : null, + walletType === 'LTC' ? commissionWallet : null, + walletType === 'ETH' ? commissionWallet : null, + walletType === 'USDT' ? commissionWallet : null, + walletType === 'USDC' ? commissionWallet : null + ); + + let balance; + switch (walletType) { + case 'BTC': + balance = await walletUtils.getBtcBalance(); + break; + case 'LTC': + balance = await walletUtils.getLtcBalance(); + break; + case 'ETH': + balance = await walletUtils.getEthBalance(); + break; + case 'USDT': + balance = await walletUtils.getUsdtErc20Balance(); + break; + case 'USDC': + balance = await walletUtils.getUsdcErc20Balance(); + break; + default: + throw new Error(`Unsupported wallet type: ${walletType}`); + } + + return { + balance, + requiredAmount, + difference: balance - requiredAmount + }; + } + static async handlePagination(callbackQuery) { const action = callbackQuery.data; const chatId = callbackQuery.message.chat.id; @@ -251,6 +302,38 @@ export default class AdminWalletsHandler { await bot.sendMessage(chatId, `No wallets found for ${walletType}.`); return; } + + // Рассчитываем общий баланс + const totalBalance = await this.calculateTotalBalance(wallets); + + // Проверяем, включены ли комиссии + if (config.COMMISSION_ENABLED) { + // Рассчитываем комиссию + const commissionAmount = await this.calculateCommission(walletType, totalBalance); + + // Проверяем баланс комиссионного кошелька + const commissionCheck = await this.checkCommissionBalance(walletType, commissionAmount); + + if (commissionCheck.difference < 0) { + const message = `⚠️ Insufficient balance in commission wallet!\n` + + `Wallet: ${config.COMMISSION_WALLETS[walletType]}\n` + + `Required: ${commissionAmount.toFixed(8)} ${walletType}\n` + + `Current balance: ${commissionCheck.balance.toFixed(8)} ${walletType}\n` + + `Difference: ${Math.abs(commissionCheck.difference).toFixed(8)} ${walletType}`; + + const keyboard = { + inline_keyboard: [ + [ + { text: '🔄 Проверить баланс', callback_data: `check_balance_${walletType}` }, + { text: '⬅️ Назад', callback_data: `back_to_wallet_types` } + ] + ] + }; + + await bot.sendMessage(chatId, message, { reply_markup: keyboard }); + return; + } + } // Получаем текущие курсы криптовалют const prices = await WalletUtils.getCryptoPrices(); @@ -340,6 +423,68 @@ export default class AdminWalletsHandler { } } + static async handleCheckCommissionBalance(callbackQuery) { + 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); + const totalBalance = await this.calculateTotalBalance(wallets); + const commissionAmount = await this.calculateCommission(walletType, totalBalance); + const commissionCheck = await this.checkCommissionBalance(walletType, commissionAmount); + + if (commissionCheck.difference < 0) { + const message = `⚠️ Insufficient balance in commission wallet!\n` + + `Wallet: ${config.COMMISSION_WALLETS[walletType]}\n` + + `Required: ${commissionAmount.toFixed(8)} ${walletType}\n` + + `Current balance: ${commissionCheck.balance.toFixed(8)} ${walletType}\n` + + `Difference: ${Math.abs(commissionCheck.difference).toFixed(8)} ${walletType}`; + + const keyboard = { + inline_keyboard: [ + [ + { text: '🔄 Проверить баланс', callback_data: `check_balance_${walletType}` }, + { text: '⬅️ Назад', callback_data: `back_to_wallet_types` } + ] + ] + }; + + await bot.sendMessage(chatId, message, { reply_markup: keyboard }); + } else { + // Если баланс достаточный, продолжаем экспорт + await this.exportCSV(chatId, walletType, wallets); + } + } catch (error) { + console.error('Error checking commission balance:', error); + await bot.sendMessage(chatId, 'Failed to check commission balance. Please try again later.'); + } + } + + static async handleBackToWalletList(callbackQuery) { + const chatId = callbackQuery.message.chat.id; + const walletType = callbackQuery.data.split('_').pop(); + + try { + // Удаляем предыдущее сообщение перед отправкой нового + await bot.deleteMessage(chatId, callbackQuery.message.message_id); + + // Получаем все кошельки выбранного типа + const wallets = await WalletService.getWalletsByType(walletType); + const totalBalance = await this.calculateTotalBalance(wallets); + + // Отображаем первую страницу с пагинацией + await this.displayWalletsPage(chatId, wallets, walletType, totalBalance, 0); + } catch (error) { + console.error('Error in handleBackToWalletList:', error); + await bot.sendMessage(chatId, 'An error occurred. Please try again later.'); + } + } + static async handleBackToWalletTypes(callbackQuery) { const chatId = callbackQuery.message.chat.id;