Skip to content

Commit 2229ef5

Browse files
authored
Merge pull request #11 from mars-protocol/v1.2.1
2 parents 53797b4 + 5cf40c4 commit 2229ef5

File tree

25 files changed

+177
-102
lines changed

25 files changed

+177
-102
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "mars",
33
"homepage": "./",
4-
"version": "1.2.0",
4+
"version": "1.2.1",
55
"private": false,
66
"license": "SEE LICENSE IN LICENSE FILE",
77
"scripts": {
@@ -22,7 +22,7 @@
2222
"@cosmjs/launchpad": "^0.27.1",
2323
"@cosmjs/proto-signing": "^0.29.5",
2424
"@cosmjs/stargate": "^0.29.5",
25-
"@marsprotocol/wallet-connector": "^1.4.2",
25+
"@marsprotocol/wallet-connector": "^1.4.5",
2626
"@material-ui/core": "^4.12.4",
2727
"@material-ui/icons": "^4.11.3",
2828
"@ramonak/react-progress-bar": "^5.0.3",

public/index.html

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
import classNames from 'classnames'
2+
import { useTranslation } from 'react-i18next'
23

34
import styles from './ErrorMessage.module.scss'
45

56
interface Props {
6-
errorMessage?: string
7+
message: unknown
78
alignment?: 'left' | 'center' | 'right'
89
}
910

1011
export const ErrorMessage = (props: Props) => {
12+
const { t } = useTranslation()
1113
const classes = classNames(styles.errorMessage, props.alignment && styles[props.alignment])
1214

13-
return props.errorMessage ? <p className={classes}>{props.errorMessage}</p> : null
15+
if (!props.message) return null
16+
17+
if (typeof props.message === 'object') {
18+
return <p className={classes}>{JSON.stringify(props.message)}</p>
19+
}
20+
21+
if (typeof props.message === 'string') {
22+
return <p className={classes}>{props.message}</p>
23+
}
24+
25+
return <p className={classes}>{t('error.errorEstimatedFee')}</p>
1426
}

src/components/common/Footer/Footer.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ export const Footer = () => {
102102
>
103103
{t('global.privacyPolicy')}
104104
</a>
105+
<a
106+
className={styles.item}
107+
href={DocURL.SECURITY}
108+
rel='noopener noreferrer'
109+
target='_blank'
110+
title={t('global.security')}
111+
>
112+
{t('global.security')}
113+
</a>
105114
</div>
106115
<div className={styles.column3}>
107116
<div className={styles.header}>{t('global.community')}</div>

src/components/common/Header/IncentivesButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ export const IncentivesButton = () => {
215215
onClick={() => (submitted ? null : claimRewards())}
216216
color='primary'
217217
/>
218-
<ErrorMessage errorMessage={error} alignment='center' />
218+
<ErrorMessage message={error} alignment='center' />
219219
</div>
220220
</div>
221221
</div>

src/components/common/NumberInput/NumberInput.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ interface Props {
77
value: string
88
className: string
99
maxDecimals: number
10+
minValue?: number
1011
maxValue?: number
1112
maxLength?: number
13+
allowNegative?: boolean
1214
suffix?: string
1315
onChange: (value: number) => void
1416
onBlur?: () => void
@@ -79,6 +81,13 @@ export const NumberInput = (props: Props) => {
7981
const isNumber = !isNaN(Number(value))
8082
const hasMultipleDots = (value.match(/[.,]/g)?.length || 0) > 1
8183
const isSeparator = lastChar === '.' || lastChar === ','
84+
const isNegative = value.indexOf('-') > -1
85+
const isLowerThanMinimum = props.minValue !== undefined && Number(value) < props.minValue
86+
const isHigherThanMaximum = props.maxValue !== undefined && Number(value) > props.maxValue
87+
const isTooLong = props.maxLength !== undefined && numberCount > props.maxLength
88+
const exceedsMaxDecimals = props.maxDecimals !== undefined && decimals > props.maxDecimals
89+
90+
if (isNegative && !props.allowNegative) return
8291

8392
if (isSeparator && value.length === 1) {
8493
updateValues('0.', 0)
@@ -90,17 +99,21 @@ export const NumberInput = (props: Props) => {
9099
return
91100
}
92101

93-
if (!isNumber) return
94-
if (hasMultipleDots) return
102+
if (!isNumber || hasMultipleDots) return
95103

96-
if (props.maxDecimals !== undefined && decimals > props.maxDecimals) {
104+
if (exceedsMaxDecimals) {
97105
value = value.substring(0, value.length - 1)
98106
}
99107

100-
if (props.maxLength !== undefined && numberCount > props.maxLength) return
108+
if (isTooLong) return
109+
110+
if (isLowerThanMinimum) {
111+
updateValues(String(props.minValue), props.minValue!)
112+
return
113+
}
101114

102-
if ((props.maxValue && Number(value) > props.maxValue) || props.maxValue === 0) {
103-
updateValues(String(props.maxValue), props.maxValue)
115+
if (isHigherThanMaximum) {
116+
updateValues(String(props.maxValue), props.maxValue!)
104117
return
105118
}
106119

src/components/common/TxModal/Action.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ export const Action = ({
330330
showProgressIndicator={actionButtonSpec.fetching}
331331
text={actionButtonSpec.text}
332332
/>
333-
<ErrorMessage errorMessage={feeError} alignment='center' />
333+
<ErrorMessage message={feeError} alignment='center' />
334334
</>
335335
)
336336
}

src/components/fields/ActiveVaultsTable/useActiveVaultsColumns.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ export const useActiveVaultsColumns = () => {
199199
<>
200200
<DisplayCurrency
201201
coin={{
202-
denom: baseCurrency.denom,
202+
denom: vaultCap.denom,
203203
amount: vaultCap.max.toString(),
204204
}}
205205
/>
@@ -212,7 +212,7 @@ export const useActiveVaultsColumns = () => {
212212
<TokenBalance
213213
showSymbol
214214
coin={{
215-
denom: baseCurrency.denom,
215+
denom: vaultCap.denom,
216216
amount: vaultCap.max.toString(),
217217
}}
218218
/>

src/components/fields/AvailableVaultsTable/AvailableVaultsTableMobile.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ export const AvailableVaultsTableMobile = () => {
7474
<span>
7575
<DisplayCurrency
7676
coin={{
77-
denom: baseCurrency.denom,
77+
denom: vault.vaultCap?.denom || '',
7878
amount: (vault.vaultCap?.max || 0).toString(),
7979
}}
8080
className={styles.inline}

src/components/fields/AvailableVaultsTable/useAvailableVaultsColumns.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export const useAvailableVaultsColumns = () => {
159159
<>
160160
<DisplayCurrency
161161
coin={{
162-
denom: baseCurrency.denom,
162+
denom: vaultCap.denom,
163163
amount: vaultCap.max.toString(),
164164
}}
165165
/>
@@ -172,7 +172,7 @@ export const useAvailableVaultsColumns = () => {
172172
<TokenBalance
173173
showSymbol
174174
coin={{
175-
denom: baseCurrency.denom,
175+
denom: vaultCap.denom,
176176
amount: vaultCap.max.toString(),
177177
}}
178178
/>

src/components/fields/Breakdown/BreakdownTable/BreakdownTable.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export const BreakdownTable = (props: Props) => {
4242
const primaryAsset = useAsset({ denom: props.vault.denoms.primary })
4343
const secondaryAsset = useAsset({ denom: props.vault.denoms.secondary })
4444
const convertToDisplayCurrency = useStore((s) => s.convertToDisplayCurrency)
45+
const convertToBaseCurrency = useStore((s) => s.convertToBaseCurrency)
4546

4647
const primaryPrice = usePrice(props.vault.denoms.primary)
4748
const secondaryPrice = usePrice(props.vault.denoms.secondary)
@@ -165,13 +166,23 @@ export const BreakdownTable = (props: Props) => {
165166
const additionalPositionValue = props.isSetUp
166167
? props.newPosition.values.total
167168
: props.newPosition.values.total - props.prevPosition.values.total
168-
const vaultCap = (props.vault.vaultCap?.max || 0) * VAULT_DEPOSIT_BUFFER
169+
170+
const vaultCapValue = convertToBaseCurrency({
171+
amount: ((props.vault.vaultCap?.max || 0) * VAULT_DEPOSIT_BUFFER).toString(),
172+
denom: props.vault.vaultCap?.denom || '',
173+
})
174+
175+
const vaultCapUsedValue = convertToBaseCurrency({
176+
amount: (props.vault.vaultCap?.used || 0).toString(),
177+
denom: props.vault.vaultCap?.denom || '',
178+
})
179+
169180
const isVaultCapReached = props.vault.vaultCap
170-
? props.vault.vaultCap.used + additionalPositionValue > vaultCap
181+
? vaultCapUsedValue + additionalPositionValue > vaultCapValue
171182
: false
172183

173184
if (isVaultCapReached && props.vault.vaultCap) {
174-
const leftoverCap = vaultCap - props.vault.vaultCap.used
185+
const leftoverCap = vaultCapValue - vaultCapUsedValue
175186
const maxPositionValue = convertToDisplayCurrency({
176187
amount: ((props.isSetUp ? 0 : props.prevPosition.values.total) + leftoverCap).toString(),
177188
denom: 'uosmo',

src/components/fields/PositionInput/TokenInput/TokenInput.module.scss

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
}
2727

2828
.container {
29+
position: relative;
2930
display: flex;
3031
flex: 1;
3132
border: 1px solid;
@@ -37,13 +38,29 @@
3738
border-color: rgba($colorSecondary, 0.8) !important;
3839
}
3940

41+
.inputWarning {
42+
position: absolute;
43+
bottom: rem-calc(36);
44+
left: 0;
45+
width: 100%;
46+
text-align: center;
47+
display: flex;
48+
justify-content: center;
49+
@include typoS;
50+
}
51+
4052
.input,
4153
.select {
4254
color: $colorWhite;
4355
border: none;
4456
outline: none;
4557
@include padding(1.5, 2);
4658
background: $backgroundInTile;
59+
60+
option {
61+
background: $backgroundInTile;
62+
color: $colorWhite;
63+
}
4764
}
4865

4966
.input:focus,

src/components/fields/PositionInput/TokenInput/TokenInput.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ interface Props {
2323
export const TokenInput = (props: Props) => {
2424
const userBalances = useStore((s) => s.userBalances)
2525
const { t } = useTranslation()
26+
const baseCurrency = useStore((s) => s.baseCurrency)
2627

2728
const walletBalance = findByDenom(userBalances, props.input.denom) as Coin
2829
const asset = useAsset({ denom: props.input.denom })
@@ -54,12 +55,15 @@ export const TokenInput = (props: Props) => {
5455
props.onChange(microValue)
5556
}
5657

57-
if (!asset) return <></>
58+
if (!asset) return null
5859

5960
const maxAmount =
6061
(props.maxAmount === undefined ? Number(walletBalance.amount) : props.maxAmount) /
6162
10 ** asset.decimals
6263

64+
const showGasWarning =
65+
props.maxAmount && props.amount >= props.maxAmount && asset.denom === baseCurrency.denom
66+
6367
return (
6468
<div className={styles.wrapper}>
6569
<Button
@@ -75,9 +79,11 @@ export const TokenInput = (props: Props) => {
7579
onChange={onValueEntered}
7680
onFocus={() => {}}
7781
onBlur={() => {}}
82+
minValue={0}
7883
maxValue={(props.maxAmount || 0) / 10 ** asset.decimals}
7984
value={(props.amount / 10 ** asset.decimals).toString()}
8085
maxDecimals={6}
86+
allowNegative={false}
8187
suffix={isSingleToken ? ` ${props.input.symbol}` : ''}
8288
className={inputClasses}
8389
/>
@@ -98,6 +104,11 @@ export const TokenInput = (props: Props) => {
98104
</select>
99105
</>
100106
)}
107+
{showGasWarning ? (
108+
<div className={styles.inputWarning}>
109+
<p className='tippyContainer'>{t('common.lowUstAmountAfterTransaction')}</p>
110+
</div>
111+
) : null}
101112
</div>
102113
</div>
103114
<div className={styles.bottomInfo}>

src/hooks/queries/useEditPosition.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,13 +223,17 @@ export const useEditPosition = (props: Props) => {
223223
props.isReducingPosition,
224224
])
225225

226-
const { data: fee, isLoading } = useEstimateFarmFee({
226+
const {
227+
data: fee,
228+
isLoading,
229+
error,
230+
} = useEstimateFarmFee({
227231
accountId: props.accountId,
228232
actions: actions,
229233
funds,
230234
isCreate: false,
231235
isLoading: props.isLoading,
232236
})
233237

234-
return { editActions: actions, editFunds: funds, editFee: fee, isLoading }
238+
return { editActions: actions, editFunds: funds, editFee: fee, isLoading, error }
235239
}

src/hooks/queries/useEstimateFarmFee.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,21 @@ export const useEstimateFarmFee = (props: Props) => {
5050

5151
const result = await client.simulate(simulateOptions)
5252

53-
return result.success
54-
? {
55-
amount: result.fee ? result.fee.amount : [],
56-
gas: new BigNumber(result.fee ? result.fee.gas : 0)
57-
.multipliedBy(gasAdjustment)
58-
.toFixed(0),
59-
}
60-
: null
61-
} catch {
62-
return null
53+
if (result.success) {
54+
return {
55+
amount: result.fee ? result.fee.amount : [],
56+
gas: new BigNumber(result.fee ? result.fee.gas : 0)
57+
.multipliedBy(gasAdjustment)
58+
.toFixed(0),
59+
}
60+
}
61+
throw result.error
62+
} catch (e) {
63+
throw e
6364
}
6465
},
6566
{
67+
retry: 1,
6668
enabled:
6769
!props.isLoading &&
6870
!!client &&

src/mocks/vault.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export const vault: Vault = {
2121
secondary: 'ATOM',
2222
},
2323
vaultCap: {
24+
denom: 'uosmo',
2425
used: 1000,
2526
max: 5000,
2627
},

0 commit comments

Comments
 (0)