dust bugfix
This commit is contained in:
67
will.py
67
will.py
@@ -28,7 +28,6 @@ _logger = get_logger(__name__)
|
||||
|
||||
|
||||
class Will:
|
||||
# return an array with the list of children
|
||||
def get_children(will, willid):
|
||||
out = []
|
||||
for _id in will:
|
||||
@@ -153,6 +152,16 @@ class Will:
|
||||
inp._TxInput__value_sats = change.value
|
||||
return inp
|
||||
|
||||
"""
|
||||
in questa situazione sono presenti due transazioni con id differente(quindi transazioni differenti)
|
||||
per prima cosa controllo il locktime
|
||||
se il locktime della nuova transazione e' maggiore del locktime della vecchia transazione, allora
|
||||
confronto gli eredi, per locktime se corrispondono controllo i willexecutor
|
||||
se hanno la stessa url ma le fee vecchie sono superiori alle fee nuove, allora anticipare.
|
||||
|
||||
|
||||
"""
|
||||
|
||||
def check_anticipate(ow: "WillItem", nw: "WillItem"):
|
||||
anticipate = Util.anticipate_locktime(ow.tx.locktime, days=1)
|
||||
if int(nw.tx.locktime) >= int(anticipate):
|
||||
@@ -256,7 +265,7 @@ class Will:
|
||||
to_append = {}
|
||||
new_inputs = Will.get_all_inputs(will, only_valid=True)
|
||||
for nid, nwi in will.items():
|
||||
if nwi.search_anticipate(new_inputs) or nwi.search_anticipate(old_inputs):
|
||||
if nwi.search_anticipate(new_inputs):
|
||||
if nid != nwi.tx.txid():
|
||||
redo = True
|
||||
to_delete.append(nid)
|
||||
@@ -266,6 +275,17 @@ class Will:
|
||||
Will.change_input(
|
||||
will, nid, i, outputs[i], new_inputs, to_delete, to_append
|
||||
)
|
||||
if nwi.search_anticipate(old_inputs):
|
||||
if nid != nwi.tx.txid():
|
||||
redo = True
|
||||
|
||||
to_delete.append(nid)
|
||||
to_append[nwi.tx.txid()] = nwi
|
||||
outputs = nwi.tx.outputs()
|
||||
for i in range(0, len(outputs)):
|
||||
Will.change_input(
|
||||
will, nid, i, outputs[i], new_inputs, to_delete, to_append
|
||||
)
|
||||
|
||||
for w in to_delete:
|
||||
try:
|
||||
@@ -275,6 +295,7 @@ class Will:
|
||||
for k, w in to_append.items():
|
||||
will[k] = w
|
||||
if redo:
|
||||
|
||||
Will.search_anticipate_rec(will, old_inputs)
|
||||
|
||||
def update_will(old_will, new_will):
|
||||
@@ -284,7 +305,6 @@ class Will:
|
||||
# check if the new input is already spent by other transaction
|
||||
# if it is use the same locktime, or anticipate.
|
||||
Will.search_anticipate_rec(new_will, all_old_inputs)
|
||||
|
||||
other_inputs = Will.get_all_inputs(old_will, {})
|
||||
try:
|
||||
Will.normalize_will(new_will, others_inputs=other_inputs)
|
||||
@@ -419,20 +439,22 @@ class Will:
|
||||
# check if transactions are stil valid tecnically valid
|
||||
def check_invalidated(willtree, utxos_list, wallet):
|
||||
for wid, w in willtree.items():
|
||||
#if not w.father:
|
||||
for inp in w.tx.inputs():
|
||||
inp_str = Util.utxo_to_str(inp)
|
||||
if not inp_str in utxos_list:
|
||||
if wallet:
|
||||
height = Will.check_tx_height(w.tx, wallet)
|
||||
if height < 0:
|
||||
Will.set_invalidate(wid, willtree)
|
||||
elif height == 0:
|
||||
w.set_status("PENDING", True)
|
||||
else:
|
||||
w.set_status("CONFIRMED", True)
|
||||
#else:
|
||||
# print("father",w.father)
|
||||
if (
|
||||
not w.father
|
||||
or willtree[w.father].get_status("CONFIRMED")
|
||||
or willtree[w.father].get_status("PENDING")
|
||||
):
|
||||
for inp in w.tx.inputs():
|
||||
inp_str = Util.utxo_to_str(inp)
|
||||
if not inp_str in utxos_list:
|
||||
if wallet:
|
||||
height = Will.check_tx_height(w.tx, wallet)
|
||||
if height < 0:
|
||||
Will.set_invalidate(wid, willtree)
|
||||
elif height == 0:
|
||||
w.set_status("PENDING", True)
|
||||
else:
|
||||
w.set_status("CONFIRMED", True)
|
||||
|
||||
def reflect_to_children(treeitem):
|
||||
if not treeitem.get_status("VALID"):
|
||||
@@ -632,7 +654,6 @@ class Will:
|
||||
|
||||
|
||||
class WillItem(Logger):
|
||||
|
||||
STATUS_DEFAULT = {
|
||||
"ANTICIPATED": ["Anticipated", False],
|
||||
"BROADCASTED": ["Broadcasted", False],
|
||||
@@ -654,15 +675,15 @@ class WillItem(Logger):
|
||||
}
|
||||
|
||||
def set_status(self, status, value=True):
|
||||
#_logger.trace(
|
||||
# _logger.trace(
|
||||
# "set status {} - {} {} -> {}".format(
|
||||
# self._id, status, self.STATUS[status][1], value
|
||||
# )
|
||||
#)
|
||||
# )
|
||||
if self.STATUS[status][1] == bool(value):
|
||||
return None
|
||||
|
||||
self.status += "." + ("NOT " if not value else "" + _(self.STATUS[status][0]))
|
||||
self.status += "." + (("NOT " if not value else "") + _(self.STATUS[status][0]))
|
||||
self.STATUS[status][1] = bool(value)
|
||||
if value:
|
||||
if status in ["INVALIDATED", "REPLACED", "CONFIRMED", "PENDING"]:
|
||||
@@ -867,3 +888,7 @@ class PercAmountException(AmountException):
|
||||
|
||||
class FixedAmountException(AmountException):
|
||||
pass
|
||||
|
||||
|
||||
def test_check_invalidated():
|
||||
Will.check_invalidated(will, utxos_list, wallet)
|
||||
|
||||
Reference in New Issue
Block a user