101 lines
3.4 KiB
TypeScript
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))
|
|
}
|