You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

147 lines
4.7 KiB

from datetime import datetime
from uuid import uuid4
from monero.address import address
from sqlalchemy import Column, Integer, BigInteger, DateTime, String
from sqlalchemy.sql import func
from app.factory import db
from app.library.crypto import monero, wownero
from app import config
def rand_id():
return uuid4().hex
class Swap(db.Model):
__tablename__ = 'swaps'
# Meta
id = db.Column(db.String(80), primary_key=True, default=rand_id)
date = db.Column(db.DateTime, server_default=func.now())
wow_to_xmr = db.Column(db.Boolean)
wow_price_ausd = db.Column(db.Integer)
xmr_price_ausd = db.Column(db.Integer)
swap_address = db.Column(db.String(150), unique=True)
swap_address_index = db.Column(db.Integer, unique=True)
return_wow_address = db.Column(db.String(150))
return_xmr_address = db.Column(db.String(150))
completed = db.Column(db.Boolean, default=False)
completed_date = db.Column(db.DateTime, nullable=True)
# Receive details
receive_amount_atomic = db.Column(db.BigInteger)
funds_received = db.Column(db.Boolean, default=False)
receive_tx_id = db.Column(db.String(150), nullable=True)
# Send details
fee_amount_atomic = db.Column(db.BigInteger)
send_amount_atomic = db.Column(db.BigInteger)
send_tx_id = db.Column(db.String(150), nullable=True)
funds_sent = db.Column(db.Boolean, default=False)
def __repr__(self):
return self.id
def show_details(self):
if self.wow_to_xmr:
r = wownero
s = monero
r_unit = 'WOW'
s_unit = 'XMR'
else:
r = monero
s = wownero
r_unit = 'XMR'
s_unit = 'WOW'
receive_amount = r.as_real(r.from_atomic(self.receive_amount_atomic))
send_amount = s.as_real(s.from_atomic(self.send_amount_atomic))
return {
'id': self.id,
'date': self.date,
'wow_to_xmr': self.wow_to_xmr,
'wow_price_ausd': self.wow_price_ausd,
'xmr_price_ausd': self.xmr_price_ausd,
'swap_address': self.swap_address,
'swap_address_index': self.swap_address_index,
'return_wow_address': self.return_wow_address,
'return_xmr_address': self.return_xmr_address,
'completed': self.completed,
'completed_date': self.completed_date,
'receive_amount_atomic': self.receive_amount_atomic,
'funds_received': self.funds_received,
'receive_tx_id': self.receive_tx_id,
'fee_amount_atomic': self.fee_amount_atomic,
'send_amount_atomic': self.send_amount_atomic,
'send_tx_id': self.send_tx_id,
'funds_sent': self.funds_sent,
'receive': f'{receive_amount} {r_unit}',
'send': f'{send_amount} {s_unit}',
'fee': f'{s.as_real(s.from_atomic(self.fee_amount_atomic))} {s_unit}',
'hours_completed': self.hours_elapsed(since_completed=True),
'hours_active': self.hours_elapsed(),
'receive_unit': r_unit,
'send_unit': s_unit
}
def hours_elapsed(self, since_completed=False):
now = datetime.utcnow()
if since_completed:
if self.completed_date:
diff = now - self.completed_date
else:
return 0
else:
diff = now - self.date
return diff.total_seconds() / 60 / 60
def days_completed(self):
if self.completed_date:
now = datetime.now()
diff = now - self.completed_date
return diff.days
else:
return 0
def receive_coin(self):
if self.wow_to_xmr:
return 'wow'
else:
return 'xmr'
def send_coin(self):
if self.wow_to_xmr:
return 'xmr'
else:
return 'wow'
def to_ausd(self, amount):
return int(amount * 1000000)
def from_ausd(self, amount):
return amount / 1000000
def validate_swap_worth(self, worth):
worth_ausd = self.to_ausd(worth)
min = self.to_ausd(config.SWAP_MIN_USD)
max = self.to_ausd(config.SWAP_MAX_USD)
if worth_ausd < min:
return (False, 'Too low')
elif worth_ausd > max:
return (False, 'Too high')
else:
return (True, '')
def validate_wow_address(self, wow_address):
# lol yolo
if len(wow_address) != 97:
return False
else:
return True
def validate_xmr_address(self, xmr_address):
try:
address(xmr_address)
return True
except:
return False