Skip to content

Commit d9b4876

Browse files
benthecarmanclaude
andcommitted
Error when quantity set without amount in bolt12_receive
Previously, setting quantity without amount_msat silently produced a variable-amount offer with no quantity constraint. Now both the server and CLI reject this misconfiguration with a clear error message. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 734358b commit d9b4876

2 files changed

Lines changed: 23 additions & 12 deletions

File tree

ldk-server-cli/src/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,11 @@ async fn main() {
779779
);
780780
},
781781
Commands::Bolt12Receive { description, amount, expiry_secs, quantity } => {
782+
if quantity.is_some() && amount.is_none() {
783+
handle_error_msg(
784+
"quantity can only be set for fixed-amount offers (amount must be provided)",
785+
);
786+
}
782787
let amount_msat = amount.map(|a| a.to_msat());
783788
handle_response_result::<_, Bolt12ReceiveResponse>(
784789
client

ldk-server/src/api/bolt12_receive.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,29 @@ 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(
1920
context: Arc<Context>, request: Bolt12ReceiveRequest,
2021
) -> Result<Bolt12ReceiveResponse, LdkServerError> {
21-
let offer = match request.amount_msat {
22-
Some(amount_msat) => context.node.bolt12_payment().receive(
23-
amount_msat,
24-
&request.description,
25-
request.expiry_secs,
26-
request.quantity,
27-
)?,
28-
None => context
29-
.node
30-
.bolt12_payment()
31-
.receive_variable_amount(&request.description, request.expiry_secs)?,
32-
};
22+
let offer =
23+
match (request.amount_msat, request.quantity) {
24+
(Some(amount_msat), quantity) => context.node.bolt12_payment().receive(
25+
amount_msat,
26+
&request.description,
27+
request.expiry_secs,
28+
quantity,
29+
)?,
30+
(None, Some(_)) => return Err(LdkServerError::new(
31+
InvalidRequestError,
32+
"quantity can only be set for fixed-amount offers (amount_msat must be provided)",
33+
)),
34+
(None, None) => context
35+
.node
36+
.bolt12_payment()
37+
.receive_variable_amount(&request.description, request.expiry_secs)?,
38+
};
3339

3440
let offer_id = offer.id().0.to_lower_hex_string();
3541
let response = Bolt12ReceiveResponse { offer: offer.to_string(), offer_id };

0 commit comments

Comments
 (0)