Log every Telegram send with a per-process id while tracing duplicate payment lines

Members are seeing payment receipts twice. This process has a durable
announce-once per on-chain event and a send-level dedupe, and neither is
firing, which says the second copy is not originating here. Rather than
keep reasoning about it, log every send with a random per-process id so
the log answers it directly: two ids means a second instance is posting,
one id twice means the dedupe key differs.

Temporary. Comes out once the source is confirmed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-18 09:55:51 -05:00
parent e43b812f97
commit 812cbd03b8
+9
View File
@@ -174,6 +174,8 @@ function sendTelegram(text, topicId, replyMarkup) {
// to the same chat twice within the window. Distinct events never collide — every line
// carries its own ids, amount and transaction hash.
const TG_RECENT = new Map();
// random per-process id: if two instances are posting, their sends carry different ids
const TG_INSTANCE = Math.random().toString(36).slice(2, 8);
const TG_DEDUPE_MS = 15 * 60 * 1000;
function tgSeenRecently(chatId, topicId, text) {
const k = String(chatId) + '|' + String(topicId || '') + '|' + text;
@@ -191,6 +193,13 @@ function sendTelegramTo(chatId, text, topicId, replyMarkup, parseMode) {
console.warn('telegram duplicate suppressed:', String(text).replace(/\s+/g, ' ').slice(0, 90));
return;
}
// TEMPORARY (2026-09-18): members are seeing payment lines twice. This process has a
// durable announce-once per on-chain event AND a send-level dedupe, and neither is firing,
// which means the second copy is not coming from here. Log every send with the instance id
// so "did WE send it twice, or is something else posting?" is answerable from the log
// instead of by deduction. Remove once the source is confirmed.
console.log('tg-send', TG_INSTANCE, 'chat=' + chatId, 'topic=' + (topicId || '-'),
JSON.stringify(String(text).replace(/\s+/g, ' ').slice(0, 70)));
// No link previews: payout/team-build posts carry Polygonscan links, and the
// preview card tripled the height of every message in the group.
const payload = { chat_id: chatId, text, disable_web_page_preview: true };