feat: reserve deposits
This commit is contained in:
parent
5f272186c6
commit
3a83cb9d67
|
@ -21,6 +21,7 @@ import { TokenAccount } from "../models";
|
|||
import { isConstructorDeclaration } from "typescript";
|
||||
import { LendingMarketParser } from "../models/lending";
|
||||
import { sign } from "crypto";
|
||||
import { fromLamports, toLamports } from "../utils/utils";
|
||||
|
||||
export const deposit = async (
|
||||
from: TokenAccount,
|
||||
|
@ -56,7 +57,7 @@ export const deposit = async (
|
|||
);
|
||||
|
||||
const mint = (await cache.query(connection, reserve.liquidityMint, MintParser)) as ParsedAccount<MintInfo>;
|
||||
const amountLamports = amount * Math.pow(10, mint?.info.decimals || 0);
|
||||
const amountLamports = toLamports(amount, mint?.info);
|
||||
|
||||
const fromAccount = ensureSplAccount(
|
||||
instructions,
|
||||
|
@ -88,7 +89,7 @@ export const deposit = async (
|
|||
instructions,
|
||||
cleanupInstructions,
|
||||
accountRentExempt,
|
||||
reserve.liquidityMint,
|
||||
reserve.collateralMint,
|
||||
signers
|
||||
);
|
||||
} else {
|
||||
|
|
|
@ -3,7 +3,7 @@ import { useConnection } from "./connection";
|
|||
import { useWallet } from "./wallet";
|
||||
import { AccountInfo, Connection, PublicKey } from "@solana/web3.js";
|
||||
import { programIds, WRAPPED_SOL_MINT } from "./../constants/ids";
|
||||
import { AccountLayout, u64, MintInfo, MintLayout } from "@solana/spl-token";
|
||||
import { AccountLayout, u64, MintInfo, MintLayout, Token } from "@solana/spl-token";
|
||||
import { TokenAccount } from "./../models";
|
||||
import { chunks } from "./../utils/utils";
|
||||
import { EventEmitter } from "./../utils/eventEmitter";
|
||||
|
@ -197,6 +197,15 @@ const UseNativeAccount = () => {
|
|||
const { wallet } = useWallet();
|
||||
|
||||
const [nativeAccount, setNativeAccount] = useState<AccountInfo<Buffer>>();
|
||||
|
||||
const updateCache = useCallback((account) => {
|
||||
const wrapped = wrapNativeAccount(wallet.publicKey, account);
|
||||
if(wrapped !== undefined && wallet) {
|
||||
cache.registerParser(wallet.publicKey.toBase58(), TokenAccountParser);
|
||||
genericCache.set(wallet.publicKey.toBase58(), wrapped as TokenAccount);
|
||||
}
|
||||
}, [wallet]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!connection || !wallet?.publicKey) {
|
||||
return;
|
||||
|
@ -204,11 +213,13 @@ const UseNativeAccount = () => {
|
|||
|
||||
connection.getAccountInfo(wallet.publicKey).then((acc) => {
|
||||
if (acc) {
|
||||
updateCache(acc);
|
||||
setNativeAccount(acc);
|
||||
}
|
||||
});
|
||||
connection.onAccountChange(wallet.publicKey, (acc) => {
|
||||
if (acc) {
|
||||
updateCache(acc);
|
||||
setNativeAccount(acc);
|
||||
}
|
||||
});
|
||||
|
@ -249,16 +260,12 @@ export function AccountsProvider({ children = null as any }) {
|
|||
const selectUserAccounts = useCallback(() => {
|
||||
return cache.byParser(TokenAccountParser).map(id => cache.get(id)).filter(
|
||||
(a) => a && a.info.owner.toBase58() === wallet.publicKey.toBase58()
|
||||
).map(a => a?.info as TokenAccount);
|
||||
).map(a => a as TokenAccount);
|
||||
}, [wallet]);
|
||||
|
||||
useEffect(() => {
|
||||
setUserAccounts(
|
||||
[
|
||||
wrapNativeAccount(wallet.publicKey, nativeAccount),
|
||||
...tokenAccounts,
|
||||
].filter((a) => a !== undefined) as TokenAccount[]
|
||||
);
|
||||
const accounts = selectUserAccounts().filter((a) => a !== undefined) as TokenAccount[];
|
||||
setUserAccounts(accounts);
|
||||
}, [nativeAccount, wallet, tokenAccounts]);
|
||||
|
||||
const publicKey = wallet?.publicKey;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { PublicKey } from "@solana/web3.js";
|
||||
import { useMemo } from "react";
|
||||
import { useMint } from "../contexts/accounts";
|
||||
import { convert } from "../utils/utils";
|
||||
import { fromLamports } from "../utils/utils";
|
||||
import { useUserAccounts } from "./useUserAccounts";
|
||||
|
||||
export function useUserBalance(mint?: PublicKey) {
|
||||
|
@ -14,7 +14,7 @@ export function useUserBalance(mint?: PublicKey) {
|
|||
}, [userAccounts]);
|
||||
|
||||
const balance = useMemo(() =>
|
||||
convert(accounts
|
||||
fromLamports(accounts
|
||||
.reduce((res, item) => res += item.info.amount.toNumber(), 0)
|
||||
, mintInfo),
|
||||
[accounts, mintInfo]);
|
||||
|
|
|
@ -52,7 +52,6 @@ export const uint64 = (property = "uint64"): unknown => {
|
|||
b.copy(zeroPad);
|
||||
b = zeroPad;
|
||||
}
|
||||
|
||||
return _encode(b, buffer, offset);
|
||||
};
|
||||
|
||||
|
|
|
@ -89,7 +89,22 @@ export function chunks<T>(array: T[], size: number): T[][] {
|
|||
).map((_, index) => array.slice(index * size, (index + 1) * size));
|
||||
}
|
||||
|
||||
export function convert(
|
||||
export function toLamports(
|
||||
account?: TokenAccount | number,
|
||||
mint?: MintInfo
|
||||
): number {
|
||||
if (!account) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const amount =
|
||||
typeof account === "number" ? account : account.info.amount?.toNumber();
|
||||
|
||||
const precision = Math.pow(10, mint?.decimals || 0);
|
||||
return (amount * precision);
|
||||
}
|
||||
|
||||
export function fromLamports(
|
||||
account?: TokenAccount | number,
|
||||
mint?: MintInfo,
|
||||
rate: number = 1.0
|
||||
|
@ -136,7 +151,7 @@ export function formatTokenAmount(
|
|||
}
|
||||
|
||||
return `${[prefix]}${format(
|
||||
convert(account, mint, rate),
|
||||
fromLamports(account, mint, rate),
|
||||
precision,
|
||||
abbr
|
||||
)}${suffix}`;
|
||||
|
|
|
@ -9,6 +9,9 @@ export const DashboardView = () => {
|
|||
const { reserveAccounts } = useLendingReserves();
|
||||
|
||||
return <div>
|
||||
DASHBOARD
|
||||
DASHBOARD:
|
||||
TODO:
|
||||
1. Add deposits
|
||||
2. Add obligations
|
||||
</div>;
|
||||
}
|
Loading…
Reference in New Issue