diff --git a/VERSION.md b/VERSION.md
index b2e21b7..66f6850 100644
--- a/VERSION.md
+++ b/VERSION.md
@@ -9,10 +9,15 @@
## Current Version
-**v1.2.4** — 2026-08-05
+**v1.2.5** — 2026-08-05
## Changelog
+### v1.2.5 — 2026-08-05
+- **fix**: crypto deposit error — handleDepositInstruction/handleDepositSelectWallet use editOrSendCallback (photo-safe fallback, fixes "no text in the message to edit" 400)
+- **fix**: chat clutter — lastInlineMessageId tracked in showProducts/showProfile/showBalance/showPurchases and deleted in resetUserContext
+- **verify**: answerCallbackQuery before dispatch in all callback paths (v1.2.4)
+
### v1.2.4 — 2026-08-05
- **fix**: missing `shop_district_` / `shop_subcategory_` callback handlers — Back button in empty categories now works (handleDistrictBack)
- **fix**: state.location pipe-delimited (encodeURIComponent) — multi-word names (Saint Petersburg) no longer break navigation
diff --git a/src/admin/views/partials/app-sidebar.ejs b/src/admin/views/partials/app-sidebar.ejs
index 93bd029..2186092 100644
--- a/src/admin/views/partials/app-sidebar.ejs
+++ b/src/admin/views/partials/app-sidebar.ejs
@@ -28,7 +28,7 @@
- v1.2.4
+ v1.2.5
@@ -43,10 +43,10 @@
- Current: v1.2.4 · 2026-08-05
+ Current: v1.2.5 · 2026-08-05
-
v1.2.4 — 2026-08-05
+
v1.2.5 — 2026-08-05
- refactor Removed deposit amount-selection step; deposit_wallet_ now goes directly to Mercuryo instructions
- feat Updated Mercuryo button text to include VISA/Mastercard branding in all locales
diff --git a/src/handlers/userHandlers/userHandler.js b/src/handlers/userHandlers/userHandler.js
index 877782a..97bd7f2 100644
--- a/src/handlers/userHandlers/userHandler.js
+++ b/src/handlers/userHandlers/userHandler.js
@@ -6,6 +6,7 @@ import UserService from "../../services/userService.js";
import WalletService from "../../services/walletService.js";
import logger from "../../utils/logger.js";
import { resetUserContext } from "../../utils/messageUtils.js";
+import userStates from "../../context/userStates.js";
import { tForUser, LANGUAGE_NAMES, AVAILABLE_LANGUAGES } from '../../i18n/index.js';
export default class UserHandler {
@@ -85,10 +86,11 @@ ${t('profile.member_since')}: ${new Date(userStats.created_at).toLocaleDateStrin
]
};
- await bot.sendMessage(chatId, text, {
+ const result = await bot.sendMessage(chatId, text, {
parse_mode: 'Markdown',
reply_markup: keyboard
});
+ await userStates.set(chatId, { ...(await userStates.get(chatId) || {}), lastInlineMessageId: result.message_id });
} catch (error) {
logger.error({ err: error }, 'Error in showProfile');
await bot.sendMessage(chatId, t('profile.error_loading'));
diff --git a/src/handlers/userHandlers/userProductHandler.js b/src/handlers/userHandlers/userProductHandler.js
index ceaa591..aaade21 100644
--- a/src/handlers/userHandlers/userProductHandler.js
+++ b/src/handlers/userHandlers/userProductHandler.js
@@ -82,7 +82,8 @@ export default class UserProductHandler {
});
}
} catch (error) {
- await bot.sendMessage(chatId, message, {reply_markup: keyboard});
+ const result = await bot.sendMessage(chatId, message, {reply_markup: keyboard});
+ await userStates.set(chatId, { ...(await userStates.get(chatId) || {}), lastInlineMessageId: result.message_id });
}
} catch (error) {
logger.error({ err: error }, 'Error in showProducts');
diff --git a/src/handlers/userHandlers/userPurchaseHandler.js b/src/handlers/userHandlers/userPurchaseHandler.js
index 0fecb3f..3dab391 100644
--- a/src/handlers/userHandlers/userPurchaseHandler.js
+++ b/src/handlers/userHandlers/userPurchaseHandler.js
@@ -159,7 +159,8 @@ export default class UserPurchaseHandler {
const { text, markup } = await this.viewPurchasePage(user.id, 0, t);
- await bot.sendMessage(chatId, text, { reply_markup: markup, parse_mode: 'Markdown' });
+ const result = await bot.sendMessage(chatId, text, { reply_markup: markup, parse_mode: 'Markdown' });
+ await userStates.set(chatId, { ...(await userStates.get(chatId) || {}), lastInlineMessageId: result.message_id });
} catch (error) {
logger.error({ err: error }, 'Error in showPurchases');
const t = tForUser('en');
diff --git a/src/handlers/userHandlers/wallet/balanceHandler.js b/src/handlers/userHandlers/wallet/balanceHandler.js
index 2bab636..baf3b03 100644
--- a/src/handlers/userHandlers/wallet/balanceHandler.js
+++ b/src/handlers/userHandlers/wallet/balanceHandler.js
@@ -5,6 +5,7 @@ import WalletService from '../../../services/walletService.js';
import bot from '../../../context/bot.js';
import logger from '../../../utils/logger.js';
import { editOrSendCallback } from '../../../utils/messageUtils.js';
+import userStates from '../../../context/userStates.js';
import { tForUser } from '../../../i18n/index.js';
export default class BalanceHandler {
@@ -86,7 +87,8 @@ export default class BalanceHandler {
{ text: t('wallet.transaction_history'), callback_data: 'view_transaction_history_0' }
]);
- await bot.sendMessage(chatId, message, { reply_markup: keyboard, parse_mode: 'Markdown' });
+ const result = await bot.sendMessage(chatId, message, { reply_markup: keyboard, parse_mode: 'Markdown' });
+ await userStates.set(chatId, { ...(await userStates.get(chatId) || {}), lastInlineMessageId: result.message_id });
} catch (error) {
logger.error({ err: error }, 'Error in showBalance');
await bot.sendMessage(chatId, t('wallet.error_loading_balance'));
diff --git a/src/handlers/userHandlers/wallet/depositHandler.js b/src/handlers/userHandlers/wallet/depositHandler.js
index da11118..3475156 100644
--- a/src/handlers/userHandlers/wallet/depositHandler.js
+++ b/src/handlers/userHandlers/wallet/depositHandler.js
@@ -35,19 +35,14 @@ export default class DepositHandler {
);
if (cryptoWallets.length === 0) {
- await bot.editMessageText(
- t('wallet.no_wallets_prefix'),
- {
- chat_id: chatId,
- message_id: callbackQuery.message.message_id,
- reply_markup: {
- inline_keyboard: [
- [{ text: t('purchase.add_wallet'), callback_data: 'add_wallet' }],
- [{ text: t('wallet.back'), callback_data: 'back_to_balance' }]
- ]
- }
+ await editOrSendCallback(callbackQuery, t('wallet.no_wallets_prefix'), {
+ reply_markup: {
+ inline_keyboard: [
+ [{ text: t('purchase.add_wallet'), callback_data: 'add_wallet' }],
+ [{ text: t('wallet.back'), callback_data: 'back_to_balance' }]
+ ]
}
- );
+ });
return;
}
@@ -61,15 +56,10 @@ export default class DepositHandler {
walletButtons.push([{ text: t('wallet.back'), callback_data: 'back_to_balance' }]);
- await bot.editMessageText(
- t('wallet.deposit_select_gateway'),
- {
- chat_id: chatId,
- message_id: callbackQuery.message.message_id,
- parse_mode: 'Markdown',
- reply_markup: { inline_keyboard: walletButtons }
- }
- );
+ await editOrSendCallback(callbackQuery, t('wallet.deposit_select_gateway'), {
+ parse_mode: 'Markdown',
+ reply_markup: { inline_keyboard: walletButtons }
+ });
} catch (error) {
logger.error({ err: error }, 'Error in handleDepositSelectWallet');
await editOrSendCallback(callbackQuery, t('wallet.error_loading'));
@@ -155,9 +145,7 @@ export default class DepositHandler {
]
};
- await bot.editMessageText(message, {
- chat_id: chatId,
- message_id: callbackQuery.message.message_id,
+ await editOrSendCallback(callbackQuery, message, {
parse_mode: 'Markdown',
reply_markup: keyboard
});
diff --git a/src/utils/messageUtils.js b/src/utils/messageUtils.js
index 924800d..7efbaef 100644
--- a/src/utils/messageUtils.js
+++ b/src/utils/messageUtils.js
@@ -5,7 +5,7 @@ export async function resetUserContext(chatId) {
try {
const state = await userStates.get(chatId);
if (state) {
- const msgIds = [state.photoMessageId, state.productMessageId, state.hiddenPhotoMessageId].filter(Boolean);
+ const msgIds = [state.photoMessageId, state.productMessageId, state.hiddenPhotoMessageId, state.lastInlineMessageId].filter(Boolean);
for (const msgId of msgIds) {
try { await bot.deleteMessage(chatId, msgId); } catch (_) {}
}