More logics, bug hunt

This commit is contained in:
Reckless_Satoshi 2022-01-07 11:22:07 -08:00
parent 9ab52853d5
commit b472b4928c
No known key found for this signature in database
GPG Key ID: 9C4585B561315571
4 changed files with 39 additions and 20 deletions

View File

@ -22,32 +22,36 @@ class LNNode():
return invoice, payment_hash, expires_at return invoice, payment_hash, expires_at
def validate_hodl_invoice_locked(): def validate_hodl_invoice_locked(payment_hash):
'''Generates hodl invoice to publish an order''' '''Generates hodl invoice to publish an order'''
return True return True
def validate_ln_invoice(invoice): # num_satoshis def validate_ln_invoice(invoice, num_satoshis): # num_satoshis
'''Checks if the submited LN invoice is as expected''' '''Checks if the submited LN invoice is as expected'''
valid = True valid = True
num_satoshis = 50000 # TODO decrypt and confirm sats are as expected context = None
description = 'Placeholder desc' # TODO decrypt from LN invoice description = 'Placeholder desc' # TODO decrypt from LN invoice
payment_hash = '567126' # TODO decrypt payment_hash = '567&*GIHU126' # TODO decrypt
expires_at = timezone.now() # TODO decrypt expires_at = timezone.now() # TODO decrypt
return valid, num_satoshis, description, payment_hash, expires_at return valid, context, description, payment_hash, expires_at
def pay_buyer_invoice(invoice): def pay_invoice(invoice):
'''Sends sats to buyer''' '''Sends sats to buyer, or cancelinvoices'''
return True return True
def charge_hodl_htlcs(invoice): def settle_hodl_htlcs(payment_hash):
'''Charges a LN hodl invoice''' '''Charges a LN hodl invoice'''
return True return True
def free_hodl_htlcs(invoice): def return_hodl_htlcs(payment_hash):
'''Returns sats''' '''Returns sats'''
return True return True
def double_check_htlc_is_settled(payment_hash):
''' Just as it sounds. Better safe than sorry!'''
return True

View File

@ -87,10 +87,19 @@ class Logics():
@classmethod @classmethod
def update_invoice(cls, order, user, invoice): def update_invoice(cls, order, user, invoice):
is_valid_invoice, num_satoshis, description, payment_hash, expires_at = LNNode.validate_ln_invoice(invoice)
# only user is the buyer and a valid LN invoice # only the buyer can post a buyer invoice
if not (cls.is_buyer(order, user) or is_valid_invoice): if not cls.is_buyer(order, user):
return False, {'bad_request':'Invalid Lightning Network Invoice. It starts by LNTB...'} return False, {'bad_request':'Only the buyer of this order can provide a buyer invoice.'}
if not order.taker_bond:
return False, {'bad_request':'Wait for your order to be taken.'}
if not (order.taker_bond.status == order.maker_bond.status == LNPayment.Status.LOCKED):
return False, {'bad_request':'You cannot a invoice while bonds are not posted.'}
num_satoshis = cls.buyer_invoice_amount(order, user)[1]['invoice_amount']
valid, context, description, payment_hash, expires_at = LNNode.validate_ln_invoice(invoice, num_satoshis)
if not valid:
return False, context
order.buyer_invoice, _ = LNPayment.objects.update_or_create( order.buyer_invoice, _ = LNPayment.objects.update_or_create(
concept = LNPayment.Concepts.PAYBUYER, concept = LNPayment.Concepts.PAYBUYER,
@ -150,7 +159,7 @@ class Logics():
return True, None return True, None
@classmethod @classmethod
def cancel_order(cls, order, user, state): def cancel_order(cls, order, user, state=None):
# 1) When maker cancels before bond # 1) When maker cancels before bond
'''The order never shows up on the book and order '''The order never shows up on the book and order
@ -315,8 +324,8 @@ class Logics():
@classmethod @classmethod
def confirm_fiat(cls, order, user): def confirm_fiat(cls, order, user):
''' If Order is in the CHAT states: ''' If Order is in the CHAT states:
If user is buyer: mark the FIAT SENT andettle escrow! If user is buyer: mark FIAT SENT and settle escrow!
If User is the seller and FIAT was already sent: Pay buyer invoice!''' If User is the seller and FIAT is SENT: Pay buyer invoice!'''
if order.status == Order.Status.CHA or order.status == Order.Status.FSE: # TODO Alternatively, if all collateral is locked? test out if order.status == Order.Status.CHA or order.status == Order.Status.FSE: # TODO Alternatively, if all collateral is locked? test out
@ -334,7 +343,13 @@ class Logics():
# Double check the escrow is settled. # Double check the escrow is settled.
if LNNode.double_check_htlc_is_settled(order.trade_escrow.payment_hash): if LNNode.double_check_htlc_is_settled(order.trade_escrow.payment_hash):
if cls.pay_buyer_invoice(order): # KEY LINE - PAYS THE BUYER !!
# Make sure the trade escrow is at least as big as the buyer invoice
if order.trade_escrow.num_satoshis <= order.buyer_invoice.num_satoshis:
return False, {'bad_request':'Woah, something broke badly. Report in the public channels, or open a Github Issue.'}
# Double check the trade escrow is settled
elif cls.pay_buyer_invoice(order): # KEY LINE - PAYS THE BUYER !!
order.status = Order.Status.PAY order.status = Order.Status.PAY
order.buyer_invoice.status = LNPayment.Status.PAYING order.buyer_invoice.status = LNPayment.Status.PAYING
else: else:

View File

@ -137,7 +137,7 @@ class Order(models.Model):
def __str__(self): def __str__(self):
# Make relational back to ORDER # Make relational back to ORDER
return (f'Order {self.id}: {self.Types(self.type).label} BTC for {self.amount} {self.Currencies(self.currency).label}') return (f'Order {self.id}: {self.Types(self.type).label} BTC for {float(self.amount)} {self.Currencies(self.currency).label}')
@receiver(pre_delete, sender=Order) @receiver(pre_delete, sender=Order)
def delelete_HTLCs_at_order_deletion(sender, instance, **kwargs): def delelete_HTLCs_at_order_deletion(sender, instance, **kwargs):

View File

@ -128,13 +128,13 @@ class OrderView(viewsets.ViewSet):
# If both bonds are locked, participants can see the trade in sats is also final. # If both bonds are locked, participants can see the trade in sats is also final.
if order.taker_bond: if order.taker_bond:
if order.maker_bond.status == order.taker_bond.status == order.trade_escrow.status == LNPayment.Status.LOCKED: if order.maker_bond.status == order.taker_bond.status == LNPayment.Status.LOCKED:
# Seller sees the amount he pays # Seller sees the amount he pays
if data['is_seller']: if data['is_seller']:
data['trade_satoshis'] = order.last_satoshis data['trade_satoshis'] = order.last_satoshis
# Buyer sees the amount he receives # Buyer sees the amount he receives
elif data['is_buyer']: elif data['is_buyer']:
data['trade_satoshis'] = order.last_satoshis * (1-FEE) data['trade_satoshis'] = Logics.buyer_invoice_amount(order, request.user)[1]['invoice_amount']
# 5) If status is 'waiting for maker bond' and user is MAKER, reply with a MAKER HODL invoice. # 5) If status is 'waiting for maker bond' and user is MAKER, reply with a MAKER HODL invoice.
if order.status == Order.Status.WFB and data['is_maker']: if order.status == Order.Status.WFB and data['is_maker']: