diff --git a/libs/decrease_position_utils/src/lib.rs b/libs/decrease_position_utils/src/lib.rs index 2a91530..5a025e5 100644 --- a/libs/decrease_position_utils/src/lib.rs +++ b/libs/decrease_position_utils/src/lib.rs @@ -110,7 +110,7 @@ pub fn decrease_position(env: &Env, p: &DecreasePositionParams) -> DecreasePosit let size_delta_usd = p.size_delta_usd.min(position.size_in_usd); // 2. Update market funding + borrowing state - let index_price_mid = p.index_token_price.mid_price(); + let index_price_mid = p.index_token_price.pick_price_for_pnl(p.is_long, false); update_funding_state( env, p.data_store, diff --git a/libs/increase_position_utils/src/lib.rs b/libs/increase_position_utils/src/lib.rs index 38c4cad..3844971 100644 --- a/libs/increase_position_utils/src/lib.rs +++ b/libs/increase_position_utils/src/lib.rs @@ -105,7 +105,7 @@ pub fn increase_position(env: &Env, p: &IncreasePositionParams) -> PositionProps // and price-impact pool writes are omitted to stay within Soroban's 40 ledger-entry // read budget. Funding/borrowing rates are zero when OI is zero (empty market), and // position open/close operations will refresh them once OI exists. - let index_price = p.index_token_price.mid_price(); + let index_price = p.index_token_price.pick_price_for_pnl(p.is_long, true); let impact_usd: i128 = 0; // price impact skipped to save ledger entries // Execution price (no impact) diff --git a/tests/static_execution_price_spread.py b/tests/static_execution_price_spread.py new file mode 100644 index 0000000..bd1e9f7 --- /dev/null +++ b/tests/static_execution_price_spread.py @@ -0,0 +1,15 @@ +from pathlib import Path + + +INCREASE = Path("libs/increase_position_utils/src/lib.rs").read_text() +DECREASE = Path("libs/decrease_position_utils/src/lib.rs").read_text() + + +def test_increase_uses_worst_case_spread_side(): + assert "pick_price_for_pnl(p.is_long, true)" in INCREASE + assert "let index_price = p.index_token_price.mid_price();" not in INCREASE + + +def test_decrease_uses_inverse_spread_side(): + assert "pick_price_for_pnl(p.is_long, false)" in DECREASE + assert "let index_price_mid = p.index_token_price.mid_price();" not in DECREASE \ No newline at end of file