import logging from decimal import Decimal from telegram import ParseMode from tipbot import wownero from tipbot import db from tipbot.helpers.decorators import wallet_rpc_required, log_event, registration_required @wallet_rpc_required @registration_required @log_event def withdraw(update, context): if len(context.args) < 2: update.message.reply_text('Not enough arguments passed.') return False # validate address if len(context.args[0]) in [97, 108]: address = context.args[0] else: update.message.reply_text('This does not look like a valid Wownero address. Try again.') return False # validate amount try: amount = Decimal(context.args[1]) except: update.message.reply_text(f'Bad Wownero amount specified; not a valid number.') return False if amount < 1: update.message.reply_text('Bad Wownero amount specified. Provide only positive integers or decimals greater than or equal to 1.') return False sender = db.User.get(telegram_id=update.message.from_user['id']) sender_balances = wownero.Wallet().balances(account=sender.account_index) if amount > sender_balances[1]: update.message.reply_text(f'You do not have sufficient funds to send {amount} WOW. Check your /balance') return False # transfer funds to given address try: tx = wownero.Wallet().transfer(dest_address=address, amount=wownero.as_wownero(amount), priority=2, account=sender.account_index) if 'tx_hash' in tx: h = tx['tx_hash'] msg = f'Sent {amount} WOW! TX ID: [{h}](https://wownero.xmrauctions.com/transaction/{h})' update.message.reply_text(msg, parse_mode=ParseMode.MARKDOWN_V2) else: logging.error(f'Transaction failure details for {sender.telegram_user} ({sender.telegram_id}): {tx}') update.message.reply_text(f'Failed to withdraw Wownero. Reason: "{tx["message"]}"') except Exception as e: logging.error(f'Unable to send transfer: {e}. Debug: {update.message}') update.message.reply_text('Failed to withdraw Wownero. Ask for help.')