Skip to content

Commit 63df119

Browse files
committed
Add fee rate validation with 1000 sat/vbyte max
1 parent ea9f60a commit 63df119

2 files changed

Lines changed: 30 additions & 1 deletion

File tree

ddk-node/src/command.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ pub async fn cli_command(
142142
amount,
143143
fee_rate,
144144
} => {
145+
if fee_rate > 1000 {
146+
return Err(anyhow!("Fee rate too high: {} sat/vbyte (max: 1000)", fee_rate));
147+
}
145148
let txid = client
146149
.send(SendRequest {
147150
address,
@@ -330,6 +333,9 @@ async fn interactive_contract_input(
330333
.prompt()?
331334
.parse()?;
332335
let fee_rate: u64 = Text::new("Fee rate (sats/vbyte):").prompt()?.parse()?;
336+
if fee_rate > 1000 {
337+
return Err(anyhow!("Fee rate too high: {} sat/vbyte (max: 1000)", fee_rate));
338+
}
333339
let min_price: u64 = Text::new("Minimum Bitcoin price:").prompt()?.parse()?;
334340
let max_price: u64 = Text::new("Maximum Bitcoin price:").prompt()?.parse()?;
335341
let num_steps: u64 = Text::new("Number of rounding steps:").prompt()?.parse()?;
@@ -372,6 +378,9 @@ async fn interactive_contract_input(
372378
outcome_payouts.push(outcome_payout);
373379
}
374380
let fee_rate: u64 = Text::new("Fee rate (sats/vbyte):").prompt()?.parse()?;
381+
if fee_rate > 1000 {
382+
return Err(anyhow!("Fee rate too high: {} sat/vbyte (max: 1000)", fee_rate));
383+
}
375384
// TODO: list possible events.
376385
ddk_payouts::enumeration::create_contract_input(
377386
outcome_payouts,

ddk-node/src/lib.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,19 @@ impl DdkRpc for DdkNode {
144144
counter_party,
145145
} = request.into_inner();
146146
let contract_input: ContractInput =
147-
serde_json::from_slice(&contract_input).expect("couldn't get bytes correct");
147+
serde_json::from_slice(&contract_input).map_err(|e| {
148+
Status::new(
149+
Code::InvalidArgument,
150+
format!("Invalid contract input: {}", e),
151+
)
152+
})?;
153+
154+
if contract_input.fee_rate > 1000 {
155+
return Err(Status::new(
156+
Code::InvalidArgument,
157+
format!("Fee rate too high: {} sat/vbyte (max: 1000)", contract_input.fee_rate),
158+
));
159+
}
148160
let mut oracle_announcements = Vec::new();
149161
for info in &contract_input.contract_infos {
150162
let announcement = self
@@ -336,6 +348,14 @@ impl DdkRpc for DdkNode {
336348
amount,
337349
fee_rate,
338350
} = request.into_inner();
351+
352+
if fee_rate > 1000 {
353+
return Err(Status::new(
354+
Code::InvalidArgument,
355+
format!("Fee rate too high: {} sat/vbyte (max: 1000)", fee_rate),
356+
));
357+
}
358+
339359
let address = Address::from_str(&address).unwrap().assume_checked();
340360
let amount = Amount::from_sat(amount);
341361
let fee_rate = match FeeRate::from_sat_per_vb(fee_rate) {

0 commit comments

Comments
 (0)