Skip to content

Commit

Permalink
Update receive to support only payer amount (#131)
Browse files Browse the repository at this point in the history
  • Loading branch information
ok300 authored May 2, 2024
1 parent cb7e753 commit 080698c
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 90 deletions.
12 changes: 5 additions & 7 deletions cli/src/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -94,11 +94,9 @@ pub(crate) fn handle_command(
command: Command,
) -> Result<String> {
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!(
Expand Down
3 changes: 1 addition & 2 deletions lib/ls-sdk-bindings/src/breez_liquid_sdk.udl
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ dictionary SendPaymentResponse {
};

dictionary PrepareReceiveRequest {
u64? payer_amount_sat;
u64? receiver_amount_sat;
u64 payer_amount_sat;
};

dictionary PrepareReceiveResponse {
Expand Down
3 changes: 1 addition & 2 deletions lib/ls-sdk-core/src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,7 @@ impl WalletOptions {

#[derive(Debug, Serialize)]
pub struct PrepareReceiveRequest {
pub payer_amount_sat: Option<u64>,
pub receiver_amount_sat: Option<u64>,
pub payer_amount_sat: u64,
}

#[derive(Debug, Serialize)]
Expand Down
47 changes: 11 additions & 36 deletions lib/ls-sdk-core/src/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
})
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
}

Expand Down
22 changes: 4 additions & 18 deletions lib/ls-sdk-react-native/ios/LiquidSwapSDKMapper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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,
]
}

Expand Down
3 changes: 1 addition & 2 deletions lib/ls-sdk-react-native/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ const LiquidSwapSDK = NativeModules.RNLiquidSwapSDK
)

export interface PrepareReceiveRequest {
payerAmountSat?: number
receiverAmountSat?: number
payerAmountSat: number
}

export interface PrepareReceiveResponse {
Expand Down

0 comments on commit 080698c

Please sign in to comment.