October 15

анти дрейн

Установить библиотеки
pip install

websocket-client
web3
requests
pytz
eth_account
mnemonic
python-dotenv

Создаем файл main.py И ВПИСЫВАЕМ ВЕСЬ КОД после просмотреть по строчно

Нужно вставить свою вебсокет РПЦ, адреса от и куда, приватник. Проверить газ( увеличение 20-30-40-50), лучше предварительно отработать на другом кошельке

from web3 import Web3 from eth_account import Account import json import time from threading import Lock

rpc_arb_ws = "СЮДА РПЦ ВЕБСОКЕТ - wss/ankr/........"

# Включаем работу с HDWallet (с осторожностью) Account.enable_unaudited_hdwallet_features()

# Подключаемся к сети через WebSocket connect = Web3(Web3.LegacyWebSocketProvider(rpc_arb_ws))

# Проверяем подключение if not connect.is_connected(): print("Не удалось подключиться к сети WebSocket RPC. Проверьте URL и интернет-соединение.") exit()

# Читаем ABI контракта with open('abi_token.json', 'r') as file: abi = json.load(file)

# Адрес контракта и адреса для транзакций xai_arb = "СЮДА АДРЕС ТОКЕНА" from_address = Web3.to_checksum_address("СЮДА С КАКОГО КОШЕЛЬКА") to_address = "НА КАКОЙ КОШЕЛЕК" private_key = "ПРИВАТНИК"

# Создаем объект контракта contract = connect.eth.contract(address=xai_arb, abi=abi)

# Лок для синхронизации доступа к nonce nonce_lock = Lock()

# Функция для получения и обновления nonce с синхронизацией def get_nonce(address): with nonce_lock: return connect.eth.get_transaction_count(address)

# Функция для отправки XAI с синхронизацией nonce def send_xai(private_key, from_address, to_address, amount): # Получаем nonce для отправки транзакции with nonce_lock: nonce = connect.eth.get_transaction_count(from_address)

try: # Увеличиваем цену газа для приоритета(в 40 раз больше) gas_price = int(connect.eth.gas_price * 40)

# Формируем транзакцию tx = contract.functions.transfer( Web3.to_checksum_address(to_address), amount ).build_transaction({ 'chainId': 42161, # Arbitrum One chain ID(У ДРУГОЙ СЕТИ ДРУГОЙ) 'gas': 300000, 'gasPrice': gas_price, 'nonce': nonce })

# Подписываем транзакцию signed_tx = connect.eth.account.sign_transaction(tx, private_key)

# Отправляем транзакцию tx_hash = connect.eth.send_raw_transaction(signed_tx.raw_transaction) print(f"Транзакция отправлена! Хеш: {connect.to_hex(tx_hash)}")

except Exception as e: # Если возникла ошибка "nonce too low", обновляем nonce print(f"Ошибка при отправке транзакции: {e}. Обновляю nonce и повторяю попытку.") nonce = connect.eth.get_transaction_count(from_address) send_xai(private_key, from_address, to_address, amount)

# Функция проверки баланса и отправки всех токенов def check_and_send_balance(): while True: try: balance = contract.functions.balanceOf(from_address).call() if balance > 1 * 10**18: # Если баланс больше 1 токена print(f"Обнаружен баланс: {balance} токенов. Отправляю все токены на {to_address}") send_xai(private_key, from_address, to_address, balance) else: print("Баланс меньше 1 токена, жду...") time.sleep(0.01) # Проверка баланса каждые 0.01 секунды except Exception as e: print(f"Ошибка при проверке баланса: {e}")

if __name__ == "__main__": check_and_send_balance()

В той же директории создать файл abi_token.json и в него вставить

[ { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "user", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "ConvertedToEsXai", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "newEsXaiAddress", "type": "address" } ], "name": "EsXaiAddressSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_SUPPLY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINTER_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "allowance", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "approve", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "burnFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "convertToEsXai", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "subtractedValue", "type": "uint256" } ], "name": "decreaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "esXaiAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "uint256", "name": "addedValue", "type": "uint256" } ], "name": "increaseAllowance", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "mint", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newEsXaiAddress", "type": "address" } ], "name": "setEsXaiAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" } ]