Skip to content

Commit 9d8861d

Browse files
authored
Merge pull request #16 from Merkleize/fix-wait_for_spend
Fix behavior of wait_for_spend so it tracks known StandardP2TR outputs
2 parents 677035f + cea56fd commit 9d8861d

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

matt/manager.py

+17-16
Original file line numberDiff line numberDiff line change
@@ -599,28 +599,29 @@ def wait_for_spend(self, instances: Union[ContractInstance, List[ContractInstanc
599599
out_contract = clause_output.next_contract
600600
new_instance = ContractInstance(out_contract)
601601

602-
if isinstance(out_contract, (P2TR, OpaqueP2TR, StandardP2TR)):
603-
continue # nothing to do, will not track this output
604-
elif isinstance(out_contract, StandardAugmentedP2TR):
605-
if clause_output.next_state is None:
606-
raise ValueError("Missing data for augmented output")
607-
new_instance.data = clause_output.next_state.encode()
608-
new_instance.data_expanded = clause_output.next_state
609-
else:
610-
raise ValueError("Unsupported contract type")
602+
if isinstance(out_contract, (StandardP2TR, StandardAugmentedP2TR)):
603+
if isinstance(out_contract, StandardAugmentedP2TR):
604+
if clause_output.next_state is None:
605+
raise ValueError("Missing data for augmented output")
606+
new_instance.data = clause_output.next_state.encode()
607+
new_instance.data_expanded = clause_output.next_state
611608

612-
new_instance.last_height = instance.last_height
609+
new_instance.last_height = instance.last_height
613610

614-
new_instance.outpoint = COutPoint(int(tx.hash, 16), output_index)
615-
new_instance.funding_tx = tx
616-
new_instance.status = ContractInstanceStatus.FUNDED
611+
new_instance.outpoint = COutPoint(int(tx.hash, 16), output_index)
612+
new_instance.funding_tx = tx
613+
new_instance.status = ContractInstanceStatus.FUNDED
617614

618-
out_contracts[output_index] = new_instance
615+
out_contracts[output_index] = new_instance
619616

620-
next_instances.append(new_instance)
617+
next_instances.append(new_instance)
618+
elif isinstance(out_contract, (P2TR, OpaqueP2TR)):
619+
continue # nothing to do, will not track this output
620+
else:
621+
raise ValueError("Unsupported contract type")
621622
instance.next = next_instances
622623

623-
result = list(out_contracts.values())
624+
result = [out_contracts[idx] for idx in sorted(out_contracts.keys())]
624625
for instance in result:
625626
self.add_instance(instance)
626627
return result

tests/test_vault.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Tuple
22
import pytest
33

4-
from examples.vault.vault_contracts import Vault
4+
from examples.vault.vault_contracts import Vault, Unvaulting
55

66
from matt.btctools import key
77
from matt.btctools.auth_proxy import AuthServiceProxy, JSONRPCException
@@ -183,7 +183,12 @@ def test_vault_trigger_with_revault_and_withdraw(vault_specs: VaultSpecs, rpc: A
183183
{**args, "sig": sigs[i]}
184184
))
185185

186-
[U_inst] = manager.spend_and_wait([V_inst_1, V_inst_2, V_inst_3], spend_tx)
186+
[U_inst, V_revault_inst] = manager.spend_and_wait([V_inst_1, V_inst_2, V_inst_3], spend_tx)
187+
188+
assert isinstance(U_inst.contract, Unvaulting)
189+
assert isinstance(V_revault_inst.contract, Vault)
190+
assert manager.instances.index(U_inst) >= 0
191+
assert manager.instances.index(V_revault_inst) >= 0
187192

188193
report.write(vault_description, format_tx_markdown(spend_tx, "Trigger (with revault) [3 vault inputs]"))
189194

0 commit comments

Comments
 (0)