Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
5120611
feat: layer 1 fill to collateral sub tabs
0xPearce Nov 27, 2025
c2f1d4f
feat: add collateral usd rate for input and token balance
0xPearce Nov 28, 2025
49c3571
feat: input balance usd
0xPearce Nov 28, 2025
1fb7656
refactor: loan info accordion with prev and current helper
0xPearce Nov 28, 2025
23ce0e1
feat: previous collateral, debt, ltv and health to form
0xPearce Nov 28, 2025
2b8fffb
refactor: handle prev and current values in the action info
0xPearce Dec 1, 2025
6c2bc46
fix: token address already handled by validation suite
0xPearce Dec 1, 2025
cebd7b7
feat: added collateral greater than wallet balance error to validatio…
0xPearce Dec 1, 2025
9dcfe73
feat: improve add collateral button label
0xPearce Dec 1, 2025
1e876e2
fix: add collateral approve estimate gas query
0xPearce Dec 1, 2025
b99b20d
feat: remove min height from AppFormContentWrapper
0xPearce Dec 2, 2025
d098bf6
feat: fire icon to transaction action info
0xPearce Dec 2, 2025
ec65aa4
feat: layer 1 fill subtabs for lend markets
0xPearce Dec 2, 2025
0486409
fix: review minor changes and optimizations
0xPearce Dec 2, 2025
257b2d4
fix: sub tabs labels
0xPearce Dec 3, 2025
ad4f8af
fix: validation user collateral triggered when user collateral is 0
0xPearce Dec 3, 2025
374a0e7
feat: loan accordion spacing
0xPearce Dec 3, 2025
1fe14fa
feat: show usd rate when no input value
0xPearce Dec 3, 2025
6adf3ed
refactor: form alert position
0xPearce Dec 3, 2025
c4949b0
feat: resolved custom alert form errors
0xPearce Dec 3, 2025
9122063
feat: removed error notification
0xPearce Dec 3, 2025
62afec5
refactor: expected collateral using bignumber
0xPearce Dec 4, 2025
c0cffef
feat: general error message for toast
0xPearce Dec 4, 2025
ead4f8b
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 4, 2025
74f5cf4
refactor: get message error helper for loan and lend into llamalend
0xPearce Dec 4, 2025
8fabbbf
refactor: use getErrorMessage from llamalend
0xPearce Dec 4, 2025
1875f8e
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 4, 2025
0710721
chore: format
0xPearce Dec 4, 2025
737110d
refactor: pass user state to the loan info accordion
0xPearce Dec 5, 2025
6714195
chore: docs and small optimization
0xPearce Dec 5, 2025
4da5349
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 5, 2025
f4905cb
refactor: moved withTokenSymbol to llamalend utils
0xPearce Dec 5, 2025
ee3c124
fix: pass expectedBorrowed to loan to value calculation
0xPearce Dec 5, 2025
2099feb
refactor: expected collateral calculation
0xPearce Dec 5, 2025
40891a8
feat: added prev LTV, LTV, expected collateral and prev health to Rem…
0xPearce Dec 8, 2025
65b645e
feat: custom position balance to LoanFormTokenInput
0xPearce Dec 8, 2025
8661665
feat: custom position balance to LTI stories
0xPearce Dec 8, 2025
cd58063
refactor: position balance
0xPearce Dec 8, 2025
0aefe06
fix: position balance array deps freezing loan form token input
0xPearce Dec 9, 2025
7832bd6
refactor: collateral form validation suite with custom position for a…
0xPearce Dec 9, 2025
96a7850
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 10, 2025
b365dd7
Merge branch 'feat/add-collateral-form' into feat/remove-collateral-form
0xPearce Dec 10, 2025
cecc493
fix: collateral sub tabs naming and color
0xPearce Dec 10, 2025
a23fcab
fix: token input freeze by enabling queries with form.isValid
0xPearce Dec 10, 2025
e8052eb
fix: enable new LTV query when user collateral value exist
0xPearce Dec 10, 2025
2910e85
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 10, 2025
0a4a733
refactor: hooks moved into useAddCollateralForm
0xPearce Dec 10, 2025
6ae504e
Merge branch 'feat/add-collateral-form' into feat/remove-collateral-form
0xPearce Dec 10, 2025
89fc65b
refactor: hooks moved into useRemoveCollateralForm
0xPearce Dec 10, 2025
06ab6c4
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 11, 2025
b44d053
Merge branch 'feat/add-collateral-form' into feat/remove-collateral-form
0xPearce Dec 11, 2025
c88be3b
refactor: LoanInfoAccordion ternary and gaps
0xPearce Dec 12, 2025
c390786
feat: combine gas estimation for approval and add collateral if not a…
0xPearce Dec 13, 2025
fff1f4e
refactor: deduce userState type from query
0xPearce Dec 13, 2025
1cddcf3
fix: check for empty string in Action Info
0xPearce Dec 13, 2025
7b9be3a
refactor: tokenSymbol part of query's data
0xPearce Dec 13, 2025
4ba0d56
refactor: combine query state
0xPearce Dec 13, 2025
6ee365c
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 13, 2025
40f91f8
Merge branch 'feat/add-collateral-form' into feat/remove-collateral-form
0xPearce Dec 13, 2025
64c86d0
fix: tokenSymbol part of query's data
0xPearce Dec 13, 2025
88f912a
refactor: hardcode LlamaIcon for position balance and improve code re…
0xPearce Dec 13, 2025
2a4c061
Merge pull request #1748 from curvefi/feat/remove-collateral-form
0xPearce Dec 13, 2025
7e6d82c
refactor: improve code readibility for collateral form hooks + docs
0xPearce Dec 16, 2025
c223982
Merge branch 'main' into feat/add-collateral-form
0xPearce Dec 16, 2025
4a56ff7
feat: remove duplicate max collateral LTI message
0xPearce Dec 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions apps/main/src/lend/components/PageLoanManage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ const tabsLoan: TabOption<LoanFormType>[] = [
]

