mars-v2-frontend/src/hooks/useUpdatedAccount/functions.ts
Linkie Link fac07787c5
fix: apys and aprs (#514)
* fix: fixed aprs

* fix: apy and apr

* fix: fixed build
2023-09-30 09:25:56 +03:00

101 lines
3.4 KiB
TypeScript

import { BN_ZERO } from 'constants/math'
import { MOCK_DEPOSITED_VAULT_POSITION } from 'constants/vaults'
import { VaultValue } from 'hooks/useUpdatedAccount'
import { BNCoin } from 'types/classes/BNCoin'
import { byDenom } from 'utils/array'
import { BN } from 'utils/helpers'
import { getVaultMetaData } from 'utils/vaults'
export function addCoins(additionalCoins: BNCoin[], currentCoins: BNCoin[]) {
const currentDenoms = currentCoins.map((coin) => coin.denom)
additionalCoins.forEach((coin) => {
if (coin.amount.isZero()) return
if (currentDenoms.includes(coin.denom)) {
const index = currentDenoms.indexOf(coin.denom)
currentCoins[index].amount = BN(currentCoins[index].amount).plus(coin.amount)
} else {
currentCoins.push(coin)
}
})
return currentCoins
}
export function removeCoins(coinsToRemove: BNCoin[], currentCoins: BNCoin[]) {
const currentDenoms = currentCoins.map((coin) => coin.denom)
coinsToRemove.forEach((coin) => {
if (coin.amount.isZero()) return
if (!currentDenoms.includes(coin.denom)) return
const index = currentDenoms.indexOf(coin.denom)
currentCoins[index].amount = BN(currentCoins[index].amount).minus(coin.amount)
})
return currentCoins
}
export function addValueToVaults(
vaultValues: VaultValue[],
vaults: DepositedVault[],
availableVaults: Vault[],
): DepositedVault[] {
const currentVaultAddresses = vaults.map((vault) => vault.address)
vaultValues.forEach((vaultValue) => {
if (vaultValue.value.isZero()) return
const halfValue = vaultValue.value.div(2)
if (currentVaultAddresses.includes(vaultValue.address)) {
const index = currentVaultAddresses.indexOf(vaultValue.address)
vaults[index].values.primary = BN(vaults[index].values.primary).plus(halfValue)
vaults[index].values.secondary = BN(vaults[index].values.secondary).plus(halfValue)
} else {
const vaultMetaData = getVaultMetaData(vaultValue.address)
if (!vaultMetaData) return
const apy = availableVaults.find((vault) => vault.address === vaultValue.address)?.apy ?? null
const apr = availableVaults.find((vault) => vault.address === vaultValue.address)?.apr ?? null
vaults.push({
...vaultMetaData,
...MOCK_DEPOSITED_VAULT_POSITION,
apy,
apr,
values: {
primary: halfValue,
secondary: halfValue,
unlocked: BN_ZERO,
unlocking: BN_ZERO,
},
})
}
})
return vaults
}
export function getDepositAndLendCoinsToSpend(coin: BNCoin, account?: Account) {
const makeOutput = (depositsAmount: BigNumber, lendsAmount: BigNumber) => ({
deposit: BNCoin.fromDenomAndBigNumber(coin.denom, depositsAmount),
lend: BNCoin.fromDenomAndBigNumber(coin.denom, lendsAmount),
})
if (!account) return makeOutput(BN_ZERO, BN_ZERO)
const accountDepositAmount = account.deposits.find(byDenom(coin.denom))?.amount ?? BN_ZERO
const accountLendsAmount = account.lends.find(byDenom(coin.denom))?.amount ?? BN_ZERO
const accountDepositAndLendAmount = accountDepositAmount.plus(accountLendsAmount)
if (coin.amount.isLessThanOrEqualTo(accountDepositAmount)) {
return makeOutput(coin.amount, BN_ZERO)
}
if (coin.amount.isGreaterThanOrEqualTo(accountDepositAndLendAmount)) {
return makeOutput(accountDepositAmount, accountLendsAmount)
}
return makeOutput(accountDepositAmount, coin.amount.minus(accountDepositAmount))
}