Skip to content

Commit 58bc2e2

Browse files
committed
fix unreachable overflow in amm swap
1 parent 3e767f3 commit 58bc2e2

2 files changed

Lines changed: 16 additions & 6 deletions

File tree

lib/state/amm.rs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,10 @@ impl PoolState {
225225
.ok_or(Error::InvalidSwap)?;
226226

227227
// used for computing product for swap price
228-
let effective_spend_asset_reserve = reserve0 + spend_after_fee;
228+
let effective_spend_asset_reserve =
229+
*reserve0 as u128 + spend_after_fee as u128;
229230
let new_receive_asset_reserve_before_fee: u64 = reserve_product
230-
.div_ceil(effective_spend_asset_reserve as u128)
231+
.div_ceil(effective_spend_asset_reserve)
231232
.try_into()
232233
.map_err(|_| Error::InvalidSwap)?;
233234
let amount_receive_before_fee: u64 = reserve1
@@ -239,10 +240,13 @@ impl PoolState {
239240
.checked_sub(amount_receive_before_fee)
240241
.ok_or(Error::InvalidSwap)?;
241242
let (new_reserve0, new_reserve1) = {
243+
let new_reserve0 = reserve0
244+
.checked_add(amount_spend)
245+
.ok_or(Error::ReserveOverflow)?;
242246
let new_reserve1 = reserve1
243247
.checked_sub(amount_receive_after_fee)
244248
.ok_or(Error::InsufficientLiquidity)?;
245-
(reserve0 + amount_spend, new_reserve1)
249+
(new_reserve0, new_reserve1)
246250
};
247251
Ok(PoolState {
248252
reserve0: new_reserve0,
@@ -269,9 +273,10 @@ impl PoolState {
269273
.checked_sub(spend_after_fee)
270274
.ok_or(Error::InvalidSwap)?;
271275
// used for computing product for swap price
272-
let effective_spend_asset_reserve = reserve1 + spend_after_fee;
276+
let effective_spend_asset_reserve =
277+
*reserve1 as u128 + spend_after_fee as u128;
273278
let new_receive_asset_reserve_before_fee: u64 = reserve_product
274-
.div_ceil(effective_spend_asset_reserve as u128)
279+
.div_ceil(effective_spend_asset_reserve)
275280
.try_into()
276281
.map_err(|_| Error::InvalidSwap)?;
277282
let amount_receive_before_fee: u64 = reserve0
@@ -286,7 +291,10 @@ impl PoolState {
286291
let new_reserve0 = reserve0
287292
.checked_sub(amount_receive_after_fee)
288293
.ok_or(Error::InsufficientLiquidity)?;
289-
(new_reserve0, reserve1 + amount_spend)
294+
let new_reserve1 = reserve1
295+
.checked_add(amount_spend)
296+
.ok_or(Error::ReserveOverflow)?;
297+
(new_reserve0, new_reserve1)
290298
};
291299
Ok(PoolState {
292300
reserve0: new_reserve0,

lib/state/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ pub enum Amm {
4141
MissingPoolState { asset0: AssetId, asset1: AssetId },
4242
#[error("AMM pool invariant")]
4343
PoolInvariant,
44+
#[error("AMM pool reserve overflow")]
45+
ReserveOverflow,
4446
#[error("Failed to revert AMM mint")]
4547
RevertMint,
4648
#[error("Failed to revert AMM swap")]

0 commit comments

Comments
 (0)