Implement the min/max acceptable margin checks
This commit is contained in:
parent
6743bd5106
commit
82b70991a4
|
@ -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,8 +89,17 @@ 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
|
||||||
return
|
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
|
||||||
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}")
|
||||||
return
|
return
|
||||||
|
@ -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
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue