11
11
12
12
use std:: convert:: TryInto ;
13
13
use std:: io:: { Error , ErrorKind } ;
14
+ use std:: str:: FromStr ;
14
15
use std:: sync:: Arc ;
15
16
use tokio:: sync:: Mutex ;
16
17
17
18
use bitcoin:: base64;
18
19
use bitcoin:: hash_types:: { BlockHash , Txid } ;
19
20
use bitcoin:: hashes:: hex:: ToHex ;
21
+ use bitcoin:: network:: constants:: Network ;
20
22
use bitcoin:: { Block , Transaction } ;
21
23
use lightning:: util:: ser:: Writeable ;
22
24
use lightning_block_sync:: http:: { HttpEndpoint , JsonResponse } ;
@@ -91,14 +93,19 @@ impl<'a> BitcoindClient<'a> {
91
93
} ;
92
94
93
95
// Test that bitcoind is reachable.
94
- let btc_network = client. get_chain ( ) . await ?;
96
+ let ( btc_network, ibd ) = client. get_chain ( ) . await ?;
95
97
96
- // Assert teos runs on the same chain/network as bitcoind.
97
98
if btc_network != teos_network {
99
+ // Assert teos runs on the same chain/network as bitcoind.
98
100
Err ( Error :: new (
99
101
ErrorKind :: InvalidInput ,
100
102
format ! ( "bitcoind is running on {btc_network} but teosd is set to run on {teos_network}" ) ,
101
103
) )
104
+ } else if ibd && Network :: from_str ( & btc_network) . unwrap ( ) != Network :: Regtest {
105
+ Err ( Error :: new (
106
+ ErrorKind :: Interrupted ,
107
+ "bitcoind is still doing IDB, start the tower once it has finished" ,
108
+ ) )
102
109
} else {
103
110
Ok ( client)
104
111
}
@@ -138,14 +145,17 @@ impl<'a> BitcoindClient<'a> {
138
145
. await
139
146
}
140
147
141
- /// Gets bitcoind's network.
142
- pub async fn get_chain ( & self ) -> std:: io:: Result < String > {
148
+ /// Gets the chain we are running in and whether or not we're on IBD
149
+ pub async fn get_chain ( & self ) -> std:: io:: Result < ( String , bool ) > {
143
150
// A wrapper type to extract "chain" key from getblockchaininfo JsonResponse.
144
- struct BtcNetwork ( String ) ;
151
+ struct BtcNetwork ( String , bool ) ;
145
152
impl TryInto < BtcNetwork > for JsonResponse {
146
153
type Error = std:: io:: Error ;
147
154
fn try_into ( self ) -> std:: io:: Result < BtcNetwork > {
148
- Ok ( BtcNetwork ( self . 0 [ "chain" ] . as_str ( ) . unwrap ( ) . to_string ( ) ) )
155
+ Ok ( BtcNetwork (
156
+ self . 0 [ "chain" ] . as_str ( ) . unwrap ( ) . to_string ( ) ,
157
+ self . 0 [ "initialblockdownload" ] . as_bool ( ) . unwrap ( ) ,
158
+ ) )
149
159
}
150
160
}
151
161
@@ -155,6 +165,6 @@ impl<'a> BitcoindClient<'a> {
155
165
. call_method :: < BtcNetwork > ( "getblockchaininfo" , & [ ] )
156
166
. await ?;
157
167
158
- Ok ( btc_network. 0 )
168
+ Ok ( ( btc_network. 0 , btc_network . 1 ) )
159
169
}
160
170
}
0 commit comments