Skip to content

Commit bece223

Browse files
authored
Merge branch 'main' into feat/pool-address-in-url
2 parents a50463a + e12dcce commit bece223

File tree

44 files changed

+679
-491
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+679
-491
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Banner } from '@ui-kit/shared/ui/Banner'
2+
import { Stack } from '@mui/material'
3+
import { t } from '@ui-kit/lib/i18n'
4+
import { PoolUrlParams } from '../types/main.types'
5+
6+
const MonadBannerAlert = ({ params }: { params: PoolUrlParams }) => {
7+
const showFactoryStableNg11Banner = params.pool === 'factory-stable-ng-11' && params.network === 'monad'
8+
9+
if (showFactoryStableNg11Banner)
10+
return (
11+
<Stack>
12+
<Banner severity="alert">
13+
{t`This pool has been misconfigured. It has been set to withdraw only. To minimize impact withdraw in balanced proportion instead of single sided.`}
14+
</Banner>
15+
</Stack>
16+
)
17+
}
18+
19+
export default MonadBannerAlert

apps/main/src/dex/components/PagePool/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import useStore from '@/dex/store/useStore'
2121
import { getChainPoolIdActiveKey } from '@/dex/utils'
2222
import { getPath } from '@/dex/utils/utilsRouter'
2323
import { ManageGauge } from '@/dex/widgets/manage-gauge'
24+
import type { PoolUrlParams } from '@/dex/types/main.types'
2425
import Stack from '@mui/material/Stack'
2526
import AlertBox from '@ui/AlertBox'
2627
import { AppFormContentWrapper } from '@ui/AppForm'
@@ -45,6 +46,7 @@ import { t } from '@ui-kit/lib/i18n'
4546
import { REFRESH_INTERVAL } from '@ui-kit/lib/model'
4647
import { type TabOption, TabsSwitcher } from '@ui-kit/shared/ui/TabsSwitcher'
4748
import { SizesAndSpaces } from '@ui-kit/themes/design/1_sizes_spaces'
49+
import MonadBannerAlert from '../MonadBannerAlert'
4850

