feat: query obligations
This commit is contained in:
parent
ab975de0b8
commit
e925116ade
|
@ -6,12 +6,8 @@ import {
|
||||||
} from "@solana/web3.js";
|
} from "@solana/web3.js";
|
||||||
import { sendTransaction } from "../contexts/connection";
|
import { sendTransaction } from "../contexts/connection";
|
||||||
import { notify } from "../utils/notifications";
|
import { notify } from "../utils/notifications";
|
||||||
import {
|
import { LendingReserve } from "./../models/lending/reserve";
|
||||||
LendingReserve,
|
import { repayInstruction } from "./../models/lending/repay";
|
||||||
} from "./../models/lending/reserve";
|
|
||||||
import {
|
|
||||||
repayInstruction,
|
|
||||||
} from "./../models/lending/repay";
|
|
||||||
import { AccountLayout, Token } from "@solana/spl-token";
|
import { AccountLayout, Token } from "@solana/spl-token";
|
||||||
import { LENDING_PROGRAM_ID, TOKEN_PROGRAM_ID } from "../constants/ids";
|
import { LENDING_PROGRAM_ID, TOKEN_PROGRAM_ID } from "../constants/ids";
|
||||||
import { findOrCreateAccountByMint } from "./account";
|
import { findOrCreateAccountByMint } from "./account";
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
import React, { useCallback, useMemo, useState } from "react";
|
import React, { useCallback, useMemo, useState } from "react";
|
||||||
import { useTokenName, useUserBalance } from "../../hooks";
|
import { useTokenName, useUserBalance } from "../../hooks";
|
||||||
import { LendingObligation, LendingReserve, LendingReserveParser } from "../../models";
|
import {
|
||||||
|
LendingObligation,
|
||||||
|
LendingReserve,
|
||||||
|
LendingReserveParser,
|
||||||
|
} from "../../models";
|
||||||
import { TokenIcon } from "../TokenIcon";
|
import { TokenIcon } from "../TokenIcon";
|
||||||
import { Button, Card } from "antd";
|
import { Button, Card } from "antd";
|
||||||
import { cache, ParsedAccount } from "../../contexts/accounts";
|
import { cache, ParsedAccount } from "../../contexts/accounts";
|
||||||
|
@ -15,7 +19,7 @@ import "./style.less";
|
||||||
export const RepayInput = (props: {
|
export const RepayInput = (props: {
|
||||||
className?: string;
|
className?: string;
|
||||||
reserve: LendingReserve;
|
reserve: LendingReserve;
|
||||||
obligation: LendingObligation;
|
obligation?: string;
|
||||||
address: PublicKey;
|
address: PublicKey;
|
||||||
}) => {
|
}) => {
|
||||||
const connection = useConnection();
|
const connection = useConnection();
|
||||||
|
@ -43,6 +47,13 @@ export const RepayInput = (props: {
|
||||||
);
|
);
|
||||||
// const collateralBalance = useUserBalance(reserve?.collateralMint);
|
// const collateralBalance = useUserBalance(reserve?.collateralMint);
|
||||||
|
|
||||||
|
const { userObligations } =
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
if(!obligation) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
const onReoay = useCallback(() => {
|
const onReoay = useCallback(() => {
|
||||||
if (!collateralReserve) {
|
if (!collateralReserve) {
|
||||||
return;
|
return;
|
||||||
|
@ -51,7 +62,7 @@ export const RepayInput = (props: {
|
||||||
repay(
|
repay(
|
||||||
fromAccounts[0],
|
fromAccounts[0],
|
||||||
parseFloat(value),
|
parseFloat(value),
|
||||||
obligation,
|
obligation as any,
|
||||||
repayReserve,
|
repayReserve,
|
||||||
repayReserveAddress,
|
repayReserveAddress,
|
||||||
collateralReserve.info,
|
collateralReserve.info,
|
||||||
|
|
|
@ -57,7 +57,7 @@ export const useLending = () => {
|
||||||
return cache.add(
|
return cache.add(
|
||||||
item.pubkey.toBase58(),
|
item.pubkey.toBase58(),
|
||||||
item.account,
|
item.account,
|
||||||
LendingObligationParser,
|
LendingObligationParser
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}, []);
|
}, []);
|
||||||
|
|
|
@ -6,3 +6,4 @@ export * from "./useUserBalance";
|
||||||
export * from "./useCollateralBalance";
|
export * from "./useCollateralBalance";
|
||||||
export * from "./useLendingObligations";
|
export * from "./useLendingObligations";
|
||||||
export * from "./useUserObligations";
|
export * from "./useUserObligations";
|
||||||
|
export * from "./useUserObligationByReserve";
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
import { useMemo } from "react";
|
||||||
|
import { useUserObligations } from "./useUserObligations";
|
||||||
|
import { PublicKey } from "@solana/web3.js";
|
||||||
|
|
||||||
|
export function useUserObligationByReserve(reserve: PublicKey) {
|
||||||
|
const { userObligations } = useUserObligations();
|
||||||
|
|
||||||
|
const userObligationsByReserve = useMemo(
|
||||||
|
() =>
|
||||||
|
userObligations.filter((item) =>
|
||||||
|
item.oblication.info.borrowReserve.equals(reserve)
|
||||||
|
),
|
||||||
|
[reserve, userObligations]
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
userObligationsByReserve,
|
||||||
|
};
|
||||||
|
}
|
|
@ -12,9 +12,8 @@ export function useUserObligations() {
|
||||||
const id = acc.info.mint.toBase58();
|
const id = acc.info.mint.toBase58();
|
||||||
res.set(id, [...(res.get(id) || []), acc]);
|
res.set(id, [...(res.get(id) || []), acc]);
|
||||||
return res;
|
return res;
|
||||||
}, new Map<string, TokenAccount[]>())
|
}, new Map<string, TokenAccount[]>());
|
||||||
},
|
}, [userAccounts]);
|
||||||
[userAccounts]);
|
|
||||||
|
|
||||||
const userObligations = useMemo(() => {
|
const userObligations = useMemo(() => {
|
||||||
if (accountsByMint.size === 0) {
|
if (accountsByMint.size === 0) {
|
||||||
|
@ -22,19 +21,20 @@ export function useUserObligations() {
|
||||||
}
|
}
|
||||||
|
|
||||||
return obligations
|
return obligations
|
||||||
.filter((acc) => accountsByMint.get(acc.info.tokenMint.toBase58()) !== undefined)
|
.filter(
|
||||||
.map(ob => {
|
(acc) => accountsByMint.get(acc.info.tokenMint.toBase58()) !== undefined
|
||||||
|
)
|
||||||
|
.map((ob) => {
|
||||||
return {
|
return {
|
||||||
oblication: ob,
|
oblication: ob,
|
||||||
userAccounts: [...accountsByMint.get(ob.info.tokenMint.toBase58())],
|
userAccounts: [...accountsByMint.get(ob.info.tokenMint.toBase58())],
|
||||||
|
|
||||||
// TODO: add total borrowed amount?
|
// TODO: add total borrowed amount?
|
||||||
}
|
};
|
||||||
});
|
});
|
||||||
}, [accountsByMint, obligations]);
|
}, [accountsByMint, obligations]);
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
userObligations
|
userObligations,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,8 +7,7 @@ export const DashboardView = () => {
|
||||||
return (
|
return (
|
||||||
<div className="flexColumn">
|
<div className="flexColumn">
|
||||||
DASHBOARD: TODO: 1. Add deposits 2. Add obligations
|
DASHBOARD: TODO: 1. Add deposits 2. Add obligations
|
||||||
|
{userObligations.map((item) => {
|
||||||
{userObligations.map(item => {
|
|
||||||
return <div>{item?.oblication.info.borrowAmount.toString()}</div>;
|
return <div>{item?.oblication.info.borrowAmount.toString()}</div>;
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,13 +3,21 @@ import { Button, Card } from "antd";
|
||||||
import { useConnection } from "../../contexts/connection";
|
import { useConnection } from "../../contexts/connection";
|
||||||
import { useWallet } from "../../contexts/wallet";
|
import { useWallet } from "../../contexts/wallet";
|
||||||
import { LAMPORTS_PER_SOL } from "@solana/web3.js";
|
import { LAMPORTS_PER_SOL } from "@solana/web3.js";
|
||||||
|
import { notify } from "../../utils/notifications";
|
||||||
|
|
||||||
export const FaucetView = () => {
|
export const FaucetView = () => {
|
||||||
const connection = useConnection();
|
const connection = useConnection();
|
||||||
const { wallet } = useWallet();
|
const { wallet } = useWallet();
|
||||||
|
|
||||||
const airdrop = useCallback(() => {
|
const airdrop = useCallback(() => {
|
||||||
connection.requestAirdrop(wallet.publicKey, 1 * LAMPORTS_PER_SOL);
|
connection
|
||||||
|
.requestAirdrop(wallet.publicKey, 2 * LAMPORTS_PER_SOL)
|
||||||
|
.then(() => {
|
||||||
|
notify({
|
||||||
|
message: "Account funded.",
|
||||||
|
type: "success",
|
||||||
|
});
|
||||||
|
});
|
||||||
}, [wallet, connection]);
|
}, [wallet, connection]);
|
||||||
|
|
||||||
const bodyStyle: React.CSSProperties = {
|
const bodyStyle: React.CSSProperties = {
|
||||||
|
|
|
@ -12,13 +12,10 @@ import "./style.less";
|
||||||
import { LendingObligation } from "../../models";
|
import { LendingObligation } from "../../models";
|
||||||
|
|
||||||
export const RepayReserveView = () => {
|
export const RepayReserveView = () => {
|
||||||
const { id } = useParams<{ id: string }>();
|
const { id, obligation } = useParams<{ id: string, obligation?: string }>();
|
||||||
const lendingReserve = useLendingReserve(id);
|
const lendingReserve = useLendingReserve(id);
|
||||||
const reserve = lendingReserve?.info;
|
const reserve = lendingReserve?.info;
|
||||||
|
|
||||||
// TODO: query for lending obligation
|
|
||||||
const ob: LendingObligation = {} as any;
|
|
||||||
|
|
||||||
if (!reserve || !lendingReserve) {
|
if (!reserve || !lendingReserve) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -29,7 +26,7 @@ export const RepayReserveView = () => {
|
||||||
<RepayInput
|
<RepayInput
|
||||||
className="repay-reserve-item repay-reserve-item-left"
|
className="repay-reserve-item repay-reserve-item-left"
|
||||||
reserve={reserve}
|
reserve={reserve}
|
||||||
obligation={ob}
|
obligation={obligation}
|
||||||
address={lendingReserve.pubkey}
|
address={lendingReserve.pubkey}
|
||||||
/>
|
/>
|
||||||
<SideReserveOverview
|
<SideReserveOverview
|
||||||
|
|
Loading…
Reference in New Issue