@@ -48,7 +48,7 @@ def test_withdraw(node_factory, bitcoind):
4848 wait_for (lambda : len (l1 .rpc .listfunds ()['outputs' ]) == 10 )
4949
5050 # Reach around into the db to check that outputs were added
51- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status= 0' )[0 ]['c ' ] == 10
51+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0' )[0 ]['count ' ] == 10
5252
5353 waddr = l1 .bitcoin .rpc .getnewaddress ()
5454 # Now attempt to withdraw some (making sure we collect multiple inputs)
@@ -85,29 +85,29 @@ def test_withdraw(node_factory, bitcoind):
8585 assert o ['status' ] == 'confirmed'
8686
8787 # Now make sure two of them were marked as spent
88- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status=2 ' )[0 ]['c ' ] == 2
88+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NOT NULL ' )[0 ]['count ' ] == 2
8989
9090 # Now send some money to l2.
9191 # BIP86 wallets use P2TR addresses
9292 waddr = l2 .rpc .newaddr ('p2tr' )['p2tr' ]
9393 l1 .rpc .withdraw (waddr , 2 * amount )
9494
9595 # Now make sure an additional two of them were marked as reserved
96- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status=2 ' )[0 ]['c ' ] == 2
97- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status=1 ' )[0 ]['c ' ] == 2
96+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NOT NULL ' )[0 ]['count ' ] == 2
97+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NULL AND reserved_til > 0 ' )[0 ]['count ' ] == 2
9898
9999 # They're turned into spent once the node sees them mined.
100100 bitcoind .generate_block (1 )
101101 sync_blockheight (l1 .bitcoin , [l1 , l2 ])
102102
103103 # Make sure l2 received the withdrawal.
104104 assert len (l2 .rpc .listfunds ()['outputs' ]) == 1
105- outputs = l2 .db_query ('SELECT value FROM outputs WHERE status= 0;' )
105+ outputs = l2 .db_query ('SELECT satoshis as value FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0;' )
106106 assert only_one (outputs )['value' ] == 2 * amount
107107
108108 # Now make sure an additional two of them were marked as spent
109- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status=2 ' )[0 ]['c ' ] == 4
110- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status=1 ' )[0 ]['c ' ] == 0
109+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NOT NULL ' )[0 ]['count ' ] == 4
110+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NULL AND reserved_til > 0 ' )[0 ]['count ' ] == 0
111111
112112 # Simple test for withdrawal to P2WPKH
113113 # Address from: https://bc-2.jp/tools/bech32demo/index.html
@@ -122,7 +122,7 @@ def test_withdraw(node_factory, bitcoind):
122122 bitcoind .generate_block (1 )
123123 sync_blockheight (l1 .bitcoin , [l1 ])
124124 # Now make sure additional two of them were marked as spent
125- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status=2 ' )[0 ]['c ' ] == 6
125+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NOT NULL ' )[0 ]['count ' ] == 6
126126
127127 # Simple test for withdrawal to P2WSH
128128 # Address from: https://bc-2.jp/tools/bech32demo/index.html
@@ -137,7 +137,7 @@ def test_withdraw(node_factory, bitcoind):
137137 bitcoind .generate_block (1 )
138138 sync_blockheight (l1 .bitcoin , [l1 ])
139139 # Now make sure additional two of them were marked as spent
140- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status=2 ' )[0 ]['c ' ] == 8
140+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NOT NULL ' )[0 ]['count ' ] == 8
141141
142142 # failure testing for invalid SegWit addresses, from BIP173
143143 # HRP character out of range
@@ -166,15 +166,15 @@ def test_withdraw(node_factory, bitcoind):
166166 l1 .rpc .withdraw ('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv' , 2 * amount )
167167
168168 # Should have 6 outputs available: 2 original unspent + 4 change outputs from withdrawals
169- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status= 0' )[0 ]['c ' ] == 6
169+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0' )[0 ]['count ' ] == 6
170170
171171 # Test withdrawal to self.
172172 l1 .rpc .withdraw (l1 .rpc .newaddr ('p2tr' )['p2tr' ], 'all' , minconf = 0 )
173173 bitcoind .generate_block (1 )
174- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status= 0' )[0 ]['c ' ] == 1
174+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0' )[0 ]['count ' ] == 1
175175
176176 l1 .rpc .withdraw (waddr , 'all' , minconf = 0 )
177- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status= 0' )[0 ]['c ' ] == 0
177+ assert l1 .db_query ('SELECT COUNT(*) as count FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0' )[0 ]['count ' ] == 0
178178
179179 # This should fail, can't even afford fee.
180180 with pytest .raises (RpcError , match = r'Could not afford' ):
@@ -280,7 +280,7 @@ def test_addfunds_from_block(node_factory, bitcoind):
280280
281281 wait_for (lambda : len (l1 .rpc .listfunds ()['outputs' ]) == 1 )
282282
283- outputs = l1 .db_query ('SELECT value FROM outputs WHERE status= 0;' )
283+ outputs = l1 .db_query ('SELECT satoshis as value FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0;' )
284284 assert only_one (outputs )['value' ] == 10000000
285285
286286 # The address we detect must match what was paid to.
@@ -1252,7 +1252,8 @@ def test_sign_and_send_psbt(node_factory, bitcoind, chainparams):
12521252@unittest .skipIf (TEST_NETWORK == 'liquid-regtest' , "BIP86 random_hsm not compatible with liquid-regtest bech32" )
12531253def test_txsend (node_factory , bitcoind , chainparams ):
12541254 amount = 1000000
1255- l1 = node_factory .get_node (random_hsm = True )
1255+ # Under valgrind, we can actually take 5 seconds to sign multiple inputs!
1256+ l1 = node_factory .get_node (random_hsm = True , broken_log = "That's weird: Request signpsbt took" )
12561257 addr = chainparams ['example_addr' ]
12571258
12581259 # Add some funds to withdraw later
@@ -1749,9 +1750,9 @@ def test_hsmtool_deterministic_node_ids(node_factory):
17491750 assert normal_node_id == generated_node_id , f"Node IDs don't match: { normal_node_id } != { generated_node_id } "
17501751
17511752
1752- def setup_bip86_node (node_factory , mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" ):
1753+ def setup_bip86_node (node_factory , mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" , options = None ):
17531754 """Helper function to set up a node with BIP86 support using a mnemonic-based HSM secret"""
1754- l1 = node_factory .get_node (start = False )
1755+ l1 = node_factory .get_node (start = False , options = options )
17551756
17561757 # Set up node with a mnemonic HSM secret
17571758 hsm_path = os .path .join (l1 .daemon .lightning_dir , TEST_NETWORK , "hsm_secret" )
@@ -1957,13 +1958,15 @@ def test_bip86_mnemonic_recovery(node_factory, bitcoind):
19571958 bitcoind .generate_block (1 )
19581959
19591960 # Wait for funds to be visible
1960- wait_for (lambda : len ( l1 .rpc . listfunds ()[ 'outputs' ]) > 0 )
1961+ wait_for (lambda : l1 .db_query ( 'SELECT COUNT(*) AS count FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0' )[ 0 ][ 'count' ] > 0 )
19611962
1962- # Create a second node with the same mnemonic
1963- l2 = setup_bip86_node (node_factory , mnemonic )
1963+ # We don't have a default rescan, so we need to set it to 15 to ensure the node rescans the blocks
1964+ l2 = setup_bip86_node (node_factory , mnemonic , options = {'rescan' : 15 })
1965+ l2 .stop ()
1966+ l2 .start ()
19641967
19651968 # Wait for it to sync and see the funds
1966- wait_for (lambda : len ( l2 .rpc . listfunds ()[ 'outputs' ]) > 0 )
1969+ wait_for (lambda : l2 .db_query ( 'SELECT COUNT(*) AS count FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0' )[ 0 ][ 'count' ] > 0 )
19671970
19681971 # Check that the second node can see the same funds
19691972 funds2 = l2 .rpc .listfunds ()
@@ -2521,6 +2524,7 @@ def test_hsmtool_getnodeid(node_factory):
25212524
25222525@unittest .skipIf (os .getenv ('TEST_DB_PROVIDER' , 'sqlite3' ) != 'sqlite3' , "Makes use of the sqlite3 db" )
25232526@unittest .skipIf (TEST_NETWORK != 'regtest' , "elementsd doesn't use p2tr anyway" )
2527+ @unittest .skip ("Uses obsolete db snapshot tables." )
25242528def test_onchain_missing_no_p2tr_migrate (node_factory , bitcoind ):
25252529 """l1 and l2's db is from test_closing.py::test_onchain_p2tr_missed_txs before the fix"""
25262530
@@ -2581,11 +2585,11 @@ def test_old_htlcs_cleanup(node_factory, bitcoind):
25812585
25822586 l1 .stop ()
25832587 # They're still there.
2584- assert l1 .db_query ('SELECT COUNT(*) as c FROM channel_htlcs' )[0 ]['c ' ] == 10
2588+ assert l1 .db_query ('SELECT COUNT(*) as count FROM channel_htlcs' )[0 ]['count ' ] == 10
25852589
25862590 l1 .start ()
25872591 # Now they're not
2588- assert l1 .db_query ('SELECT COUNT(*) as c FROM channel_htlcs' )[0 ]['c ' ] == 0
2592+ assert l1 .db_query ('SELECT COUNT(*) as count FROM channel_htlcs' )[0 ]['count ' ] == 0
25892593 assert l1 .rpc .listhtlcs () == {'htlcs' : []}
25902594
25912595
@@ -2657,21 +2661,19 @@ def test_unspend_during_reorg(node_factory, bitcoind):
26572661 wait_for (lambda : len (l3 .rpc .listchannels ()['channels' ]) == 2 )
26582662
26592663 # db shows it unspent.
2660- assert only_one (l1 .db_query ( f"SELECT spendheight as spendheight FROM utxoset WHERE blockheight= { blockheight } AND txindex= { txindex } " ) )['spendheight ' ] is None
2664+ assert only_one (l1 .rpc . listpeerchannels ( l2 . info [ 'id' ])[ 'channels' ] )['state ' ] == 'CHANNELD_NORMAL'
26612665
26622666 # Now, l3 sees the close, marks channel dying.
26632667 l1 .rpc .close (l2 .info ['id' ])
2664- spentheight = bitcoind .rpc .getblockcount () + 1
26652668 bitcoind .generate_block (74 , wait_for_mempool = 1 )
26662669 wait_for (lambda : len (l3 .rpc .listchannels ()['channels' ]) == 2 )
26672670
26682671 # In one fell swoop it goes through dying, to dead (12 blocks)
2669- l3 .daemon .wait_for_log (f"Adding block { spentheight } " )
26702672 l3 .daemon .wait_for_log (f"gossipd: channel { scid } closing soon due to the funding outpoint being spent" )
26712673 l3 .daemon .wait_for_log (f"gossipd: Deleting channel { scid } due to the funding outpoint being spent" )
26722674
26732675 # db shows it spent
2674- assert only_one (l3 . db_query ( f"SELECT spendheight as spendheight FROM utxoset WHERE blockheight= { blockheight } AND txindex= { txindex } " ) )['spendheight ' ] == spentheight
2676+ wait_for ( lambda : only_one (l1 . rpc . listpeerchannels ( l2 . info [ 'id' ])[ 'channels' ] )['state ' ] in [ 'CLOSINGD_COMPLETE' , 'FUNDING_SPEND_SEEN' , 'ONCHAIND_AWAITING_TX_INPUTS' , 'ONCHAIN' ])
26752677
26762678 # Restart, see replay.
26772679 l3 .stop ()
@@ -2681,11 +2683,12 @@ def test_unspend_during_reorg(node_factory, bitcoind):
26812683 l3 .start ()
26822684 # Channel should still be dead.
26832685 sync_blockheight (bitcoind , [l3 ])
2684- assert only_one (l3 .db_query ( f"SELECT spendheight as spendheight FROM utxoset WHERE blockheight= { blockheight } AND txindex= { txindex } " ))[ 'spendheight' ] == spentheight
2686+ wait_for ( lambda : len (l3 .rpc . listchannels ()[ 'channels' ]) == 0 )
26852687
26862688
26872689@unittest .skipIf (os .getenv ('TEST_DB_PROVIDER' , 'sqlite3' ) != 'sqlite3' , "Makes use of the sqlite3 db" )
26882690@unittest .skipIf (TEST_NETWORK != 'regtest' , "sqlite3 snapshot is regtest" )
2691+ @unittest .skip ("Obsolete after bwatch/our_outputs migration." )
26892692def test_rescan_missing_utxo (node_factory , bitcoind ):
26902693 """Test that node which missed a UTXO gets fixed up correctly"""
26912694 blocks = ['0000002006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f52da139a043b1ab6d83399d190c01417d4d69b5e03b3e813c0eac7a6e5b78c7d152a2969ffff7f200000000001020000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025100ffffffff0200f2052a01000000160014fcdde0698d0208be119fbd38f14407c89610f1930000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000' ,
@@ -2929,4 +2932,4 @@ def mock_fail_sendrawtx(r):
29292932 l1 .rpc .withdraw (waddr , 'all' )
29302933 bitcoind .generate_block (1 )
29312934 sync_blockheight (bitcoind , [l1 ])
2932- assert l1 .db_query ('SELECT COUNT(*) as c FROM outputs WHERE status= 0' )[0 ]['c' ] == 0
2935+ assert l1 .db_query ('SELECT COUNT(*) as c FROM our_outputs WHERE spendheight IS NULL AND reserved_til = 0' )[0 ]['c' ] == 0
0 commit comments