4951
const DEFAULT_SEED: Seed = { isSeed: null, loaded: false }
5052
const { MaxWidth } = SizesAndSpaces
@@ -56,7 +58,6 @@ const Transfer = (pageTransferProps: PageTransferProps) => {
5658
const { signerAddress } = curve ?? {}
5759
const push = useNavigate()
5860
const poolAlert = usePoolAlert(poolData)
59-
6061
const { tokensMapper } = useTokensMapper(rChainId)
6162
const userPoolActiveKey = curve && poolId ? getUserPoolActiveKey(curve, poolId) : ''
6263
const chainIdPoolId = getChainPoolIdActiveKey(rChainId, poolId)
@@ -207,6 +208,7 @@ const Transfer = (pageTransferProps: PageTransferProps) => {
207208

208209
return (
209210
<>
211+
<MonadBannerAlert params={params as PoolUrlParams} />
210212
<AppPageFormContainer isAdvanceMode={true}>
211213
<AppPageFormsWrapper className="grid-transfer">
212214
<Stack

apps/main/src/dex/hooks/usePoolAlert.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,18 @@ const usePoolAlert = (poolData?: PoolData | PoolDataCache) => {
207207
),
208208
})
209209

210+
// Pool creator configured a price feed instead of redemption rates for stored_rates, leading to users losing funds when swapping.
211+
const monadEthConverterAlert = (): PoolAlert => ({
212+
alertType: 'danger',
213+
isDisableDeposit: true,
214+
isDisableSwap: true,
215+
message: (
216+
<MessageWrapper>
217+
<div>This pool is in withdraw only mode, as it has been configured incorrectly.</div>
218+
</MessageWrapper>
219+
),
220+
})
221+
210222
// prettier-ignore
211223
const alerts: { [poolAddress: string]: PoolAlert } = {
212224
// ethereum
@@ -235,6 +247,9 @@ const usePoolAlert = (poolData?: PoolData | PoolDataCache) => {
235247

236248
// avalanche
237249
'0xb755b949c126c04e0348dd881a5cf55d424742b2': atricryptoAlert(),
250+
251+
// monad
252+
'0x2fd13b49f970e8c6d89283056c1c6281214b7eb6': monadEthConverterAlert()
238253
}
239254

240255
if (poolAddress) {

apps/main/src/dex/lib/networks.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ export const defaultNetworks = Object.entries({
144144
twocryptoFactoryOld: true,
145145
twocryptoFactory: true,
146146
tricryptoFactory: true,
147+
fxswapFactory: true,
147148
hasFactory: true,
148149
pricesApi: true,
149150
},

apps/main/src/lend/components/AlertNoLoanFound.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const AlertNoLoanFound = ({ alertType, owmId }: { alertType?: AlertType; owmId:
2525
size="large"
2626
onClick={() => {
2727
setStateByKeyMarkets('marketDetailsView', 'market')
28-
push(getLoanCreatePathname(params, owmId, 'create'))
28+
push(getLoanCreatePathname(params, owmId))
2929
}}
3030
>
3131
Create loan
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { useCallback } from 'react'
2+
import LoanFormCreate from '@/lend/components/PageLoanCreate/LoanFormCreate'
3+
import type { FormValues } from '@/lend/components/PageLoanCreate/types'
4+
import { DEFAULT_FORM_VALUES } from '@/lend/components/PageLoanCreate/utils'
5+
import networks from '@/lend/networks'
6+
import useStore from '@/lend/store/useStore'
7+
import { type MarketUrlParams, type PageContentProps } from '@/lend/types/lend.types'
8+
import { CreateLoanForm } from '@/llamalend/features/borrow/components/CreateLoanForm'
9+
import type { OnBorrowFormUpdate } from '@/llamalend/features/borrow/types'
10+
import { hasLeverage } from '@/llamalend/llama.utils'
11+
import { useCreateLoanMuiForm } from '@ui-kit/hooks/useFeatureFlags'
12+
import { t } from '@ui-kit/lib/i18n'
13+
import { type FormTab, FormTabs } from '@ui-kit/shared/ui/FormTabs/FormTabs'
14+
15+
type CreateLoanProps = PageContentProps<MarketUrlParams>
16+
17+
/**
18+
* Callback that synchronizes the `ChartOhlc` component with the `RangeSlider` component in the new `BorrowTabContents`.
19+
*/
20+
const useOnFormUpdate = ({ api, market }: Pick<CreateLoanProps, 'api' | 'market'>): OnBorrowFormUpdate =>
21+
useCallback(
22+
async ({ debt, userCollateral, range, slippage, leverageEnabled }) => {
23+
const { setFormValues, setStateByKeys } = useStore.getState().loanCreate
24+
const formValues: FormValues = {
25+
...DEFAULT_FORM_VALUES,
26+
n: range,
27+
debt: `${debt ?? ''}`,
28+
userCollateral: `${userCollateral ?? ''}`,
29+
}
30+
await setFormValues(api, market, formValues, `${slippage}`, leverageEnabled)
31+
setStateByKeys({ isEditLiqRange: true })
32+
},
33+
[api, market],
34+
)
35+
36+
function CreateLoanTab({ market, api, rChainId }: CreateLoanProps) {
37+
const onLoanCreated = useStore((state) => state.loanCreate.onLoanCreated)
38+
const onCreated = useCallback(
39+
async () => api && market && (await onLoanCreated(api, market)),
40+
[api, market, onLoanCreated],
41+
)
42+
const onUpdate = useOnFormUpdate({ market, api })
43+
return (
44+
<CreateLoanForm networks={networks} chainId={rChainId} market={market} onUpdate={onUpdate} onCreated={onCreated} />
45+
)
46+
}
47+
48+
const LendCreateTabsNewMenu = [
49+
{ value: 'create', label: t`Borrow`, component: CreateLoanTab },
50+
] satisfies FormTab<CreateLoanProps>[]
51+
52+
const LendCreateTabsOldMenu = [
53+
{ value: 'create', label: t`Create Loan`, component: LoanFormCreate },
54+
{
55+
value: 'leverage',
56+
label: t`Leverage`,
57+
component: (p) => <LoanFormCreate {...p} isLeverage />,
58+
visible: ({ market }) => market && hasLeverage(market),
59+
},
60+
] satisfies FormTab<CreateLoanProps>[]
61+
62+
export const LoanCreateTabs = (pageProps: CreateLoanProps) => {
63+
const menu = useCreateLoanMuiForm() ? LendCreateTabsNewMenu : LendCreateTabsOldMenu
64+
const shouldWrap = menu === LendCreateTabsOldMenu
65+
return <FormTabs params={pageProps} menu={menu} shouldWrap={shouldWrap} />
66+
}

apps/main/src/lend/components/PageLoanCreate/LoanFormCreate/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ const LoanCreate = ({
412412
size="large"
413413
onClick={() => {
414414
setStateByKeyMarkets('marketDetailsView', 'user')
415-
push(getLoanManagePathname(params, rOwmId, 'loan'))
415+
push(getLoanManagePathname(params, rOwmId))
416416
}}
417417
>
418418
Manage loan
@@ -431,7 +431,7 @@ const LoanCreate = ({
431431
)}
432432
{steps && <Stepper steps={steps} />}
433433
{formStatus.isComplete && market && (
434-
<LinkButton variant="filled" size="large" href={getLoanManagePathname(params, market.id, 'loan')}>
434+
<LinkButton variant="filled" size="large" href={getLoanManagePathname(params, market.id)}>
435435
Manage loan
436436
</LinkButton>
437437
)}

apps/main/src/lend/components/PageLoanCreate/Page.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Address } from 'viem'
33
import CampaignRewardsBanner from '@/lend/components/CampaignRewardsBanner'
44
import { MarketInformationComp } from '@/lend/components/MarketInformationComp'
55
import { MarketInformationTabs } from '@/lend/components/MarketInformationTabs'
6-
import LoanCreate from '@/lend/components/PageLoanCreate/index'
6+
import { LoanCreateTabs } from '@/lend/components/PageLoanCreate/LoanCreateTabs'
77
import { useOneWayMarket } from '@/lend/entities/chain'
88
import { useLendPageTitle } from '@/lend/hooks/useLendPageTitle'
99
import { useMarketDetails } from '@/lend/hooks/useMarketDetails'
@@ -35,7 +35,7 @@ const { Spacing } = SizesAndSpaces
3535

3636
const Page = () => {
3737
const params = useParams<MarketUrlParams>()
38-
const { rMarket, rChainId, rFormType } = parseMarketParams(params)
38+
const { rMarket, rChainId } = parseMarketParams(params)
3939

4040
const { data: market, isSuccess } = useOneWayMarket(rChainId, rMarket)
4141
const { llamaApi: api = null, connectState } = useConnection()
@@ -88,7 +88,6 @@ const Page = () => {
8888
params,
8989
rChainId,
9090
rOwmId,
91-
rFormType,
9291
api,
9392
market,
9493
titleMapper,
@@ -97,7 +96,7 @@ const Page = () => {
9796
}
9897
const positionDetailsHrefs = {
9998
borrow: '',
100-
supply: getVaultPathname(params, rOwmId, 'deposit'),
99+
supply: getVaultPathname(params, rOwmId),
101100
}
102101

103102
return isSuccess && !market ? (
@@ -106,7 +105,7 @@ const Page = () => {
106105
<>
107106
<DetailPageStack>
108107
<AppPageFormsWrapper data-testid="form-wrapper">
109-
{rChainId && rOwmId && <LoanCreate {...pageProps} params={params} />}
108+
{rChainId && rOwmId && <LoanCreateTabs {...pageProps} params={params} />}
110109
</AppPageFormsWrapper>
111110
<Stack flexDirection="column" flexGrow={1} sx={{ gap: Spacing.md }}>
112111
<CampaignRewardsBanner

apps/main/src/lend/components/PageLoanCreate/index.tsx

Lines changed: 0 additions & 103 deletions
This file was deleted.

apps/main/src/lend/components/PageLoanCreate/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
import type { HealthMode } from '@/llamalend/llamalend.types'
1111
import type { Step } from '@ui/Stepper/types'
1212

13-
export type FormType = 'create' | 'vault' | 'leverage'
1413
export type StepKey = 'APPROVAL' | 'CREATE' | ''
1514
export type InpError = 'too-much' | 'too-much-max' | ''
1615

0 commit comments

Comments
 (0)