Skip to content

Commit 2c25a0e

Browse files
committed
Reject minfeerate above sanity ceiling
1 parent bfc87ea commit 2c25a0e

1 file changed

Lines changed: 29 additions & 1 deletion

File tree

payjoin/src/core/receive/optional_parameters.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,16 @@ impl Params {
102102
return Err(Error::FeeRate);
103103
}
104104
// since it's a minimum, we want to round up
105-
FeeRate::from_sat_per_kwu(fee_rate_sat_per_kwu.ceil() as u64)
105+
let fee_rate_sat_per_kwu = fee_rate_sat_per_kwu.ceil() as u64;
106+
// Reject absurd rates before they reach fee arithmetic:
107+
// a saturated u64::MAX sat/kwu would overflow the
108+
// Weight * FeeRate fee computation.
109+
if FeeRate::from_sat_per_kwu(fee_rate_sat_per_kwu)
110+
> bitcoin::Psbt::DEFAULT_MAX_FEE_RATE
111+
{
112+
return Err(Error::FeeRate);
113+
}
114+
FeeRate::from_sat_per_kwu(fee_rate_sat_per_kwu)
106115
}
107116
Err(_) => return Err(Error::FeeRate),
108117
},
@@ -196,4 +205,23 @@ pub(crate) mod test {
196205
Error::FeeRate
197206
);
198207
}
208+
209+
#[test]
210+
fn min_fee_rate_rejected_above_sanity_ceiling() {
211+
// A rate whose sat/kwu saturates near u64::MAX must be rejected rather
212+
// than reaching fee arithmetic where Weight * FeeRate would overflow.
213+
assert_eq!(
214+
Params::from_query_str("minfeerate=100000000000000000000", &[Version::One])
215+
.unwrap_err(),
216+
Error::FeeRate
217+
);
218+
}
219+
220+
#[test]
221+
fn min_fee_rate_at_ceiling_is_accepted() {
222+
// `DEFAULT_MAX_FEE_RATE` (25000 sat/vB) is the boundary and must pass.
223+
let params =
224+
Params::from_query_str("minfeerate=25000", &[Version::One]).expect("valid feerate");
225+
assert_eq!(params.min_fee_rate, bitcoin::Psbt::DEFAULT_MAX_FEE_RATE);
226+
}
199227
}

0 commit comments

Comments
 (0)