@@ -4,17 +4,18 @@ use crate::logger::{
44 log_error, log_given_level, log_info, log_internal, log_trace, log_warn, FilesystemLogger ,
55 Logger ,
66} ;
7+ use crate :: { scid_utils, LdkLiteConfig } ;
78
89use lightning:: chain:: chaininterface:: { BroadcasterInterface , ConfirmationTarget , FeeEstimator } ;
910use lightning:: chain:: WatchedOutput ;
10- use lightning:: chain:: { Confirm , Filter } ;
11+ use lightning:: chain:: { Access , AccessError , Confirm , Filter } ;
1112
1213use bdk:: blockchain:: { Blockchain , EsploraBlockchain , GetBlockHash , GetHeight , GetTx } ;
1314use bdk:: database:: BatchDatabase ;
1415use bdk:: wallet:: AddressIndex ;
1516use bdk:: { SignOptions , SyncOptions } ;
1617
17- use bitcoin:: { BlockHash , Script , Transaction , Txid } ;
18+ use bitcoin:: { BlockHash , Script , Transaction , TxOut , Txid } ;
1819
1920use std:: collections:: HashSet ;
2021use std:: sync:: { Arc , Mutex } ;
3334 queued_outputs : Mutex < Vec < WatchedOutput > > ,
3435 watched_outputs : Mutex < Vec < WatchedOutput > > ,
3536 last_sync_height : Mutex < Option < u32 > > ,
37+ config : Arc < LdkLiteConfig > ,
3638 logger : Arc < FilesystemLogger > ,
3739}
3840
4143 D : BatchDatabase ,
4244{
4345 pub ( crate ) fn new (
44- blockchain : EsploraBlockchain , wallet : bdk:: Wallet < D > , logger : Arc < FilesystemLogger > ,
46+ blockchain : EsploraBlockchain , wallet : bdk:: Wallet < D > , config : Arc < LdkLiteConfig > ,
47+ logger : Arc < FilesystemLogger > ,
4548 ) -> Self {
4649 let wallet = Mutex :: new ( wallet) ;
4750 let watched_transactions = Mutex :: new ( Vec :: new ( ) ) ;
5760 queued_outputs,
5861 watched_outputs,
5962 last_sync_height,
63+ config,
6064 logger,
6165 }
6266 }
@@ -281,6 +285,44 @@ where
281285 }
282286}
283287
288+ impl < D > Access for LdkLiteChainAccess < D >
289+ where
290+ D : BatchDatabase ,
291+ {
292+ fn get_utxo (
293+ & self , genesis_hash : & BlockHash , short_channel_id : u64 ,
294+ ) -> Result < TxOut , AccessError > {
295+ if genesis_hash
296+ != & bitcoin:: blockdata:: constants:: genesis_block ( self . config . network )
297+ . header
298+ . block_hash ( )
299+ {
300+ return Err ( AccessError :: UnknownChain ) ;
301+ }
302+
303+ let block_height = scid_utils:: block_from_scid ( & short_channel_id) ;
304+ let tx_index = scid_utils:: tx_index_from_scid ( & short_channel_id) ;
305+ let vout = scid_utils:: vout_from_scid ( & short_channel_id) ;
306+
307+ let client = & * self . blockchain ;
308+ let block_hash = self
309+ . blockchain
310+ . get_block_hash ( block_height. into ( ) )
311+ . map_err ( |_| AccessError :: UnknownTx ) ?;
312+ let txid = client
313+ . get_txid_at_block_index ( & block_hash, tx_index as usize )
314+ . map_err ( |_| AccessError :: UnknownTx ) ?
315+ . ok_or ( AccessError :: UnknownTx ) ?;
316+ let tx = client
317+ . get_tx ( & txid)
318+ . map_err ( |_| AccessError :: UnknownTx ) ?
319+ . ok_or ( AccessError :: UnknownTx ) ?;
320+ let tx_out = tx. output . get ( vout as usize ) . ok_or ( AccessError :: UnknownTx ) ?;
321+
322+ Ok ( tx_out. clone ( ) )
323+ }
324+ }
325+
284326impl < D > Filter for LdkLiteChainAccess < D >
285327where
286328 D : BatchDatabase ,
0 commit comments