@@ -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:: sync:: { Arc , Mutex } ;
2021
2930 queued_outputs : Mutex < Vec < WatchedOutput > > ,
3031 watched_outputs : Mutex < Vec < WatchedOutput > > ,
3132 last_sync_height : Mutex < Option < u32 > > ,
33+ config : Arc < LdkLiteConfig > ,
3234 logger : Arc < FilesystemLogger > ,
3335}
3436
3739 D : BatchDatabase ,
3840{
3941 pub ( crate ) fn new (
40- blockchain : EsploraBlockchain , wallet : bdk:: Wallet < D > , logger : Arc < FilesystemLogger > ,
42+ blockchain : EsploraBlockchain , wallet : bdk:: Wallet < D > , config : Arc < LdkLiteConfig > ,
43+ logger : Arc < FilesystemLogger > ,
4144 ) -> Self {
4245 let wallet = Mutex :: new ( wallet) ;
4346 let watched_transactions = Mutex :: new ( Vec :: new ( ) ) ;
5356 queued_outputs,
5457 watched_outputs,
5558 last_sync_height,
59+ config,
5660 logger,
5761 }
5862 }
@@ -275,6 +279,44 @@ where
275279 }
276280}
277281
282+ impl < D > Access for LdkLiteChainAccess < D >
283+ where
284+ D : BatchDatabase ,
285+ {
286+ fn get_utxo (
287+ & self , genesis_hash : & BlockHash , short_channel_id : u64 ,
288+ ) -> Result < TxOut , AccessError > {
289+ if genesis_hash
290+ != & bitcoin:: blockdata:: constants:: genesis_block ( self . config . network )
291+ . header
292+ . block_hash ( )
293+ {
294+ return Err ( AccessError :: UnknownChain ) ;
295+ }
296+
297+ let block_height = scid_utils:: block_from_scid ( & short_channel_id) ;
298+ let tx_index = scid_utils:: tx_index_from_scid ( & short_channel_id) ;
299+ let vout = scid_utils:: vout_from_scid ( & short_channel_id) ;
300+
301+ let client = & * self . blockchain ;
302+ let block_hash = self
303+ . blockchain
304+ . get_block_hash ( block_height. into ( ) )
305+ . map_err ( |_| AccessError :: UnknownTx ) ?;
306+ let txid = client
307+ . get_txid_at_block_index ( & block_hash, tx_index as usize )
308+ . map_err ( |_| AccessError :: UnknownTx ) ?
309+ . ok_or ( AccessError :: UnknownTx ) ?;
310+ let tx = client
311+ . get_tx ( & txid)
312+ . map_err ( |_| AccessError :: UnknownTx ) ?
313+ . ok_or ( AccessError :: UnknownTx ) ?;
314+ let tx_out = tx. output . get ( vout as usize ) . ok_or ( AccessError :: UnknownTx ) ?;
315+
316+ Ok ( tx_out. clone ( ) )
317+ }
318+ }
319+
278320impl < D > Filter for LdkLiteChainAccess < D >
279321where
280322 D : BatchDatabase ,
0 commit comments