create functional commission

This commit is contained in:
NW 2025-01-25 13:33:02 +00:00
parent 5ec8267253
commit ae1cd45aea
3 changed files with 165 additions and 2 deletions

View File

@ -13,6 +13,13 @@ 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/ # Синхронизация исходного кода

View File

@ -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
}
};

View File

@ -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;
@ -252,6 +303,38 @@ export default class AdminWalletsHandler {
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;