From 41bdb0509d325fd3359e684e1f6af4f7b5bb2123 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrian=20Brzezin=CC=81ski?=
Date: Mon, 25 Mar 2024 00:01:42 +0100
Subject: [PATCH] fix edit position
---
components/EditLeverageForm.tsx | 114 +++++++++++++++++++-------------
components/Positions.tsx | 15 +++--
components/UnstakeForm.tsx | 2 +-
hooks/useBankRates.ts | 1 -
4 files changed, 78 insertions(+), 54 deletions(-)
diff --git a/components/EditLeverageForm.tsx b/components/EditLeverageForm.tsx
index deb9510..dc5de9d 100644
--- a/components/EditLeverageForm.tsx
+++ b/components/EditLeverageForm.tsx
@@ -3,7 +3,10 @@ import { useTranslation } from 'next-i18next'
import React, { useCallback, useMemo, useState } from 'react'
import mangoStore from '@store/mangoStore'
import { notify } from '../utils/notifications'
-import { TokenAccount, formatTokenSymbol } from '../utils/tokens'
+import {
+ formatTokenSymbol,
+ getStakableTokensDataForTokenName,
+} from '../utils/tokens'
import Label from './forms/Label'
import Button from './shared/Button'
import Loading from './shared/Loading'
@@ -29,6 +32,7 @@ import { Disclosure } from '@headlessui/react'
import useLeverageMax from 'hooks/useLeverageMax'
import { toUiDecimals } from '@blockworks-foundation/mango-v4'
import { simpleSwap } from 'utils/transactions'
+import { JLP_BORROW_TOKEN, LST_BORROW_TOKEN } from 'utils/constants'
const set = mangoStore.getState().set
@@ -40,27 +44,6 @@ interface EditLeverageFormProps {
onSuccess: () => void
}
-export const walletBalanceForToken = (
- walletTokens: TokenAccount[],
- token: string,
-): { maxAmount: number; maxDecimals: number } => {
- const group = mangoStore.getState().group
- const bank = group?.banksMapByName.get(token)?.[0]
-
- let walletToken
- if (bank) {
- const tokenMint = bank?.mint
- walletToken = tokenMint
- ? walletTokens.find((t) => t.mint.toString() === tokenMint.toString())
- : null
- }
-
- return {
- maxAmount: walletToken ? walletToken.uiAmount : 0,
- maxDecimals: bank?.mintDecimals || 6,
- }
-}
-
// const getNextAccountNumber = (accounts: MangoAccount[]): number => {
// if (accounts.length > 1) {
// return (
@@ -78,21 +61,28 @@ function EditLeverageForm({
token: selectedToken,
onSuccess,
}: EditLeverageFormProps) {
+ const clientContext =
+ getStakableTokensDataForTokenName(selectedToken).clientContext
const { t } = useTranslation(['common', 'account'])
const submitting = mangoStore((s) => s.submittingBoost)
const { ipAllowed } = useIpAddress()
const storedLeverage = mangoStore((s) => s.leverage)
const { usedTokens, totalTokens } = useMangoAccountAccounts()
- const { group } = useMangoGroup()
+ const { jlpGroup, lstGroup } = useMangoGroup()
const { mangoAccount } = useMangoAccount()
const groupLoaded = mangoStore((s) => s.groupLoaded)
- const leverageMax = useLeverageMax(selectedToken) * 0.9 // Multiplied by 0.975 becuase you cant actually get to the end of the inifinite geometric series?
- const stakeBank = useMemo(() => {
- return group?.banksMapByName.get(selectedToken)?.[0]
- }, [selectedToken, group])
- const borrowBank = useMemo(() => {
- return group?.banksMapByName.get('USDC')?.[0]
- }, [group])
+ const leverageMax = useLeverageMax(selectedToken)
+ const [stakeBank, borrowBank] = useMemo(() => {
+ const stakeBank =
+ clientContext === 'jlp'
+ ? jlpGroup?.banksMapByName.get(selectedToken)?.[0]
+ : lstGroup?.banksMapByName.get(selectedToken)?.[0]
+ const borrowBank =
+ clientContext === 'jlp'
+ ? jlpGroup?.banksMapByName.get(JLP_BORROW_TOKEN)?.[0]
+ : lstGroup?.banksMapByName.get(LST_BORROW_TOKEN)?.[0]
+ return [stakeBank, borrowBank]
+ }, [selectedToken, jlpGroup, lstGroup, clientContext])
const stakeBankAmount =
mangoAccount && stakeBank && mangoAccount?.getTokenBalance(stakeBank)
@@ -100,12 +90,25 @@ function EditLeverageForm({
const borrowAmount =
mangoAccount && borrowBank && mangoAccount?.getTokenBalance(borrowBank)
+ const borrowBankAmount =
+ mangoAccount && borrowBank && mangoAccount.getTokenBalance(borrowBank)
+
const current_leverage = useMemo(() => {
try {
- if (stakeBankAmount && borrowAmount) {
- const currentDepositValue = Number(stakeBankAmount) * stakeBank.uiPrice
- const lev =
- currentDepositValue / (currentDepositValue + Number(borrowAmount))
+ if (
+ stakeBankAmount &&
+ borrowBankAmount &&
+ borrowBankAmount.toNumber() < 0
+ ) {
+ const stakeAmountValue = stakeBankAmount.mul(stakeBank.getAssetPrice())
+ const lev = stakeAmountValue
+ .div(
+ stakeAmountValue.sub(
+ borrowBankAmount.abs().mul(borrowBank.getAssetPrice()),
+ ),
+ )
+ .toNumber()
+
return Math.sign(lev) !== -1 ? lev : 1
}
return 1
@@ -113,10 +116,14 @@ function EditLeverageForm({
console.log(e)
return 1
}
- }, [stakeBankAmount, borrowAmount, stakeBank])
+ }, [stakeBankAmount, borrowBankAmount, stakeBank, borrowBank])
const [leverage, setLeverage] = useState(current_leverage)
+ useEffect(() => {
+ setLeverage(current_leverage)
+ }, [current_leverage])
+
const { financialMetrics, borrowBankBorrowRate } = useBankRates(
selectedToken,
leverage,
@@ -162,7 +169,7 @@ function EditLeverageForm({
}, [leverage, borrowBank, stakeBank, tokenMax])
const availableVaultBalance = useMemo(() => {
- if (!borrowBank || !group) return 0
+ if (!borrowBank) return 0
const maxUtilization = 1 - borrowBank.minVaultToDepositsRatio
const vaultBorrows = borrowBank.uiBorrows()
const vaultDeposits = borrowBank.uiDeposits()
@@ -171,8 +178,9 @@ function EditLeverageForm({
const available =
(maxUtilization * vaultDeposits - vaultBorrows) * loanOriginationFeeFactor
return available
- }, [borrowBank, group])
+ }, [borrowBank])
+ //TODO fix for LSTS
const changeInJLP = useMemo(() => {
if (stakeBankAmount) {
return Number(
@@ -235,8 +243,8 @@ function EditLeverageForm({
if (changeInJLP > 0) {
console.log('Swapping From USDC to JLP')
const { signature: tx, slot } = await simpleSwap(
- client,
- group,
+ client[clientContext],
+ group[clientContext]!,
mangoAccount,
borrowBank?.mint,
stakeBank?.mint,
@@ -251,8 +259,8 @@ function EditLeverageForm({
} else {
console.log('Swapping From JLP to USDC')
const { signature: tx, slot } = await simpleSwap(
- client,
- group,
+ client[clientContext],
+ group[clientContext]!,
mangoAccount,
stakeBank?.mint,
borrowBank?.mint,
@@ -273,14 +281,15 @@ function EditLeverageForm({
await sleep(500)
if (!mangoAccount) {
await actions.fetchMangoAccounts(
- (client.program.provider as AnchorProvider).wallet.publicKey,
+ (client[clientContext].program.provider as AnchorProvider).wallet
+ .publicKey,
)
}
- await actions.reloadMangoAccount(slot_retrieved)
+ await actions.reloadMangoAccount(clientContext, slot_retrieved)
await actions.fetchWalletTokens(publicKey)
await actions.fetchGroup()
- await actions.reloadMangoAccount()
+ await actions.reloadMangoAccount(clientContext)
onSuccess()
} catch (e) {
console.error('Error depositing:', e)
@@ -295,7 +304,16 @@ function EditLeverageForm({
type: 'error',
})
}
- }, [ipAllowed, stakeBank, publicKey, amountToBorrow, borrowBank?.mint])
+ }, [
+ ipAllowed,
+ stakeBank,
+ borrowBank,
+ publicKey,
+ changeInJLP,
+ clientContext,
+ onSuccess,
+ changeInUSDC,
+ ])
const tokenDepositLimitLeft = stakeBank?.getRemainingDepositLimit()
const tokenDepositLimitLeftUi =
@@ -320,9 +338,10 @@ function EditLeverageForm({
useEffect(() => {
const group = mangoStore.getState().group
set((state) => {
- state.swap.outputBank = group?.banksMapByName.get(selectedToken)?.[0]
+ state.swap.outputBank =
+ group[clientContext]?.banksMapByName.get(selectedToken)?.[0]
})
- }, [selectedToken])
+ }, [selectedToken, clientContext])
return (
<>
@@ -365,6 +384,7 @@ function EditLeverageForm({
{leverage.toFixed(2)}x
+
- {position.bank.name == 'USDC' ? null : (
+ {position.bank.name == 'JLP' ? (
<>
Leverage
@@ -303,9 +303,12 @@ const PositionItem = ({
{leverage ? leverage.toFixed(2) : 0.0}x
>
- )}
+ ) : null}
{showEditLeverageModal ? (
setShowEditLeverageModal(false)}
+ onClose={() => {
+ setShowEditLeverageModal(false)
+ }}
/>
) : null}
diff --git a/components/UnstakeForm.tsx b/components/UnstakeForm.tsx
index e574416..40b98c8 100644
--- a/components/UnstakeForm.tsx
+++ b/components/UnstakeForm.tsx
@@ -117,7 +117,7 @@ function UnstakeForm({
console.log(e)
return 1
}
- }, [stakeBankAmount, borrowBankAmount, stakeBank])
+ }, [stakeBankAmount, borrowBankAmount, stakeBank, borrowBank])
const tokenMax = useMemo(() => {
if (!stakeBank || !mangoAccount) return { maxAmount: 0.0, maxDecimals: 6 }
diff --git a/hooks/useBankRates.ts b/hooks/useBankRates.ts
index f3c0f44..dd6b331 100644
--- a/hooks/useBankRates.ts
+++ b/hooks/useBankRates.ts
@@ -109,7 +109,6 @@ export default function useBankRates(selectedToken: string, leverage: number) {
borrowBankBorrowRate,
tokenStakeRateAPY,
leverage,
- selectedToken,
])
const estimatedMaxAPY = useMemo(() => {