Skip to content

Commit 556adfb

Browse files
committed
Reject quantity on variable-amount offers
The variable-amount path silently dropped quantity, so callers got an offer that didn't match what they asked for. Return an invalid request error instead.
1 parent e8e8045 commit 556adfb

2 files changed

Lines changed: 19 additions & 0 deletions

File tree

‎e2e-tests/tests/e2e.rs‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,18 @@ async fn test_cli_bolt12_receive() {
336336
let offer: Offer = offer_str.parse().unwrap();
337337
let offer_id = <[u8; 32]>::from_hex(output["offer_id"].as_str().unwrap()).unwrap();
338338
assert_eq!(offer.id().0, offer_id);
339+
340+
let error = server_a
341+
.client()
342+
.bolt12_receive(Bolt12ReceiveRequest {
343+
description: "variable amount".to_string(),
344+
amount_msat: None,
345+
expiry_secs: None,
346+
quantity: Some(3),
347+
})
348+
.await
349+
.unwrap_err();
350+
assert_eq!(error.error_code, InvalidRequestError);
339351
}
340352

341353
#[tokio::test]

‎ldk-server/src/api/bolt12_receive.rs‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use hex::DisplayHex;
1313
use ldk_server_grpc::api::{Bolt12ReceiveRequest, Bolt12ReceiveResponse};
1414

1515
use crate::api::error::LdkServerError;
16+
use crate::api::error::LdkServerErrorCode::InvalidRequestError;
1617
use crate::service::Context;
1718

1819
pub(crate) async fn handle_bolt12_receive_request(
@@ -25,6 +26,12 @@ pub(crate) async fn handle_bolt12_receive_request(
2526
request.expiry_secs,
2627
request.quantity,
2728
)?,
29+
None if request.quantity.is_some() => {
30+
return Err(LdkServerError::new(
31+
InvalidRequestError,
32+
"quantity can only be set for fixed-amount offers".to_string(),
33+
));
34+
},
2835
None => context
2936
.node
3037
.bolt12_payment()

0 commit comments

Comments
 (0)