Merge pull request #36 from mars-protocol/v1.5.3

V1.5.3
This commit is contained in:
Linkie Link 2023-06-23 14:22:14 +02:00 committed by GitHub
commit 2ebc64a9d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 83 additions and 58 deletions

View File

@ -1,7 +1,7 @@
{ {
"name": "mars", "name": "mars",
"homepage": "./", "homepage": "./",
"version": "1.5.1", "version": "1.5.3",
"license": "SEE LICENSE IN LICENSE FILE", "license": "SEE LICENSE IN LICENSE FILE",
"private": false, "private": false,
"scripts": { "scripts": {

View File

@ -82,7 +82,7 @@ export const Footer = () => {
</a> </a>
<a <a
className={styles.item} className={styles.item}
href={DocURL.TERMS_OF_SERVICE_URL} href={DocURL.TERMS_OF_SERVICE}
rel='noopener noreferrer' rel='noopener noreferrer'
target='_blank' target='_blank'
title={t('global.termsOfService')} title={t('global.termsOfService')}
@ -91,7 +91,7 @@ export const Footer = () => {
</a> </a>
<a <a
className={styles.item} className={styles.item}
href={DocURL.COOKIE_POLICY_URL} href={DocURL.COOKIE_POLICY}
rel='noopener noreferrer' rel='noopener noreferrer'
target='_blank' target='_blank'
title={t('global.cookiePolicy')} title={t('global.cookiePolicy')}
@ -100,7 +100,7 @@ export const Footer = () => {
</a> </a>
<a <a
className={styles.item} className={styles.item}
href={DocURL.PRIVACY_POLICY_URL} href={DocURL.PRIVACY_POLICY}
rel='noopener noreferrer' rel='noopener noreferrer'
target='_blank' target='_blank'
title={t('global.privacyPolicy')} title={t('global.privacyPolicy')}

View File

@ -29,7 +29,7 @@ export const TermsOfService = () => {
Please check the boxes below to confirm your agreement to the{' '} Please check the boxes below to confirm your agreement to the{' '}
</span> </span>
<a <a
href={DocURL.TERMS_OF_SERVICE_URL} href={DocURL.TERMS_OF_SERVICE}
rel='noreferrer' rel='noreferrer'
target='_blank' target='_blank'
className={classNames('xs')} className={classNames('xs')}

View File

@ -1,8 +1,5 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector' import { ChainInfoID } from '@marsprotocol/wallet-connector'
/* cosmos:network */
export const FORUM_URL = 'https://forum.marsprotocol.io/'
/* asset:unit */ /* asset:unit */
export const MARS_SYMBOL = 'MARS' export const MARS_SYMBOL = 'MARS'
export const MARS_DECIMALS = 6 export const MARS_DECIMALS = 6

View File

@ -1,8 +1,9 @@
import BigNumber from 'bignumber.js'
import { Action, ActionAmount } from 'types/generated/mars-credit-manager/MarsCreditManager.types' import { Action, ActionAmount } from 'types/generated/mars-credit-manager/MarsCreditManager.types'
export const getClosePositionActions = ( export const getClosePositionActions = (
vault: ActiveVault, vault: ActiveVault,
exchangeRate: number, primaryToSecondaryRate: number,
slippage: number, slippage: number,
): Action[] => { ): Action[] => {
const swapMessage: Action[] = [] const swapMessage: Action[] = []
@ -12,20 +13,33 @@ export const getClosePositionActions = (
Math.max(vault.position.amounts.borrowedPrimary, vault.position.amounts.borrowedSecondary) * Math.max(vault.position.amounts.borrowedPrimary, vault.position.amounts.borrowedSecondary) *
1.001, 1.001,
) )
const secondaryAmount = vault.position.amounts.lp.secondary const borrowType =
vault.position.amounts.borrowedPrimary > vault.position.amounts.borrowedSecondary
? 'primary'
: 'secondary'
const availableAmountForRepay = vault.position.amounts.lp[borrowType]
if (availableAmountForRepay < borrowAmount) {
const swapTargetAmount = borrowAmount - availableAmountForRepay
const exchangeRate =
borrowType === 'secondary'
? new BigNumber(1).div(primaryToSecondaryRate)
: new BigNumber(primaryToSecondaryRate)
const swapAmount = Math.max(
exchangeRate.times(swapTargetAmount).integerValue(BigNumber.ROUND_CEIL).toNumber(),
10,
)
if (secondaryAmount < borrowAmount) {
const swapTargetAmount = borrowAmount - secondaryAmount
const swapAmount = Math.max(Math.ceil(swapTargetAmount / exchangeRate), 10)
swapMessage.push({ swapMessage.push({
swap_exact_in: { swap_exact_in: {
coin_in: { coin_in: {
amount: { amount: {
exact: swapAmount.toString(), exact: swapAmount.toString(),
}, },
denom: vault.denoms.primary, denom: borrowType === 'secondary' ? vault.denoms.primary : vault.denoms.secondary,
}, },
denom_out: vault.denoms.secondary, denom_out: vault.denoms[borrowType],
slippage: slippage.toString(), slippage: slippage.toString(),
}, },
}) })

View File

@ -15,11 +15,11 @@ export const useClosePosition = (props: Props) => {
const actions = useMemo(() => { const actions = useMemo(() => {
if (!props.activeVault) return [] if (!props.activeVault) return []
const exchangeRate = getExchangeRate( const primaryToSecondaryRate = getExchangeRate(
props.activeVault.denoms.primary, props.activeVault.denoms.primary,
props.activeVault.denoms.secondary, props.activeVault.denoms.secondary,
) )
return getClosePositionActions(props.activeVault, exchangeRate, slippage) return getClosePositionActions(props.activeVault, primaryToSecondaryRate, slippage)
}, [props.activeVault, getExchangeRate, slippage]) }, [props.activeVault, getExchangeRate, slippage])
const { data: fee } = useEstimateFarmFee({ const { data: fee } = useEstimateFarmFee({

View File

@ -23,24 +23,26 @@ export const useEditPosition = (props: Props) => {
const slippage = useStore((s) => s.slippage) const slippage = useStore((s) => s.slippage)
const [editPosition, coinsAfterSwap] = useMemo<[Position, Coin[]]>(() => { const [editPosition, coinsAfterSwap] = useMemo<[Position, Coin[]]>(() => {
const primaryAmount = const primaryAmount = new BigNumber(props.position.amounts.primary)
props.position.amounts.primary - (props.prevPosition?.amounts.primary || 0) .minus(props.prevPosition?.amounts.primary || 0)
const secondaryAmount = .integerValue(BigNumber.ROUND_CEIL)
props.position.amounts.secondary - (props.prevPosition?.amounts.secondary || 0) const secondaryAmount = new BigNumber(props.position.amounts.secondary)
const borrowedPrimaryAmount = .minus(props.prevPosition?.amounts.secondary || 0)
props.position.amounts.borrowedPrimary - (props.prevPosition?.amounts.borrowedPrimary || 0) .integerValue(BigNumber.ROUND_CEIL)
const borrowedPrimaryAmount = new BigNumber(props.position.amounts.borrowedPrimary)
const borrowedSecondaryAmount = .minus(props.prevPosition?.amounts.borrowedPrimary || 0)
props.position.amounts.borrowedSecondary - .integerValue(BigNumber.ROUND_CEIL)
(props.prevPosition?.amounts.borrowedSecondary || 0) const borrowedSecondaryAmount = new BigNumber(props.position.amounts.borrowedSecondary)
.minus(props.prevPosition?.amounts.borrowedSecondary || 0)
.integerValue(BigNumber.ROUND_CEIL)
const editPosition = { const editPosition = {
...props.position, ...props.position,
amounts: { amounts: {
primary: primaryAmount, primary: primaryAmount.toNumber(),
secondary: secondaryAmount, secondary: secondaryAmount.toNumber(),
borrowedPrimary: borrowedPrimaryAmount, borrowedPrimary: borrowedPrimaryAmount.toNumber(),
borrowedSecondary: borrowedSecondaryAmount, borrowedSecondary: borrowedSecondaryAmount.toNumber(),
lp: { lp: {
amount: '0', amount: '0',
primary: 0, primary: 0,
@ -52,11 +54,11 @@ export const useEditPosition = (props: Props) => {
const primaryBaseAmount = convertToBaseCurrency({ const primaryBaseAmount = convertToBaseCurrency({
denom: props.vault.denoms.primary, denom: props.vault.denoms.primary,
amount: (primaryAmount + borrowedPrimaryAmount).toString(), amount: primaryAmount.plus(borrowedPrimaryAmount).toString(),
}) })
const secondaryBaseAmount = convertToBaseCurrency({ const secondaryBaseAmount = convertToBaseCurrency({
denom: props.vault.denoms.secondary, denom: props.vault.denoms.secondary,
amount: (secondaryAmount + borrowedSecondaryAmount).toString(), amount: secondaryAmount.plus(borrowedSecondaryAmount).toString(),
}) })
let primaryAfterSwap = new BigNumber(primaryAmount).plus(borrowedPrimaryAmount) let primaryAfterSwap = new BigNumber(primaryAmount).plus(borrowedPrimaryAmount)
@ -71,7 +73,7 @@ export const useEditPosition = (props: Props) => {
const amount = Math.floor( const amount = Math.floor(
convertValueToAmount({ convertValueToAmount({
denom: props.vault.denoms[swapTarget], denom: props.vault.denoms[swapTarget],
amount: inputAmount.toString(), amount: new BigNumber(inputAmount).toString(),
}), }),
) )
@ -126,12 +128,12 @@ export const useEditPosition = (props: Props) => {
const primary = editPosition.amounts.primary && { const primary = editPosition.amounts.primary && {
denom: props.vault.denoms.primary, denom: props.vault.denoms.primary,
amount: editPosition.amounts.primary.toString(), amount: new BigNumber(editPosition.amounts.primary).toString(),
} }
const secondary = editPosition.amounts.secondary && { const secondary = editPosition.amounts.secondary && {
denom: props.vault.denoms.secondary, denom: props.vault.denoms.secondary,
amount: editPosition.amounts.secondary.toString(), amount: new BigNumber(editPosition.amounts.secondary).toString(),
} }
const borrow = editPosition.borrowDenom && { const borrow = editPosition.borrowDenom && {
@ -148,12 +150,16 @@ export const useEditPosition = (props: Props) => {
const primaryBaseAmount = convertToBaseCurrency({ const primaryBaseAmount = convertToBaseCurrency({
denom: props.vault.denoms.primary, denom: props.vault.denoms.primary,
amount: (editPosition.amounts.primary + editPosition.amounts.borrowedPrimary).toString(), amount: new BigNumber(editPosition.amounts.primary)
.plus(editPosition.amounts.borrowedPrimary)
.toString(),
}) })
const secondaryBaseAmount = convertToBaseCurrency({ const secondaryBaseAmount = convertToBaseCurrency({
denom: props.vault.denoms.secondary, denom: props.vault.denoms.secondary,
amount: (editPosition.amounts.secondary + editPosition.amounts.borrowedSecondary).toString(), amount: new BigNumber(editPosition.amounts.secondary)
.plus(editPosition.amounts.borrowedSecondary)
.toString(),
}) })
const swapMessage: Action[] = [] const swapMessage: Action[] = []
@ -164,15 +170,21 @@ export const useEditPosition = (props: Props) => {
if (Math.abs(difference) > SWAP_THRESHOLD) { if (Math.abs(difference) > SWAP_THRESHOLD) {
const inputDenom = difference > 0 ? props.vault.denoms.primary : props.vault.denoms.secondary const inputDenom = difference > 0 ? props.vault.denoms.primary : props.vault.denoms.secondary
const outputDenom = difference < 0 ? props.vault.denoms.primary : props.vault.denoms.secondary const outputDenom = difference < 0 ? props.vault.denoms.primary : props.vault.denoms.secondary
const amount = new BigNumber(difference).abs().div(2).toString() const amount = new BigNumber(difference)
const swapAmount = Math.ceil(convertValueToAmount({ denom: inputDenom, amount: amount })) .abs()
.div(2)
.integerValue(BigNumber.ROUND_CEIL)
.toString()
const swapAmount = new BigNumber(
Math.ceil(convertValueToAmount({ denom: inputDenom, amount: amount })),
).toString()
swapMessage.push({ swapMessage.push({
swap_exact_in: { swap_exact_in: {
coin_in: { coin_in: {
denom: inputDenom, denom: inputDenom,
amount: { amount: {
exact: swapAmount.toString(), exact: swapAmount,
}, },
}, },
denom_out: outputDenom, denom_out: outputDenom,
@ -184,7 +196,7 @@ export const useEditPosition = (props: Props) => {
BigNumber.config({ EXPONENTIAL_AT: [-7, 30] }) BigNumber.config({ EXPONENTIAL_AT: [-7, 30] })
const minimumReceive = new BigNumber(minLpToReceive) const minimumReceive = new BigNumber(minLpToReceive)
.times(1 - slippage) .times(1 - slippage)
.dp(0) .integerValue(BigNumber.ROUND_CEIL)
.toString() .toString()
const actions: Action[] = [ const actions: Action[] = [

View File

@ -6,18 +6,18 @@ export function getCouncilLink(currentNetwork: ChainInfoID, currentProvider?: Wa
const isTestnet = const isTestnet =
SUPPORTED_CHAINS.find((chain) => chain.chainId === currentNetwork)?.type === 'testnet' SUPPORTED_CHAINS.find((chain) => chain.chainId === currentNetwork)?.type === 'testnet'
if (isTestnet) return DocURL.COUNCIL_TESTNET_URL if (isTestnet) return DocURL.COUNCIL_TESTNET
if (!currentProvider) return DocURL.COUNCIL_URL if (!currentProvider) return DocURL.COUNCIL
switch (currentProvider) { switch (currentProvider) {
case WalletID.Leap: case WalletID.Leap:
return DocURL.COUNCIL_LEAP_URL return DocURL.COUNCIL_LEAP
case WalletID.StationWallet || WalletID.StationWalletMobile: case WalletID.StationWallet || WalletID.StationWalletMobile:
return DocURL.COUNCIL_STATION_URL return DocURL.COUNCIL_STATION
default: default:
return DocURL.COUNCIL_KEPLR_URL return DocURL.COUNCIL_KEPLR
} }
} }

View File

@ -6,6 +6,7 @@ import { useUpdateAccount } from 'hooks/mutations'
import { useRequestUnlockPosition } from 'hooks/queries/useRequestUnlockPosition' import { useRequestUnlockPosition } from 'hooks/queries/useRequestUnlockPosition'
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { DocURL } from 'types/enums/docURL'
import styles from './UnlockDisclaimer.module.scss' import styles from './UnlockDisclaimer.module.scss'
@ -59,7 +60,7 @@ const Unlock = () => {
<p className={`${styles.title} xxlCaps`}>{t('fields.disclaimers.unlock.title')}</p> <p className={`${styles.title} xxlCaps`}>{t('fields.disclaimers.unlock.title')}</p>
<p> <p>
{t('fields.disclaimers.unlock.description')}{' '} {t('fields.disclaimers.unlock.description')}{' '}
<a href='' rel='noreferrer' target='_blank'> <a href={DocURL.UNLOCK_POSITION} rel='noreferrer' target='_blank'>
{t('common.learnMore')} {t('common.learnMore')}
</a> </a>
</p> </p>

View File

@ -633,8 +633,8 @@ $borderRadiusRound: 50%;
/* Dimensions */ /* Dimensions */
$headerHeight: rem-calc(86); $headerHeight: rem-calc(86);
$mobileNavHeight: rem-calc(64); $mobileNavHeight: rem-calc(64);
$footerHeight: rem-calc(300); $footerHeight: rem-calc(380);
$footerHeightMedium: rem-calc(300); $footerHeightMedium: rem-calc(380);
$footerHeightSmall: rem-calc(800); $footerHeightSmall: rem-calc(800);
$contentWidth: 1248px; $contentWidth: 1248px;

View File

@ -1,15 +1,16 @@
export enum DocURL { export enum DocURL {
COOKIE_POLICY_URL = 'https://docs.marsprotocol.io/docs/overview/legal/cookie-policy', COOKIE_POLICY = 'https://docs.marsprotocol.io/docs/overview/legal/cookie-policy',
COUNCIL_URL = 'https://council.marsprotocol.io', COUNCIL = 'https://council.marsprotocol.io',
COUNCIL_LEAP_URL = 'https://cosmos.leapwallet.io/chains/mars/governance', COUNCIL_LEAP = 'https://cosmos.leapwallet.io/chains/mars/governance',
COUNCIL_STATION_URL = 'https://station.terra.money/gov#PROPOSAL_STATUS_VOTING_PERIOD', COUNCIL_STATION = 'https://station.terra.money/gov#PROPOSAL_STATUS_VOTING_PERIOD',
COUNCIL_TESTNET_URL = 'https://testnet.keplr.app/chains/mars-hub-testnet', COUNCIL_TESTNET = 'https://testnet.keplr.app/chains/mars-hub-testnet',
COUNCIL_KEPLR_URL = 'https://wallet.keplr.app/chains/mars-hub', COUNCIL_KEPLR = 'https://wallet.keplr.app/chains/mars-hub',
FIELDS = 'https://docs.marsprotocol.io/docs/learn/rover/rover-intro', FIELDS = 'https://docs.marsprotocol.io/docs/learn/rover/rover-intro',
LANDING = 'https://docs.marsprotocol.io/', LANDING = 'https://docs.marsprotocol.io/',
PRIVACY_POLICY_URL = 'https://docs.marsprotocol.io/docs/overview/legal/privacy-policy', PRIVACY_POLICY = 'https://docs.marsprotocol.io/docs/overview/legal/privacy-policy',
RED_BANK = 'https://docs.marsprotocol.io/docs/learn/red-bank/red-bank-intro', RED_BANK = 'https://docs.marsprotocol.io/docs/learn/red-bank/red-bank-intro',
RED_BANK_LIQUIDATIONS = 'https://docs.marsprotocol.io/docs/learn/red-bank/red-bank-liquidations', RED_BANK_LIQUIDATIONS = 'https://docs.marsprotocol.io/docs/learn/red-bank/red-bank-liquidations',
SECURITY = 'https://docs.marsprotocol.io/docs/overview/security/audits', SECURITY = 'https://docs.marsprotocol.io/docs/overview/security/audits',
TERMS_OF_SERVICE_URL = 'https://docs.marsprotocol.io/docs/overview/legal/terms-of-service', TERMS_OF_SERVICE = 'https://docs.marsprotocol.io/docs/overview/legal/terms-of-service',
UNLOCK_POSITION = 'https://docs.marsprotocol.io/docs/learn/workstation/vaults/unlocking',
} }