@@ -13,29 +13,29 @@ const STOP_GAP: usize = 5;
1313const PARALLEL_REQUESTS : usize = 5 ;
1414
1515const DB_PATH : & str = "bdk-example-esplora-async.sqlite" ;
16- const NETWORK : Network = Network :: Signet ;
16+ const NETWORK : Network = Network :: Testnet ;
1717const EXTERNAL_DESC : & str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/0/*)" ;
1818const INTERNAL_DESC : & str = "wpkh(tprv8ZgxMBicQKsPdy6LMhUtFHAgpocR8GC6QmwMSFpZs7h6Eziw3SpThFfczTDh5rW2krkqffa11UpX3XkeTTB2FvzZKWXqPY54Y6Rq4AQ5R8L/84'/1'/0'/1/*)" ;
19- const ESPLORA_URL : & str = "http ://signet.bitcoindevkit.net " ;
19+ const ESPLORA_URL : & str = "https ://blockstream.info/testnet/api " ;
2020
2121#[ tokio:: main]
2222async fn main ( ) -> Result < ( ) , anyhow:: Error > {
23- let mut conn = Connection :: open ( DB_PATH ) ?;
23+ let mut db = Connection :: open ( DB_PATH ) ?;
2424 let wallet_opt = Wallet :: load ( )
2525 . descriptor ( KeychainKind :: External , Some ( EXTERNAL_DESC ) )
2626 . descriptor ( KeychainKind :: Internal , Some ( INTERNAL_DESC ) )
2727 . extract_keys ( )
2828 . check_network ( NETWORK )
29- . load_wallet ( & mut conn ) ?;
29+ . load_wallet ( & mut db ) ?;
3030 let mut wallet = match wallet_opt {
3131 Some ( wallet) => wallet,
3232 None => Wallet :: create ( EXTERNAL_DESC , INTERNAL_DESC )
3333 . network ( NETWORK )
34- . create_wallet ( & mut conn ) ?,
34+ . create_wallet ( & mut db ) ?,
3535 } ;
3636
3737 let address = wallet. next_unused_address ( KeychainKind :: External ) ;
38- wallet. persist ( & mut conn ) ?;
38+ wallet. persist ( & mut db ) ?;
3939 println ! ( "Next unused address: ({}) {address}" , address. index) ;
4040
4141 let balance = wallet. balance ( ) ;
@@ -63,7 +63,7 @@ async fn main() -> Result<(), anyhow::Error> {
6363 . await ?;
6464
6565 wallet. apply_update ( update) ?;
66- wallet. persist ( & mut conn ) ?;
66+ wallet. persist ( & mut db ) ?;
6767 println ! ( ) ;
6868
6969 let balance = wallet. balance ( ) ;
@@ -78,8 +78,15 @@ async fn main() -> Result<(), anyhow::Error> {
7878 println ! ( "Please send at least {SEND_AMOUNT} to the receiving address" ) ;
7979 std:: process:: exit ( 0 ) ;
8080 }
81+
82+ // set fee rate for inclusion in 3 blocks so we can bump it later
83+ let fee_rate_estimates = client. get_fee_estimates ( ) . await ?;
84+ let target_fee_rate =
85+ FeeRate :: from_sat_per_vb ( fee_rate_estimates. get ( & 3 ) . unwrap ( ) . round ( ) as u64 ) . unwrap ( ) ;
86+
8187 let mut tx_builder = wallet. build_tx ( ) ;
8288 tx_builder. add_recipient ( address. script_pubkey ( ) , SEND_AMOUNT ) ;
89+ tx_builder. fee_rate ( target_fee_rate) ;
8390
8491 let mut psbt = tx_builder. finish ( ) ?;
8592 let finalized = wallet. sign ( & mut psbt, SignOptions :: default ( ) ) ?;
@@ -89,7 +96,7 @@ async fn main() -> Result<(), anyhow::Error> {
8996 let tx = psbt. extract_tx ( ) ?;
9097 client. broadcast ( & tx) . await ?;
9198 let txid = tx. compute_txid ( ) ;
92- println ! ( "Tx broadcasted! Txid: {txid}" ) ;
99+ println ! ( "Tx broadcasted! Txid: https://mempool.space/testnet/tx/ {txid}" ) ;
93100
94101 println ! ( "Partial Sync..." ) ;
95102 print ! ( "SCANNING: " ) ;
@@ -109,9 +116,10 @@ async fn main() -> Result<(), anyhow::Error> {
109116 let sync_update = client. sync ( sync_request, PARALLEL_REQUESTS ) . await ?;
110117 println ! ( ) ;
111118 wallet. apply_update ( sync_update) ?;
112- wallet. persist ( & mut conn ) ?;
119+ wallet. persist ( & mut db ) ?;
113120
114- let feerate = FeeRate :: from_sat_per_kwu ( tx_feerate. to_sat_per_kwu ( ) + 250 ) ;
121+ // bump fee rate for tx by at least 1 sat per vbyte
122+ let feerate = FeeRate :: from_sat_per_vb ( tx_feerate. to_sat_per_vb_ceil ( ) + 1 ) . unwrap ( ) ;
115123 let mut builder = wallet. build_fee_bump ( txid) . expect ( "failed to bump tx" ) ;
116124 builder. fee_rate ( feerate) ;
117125 let mut bumped_psbt = builder. finish ( ) . unwrap ( ) ;
@@ -134,7 +142,10 @@ async fn main() -> Result<(), anyhow::Error> {
134142 "New fee ({new_fee}) should be higher than original ({original_fee})" ,
135143 ) ;
136144 client. broadcast ( & bumped_tx) . await ?;
137- println ! ( "Broadcasted bumped tx. Txid: {}" , bumped_tx. compute_txid( ) ) ;
145+ println ! (
146+ "Broadcasted bumped tx. Txid: https://mempool.space/testnet/tx/{}" ,
147+ bumped_tx. compute_txid( )
148+ ) ;
138149
139150 println ! ( "syncing after broadcasting bumped tx..." ) ;
140151 print ! ( "SCANNING: " ) ;
@@ -155,16 +166,8 @@ async fn main() -> Result<(), anyhow::Error> {
155166
156167 let mut evicted_txs = Vec :: new ( ) ;
157168
158- let last_seen = wallet
159- . tx_graph ( )
160- . full_txs ( )
161- . find ( |full_tx| full_tx. txid == txid)
162- . map_or ( 0 , |full_tx| full_tx. last_seen . unwrap_or ( 0 ) ) ;
163- if !evicted_txs
164- . iter ( )
165- . any ( |( evicted_txid, _) | evicted_txid == & txid)
166- {
167- evicted_txs. push ( ( txid, last_seen) ) ;
169+ for ( txid, last_seen) in & sync_update. tx_update . evicted_ats {
170+ evicted_txs. push ( ( * txid, * last_seen) ) ;
168171 }
169172
170173 if !evicted_txs. is_empty ( ) {
@@ -174,7 +177,7 @@ async fn main() -> Result<(), anyhow::Error> {
174177 }
175178
176179 wallet. apply_update ( sync_update) ?;
177- wallet. persist ( & mut conn ) ?;
180+ wallet. persist ( & mut db ) ?;
178181
179182 let balance_after_sync = wallet. balance ( ) ;
180183 println ! ( "Wallet balance after sync: {}" , balance_after_sync. total( ) ) ;
0 commit comments