diff --git a/src/actions/borrow.tsx b/src/actions/borrow.tsx index 959db55..7fbd565 100644 --- a/src/actions/borrow.tsx +++ b/src/actions/borrow.tsx @@ -108,7 +108,7 @@ export const borrow = async ( cleanupInstructions = []; const [authority] = await PublicKey.findProgramAddress( - [depositReserve.lendingMarket.toBuffer()], + [depositReserve.lendingMarket.toBuffer()], LENDING_PROGRAM_ID ); diff --git a/src/actions/repay.tsx b/src/actions/repay.tsx index 129a590..e09c1e5 100644 --- a/src/actions/repay.tsx +++ b/src/actions/repay.tsx @@ -6,12 +6,8 @@ import { } from "@solana/web3.js"; import { sendTransaction } from "../contexts/connection"; import { notify } from "../utils/notifications"; -import { - LendingReserve, -} from "./../models/lending/reserve"; -import { - repayInstruction, -} from "./../models/lending/repay"; +import { LendingReserve } from "./../models/lending/reserve"; +import { repayInstruction } from "./../models/lending/repay"; import { AccountLayout, Token } from "@solana/spl-token"; import { LENDING_PROGRAM_ID, TOKEN_PROGRAM_ID } from "../constants/ids"; import { findOrCreateAccountByMint } from "./account"; @@ -49,7 +45,7 @@ export const repay = async ( ); const [authority] = await PublicKey.findProgramAddress( - [repayReserve.lendingMarket.toBuffer()], + [repayReserve.lendingMarket.toBuffer()], LENDING_PROGRAM_ID ); diff --git a/src/actions/withdraw.tsx b/src/actions/withdraw.tsx index 22c03b8..85b5fac 100644 --- a/src/actions/withdraw.tsx +++ b/src/actions/withdraw.tsx @@ -39,7 +39,7 @@ export const withdraw = async ( ); const [authority] = await PublicKey.findProgramAddress( - [reserve.lendingMarket.toBuffer()], + [reserve.lendingMarket.toBuffer()], LENDING_PROGRAM_ID ); diff --git a/src/components/RepayInput/index.tsx b/src/components/RepayInput/index.tsx index d6d9c91..86d00da 100644 --- a/src/components/RepayInput/index.tsx +++ b/src/components/RepayInput/index.tsx @@ -1,6 +1,10 @@ import React, { useCallback, useMemo, useState } from "react"; import { useTokenName, useUserBalance } from "../../hooks"; -import { LendingObligation, LendingReserve, LendingReserveParser } from "../../models"; +import { + LendingObligation, + LendingReserve, + LendingReserveParser, +} from "../../models"; import { TokenIcon } from "../TokenIcon"; import { Button, Card } from "antd"; import { cache, ParsedAccount } from "../../contexts/accounts"; @@ -15,7 +19,7 @@ import "./style.less"; export const RepayInput = (props: { className?: string; reserve: LendingReserve; - obligation: LendingObligation; + obligation?: string; address: PublicKey; }) => { const connection = useConnection(); @@ -24,7 +28,7 @@ export const RepayInput = (props: { const repayReserve = props.reserve; const repayReserveAddress = props.address; - const obligation = props.obligation; + const obligation = props.obligation; const [collateralReserveMint, setCollateralReserveMint] = useState(); @@ -43,6 +47,13 @@ export const RepayInput = (props: { ); // const collateralBalance = useUserBalance(reserve?.collateralMint); + const { userObligations } = + + // TODO: + if(!obligation) { + + } + const onReoay = useCallback(() => { if (!collateralReserve) { return; @@ -51,7 +62,7 @@ export const RepayInput = (props: { repay( fromAccounts[0], parseFloat(value), - obligation, + obligation as any, repayReserve, repayReserveAddress, collateralReserve.info, diff --git a/src/contexts/lending.tsx b/src/contexts/lending.tsx index 185ebd6..a5c4c3f 100644 --- a/src/contexts/lending.tsx +++ b/src/contexts/lending.tsx @@ -53,11 +53,11 @@ export const useLending = () => { item.account, LendingMarketParser ); - }else if (isLendingObligation(item.account)) { + } else if (isLendingObligation(item.account)) { return cache.add( item.pubkey.toBase58(), item.account, - LendingObligationParser, + LendingObligationParser ); } }, []); diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 7ca7e0a..69fa002 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -6,3 +6,4 @@ export * from "./useUserBalance"; export * from "./useCollateralBalance"; export * from "./useLendingObligations"; export * from "./useUserObligations"; +export * from "./useUserObligationByReserve"; diff --git a/src/hooks/useUserObligationByReserve.ts b/src/hooks/useUserObligationByReserve.ts new file mode 100644 index 0000000..cf624d6 --- /dev/null +++ b/src/hooks/useUserObligationByReserve.ts @@ -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, + }; +} diff --git a/src/hooks/useUserObligations.ts b/src/hooks/useUserObligations.ts index b202f9f..f017ce7 100644 --- a/src/hooks/useUserObligations.ts +++ b/src/hooks/useUserObligations.ts @@ -8,33 +8,33 @@ export function useUserObligations() { const { obligations } = useLendingObligations(); const accountsByMint = useMemo(() => { - return userAccounts.reduce((res, acc) => { - const id = acc.info.mint.toBase58(); - res.set(id, [...(res.get(id) || []), acc]); - return res; - }, new Map()) - }, - [userAccounts]); + return userAccounts.reduce((res, acc) => { + const id = acc.info.mint.toBase58(); + res.set(id, [...(res.get(id) || []), acc]); + return res; + }, new Map()); + }, [userAccounts]); const userObligations = useMemo(() => { - if(accountsByMint.size === 0) { + if (accountsByMint.size === 0) { return []; } return obligations - .filter((acc) => accountsByMint.get(acc.info.tokenMint.toBase58()) !== undefined) - .map(ob => { + .filter( + (acc) => accountsByMint.get(acc.info.tokenMint.toBase58()) !== undefined + ) + .map((ob) => { return { oblication: ob, userAccounts: [...accountsByMint.get(ob.info.tokenMint.toBase58())], // TODO: add total borrowed amount? - } + }; }); }, [accountsByMint, obligations]); - return { - userObligations + userObligations, }; } diff --git a/src/views/dashboard/index.tsx b/src/views/dashboard/index.tsx index dd94ce2..fc1a329 100644 --- a/src/views/dashboard/index.tsx +++ b/src/views/dashboard/index.tsx @@ -7,8 +7,7 @@ export const DashboardView = () => { return (
DASHBOARD: TODO: 1. Add deposits 2. Add obligations - - {userObligations.map(item => { + {userObligations.map((item) => { return
{item?.oblication.info.borrowAmount.toString()}
; })}
diff --git a/src/views/faucet/index.tsx b/src/views/faucet/index.tsx index d8878d3..ab8b68e 100644 --- a/src/views/faucet/index.tsx +++ b/src/views/faucet/index.tsx @@ -3,13 +3,21 @@ import { Button, Card } from "antd"; import { useConnection } from "../../contexts/connection"; import { useWallet } from "../../contexts/wallet"; import { LAMPORTS_PER_SOL } from "@solana/web3.js"; +import { notify } from "../../utils/notifications"; export const FaucetView = () => { const connection = useConnection(); const { wallet } = useWallet(); 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]); const bodyStyle: React.CSSProperties = { diff --git a/src/views/repayReserve/index.tsx b/src/views/repayReserve/index.tsx index 9734a47..c582e27 100644 --- a/src/views/repayReserve/index.tsx +++ b/src/views/repayReserve/index.tsx @@ -12,13 +12,10 @@ import "./style.less"; import { LendingObligation } from "../../models"; export const RepayReserveView = () => { - const { id } = useParams<{ id: string }>(); + const { id, obligation } = useParams<{ id: string, obligation?: string }>(); const lendingReserve = useLendingReserve(id); const reserve = lendingReserve?.info; - // TODO: query for lending obligation - const ob: LendingObligation = {} as any; - if (!reserve || !lendingReserve) { return null; } @@ -29,7 +26,7 @@ export const RepayReserveView = () => {