fix edit position
This commit is contained in:
parent
b19c92b1d1
commit
41bdb0509d
|
@ -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
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<LeverageSlider
|
||||
startingValue={current_leverage}
|
||||
leverageMax={leverageMax}
|
||||
|
|
|
@ -294,7 +294,7 @@ const PositionItem = ({
|
|||
)}
|
||||
</span>
|
||||
</div>
|
||||
{position.bank.name == 'USDC' ? null : (
|
||||
{position.bank.name == 'JLP' ? (
|
||||
<>
|
||||
<div>
|
||||
<p className="mb-1 text-th-fgd-4">Leverage</p>
|
||||
|
@ -303,9 +303,12 @@ const PositionItem = ({
|
|||
{leverage ? leverage.toFixed(2) : 0.0}x
|
||||
</span>
|
||||
<button
|
||||
onClick={() =>
|
||||
onClick={async () => {
|
||||
await set((state) => {
|
||||
state.selectedToken = bank.name
|
||||
})
|
||||
setShowEditLeverageModal(!showEditLeverageModal)
|
||||
}
|
||||
}}
|
||||
className="default-transition flex items-center rounded-md border-b-2 border-th-bkg-4 bg-th-bkg-2 px-2.5 py-1 text-th-fgd-1 md:hover:bg-th-bkg-3"
|
||||
>
|
||||
<AdjustmentsHorizontalIcon className="mr-1.5 h-4 w-4" />
|
||||
|
@ -329,13 +332,15 @@ const PositionItem = ({
|
|||
) : null} */}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
) : null}
|
||||
</div>
|
||||
{showEditLeverageModal ? (
|
||||
<EditLeverageModal
|
||||
token={bank.name}
|
||||
isOpen={showEditLeverageModal}
|
||||
onClose={() => setShowEditLeverageModal(false)}
|
||||
onClose={() => {
|
||||
setShowEditLeverageModal(false)
|
||||
}}
|
||||
/>
|
||||
) : null}
|
||||
</div>
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -109,7 +109,6 @@ export default function useBankRates(selectedToken: string, leverage: number) {
|
|||
borrowBankBorrowRate,
|
||||
tokenStakeRateAPY,
|
||||
leverage,
|
||||
selectedToken,
|
||||
])
|
||||
|
||||
const estimatedMaxAPY = useMemo(() => {
|
||||
|
|
Loading…
Reference in New Issue