Skip to content

Commit ee6e161

Browse files
authored
Merge branch 'main' into refactor/user-balances-tanstack-query
2 parents f97ca3b + 8dc6398 commit ee6e161

File tree

3 files changed

+121
-7
lines changed

3 files changed

+121
-7
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { DEFAULT_FORM_STATUS } from '@/loan/store/createLoanCollateralIncreaseSl
1717
import useStore from '@/loan/store/useStore'
1818
import { CollateralAlert, LlamaApi, Llamma } from '@/loan/types/loan.types'
1919
import { curveProps } from '@/loan/utils/helpers'
20-
import { hasV1Deleverage } from '@/loan/utils/leverage'
20+
import { hasDeleverage } from '@/loan/utils/leverage'
2121
import { getStepStatus, getTokenName } from '@/loan/utils/utilsLoan'
2222
import { getLoanManagePathname } from '@/loan/utils/utilsRouter'
2323
import Accordion from '@ui/Accordion'
@@ -439,7 +439,7 @@ const LoanCreate = ({
439439
<Box grid gridRowGap={2}>
440440
<p>{t`You can leverage your collateral up to 9x. This has the effect of repeat trading crvUSD to collateral and depositing to maximize your collateral position. Essentially, all borrowed crvUSD is utilized to purchase more collateral.`}</p>
441441
<p>{t`Be careful, if the collateral price dips, you would need to repay the entire amount to reclaim your initial position.`}</p>
442-
{!hasV1Deleverage(llamma) && (
442+
{!hasDeleverage(llamma) && (
443443
<p>{t`WARNING: The corresponding deleverage button is also not yet available.`}</p>
444444
)}
445445
</Box>

apps/main/src/loan/lib/apiCrvusd.ts

Lines changed: 87 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,18 @@ const loanCreate = {
331331
) => {
332332
log('loanEstGas', llamma.collateralSymbol, collateral, debt, n, maxSlippage)
333333
const resp = { activeKey, isApproved: false, estimatedGas: initialGas, error: '' }
334+
const userBorrowed = '0' // hardcode to zero as that's not displayed in the form
334335

335336
try {
337+
if (isLeverage && hasV2Leverage(llamma)) {
338+
await llamma.leverageV2.createLoanExpectedCollateral(collateral, userBorrowed, debt, +maxSlippage)
339+
resp.isApproved = await llamma.leverageV2.createLoanIsApproved(collateral, userBorrowed)
340+
resp.estimatedGas = resp.isApproved
341+
? await llamma.leverageV2.estimateGas.createLoan(collateral, userBorrowed, debt, n, +maxSlippage)
342+
: await llamma.leverageV2.estimateGas.createLoanApprove(collateral, userBorrowed)
343+
return resp
344+
}
345+
336346
resp.isApproved = isLeverage
337347
? await llamma.leverage.createLoanIsApproved(collateral)
338348
: await llamma.createLoanIsApproved(collateral)
@@ -390,8 +400,54 @@ const loanCreate = {
390400
maxSlippage: string,
391401
) => {
392402
log('detailInfoLeverage', llamma.collateralSymbol, userCollateral, debt, n, maxSlippage)
403+
const userBorrowed = '0' // hardcode to zero as that's not displayed in the form
393404

394405
try {
406+
if (hasV2Leverage(llamma)) {
407+
// Expected collateral must run first to populate swap data cache used by other calls
408+
const expectedCollateralResult = await llamma.leverageV2.createLoanExpectedCollateral(
409+
userCollateral,
410+
userBorrowed,
411+
debt,
412+
+maxSlippage,
413+
)
414+
const [
415+
maxRangeResult,
416+
loanBandsResult,
417+
loanPricesResult,
418+
loanHealthFullResult,
419+
loanHealthNotFullResult,
420+
priceImpactResult,
421+
] = await Promise.allSettled([
422+
llamma.leverageV2.createLoanMaxRange(userCollateral, userBorrowed, debt),
423+
llamma.leverageV2.createLoanBands(userCollateral, userBorrowed, debt, n),
424+
llamma.leverageV2.createLoanPrices(userCollateral, userBorrowed, debt, n),
425+
llamma.leverageV2.createLoanHealth(userCollateral, userBorrowed, debt, n, true),
426+
llamma.leverageV2.createLoanHealth(userCollateral, userBorrowed, debt, n, false),
427+
llamma.leverageV2.createLoanPriceImpact(userBorrowed, debt),
428+
])
429+
430+
const expectedCollateral = expectedCollateralResult
431+
const priceImpact = fulfilledValue(priceImpactResult) ?? ''
432+
433+
return {
434+
activeKey,
435+
resp: {
436+
collateral: expectedCollateral?.totalCollateral ?? '',
437+
leverage: expectedCollateral?.leverage ?? '',
438+
routeName: '',
439+
maxRange: fulfilledValue(maxRangeResult) ?? null,
440+
bands: reverseBands(fulfilledValue(loanBandsResult) ?? [0, 0]),
441+
prices: fulfilledValue(loanPricesResult) ?? [],
442+
healthFull: fulfilledValue(loanHealthFullResult) ?? '',
443+
healthNotFull: fulfilledValue(loanHealthNotFullResult) ?? '',
444+
priceImpact,
445+
isHighImpact: +priceImpact > 0 && +maxSlippage > 0 ? +priceImpact > +maxSlippage : false,
446+
error: '',
447+
},
448+
}
449+
}
450+
395451
const { collateral, leverage, routeIdx } = await llamma.leverage.createLoanCollateral(userCollateral, debt)
396452
const [
397453
routeNameResult,
@@ -459,21 +515,29 @@ const loanCreate = {
459515
const liqRangesList: LiqRange[] = []
460516
const liqRangesListMapper: { [n: string]: LiqRange & { sliderIdx: number } } = {}
461517
let sliderIdx = 0
518+
const isV2LeverageSupported = hasV2Leverage(llamma)
519+
const userBorrowed = '0' // hardcode to zero as that's not displayed in the form
462520

463521
const [maxRecvsResults, loanBandsResults, loanPricesResults] = await Promise.allSettled([
464522
haveCollateral
465523
? isLeverage
466-
? llamma.leverage.createLoanMaxRecvAllRanges(collateral)
524+
? isV2LeverageSupported
525+
? llamma.leverageV2.createLoanMaxRecvAllRanges(collateral, userBorrowed)
526+
: llamma.leverage.createLoanMaxRecvAllRanges(collateral)
467527
: llamma.createLoanMaxRecvAllRanges(collateral)
468528
: null,
469529
haveCollateral && haveDebt
470530
? isLeverage
471-
? llamma.leverage.createLoanBandsAllRanges(collateral, debt)
531+
? isV2LeverageSupported
532+
? llamma.leverageV2.createLoanBandsAllRanges(collateral, userBorrowed, debt)
533+
: llamma.leverage.createLoanBandsAllRanges(collateral, debt)
472534
: llamma.createLoanBandsAllRanges(collateral, debt)
473535
: null,
474536
haveCollateral && haveDebt
475537
? isLeverage
476-
? llamma.leverage.createLoanPricesAllRanges(collateral, debt)
538+
? isV2LeverageSupported
539+
? llamma.leverageV2.createLoanPricesAllRanges(collateral, userBorrowed, debt)
540+
: llamma.leverage.createLoanPricesAllRanges(collateral, debt)
477541
: llamma.createLoanPricesAllRanges(collateral, debt)
478542
: null,
479543
])
@@ -523,7 +587,19 @@ const loanCreate = {
523587
maxRecvLeverage: async (activeKey: string, llamma: Llamma, collateral: string, n: number) => {
524588
log('maxRecvLeverage', llamma.collateralSymbol, collateral, n)
525589
let resp: MaxRecvLeverageForm = { maxBorrowable: '', maxCollateral: '', leverage: '', routeIdx: null }
590+
const userBorrowed = '0' // hardcode to zero as that's not displayed in the form
526591
try {
592+
if (hasV2Leverage(llamma)) {
593+
const result = await llamma.leverageV2.createLoanMaxRecv(collateral, userBorrowed, n)
594+
resp = {
595+
maxBorrowable: result.maxDebt,
596+
maxCollateral: result.maxTotalCollateral,
597+
leverage: result.maxLeverage,
598+
routeIdx: null,
599+
}
600+
return { activeKey, resp, error: '' }
601+
}
602+
527603
resp = await llamma.leverage.createLoanMaxRecv(collateral, n)
528604
return { activeKey, resp, error: '' }
529605
} catch (error) {
@@ -534,9 +610,12 @@ const loanCreate = {
534610
approve: async (activeKey: string, provider: Provider, llamma: Llamma, isLeverage: boolean, collateral: string) => {
535611
log('createLoanApprove', llamma.collateralSymbol, isLeverage ? 'leverage' : '', collateral)
536612
const resp = { activeKey, hashes: [] as string[], error: '' }
613+
const userBorrowed = '0' // hardcode to zero as that's not displayed in the form
537614
try {
538615
resp.hashes = isLeverage
539-
? await llamma.leverage.createLoanApprove(collateral)
616+
? hasV2Leverage(llamma)
617+
? await llamma.leverageV2.createLoanApprove(collateral, userBorrowed)
618+
: await llamma.leverage.createLoanApprove(collateral)
540619
: await llamma.createLoanApprove(collateral)
541620
await waitForTransactions(resp.hashes, provider)
542621
return resp
@@ -558,9 +637,12 @@ const loanCreate = {
558637
) => {
559638
log('loanCreate', llamma.collateralSymbol, isLeverage ? 'isLeverage' : '', collateral, debt, n, maxSlippage)
560639
const resp = { activeKey, hash: '', error: '' }
640+
const userBorrowed = '0' // hardcode to zero as that's not displayed in the form
561641
try {
562642
resp.hash = isLeverage
563-
? await llamma.leverage.createLoan(collateral, debt, n, +maxSlippage)
643+
? hasV2Leverage(llamma)
644+
? await llamma.leverageV2.createLoan(collateral, userBorrowed, debt, n, +maxSlippage)
645+
: await llamma.leverage.createLoan(collateral, debt, n, +maxSlippage)
564646
: await llamma.createLoan(collateral, debt, n)
565647
await waitForTransaction(resp.hash, provider)
566648
return resp

packages/curve-ui-kit/src/shared/ui/stories/LargeTokenInput.stories.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ const meta: Meta<typeof LargeTokenInput> = {
106106
control: 'number',
107107
description: 'Optional dollar value of the given input balance',
108108
},
109+
children: {
110+
control: 'object',
111+
description: 'Optional children to be rendered below the input',
112+
},
109113
},
110114
args: {
111115
walletBalance: TOKEN_OPTIONS[0].walletBalance,
@@ -233,4 +237,32 @@ export const WithReactNodeMessage: Story = {
233237
},
234238
}
235239

240+
export const WithChildren: Story = {
241+
args: {
242+
children: (
243+
<Stack
244+
spacing={1}
245+
sx={{
246+
padding: 2,
247+
backgroundColor: (t) => t.design.Layer[2].Fill,
248+
}}
249+
>
250+
<Typography variant="bodyMBold">Additional Content</Typography>
251+
<Typography variant="bodySRegular" color="textSecondary">
252+
The children prop allows you to render custom content below the input. This can be useful for displaying
253+
additional information, actions, or any other custom UI elements.
254+
</Typography>
255+
</Stack>
256+
),
257+
},
258+
render: (args) => <LargeTokenInputWithTokenSelector {...args} />,
259+
parameters: {
260+
docs: {
261+
description: {
262+
story: 'Large token input with custom children content rendered below the input',
263+
},
264+
},
265+
},
266+
}
267+
236268
export default meta

0 commit comments

Comments
 (0)