create functional commission
This commit is contained in:
parent
5ec8267253
commit
ae1cd45aea
@ -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/ # Синхронизация исходного кода
|
||||
|
@ -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
|
||||
}
|
||||
};
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user