From bb6ab572363f59edeedf2eb04922e2f36cd1cbb08ae7cd59f0af07b5ccdb522a Mon Sep 17 00:00:00 2001 From: Minimons Date: Thu, 2 Jul 2026 19:42:29 +0200 Subject: [PATCH] X: Moved all API files into Implementation package Until Nenjim works better navigation in the code is just too annoying. --- .../jupiter/perps/JupiterPerpsPosition.tjava | 36 ++++++--- .../jupiter/perps/JupiterPerpsService.tjava | 8 +- .../AnchorIdlJupiterPerpsCustodyDecoder.tjava | 76 ++++++------------- ...AnchorIdlJupiterPerpsPositionDecoder.tjava | 26 ++----- .../AnchorIdlJupiterPerpsServiceImpl.tjava | 68 +++++++++++++---- .../impl/anchoridl/CustodyAccountInfo.java | 4 + .../impl/anchoridl/CustodyAccountInfo.tjava | 9 +++ .../impl/anchoridl/DecodingPrimitives.java | 4 + .../impl/anchoridl/DecodingPrimitives.tjava | 31 ++++++++ .../anchoridl/JupiterPerpsPositionInfo.java | 4 + .../anchoridl/JupiterPerpsPositionInfo.tjava | 12 +++ .../r35157/nenjim/hubd/impl/ref/Main.tjava | 51 ++++--------- 12 files changed, 193 insertions(+), 136 deletions(-) create mode 100644 src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.java create mode 100644 src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.tjava create mode 100644 src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.java create mode 100644 src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.tjava create mode 100644 src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.java create mode 100644 src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.tjava diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsPosition.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsPosition.tjava index c898e86..995fbd3 100644 --- a/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsPosition.tjava +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsPosition.tjava @@ -10,20 +10,36 @@ import java.math.BigDecimal; * position.

