From 080698c2d1afad98163fdae3c728106709b6ca30 Mon Sep 17 00:00:00 2001 From: ok300 <106775972+ok300@users.noreply.github.com> Date: Thu, 2 May 2024 06:00:56 +0000 Subject: [PATCH] Update receive to support only payer amount (#131) --- cli/src/commands.rs | 12 ++--- lib/ls-sdk-bindings/src/breez_liquid_sdk.udl | 3 +- lib/ls-sdk-core/src/model.rs | 3 +- lib/ls-sdk-core/src/wallet.rs | 47 +++++-------------- .../java/com/lssdk/LiquidSwapSDKMapper.kt | 27 ++--------- .../ios/LiquidSwapSDKMapper.swift | 22 ++------- lib/ls-sdk-react-native/src/index.ts | 3 +- 7 files changed, 27 insertions(+), 90 deletions(-) diff --git a/cli/src/commands.rs b/cli/src/commands.rs index 567a23529..aad4fe88b 100644 --- a/cli/src/commands.rs +++ b/cli/src/commands.rs @@ -30,8 +30,8 @@ pub(crate) enum Command { }, /// Receive lbtc and send btc through a swap ReceivePayment { - /// Amount of funds to receive, in satoshi - amount_sat: u64, + /// Amount the payer will send, in satoshi + payer_amount_sat: u64, }, /// List incoming and outgoing payments ListPayments, @@ -94,11 +94,9 @@ pub(crate) fn handle_command( command: Command, ) -> Result { Ok(match command { - Command::ReceivePayment { amount_sat } => { - let prepare_response = wallet.prepare_receive_payment(&PrepareReceiveRequest { - payer_amount_sat: Some(amount_sat), - receiver_amount_sat: None, - })?; + Command::ReceivePayment { payer_amount_sat } => { + let prepare_response = + wallet.prepare_receive_payment(&PrepareReceiveRequest { payer_amount_sat })?; wait_confirmation!( format!( diff --git a/lib/ls-sdk-bindings/src/breez_liquid_sdk.udl b/lib/ls-sdk-bindings/src/breez_liquid_sdk.udl index 9dc3fe78f..de247731c 100644 --- a/lib/ls-sdk-bindings/src/breez_liquid_sdk.udl +++ b/lib/ls-sdk-bindings/src/breez_liquid_sdk.udl @@ -41,8 +41,7 @@ dictionary SendPaymentResponse { }; dictionary PrepareReceiveRequest { - u64? payer_amount_sat; - u64? receiver_amount_sat; + u64 payer_amount_sat; }; dictionary PrepareReceiveResponse { diff --git a/lib/ls-sdk-core/src/model.rs b/lib/ls-sdk-core/src/model.rs index 89b2de828..44919705f 100644 --- a/lib/ls-sdk-core/src/model.rs +++ b/lib/ls-sdk-core/src/model.rs @@ -61,8 +61,7 @@ impl WalletOptions { #[derive(Debug, Serialize)] pub struct PrepareReceiveRequest { - pub payer_amount_sat: Option, - pub receiver_amount_sat: Option, + pub payer_amount_sat: u64, } #[derive(Debug, Serialize)] diff --git a/lib/ls-sdk-core/src/wallet.rs b/lib/ls-sdk-core/src/wallet.rs index 1d38e72ca..a0edfe67e 100644 --- a/lib/ls-sdk-core/src/wallet.rs +++ b/lib/ls-sdk-core/src/wallet.rs @@ -425,53 +425,28 @@ impl Wallet { .get_lbtc_pair() .ok_or(PaymentError::PairsNotFound)?; - let (receiver_amount_sat, payer_amount_sat) = - match (req.receiver_amount_sat, req.payer_amount_sat) { - (Some(receiver_amount_sat), None) => { - let fees_lockup = lbtc_pair.fees.reverse_lockup(); - let fees_claim = lbtc_pair.fees.reverse_claim_estimate(); - let p = lbtc_pair.fees.percentage; - - let temp_recv_amt = receiver_amount_sat; - let invoice_amt_minus_service_fee = temp_recv_amt + fees_lockup + fees_claim; - let payer_amount_sat = - (invoice_amt_minus_service_fee as f64 * 100.0 / (100.0 - p)).ceil() as u64; - - Ok((receiver_amount_sat, payer_amount_sat)) - } - (None, Some(payer_amount_sat)) => { - let fees_boltz = lbtc_pair.fees.reverse_boltz(payer_amount_sat); - let fees_lockup = lbtc_pair.fees.reverse_lockup(); - let fees_claim = lbtc_pair.fees.reverse_claim_estimate(); - let fees_total = fees_boltz + fees_lockup + fees_claim; - - ensure_sdk!( - payer_amount_sat > fees_total, - PaymentError::AmountOutOfRange - ); - - Ok((payer_amount_sat - fees_total, payer_amount_sat)) - } - (None, None) => Err(PaymentError::AmountOutOfRange), + let payer_amount_sat = req.payer_amount_sat; + let fees_boltz = lbtc_pair.fees.reverse_boltz(payer_amount_sat); + let fees_lockup = lbtc_pair.fees.reverse_lockup(); + let fees_claim = lbtc_pair.fees.reverse_claim_estimate(); + let fees_total = fees_boltz + fees_lockup + fees_claim; - // TODO The request should not allow setting both invoice and onchain amounts, so this case shouldn't be possible. - // See example of how it's done in the SDK. - _ => Err(PaymentError::Generic { - err: "Both invoice and onchain amounts were specified".into(), - }), - }?; + ensure_sdk!( + payer_amount_sat > fees_total, + PaymentError::AmountOutOfRange + ); lbtc_pair .limits .within(payer_amount_sat) .map_err(|_| PaymentError::AmountOutOfRange)?; - debug!("Creating reverse swap with: receiver_amount_sat {receiver_amount_sat} sat, payer_amount_sat {payer_amount_sat} sat"); + debug!("Creating reverse swap with: payer_amount_sat {payer_amount_sat} sat, fees_total {fees_total} sat"); Ok(PrepareReceiveResponse { pair_hash: lbtc_pair.hash, payer_amount_sat, - fees_sat: payer_amount_sat - receiver_amount_sat, + fees_sat: fees_total, }) } diff --git a/lib/ls-sdk-react-native/android/src/main/java/com/lssdk/LiquidSwapSDKMapper.kt b/lib/ls-sdk-react-native/android/src/main/java/com/lssdk/LiquidSwapSDKMapper.kt index 315549601..e16efd086 100644 --- a/lib/ls-sdk-react-native/android/src/main/java/com/lssdk/LiquidSwapSDKMapper.kt +++ b/lib/ls-sdk-react-native/android/src/main/java/com/lssdk/LiquidSwapSDKMapper.kt @@ -6,41 +6,22 @@ import java.util.* fun asPrepareReceiveRequest(prepareReceiveRequest: ReadableMap): PrepareReceiveRequest? { if (!validateMandatoryFields( prepareReceiveRequest, - arrayOf(), + arrayOf( + "payerAmountSat", + ), ) ) { return null } - val payerAmountSat = - if (hasNonNullKey( - prepareReceiveRequest, - "payerAmountSat", - ) - ) { - prepareReceiveRequest.getDouble("payerAmountSat").toULong() - } else { - null - } - val receiverAmountSat = - if (hasNonNullKey( - prepareReceiveRequest, - "receiverAmountSat", - ) - ) { - prepareReceiveRequest.getDouble("receiverAmountSat").toULong() - } else { - null - } + val payerAmountSat = prepareReceiveRequest.getDouble("payerAmountSat").toULong() return PrepareReceiveRequest( payerAmountSat, - receiverAmountSat, ) } fun readableMapOf(prepareReceiveRequest: PrepareReceiveRequest): ReadableMap { return readableMapOf( "payerAmountSat" to prepareReceiveRequest.payerAmountSat, - "receiverAmountSat" to prepareReceiveRequest.receiverAmountSat, ) } diff --git a/lib/ls-sdk-react-native/ios/LiquidSwapSDKMapper.swift b/lib/ls-sdk-react-native/ios/LiquidSwapSDKMapper.swift index 86f4c8cb6..8971a2977 100644 --- a/lib/ls-sdk-react-native/ios/LiquidSwapSDKMapper.swift +++ b/lib/ls-sdk-react-native/ios/LiquidSwapSDKMapper.swift @@ -3,31 +3,17 @@ import LiquidSwapSDK enum LiquidSwapSDKMapper { static func asPrepareReceiveRequest(prepareReceiveRequest: [String: Any?]) throws -> PrepareReceiveRequest { - var payerAmountSat: UInt64? - if hasNonNilKey(data: prepareReceiveRequest, key: "payerAmountSat") { - guard let payerAmountSatTmp = prepareReceiveRequest["payerAmountSat"] as? UInt64 else { - throw LsSdkError.Generic(message: errUnexpectedValue(fieldName: "payerAmountSat")) - } - payerAmountSat = payerAmountSatTmp - } - var receiverAmountSat: UInt64? - if hasNonNilKey(data: prepareReceiveRequest, key: "receiverAmountSat") { - guard let receiverAmountSatTmp = prepareReceiveRequest["receiverAmountSat"] as? UInt64 else { - throw LsSdkError.Generic(message: errUnexpectedValue(fieldName: "receiverAmountSat")) - } - receiverAmountSat = receiverAmountSatTmp + guard let payerAmountSat = prepareReceiveRequest["payerAmountSat"] as? UInt64 else { + throw LsSdkError.Generic(message: errMissingMandatoryField(fieldName: "payerAmountSat", typeName: "PrepareReceiveRequest")) } return PrepareReceiveRequest( - payerAmountSat: payerAmountSat, - receiverAmountSat: receiverAmountSat - ) + payerAmountSat: payerAmountSat) } static func dictionaryOf(prepareReceiveRequest: PrepareReceiveRequest) -> [String: Any?] { return [ - "payerAmountSat": prepareReceiveRequest.payerAmountSat == nil ? nil : prepareReceiveRequest.payerAmountSat, - "receiverAmountSat": prepareReceiveRequest.receiverAmountSat == nil ? nil : prepareReceiveRequest.receiverAmountSat, + "payerAmountSat": prepareReceiveRequest.payerAmountSat, ] } diff --git a/lib/ls-sdk-react-native/src/index.ts b/lib/ls-sdk-react-native/src/index.ts index 3fde7a9bc..3096c99e5 100644 --- a/lib/ls-sdk-react-native/src/index.ts +++ b/lib/ls-sdk-react-native/src/index.ts @@ -18,8 +18,7 @@ const LiquidSwapSDK = NativeModules.RNLiquidSwapSDK ) export interface PrepareReceiveRequest { - payerAmountSat?: number - receiverAmountSat?: number + payerAmountSat: number } export interface PrepareReceiveResponse {