Skip to content

Commit 703b756

Browse files
Merge pull request #292 from invariant-labs/staging
Update prod
2 parents 0e04bd2 + 6be4397 commit 703b756

File tree

9 files changed

+128
-14
lines changed

9 files changed

+128
-14
lines changed

src/components/NewPosition/DepositSelector/DepositSelector.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,21 @@ export const DepositSelector: React.FC<IDepositSelector> = ({
185185
minimumSliderIndex
186186
])
187187

188+
const [wasRunTokenA, setWasRunTokenA] = useState(false)
189+
const [wasRunTokenB, setWasRunTokenB] = useState(false)
190+
191+
useEffect(() => {
192+
if (!wasRunTokenA && tokens[tickerToAddress(initialTokenFrom)]) {
193+
setTokenA(tickerToAddress(initialTokenFrom))
194+
setWasRunTokenA(true)
195+
}
196+
197+
if (!wasRunTokenB && tokens[tickerToAddress(initialTokenTo)]) {
198+
setTokenB(tickerToAddress(initialTokenTo))
199+
setWasRunTokenB(true)
200+
}
201+
}, [wasRunTokenA, wasRunTokenB, tokens])
202+
188203
useEffect(() => {
189204
if (tokenA !== null) {
190205
if (getScaleFromString(tokenAInputState.value) > Number(tokens[tokenA].decimals)) {

src/components/NewPosition/NewPosition.stories.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ export const Primary: Story = {
7373
unblockUpdatePriceRange: fn(),
7474
isGetLiquidityError: false,
7575
onlyUserPositions: false,
76-
setOnlyUserPositions: fn()
76+
setOnlyUserPositions: fn(),
77+
isLoadingTokens: false
7778
},
7879
render: () => {
7980
return (
@@ -132,6 +133,7 @@ export const Primary: Story = {
132133
isGetLiquidityError={false}
133134
onlyUserPositions={false}
134135
setOnlyUserPositions={fn()}
136+
isLoadingTokens={false}
135137
/>
136138
)
137139
}

src/components/NewPosition/NewPosition.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import backIcon from '@static/svg/back-arrow.svg'
99
import settingIcon from '@static/svg/settings.svg'
1010
import { ALL_FEE_TIERS_DATA, PositionTokenBlock, REFRESHER_INTERVAL } from '@store/consts/static'
1111
import {
12+
addressToTicker,
1213
calcPriceBySqrtPrice,
1314
calculateConcentrationRange,
1415
convertBalanceToBigint,
@@ -102,6 +103,7 @@ export interface INewPosition {
102103
isGetLiquidityError: boolean
103104
onlyUserPositions: boolean
104105
setOnlyUserPositions: (val: boolean) => void
106+
isLoadingTokens: boolean
105107
}
106108

107109
export const NewPosition: React.FC<INewPosition> = ({
@@ -153,7 +155,8 @@ export const NewPosition: React.FC<INewPosition> = ({
153155
unblockUpdatePriceRange,
154156
isGetLiquidityError,
155157
onlyUserPositions,
156-
setOnlyUserPositions
158+
setOnlyUserPositions,
159+
isLoadingTokens
157160
}) => {
158161
const { classes } = useStyles()
159162
const navigate = useNavigate()
@@ -413,14 +416,14 @@ export const NewPosition: React.FC<INewPosition> = ({
413416
const parsedFee = parseFeeToPathFee(ALL_FEE_TIERS_DATA[fee].tier.fee)
414417

415418
if (address1 != null && address2 != null) {
416-
const token1Symbol = tokens[address1].symbol
417-
const token2Symbol = tokens[address2].symbol
419+
const token1Symbol = addressToTicker(address1)
420+
const token2Symbol = addressToTicker(address2)
418421
navigate(`/newPosition/${token1Symbol}/${token2Symbol}/${parsedFee}`, { replace: true })
419422
} else if (address1 != null) {
420-
const tokenSymbol = tokens[address1].symbol
423+
const tokenSymbol = addressToTicker(address1)
421424
navigate(`/newPosition/${tokenSymbol}/${parsedFee}`, { replace: true })
422425
} else if (address2 != null) {
423-
const tokenSymbol = tokens[address2].symbol
426+
const tokenSymbol = addressToTicker(address2)
424427
navigate(`/newPosition/${tokenSymbol}/${parsedFee}`, { replace: true })
425428
} else if (fee != null) {
426429
navigate(`/newPosition/${parsedFee}`, { replace: true })
@@ -558,7 +561,9 @@ export const NewPosition: React.FC<INewPosition> = ({
558561
setTokenB(address2)
559562
onChangePositionTokens(address1, address2, fee)
560563

561-
updatePath(address1, address2, fee)
564+
if (!isLoadingTokens) {
565+
updatePath(address1, address2, fee)
566+
}
562567
}}
563568
onAddLiquidity={() => {
564569
if (tokenA !== null && tokenB !== null) {
@@ -652,7 +657,9 @@ export const NewPosition: React.FC<INewPosition> = ({
652657
setTokenB(pom)
653658
onChangePositionTokens(tokenB, tokenA, currentFeeIndex)
654659

655-
updatePath(tokenB, tokenA, currentFeeIndex)
660+
if (!isLoadingTokens) {
661+
updatePath(tokenB, tokenA, currentFeeIndex)
662+
}
656663
}}
657664
poolIndex={poolIndex}
658665
bestTierIndex={bestTierIndex}

src/components/Swap/Swap.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -324,22 +324,23 @@ export const Swap: React.FC<ISwap> = ({
324324
}
325325

326326
if (
327-
convertBalanceToBigint(amountFrom, Number(tokens[tokenFrom].decimals)) >
328-
tokens[tokenFrom].balance
327+
convertBalanceToBigint(amountFrom, Number(tokens[tokenFrom]?.decimals) ?? 0n) >
328+
tokens[tokenFrom]?.balance ??
329+
0n
329330
) {
330331
return 'Insufficient balance'
331332
}
332333

333334
if (
334-
convertBalanceToBigint(amountFrom, Number(tokens[tokenFrom].decimals)) === 0n ||
335+
convertBalanceToBigint(amountFrom, Number(tokens[tokenFrom]?.decimals ?? 0n)) === 0n ||
335336
(simulateResult.poolKey === null && isError(SwapError.AmountIsZero))
336337
) {
337338
return 'Insufficient volume'
338339
}
339340

340341
if (
341342
tokenFrom !== null &&
342-
convertBalanceToBigint(amountFrom, Number(tokens[tokenFrom].decimals)) !== 0n &&
343+
convertBalanceToBigint(amountFrom, Number(tokens[tokenFrom]?.decimals ?? 0n)) !== 0n &&
343344
isError(SwapError.Unknown)
344345
) {
345346
return 'Not enough liquidity'

src/containers/NewPositionWrapper/NewPositionWrapper.tsx

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ import {
2424
getMockedTokenPrice,
2525
getNewTokenOrThrow,
2626
poolKeyToString,
27-
printBigint
27+
printBigint,
28+
tickerToAddress
2829
} from '@utils/utils'
2930
import { actions as poolsActions } from '@store/reducers/pools'
3031
import { actions, InitMidPrice, actions as positionsActions } from '@store/reducers/positions'
@@ -34,6 +35,8 @@ import { networkType } from '@store/selectors/connection'
3435
import {
3536
isLoadingLatestPoolsForTransaction,
3637
isLoadingTicksAndTickMaps,
38+
isLoadingTokens,
39+
isLoadingTokensError,
3740
poolKeys,
3841
pools,
3942
poolsArraySortedByFees
@@ -51,6 +54,7 @@ import { openWalletSelectorModal } from '@utils/web3/selector'
5154
import { VariantType } from 'notistack'
5255
import React, { useEffect, useMemo, useRef, useState } from 'react'
5356
import { useDispatch, useSelector } from 'react-redux'
57+
import { useNavigate } from 'react-router-dom'
5458

5559
export interface IProps {
5660
initialTokenFrom: string
@@ -105,6 +109,37 @@ export const NewPositionWrapper: React.FC<IProps> = ({
105109
const [isGetLiquidityError, setIsGetLiquidityError] = useState(false)
106110

107111
const isMountedRef = useRef(false)
112+
const navigate = useNavigate()
113+
const isCurrentlyLoadingTokens = useSelector(isLoadingTokens)
114+
const isCurrentlyLoadingTokensError = useSelector(isLoadingTokensError)
115+
116+
useEffect(() => {
117+
const tokensToFetch = []
118+
119+
if (initialTokenFrom && !tokens[tickerToAddress(initialTokenFrom)]) {
120+
tokensToFetch.push(tickerToAddress(initialTokenFrom))
121+
}
122+
123+
if (initialTokenTo && !tokens[tickerToAddress(initialTokenTo)]) {
124+
tokensToFetch.push(tickerToAddress(initialTokenTo))
125+
}
126+
127+
if (tokensToFetch.length) {
128+
dispatch(poolsActions.getTokens(tokensToFetch))
129+
} else {
130+
dispatch(poolsActions.addTokens({}))
131+
}
132+
}, [])
133+
134+
useEffect(() => {
135+
if (isCurrentlyLoadingTokensError) {
136+
if (tokens[tickerToAddress(initialTokenFrom)]) {
137+
navigate(`/newPosition/${initialTokenFrom}/${initialFee}`)
138+
} else if (tokens[tickerToAddress(initialTokenTo)]) {
139+
navigate(`/newPosition/${initialTokenTo}/${initialTokenTo}/${initialFee}`)
140+
}
141+
}
142+
}, [isCurrentlyLoadingTokensError])
108143

109144
useEffect(() => {
110145
dispatch(poolsActions.getPoolKeys())
@@ -661,6 +696,7 @@ export const NewPositionWrapper: React.FC<IProps> = ({
661696
isGetLiquidityError={isGetLiquidityError}
662697
onlyUserPositions={onlyUserPositions}
663698
setOnlyUserPositions={setOnlyUserPositions}
699+
isLoadingTokens={isCurrentlyLoadingTokens}
664700
/>
665701
)
666702
}

src/containers/WrappedSwap/WrappedSwap.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,22 @@ export const WrappedSwap = ({ initialTokenFrom, initialTokenTo }: Props) => {
9595
? tickerToAddress(initialTokenTo)
9696
: localStorage.getItem(`INVARIANT_LAST_TOKEN_TO_${network}`)
9797

98+
useEffect(() => {
99+
const tokens = []
100+
101+
if (lastTokenFrom && !tokensDict[lastTokenFrom]) {
102+
tokens.push(lastTokenFrom)
103+
}
104+
105+
if (lastTokenTo && !tokensDict[lastTokenTo]) {
106+
tokens.push(lastTokenTo)
107+
}
108+
109+
if (tokens.length) {
110+
dispatch(poolsActions.getTokens(tokens))
111+
}
112+
}, [])
113+
98114
const addTokenHandler = async (address: string) => {
99115
const psp22 = SingletonPSP22.getInstance()
100116

src/store/reducers/pools.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ export interface IPoolsStore {
3535
isLoadingLatestPoolsForTransaction: boolean
3636
isLoadingTicksAndTickMaps: boolean
3737
isLoadingPoolKeys: boolean
38+
isLoadingTokens: boolean
39+
isLoadingTokensError: boolean
3840
tickMaps: { [key in string]: string }
3941
}
4042

@@ -85,6 +87,8 @@ export const defaultState: IPoolsStore = {
8587
isLoadingLatestPoolsForTransaction: false,
8688
isLoadingTicksAndTickMaps: false,
8789
isLoadingPoolKeys: true,
90+
isLoadingTokens: true,
91+
isLoadingTokensError: false,
8892
tickMaps: {}
8993
}
9094

@@ -118,6 +122,7 @@ const poolsSlice = createSlice({
118122
...state.tokens,
119123
...action.payload
120124
}
125+
state.isLoadingTokens = false
121126
return state
122127
},
123128
updateTokenBalances(state, action: PayloadAction<[string, bigint][]>) {
@@ -203,6 +208,14 @@ const poolsSlice = createSlice({
203208
getTicksAndTickMaps(state, _action: PayloadAction<FetchTicksAndTickMaps>) {
204209
state.isLoadingTicksAndTickMaps = true
205210
return state
211+
},
212+
getTokens(state, _action: PayloadAction<string[]>) {
213+
state.isLoadingTokens = true
214+
return state
215+
},
216+
setTokensError(state, action: PayloadAction<boolean>) {
217+
state.isLoadingTokensError = action.payload
218+
return state
206219
}
207220
}
208221
})

src/store/sagas/pools.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,21 @@ export function* fetchTokens(poolsWithPoolKeys: PoolWithPoolKey[]) {
184184
yield* put(actions.updateTokenBalances(knownTokenBalances))
185185
}
186186

187+
export function* handleGetTokens(action: PayloadAction<string[]>) {
188+
const tokens = action.payload
189+
190+
const walletAddress = yield* select(address)
191+
const psp22 = yield* getPSP22()
192+
193+
try {
194+
const tokensData = yield* call(getTokenDataByAddresses, tokens, psp22, walletAddress)
195+
196+
yield* put(actions.addTokens(tokensData))
197+
} catch (e) {
198+
yield* put(actions.setTokensError(true))
199+
}
200+
}
201+
187202
export function* getPoolsDataForListHandler(): Generator {
188203
yield* takeEvery(actions.getPoolsDataForList, fetchPoolsDataForList)
189204
}
@@ -204,14 +219,19 @@ export function* getTicksAndTickMapsHandler(): Generator {
204219
yield* takeEvery(actions.getTicksAndTickMaps, fetchTicksAndTickMaps)
205220
}
206221

222+
export function* getTokensHandler(): Generator {
223+
yield* takeLatest(actions.getTokens, handleGetTokens)
224+
}
225+
207226
export function* poolsSaga(): Generator {
208227
yield all(
209228
[
210229
getPoolDataHandler,
211230
getPoolKeysHandler,
212231
getPoolsDataForListHandler,
213232
getAllPoolsForPairDataHandler,
214-
getTicksAndTickMapsHandler
233+
getTicksAndTickMapsHandler,
234+
getTokensHandler
215235
].map(spawn)
216236
)
217237
}

src/store/selectors/pools.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export const {
1313
tickMaps,
1414
nearestPoolTicksForPair,
1515
isLoadingTicksAndTickMaps,
16+
isLoadingTokens,
17+
isLoadingTokensError,
1618
isLoadingPoolKeys
1719
} = keySelectors(store, [
1820
'pools',
@@ -23,6 +25,8 @@ export const {
2325
'tickMaps',
2426
'nearestPoolTicksForPair',
2527
'isLoadingTicksAndTickMaps',
28+
'isLoadingTokens',
29+
'isLoadingTokensError',
2630
'isLoadingPoolKeys'
2731
])
2832

0 commit comments

Comments
 (0)