* * @param positionAccount the Solana account address of the Jupiter Perps position - * @param entryPrice the entry price of the position, denominated in USDC - * @param direction whether the position is long or short * @param tradedTokenMint the mint address of the token being traded - * @param sizeUsd the size of this position in USD - * @param collateralUsd the amount of USD representing the collateral for this position - * @oaram borrowFeeUsd TODO + * @param direction whether the position is long or short + * @param value the amount the position is worth if closed now + * @param size the leveraged amount used to open the contracts + * @param pnl the amount in usd in profit or loss on this position + * @param pnlPercent the profit and loss represented as a percentage + * @param leverage + * @param entryPrice the entry price of the position, denominated in USDC + * @param marketPrice the current spot price of the token + * @param collateral the amount of USD representing the collateral for this position + * @param totalFees the total amount of fees (TODO: is that including pending/due fees) + * @param borrowFeesDue the amount of USD that is currently outstanding + * @param closeFeePending the fee in USD for closing the account (TODO: multiple accounts - when adding collateral?) + * @param accountRent refundable amount locked for Solana account renting */ public record JupiterPerpsPosition( ΩJupiterPerpsPositionAccountΩ positionAccount, - ΩUSDCPriceΩ entryPrice, - JupiterPerpsPositionDirection direction, ΩSPLMintAddressΩ tradedTokenMint, - ΩUSDCAmountΩ sizeUsd, - ΩUSDCAmountΩ collateralUsd, - ΩUSDCAmountΩ borrowFeeUsd + JupiterPerpsPositionDirection direction, + ΩUSDCAmountΩ value, + ΩUSDCAmountΩ size, + ΩUSDCAmountΩ pnl, + BigDecimal pnlPercent, + BigDecimal leverage, + ΩUSDCPriceΩ entryPrice, + ΩUSDCPriceΩ marketPrice, + ΩUSDCAmountΩ collateral, + ΩUSDCAmountΩ totalFees, + ΩUSDCAmountΩ borrowFeesDue, + ΩUSDCAmountΩ closeFeePending, + ΩSolanaAmountΩ accountRent ) { } \ No newline at end of file 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 c513c2d..45ac671 100644 --- a/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsService.tjava +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/JupiterPerpsService.tjava @@ -1,5 +1,8 @@ package com.r35157.libs.jupiter.perps; +import com.r35157.libs.solana.SolanaAccountInfo; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.Set; @@ -25,9 +28,12 @@ public interface JupiterPerpsService { * @throws IOException if the position account could not be fetched or decoded * @throws InterruptedException if the calling thread is interrupted while fetching * the position account - */ + JupiterPerpsPosition getPosition(@NotNull SolanaAccountInfo accountInfo) + throws IOException, InterruptedException + { JupiterPerpsPosition getPosition(ΩJupiterPerpsPositionAccountΩ positionAccount) throws IOException, InterruptedException; + */ /** * Finds open Jupiter Perps positions owned by a wallet. diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsCustodyDecoder.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsCustodyDecoder.tjava index 78b86c4..facd83e 100644 --- a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsCustodyDecoder.tjava +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsCustodyDecoder.tjava @@ -7,76 +7,46 @@ import com.r35157.libs.solana.SolanaAccountInfo; import java.math.BigInteger; import java.util.Base64; +import static com.r35157.libs.jupiter.perps.impl.anchoridl.DecodingPrimitives.*; + public class AnchorIdlJupiterPerpsCustodyDecoder { - public ΩSPLMintAddressΩ decodeMint( - SolanaAccountInfo custodyAccountInfo - ) { - byte[] data = Base64.getDecoder().decode(custodyAccountInfo.dataBase64()); + public CustodyAccountInfo decode(SolanaAccountInfo custodyAccountInfo) { + byte[] data = decodeIdl(custodyAccountInfo); - if (data.length < MINT_OFFSET + PUBLIC_KEY_LENGTH) { - throw new IllegalArgumentException( - "Jupiter Perps custody account data is too short: " + data.length - ); - } + CustodyAccountInfo cai = new CustodyAccountInfo( + decodeMintAddress(data), + decodeCumulativeInterestRate(data) + ); - return readPublicKey(data, MINT_OFFSET); + return cai; } - public BigInteger decodeCurrentCumulativeInterestRate( - SolanaAccountInfo custodyAccountInfo - ) { - byte[] data = Base64.getDecoder().decode(custodyAccountInfo.dataBase64()); + private byte[] decodeIdl(SolanaAccountInfo custodyAccountInfo) { + byte[] data = base64.decode(custodyAccountInfo.dataBase64()); if (data.length < CUMULATIVE_INTEREST_RATE_OFFSET + U128_LENGTH) { - throw new IllegalArgumentException( - "Jupiter Perps custody account data is too short: " + data.length - ); + String errMsg = "Jupiter Perps custody account data is too short: " + data.length; + throw new IllegalArgumentException(errMsg); } - return readU128( - data, - CUMULATIVE_INTEREST_RATE_OFFSET - ); + return data; } - private ΩSPLMintAddressΩ readPublicKey( - byte[] data, - int offset - ) { - byte[] publicKeyBytes = new byte[PUBLIC_KEY_LENGTH]; + private ΩSPLMintAddressΩ decodeMintAddress(byte[] data) { + byte[] mintAddressBytes = readPublicKey(data, MINT_OFFSET); + ΩSPLMintAddressΩ mintAddress = base58.encode(mintAddressBytes); - System.arraycopy( - data, - offset, - publicKeyBytes, - 0, - PUBLIC_KEY_LENGTH - ); - - return base58.encode(publicKeyBytes); + return mintAddress; } - private static BigInteger readU128( - byte[] data, - int offset - ) { - byte[] bytes = new byte[U128_LENGTH]; + private BigInteger decodeCumulativeInterestRate(byte[] data) { + byte[] bytes = readU128(data, CUMULATIVE_INTEREST_RATE_OFFSET); + BigInteger cumulativeInterestRate = new BigInteger(1, bytes); - for (int i = 0; i < U128_LENGTH; i++) { - bytes[i] = data[offset + U128_LENGTH - 1 - i]; - } - - return new BigInteger( - 1, - bytes - ); + return cumulativeInterestRate; } - private static final int U128_LENGTH = 16; - private static final int ANCHOR_DISCRIMINATOR_LENGTH = 8; - private static final int PUBLIC_KEY_LENGTH = 32; - // Offsets: // 8 discriminator // +32 pool @@ -90,9 +60,11 @@ public class AnchorIdlJupiterPerpsCustodyDecoder { // +8 target_ratio_bps // +48 assets + private static final int ANCHOR_DISCRIMINATOR_LENGTH = 8; private static final int MINT_OFFSET = ANCHOR_DISCRIMINATOR_LENGTH + PUBLIC_KEY_LENGTH; private static final int FUNDING_RATE_STATE_OFFSET = 262; private static final int CUMULATIVE_INTEREST_RATE_OFFSET = FUNDING_RATE_STATE_OFFSET; private static final Base58Codec base58 = new Base58CodecImpl(); + private static final Base64.Decoder base64 = Base64.getDecoder(); } \ No newline at end of file diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsPositionDecoder.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsPositionDecoder.tjava index bdca852..03ae283 100644 --- a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsPositionDecoder.tjava +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/AnchorIdlJupiterPerpsPositionDecoder.tjava @@ -15,11 +15,7 @@ import java.util.Base64; public class AnchorIdlJupiterPerpsPositionDecoder { - JupiterPerpsPosition decode( - ΩJupiterPerpsPositionAccountΩ positionAccount, - SolanaAccountInfo accountInfo, - ΩSPLMintAddressΩ tradedTokenMint - ) { + public JupiterPerpsPositionInfo decode(SolanaAccountInfo accountInfo) { byte[] data = Base64.getDecoder().decode(accountInfo.dataBase64()); if (data.length < PRICE_OFFSET + U64_LENGTH) { @@ -58,29 +54,17 @@ public class AnchorIdlJupiterPerpsPositionDecoder { .valueOf(rawSizeUsd) .movePointLeft(6); - AnchorIdlJupiterPerpsCustodyDecoder custodyDecoder = new AnchorIdlJupiterPerpsCustodyDecoder(); - BigInteger currentCumulativeInterestRate = custodyDecoder.decodeCurrentCumulativeInterestRate(collateralCustodyAccountInfo); - BigInteger cumulativeInterestSnapshot = decodeCumulativeInterestSnapshot(positionAccountInfo); - BigInteger difference = currentCumulativeInterestRate.subtract(cumulativeInterestSnapshot); - - ΩUSDCAmountΩ borrowFeeUsd = - new BigDecimal(difference) - .multiply(sizeUsd) - .divide(BigDecimal.valueOf(1_000_000_000L), 6, RoundingMode.CEILING); - - JupiterPerpsPosition pos = new JupiterPerpsPosition( - positionAccount, + JupiterPerpsPositionInfo posInfo = new JupiterPerpsPositionInfo( entryPrice, direction, - tradedTokenMint, sizeUsd, - collateralUsd, - borrowFeeUsd + collateralUsd ); - return pos; + return posInfo; } + public BigInteger decodeCumulativeInterestSnapshot(SolanaAccountInfo accountInfo) { byte[] data = Base64.getDecoder().decode(accountInfo.dataBase64()); 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 f3349f3..a6eb56f 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 @@ -5,8 +5,12 @@ import com.r35157.libs.jupiter.perps.JupiterPerpsService; import com.r35157.libs.solana.SolanaAccountInfo; import com.r35157.libs.solana.SolanaBlockChain; import com.r35157.libs.solana.SolanaProgramAccountMemcmpFilter; +import org.jetbrains.annotations.NotNull; import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; import java.util.HashSet; import java.util.Set; @@ -20,26 +24,47 @@ public class AnchorIdlJupiterPerpsServiceImpl implements JupiterPerpsService { this.custodyDecoder = new AnchorIdlJupiterPerpsCustodyDecoder(); } + /* @Override - public JupiterPerpsPosition getPosition(ΩJupiterPerpsPositionAccountΩ positionAccount) - throws IOException, InterruptedException { - SolanaAccountInfo accountInfo = solanaBlockChain.getAccountInfo(positionAccount); + public JupiterPerpsPosition getPosition(@NotNull SolanaAccountInfo accountInfo) + throws IOException, InterruptedException + { + guard(accountInfo); - if (accountInfo == null) { - throw new IllegalArgumentException("Jupiter Perps position account does not exist: " + positionAccount); - } + JupiterPerpsPositionInfo posInfo = positionDecoder.decode(accountInfo); + ΩUSDCAmountΩ sizeUsd = posInfo.sizeUsd(); - if (!JUPITER_PERPS_PROGRAM_ID.equals(accountInfo.owner())) { - throw new IllegalArgumentException( - "Account is not owned by Jupiter Perps program: " + positionAccount - ); - } + CustodyAccountInfo cai = custodyDecoder.decode(custodyAccountInfo); + BigInteger cumulativeInterestSnapshot = positionDecoder.decodeCumulativeInterestSnapshot(positionAccountInfo); + ΩUSDCAmountΩ borrowFeePendingUsd = calculateBorrowFeeUsd( + cumulativeInterestSnapshot, + sizeUsd + ); - ΩSPLMintAddressΩ tradedTokenMint = getTradedTokenMint(accountInfo); - JupiterPerpsPosition pos = positionDecoder.decode(positionAccount, accountInfo, tradedTokenMint); + JupiterPerpsPosition pos = new JupiterPerpsPosition( + accountInfo, + posInfo.entryPrice(), + posInfo.direction(), + sizeUsd, + posInfo.collateralUsd(), + cai.mintAddress(), + borrowFeePendingUsd + ); return pos; } + */ + + private void guard(SolanaAccountInfo accountInfo) { + ΩSolanaProgramIdΩ owner = accountInfo.owner(); + if (!JUPITER_PERPS_PROGRAM_ID.equals(owner)) { + String errorMsg = "Account '" + accountInfo.address() + "' is not owned by Jupiter Perps program (" + + JUPITER_PERPS_PROGRAM_ID + "), instead it is owned by '" + + owner + + "'"; + throw new IllegalArgumentException(errorMsg); + } + } @Override public Set getOpenPositions(ΩSolanaWalletIdΩ owner) @@ -73,7 +98,20 @@ public class AnchorIdlJupiterPerpsServiceImpl implements JupiterPerpsService { return Set.copyOf(positions); } - private ΩSPLMintAddressΩ getTradedTokenMint(SolanaAccountInfo positionAccountInfo) + private BigDecimal calculateBorrowFeeUsd( + BigInteger cumulativeInterestSnapshot, + ΩUSDCAmountΩ sizeUsd + ) { + BigInteger difference = currentCumulativeInterestRate.subtract(cumulativeInterestSnapshot); + BigDecimal borrowFeeUsd = + new BigDecimal(difference) + .multiply(sizeUsd) + .divide(BigDecimal.valueOf(1_000_000_000L), 6, RoundingMode.CEILING); + + return borrowFeeUsd; + } + + /*private ΩSPLMintAddressΩ getTradedTokenMint(SolanaAccountInfo positionAccountInfo) throws IOException, InterruptedException { ΩSolanaAddressΩ custodyAccount = positionDecoder.decodeCustodyAccount(positionAccountInfo); @@ -87,7 +125,7 @@ public class AnchorIdlJupiterPerpsServiceImpl implements JupiterPerpsService { ΩSPLMintAddressΩ mintAddress = custodyDecoder.decodeMint(custodyAccountInfo); return mintAddress; - } + }*/ private static final ΩJupiterPerpsProgramIdΩ JUPITER_PERPS_PROGRAM_ID = "PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu"; diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.java b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.java new file mode 100644 index 0000000..54a6eee --- /dev/null +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.java @@ -0,0 +1,4 @@ +package com.r35157.libs.jupiter.perps.impl.anchoridl; + +public record CustodyAccountInfo() { +} diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.tjava new file mode 100644 index 0000000..a7913f5 --- /dev/null +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/CustodyAccountInfo.tjava @@ -0,0 +1,9 @@ +package com.r35157.libs.jupiter.perps.impl.anchoridl; + +import java.math.BigInteger; + +public record CustodyAccountInfo( + ΩSPLMintAddressΩ mintAddress, + BigInteger currentCumulativeInterestRate +) { +} diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.java b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.java new file mode 100644 index 0000000..9da3914 --- /dev/null +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.java @@ -0,0 +1,4 @@ +package com.r35157.libs.jupiter.perps.impl.anchoridl; + +public class DecodingPrimitives { +} diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.tjava new file mode 100644 index 0000000..ee72dc7 --- /dev/null +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/DecodingPrimitives.tjava @@ -0,0 +1,31 @@ +package com.r35157.libs.jupiter.perps.impl.anchoridl; + +public class DecodingPrimitives { + + public static byte[] readU128(byte[] data, int offset) { + byte[] bytes = new byte[U128_LENGTH]; + + for (int i = 0; i < U128_LENGTH; i++) { + bytes[i] = data[offset + U128_LENGTH - 1 - i]; + } + + return bytes; + } + + public static byte[] readPublicKey(byte[] data, int offset) { + byte[] publicKeyBytes = new byte[PUBLIC_KEY_LENGTH]; + + System.arraycopy( + data, + offset, + publicKeyBytes, + 0, + PUBLIC_KEY_LENGTH + ); + + return publicKeyBytes; + } + + public static final int U128_LENGTH = 16; + public static final int PUBLIC_KEY_LENGTH = 32; +} diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.java b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.java new file mode 100644 index 0000000..9fad2ef --- /dev/null +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.java @@ -0,0 +1,4 @@ +package com.r35157.libs.jupiter.perps.impl.anchoridl; + +public class JupiterPerpsPositionInfo { +} diff --git a/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.tjava b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.tjava new file mode 100644 index 0000000..07c05a7 --- /dev/null +++ b/src/main/tjava/com/r35157/libs/jupiter/perps/impl/anchoridl/JupiterPerpsPositionInfo.tjava @@ -0,0 +1,12 @@ +package com.r35157.libs.jupiter.perps.impl.anchoridl; + +import com.r35157.libs.jupiter.perps.JupiterPerpsPositionDirection; + +import java.math.BigDecimal; + +public record JupiterPerpsPositionInfo( + ΩUSDCPriceΩ entryPrice, + JupiterPerpsPositionDirection direction, + ΩUSDCAmountΩ sizeUsd, + ΩUSDCAmountΩ collateralUsd +) {} diff --git a/src/main/tjava/com/r35157/nenjim/hubd/impl/ref/Main.tjava b/src/main/tjava/com/r35157/nenjim/hubd/impl/ref/Main.tjava index 04d6647..57f803e 100644 --- a/src/main/tjava/com/r35157/nenjim/hubd/impl/ref/Main.tjava +++ b/src/main/tjava/com/r35157/nenjim/hubd/impl/ref/Main.tjava @@ -2,28 +2,12 @@ package com.r35157.nenjim.hubd.impl.ref; import com.r35157.libs.jupiter.perps.JupiterPerpsPosition; import com.r35157.libs.jupiter.perps.JupiterPerpsService; -import com.r35157.libs.jupiter.perps.impl.anchoridl.AnchorIdlJupiterPerpsPositionDecoder; import com.r35157.libs.jupiter.perps.impl.anchoridl.AnchorIdlJupiterPerpsServiceImpl; import com.r35157.libs.solana.SolanaBlockChain; import com.r35157.libs.solana.impl.ref.SolanaBlockChainImpl; -import com.r35157.nenjim.hubd.ctx.Context; -import com.r35157.nenjim.hubd.NenjimHub; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.management.ClassLoadingMXBean; -import java.lang.management.ManagementFactory; -import com.r35157.libs.jupiter.perps.impl.anchoridl.AnchorIdlJupiterPerpsCustodyDecoder; -import com.r35157.libs.solana.SolanaAccountInfo; -import java.math.BigDecimal; -import java.math.BigInteger; -import com.r35157.nenjim.hubd.ctx.ContextManager; -import com.r35157.nenjim.hubd.journal.JournalManager; -import com.r35157.nenjim.hubd.impl.ref.JournalManagerImpl; - -import java.math.RoundingMode; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.Set; public class Main { @@ -38,28 +22,21 @@ public class Main { Set positions = jupiter.getOpenPositions(walletId); - AnchorIdlJupiterPerpsPositionDecoder positionDecoder = new AnchorIdlJupiterPerpsPositionDecoder(); - AnchorIdlJupiterPerpsCustodyDecoder custodyDecoder = new AnchorIdlJupiterPerpsCustodyDecoder(); - for (JupiterPerpsPosition position : positions) { - SolanaAccountInfo positionAccountInfo = sbc.getAccountInfo(position.positionAccount()); - ΩSolanaAddressΩ collateralCustodyAccount = positionDecoder.decodeCollateralCustodyAccount(positionAccountInfo); - SolanaAccountInfo collateralCustodyAccountInfo = sbc.getAccountInfo(collateralCustodyAccount); - BigInteger currentCumulativeInterestRate =custodyDecoder.decodeCurrentCumulativeInterestRate(collateralCustodyAccountInfo); - BigInteger cumulativeInterestSnapshot = positionDecoder.decodeCumulativeInterestSnapshot(positionAccountInfo); - BigInteger difference = currentCumulativeInterestRate.subtract(cumulativeInterestSnapshot); - - System.out.println("positionAccount: " + position.positionAccount()); - System.out.println("currentCumulativeInterestRate: " + currentCumulativeInterestRate); - System.out.println("cumulativeInterestSnapshot: " + cumulativeInterestSnapshot); - System.out.println("difference: " + difference); - - BigDecimal borrowFeeUsdCandidate = - new BigDecimal(difference) - .multiply(position.sizeUsd()) - .divide(BigDecimal.valueOf(1_000_000_000L), 6, RoundingMode.CEILING); - - System.out.println("borrowFeeUsdCandidate: " + borrowFeeUsdCandidate); + System.out.println(" PositionAccount: " + position.positionAccount()); + System.out.println(" Token mint: " + position.tradedTokenMint()); + System.out.println(" Direction: " + position.direction()); + System.out.println(" Value: " + position.value()); + System.out.println(" Size $: " + position.size()); + System.out.println(" PnL: " + position.pnl() + " " + position.pnlPercent()); + System.out.println(" Leverage: " + position.leverage() + "x"); + System.out.println(" Entry price: " + position.entryPrice()); + System.out.println(" Market price: " + position.marketPrice()); + System.out.println(" Collateral: " + position.collateral()); + System.out.println(" Totals fees: " + position.totalFees()); + System.out.println(" Borrow Fees Due: " + position.borrowFeesDue()); + System.out.println(" Close Fees Pending: " + position.closeFeePending()); + System.out.println("Amount locked for account rent (SOL): " + position.accountRent()); System.out.println(); }