diff --git a/crates/bin/pcli/src/command/tx.rs b/crates/bin/pcli/src/command/tx.rs index 6ae6950881..bca520922c 100644 --- a/crates/bin/pcli/src/command/tx.rs +++ b/crates/bin/pcli/src/command/tx.rs @@ -27,7 +27,10 @@ use regex::Regex; use liquidity_position::PositionCmd; use penumbra_sdk_asset::{asset, asset::Metadata, Value, STAKING_TOKEN_ASSET_ID}; -use penumbra_sdk_dex::{lp::position, swap_claim::SwapClaimPlan}; +use penumbra_sdk_dex::{ + lp::position::{self, Position, State}, + swap_claim::SwapClaimPlan, +}; use penumbra_sdk_fee::FeeTier; use penumbra_sdk_governance::{ proposal::ProposalToml, proposal_state::State as ProposalState, Vote, @@ -1376,6 +1379,7 @@ impl TxCmd { *position_id, reserves.try_into().expect("invalid reserves"), pair.try_into().expect("invalid pair"), + 0, ); } @@ -1404,28 +1408,36 @@ impl TxCmd { for position_id in position_ids { // Fetch the information regarding the position from the view service. - let position = client + let response = client .liquidity_position_by_id(LiquidityPositionByIdRequest { position_id: Some(PositionId::from(*position_id)), }) .await? .into_inner(); - let reserves = position - .data - .clone() - .expect("missing position metadata") - .reserves - .expect("missing position reserves"); - let pair = position + let position: Position = response .data .expect("missing position") - .phi - .expect("missing position trading function") - .pair - .expect("missing trading function pair"); + .try_into() + .expect("invalid position state"); + + let reserves = position.reserves; + let pair = position.phi.pair; + let prev_seq = match position.state { + State::Withdrawn { sequence } => sequence, + _ => { + anyhow::bail!("position {} is not in a withdrawable state", position_id) + } + }; + + let next_seq = prev_seq + 1; - planner.position_withdraw(*position_id, reserves.try_into()?, pair.try_into()?); + planner.position_withdraw( + *position_id, + reserves.try_into()?, + pair.try_into()?, + next_seq, + ); } let plan = planner diff --git a/crates/view/src/planner.rs b/crates/view/src/planner.rs index a0c3f95dd6..d077673184 100644 --- a/crates/view/src/planner.rs +++ b/crates/view/src/planner.rs @@ -195,12 +195,13 @@ impl Planner { position_id: position::Id, reserves: Reserves, pair: TradingPair, + next_sequence: u64, ) -> &mut Self { self.action_list.push(PositionWithdrawPlan { reserves, position_id, pair, - sequence: 0, + sequence: next_sequence, rewards: Vec::new(), }); self diff --git a/crates/view/src/service.rs b/crates/view/src/service.rs index 204037bc73..fd8af1409c 100644 --- a/crates/view/src/service.rs +++ b/crates/view/src/service.rs @@ -747,7 +747,7 @@ impl ViewService for ViewServer { tonic::Status::invalid_argument(format!("Could not parse pair: {e:#}")) })?; - planner.position_withdraw(position_id, reserves, trading_pair); + planner.position_withdraw(position_id, reserves, trading_pair, 0); } // Insert any ICS20 withdrawals.