fix: typos and apy calculation
This commit is contained in:
parent
3c3ba90ffc
commit
9730fe8dae
|
@ -23,7 +23,7 @@ export const ReserveUtilizationChart = (props: { reserve: LendingReserve }) => {
|
||||||
|
|
||||||
const liquidityMint = useMint(props.reserve.liquidityMint);
|
const liquidityMint = useMint(props.reserve.liquidityMint);
|
||||||
const avilableLiquidity = fromLamports(
|
const avilableLiquidity = fromLamports(
|
||||||
props.reserve.availableLiqudity.toNumber(),
|
props.reserve.availableLiquidity.toNumber(),
|
||||||
liquidityMint
|
liquidityMint
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTokenName } from "./../../hooks";
|
import { useTokenName } from "./../../hooks";
|
||||||
import { calculateBorrowAPR, calculateDepositAPY, calculateUtilizationRatio, LendingReserve } from "../../models/lending";
|
import { calculateBorrowAPY, calculateDepositAPY, calculateUtilizationRatio, LendingReserve } from "../../models/lending";
|
||||||
import { TokenIcon } from "../../components/TokenIcon";
|
import { TokenIcon } from "../../components/TokenIcon";
|
||||||
import { formatNumber, formatPct, fromLamports, wadToLamports } from "../../utils/utils";
|
import { formatNumber, formatPct, fromLamports, wadToLamports } from "../../utils/utils";
|
||||||
import { Card, Typography } from "antd";
|
import { Card, Typography } from "antd";
|
||||||
|
@ -25,13 +25,13 @@ export const SideReserveOverview = (props: {
|
||||||
const name = useTokenName(reserve?.liquidityMint);
|
const name = useTokenName(reserve?.liquidityMint);
|
||||||
const liquidityMint = useMint(reserve.liquidityMint);
|
const liquidityMint = useMint(reserve.liquidityMint);
|
||||||
|
|
||||||
const availableLiqudity = fromLamports(
|
const availableLiquidity = fromLamports(
|
||||||
reserve.availableLiqudity.toNumber(),
|
reserve.availableLiquidity.toNumber(),
|
||||||
liquidityMint
|
liquidityMint
|
||||||
);
|
);
|
||||||
|
|
||||||
const depositApy = calculateDepositAPY(reserve);
|
const depositApy = calculateDepositAPY(reserve);
|
||||||
const borrowApr = calculateBorrowAPR(reserve);
|
const borrowApr = calculateBorrowAPY(reserve);
|
||||||
|
|
||||||
const utilizationRate = calculateUtilizationRatio(reserve);
|
const utilizationRate = calculateUtilizationRatio(reserve);
|
||||||
const liquidiationThreshold = reserve.config.optimalUtilizationRate / 100;
|
const liquidiationThreshold = reserve.config.optimalUtilizationRate / 100;
|
||||||
|
@ -44,7 +44,7 @@ export const SideReserveOverview = (props: {
|
||||||
<>
|
<>
|
||||||
<div className="card-row">
|
<div className="card-row">
|
||||||
<Text type="secondary" className="card-cell ">
|
<Text type="secondary" className="card-cell ">
|
||||||
{LABELS.TABLE_TITLE_DEPOSIT_APR}:
|
{LABELS.TABLE_TITLE_DEPOSIT_APY}:
|
||||||
</Text>
|
</Text>
|
||||||
<div className="card-cell ">{formatPct.format(depositApy)}</div>
|
<div className="card-cell ">{formatPct.format(depositApy)}</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -80,7 +80,7 @@ export const SideReserveOverview = (props: {
|
||||||
<>
|
<>
|
||||||
<div className="card-row">
|
<div className="card-row">
|
||||||
<Text type="secondary" className="card-cell ">
|
<Text type="secondary" className="card-cell ">
|
||||||
{LABELS.TABLE_TITLE_BORROW_APR}:
|
{LABELS.TABLE_TITLE_BORROW_APY}:
|
||||||
</Text>
|
</Text>
|
||||||
<div className="card-cell ">{formatPct.format(borrowApr)}</div>
|
<div className="card-cell ">{formatPct.format(borrowApr)}</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -122,7 +122,7 @@ export const SideReserveOverview = (props: {
|
||||||
Available liquidity:
|
Available liquidity:
|
||||||
</Text>
|
</Text>
|
||||||
<div className="card-cell ">
|
<div className="card-cell ">
|
||||||
{formatNumber.format(availableLiqudity)} {name}
|
{formatNumber.format(availableLiquidity)} {name}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -25,13 +25,12 @@ export const LABELS = {
|
||||||
TABLE_TITLE_LOAN_BALANCE: "Your loan balance",
|
TABLE_TITLE_LOAN_BALANCE: "Your loan balance",
|
||||||
TABLE_TITLE_DEPOSIT_BALANCE: "Your deposit balance",
|
TABLE_TITLE_DEPOSIT_BALANCE: "Your deposit balance",
|
||||||
TABLE_TITLE_APY: "APY",
|
TABLE_TITLE_APY: "APY",
|
||||||
TABLE_TITLE_APR: "APR",
|
TABLE_TITLE_BORROW_APY: "Borrow APY",
|
||||||
TABLE_TITLE_BORROW_APR: "Borrow APR",
|
TABLE_TITLE_DEPOSIT_APY: "Deposit APY",
|
||||||
TABLE_TITLE_DEPOSIT_APR: "Deposit APY",
|
|
||||||
TABLE_TITLE_TOTAL_BORROWED: "Total Borrowed",
|
TABLE_TITLE_TOTAL_BORROWED: "Total Borrowed",
|
||||||
TABLE_TITLE_MARKET_SIZE: "Market Size",
|
TABLE_TITLE_MARKET_SIZE: "Market Size",
|
||||||
TABLE_TITLE_ACTION: "Action",
|
TABLE_TITLE_ACTION: "Action",
|
||||||
TABLE_TITLE_MAX_BORROW: "Available fro you",
|
TABLE_TITLE_MAX_BORROW: "Available for you",
|
||||||
DASHBOARD_TITLE_LOANS: "Loans",
|
DASHBOARD_TITLE_LOANS: "Loans",
|
||||||
DASHBOARD_TITLE_DEPOSITS: "Deposits",
|
DASHBOARD_TITLE_DEPOSITS: "Deposits",
|
||||||
WITHDRAW_ACTION: "Withdraw",
|
WITHDRAW_ACTION: "Withdraw",
|
||||||
|
|
|
@ -15,7 +15,7 @@ export function useCollateralBalance(
|
||||||
);
|
);
|
||||||
|
|
||||||
const collateralRatioLamports =
|
const collateralRatioLamports =
|
||||||
(reserve?.availableLiqudity.toNumber() || 0) *
|
(reserve?.availableLiquidity.toNumber() || 0) *
|
||||||
(balanceLamports / (reserve?.collateralMintSupply.toNumber() || 1));
|
(balanceLamports / (reserve?.collateralMintSupply.toNumber() || 1));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -111,27 +111,28 @@ export const borrowInstruction = (
|
||||||
|
|
||||||
// deposit APY utilization currentUtilizationRate * borrowAPY
|
// deposit APY utilization currentUtilizationRate * borrowAPY
|
||||||
|
|
||||||
export const calculateBorrowAPR = (reserve: LendingReserve) => {
|
export const calculateBorrowAPY = (reserve: LendingReserve) => {
|
||||||
const totalBorrows = reserve.borrowedLiquidityWad.div(WAD).toNumber();
|
const totalBorrows = reserve.borrowedLiquidityWad.div(WAD).toNumber();
|
||||||
const currentUtilization =
|
const currentUtilization =
|
||||||
totalBorrows / (reserve.availableLiqudity.toNumber() + totalBorrows);
|
totalBorrows / (reserve.availableLiquidity.toNumber() + totalBorrows);
|
||||||
const optimalUtilization = reserve.config.optimalUtilizationRate;
|
const optimalUtilization = reserve.config.optimalUtilizationRate / 100;
|
||||||
let borrowAPR;
|
|
||||||
if (currentUtilization < optimalUtilization) {
|
let borrowAPY;
|
||||||
const normalized_factor = currentUtilization / optimalUtilization;
|
if (optimalUtilization == 1.0 || currentUtilization < optimalUtilization) {
|
||||||
|
const normalizedFactor = currentUtilization / optimalUtilization;
|
||||||
const optimalBorrowRate = reserve.config.optimalBorrowRate / 100;
|
const optimalBorrowRate = reserve.config.optimalBorrowRate / 100;
|
||||||
const minBorrowRate = reserve.config.minBorrowRate / 100;
|
const minBorrowRate = reserve.config.minBorrowRate / 100;
|
||||||
borrowAPR =
|
borrowAPY =
|
||||||
normalized_factor * (optimalBorrowRate - minBorrowRate) + minBorrowRate;
|
normalizedFactor * (optimalBorrowRate - minBorrowRate) + minBorrowRate;
|
||||||
} else {
|
} else {
|
||||||
const normalized_factor =
|
const normalizedFactor =
|
||||||
(currentUtilization - optimalUtilization) / (100 - optimalUtilization);
|
(currentUtilization - optimalUtilization) / (1 - optimalUtilization);
|
||||||
const optimalBorrowRate = reserve.config.optimalBorrowRate / 100;
|
const optimalBorrowRate = reserve.config.optimalBorrowRate / 100;
|
||||||
const maxBorrowRate = reserve.config.maxBorrowRate / 100;
|
const maxBorrowRate = reserve.config.maxBorrowRate / 100;
|
||||||
borrowAPR =
|
borrowAPY =
|
||||||
normalized_factor * (maxBorrowRate - optimalBorrowRate) +
|
normalizedFactor * (maxBorrowRate - optimalBorrowRate) +
|
||||||
optimalBorrowRate;
|
optimalBorrowRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
return borrowAPR;
|
return borrowAPY;
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,7 +8,7 @@ import * as BufferLayout from "buffer-layout";
|
||||||
import { WAD } from "../../constants";
|
import { WAD } from "../../constants";
|
||||||
import { LENDING_PROGRAM_ID, TOKEN_PROGRAM_ID } from "../../constants/ids";
|
import { LENDING_PROGRAM_ID, TOKEN_PROGRAM_ID } from "../../constants/ids";
|
||||||
import * as Layout from "./../../utils/layout";
|
import * as Layout from "./../../utils/layout";
|
||||||
import { calculateBorrowAPR } from "./borrow";
|
import { calculateBorrowAPY } from "./borrow";
|
||||||
import { LendingInstruction } from "./lending";
|
import { LendingInstruction } from "./lending";
|
||||||
import { LendingReserve } from "./reserve";
|
import { LendingReserve } from "./reserve";
|
||||||
|
|
||||||
|
@ -66,8 +66,8 @@ export const depositInstruction = (
|
||||||
export const calculateDepositAPY = (reserve: LendingReserve) => {
|
export const calculateDepositAPY = (reserve: LendingReserve) => {
|
||||||
const totalBorrows = reserve.borrowedLiquidityWad.div(WAD).toNumber();
|
const totalBorrows = reserve.borrowedLiquidityWad.div(WAD).toNumber();
|
||||||
const currentUtilization =
|
const currentUtilization =
|
||||||
totalBorrows / (reserve.availableLiqudity.toNumber() + totalBorrows);
|
totalBorrows / (reserve.availableLiquidity.toNumber() + totalBorrows);
|
||||||
|
|
||||||
const borrowAPY = calculateBorrowAPR(reserve);
|
const borrowAPY = calculateBorrowAPY(reserve);
|
||||||
return currentUtilization * borrowAPY;
|
return currentUtilization * borrowAPY;
|
||||||
};
|
};
|
||||||
|
|
|
@ -48,7 +48,7 @@ export const LendingReserveLayout: typeof BufferLayout.Structure = BufferLayout.
|
||||||
Layout.uint128("cumulativeBorrowRateWad"),
|
Layout.uint128("cumulativeBorrowRateWad"),
|
||||||
Layout.uint128("borrowedLiquidityWad"),
|
Layout.uint128("borrowedLiquidityWad"),
|
||||||
|
|
||||||
Layout.uint64("availableLiqudity"),
|
Layout.uint64("availableLiquidity"),
|
||||||
Layout.uint64("collateralMintSupply"),
|
Layout.uint64("collateralMintSupply"),
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
@ -86,7 +86,7 @@ export interface LendingReserve {
|
||||||
cumulativeBorrowRateWad: BN;
|
cumulativeBorrowRateWad: BN;
|
||||||
borrowedLiquidityWad: BN;
|
borrowedLiquidityWad: BN;
|
||||||
|
|
||||||
availableLiqudity: BN;
|
availableLiquidity: BN;
|
||||||
collateralMintSupply: BN;
|
collateralMintSupply: BN;
|
||||||
|
|
||||||
// Layout.uint128("cumulative_borrow_rate"),
|
// Layout.uint128("cumulative_borrow_rate"),
|
||||||
|
@ -171,6 +171,6 @@ export const initReserveInstruction = (
|
||||||
};
|
};
|
||||||
|
|
||||||
export const calculateUtilizationRatio = (reserve: LendingReserve) => {
|
export const calculateUtilizationRatio = (reserve: LendingReserve) => {
|
||||||
return reserve.availableLiqudity.toNumber() /
|
return reserve.availableLiquidity.toNumber() /
|
||||||
(reserve.availableLiqudity.toNumber() + wadToLamports(reserve.borrowedLiquidityWad).toNumber());
|
(reserve.availableLiquidity.toNumber() + wadToLamports(reserve.borrowedLiquidityWad).toNumber());
|
||||||
}
|
}
|
|
@ -11,7 +11,7 @@ export const BorrowView = () => {
|
||||||
<div className="borrow-item deposit-header">
|
<div className="borrow-item deposit-header">
|
||||||
<div>{LABELS.TABLE_TITLE_ASSET}</div>
|
<div>{LABELS.TABLE_TITLE_ASSET}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_MAX_BORROW}</div>
|
<div>{LABELS.TABLE_TITLE_MAX_BORROW}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_APR}</div>
|
<div>{LABELS.TABLE_TITLE_APY}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_ACTION}</div>
|
<div>{LABELS.TABLE_TITLE_ACTION}</div>
|
||||||
</div>
|
</div>
|
||||||
{reserveAccounts.map((account) => (
|
{reserveAccounts.map((account) => (
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useCollateralBalance, useTokenName } from "../../hooks";
|
import { useCollateralBalance, useTokenName } from "../../hooks";
|
||||||
import { calculateBorrowAPR, LendingReserve } from "../../models/lending";
|
import { calculateBorrowAPY, LendingReserve } from "../../models/lending";
|
||||||
import { TokenIcon } from "../../components/TokenIcon";
|
import { TokenIcon } from "../../components/TokenIcon";
|
||||||
import { formatNumber, formatPct } from "../../utils/utils";
|
import { formatNumber, formatPct } from "../../utils/utils";
|
||||||
import { Button, Card } from "antd";
|
import { Button, Card } from "antd";
|
||||||
|
@ -17,7 +17,7 @@ export const BorrowItem = (props: {
|
||||||
// TODO: calculate avilable amount... based on total owned collateral across all the reserves
|
// TODO: calculate avilable amount... based on total owned collateral across all the reserves
|
||||||
const { balance: collateralBalance } = useCollateralBalance(props.reserve);
|
const { balance: collateralBalance } = useCollateralBalance(props.reserve);
|
||||||
|
|
||||||
const apr = calculateBorrowAPR(props.reserve);
|
const apr = calculateBorrowAPY(props.reserve);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Link to={`/borrow/${props.address.toBase58()}`}>
|
<Link to={`/borrow/${props.address.toBase58()}`}>
|
||||||
|
|
|
@ -31,7 +31,7 @@ export const DashboardView = () => {
|
||||||
<div className="dashboard-item dashboard-header">
|
<div className="dashboard-item dashboard-header">
|
||||||
<div>{LABELS.TABLE_TITLE_ASSET}</div>
|
<div>{LABELS.TABLE_TITLE_ASSET}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_LOAN_BALANCE}</div>
|
<div>{LABELS.TABLE_TITLE_LOAN_BALANCE}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_APR}</div>
|
<div>{LABELS.TABLE_TITLE_APY}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_ACTION}</div>
|
<div>{LABELS.TABLE_TITLE_ACTION}</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -15,8 +15,8 @@ export const HomeView = () => {
|
||||||
<div>{LABELS.TABLE_TITLE_ASSET}</div>
|
<div>{LABELS.TABLE_TITLE_ASSET}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_MARKET_SIZE}</div>
|
<div>{LABELS.TABLE_TITLE_MARKET_SIZE}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_TOTAL_BORROWED}</div>
|
<div>{LABELS.TABLE_TITLE_TOTAL_BORROWED}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_DEPOSIT_APR}</div>
|
<div>{LABELS.TABLE_TITLE_DEPOSIT_APY}</div>
|
||||||
<div>{LABELS.TABLE_TITLE_BORROW_APR}</div>
|
<div>{LABELS.TABLE_TITLE_BORROW_APY}</div>
|
||||||
</div>
|
</div>
|
||||||
{reserveAccounts.map((account) => (
|
{reserveAccounts.map((account) => (
|
||||||
<LendingReserveItem reserve={account.info} address={account.pubkey} />
|
<LendingReserveItem reserve={account.info} address={account.pubkey} />
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import React, { useMemo } from "react";
|
import React, { useMemo } from "react";
|
||||||
import { useTokenName } from "../../hooks";
|
import { useTokenName } from "../../hooks";
|
||||||
import {
|
import {
|
||||||
calculateBorrowAPR,
|
calculateBorrowAPY,
|
||||||
calculateDepositAPY,
|
calculateDepositAPY,
|
||||||
LendingReserve,
|
LendingReserve,
|
||||||
} from "../../models/lending";
|
} from "../../models/lending";
|
||||||
|
@ -25,8 +25,8 @@ export const LendingReserveItem = (props: {
|
||||||
|
|
||||||
const liquidityMint = useMint(props.reserve.liquidityMint);
|
const liquidityMint = useMint(props.reserve.liquidityMint);
|
||||||
|
|
||||||
const availableLiqudity = fromLamports(
|
const availableLiquidity = fromLamports(
|
||||||
props.reserve.availableLiqudity.toNumber(),
|
props.reserve.availableLiquidity.toNumber(),
|
||||||
liquidityMint
|
liquidityMint
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ export const LendingReserveItem = (props: {
|
||||||
[props.reserve, liquidityMint]
|
[props.reserve, liquidityMint]
|
||||||
);
|
);
|
||||||
|
|
||||||
const borrowAPY = useMemo(() => calculateBorrowAPR(props.reserve), [
|
const borrowAPY = useMemo(() => calculateBorrowAPY(props.reserve), [
|
||||||
props.reserve,
|
props.reserve,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ export const LendingReserveItem = (props: {
|
||||||
props.reserve,
|
props.reserve,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const marketSize = availableLiqudity + totalBorrows;
|
const marketSize = availableLiquidity + totalBorrows;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Link to={`/reserve/${props.address.toBase58()}`}>
|
<Link to={`/reserve/${props.address.toBase58()}`}>
|
||||||
|
|
Loading…
Reference in New Issue