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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,7 +7,7 @@ import { WaterWave } from './../WaterWave';
const { useMint } = contexts.Accounts;
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 availableAmount = fromLamports(
props.reserve.liquidity.availableAmount,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -11,9 +11,9 @@ export function useUserCollateralBalance(
reserve?: Reserve,
account?: PublicKey,
) {
const mint = useMint(reserve?.collateral.mint);
const mint = useMint(reserve?.collateral.mintPubkey);
const { balanceLamports: userBalance, accounts } = useUserBalance(
reserve?.collateral.mint,
reserve?.collateral.mintPubkey,
account,
);
@ -33,12 +33,13 @@ export function useUserCollateralBalance(
useEffect(() => {
const updateBalance = () => {
setBalanceInUSD(
balance * midPriceInUSD(reserve?.liquidity.mint?.toBase58() || ''),
balance *
midPriceInUSD(reserve?.liquidity.mintPubkey?.toBase58() || ''),
);
};
const dispose = marketEmitter.onMarket(args => {
if (args.ids.has(reserve?.liquidity.aggregator.toBase58() || '')) {
if (args.ids.has(reserve?.liquidity.oraclePubkey.toBase58() || '')) {
updateBalance();
}
});
@ -54,7 +55,7 @@ export function useUserCollateralBalance(
balance,
balanceLamports,
balanceInUSD,
mint: reserve?.collateral.mint,
mint: reserve?.collateral.mintPubkey,
accounts,
hasBalance: accounts.length > 0 && balance > 0,
};
@ -66,6 +67,6 @@ export function calculateCollateralBalance(
// @FIXME: use BigNumber
return (
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 depositReserve = item.reserve.info;
const liquidityMint = cache.get(
reserve.liquidity.mint,
reserve.liquidity.mintPubkey,
) as ParsedAccount<MintInfo>;
let ltv = 0;
let health = 0;
@ -86,7 +86,7 @@ export function useEnrichedLendingObligations() {
if (liquidityMint) {
const collateralMint = cache.get(
item.depositReserve.info.liquidity.mint,
item.depositReserve.info.liquidity.mintPubkey,
);
const collateral = fromLamports(
@ -104,14 +104,14 @@ export function useEnrichedLendingObligations() {
const borrowedAmount = simulateMarketOrderFill(
borrowed,
item.reserve.info,
// @FIXME: aggregator
item.reserve.info.liquidity.aggregatorOption
? item.reserve.info.liquidity.aggregator
: item.depositReserve.info.liquidity.aggregator,
// @FIXME: oracle
item.reserve.info.liquidity.oracleOption
? item.reserve.info.liquidity.oraclePubkey
: item.depositReserve.info.liquidity.oraclePubkey,
true,
);
const liquidityMintAddress = item.reserve.info.liquidity.mint.toBase58();
const liquidityMintAddress = item.reserve.info.liquidity.mintPubkey.toBase58();
const liquidityMint = cache.get(
liquidityMintAddress,
) as ParsedAccount<MintInfo>;
@ -140,10 +140,10 @@ export function useEnrichedLendingObligations() {
// @FIXME: BigNumber
liquidationThreshold:
item.reserve.info.config.liquidationThreshold,
repayName: getTokenName(tokenMap, reserve.liquidity.mint),
repayName: getTokenName(tokenMap, reserve.liquidity.mintPubkey),
collateralName: getTokenName(
tokenMap,
depositReserve.liquidity.mint,
depositReserve.liquidity.mintPubkey,
),
},
} as EnrichedLendingObligation;

View File

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

View File

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

View File

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

View File

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

View File

@ -13,12 +13,12 @@ import { LendingInstruction } from './instruction';
///
/// 0. `[writable]` Reserve account.
/// 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
/// currency.
export const refreshReserveInstruction = (
reserve: PublicKey,
aggregator?: PublicKey,
oracle?: PublicKey,
): TransactionInstruction => {
const dataLayout = BufferLayout.struct([BufferLayout.u8('instruction')]);
@ -30,8 +30,8 @@ export const refreshReserveInstruction = (
{ pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false },
];
if (aggregator) {
keys.push({ pubkey: aggregator, isSigner: false, isWritable: false });
if (oracle) {
keys.push({ pubkey: oracle, isSigner: false, isWritable: false });
}
return new TransactionInstruction({

View File

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

View File

@ -4,23 +4,42 @@ import * as BufferLayout from 'buffer-layout';
import * as Layout from '../../utils/layout';
import { LastUpdate } from './lastUpdate';
// @FIXME: obligation packing
export const ObligationLayout: typeof BufferLayout.Structure = BufferLayout.struct(
[
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.blob(128, 'padding'),
BufferLayout.struct(
[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;
};
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 {
version: number;
lastUpdate: LastUpdate;
@ -39,8 +72,8 @@ export interface Obligation {
borrows: ObligationLiquidity[];
depositedValue: BN; // decimals
borrowedValue: BN; // decimals
loanToValueRatio: BN; // decimals
liquidationThreshold: BN; // decimals
allowedBorrowValue: BN; // decimals
unhealthyBorrowValue: BN; // decimals
}
export interface ObligationCollateral {
@ -61,12 +94,55 @@ export const ObligationParser = (
info: AccountInfo<Buffer>,
) => {
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;
}
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 = {
pubkey,
account: {

View File

@ -10,7 +10,7 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
BufferLayout.u8('version'),
BufferLayout.struct(
[Layout.uint64('lastUpdateSlot'), BufferLayout.u8('lastUpdateStale')],
[Layout.uint64('slot'), BufferLayout.u8('stale')],
'lastUpdate',
),
@ -18,30 +18,31 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
BufferLayout.struct(
[
Layout.publicKey('liquidityMint'),
BufferLayout.u8('liquidityMintDecimals'),
Layout.publicKey('liquiditySupply'),
Layout.publicKey('liquidityFeeReceiver'),
Layout.uint128('cumulativeBorrowRateWads'),
Layout.uint128('borrowedAmountWads'),
Layout.publicKey('mintPubkey'),
BufferLayout.u8('mintDecimals'),
Layout.publicKey('supplyPubkey'),
Layout.publicKey('feeReceiver'),
// @FIXME: oracle option
// TODO: replace u32 option with generic equivalent
BufferLayout.u32('oracleOption'),
Layout.publicKey('oracle'),
Layout.uint64('availableAmount'),
Layout.uint128('borrowedAmountWads'),
Layout.uint128('cumulativeBorrowRateWads'),
Layout.uint64('marketPrice'),
],
'liquidity',
),
BufferLayout.struct(
[
Layout.publicKey('collateralMint'),
Layout.uint64('collateralMintAmount'),
Layout.publicKey('collateralSupply'),
Layout.publicKey('mintPubkey'),
Layout.uint64('mintTotalSupply'),
Layout.publicKey('supplyPubkey'),
],
'collateral',
),
// TODO: replace u32 option with generic equivalent
BufferLayout.u32('aggregatorOption'),
Layout.publicKey('aggregator'),
BufferLayout.struct(
[
BufferLayout.u8('optimalUtilizationRate'),
@ -59,7 +60,6 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
'config',
),
// extra space for future contract changes
BufferLayout.blob(256, 'padding'),
],
);
@ -78,28 +78,25 @@ export interface Reserve {
}
export interface ReserveLiquidity {
mint: PublicKey;
mintPubkey: PublicKey;
mintDecimals: number;
supply: PublicKey;
supplyPubkey: PublicKey;
feeReceiver: PublicKey;
// @FIXME: aggregator option
aggregatorOption: number;
aggregator: PublicKey;
cumulativeBorrowRateWads: BN;
marketPrice: BN;
// @FIXME: oracle option
oracleOption: number;
oraclePubkey: PublicKey;
availableAmount: BN;
borrowedAmountWads: BN;
cumulativeBorrowRateWads: BN;
marketPrice: BN;
}
export interface ReserveCollateral {
mint: PublicKey;
mintAmount: BN;
supply: PublicKey;
mintPubkey: PublicKey;
mintTotalSupply: BN;
supplyPubkey: PublicKey;
}
// @FIXME: use BigNumber
export interface ReserveConfig {
optimalUtilizationRate: number;
loanToValueRatio: number;
@ -159,7 +156,8 @@ export const reserveMarketCap = (reserve?: Reserve) => {
export const collateralExchangeRate = (reserve?: Reserve) => {
// @FIXME: use BigNumber
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';
export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => {
const name = useTokenName(props.reserve.liquidity.mint);
const price = useMidPriceInUSD(props.reserve.liquidity.mint.toBase58()).price;
const name = useTokenName(props.reserve.liquidity.mintPubkey);
const price = useMidPriceInUSD(props.reserve.liquidity.mintPubkey.toBase58())
.price;
const { borrowingPower, totalInQuote } = useBorrowingPower(props.address);
@ -25,7 +26,7 @@ export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => {
<Link to={`/borrow/${props.address.toBase58()}`}>
<div className="borrow-item">
<span style={{ display: 'flex' }}>
<TokenIcon mintAddress={props.reserve.liquidity.mint} />
<TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
{name}
</span>
<div>${formatNumber.format(price)}</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -22,10 +22,12 @@ export default function Breakdown({ item }: { item: Position }) {
const gains = 'green';
const losses = 'red';
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(
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);

View File

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

View File

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

View File

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

View File

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