Skip to content

Commit

Permalink
Show latest loan debt (#795)
Browse files Browse the repository at this point in the history
  • Loading branch information
bpierre authored Jan 30, 2025
1 parent 40b63be commit 60e1a2c
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 12 deletions.
8 changes: 3 additions & 5 deletions frontend/app/src/comps/Positions/PositionCardLoan.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { PositionLoanCommitted } from "@/src/types";

import { LoanStatusTag } from "@/src/comps/Tag/LoanStatusTag";
import { getPrefixedTroveId } from "@/src/liquity-utils";
import { getPrefixedTroveId, useLoan } from "@/src/liquity-utils";
import { useStoredState } from "@/src/services/StoredState";
import { PositionCardBorrow } from "./PositionCardBorrow";
import { PositionCardLeverage } from "./PositionCardLeverage";
Expand All @@ -21,10 +21,7 @@ export function PositionCardLoan(
) {
const storedState = useStoredState();

// only works for existing troves
if (!props.troveId) {
return null;
}
const loan = useLoan(props.collIndex, props.troveId);

const prefixedTroveId = getPrefixedTroveId(props.collIndex, props.troveId);
const loanMode = storedState.loanModes[prefixedTroveId] ?? props.type;
Expand All @@ -34,6 +31,7 @@ export function PositionCardLoan(
return (
<Card
{...props}
borrowed={loan.data?.borrowed ?? props.borrowed}
statusTag={props.status === "liquidated"
? <LoanStatusTag status="liquidated" />
: props.status === "redeemed"
Expand Down
42 changes: 40 additions & 2 deletions frontend/app/src/liquity-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ import type { Config as WagmiConfig } from "wagmi";

import { DATA_REFRESH_INTERVAL, INTEREST_RATE_INCREMENT, INTEREST_RATE_MAX, INTEREST_RATE_MIN } from "@/src/constants";
import { getCollateralContract, getContracts, getProtocolContract } from "@/src/contracts";
import { dnum18, jsonStringifyWithDnum } from "@/src/dnum-utils";
import { dnumOrNull } from "@/src/dnum-utils";
import { dnum18, dnumOrNull, jsonStringifyWithDnum } from "@/src/dnum-utils";
import { CHAIN_BLOCK_EXPLORER, LIQUITY_STATS_URL } from "@/src/env";
import { getCollGainFromSnapshots, useContinuousBoldGains } from "@/src/liquity-stability-pool";
import {
useGovernanceStats,
useGovernanceUser,
useInterestRateBrackets,
useLoanById,
useStabilityPool,
useStabilityPoolDeposit,
useStabilityPoolEpochScale,
Expand Down Expand Up @@ -610,3 +610,41 @@ export function useLiquityStats() {
enabled: Boolean(LIQUITY_STATS_URL),
});
}

export function useLatestTroveData(collIndex: CollIndex, troveId: TroveId) {
const TroveManager = getCollateralContract(collIndex, "TroveManager");
if (!TroveManager) {
throw new Error(`Invalid collateral index: ${collIndex}`);
}
return useReadContract({
...TroveManager,
functionName: "getLatestTroveData",
args: [BigInt(troveId)],
query: {
refetchInterval: DATA_REFRESH_INTERVAL,
},
});
}

export function useLoanLiveDebt(collIndex: CollIndex, troveId: TroveId) {
const latestTroveData = useLatestTroveData(collIndex, troveId);
return {
...latestTroveData,
data: latestTroveData.data?.entireDebt ?? null,
};
}

export function useLoan(collIndex: CollIndex, troveId: TroveId) {
const liveDebt = useLoanLiveDebt(collIndex, troveId);
const loan = useLoanById(getPrefixedTroveId(collIndex, troveId));
if (liveDebt.data && loan.data) {
return {
...loan,
data: {
...loan.data,
borrowed: dnum18(liveDebt.data),
},
};
}
return loan;
}
11 changes: 6 additions & 5 deletions frontend/app/src/screens/LoanScreen/LoanScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,11 @@ import content from "@/src/content";
import { getCollateralContract } from "@/src/contracts";
import { dnum18 } from "@/src/dnum-utils";
import { fmtnum } from "@/src/formatting";
import { getCollToken, getPrefixedTroveId, parsePrefixedTroveId } from "@/src/liquity-utils";
import { getCollToken, getPrefixedTroveId, parsePrefixedTroveId, useLoan, useLoanLiveDebt } from "@/src/liquity-utils";
import { useAccount } from "@/src/services/Ethereum";
import { usePrice } from "@/src/services/Prices";
import { useStoredState } from "@/src/services/StoredState";
import { useTransactionFlow } from "@/src/services/TransactionFlow";
import { useLoanById } from "@/src/subgraph-hooks";
import { isPrefixedtroveId } from "@/src/types";
import { css } from "@/styled-system/css";
import { Button, InfoTooltip, Tabs, TokenIcon } from "@liquity2/uikit";
Expand Down Expand Up @@ -50,15 +49,17 @@ export function LoanScreen() {
if (!isPrefixedtroveId(paramPrefixedId)) {
notFound();
}
const { troveId, collIndex } = parsePrefixedTroveId(paramPrefixedId);

const loan = useLoanById(paramPrefixedId);
const loan = useLoan(collIndex, troveId);
const loanMode = storedState.loanModes[paramPrefixedId] ?? loan.data?.type ?? "borrow";

const collToken = getCollToken(loan.data?.collIndex ?? null);
const collPriceUsd = usePrice(collToken?.symbol ?? null);

const { troveId } = parsePrefixedTroveId(paramPrefixedId);
const fullyRedeemed = loan.data && loan.data.status === "redeemed" && dn.eq(loan.data.borrowed, 0);
const fullyRedeemed = loan.data
&& loan.data.status === "redeemed"
&& dn.eq(loan.data.borrowed, 0);

const loadingState = match([loan, collPriceUsd.data ?? null])
.returnType<LoanLoadingState>()
Expand Down

0 comments on commit 60e1a2c

Please sign in to comment.