tg-bot/tipbot/commands/withdraw.py

62 lines
2.4 KiB
Python
Raw Normal View History

2020-08-06 05:52:13 +00:00
import logging
from decimal import Decimal
from tipbot import wownero
from tipbot import db
from tipbot.helpers.decorators import wallet_rpc_required, log_event, registration_required, check_debug
2020-08-06 05:52:13 +00:00
@wallet_rpc_required
@registration_required
@log_event
@check_debug
2020-08-06 05:52:13 +00:00
def withdraw(update, context):
if len(context.args) < 2:
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message('Not enough arguments passed.')
update.message.delete()
2020-08-06 05:52:13 +00:00
return False
# validate address
if len(context.args[0]) in [97, 108]:
address = context.args[0]
else:
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message('This does not look like a valid Wownero address. Try again.')
update.message.delete()
2020-08-06 05:52:13 +00:00
return False
# validate amount
try:
amount = Decimal(context.args[1])
except:
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message(f'Bad Wownero amount specified; not a valid number.')
update.message.delete()
2020-08-06 05:52:13 +00:00
return False
if amount < 1:
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message('Bad Wownero amount specified. Provide only positive integers or decimals greater than or equal to 1.')
update.message.delete()
2020-08-06 05:52:13 +00:00
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]:
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message(f'You do not have sufficient funds to withdraw {amount} WOW. Check your /balance')
update.message.delete()
2020-08-06 05:52:13 +00:00
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']
2020-08-07 14:46:36 +00:00
msg = f'Sent {amount} WOW! Tx: {h}'
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message(msg)
update.message.delete()
2020-08-06 05:52:13 +00:00
else:
logging.error(f'Transaction failure details for {sender.telegram_user} ({sender.telegram_id}): {tx}')
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message(f'Failed to withdraw Wownero. Reason: "{tx["message"]}"')
update.message.delete()
2020-08-06 05:52:13 +00:00
except Exception as e:
2020-08-09 07:55:42 +00:00
logging.error(f'Unable to withdraw transfer: {e}. Debug: {update.message}')
2021-05-10 04:40:42 +00:00
update.message.from_user.send_message('Failed to withdraw Wownero. Ask for help.')
update.message.delete()