const tabsCollateral: TabOption<CollateralFormType>[] = [
{ value: 'collateral-increase', label: t`Add collateral` },
{ value: 'collateral-decrease', label: t`Remove collateral` },
{ value: 'collateral-increase', label: t`Add` },
{ value: 'collateral-decrease', label: t`Remove` },
]

const ManageLoan = (pageProps: PageContentProps & { params: MarketUrlParams }) => {
Expand Down Expand Up @@ -81,6 +81,7 @@ const ManageLoan = (pageProps: PageContentProps & { params: MarketUrlParams }) =
onChange={setSubTab}
options={subTabs}
fullWidth
sx={{ backgroundColor: (t) => t.design.Layer[1].Fill }}
/>

{subTab === 'loan-increase' && (
Expand Down
3 changes: 2 additions & 1 deletion apps/main/src/lend/lib/apiLending.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ import {
UserMarketBalances,
} from '@/lend/types/lend.types'
import { OneWayMarketTemplate } from '@/lend/types/lend.types'
import { fulfilledValue, getErrorMessage, log } from '@/lend/utils/helpers'
import { fulfilledValue, log } from '@/lend/utils/helpers'
import { getErrorMessage } from '@/llamalend/helpers'
import { getIsUserCloseToLiquidation, getLiquidationStatus, reverseBands, sortBandsLend } from '@/llamalend/llama.utils'
import PromisePool from '@supercharge/promise-pool'
import type { StepStatus } from '@ui/Stepper/types'
Expand Down
8 changes: 0 additions & 8 deletions apps/main/src/lend/utils/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,6 @@ export function getErrorMessage(error: CustomError, defaultErrorMessage: string)
return errorMessage
}

export function scrollToTop() {
window.scroll({
top: 0,
left: 0,
behavior: 'smooth',
})
}

export function fulfilledValue<T>(result: PromiseSettledResult<T>) {
if (result.status === 'fulfilled') {
return result.value
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { useLoanToValueFromUserState } from '@/llamalend/features/manage-loan/hooks/useLoanToValueFromUserState'
import type { LlamaMarketTemplate, NetworkDict } from '@/llamalend/llamalend.types'
import type { AddCollateralOptions } from '@/llamalend/mutations/add-collateral.mutation'
import { useMarketRates } from '@/llamalend/queries/market-rates'
import { LoanFormAlerts } from '@/llamalend/widgets/manage-loan/LoanFormAlerts'
import { LoanFormTokenInput } from '@/llamalend/widgets/manage-loan/LoanFormTokenInput'
import { LoanFormWrapper } from '@/llamalend/widgets/manage-loan/LoanFormWrapper'
Expand Down Expand Up @@ -35,55 +33,55 @@ export const AddCollateralForm = <ChainId extends IChainId>({
isPending,
onSubmit,
action,
params,
values,
bands,
health,
prices,
gas,
isApproved,
formErrors,
collateralToken,
borrowToken,
txHash,
userState,
expectedCollateral,
prevHealth,
marketRates,
prevLoanToValue,
loanToValue,
} = useAddCollateralForm({
market,
network,
networks,
enabled,
onAdded,
isAccordionOpen: isOpen,
})

const marketRates = useMarketRates(params, isOpen)

return (
<LoanFormWrapper
{...form}
onSubmit={onSubmit}
infoAccordion={
<LoanInfoAccordion // todo: prevHealth, prevRates, debt, prevDebt
<LoanInfoAccordion // todo: prevRates
isOpen={isOpen}
toggle={toggle}
prevHealth={prevHealth}
health={health}
bands={bands}
prices={prices}
rates={marketRates}
loanToValue={useLoanToValueFromUserState({
chainId: params.chainId!,
marketId: params.marketId,
userAddress: params.userAddress,
collateralToken,
borrowToken,
enabled: isOpen,
collateralDelta: values.userCollateral,
})}
prevLoanToValue={prevLoanToValue}
loanToValue={loanToValue}
userState={{
...userState,
borrowTokenSymbol: borrowToken?.symbol,
collateralTokenSymbol: collateralToken?.symbol,
}}
gas={gas}
collateral={expectedCollateral}
/>
}
>
<Stack divider={<InputDivider />}>
<LoanFormTokenInput
label={t`Collateral`}
label={t`Amount to Add`}
token={collateralToken}
blockchainId={network.id}
name="userCollateral"
Expand All @@ -93,15 +91,6 @@ export const AddCollateralForm = <ChainId extends IChainId>({
/>
</Stack>

<Button
type="submit"
loading={isPending || !market}
disabled={formErrors.length > 0}
data-testid="add-collateral-submit-button"
>
{isPending ? t`Processing...` : isApproved.data ? t`Add collateral` : t`Approve & Add collateral`}
</Button>

<LoanFormAlerts
isSuccess={action.isSuccess}
error={action.error}
Expand All @@ -111,6 +100,19 @@ export const AddCollateralForm = <ChainId extends IChainId>({
handledErrors={['userCollateral']}
successTitle={t`Collateral added`}
/>

<Button
type="submit"
loading={isPending || !market}
disabled={formErrors.length > 0}
data-testid="add-collateral-submit-button"
>
{isPending
? t`Processing...`
: isApproved.data || isApproved.isPending || !values.userCollateral
? t`Add collateral`
: t`Approve & Add collateral`}
</Button>
</LoanFormWrapper>
)
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { useLoanToValueFromUserState } from '@/llamalend/features/manage-loan/hooks/useLoanToValueFromUserState'
import type { LlamaMarketTemplate, NetworkDict } from '@/llamalend/llamalend.types'
import type { RemoveCollateralOptions } from '@/llamalend/mutations/remove-collateral.mutation'
import { useMarketRates } from '@/llamalend/queries/market-rates'
import { LoanFormAlerts } from '@/llamalend/widgets/manage-loan/LoanFormAlerts'
import { LoanFormTokenInput } from '@/llamalend/widgets/manage-loan/LoanFormTokenInput'
import { LoanFormWrapper } from '@/llamalend/widgets/manage-loan/LoanFormWrapper'
Expand All @@ -11,9 +9,7 @@ import Button from '@mui/material/Button'
import Stack from '@mui/material/Stack'
import { useSwitch } from '@ui-kit/hooks/useSwitch'
import { t } from '@ui-kit/lib/i18n'
import { Balance } from '@ui-kit/shared/ui/Balance'
import { InputDivider } from '../../../widgets/InputDivider'
import { setValueOptions } from '../../borrow/react-form.utils'
import { useRemoveCollateralForm } from '../hooks/useRemoveCollateralForm'

export const RemoveCollateralForm = <ChainId extends IChainId>({
Expand All @@ -38,86 +34,67 @@ export const RemoveCollateralForm = <ChainId extends IChainId>({
onSubmit,
action,
maxRemovable,
params,
values,
bands,
health,
prices,
gas,
formErrors,
collateralToken,
borrowToken,
txHash,
userState,
expectedCollateral,
prevHealth,
marketRates,
prevLoanToValue,
loanToValue,
} = useRemoveCollateralForm({
market,
network,
networks,
enabled,
onRemoved,
isAccordionOpen: isOpen,
})

const marketRates = useMarketRates(params, isOpen)

return (
<LoanFormWrapper
{...form}
onSubmit={onSubmit}
infoAccordion={
<LoanInfoAccordion // todo: prevHealth, prevRates, debt, prevDebt
<LoanInfoAccordion // todo: prevRates
isOpen={isOpen}
toggle={toggle}
prevHealth={prevHealth}
health={health}
bands={bands}
prices={prices}
rates={marketRates}
loanToValue={useLoanToValueFromUserState({
chainId: params.chainId!,
marketId: params.marketId,
userAddress: params.userAddress,
collateralToken,
borrowToken,
enabled: isOpen,
collateralDelta:
values.userCollateral != null
? (`-${values.userCollateral}` as unknown as import('@ui-kit/utils').Decimal)
: undefined,
})}
prevLoanToValue={prevLoanToValue}
loanToValue={loanToValue}
userState={{
...userState,
borrowTokenSymbol: borrowToken?.symbol,
collateralTokenSymbol: collateralToken?.symbol,
}}
gas={gas}
collateral={expectedCollateral}
/>
}
>
<Stack divider={<InputDivider />}>
<LoanFormTokenInput
label={t`Collateral`}
label={t`Amount to Remove`}
token={collateralToken}
blockchainId={network.id}
name="userCollateral"
form={form}
max={maxRemovable}
testId="remove-collateral-input"
network={network}
message={
<Balance
prefix={t`Max removable:`}
tooltip={t`Max removable`}
symbol={collateralToken?.symbol}
balance={maxRemovable.data}
loading={maxRemovable.isLoading}
onClick={() => form.setValue('userCollateral', maxRemovable.data, setValueOptions)}
/>
}
positionBalance={{
position: maxRemovable,
tooltip: t`Max Removable Collateral`,
}}
/>
</Stack>

<Button
type="submit"
loading={isPending || !market}
disabled={formErrors.length > 0}
data-testid="remove-collateral-submit-button"
>
{isPending ? t`Processing...` : t`Remove collateral`}
</Button>

<LoanFormAlerts
isSuccess={action.isSuccess}
error={action.error}
Expand All @@ -127,6 +104,15 @@ export const RemoveCollateralForm = <ChainId extends IChainId>({
handledErrors={['userCollateral']}
successTitle={t`Collateral removed`}
/>

<Button
type="submit"
loading={isPending || !market}
disabled={formErrors.length > 0}
data-testid="remove-collateral-submit-button"
>
{isPending ? t`Processing...` : t`Remove collateral`}
</Button>
</LoanFormWrapper>
)
}
Loading