Implement the min/max acceptable margin checks

This commit is contained in:
Mark Veidemanis 2021-12-28 23:58:00 +00:00
parent 6743bd5106
commit 82b70991a4
Signed by: m
GPG Key ID: 5ACFCEED46C0904F
2 changed files with 56 additions and 17 deletions

View File

@ -7,20 +7,9 @@ from random import choices
from string import ascii_uppercase from string import ascii_uppercase
# Project imports # Project imports
from settings import settings
from db import r from db import r
from util import convert
def convert(data):
"""
Recursively convert a dictionary.
"""
if isinstance(data, bytes):
return data.decode("ascii")
if isinstance(data, dict):
return dict(map(convert, data.items()))
if isinstance(data, tuple):
return map(convert, data)
return data
class Transactions(object): class Transactions(object):
@ -43,7 +32,8 @@ class Transactions(object):
def transaction(self, data): def transaction(self, data):
""" """
Store details of transaction. Store details of transaction and post notifications to IRC.
Matches it up with data stored in Redis to attempt to reconcile with an Agora trade.
:param data: details of transaction :param data: details of transaction
:type data: dict :type data: dict
""" """
@ -99,7 +89,16 @@ class Transactions(object):
self.irc.client.msg(self.irc.client.channel, f"Currency mismatch, Agora: {stored_trade['currency']} / Revolut: {currency}") self.irc.client.msg(self.irc.client.channel, f"Currency mismatch, Agora: {stored_trade['currency']} / Revolut: {currency}")
return return
if not stored_trade["amount"] == amount: if not stored_trade["amount"] == amount:
self.irc.client.msg(self.irc.client.channel, f"Amount mismatch, Agora: {stored_trade['amount']} / Revolut: {amount}") # If the amount does not match exactly, get the min and max values for our given acceptable margins for trades
min_amount, max_amount = self.agora.get_acceptable_margins(currency, amount)
self.irc.client.msg(
self.irc.client.channel, f"Amount does not match exactly, trying with margins: min: {min_amount} / max: {max_amount}"
)
if not min_amount < stored_trade["amount"] < max_amount:
self.irc.client.msg(
self.irc.client.channel,
f"Amount mismatch - not in margins: {stored_trade['amount']} (min: {min_amount} / max: {max_amount}",
)
return return
if not account_type == "revolut": if not account_type == "revolut":
self.irc.client.msg(self.irc.client.channel, f"Account type is not Revolut: {account_type}") self.irc.client.msg(self.irc.client.channel, f"Account type is not Revolut: {account_type}")
@ -125,7 +124,8 @@ class Transactions(object):
self.log.info(f"Storing trade information: {str(to_store)}") self.log.info(f"Storing trade information: {str(to_store)}")
r.hmset(f"trade.{reference}", to_store) r.hmset(f"trade.{reference}", to_store)
self.irc.client.msg(self.irc.client.channel, f"Generated reference for {trade_id}: {reference}") self.irc.client.msg(self.irc.client.channel, f"Generated reference for {trade_id}: {reference}")
self.agora.agora.contact_message_post(trade_id, f"Hi! When sending the payment please user reference code: {reference}") if settings.Agora.Send == "1":
self.agora.agora.contact_message_post(trade_id, f"Hi! When sending the payment please use reference code: {reference}")
def find_tx(self, reference, amount): def find_tx(self, reference, amount):
""" """
@ -146,3 +146,29 @@ class Transactions(object):
else: else:
return "AMOUNT_INVALID" return "AMOUNT_INVALID"
return False return False
def get_refs(self):
references = []
ref_keys = r.keys("trade.*.reference")
for key in ref_keys:
references.append(r.get(key))
return convert(references)
def get_ref(self, reference):
ref_data = convert(r.hgetall(f"trade.{reference}"))
if not ref_data:
return False
return ref_data
def del_ref(self, reference):
r.delete(f"trade.{reference}")
r.delete(f"trade.{reference}.reference")
def del_tx(self, txid):
pass
def tx_to_ref(self, tx):
pass
def ref_to_tx(self, reference):
pass

13
handler/util.py Normal file
View File

@ -0,0 +1,13 @@
def convert(data):
"""
Recursively convert a dictionary.
"""
if isinstance(data, bytes):
return data.decode("ascii")
if isinstance(data, dict):
return dict(map(convert, data.items()))
if isinstance(data, tuple):
return map(convert, data)
if isinstance(data, list):
return list(map(convert, data))
return data