create functional commission
This commit is contained in:
parent
5ec8267253
commit
ae1cd45aea
@ -13,8 +13,15 @@ services:
|
|||||||
- ADMIN_IDS=732563549,390431690,217546867
|
- ADMIN_IDS=732563549,390431690,217546867
|
||||||
- SUPPORT_LINK=https://t.me/neroworm
|
- SUPPORT_LINK=https://t.me/neroworm
|
||||||
- CATALOG_PATH=./catalog
|
- 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:
|
volumes:
|
||||||
- ./db:/app/db/ # Синхронизация базы данных
|
- ./db:/app/db/ # Синхронизация базы данных
|
||||||
- ./src:/app/src/ # Синхронизация исходного кода
|
- ./src:/app/src/ # Синхронизация исходного кода
|
||||||
- ./package.json:/app/package.json # Синхронизация package.json
|
- ./package.json:/app/package.json # Синхронизация package.json
|
||||||
- ./package-lock.json:/app/package-lock.json # Синхронизация package-lock.json
|
- ./package-lock.json:/app/package-lock.json # Синхронизация package-lock.json
|
||||||
|
@ -3,5 +3,16 @@ export default {
|
|||||||
ADMIN_IDS: process.env.ADMIN_IDS.split(","),
|
ADMIN_IDS: process.env.ADMIN_IDS.split(","),
|
||||||
SUPPORT_LINK: process.env.SUPPORT_LINK,
|
SUPPORT_LINK: process.env.SUPPORT_LINK,
|
||||||
CATALOG_PATH: process.env.CATALOG_PATH,
|
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;
|
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) {
|
static async handlePagination(callbackQuery) {
|
||||||
const action = callbackQuery.data;
|
const action = callbackQuery.data;
|
||||||
const chatId = callbackQuery.message.chat.id;
|
const chatId = callbackQuery.message.chat.id;
|
||||||
@ -251,6 +302,38 @@ export default class AdminWalletsHandler {
|
|||||||
await bot.sendMessage(chatId, `No wallets found for ${walletType}.`);
|
await bot.sendMessage(chatId, `No wallets found for ${walletType}.`);
|
||||||
return;
|
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();
|
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) {
|
static async handleBackToWalletTypes(callbackQuery) {
|
||||||
const chatId = callbackQuery.message.chat.id;
|
const chatId = callbackQuery.message.chat.id;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user