mirror of
https://github.com/aljazceru/breez-sdk-liquid.git
synced 2026-02-23 15:04:22 +01:00
feat: add better fee estimation
This commit is contained in:
@@ -221,6 +221,7 @@ impl From<OngoingSwap> for Payment {
|
||||
|
||||
pub(crate) struct PaymentData {
|
||||
pub payer_amount_sat: u64,
|
||||
pub receiver_amount_sat: u64,
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
|
||||
@@ -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;",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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)?,
|
||||
},
|
||||
))
|
||||
})?
|
||||
|
||||
@@ -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<u64> {
|
||||
fn get_broadcast_fee_estimation(&self, amount_sat: u64) -> Result<u64> {
|
||||
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::<i64>();
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user