Как не стать жертвой мошенников, которые используют flash крипту?
Написал пример такого скрипта на Python. Авторство AGN, специально для https://xss.pro/.сравнивать все переводы по смарт-контракту, у фейковых юсдт будет другой контракт. можно для этого дела написать смарт-контракт, который не даст возможности перепутать токены. а можно и скрипт на питоне, который будет наблюдать за контрактом отправителя.
pip install aiogram python-dotenv tronpy requestsИсходный код скрипта:BOT_TOKEN=ваш_telegram_бот_токен
WATCH_ADDRESS=ваш_адрес_кошелька
OFFICIAL_USDT_CONTRACT=TXLAQ63Xg1NAzckPwKHvzwE7JjRbAXkB4y
CHAT_ID=ваш_telegram_chat_id
import os
import json
import time
from dotenv import load_dotenv
from tronpy import Tron
from aiogram import Bot, Dispatcher, types
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, CallbackQuery
from aiogram.utils import executor
# Загрузка переменных из .env
load_dotenv()
# Конфиденциальные настройки
BOT_TOKEN = os.getenv("BOT_TOKEN")
WATCH_ADDRESS = os.getenv("WATCH_ADDRESS")
OFFICIAL_USDT_CONTRACT = os.getenv("OFFICIAL_USDT_CONTRACT")
CHAT_ID = os.getenv("CHAT_ID")
BLACKLIST_FILE = "blacklist.json"
# Инициализация клиентов
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot)
tron_client = Tron()
# Загрузка черного списка
try:
with open(BLACKLIST_FILE, "r") as file:
blacklist = json.load(file)
except (FileNotFoundError, json.JSONDecodeError):
blacklist = {}
def save_blacklist():
"""Сохраняет черный список в файл."""
with open(BLACKLIST_FILE, "w") as file:
json.dump(blacklist, file, indent=4)
def add_to_blacklist(address, reason):
"""Добавляет адрес в черный список."""
if address not in blacklist:
blacklist[address] = {"reason": reason, "transactions": 0, "total_amount": 0}
save_blacklist()
async def send_telegram_alert(message):
"""Отправляет уведомление в Telegram."""
await bot.send_message(CHAT_ID, message)
def get_confirmations(tx_id):
"""Возвращает количество подтверждений для транзакции."""
tx_info = tron_client.get_transaction(tx_id)
if tx_info and 'block' in tx_info:
block_number = tx_info['block']['number']
current_block = tron_client.get_block_number()
confirmations = current_block - block_number
return confirmations
return 0
async def monitor_wallet():
"""Мониторинг входящих транзакций."""
print("Запущен мониторинг транзакций...")
while True:
try:
events = tron_client.get_contract(OFFICIAL_USDT_CONTRACT).functions.Transfer()
for event in events:
if event['to'] == WATCH_ADDRESS:
tx_id = event['transaction']
sender = event['from']
amount = event['value']
print(f"Обнаружен перевод от {sender}: {amount / 10**6} USDT (TxID: {tx_id})")
# Проверка транзакции
tx_info = tron_client.get_transaction(tx_id)
if await is_valid_transaction(tx_info, sender):
await send_telegram_alert(
f"✅ Оригинальная транзакция от {sender} на сумму {amount / 10**6} USDT. "
f"Ожидание подтверждений..."
)
else:
reason = "Фейковый контракт или подозрительная активность"
add_to_blacklist(sender, reason)
await send_telegram_alert(
f"⚠️ Обнаружена фейковая транзакция от {sender}. Адрес добавлен в черный список."
)
await asyncio.sleep(10) # Пауза перед следующим циклом проверки
except Exception as e:
print(f"Ошибка мониторинга: {e}")
async def is_valid_transaction(tx_info, sender, required_confirmations=20):
"""Проверяет валидность транзакции с учетом подтверждений."""
try:
# Проверка контракта и черного списка
contract_address = tx_info['raw_data']['contract'][0]['parameter']['value']['contract_address']
if contract_address != OFFICIAL_USDT_CONTRACT:
return False
if sender in blacklist:
return False
amount = int(tx_info['raw_data']['contract'][0]['parameter']['value']['amount'])
if amount < 1 * 10**6: # Минимальная сумма в 1 USDT
return False
# Ожидание подтверждений
confirmations = get_confirmations(tx_info['txID'])
print(f"Транзакция {tx_info['txID']} имеет {confirmations} подтверждений.")
if confirmations < required_confirmations:
return False
return True
except Exception as e:
print(f"Ошибка проверки транзакции: {e}")
return False
@dp.message_handler(commands=["blacklist"])
async def show_blacklist(message: types.Message):
"""Показывает черный список в виде инлайн-меню."""
if not blacklist:
await message.reply("Черный список пуст.")
return
keyboard = InlineKeyboardMarkup()
for address in blacklist.keys():
keyboard.add(InlineKeyboardButton(text=address, callback_data=f"address:{address}"))
await message.reply("Черный список адресов:", reply_markup=keyboard)
@dp.callback_query_handler(lambda call: call.data.startswith("address:"))
async def address_details(call: CallbackQuery):
"""Показывает детали адреса."""
address = call.data.split(":")[1]
details = blacklist.get(address, {})
text = (
f"📋 **Информация об адресе**\n"
f"💳 Адрес: {address}\n"
f"🛑 Причина: {details.get('reason', 'Не указано')}\n"
f"🔄 Транзакции: {details.get('transactions', 0)}\n"
f"💰 Общая сумма: {details.get('total_amount', 0)} USDT"
)
keyboard = InlineKeyboardMarkup()
keyboard.add(InlineKeyboardButton(text="🔙 Вернуться", callback_data="back_to_list"))
await call.message.edit_text(text, reply_markup=keyboard, parse_mode="Markdown")
@dp.callback_query_handler(lambda call: call.data == "back_to_list")
async def back_to_list(call: CallbackQuery):
"""Возвращает к списку адресов."""
keyboard = InlineKeyboardMarkup()
for address in blacklist.keys():
keyboard.add(InlineKeyboardButton(text=address, callback_data=f"address:{address}"))
await call.message.edit_text("Черный список адресов:", reply_markup=keyboard)
if __name__ == "__main__":
import asyncio
loop = asyncio.get_event_loop()
loop.create_task(monitor_wallet()) # Запуск мониторинга
executor.start_polling(dp, skip_updates=True) # Запуск бота