From 8f92cace055f5d8d2a09aca2018793d61ce530b7 Mon Sep 17 00:00:00 2001 From: Henry de Valence Date: Sat, 18 Jan 2025 12:53:11 -0800 Subject: [PATCH] dex: proposed hotfix for 2025-01-18 chain halt Commit posted for testing, commit message + description TK --- .../dex/src/component/position_manager.rs | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/crates/core/component/dex/src/component/position_manager.rs b/crates/core/component/dex/src/component/position_manager.rs index 5858f185c8..efe9f896c5 100644 --- a/crates/core/component/dex/src/component/position_manager.rs +++ b/crates/core/component/dex/src/component/position_manager.rs @@ -162,7 +162,7 @@ impl PositionRead for T {} pub trait PositionManager: StateWrite + PositionRead { /// Close a position by id, removing it from the state. /// - /// If the position is already closed, this is a no-op. + /// If the position is not currently opened, this method is a no-op /// /// # Errors /// @@ -177,36 +177,24 @@ pub trait PositionManager: StateWrite + PositionRead { .ok_or_else(|| anyhow::anyhow!("could not find position {} to close", id))? .tap(|lp| tracing::trace!(prev_state = ?lp, "retrieved previous lp state")); - anyhow::ensure!( - matches!( - prev_state.state, - position::State::Opened | position::State::Closed, - ), - "attempted to close a position with state {:?}, expected Opened or Closed", - prev_state.state - ); + if prev_state.state == position::State::Opened { + let new_state = { + let mut new_state = prev_state.clone(); + new_state.state = position::State::Closed; + new_state + }; - // Optimization: skip state update if the position is already closed. - // This can happen if the position was queued for closure and premptively - // closed by the DEX engine during execution (e.g. auto-closing). - if prev_state.state == position::State::Closed { + self.update_position(id, Some(prev_state), new_state) + .await?; + self.record_proto(event::EventPositionClose { position_id: *id }.to_proto()); + } else { tracing::debug!( ?id, - "position is already closed so we can skip state updates" + ?prev_state.state, + "position is not currently open, skipping" ); - return Ok(()); } - let new_state = { - let mut new_state = prev_state.clone(); - new_state.state = position::State::Closed; - new_state - }; - - self.update_position(id, Some(prev_state), new_state) - .await?; - self.record_proto(event::EventPositionClose { position_id: *id }.to_proto()); - Ok(()) }