From 70e2db708aa42add2d86c703b98ad7506d9ff0c3 Mon Sep 17 00:00:00 2001 From: yse Date: Tue, 14 May 2024 15:33:26 +0200 Subject: [PATCH] feat: add better fee estimation --- lib/core/src/model.rs | 1 + lib/core/src/persist/migrations.rs | 3 +- lib/core/src/persist/mod.rs | 13 +++++--- lib/core/src/sdk.rs | 48 +++++++++++++++++++++++------- 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/lib/core/src/model.rs b/lib/core/src/model.rs index 3f46231..68316af 100644 --- a/lib/core/src/model.rs +++ b/lib/core/src/model.rs @@ -221,6 +221,7 @@ impl From for Payment { pub(crate) struct PaymentData { pub payer_amount_sat: u64, + pub receiver_amount_sat: u64, } #[macro_export] diff --git a/lib/core/src/persist/migrations.rs b/lib/core/src/persist/migrations.rs index 541054f..a6914e2 100644 --- a/lib/core/src/persist/migrations.rs +++ b/lib/core/src/persist/migrations.rs @@ -20,7 +20,8 @@ pub(crate) fn current_migrations() -> Vec<&'static str> { ) STRICT;", "CREATE TABLE IF NOT EXISTS payment_data( id TEXT NOT NULL PRIMARY KEY, - payer_amount_sat INTEGER NOT NULL + payer_amount_sat INTEGER NOT NULL, + receiver_amount_sat INTEGER NOT NULL ) STRICT;", ] } diff --git a/lib/core/src/persist/mod.rs b/lib/core/src/persist/mod.rs index 797e111..7cd8c05 100644 --- a/lib/core/src/persist/mod.rs +++ b/lib/core/src/persist/mod.rs @@ -64,9 +64,13 @@ impl Persister { )?; if let Some((txid, payment_data)) = payment_data { tx.execute( - "INSERT INTO payment_data(id, payer_amount_sat) - VALUES(?, ?)", - (txid, payment_data.payer_amount_sat), + "INSERT INTO payment_data(id, payer_amount_sat, receiver_amount_sat) + VALUES(?, ?, ?)", + ( + txid, + payment_data.payer_amount_sat, + payment_data.receiver_amount_sat, + ), )?; } tx.commit()?; @@ -94,7 +98,7 @@ impl Persister { let mut stmt = con.prepare( " - SELECT id, payer_amount_sat + SELECT id, payer_amount_sat, receiver_amount_sat FROM payment_data ", )?; @@ -105,6 +109,7 @@ impl Persister { row.get(0)?, PaymentData { payer_amount_sat: row.get(1)?, + receiver_amount_sat: row.get(2)?, }, )) })? diff --git a/lib/core/src/sdk.rs b/lib/core/src/sdk.rs index 3798839..b29096d 100644 --- a/lib/core/src/sdk.rs +++ b/lib/core/src/sdk.rs @@ -35,7 +35,7 @@ use crate::{ /// Claim tx feerate, in sats per vbyte. /// Since the Liquid blocks are consistently empty for now, we hardcode the minimum feerate. -pub const LIQUID_CLAIM_TX_FEERATE: f32 = 0.1; +pub const LIQUID_CLAIM_TX_FEERATE_MSAT: f32 = 100.0; pub const DEFAULT_DATA_DIR: &str = ".data"; @@ -159,7 +159,16 @@ impl LiquidSdk { Ok(txid) => { let payer_amount_sat = get_invoice_amount!(ongoing_swap_out.invoice); self.persister - .resolve_ongoing_swap(id, Some((txid, PaymentData { payer_amount_sat }))) + .resolve_ongoing_swap( + id, + Some(( + txid, + PaymentData { + payer_amount_sat, + receiver_amount_sat: ongoing_swap_out.receiver_amount_sat, + }, + )), + ) .map_err(|e| anyhow!("Could not resolve swap {id}: {e}"))?; } Err(err) => { @@ -194,7 +203,7 @@ impl LiquidSdk { "Swap-in {id} has been claimed but no txid is present" )); }; - let payer_amount_sat = get_invoice_amount!(ongoing_swap_in.invoice); + let receiver_amount_sat = get_invoice_amount!(ongoing_swap_in.invoice); let keypair = self.get_submarine_keys(0)?; let swap_response: CreateSubmarineResponse = serde_json::from_str(&ongoing_swap_in.swap_response)?; @@ -221,7 +230,16 @@ impl LiquidSdk { .map_err(|e| anyhow!("Could not post claim details. Err: {e:?}"))?; self.persister - .resolve_ongoing_swap(id, Some((txid, PaymentData { payer_amount_sat }))) + .resolve_ongoing_swap( + id, + Some(( + txid, + PaymentData { + payer_amount_sat: ongoing_swap_in.payer_amount_sat, + receiver_amount_sat, + }, + )), + ) .map_err(|_| anyhow!("Could not resolve swap {id} in database"))?; Ok(()) @@ -230,7 +248,16 @@ impl LiquidSdk { warn!("Swap-in {id} has already been claimed. Resolving..."); self.persister - .resolve_ongoing_swap(id, Some((txid, PaymentData { payer_amount_sat }))) + .resolve_ongoing_swap( + id, + Some(( + txid, + PaymentData { + payer_amount_sat: ongoing_swap_in.payer_amount_sat, + receiver_amount_sat, + }, + )), + ) .map_err(|_| anyhow!("Could not resolve swap {id} in database"))?; warn!("Swap-in {id} resolved successfully"); @@ -434,7 +461,7 @@ impl LiquidSdk { Ok(lbtc_pair) } - fn broadcast_fee_estimation(&self, amount_sat: u64) -> Result { + fn get_broadcast_fee_estimation(&self, amount_sat: u64) -> Result { Ok(self .build_tx(None, &self.address()?.to_string(), amount_sat)? .all_fees() @@ -455,7 +482,7 @@ impl LiquidSdk { let client = self.boltz_client_v2(); let lbtc_pair = Self::validate_submarine_pairs(&client, receiver_amount_sat)?; - let broadcast_fees_sat = self.broadcast_fee_estimation(receiver_amount_sat)?; + let broadcast_fees_sat = self.get_broadcast_fee_estimation(receiver_amount_sat)?; Ok(PrepareSendResponse { invoice: req.invoice.clone(), @@ -581,7 +608,7 @@ impl LiquidSdk { let client = self.boltz_client_v2(); let lbtc_pair = Self::validate_submarine_pairs(&client, receiver_amount_sat)?; - let broadcast_fees_sat = self.broadcast_fee_estimation(receiver_amount_sat)?; + let broadcast_fees_sat = self.get_broadcast_fee_estimation(receiver_amount_sat)?; ensure_sdk!( req.fees_sat == lbtc_pair.fees.total(receiver_amount_sat) + broadcast_fees_sat, @@ -697,6 +724,7 @@ impl LiquidSdk { txid.clone(), PaymentData { payer_amount_sat: receiver_amount_sat + req.fees_sat, + receiver_amount_sat, }, )), )?; @@ -935,6 +963,7 @@ impl LiquidSdk { let id = tx.txid.to_string(); let data = payment_data.get(&id); let amount_sat = tx.balance.values().sum::(); + let fees_sat = data.map(|d| d.payer_amount_sat - d.receiver_amount_sat); Payment { id: Some(id.clone()), @@ -945,8 +974,7 @@ impl LiquidSdk { false => PaymentType::Sent, }, invoice: None, - fees_sat: data - .map(|d| (amount_sat.abs() - d.payer_amount_sat as i64).unsigned_abs()), + fees_sat, } }) .collect();