mirror of https://github.com/certusone/oyster.git
refactoring
This commit is contained in:
parent
6296ef31bc
commit
97bc5f76e3
|
@ -0,0 +1 @@
|
|||
build
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
);
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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}
|
||||
/>
|
||||
)}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(() => {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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(() => {
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
);
|
||||
|
|
|
@ -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(_ => _);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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()])
|
||||
|
|
|
@ -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))
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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'),
|
||||
],
|
||||
);
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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)
|
||||
);
|
||||
};
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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), [
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1 +1 @@
|
|||
export * from "./view";
|
||||
export * from './view';
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 }}>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()}>
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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] : []);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue