refactoring

This commit is contained in:
jordansexton 2021-04-29 19:03:10 -05:00
parent 6296ef31bc
commit 97bc5f76e3
50 changed files with 374 additions and 283 deletions

View File

@ -0,0 +1 @@
build

View File

@ -61,14 +61,14 @@ export const borrowObligationLiquidity = async (
instructions, instructions,
[], [],
accountRentExempt, accountRentExempt,
borrowReserve.info.liquidity.mint, borrowReserve.info.liquidity.mintPubkey,
signers, signers,
) )
: undefined; : undefined;
const mint = (await cache.query( const mint = (await cache.query(
connection, connection,
borrowReserve.info.liquidity.mint, borrowReserve.info.liquidity.mintPubkey,
MintParser, MintParser,
)) as ParsedAccount<MintInfo>; )) as ParsedAccount<MintInfo>;
@ -81,7 +81,7 @@ export const borrowObligationLiquidity = async (
instructions, instructions,
finalCleanupInstructions, finalCleanupInstructions,
accountRentExempt, accountRentExempt,
borrowReserve.info.liquidity.mint, borrowReserve.info.liquidity.mintPubkey,
signers, signers,
); );
@ -113,18 +113,18 @@ export const borrowObligationLiquidity = async (
instructions.push( instructions.push(
refreshReserveInstruction( refreshReserveInstruction(
borrowReserve.pubkey, borrowReserve.pubkey,
borrowReserve.info.liquidity.aggregatorOption borrowReserve.info.liquidity.oracleOption
? borrowReserve.info.liquidity.aggregator ? borrowReserve.info.liquidity.oraclePubkey
: undefined, : undefined,
), ),
refreshObligationInstruction( refreshObligationInstruction(
obligation.pubkey, obligation.pubkey,
obligation.info.deposits.map((collateral) => collateral.depositReserve), obligation.info.deposits.map(collateral => collateral.depositReserve),
obligation.info.borrows.map((liquidity) => liquidity.borrowReserve), obligation.info.borrows.map(liquidity => liquidity.borrowReserve),
), ),
borrowObligationLiquidityInstruction( borrowObligationLiquidityInstruction(
amountLamports, amountLamports,
borrowReserve.info.liquidity.supply, borrowReserve.info.liquidity.supplyPubkey,
destinationLiquidity, destinationLiquidity,
borrowReserve.pubkey, borrowReserve.pubkey,
borrowReserve.info.liquidity.feeReceiver, borrowReserve.info.liquidity.feeReceiver,

View File

@ -86,7 +86,7 @@ export const depositReserveLiquidity = async (
instructions, instructions,
cleanupInstructions, cleanupInstructions,
accountRentExempt, accountRentExempt,
reserve.collateral.mint, reserve.collateral.mintPubkey,
signers, signers,
) )
: createUninitializedAccount( : createUninitializedAccount(
@ -100,8 +100,8 @@ export const depositReserveLiquidity = async (
instructions.push( instructions.push(
refreshReserveInstruction( refreshReserveInstruction(
reserveAddress, reserveAddress,
reserve.liquidity.aggregatorOption reserve.liquidity.oracleOption
? reserve.liquidity.aggregator ? reserve.liquidity.oraclePubkey
: undefined, : undefined,
), ),
depositReserveLiquidityInstruction( depositReserveLiquidityInstruction(
@ -109,8 +109,8 @@ export const depositReserveLiquidity = async (
sourceLiquidityAccount, sourceLiquidityAccount,
destinationCollateralAccount, destinationCollateralAccount,
reserveAddress, reserveAddress,
reserve.liquidity.supply, reserve.liquidity.supplyPubkey,
reserve.collateral.mint, reserve.collateral.mintPubkey,
reserve.lendingMarket, reserve.lendingMarket,
lendingMarketAuthority, lendingMarketAuthority,
transferAuthority.publicKey, transferAuthority.publicKey,
@ -127,18 +127,18 @@ export const depositReserveLiquidity = async (
sourceLiquidityAccount, sourceLiquidityAccount,
destinationCollateralAccount, destinationCollateralAccount,
reserveAddress, reserveAddress,
reserve.liquidity.mint, reserve.liquidity.mintPubkey,
reserve.liquidity.supply, reserve.liquidity.supplyPubkey,
reserve.liquidity.feeReceiver, reserve.liquidity.feeReceiver,
reserve.collateral.mint, reserve.collateral.mintPubkey,
reserve.collateral.supply, reserve.collateral.supplyPubkey,
reserve.lendingMarket, reserve.lendingMarket,
lendingMarketAuthority, lendingMarketAuthority,
// @FIXME: lending market owner // @FIXME: lending market owner
lendingMarketOwner, lendingMarketOwner,
transferAuthority.publicKey, transferAuthority.publicKey,
reserve.liquidity.aggregatorOption reserve.liquidity.oracleOption
? reserve.liquidity.aggregator ? reserve.liquidity.oraclePubkey
: undefined, : undefined,
), ),
); );

View File

@ -84,17 +84,17 @@ export const liquidateObligation = async (
instructions, instructions,
cleanupInstructions, cleanupInstructions,
accountRentExempt, accountRentExempt,
withdrawReserve.info.collateral.mint, withdrawReserve.info.collateral.mintPubkey,
signers, signers,
); );
// @FIXME: aggregator // @FIXME: oracle
const aggregatorAddress = repayReserve.info.liquidity.aggregatorOption const oracleAddress = repayReserve.info.liquidity.oracleOption
? repayReserve.info.liquidity.aggregator ? repayReserve.info.liquidity.oraclePubkey
: withdrawReserve.info.liquidity.aggregator; : withdrawReserve.info.liquidity.oraclePubkey;
const aggregator = cache.get(aggregatorAddress); const oracle = cache.get(oracleAddress);
if (!aggregator) { if (!oracle) {
throw new Error(`Dex market doesn't exist.`); throw new Error(`Dex market doesn't exist.`);
} }
@ -103,10 +103,10 @@ export const liquidateObligation = async (
) as ParsedAccount<LendingMarket>; ) as ParsedAccount<LendingMarket>;
const dexOrderBookSide = market.info.quoteTokenMint.equals( const dexOrderBookSide = market.info.quoteTokenMint.equals(
repayReserve.info.liquidity.mint, repayReserve.info.liquidity.mintPubkey,
) )
? aggregator?.info.asks ? oracle?.info.asks
: aggregator?.info.bids; : oracle?.info.bids;
const memory = createTempMemoryAccount( const memory = createTempMemoryAccount(
instructions, instructions,
@ -116,7 +116,7 @@ export const liquidateObligation = async (
); );
instructions.push( instructions.push(
// @FIXME: aggregator needed // @FIXME: oracle needed
refreshReserveInstruction(repayReserve.pubkey), refreshReserveInstruction(repayReserve.pubkey),
refreshReserveInstruction(withdrawReserve.pubkey), refreshReserveInstruction(withdrawReserve.pubkey),
); );
@ -127,9 +127,9 @@ export const liquidateObligation = async (
sourceAccount, sourceAccount,
toAccount, toAccount,
repayReserve.pubkey, repayReserve.pubkey,
repayReserve.info.liquidity.supply, repayReserve.info.liquidity.supplyPubkey,
withdrawReserve.pubkey, withdrawReserve.pubkey,
withdrawReserve.info.collateral.supply, withdrawReserve.info.collateral.supplyPubkey,
obligation.pubkey, obligation.pubkey,
repayReserve.info.lendingMarket, repayReserve.info.lendingMarket,
lendingMarketAuthority, lendingMarketAuthority,
@ -137,7 +137,7 @@ export const liquidateObligation = async (
), ),
); );
let { txid } = await sendTransaction( let { txid } = await sendTransaction(
connection, connection,
wallet, wallet,
instructions.concat(cleanupInstructions), instructions.concat(cleanupInstructions),

View File

@ -71,15 +71,15 @@ export const redeemReserveCollateral = async (
instructions, instructions,
cleanupInstructions, cleanupInstructions,
accountRentExempt, accountRentExempt,
reserve.liquidity.mint, reserve.liquidity.mintPubkey,
signers, signers,
); );
instructions.push( instructions.push(
refreshReserveInstruction( refreshReserveInstruction(
reserveAddress, reserveAddress,
reserve.liquidity.aggregatorOption reserve.liquidity.oracleOption
? reserve.liquidity.aggregator ? reserve.liquidity.oraclePubkey
: undefined, : undefined,
), ),
redeemReserveCollateralInstruction( redeemReserveCollateralInstruction(
@ -87,8 +87,8 @@ export const redeemReserveCollateral = async (
sourceCollateral, sourceCollateral,
destinationLiquidity, destinationLiquidity,
reserveAddress, reserveAddress,
reserve.collateral.mint, reserve.collateral.mintPubkey,
reserve.liquidity.supply, reserve.liquidity.supplyPubkey,
reserve.lendingMarket, reserve.lendingMarket,
lendingMarketAuthority, lendingMarketAuthority,
transferAuthority.publicKey, transferAuthority.publicKey,

View File

@ -57,7 +57,7 @@ export const repayObligationLiquidity = async (
let sourceLiquidity = source.pubkey; let sourceLiquidity = source.pubkey;
if ( if (
wallet.publicKey.equals(sourceLiquidity) && wallet.publicKey.equals(sourceLiquidity) &&
repayReserve.info.liquidity.mint.equals(NATIVE_MINT) repayReserve.info.liquidity.mintPubkey.equals(NATIVE_MINT)
) { ) {
sourceLiquidity = createTokenAccount( sourceLiquidity = createTokenAccount(
instructions, instructions,
@ -92,14 +92,14 @@ export const repayObligationLiquidity = async (
instructions.push( instructions.push(
refreshReserveInstruction( refreshReserveInstruction(
repayReserve.pubkey, repayReserve.pubkey,
repayReserve.info.liquidity.aggregatorOption repayReserve.info.liquidity.oracleOption
? repayReserve.info.liquidity.aggregator ? repayReserve.info.liquidity.oraclePubkey
: undefined, : undefined,
), ),
repayObligationLiquidityInstruction( repayObligationLiquidityInstruction(
liquidityAmount, liquidityAmount,
sourceLiquidity, sourceLiquidity,
repayReserve.info.liquidity.mint, repayReserve.info.liquidity.mintPubkey,
repayReserve.pubkey, repayReserve.pubkey,
obligation.pubkey, obligation.pubkey,
repayReserve.info.lendingMarket, repayReserve.info.lendingMarket,

View File

@ -43,23 +43,21 @@ export const BorrowInput = (props: {
const depositReserve = useMemo(() => { const depositReserve = useMemo(() => {
const id: string = const id: string =
cache cache.byParser(ReserveParser).find(acc => acc === depositReserveKey) ||
.byParser(ReserveParser) '';
.find(acc => acc === depositReserveKey) || '';
return cache.get(id) as ParsedAccount<Reserve>; return cache.get(id) as ParsedAccount<Reserve>;
}, [depositReserveKey]); }, [depositReserveKey]);
const borrowPrice = useMidPriceInUSD( const borrowPrice = useMidPriceInUSD(
borrowReserve.info.liquidity.mint.toBase58(), borrowReserve.info.liquidity.mintPubkey.toBase58(),
).price; ).price;
const collateralPrice = useMidPriceInUSD( const collateralPrice = useMidPriceInUSD(
depositReserve?.info.liquidity.mint.toBase58(), depositReserve?.info.liquidity.mintPubkey.toBase58(),
)?.price; )?.price;
const include = useMemo( const include = useMemo(() => new Set([depositReserve?.pubkey.toBase58()]), [
() => new Set([depositReserve?.pubkey.toBase58()]), depositReserve,
[depositReserve], ]);
);
const exclude = useMemo(() => new Set([]), []); const exclude = useMemo(() => new Set([]), []);
@ -130,7 +128,7 @@ export const BorrowInput = (props: {
depositReserve?.pubkey, depositReserve?.pubkey,
); );
const { accounts: sourceAccounts } = useUserBalance( const { accounts: sourceAccounts } = useUserBalance(
depositReserve?.info.collateral.mint, depositReserve?.info.collateral.mintPubkey,
); );
const onBorrow = useCallback(() => { const onBorrow = useCallback(() => {
if (!depositReserve) { if (!depositReserve) {

View File

@ -37,7 +37,9 @@ export default function CollateralInput(props: {
showLeverageSelector?: boolean; showLeverageSelector?: boolean;
leverage?: number; leverage?: number;
}) { }) {
const { balance: tokenBalance } = useUserBalance(props.reserve.liquidity.mint); const { balance: tokenBalance } = useUserBalance(
props.reserve.liquidity.mintPubkey,
);
const { reserveAccounts } = useLendingReserves(); const { reserveAccounts } = useLendingReserves();
const { tokenMap } = useConnectionConfig(); const { tokenMap } = useConnectionConfig();
const [depositReserve, setCollateralReserve] = useState<string>(); const [depositReserve, setCollateralReserve] = useState<string>();
@ -50,16 +52,14 @@ export default function CollateralInput(props: {
setBalance(tokenBalance); setBalance(tokenBalance);
} else { } else {
const id: string = const id: string =
cache cache.byParser(ReserveParser).find(acc => acc === depositReserve) || '';
.byParser(ReserveParser)
.find(acc => acc === depositReserve) || '';
const parser = cache.get(id) as ParsedAccount<Reserve>; const parser = cache.get(id) as ParsedAccount<Reserve>;
if (parser) { if (parser) {
const collateralDeposit = userDeposits.userDeposits.find( const collateralDeposit = userDeposits.userDeposits.find(
u => u =>
u.reserve.info.liquidity.mint.toBase58() === u.reserve.info.liquidity.mintPubkey.toBase58() ===
parser.info.liquidity.mint.toBase58(), parser.info.liquidity.mintPubkey.toBase58(),
); );
if (collateralDeposit) setBalance(collateralDeposit.info.amount); if (collateralDeposit) setBalance(collateralDeposit.info.amount);
else setBalance(0); else setBalance(0);
@ -72,7 +72,7 @@ export default function CollateralInput(props: {
) as ParsedAccount<LendingMarket>; ) as ParsedAccount<LendingMarket>;
if (!market) return null; if (!market) return null;
const onlyQuoteAllowed = !props.reserve?.liquidity.mint?.equals( const onlyQuoteAllowed = !props.reserve?.liquidity.mintPubkey?.equals(
market?.info?.quoteTokenMint, market?.info?.quoteTokenMint,
); );
@ -81,7 +81,7 @@ export default function CollateralInput(props: {
.filter( .filter(
reserve => reserve =>
!onlyQuoteAllowed || !onlyQuoteAllowed ||
reserve.info.liquidity.mint.equals(market.info.quoteTokenMint), reserve.info.liquidity.mintPubkey.equals(market.info.quoteTokenMint),
); );
if ( if (
@ -93,7 +93,7 @@ export default function CollateralInput(props: {
setCollateralReserve(address); setCollateralReserve(address);
} }
const renderReserveAccounts = filteredReserveAccounts.map(reserve => { const renderReserveAccounts = filteredReserveAccounts.map(reserve => {
const mint = reserve.info.liquidity.mint.toBase58(); const mint = reserve.info.liquidity.mintPubkey.toBase58();
const address = reserve.pubkey.toBase58(); const address = reserve.pubkey.toBase58();
const name = getTokenName(tokenMap, mint); const name = getTokenName(tokenMap, mint);
return ( return (
@ -203,12 +203,12 @@ export default function CollateralInput(props: {
</Select> </Select>
) : ( ) : (
<TokenDisplay <TokenDisplay
key={props.reserve.liquidity.mint.toBase58()} key={props.reserve.liquidity.mintPubkey.toBase58()}
name={getTokenName( name={getTokenName(
tokenMap, tokenMap,
props.reserve.liquidity.mint.toBase58(), props.reserve.liquidity.mintPubkey.toBase58(),
)} )}
mintAddress={props.reserve.liquidity.mint.toBase58()} mintAddress={props.reserve.liquidity.mintPubkey.toBase58()}
showBalance={false} showBalance={false}
/> />
)} )}

View File

@ -54,7 +54,7 @@ export const CollateralSelector = (props: {
const quoteTokenMintAddress = market?.info?.quoteTokenMint?.toBase58(); const quoteTokenMintAddress = market?.info?.quoteTokenMint?.toBase58();
const onlyQuoteAllowed = const onlyQuoteAllowed =
props.reserve?.liquidity.mint?.toBase58() !== quoteTokenMintAddress; props.reserve?.liquidity.mintPubkey?.toBase58() !== quoteTokenMintAddress;
return ( return (
<Select <Select
@ -79,10 +79,12 @@ export const CollateralSelector = (props: {
.filter( .filter(
reserve => reserve =>
!onlyQuoteAllowed || !onlyQuoteAllowed ||
reserve.info.liquidity.mint.equals(market.info.quoteTokenMint), reserve.info.liquidity.mintPubkey.equals(
market.info.quoteTokenMint,
),
) )
.map(reserve => { .map(reserve => {
const mint = reserve.info.liquidity.mint.toBase58(); const mint = reserve.info.liquidity.mintPubkey.toBase58();
const address = reserve.pubkey.toBase58(); const address = reserve.pubkey.toBase58();
const name = getTokenName(tokenMap, mint); const name = getTokenName(tokenMap, mint);

View File

@ -12,9 +12,9 @@ export const DepositInfoLine = (props: {
reserve: Reserve; reserve: Reserve;
address: PublicKey; address: PublicKey;
}) => { }) => {
const name = useTokenName(props.reserve.liquidity.mint); const name = useTokenName(props.reserve.liquidity.mintPubkey);
const { balance: tokenBalance } = useUserBalance( const { balance: tokenBalance } = useUserBalance(
props.reserve.liquidity.mint, props.reserve.liquidity.mintPubkey,
); );
const { balance: collateralBalance } = useUserCollateralBalance( const { balance: collateralBalance } = useUserCollateralBalance(
props.reserve, props.reserve,

View File

@ -26,7 +26,7 @@ export const DepositInput = (props: {
const address = props.address; const address = props.address;
const { accounts: sourceAccounts, balance, balanceLamports } = useUserBalance( const { accounts: sourceAccounts, balance, balanceLamports } = useUserBalance(
reserve?.liquidity.mint, reserve?.liquidity.mintPubkey,
); );
const convert = useCallback( const convert = useCallback(

View File

@ -41,9 +41,9 @@ export const LiquidateInput = (props: {
const [showConfirmation, setShowConfirmation] = useState(false); const [showConfirmation, setShowConfirmation] = useState(false);
const [collateralValue, setCollateralValue] = useState(''); const [collateralValue, setCollateralValue] = useState('');
const liquidityMint = useMint(repayReserve.info.liquidity.mint); const liquidityMint = useMint(repayReserve.info.liquidity.mintPubkey);
const { accounts: sourceAccounts, balance: tokenBalance } = useUserBalance( const { accounts: sourceAccounts, balance: tokenBalance } = useUserBalance(
repayReserve?.info.liquidity.mint, repayReserve?.info.liquidity.mintPubkey,
); );
const borrowAmountLamports = wadToLamports( const borrowAmountLamports = wadToLamports(
obligation.info.borrows[0].borrowedAmountWads, obligation.info.borrows[0].borrowedAmountWads,
@ -124,7 +124,7 @@ export const LiquidateInput = (props: {
]); ]);
const collateralPrice = useMidPriceInUSD( const collateralPrice = useMidPriceInUSD(
withdrawReserve?.info.liquidity.mint.toBase58(), withdrawReserve?.info.liquidity.mintPubkey.toBase58(),
)?.price; )?.price;
useEffect(() => { useEffect(() => {

View File

@ -19,13 +19,17 @@ export const LoanInfoLine = (props: {
}) => { }) => {
const obligation = props.obligation; const obligation = props.obligation;
const repayReserve = useLendingReserve(obligation?.info.borrows[0].borrowReserve); const repayReserve = useLendingReserve(
const withdrawReserve = useLendingReserve(obligation?.info.deposits[0].depositReserve); obligation?.info.borrows[0].borrowReserve,
);
const withdrawReserve = useLendingReserve(
obligation?.info.deposits[0].depositReserve,
);
const liquidityMint = useMint(repayReserve?.info.liquidity.mint); const liquidityMint = useMint(repayReserve?.info.liquidity.mintPubkey);
const collateralMint = useMint(withdrawReserve?.info.liquidity.mint); const collateralMint = useMint(withdrawReserve?.info.liquidity.mintPubkey);
const repayName = useTokenName(repayReserve?.info.liquidity.mint); const repayName = useTokenName(repayReserve?.info.liquidity.mintPubkey);
const withdrawName = useTokenName(withdrawReserve?.info.liquidity.mint); const withdrawName = useTokenName(withdrawReserve?.info.liquidity.mintPubkey);
const borrowAPY = useMemo( const borrowAPY = useMemo(
() => (repayReserve ? calculateBorrowAPY(repayReserve?.info) : 0), () => (repayReserve ? calculateBorrowAPY(repayReserve?.info) : 0),

View File

@ -44,9 +44,9 @@ export const RepayInput = (props: {
const repayReserve = props.borrowReserve; const repayReserve = props.borrowReserve;
const obligation = props.obligation; const obligation = props.obligation;
const liquidityMint = useMint(repayReserve.info.liquidity.mint); const liquidityMint = useMint(repayReserve.info.liquidity.mintPubkey);
const { balance: tokenBalance } = useUserBalance( const { balance: tokenBalance } = useUserBalance(
repayReserve.info.liquidity.mint, repayReserve.info.liquidity.mintPubkey,
); );
const borrowAmountLamports = wadToLamports( const borrowAmountLamports = wadToLamports(
@ -56,7 +56,7 @@ export const RepayInput = (props: {
const depositReserve = props.depositReserve; const depositReserve = props.depositReserve;
const { accounts: sourceAccounts } = useUserBalance( const { accounts: sourceAccounts } = useUserBalance(
repayReserve.info.liquidity.mint, repayReserve.info.liquidity.mintPubkey,
); );
const convert = useCallback( const convert = useCallback(
@ -75,11 +75,7 @@ export const RepayInput = (props: {
const { value, setValue, pct, setPct, type } = useSliderInput(convert); const { value, setValue, pct, setPct, type } = useSliderInput(convert);
const onRepay = useCallback(() => { const onRepay = useCallback(() => {
if ( if (!depositReserve || !obligation || !repayReserve) {
!depositReserve ||
!obligation ||
!repayReserve
) {
return; return;
} }
@ -131,7 +127,7 @@ export const RepayInput = (props: {
]); ]);
const collateralPrice = useMidPriceInUSD( const collateralPrice = useMidPriceInUSD(
depositReserve?.info.liquidity.mint.toBase58(), depositReserve?.info.liquidity.mintPubkey.toBase58(),
)?.price; )?.price;
useEffect(() => { useEffect(() => {

View File

@ -26,7 +26,7 @@ export const ReserveStatus = (props: {
alignItems: 'center', alignItems: 'center',
}; };
const mintAddress = props.reserve.liquidity.mint?.toBase58(); const mintAddress = props.reserve.liquidity.mintPubkey?.toBase58();
const liquidityMint = useMint(mintAddress); const liquidityMint = useMint(mintAddress);
const { price } = useMidPriceInUSD(mintAddress); const { price } = useMidPriceInUSD(mintAddress);
const availableAmount = fromLamports( const availableAmount = fromLamports(

View File

@ -7,7 +7,7 @@ import { WaterWave } from './../WaterWave';
const { useMint } = contexts.Accounts; const { useMint } = contexts.Accounts;
export const ReserveUtilizationChart = (props: { reserve: Reserve }) => { export const ReserveUtilizationChart = (props: { reserve: Reserve }) => {
const mintAddress = props.reserve.liquidity.mint?.toBase58(); const mintAddress = props.reserve.liquidity.mintPubkey?.toBase58();
const liquidityMint = useMint(mintAddress); const liquidityMint = useMint(mintAddress);
const availableAmount = fromLamports( const availableAmount = fromLamports(
props.reserve.liquidity.availableAmount, props.reserve.liquidity.availableAmount,

View File

@ -33,8 +33,8 @@ export const SideReserveOverview = (props: {
}) => { }) => {
const reserve = props.reserve.info; const reserve = props.reserve.info;
const mode = props.mode; const mode = props.mode;
const name = useTokenName(reserve?.liquidity.mint); const name = useTokenName(reserve?.liquidity.mintPubkey);
const liquidityMint = useMint(reserve.liquidity.mint); const liquidityMint = useMint(reserve.liquidity.mintPubkey);
const availableAmount = fromLamports( const availableAmount = fromLamports(
reserve.liquidity.availableAmount, reserve.liquidity.availableAmount,
@ -113,7 +113,7 @@ export const SideReserveOverview = (props: {
> >
<Link to={`/reserve/${props.reserve.pubkey}`}> <Link to={`/reserve/${props.reserve.pubkey}`}>
<TokenIcon <TokenIcon
mintAddress={reserve?.liquidity.mint} mintAddress={reserve?.liquidity.mintPubkey}
style={{ width: 30, height: 30 }} style={{ width: 30, height: 30 }}
/>{' '} />{' '}
{name} Reserve Overview {name} Reserve Overview

View File

@ -23,12 +23,12 @@ export const UserLendingCard = (props: {
const reserve = props.reserve; const reserve = props.reserve;
const address = props.address; const address = props.address;
const name = useTokenName(reserve?.liquidity.mint); const name = useTokenName(reserve?.liquidity.mintPubkey);
const { const {
balance: tokenBalance, balance: tokenBalance,
balanceInUSD: tokenBalanceInUSD, balanceInUSD: tokenBalanceInUSD,
} = useUserBalance(props.reserve.liquidity.mint); } = useUserBalance(props.reserve.liquidity.mintPubkey);
const { const {
balance: collateralBalance, balance: collateralBalance,
balanceInUSD: collateralBalanceInUSD, balanceInUSD: collateralBalanceInUSD,

View File

@ -33,7 +33,7 @@ export const WithdrawInput = (props: {
const { const {
balanceLamports: collateralBalanceLamports, balanceLamports: collateralBalanceLamports,
accounts: sourceAccounts, accounts: sourceAccounts,
} = useUserBalance(reserve?.collateral.mint); } = useUserBalance(reserve?.collateral.mintPubkey);
const { balance: collateralBalanceInLiquidity } = useUserCollateralBalance( const { balance: collateralBalanceInLiquidity } = useUserCollateralBalance(
reserve, reserve,
); );

View File

@ -72,7 +72,9 @@ export const useLending = () => {
useEffect(() => { useEffect(() => {
if (reserveAccounts.length > 0) { if (reserveAccounts.length > 0) {
precacheMarkets( precacheMarkets(
reserveAccounts.map(reserve => reserve.info.liquidity.mint.toBase58()), reserveAccounts.map(reserve =>
reserve.info.liquidity.mintPubkey.toBase58(),
),
); );
} }
}, [reserveAccounts, precacheMarkets]); }, [reserveAccounts, precacheMarkets]);
@ -91,25 +93,25 @@ export const useLending = () => {
.filter(item => item !== undefined); .filter(item => item !== undefined);
const lendingReserves = accounts const lendingReserves = accounts
.filter( .filter(acc => (acc?.info as Reserve).lendingMarket !== undefined)
acc => (acc?.info as Reserve).lendingMarket !== undefined,
)
.map(acc => acc as ParsedAccount<Reserve>); .map(acc => acc as ParsedAccount<Reserve>);
const toQuery = [ const toQuery = [
...lendingReserves.map(acc => { ...lendingReserves.map(acc => {
const result = [ const result = [
cache.registerParser( cache.registerParser(
acc?.info.collateral.mint.toBase58(), acc?.info.collateral.mintPubkey.toBase58(),
MintParser, MintParser,
), ),
cache.registerParser( cache.registerParser(
acc?.info.liquidity.mint.toBase58(), acc?.info.liquidity.mintPubkey.toBase58(),
MintParser, MintParser,
), ),
// ignore dex if its not set // ignore dex if its not set
cache.registerParser( cache.registerParser(
acc?.info.liquidity.aggregatorOption ? acc?.info.liquidity.aggregator.toBase58() : '', acc?.info.liquidity.oracleOption
? acc?.info.liquidity.oraclePubkey.toBase58()
: '',
DexMarketParser, DexMarketParser,
), ),
].filter(_ => _); ].filter(_ => _);

View File

@ -517,8 +517,8 @@ export const simulateMarketOrderFill = (
dex: PublicKey, dex: PublicKey,
useBBO = false, useBBO = false,
) => { ) => {
const liquidityMint = cache.get(reserve.liquidity.mint); const liquidityMint = cache.get(reserve.liquidity.mintPubkey);
const collateralMint = cache.get(reserve.collateral.mint); const collateralMint = cache.get(reserve.collateral.mintPubkey);
if (!liquidityMint || !collateralMint) { if (!liquidityMint || !collateralMint) {
return 0.0; return 0.0;
} }
@ -538,7 +538,7 @@ export const simulateMarketOrderFill = (
reserve.lendingMarket, reserve.lendingMarket,
) as ParsedAccount<LendingMarket>; ) as ParsedAccount<LendingMarket>;
const aggregator = new Market( const market = new Market(
decodedMarket, decodedMarket,
baseMintDecimals, baseMintDecimals,
quoteTokenMintDecimals, quoteTokenMintDecimals,
@ -552,10 +552,12 @@ export const simulateMarketOrderFill = (
return 0; return 0;
} }
const bids = new Orderbook(aggregator, bidInfo.accountFlags, bidInfo.slab); const bids = new Orderbook(market, bidInfo.accountFlags, bidInfo.slab);
const asks = new Orderbook(aggregator, askInfo.accountFlags, askInfo.slab); const asks = new Orderbook(market, askInfo.accountFlags, askInfo.slab);
const book = lendingMarket.info.quoteTokenMint.equals(reserve.liquidity.mint) const book = lendingMarket.info.quoteTokenMint.equals(
reserve.liquidity.mintPubkey,
)
? bids ? bids
: asks; : asks;

View File

@ -9,7 +9,7 @@ export function useCachedPool(legacy = false) {
const allPools = context.pools as PoolInfo[]; const allPools = context.pools as PoolInfo[];
const pools = useMemo(() => { const pools = useMemo(() => {
return allPools.filter((p) => p.legacy === legacy); return allPools.filter(p => p.legacy === legacy);
}, [allPools, legacy]); }, [allPools, legacy]);
return { return {

View File

@ -18,7 +18,7 @@ export function useBorrowedAmount(address?: string | PublicKey) {
health: 0, health: 0,
}); });
const reserve = useLendingReserve(address); const reserve = useLendingReserve(address);
const liquidityMint = useMint(reserve?.info.liquidity.mint); const liquidityMint = useMint(reserve?.info.liquidity.mintPubkey);
useEffect(() => { useEffect(() => {
setBorrowedInfo({ setBorrowedInfo({

View File

@ -23,7 +23,7 @@ export function useBorrowingPower(
const reserve = useLendingReserve(key); const reserve = useLendingReserve(key);
const liquidityMint = reserve?.info.liquidity.mint; const liquidityMint = reserve?.info.liquidity.mintPubkey;
const liquidityMintAddress = liquidityMint?.toBase58(); const liquidityMintAddress = liquidityMint?.toBase58();
const market = useLendingMarket(reserve?.info.lendingMarket); const market = useLendingMarket(reserve?.info.lendingMarket);
@ -35,7 +35,7 @@ export function useBorrowingPower(
const exclude = useMemo(() => new Set([key]), [key]); const exclude = useMemo(() => new Set([key]), [key]);
const inlcude = useMemo(() => { const inlcude = useMemo(() => {
const quoteReserve = getLendingReserves().find( const quoteReserve = getLendingReserves().find(
r => r.info.liquidity.mint.toBase58() === quoteTokenMintAddess, r => r.info.liquidity.mintPubkey.toBase58() === quoteTokenMintAddess,
); );
return onlyQuoteAllowed && quoteReserve return onlyQuoteAllowed && quoteReserve
? new Set([quoteReserve.pubkey.toBase58()]) ? new Set([quoteReserve.pubkey.toBase58()])

View File

@ -11,9 +11,9 @@ export function useUserCollateralBalance(
reserve?: Reserve, reserve?: Reserve,
account?: PublicKey, account?: PublicKey,
) { ) {
const mint = useMint(reserve?.collateral.mint); const mint = useMint(reserve?.collateral.mintPubkey);
const { balanceLamports: userBalance, accounts } = useUserBalance( const { balanceLamports: userBalance, accounts } = useUserBalance(
reserve?.collateral.mint, reserve?.collateral.mintPubkey,
account, account,
); );
@ -33,12 +33,13 @@ export function useUserCollateralBalance(
useEffect(() => { useEffect(() => {
const updateBalance = () => { const updateBalance = () => {
setBalanceInUSD( setBalanceInUSD(
balance * midPriceInUSD(reserve?.liquidity.mint?.toBase58() || ''), balance *
midPriceInUSD(reserve?.liquidity.mintPubkey?.toBase58() || ''),
); );
}; };
const dispose = marketEmitter.onMarket(args => { const dispose = marketEmitter.onMarket(args => {
if (args.ids.has(reserve?.liquidity.aggregator.toBase58() || '')) { if (args.ids.has(reserve?.liquidity.oraclePubkey.toBase58() || '')) {
updateBalance(); updateBalance();
} }
}); });
@ -54,7 +55,7 @@ export function useUserCollateralBalance(
balance, balance,
balanceLamports, balanceLamports,
balanceInUSD, balanceInUSD,
mint: reserve?.collateral.mint, mint: reserve?.collateral.mintPubkey,
accounts, accounts,
hasBalance: accounts.length > 0 && balance > 0, hasBalance: accounts.length > 0 && balance > 0,
}; };
@ -66,6 +67,6 @@ export function calculateCollateralBalance(
// @FIXME: use BigNumber // @FIXME: use BigNumber
return ( return (
reserveMarketCap(reserve) * reserveMarketCap(reserve) *
(balanceLamports / (reserve?.collateral.mintAmount.toNumber() || 1)) (balanceLamports / (reserve?.collateral.mintTotalSupply.toNumber() || 1))
); );
} }

View File

@ -77,7 +77,7 @@ export function useEnrichedLendingObligations() {
const reserve = item.reserve.info; const reserve = item.reserve.info;
const depositReserve = item.reserve.info; const depositReserve = item.reserve.info;
const liquidityMint = cache.get( const liquidityMint = cache.get(
reserve.liquidity.mint, reserve.liquidity.mintPubkey,
) as ParsedAccount<MintInfo>; ) as ParsedAccount<MintInfo>;
let ltv = 0; let ltv = 0;
let health = 0; let health = 0;
@ -86,7 +86,7 @@ export function useEnrichedLendingObligations() {
if (liquidityMint) { if (liquidityMint) {
const collateralMint = cache.get( const collateralMint = cache.get(
item.depositReserve.info.liquidity.mint, item.depositReserve.info.liquidity.mintPubkey,
); );
const collateral = fromLamports( const collateral = fromLamports(
@ -104,14 +104,14 @@ export function useEnrichedLendingObligations() {
const borrowedAmount = simulateMarketOrderFill( const borrowedAmount = simulateMarketOrderFill(
borrowed, borrowed,
item.reserve.info, item.reserve.info,
// @FIXME: aggregator // @FIXME: oracle
item.reserve.info.liquidity.aggregatorOption item.reserve.info.liquidity.oracleOption
? item.reserve.info.liquidity.aggregator ? item.reserve.info.liquidity.oraclePubkey
: item.depositReserve.info.liquidity.aggregator, : item.depositReserve.info.liquidity.oraclePubkey,
true, true,
); );
const liquidityMintAddress = item.reserve.info.liquidity.mint.toBase58(); const liquidityMintAddress = item.reserve.info.liquidity.mintPubkey.toBase58();
const liquidityMint = cache.get( const liquidityMint = cache.get(
liquidityMintAddress, liquidityMintAddress,
) as ParsedAccount<MintInfo>; ) as ParsedAccount<MintInfo>;
@ -140,10 +140,10 @@ export function useEnrichedLendingObligations() {
// @FIXME: BigNumber // @FIXME: BigNumber
liquidationThreshold: liquidationThreshold:
item.reserve.info.config.liquidationThreshold, item.reserve.info.config.liquidationThreshold,
repayName: getTokenName(tokenMap, reserve.liquidity.mint), repayName: getTokenName(tokenMap, reserve.liquidity.mintPubkey),
collateralName: getTokenName( collateralName: getTokenName(
tokenMap, tokenMap,
depositReserve.liquidity.mint, depositReserve.liquidity.mintPubkey,
), ),
}, },
} as EnrichedLendingObligation; } as EnrichedLendingObligation;

View File

@ -44,7 +44,7 @@ export function useLendingReserve(address?: string | PublicKey) {
const token: TokenInfo | null = getTokenByName(tokenMap, address); const token: TokenInfo | null = getTokenByName(tokenMap, address);
if (token) { if (token) {
const account = reserveAccounts.filter( const account = reserveAccounts.filter(
acc => acc.info.liquidity.mint.toBase58() === token.address, acc => acc.info.liquidity.mintPubkey.toBase58() === token.address,
)[0]; )[0];
if (account) { if (account) {
addressName = account.pubkey; addressName = account.pubkey;

View File

@ -43,7 +43,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
} }
if (!include || include.has(id)) { if (!include || include.has(id)) {
result.set(item.info.collateral.mint.toBase58(), item); result.set(item.info.collateral.mintPubkey.toBase58(), item);
} }
return result; return result;
@ -52,7 +52,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
useEffect(() => { useEffect(() => {
const activeMarkets = new Set( const activeMarkets = new Set(
reserveAccounts.map(r => r.info.liquidity.aggregator.toBase58()), reserveAccounts.map(r => r.info.liquidity.oraclePubkey.toBase58()),
); );
const userDepositsFactory = () => { const userDepositsFactory = () => {
@ -64,7 +64,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
) as ParsedAccount<Reserve>; ) as ParsedAccount<Reserve>;
let collateralMint = cache.get( let collateralMint = cache.get(
reserve.info.collateral.mint, reserve.info.collateral.mintPubkey,
) as ParsedAccount<MintInfo>; ) as ParsedAccount<MintInfo>;
const amountLamports = calculateCollateralBalance( const amountLamports = calculateCollateralBalance(
@ -72,7 +72,9 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
item?.info.amount.toNumber(), item?.info.amount.toNumber(),
); );
const amount = fromLamports(amountLamports, collateralMint?.info); const amount = fromLamports(amountLamports, collateralMint?.info);
const price = midPriceInUSD(reserve.info.liquidity.mint.toBase58()); const price = midPriceInUSD(
reserve.info.liquidity.mintPubkey.toBase58(),
);
const amountInQuote = price * amount; const amountInQuote = price * amount;
return { return {
@ -81,7 +83,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
amount, amount,
amountInQuote: amountInQuote, amountInQuote: amountInQuote,
apy: calculateDepositAPY(reserve.info), apy: calculateDepositAPY(reserve.info),
name: getTokenName(tokenMap, reserve.info.liquidity.mint), name: getTokenName(tokenMap, reserve.info.liquidity.mintPubkey),
}, },
reserve, reserve,
} as UserDeposit; } as UserDeposit;

View File

@ -1,13 +1,13 @@
body { body {
margin: 0; margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif; sans-serif;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
code { code {
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace; monospace;
} }

View File

@ -31,7 +31,7 @@ import { LendingInstruction } from './instruction';
/// 13 `[]` Clock sysvar. /// 13 `[]` Clock sysvar.
/// 13 `[]` Rent sysvar. /// 13 `[]` Rent sysvar.
/// 14 `[]` Token program id. /// 14 `[]` Token program id.
/// 15 `[optional]` Reserve liquidity aggregator account. /// 15 `[optional]` Reserve liquidity oracle account.
/// Not required for quote currency reserves. /// Not required for quote currency reserves.
/// Must match base and quote currency mint, and quote currency decimals. /// Must match base and quote currency mint, and quote currency decimals.
// InitReserve { // InitReserve {
@ -56,7 +56,7 @@ export const initReserveInstruction = (
lendingMarketAuthority: PublicKey, lendingMarketAuthority: PublicKey,
lendingMarketOwner: PublicKey, lendingMarketOwner: PublicKey,
transferAuthority: PublicKey, transferAuthority: PublicKey,
aggregator?: PublicKey, oracle?: PublicKey,
): TransactionInstruction => { ): TransactionInstruction => {
const dataLayout = BufferLayout.struct([ const dataLayout = BufferLayout.struct([
BufferLayout.u8('instruction'), BufferLayout.u8('instruction'),
@ -92,8 +92,8 @@ export const initReserveInstruction = (
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
]; ];
if (aggregator) { if (oracle) {
keys.push({ pubkey: aggregator, isSigner: false, isWritable: false }); keys.push({ pubkey: oracle, isSigner: false, isWritable: false });
} }
return new TransactionInstruction({ return new TransactionInstruction({

View File

@ -13,12 +13,12 @@ import { LendingInstruction } from './instruction';
/// ///
/// 0. `[writable]` Reserve account. /// 0. `[writable]` Reserve account.
/// 1. `[]` Clock sysvar. /// 1. `[]` Clock sysvar.
/// 2. `[optional]` Reserve liquidity aggregator account. /// 2. `[optional]` Reserve liquidity oracle account.
/// Required if the reserve currency is not the lending market quote /// Required if the reserve currency is not the lending market quote
/// currency. /// currency.
export const refreshReserveInstruction = ( export const refreshReserveInstruction = (
reserve: PublicKey, reserve: PublicKey,
aggregator?: PublicKey, oracle?: PublicKey,
): TransactionInstruction => { ): TransactionInstruction => {
const dataLayout = BufferLayout.struct([BufferLayout.u8('instruction')]); const dataLayout = BufferLayout.struct([BufferLayout.u8('instruction')]);
@ -30,8 +30,8 @@ export const refreshReserveInstruction = (
{ pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false }, { pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false },
]; ];
if (aggregator) { if (oracle) {
keys.push({ pubkey: aggregator, isSigner: false, isWritable: false }); keys.push({ pubkey: oracle, isSigner: false, isWritable: false });
} }
return new TransactionInstruction({ return new TransactionInstruction({

View File

@ -9,7 +9,7 @@ export const LendingMarketLayout: typeof BufferLayout.Structure = BufferLayout.s
Layout.publicKey('owner'), Layout.publicKey('owner'),
Layout.publicKey('quoteTokenMint'), Layout.publicKey('quoteTokenMint'),
Layout.publicKey('tokenProgramId'), Layout.publicKey('tokenProgramId'),
// extra space for future contract changes
BufferLayout.blob(128, 'padding'), BufferLayout.blob(128, 'padding'),
], ],
); );

View File

@ -4,23 +4,42 @@ import * as BufferLayout from 'buffer-layout';
import * as Layout from '../../utils/layout'; import * as Layout from '../../utils/layout';
import { LastUpdate } from './lastUpdate'; import { LastUpdate } from './lastUpdate';
// @FIXME: obligation packing
export const ObligationLayout: typeof BufferLayout.Structure = BufferLayout.struct( export const ObligationLayout: typeof BufferLayout.Structure = BufferLayout.struct(
[ [
BufferLayout.u8('version'), BufferLayout.u8('version'),
/// Amount of collateral tokens deposited for this obligation
Layout.uint64('collateral.depositedAmount'),
/// Reserve which collateral tokens were deposited into
Layout.publicKey('depositReserve'),
/// Borrow rate used for calculating interest.
Layout.uint128('cumulativeBorrowRateWads'),
/// Amount of tokens borrowed for this obligation plus interest
Layout.uint128('borrowedAmountWads'),
/// Reserve which tokens were borrowed from
Layout.publicKey('borrowReserve'),
// extra space for future contract changes BufferLayout.struct(
BufferLayout.blob(128, 'padding'), [Layout.uint64('slot'), BufferLayout.u8('stale')],
'lastUpdate',
),
Layout.publicKey('lendingMarket'),
Layout.publicKey('owner'),
Layout.uint128('depositedValue'),
Layout.uint128('borrowedValue'),
Layout.uint128('allowedBorrowValue'),
Layout.uint128('unhealthyBorrowValue'),
BufferLayout.u8('depositsLen'),
BufferLayout.u8('borrowsLen'),
BufferLayout.blob(776, 'dataFlat'),
],
);
export const ObligationCollateralLayout: typeof BufferLayout.Structure = BufferLayout.struct(
[
Layout.publicKey('depositReserve'),
Layout.uint64('depositedAmount'),
Layout.uint64('marketValue'),
],
);
export const ObligationLiquidityLayout: typeof BufferLayout.Structure = BufferLayout.struct(
[
Layout.publicKey('borrowReserve'),
Layout.uint128('cumulativeBorrowRateWads'),
Layout.uint128('borrowedAmountWads'),
Layout.uint64('marketValue'),
], ],
); );
@ -28,6 +47,20 @@ export const isObligation = (info: AccountInfo<Buffer>) => {
return info.data.length === ObligationLayout.span; return info.data.length === ObligationLayout.span;
}; };
export interface ProtoObligation {
version: number;
lastUpdate: LastUpdate;
lendingMarket: PublicKey;
owner: PublicKey;
depositedValue: BN; // decimals
borrowedValue: BN; // decimals
allowedBorrowValue: BN; // decimals
unhealthyBorrowValue: BN; // decimals
depositsLen: number;
borrowsLen: number;
dataFlat: Buffer;
}
export interface Obligation { export interface Obligation {
version: number; version: number;
lastUpdate: LastUpdate; lastUpdate: LastUpdate;
@ -39,8 +72,8 @@ export interface Obligation {
borrows: ObligationLiquidity[]; borrows: ObligationLiquidity[];
depositedValue: BN; // decimals depositedValue: BN; // decimals
borrowedValue: BN; // decimals borrowedValue: BN; // decimals
loanToValueRatio: BN; // decimals allowedBorrowValue: BN; // decimals
liquidationThreshold: BN; // decimals unhealthyBorrowValue: BN; // decimals
} }
export interface ObligationCollateral { export interface ObligationCollateral {
@ -61,12 +94,55 @@ export const ObligationParser = (
info: AccountInfo<Buffer>, info: AccountInfo<Buffer>,
) => { ) => {
const buffer = Buffer.from(info.data); const buffer = Buffer.from(info.data);
const obligation = ObligationLayout.decode(buffer) as Obligation; const {
version,
lastUpdate,
lendingMarket,
owner,
depositedValue,
borrowedValue,
allowedBorrowValue,
unhealthyBorrowValue,
depositsLen,
borrowsLen,
dataFlat,
} = ObligationLayout.decode(buffer) as ProtoObligation;
if (obligation.lastUpdate.slot.isZero()) { if (lastUpdate.slot.isZero()) {
return; return;
} }
const depositsBuffer = dataFlat.slice(
0,
depositsLen * ObligationCollateralLayout.span,
);
const deposits = BufferLayout.seq(
ObligationCollateralLayout,
depositsLen,
).decode(depositsBuffer) as ObligationCollateral[];
const borrowsBuffer = dataFlat.slice(
depositsBuffer.length,
borrowsLen * ObligationLiquidityLayout.span,
);
const borrows = BufferLayout.seq(
ObligationLiquidityLayout,
borrowsLen,
).decode(borrowsBuffer) as ObligationLiquidity[];
const obligation = {
version,
lastUpdate,
lendingMarket,
owner,
depositedValue,
borrowedValue,
allowedBorrowValue,
unhealthyBorrowValue,
deposits,
borrows,
} as Obligation;
const details = { const details = {
pubkey, pubkey,
account: { account: {

View File

@ -10,7 +10,7 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
BufferLayout.u8('version'), BufferLayout.u8('version'),
BufferLayout.struct( BufferLayout.struct(
[Layout.uint64('lastUpdateSlot'), BufferLayout.u8('lastUpdateStale')], [Layout.uint64('slot'), BufferLayout.u8('stale')],
'lastUpdate', 'lastUpdate',
), ),
@ -18,30 +18,31 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
BufferLayout.struct( BufferLayout.struct(
[ [
Layout.publicKey('liquidityMint'), Layout.publicKey('mintPubkey'),
BufferLayout.u8('liquidityMintDecimals'), BufferLayout.u8('mintDecimals'),
Layout.publicKey('liquiditySupply'), Layout.publicKey('supplyPubkey'),
Layout.publicKey('liquidityFeeReceiver'), Layout.publicKey('feeReceiver'),
Layout.uint128('cumulativeBorrowRateWads'), // @FIXME: oracle option
Layout.uint128('borrowedAmountWads'), // TODO: replace u32 option with generic equivalent
BufferLayout.u32('oracleOption'),
Layout.publicKey('oracle'),
Layout.uint64('availableAmount'), Layout.uint64('availableAmount'),
Layout.uint128('borrowedAmountWads'),
Layout.uint128('cumulativeBorrowRateWads'),
Layout.uint64('marketPrice'),
], ],
'liquidity', 'liquidity',
), ),
BufferLayout.struct( BufferLayout.struct(
[ [
Layout.publicKey('collateralMint'), Layout.publicKey('mintPubkey'),
Layout.uint64('collateralMintAmount'), Layout.uint64('mintTotalSupply'),
Layout.publicKey('collateralSupply'), Layout.publicKey('supplyPubkey'),
], ],
'collateral', 'collateral',
), ),
// TODO: replace u32 option with generic equivalent
BufferLayout.u32('aggregatorOption'),
Layout.publicKey('aggregator'),
BufferLayout.struct( BufferLayout.struct(
[ [
BufferLayout.u8('optimalUtilizationRate'), BufferLayout.u8('optimalUtilizationRate'),
@ -59,7 +60,6 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
'config', 'config',
), ),
// extra space for future contract changes
BufferLayout.blob(256, 'padding'), BufferLayout.blob(256, 'padding'),
], ],
); );
@ -78,28 +78,25 @@ export interface Reserve {
} }
export interface ReserveLiquidity { export interface ReserveLiquidity {
mint: PublicKey; mintPubkey: PublicKey;
mintDecimals: number; mintDecimals: number;
supply: PublicKey; supplyPubkey: PublicKey;
feeReceiver: PublicKey; feeReceiver: PublicKey;
// @FIXME: oracle option
// @FIXME: aggregator option oracleOption: number;
aggregatorOption: number; oraclePubkey: PublicKey;
aggregator: PublicKey;
cumulativeBorrowRateWads: BN;
marketPrice: BN;
availableAmount: BN; availableAmount: BN;
borrowedAmountWads: BN; borrowedAmountWads: BN;
cumulativeBorrowRateWads: BN;
marketPrice: BN;
} }
export interface ReserveCollateral { export interface ReserveCollateral {
mint: PublicKey; mintPubkey: PublicKey;
mintAmount: BN; mintTotalSupply: BN;
supply: PublicKey; supplyPubkey: PublicKey;
} }
// @FIXME: use BigNumber
export interface ReserveConfig { export interface ReserveConfig {
optimalUtilizationRate: number; optimalUtilizationRate: number;
loanToValueRatio: number; loanToValueRatio: number;
@ -159,7 +156,8 @@ export const reserveMarketCap = (reserve?: Reserve) => {
export const collateralExchangeRate = (reserve?: Reserve) => { export const collateralExchangeRate = (reserve?: Reserve) => {
// @FIXME: use BigNumber // @FIXME: use BigNumber
return ( return (
(reserve?.collateral.mintAmount.toNumber() || 1) / reserveMarketCap(reserve) (reserve?.collateral.mintTotalSupply.toNumber() || 1) /
reserveMarketCap(reserve)
); );
}; };

View File

@ -14,8 +14,9 @@ import { useBorrowingPower } from '../../hooks';
import { calculateBorrowAPY, Reserve } from '../../models'; import { calculateBorrowAPY, Reserve } from '../../models';
export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => { export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => {
const name = useTokenName(props.reserve.liquidity.mint); const name = useTokenName(props.reserve.liquidity.mintPubkey);
const price = useMidPriceInUSD(props.reserve.liquidity.mint.toBase58()).price; const price = useMidPriceInUSD(props.reserve.liquidity.mintPubkey.toBase58())
.price;
const { borrowingPower, totalInQuote } = useBorrowingPower(props.address); const { borrowingPower, totalInQuote } = useBorrowingPower(props.address);
@ -25,7 +26,7 @@ export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => {
<Link to={`/borrow/${props.address.toBase58()}`}> <Link to={`/borrow/${props.address.toBase58()}`}>
<div className="borrow-item"> <div className="borrow-item">
<span style={{ display: 'flex' }}> <span style={{ display: 'flex' }}>
<TokenIcon mintAddress={props.reserve.liquidity.mint} /> <TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
{name} {name}
</span> </span>
<div>${formatNumber.format(price)}</div> <div>${formatNumber.format(price)}</div>

View File

@ -13,7 +13,7 @@ import { calculateDepositAPY } from '../../../models';
export const DepositItem = (props: { userDeposit: UserDeposit }) => { export const DepositItem = (props: { userDeposit: UserDeposit }) => {
const { reserve, info } = props.userDeposit; const { reserve, info } = props.userDeposit;
const mintAddress = reserve.info.liquidity.mint; const mintAddress = reserve.info.liquidity.mintPubkey;
const name = useTokenName(mintAddress); const name = useTokenName(mintAddress);
const depositAPY = useMemo(() => calculateDepositAPY(reserve.info), [ const depositAPY = useMemo(() => calculateDepositAPY(reserve.info), [

View File

@ -34,8 +34,8 @@ export const ObligationItem = (props: {
obligation.info.deposits[0].depositReserve, obligation.info.deposits[0].depositReserve,
) as ParsedAccount<Reserve>; ) as ParsedAccount<Reserve>;
const liquidityMint = useMint(borrowReserve.info.liquidity.mint); const liquidityMint = useMint(borrowReserve.info.liquidity.mintPubkey);
const collateralMint = useMint(depositReserve.info.liquidity.mint); const collateralMint = useMint(depositReserve.info.liquidity.mintPubkey);
const borrowAmount = fromLamports( const borrowAmount = fromLamports(
wadToLamports(obligation.info.borrows[0].borrowedAmountWads), wadToLamports(obligation.info.borrows[0].borrowedAmountWads),
@ -52,8 +52,10 @@ export const ObligationItem = (props: {
); );
const collateral = fromLamports(collateralLamports, collateralMint); const collateral = fromLamports(collateralLamports, collateralMint);
const borrowName = useTokenName(borrowReserve?.info.liquidity.mint); const borrowName = useTokenName(borrowReserve?.info.liquidity.mintPubkey);
const collateralName = useTokenName(depositReserve?.info.liquidity.mint); const collateralName = useTokenName(
depositReserve?.info.liquidity.mintPubkey,
);
return ( return (
<div className="dashboard-item"> <div className="dashboard-item">
@ -63,10 +65,10 @@ export const ObligationItem = (props: {
title={`${collateralName}${borrowName}`} title={`${collateralName}${borrowName}`}
> >
<TokenIcon <TokenIcon
mintAddress={depositReserve?.info.liquidity.mint} mintAddress={depositReserve?.info.liquidity.mintPubkey}
style={{ marginRight: '-0.5rem' }} style={{ marginRight: '-0.5rem' }}
/> />
<TokenIcon mintAddress={borrowReserve?.info.liquidity.mint} /> <TokenIcon mintAddress={borrowReserve?.info.liquidity.mintPubkey} />
</div> </div>
</span> </span>
<div> <div>

View File

@ -1 +1 @@
export * from "./view"; export * from './view';

View File

@ -16,11 +16,11 @@ export const ReserveItem = (props: {
reserve: Reserve; reserve: Reserve;
address: PublicKey; address: PublicKey;
}) => { }) => {
const name = useTokenName(props.reserve.liquidity.mint); const name = useTokenName(props.reserve.liquidity.mintPubkey);
const { const {
balance: tokenBalance, balance: tokenBalance,
balanceInUSD: tokenBalanceInUSD, balanceInUSD: tokenBalanceInUSD,
} = useUserBalance(props.reserve.liquidity.mint); } = useUserBalance(props.reserve.liquidity.mintPubkey);
const { const {
balance: collateralBalance, balance: collateralBalance,
balanceInUSD: collateralBalanceInUSD, balanceInUSD: collateralBalanceInUSD,
@ -32,7 +32,7 @@ export const ReserveItem = (props: {
<Link to={`/deposit/${props.address.toBase58()}`}> <Link to={`/deposit/${props.address.toBase58()}`}>
<div className="deposit-item"> <div className="deposit-item">
<span style={{ display: 'flex' }}> <span style={{ display: 'flex' }}>
<TokenIcon mintAddress={props.reserve.liquidity.mint} /> <TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
{name} {name}
</span> </span>
<div> <div>

View File

@ -13,7 +13,7 @@ export const FaucetView = () => {
const airdrop = useCallback(() => { const airdrop = useCallback(() => {
if (!wallet?.publicKey) { if (!wallet?.publicKey) {
return; return;
} }
connection connection
@ -21,28 +21,28 @@ export const FaucetView = () => {
.then(() => { .then(() => {
notify({ notify({
message: LABELS.ACCOUNT_FUNDED, message: LABELS.ACCOUNT_FUNDED,
type: "success", type: 'success',
}); });
}); });
}, [wallet, wallet?.publicKey, connection]); }, [wallet, wallet?.publicKey, connection]);
const bodyStyle: React.CSSProperties = { const bodyStyle: React.CSSProperties = {
display: "flex", display: 'flex',
flex: 1, flex: 1,
justifyContent: "center", justifyContent: 'center',
alignItems: "center", alignItems: 'center',
height: "100%", height: '100%',
}; };
return ( return (
<div className="flexColumn" style={{ flex: 1 }}> <div className="flexColumn" style={{ flex: 1 }}>
<Card title={"Faucet"} bodyStyle={bodyStyle} style={{ flex: 1 }}> <Card title={'Faucet'} bodyStyle={bodyStyle} style={{ flex: 1 }}>
<div <div
style={{ style={{
display: "flex", display: 'flex',
flexDirection: "column", flexDirection: 'column',
justifyContent: "space-around", justifyContent: 'space-around',
alignItems: "center", alignItems: 'center',
}} }}
> >
<div className="deposit-input-title" style={{ margin: 10 }}> <div className="deposit-input-title" style={{ margin: 10 }}>

View File

@ -44,7 +44,7 @@ export const HomeView = () => {
const localCache = cache; const localCache = cache;
const liquidityMint = localCache.get( const liquidityMint = localCache.get(
item.info.liquidity.mint.toBase58(), item.info.liquidity.mintPubkey.toBase58(),
) as ParsedAccount<MintInfo>; ) as ParsedAccount<MintInfo>;
if (!liquidityMint) { if (!liquidityMint) {
@ -62,7 +62,10 @@ export const HomeView = () => {
wadToLamports(item.info?.liquidity.borrowedAmountWads).toNumber(), wadToLamports(item.info?.liquidity.borrowedAmountWads).toNumber(),
liquidityMint.info, liquidityMint.info,
) * price, ) * price,
name: getTokenName(tokenMap, item.info.liquidity.mint.toBase58()), name: getTokenName(
tokenMap,
item.info.liquidity.mintPubkey.toBase58(),
),
}; };
newTotals.items.push(leaf); newTotals.items.push(leaf);

View File

@ -24,9 +24,9 @@ export const LendingReserveItem = (props: {
address: PublicKey; address: PublicKey;
item?: TotalItem; item?: TotalItem;
}) => { }) => {
const name = useTokenName(props.reserve.liquidity.mint); const name = useTokenName(props.reserve.liquidity.mintPubkey);
const liquidityMint = useMint(props.reserve.liquidity.mint); const liquidityMint = useMint(props.reserve.liquidity.mintPubkey);
const availableAmount = fromLamports( const availableAmount = fromLamports(
props.reserve.liquidity.availableAmount, props.reserve.liquidity.availableAmount,
@ -56,7 +56,7 @@ export const LendingReserveItem = (props: {
<Link to={`/reserve/${props.address.toBase58()}`}> <Link to={`/reserve/${props.address.toBase58()}`}>
<div className="home-item"> <div className="home-item">
<span style={{ display: 'flex' }}> <span style={{ display: 'flex' }}>
<TokenIcon mintAddress={props.reserve.liquidity.mint} /> <TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
{name} {name}
</span> </span>
<div title={marketSize.toString()}> <div title={marketSize.toString()}>

View File

@ -1,13 +1,13 @@
export { HomeView } from "./home"; export { HomeView } from './home';
export { BorrowView } from "./borrow"; export { BorrowView } from './borrow';
export { BorrowReserveView } from "./borrowReserve"; export { BorrowReserveView } from './borrowReserve';
export { DashboardView } from "./dashboard"; export { DashboardView } from './dashboard';
export { DepositView } from "./deposit"; export { DepositView } from './deposit';
export { DepositReserveView } from "./depositReserve"; export { DepositReserveView } from './depositReserve';
export { ReserveView } from "./reserve"; export { ReserveView } from './reserve';
export { WithdrawView } from "./withdraw"; export { WithdrawView } from './withdraw';
export { FaucetView } from "./faucet"; export { FaucetView } from './faucet';
export { RepayReserveView } from "./repayReserve"; export { RepayReserveView } from './repayReserve';
export { LiquidateView } from "./liquidate"; export { LiquidateView } from './liquidate';
export { LiquidateReserveView } from "./liquidateReserve"; export { LiquidateReserveView } from './liquidateReserve';
export { MarginTrading } from "./margin"; export { MarginTrading } from './margin';

View File

@ -32,8 +32,8 @@ export const LiquidateItem = (props: { item: EnrichedLendingObligation }) => {
obligation.deposits[0].depositReserve, obligation.deposits[0].depositReserve,
) as ParsedAccount<Reserve>; ) as ParsedAccount<Reserve>;
const liquidityMint = useMint(borrowReserve.info.liquidity.mint); const liquidityMint = useMint(borrowReserve.info.liquidity.mintPubkey);
const collateralMint = useMint(depositReserve.info.liquidity.mint); const collateralMint = useMint(depositReserve.info.liquidity.mintPubkey);
const borrowAmount = fromLamports( const borrowAmount = fromLamports(
wadToLamports(obligation.borrows[0].borrowedAmountWads), wadToLamports(obligation.borrows[0].borrowedAmountWads),
@ -50,8 +50,10 @@ export const LiquidateItem = (props: { item: EnrichedLendingObligation }) => {
); );
const collateral = fromLamports(collateralLamports, collateralMint); const collateral = fromLamports(collateralLamports, collateralMint);
const borrowName = useTokenName(borrowReserve?.info.liquidity.mint); const borrowName = useTokenName(borrowReserve?.info.liquidity.mintPubkey);
const collateralName = useTokenName(depositReserve?.info.liquidity.mint); const collateralName = useTokenName(
depositReserve?.info.liquidity.mintPubkey,
);
return ( return (
<Link to={`/liquidate/${props.item.account.pubkey.toBase58()}`}> <Link to={`/liquidate/${props.item.account.pubkey.toBase58()}`}>
@ -59,10 +61,10 @@ export const LiquidateItem = (props: { item: EnrichedLendingObligation }) => {
<span style={{ display: 'flex' }}> <span style={{ display: 'flex' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<TokenIcon <TokenIcon
mintAddress={depositReserve?.info.liquidity.mint} mintAddress={depositReserve?.info.liquidity.mintPubkey}
style={{ marginRight: '-0.5rem' }} style={{ marginRight: '-0.5rem' }}
/> />
<TokenIcon mintAddress={borrowReserve?.info.liquidity.mint} /> <TokenIcon mintAddress={borrowReserve?.info.liquidity.mintPubkey} />
</div> </div>
{collateralName}{borrowName} {collateralName}{borrowName}
</span> </span>

View File

@ -17,8 +17,9 @@ export const MarginTradeItem = (props: {
reserve: Reserve; reserve: Reserve;
address: PublicKey; address: PublicKey;
}) => { }) => {
const name = useTokenName(props.reserve.liquidity.mint); const name = useTokenName(props.reserve.liquidity.mintPubkey);
const price = useMidPriceInUSD(props.reserve.liquidity.mint.toBase58()).price; const price = useMidPriceInUSD(props.reserve.liquidity.mintPubkey.toBase58())
.price;
const apr = calculateBorrowAPY(props.reserve); const apr = calculateBorrowAPY(props.reserve);
@ -33,7 +34,7 @@ export const MarginTradeItem = (props: {
<Link to={`/margin/${props.address.toBase58()}`}> <Link to={`/margin/${props.address.toBase58()}`}>
<div className="choose-margin-item"> <div className="choose-margin-item">
<span style={{ display: 'flex' }}> <span style={{ display: 'flex' }}>
<TokenIcon mintAddress={props.reserve.liquidity.mint} /> <TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
{name} {name}
</span> </span>
<div>${formatNumber.format(price)}</div> <div>${formatNumber.format(price)}</div>

View File

@ -22,10 +22,12 @@ export default function Breakdown({ item }: { item: Position }) {
const gains = 'green'; const gains = 'green';
const losses = 'red'; const losses = 'red';
const token = tokens.find( const token = tokens.find(
t => t.address === item.asset.type?.info?.liquidity.mint?.toBase58(), t => t.address === item.asset.type?.info?.liquidity.mintPubkey?.toBase58(),
); );
const collateralToken = tokens.find( const collateralToken = tokens.find(
t => t.address === item.collateral.type?.info?.liquidity.mint?.toBase58(), t =>
t.address ===
item.collateral.type?.info?.liquidity.mintPubkey?.toBase58(),
); );
const [myGain, setMyGain] = useState<number>(10); const [myGain, setMyGain] = useState<number>(10);

View File

@ -64,35 +64,35 @@ function getChartData() {
//the only way to create an immutable copy of array with objects inside. //the only way to create an immutable copy of array with objects inside.
const baseDashed = getBaseDashed(); const baseDashed = getBaseDashed();
const baseSolid = JSON.parse( const baseSolid = JSON.parse(
JSON.stringify(baseData.slice(0, Math.floor(baseData.length) / 2 + 1)) JSON.stringify(baseData.slice(0, Math.floor(baseData.length) / 2 + 1)),
); );
return { return {
datasets: [ datasets: [
{ {
backgroundColor: "transparent", backgroundColor: 'transparent',
borderColor: "rgb(39, 107, 251)", borderColor: 'rgb(39, 107, 251)',
borderWidth: 4, borderWidth: 4,
radius: 0, radius: 0,
data: baseSolid, data: baseSolid,
}, },
{ {
backgroundColor: "transparent", backgroundColor: 'transparent',
borderWidth: 4, borderWidth: 4,
radius: 0, radius: 0,
data: baseDashed, data: baseDashed,
borderDash: [15, 3], borderDash: [15, 3],
label: "LEVERAGE", label: 'LEVERAGE',
}, },
{ {
backgroundColor: "transparent", backgroundColor: 'transparent',
borderColor: "rgb(86, 169, 255)", borderColor: 'rgb(86, 169, 255)',
borderWidth: 2, borderWidth: 2,
radius: 0, radius: 0,
data: baseDashed, data: baseDashed,
borderDash: [8, 4], borderDash: [8, 4],
label: "HOLD", label: 'HOLD',
}, },
], ],
}; };
@ -102,7 +102,7 @@ const labelPlugin: ChartPluginsOptions = {};
const getBaseDashed = () => { const getBaseDashed = () => {
return JSON.parse( return JSON.parse(
JSON.stringify(baseData.slice(Math.floor(baseData.length) / 2)) JSON.stringify(baseData.slice(Math.floor(baseData.length) / 2)),
) as { x: number; y: number }[]; ) as { x: number; y: number }[];
}; };
@ -132,12 +132,12 @@ function updateChartData({
} }
const gain = (priceChange * leverage) / 100; const gain = (priceChange * leverage) / 100;
return { x: item.x, y: item.y * (1 + gain) }; return { x: item.x, y: item.y * (1 + gain) };
} },
); );
chart.data.datasets[1].data = leverageData; chart.data.datasets[1].data = leverageData;
chart.data.datasets[1].borderColor = chart.data.datasets[1].borderColor =
priceChange >= 0 ? "rgb(51, 223, 204)" : "rgb(255,79,79)"; priceChange >= 0 ? 'rgb(51, 223, 204)' : 'rgb(255,79,79)';
baseDashed.forEach((item: { y: number; x: number }, index: number) => { baseDashed.forEach((item: { y: number; x: number }, index: number) => {
if (index !== 0) item.y += (item.y * priceChange) / 100; if (index !== 0) item.y += (item.y * priceChange) / 100;
@ -166,8 +166,8 @@ function drawLabels(chart: Chart, leverage: number, priceChange: number) {
} }
ctx.save(); ctx.save();
ctx.font = "normal normal bold 15px /1.5 Muli"; ctx.font = 'normal normal bold 15px /1.5 Muli';
ctx.textBaseline = "bottom"; ctx.textBaseline = 'bottom';
const datasets = chart.config.data.datasets; const datasets = chart.config.data.datasets;
const element = chart?.canvas?.parentNode as HTMLElement; const element = chart?.canvas?.parentNode as HTMLElement;
@ -183,7 +183,7 @@ function drawLabels(chart: Chart, leverage: number, priceChange: number) {
const y = meta.data[pointPostition]._model.y; const y = meta.data[pointPostition]._model.y;
let yOffset; let yOffset;
if (label === "HOLD") { if (label === 'HOLD') {
yOffset = leverage * priceChange > 0 ? y * 1.2 : y * 0.8; yOffset = leverage * priceChange > 0 ? y * 1.2 : y * 0.8;
} else { } else {
yOffset = leverage * priceChange > 0 ? y * 0.8 : y * 1.2; yOffset = leverage * priceChange > 0 ? y * 0.8 : y * 1.2;
@ -215,7 +215,7 @@ export default function GainsChart({
} }
chartRef.current = new Chart(canvasRef.current, { chartRef.current = new Chart(canvasRef.current, {
type: "line", type: 'line',
data: getChartData(), data: getChartData(),
plugins: [labelPlugin], plugins: [labelPlugin],
options: { options: {
@ -229,12 +229,12 @@ export default function GainsChart({
}, },
}, },
labels: { labels: {
render: "title", render: 'title',
fontColor: ["green", "white", "red"], fontColor: ['green', 'white', 'red'],
precision: 2, precision: 2,
}, },
animation: { animation: {
easing: "easeOutExpo", easing: 'easeOutExpo',
duration: 500, duration: 500,
}, },
scales: { scales: {
@ -244,8 +244,8 @@ export default function GainsChart({
gridLines: { gridLines: {
display: false, display: false,
}, },
type: "linear", type: 'linear',
position: "bottom", position: 'bottom',
}, },
], ],
yAxes: [ yAxes: [
@ -273,19 +273,19 @@ export default function GainsChart({
return ( return (
<div <div
style={{ style={{
display: "flex", display: 'flex',
flexDirection: "column", flexDirection: 'column',
alignItems: "stretch", alignItems: 'stretch',
justifyContent: "center", justifyContent: 'center',
}} }}
> >
<canvas ref={canvasRef as any} /> <canvas ref={canvasRef as any} />
<div <div
style={{ style={{
display: "flex", display: 'flex',
flexDirection: "row", flexDirection: 'row',
justifyContent: "space-between", justifyContent: 'space-between',
alignItems: "center", alignItems: 'center',
}} }}
> >
<span>past</span> <span>past</span>

View File

@ -140,9 +140,7 @@ export default function NewPositionForm({
}} }}
onCollateralReserve={key => { onCollateralReserve={key => {
const id: string = const id: string =
cache cache.byParser(ReserveParser).find(acc => acc === key) || '';
.byParser(ReserveParser)
.find(acc => acc === key) || '';
const parser = cache.get(id) as ParsedAccount<Reserve>; const parser = cache.get(id) as ParsedAccount<Reserve>;
const newPos = { const newPos = {
...newPosition, ...newPosition,

View File

@ -23,15 +23,15 @@ export function usePoolAndTradeInfoFrom(
const desiredValue = newPosition.asset.value || 0; const desiredValue = newPosition.asset.value || 0;
const pool = usePoolForBasket([ const pool = usePoolForBasket([
collType?.info?.liquidity.mint?.toBase58(), collType?.info?.liquidity.mintPubkey?.toBase58(),
desiredType?.info?.liquidity.mint?.toBase58(), desiredType?.info?.liquidity.mintPubkey?.toBase58(),
]); ]);
const userDeposits = useUserDeposits(); const userDeposits = useUserDeposits();
const collateralDeposit = userDeposits.userDeposits.find( const collateralDeposit = userDeposits.userDeposits.find(
u => u =>
u.reserve.info.liquidity.mint.toBase58() === u.reserve.info.liquidity.mintPubkey.toBase58() ===
collType?.info?.liquidity.mint?.toBase58(), collType?.info?.liquidity.mintPubkey?.toBase58(),
); );
const enrichedPools = useEnrichedPools(pool ? [pool] : []); const enrichedPools = useEnrichedPools(pool ? [pool] : []);

View File

@ -1,9 +1,9 @@
declare module "buffer-layout" { declare module 'buffer-layout' {
const bl: any; const bl: any;
export = bl; export = bl;
} }
declare module "jazzicon" { declare module 'jazzicon' {
const jazzicon: any; const jazzicon: any;
export = jazzicon; export = jazzicon;
} }