feat: reserve deposits

This commit is contained in:
bartosz-lipinski 2020-11-18 22:41:15 -06:00
parent 5f272186c6
commit 3a83cb9d67
6 changed files with 41 additions and 16 deletions

View File

@ -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 {

View File

@ -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;

View File

@ -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]);

View File

@ -52,7 +52,6 @@ export const uint64 = (property = "uint64"): unknown => {
b.copy(zeroPad);
b = zeroPad;
}
return _encode(b, buffer, offset);
};

View File

@ -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}`;

View File

@ -9,6 +9,9 @@ export const DashboardView = () => {
const { reserveAccounts } = useLendingReserves();
return <div>
DASHBOARD
DASHBOARD:
TODO:
1. Add deposits
2. Add obligations
</div>;
}