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(() => {