From b4b087cb3aec23496604be492017d2e4edae428f Mon Sep 17 00:00:00 2001 From: Minimons Date: Tue, 28 Jul 2026 19:31:48 +0200 Subject: [PATCH] 49: Add high-level Jupiter position decrease operation --- .../jupiter/perps/JupiterPerpsService.tjava | 25 +++++++++++++++++++ .../AnchorIdlJupiterPerpsServiceImpl.tjava | 22 ++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsService.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsService.tjava index bf650b0..607bee5 100644 --- a/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsService.tjava +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsService.tjava @@ -132,6 +132,31 @@ public interface JupiterPerpsService { @NotNull SolanaSignedTransaction transaction ) throws IOException, InterruptedException; + /** + * Decreases an existing Jupiter Perps position. + * + *

The service constructs the transaction, asks the supplied wallet to + * sign it, and submits it to Jupiter.

+ * + * @param wallet the wallet that owns the position + * @param positionAccount the Jupiter Perps position to decrease + * @param receiveTokenMint the mint address of the token to receive + * @param sizeUsdDelta the requested decrease in position size, denominated in USD + * @param maxSlippageBps the maximum accepted slippage, in basis points + * @return the Solana transaction signature + * @throws IllegalArgumentException if an amount, mint, or slippage value is invalid + * @throws IOException if the transaction cannot be constructed, signed, or submitted + * @throws InterruptedException if the calling thread is interrupted + */ + @NotNull + ΩSolanaTransactionSignatureΩ executePositionDecrease( + @NotNull SolanaWallet wallet, + @NotNull ΩJupiterPerpsPositionAccountΩ positionAccount, + @NotNull ΩSPLMintAddressΩ receiveTokenMint, + @NotNull ΩUSDCAmountΩ sizeUsdDelta, + int maxSlippageBps + ) throws IOException, InterruptedException; + /** * Constructs an unsigned Solana transaction for decreasing * an existing Jupiter Perps position. diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsServiceImpl.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsServiceImpl.tjava index 6372ba8..c3fac43 100644 --- a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsServiceImpl.tjava +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsServiceImpl.tjava @@ -221,6 +221,28 @@ public class AnchorIdlJupiterPerpsServiceImpl implements JupiterPerpsService { return response.txid(); } + @Override + public @NotNull ΩSolanaTransactionSignatureΩ executePositionDecrease( + @NotNull SolanaWallet wallet, + @NotNull ΩJupiterPerpsPositionAccountΩ positionAccount, + @NotNull ΩSPLMintAddressΩ receiveTokenMint, + @NotNull ΩUSDCAmountΩ sizeUsdDelta, + int maxSlippageBps + ) throws IOException, InterruptedException { + SolanaUnsignedTransaction unsignedTransaction = + buildPositionDecreaseTransaction( + positionAccount, + receiveTokenMint, + sizeUsdDelta, + maxSlippageBps + ); + + SolanaSignedTransaction signedTransaction = + wallet.signTransaction(unsignedTransaction); + + return executePositionDecreaseTransaction(signedTransaction); + } + @Override public @NotNull SolanaUnsignedTransaction buildPositionDecreaseTransaction( @NotNull ΩJupiterPerpsPositionAccountΩ positionAccount,