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,
|
instructions,
|
||||||
[],
|
[],
|
||||||
accountRentExempt,
|
accountRentExempt,
|
||||||
borrowReserve.info.liquidity.mint,
|
borrowReserve.info.liquidity.mintPubkey,
|
||||||
signers,
|
signers,
|
||||||
)
|
)
|
||||||
: undefined;
|
: undefined;
|
||||||
|
|
||||||
const mint = (await cache.query(
|
const mint = (await cache.query(
|
||||||
connection,
|
connection,
|
||||||
borrowReserve.info.liquidity.mint,
|
borrowReserve.info.liquidity.mintPubkey,
|
||||||
MintParser,
|
MintParser,
|
||||||
)) as ParsedAccount<MintInfo>;
|
)) as ParsedAccount<MintInfo>;
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ export const borrowObligationLiquidity = async (
|
||||||
instructions,
|
instructions,
|
||||||
finalCleanupInstructions,
|
finalCleanupInstructions,
|
||||||
accountRentExempt,
|
accountRentExempt,
|
||||||
borrowReserve.info.liquidity.mint,
|
borrowReserve.info.liquidity.mintPubkey,
|
||||||
signers,
|
signers,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -113,18 +113,18 @@ export const borrowObligationLiquidity = async (
|
||||||
instructions.push(
|
instructions.push(
|
||||||
refreshReserveInstruction(
|
refreshReserveInstruction(
|
||||||
borrowReserve.pubkey,
|
borrowReserve.pubkey,
|
||||||
borrowReserve.info.liquidity.aggregatorOption
|
borrowReserve.info.liquidity.oracleOption
|
||||||
? borrowReserve.info.liquidity.aggregator
|
? borrowReserve.info.liquidity.oraclePubkey
|
||||||
: undefined,
|
: undefined,
|
||||||
),
|
),
|
||||||
refreshObligationInstruction(
|
refreshObligationInstruction(
|
||||||
obligation.pubkey,
|
obligation.pubkey,
|
||||||
obligation.info.deposits.map((collateral) => collateral.depositReserve),
|
obligation.info.deposits.map(collateral => collateral.depositReserve),
|
||||||
obligation.info.borrows.map((liquidity) => liquidity.borrowReserve),
|
obligation.info.borrows.map(liquidity => liquidity.borrowReserve),
|
||||||
),
|
),
|
||||||
borrowObligationLiquidityInstruction(
|
borrowObligationLiquidityInstruction(
|
||||||
amountLamports,
|
amountLamports,
|
||||||
borrowReserve.info.liquidity.supply,
|
borrowReserve.info.liquidity.supplyPubkey,
|
||||||
destinationLiquidity,
|
destinationLiquidity,
|
||||||
borrowReserve.pubkey,
|
borrowReserve.pubkey,
|
||||||
borrowReserve.info.liquidity.feeReceiver,
|
borrowReserve.info.liquidity.feeReceiver,
|
||||||
|
|
|
@ -86,7 +86,7 @@ export const depositReserveLiquidity = async (
|
||||||
instructions,
|
instructions,
|
||||||
cleanupInstructions,
|
cleanupInstructions,
|
||||||
accountRentExempt,
|
accountRentExempt,
|
||||||
reserve.collateral.mint,
|
reserve.collateral.mintPubkey,
|
||||||
signers,
|
signers,
|
||||||
)
|
)
|
||||||
: createUninitializedAccount(
|
: createUninitializedAccount(
|
||||||
|
@ -100,8 +100,8 @@ export const depositReserveLiquidity = async (
|
||||||
instructions.push(
|
instructions.push(
|
||||||
refreshReserveInstruction(
|
refreshReserveInstruction(
|
||||||
reserveAddress,
|
reserveAddress,
|
||||||
reserve.liquidity.aggregatorOption
|
reserve.liquidity.oracleOption
|
||||||
? reserve.liquidity.aggregator
|
? reserve.liquidity.oraclePubkey
|
||||||
: undefined,
|
: undefined,
|
||||||
),
|
),
|
||||||
depositReserveLiquidityInstruction(
|
depositReserveLiquidityInstruction(
|
||||||
|
@ -109,8 +109,8 @@ export const depositReserveLiquidity = async (
|
||||||
sourceLiquidityAccount,
|
sourceLiquidityAccount,
|
||||||
destinationCollateralAccount,
|
destinationCollateralAccount,
|
||||||
reserveAddress,
|
reserveAddress,
|
||||||
reserve.liquidity.supply,
|
reserve.liquidity.supplyPubkey,
|
||||||
reserve.collateral.mint,
|
reserve.collateral.mintPubkey,
|
||||||
reserve.lendingMarket,
|
reserve.lendingMarket,
|
||||||
lendingMarketAuthority,
|
lendingMarketAuthority,
|
||||||
transferAuthority.publicKey,
|
transferAuthority.publicKey,
|
||||||
|
@ -127,18 +127,18 @@ export const depositReserveLiquidity = async (
|
||||||
sourceLiquidityAccount,
|
sourceLiquidityAccount,
|
||||||
destinationCollateralAccount,
|
destinationCollateralAccount,
|
||||||
reserveAddress,
|
reserveAddress,
|
||||||
reserve.liquidity.mint,
|
reserve.liquidity.mintPubkey,
|
||||||
reserve.liquidity.supply,
|
reserve.liquidity.supplyPubkey,
|
||||||
reserve.liquidity.feeReceiver,
|
reserve.liquidity.feeReceiver,
|
||||||
reserve.collateral.mint,
|
reserve.collateral.mintPubkey,
|
||||||
reserve.collateral.supply,
|
reserve.collateral.supplyPubkey,
|
||||||
reserve.lendingMarket,
|
reserve.lendingMarket,
|
||||||
lendingMarketAuthority,
|
lendingMarketAuthority,
|
||||||
// @FIXME: lending market owner
|
// @FIXME: lending market owner
|
||||||
lendingMarketOwner,
|
lendingMarketOwner,
|
||||||
transferAuthority.publicKey,
|
transferAuthority.publicKey,
|
||||||
reserve.liquidity.aggregatorOption
|
reserve.liquidity.oracleOption
|
||||||
? reserve.liquidity.aggregator
|
? reserve.liquidity.oraclePubkey
|
||||||
: undefined,
|
: undefined,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
@ -84,17 +84,17 @@ export const liquidateObligation = async (
|
||||||
instructions,
|
instructions,
|
||||||
cleanupInstructions,
|
cleanupInstructions,
|
||||||
accountRentExempt,
|
accountRentExempt,
|
||||||
withdrawReserve.info.collateral.mint,
|
withdrawReserve.info.collateral.mintPubkey,
|
||||||
signers,
|
signers,
|
||||||
);
|
);
|
||||||
|
|
||||||
// @FIXME: aggregator
|
// @FIXME: oracle
|
||||||
const aggregatorAddress = repayReserve.info.liquidity.aggregatorOption
|
const oracleAddress = repayReserve.info.liquidity.oracleOption
|
||||||
? repayReserve.info.liquidity.aggregator
|
? repayReserve.info.liquidity.oraclePubkey
|
||||||
: withdrawReserve.info.liquidity.aggregator;
|
: withdrawReserve.info.liquidity.oraclePubkey;
|
||||||
const aggregator = cache.get(aggregatorAddress);
|
const oracle = cache.get(oracleAddress);
|
||||||
|
|
||||||
if (!aggregator) {
|
if (!oracle) {
|
||||||
throw new Error(`Dex market doesn't exist.`);
|
throw new Error(`Dex market doesn't exist.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,10 +103,10 @@ export const liquidateObligation = async (
|
||||||
) as ParsedAccount<LendingMarket>;
|
) as ParsedAccount<LendingMarket>;
|
||||||
|
|
||||||
const dexOrderBookSide = market.info.quoteTokenMint.equals(
|
const dexOrderBookSide = market.info.quoteTokenMint.equals(
|
||||||
repayReserve.info.liquidity.mint,
|
repayReserve.info.liquidity.mintPubkey,
|
||||||
)
|
)
|
||||||
? aggregator?.info.asks
|
? oracle?.info.asks
|
||||||
: aggregator?.info.bids;
|
: oracle?.info.bids;
|
||||||
|
|
||||||
const memory = createTempMemoryAccount(
|
const memory = createTempMemoryAccount(
|
||||||
instructions,
|
instructions,
|
||||||
|
@ -116,7 +116,7 @@ export const liquidateObligation = async (
|
||||||
);
|
);
|
||||||
|
|
||||||
instructions.push(
|
instructions.push(
|
||||||
// @FIXME: aggregator needed
|
// @FIXME: oracle needed
|
||||||
refreshReserveInstruction(repayReserve.pubkey),
|
refreshReserveInstruction(repayReserve.pubkey),
|
||||||
refreshReserveInstruction(withdrawReserve.pubkey),
|
refreshReserveInstruction(withdrawReserve.pubkey),
|
||||||
);
|
);
|
||||||
|
@ -127,9 +127,9 @@ export const liquidateObligation = async (
|
||||||
sourceAccount,
|
sourceAccount,
|
||||||
toAccount,
|
toAccount,
|
||||||
repayReserve.pubkey,
|
repayReserve.pubkey,
|
||||||
repayReserve.info.liquidity.supply,
|
repayReserve.info.liquidity.supplyPubkey,
|
||||||
withdrawReserve.pubkey,
|
withdrawReserve.pubkey,
|
||||||
withdrawReserve.info.collateral.supply,
|
withdrawReserve.info.collateral.supplyPubkey,
|
||||||
obligation.pubkey,
|
obligation.pubkey,
|
||||||
repayReserve.info.lendingMarket,
|
repayReserve.info.lendingMarket,
|
||||||
lendingMarketAuthority,
|
lendingMarketAuthority,
|
||||||
|
@ -137,7 +137,7 @@ export const liquidateObligation = async (
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
let { txid } = await sendTransaction(
|
let { txid } = await sendTransaction(
|
||||||
connection,
|
connection,
|
||||||
wallet,
|
wallet,
|
||||||
instructions.concat(cleanupInstructions),
|
instructions.concat(cleanupInstructions),
|
||||||
|
|
|
@ -71,15 +71,15 @@ export const redeemReserveCollateral = async (
|
||||||
instructions,
|
instructions,
|
||||||
cleanupInstructions,
|
cleanupInstructions,
|
||||||
accountRentExempt,
|
accountRentExempt,
|
||||||
reserve.liquidity.mint,
|
reserve.liquidity.mintPubkey,
|
||||||
signers,
|
signers,
|
||||||
);
|
);
|
||||||
|
|
||||||
instructions.push(
|
instructions.push(
|
||||||
refreshReserveInstruction(
|
refreshReserveInstruction(
|
||||||
reserveAddress,
|
reserveAddress,
|
||||||
reserve.liquidity.aggregatorOption
|
reserve.liquidity.oracleOption
|
||||||
? reserve.liquidity.aggregator
|
? reserve.liquidity.oraclePubkey
|
||||||
: undefined,
|
: undefined,
|
||||||
),
|
),
|
||||||
redeemReserveCollateralInstruction(
|
redeemReserveCollateralInstruction(
|
||||||
|
@ -87,8 +87,8 @@ export const redeemReserveCollateral = async (
|
||||||
sourceCollateral,
|
sourceCollateral,
|
||||||
destinationLiquidity,
|
destinationLiquidity,
|
||||||
reserveAddress,
|
reserveAddress,
|
||||||
reserve.collateral.mint,
|
reserve.collateral.mintPubkey,
|
||||||
reserve.liquidity.supply,
|
reserve.liquidity.supplyPubkey,
|
||||||
reserve.lendingMarket,
|
reserve.lendingMarket,
|
||||||
lendingMarketAuthority,
|
lendingMarketAuthority,
|
||||||
transferAuthority.publicKey,
|
transferAuthority.publicKey,
|
||||||
|
|
|
@ -57,7 +57,7 @@ export const repayObligationLiquidity = async (
|
||||||
let sourceLiquidity = source.pubkey;
|
let sourceLiquidity = source.pubkey;
|
||||||
if (
|
if (
|
||||||
wallet.publicKey.equals(sourceLiquidity) &&
|
wallet.publicKey.equals(sourceLiquidity) &&
|
||||||
repayReserve.info.liquidity.mint.equals(NATIVE_MINT)
|
repayReserve.info.liquidity.mintPubkey.equals(NATIVE_MINT)
|
||||||
) {
|
) {
|
||||||
sourceLiquidity = createTokenAccount(
|
sourceLiquidity = createTokenAccount(
|
||||||
instructions,
|
instructions,
|
||||||
|
@ -92,14 +92,14 @@ export const repayObligationLiquidity = async (
|
||||||
instructions.push(
|
instructions.push(
|
||||||
refreshReserveInstruction(
|
refreshReserveInstruction(
|
||||||
repayReserve.pubkey,
|
repayReserve.pubkey,
|
||||||
repayReserve.info.liquidity.aggregatorOption
|
repayReserve.info.liquidity.oracleOption
|
||||||
? repayReserve.info.liquidity.aggregator
|
? repayReserve.info.liquidity.oraclePubkey
|
||||||
: undefined,
|
: undefined,
|
||||||
),
|
),
|
||||||
repayObligationLiquidityInstruction(
|
repayObligationLiquidityInstruction(
|
||||||
liquidityAmount,
|
liquidityAmount,
|
||||||
sourceLiquidity,
|
sourceLiquidity,
|
||||||
repayReserve.info.liquidity.mint,
|
repayReserve.info.liquidity.mintPubkey,
|
||||||
repayReserve.pubkey,
|
repayReserve.pubkey,
|
||||||
obligation.pubkey,
|
obligation.pubkey,
|
||||||
repayReserve.info.lendingMarket,
|
repayReserve.info.lendingMarket,
|
||||||
|
|
|
@ -43,23 +43,21 @@ export const BorrowInput = (props: {
|
||||||
|
|
||||||
const depositReserve = useMemo(() => {
|
const depositReserve = useMemo(() => {
|
||||||
const id: string =
|
const id: string =
|
||||||
cache
|
cache.byParser(ReserveParser).find(acc => acc === depositReserveKey) ||
|
||||||
.byParser(ReserveParser)
|
'';
|
||||||
.find(acc => acc === depositReserveKey) || '';
|
|
||||||
|
|
||||||
return cache.get(id) as ParsedAccount<Reserve>;
|
return cache.get(id) as ParsedAccount<Reserve>;
|
||||||
}, [depositReserveKey]);
|
}, [depositReserveKey]);
|
||||||
const borrowPrice = useMidPriceInUSD(
|
const borrowPrice = useMidPriceInUSD(
|
||||||
borrowReserve.info.liquidity.mint.toBase58(),
|
borrowReserve.info.liquidity.mintPubkey.toBase58(),
|
||||||
).price;
|
).price;
|
||||||
const collateralPrice = useMidPriceInUSD(
|
const collateralPrice = useMidPriceInUSD(
|
||||||
depositReserve?.info.liquidity.mint.toBase58(),
|
depositReserve?.info.liquidity.mintPubkey.toBase58(),
|
||||||
)?.price;
|
)?.price;
|
||||||
|
|
||||||
const include = useMemo(
|
const include = useMemo(() => new Set([depositReserve?.pubkey.toBase58()]), [
|
||||||
() => new Set([depositReserve?.pubkey.toBase58()]),
|
depositReserve,
|
||||||
[depositReserve],
|
]);
|
||||||
);
|
|
||||||
|
|
||||||
const exclude = useMemo(() => new Set([]), []);
|
const exclude = useMemo(() => new Set([]), []);
|
||||||
|
|
||||||
|
@ -130,7 +128,7 @@ export const BorrowInput = (props: {
|
||||||
depositReserve?.pubkey,
|
depositReserve?.pubkey,
|
||||||
);
|
);
|
||||||
const { accounts: sourceAccounts } = useUserBalance(
|
const { accounts: sourceAccounts } = useUserBalance(
|
||||||
depositReserve?.info.collateral.mint,
|
depositReserve?.info.collateral.mintPubkey,
|
||||||
);
|
);
|
||||||
const onBorrow = useCallback(() => {
|
const onBorrow = useCallback(() => {
|
||||||
if (!depositReserve) {
|
if (!depositReserve) {
|
||||||
|
|
|
@ -37,7 +37,9 @@ export default function CollateralInput(props: {
|
||||||
showLeverageSelector?: boolean;
|
showLeverageSelector?: boolean;
|
||||||
leverage?: number;
|
leverage?: number;
|
||||||
}) {
|
}) {
|
||||||
const { balance: tokenBalance } = useUserBalance(props.reserve.liquidity.mint);
|
const { balance: tokenBalance } = useUserBalance(
|
||||||
|
props.reserve.liquidity.mintPubkey,
|
||||||
|
);
|
||||||
const { reserveAccounts } = useLendingReserves();
|
const { reserveAccounts } = useLendingReserves();
|
||||||
const { tokenMap } = useConnectionConfig();
|
const { tokenMap } = useConnectionConfig();
|
||||||
const [depositReserve, setCollateralReserve] = useState<string>();
|
const [depositReserve, setCollateralReserve] = useState<string>();
|
||||||
|
@ -50,16 +52,14 @@ export default function CollateralInput(props: {
|
||||||
setBalance(tokenBalance);
|
setBalance(tokenBalance);
|
||||||
} else {
|
} else {
|
||||||
const id: string =
|
const id: string =
|
||||||
cache
|
cache.byParser(ReserveParser).find(acc => acc === depositReserve) || '';
|
||||||
.byParser(ReserveParser)
|
|
||||||
.find(acc => acc === depositReserve) || '';
|
|
||||||
const parser = cache.get(id) as ParsedAccount<Reserve>;
|
const parser = cache.get(id) as ParsedAccount<Reserve>;
|
||||||
|
|
||||||
if (parser) {
|
if (parser) {
|
||||||
const collateralDeposit = userDeposits.userDeposits.find(
|
const collateralDeposit = userDeposits.userDeposits.find(
|
||||||
u =>
|
u =>
|
||||||
u.reserve.info.liquidity.mint.toBase58() ===
|
u.reserve.info.liquidity.mintPubkey.toBase58() ===
|
||||||
parser.info.liquidity.mint.toBase58(),
|
parser.info.liquidity.mintPubkey.toBase58(),
|
||||||
);
|
);
|
||||||
if (collateralDeposit) setBalance(collateralDeposit.info.amount);
|
if (collateralDeposit) setBalance(collateralDeposit.info.amount);
|
||||||
else setBalance(0);
|
else setBalance(0);
|
||||||
|
@ -72,7 +72,7 @@ export default function CollateralInput(props: {
|
||||||
) as ParsedAccount<LendingMarket>;
|
) as ParsedAccount<LendingMarket>;
|
||||||
if (!market) return null;
|
if (!market) return null;
|
||||||
|
|
||||||
const onlyQuoteAllowed = !props.reserve?.liquidity.mint?.equals(
|
const onlyQuoteAllowed = !props.reserve?.liquidity.mintPubkey?.equals(
|
||||||
market?.info?.quoteTokenMint,
|
market?.info?.quoteTokenMint,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ export default function CollateralInput(props: {
|
||||||
.filter(
|
.filter(
|
||||||
reserve =>
|
reserve =>
|
||||||
!onlyQuoteAllowed ||
|
!onlyQuoteAllowed ||
|
||||||
reserve.info.liquidity.mint.equals(market.info.quoteTokenMint),
|
reserve.info.liquidity.mintPubkey.equals(market.info.quoteTokenMint),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
@ -93,7 +93,7 @@ export default function CollateralInput(props: {
|
||||||
setCollateralReserve(address);
|
setCollateralReserve(address);
|
||||||
}
|
}
|
||||||
const renderReserveAccounts = filteredReserveAccounts.map(reserve => {
|
const renderReserveAccounts = filteredReserveAccounts.map(reserve => {
|
||||||
const mint = reserve.info.liquidity.mint.toBase58();
|
const mint = reserve.info.liquidity.mintPubkey.toBase58();
|
||||||
const address = reserve.pubkey.toBase58();
|
const address = reserve.pubkey.toBase58();
|
||||||
const name = getTokenName(tokenMap, mint);
|
const name = getTokenName(tokenMap, mint);
|
||||||
return (
|
return (
|
||||||
|
@ -203,12 +203,12 @@ export default function CollateralInput(props: {
|
||||||
</Select>
|
</Select>
|
||||||
) : (
|
) : (
|
||||||
<TokenDisplay
|
<TokenDisplay
|
||||||
key={props.reserve.liquidity.mint.toBase58()}
|
key={props.reserve.liquidity.mintPubkey.toBase58()}
|
||||||
name={getTokenName(
|
name={getTokenName(
|
||||||
tokenMap,
|
tokenMap,
|
||||||
props.reserve.liquidity.mint.toBase58(),
|
props.reserve.liquidity.mintPubkey.toBase58(),
|
||||||
)}
|
)}
|
||||||
mintAddress={props.reserve.liquidity.mint.toBase58()}
|
mintAddress={props.reserve.liquidity.mintPubkey.toBase58()}
|
||||||
showBalance={false}
|
showBalance={false}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
|
@ -54,7 +54,7 @@ export const CollateralSelector = (props: {
|
||||||
const quoteTokenMintAddress = market?.info?.quoteTokenMint?.toBase58();
|
const quoteTokenMintAddress = market?.info?.quoteTokenMint?.toBase58();
|
||||||
|
|
||||||
const onlyQuoteAllowed =
|
const onlyQuoteAllowed =
|
||||||
props.reserve?.liquidity.mint?.toBase58() !== quoteTokenMintAddress;
|
props.reserve?.liquidity.mintPubkey?.toBase58() !== quoteTokenMintAddress;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Select
|
<Select
|
||||||
|
@ -79,10 +79,12 @@ export const CollateralSelector = (props: {
|
||||||
.filter(
|
.filter(
|
||||||
reserve =>
|
reserve =>
|
||||||
!onlyQuoteAllowed ||
|
!onlyQuoteAllowed ||
|
||||||
reserve.info.liquidity.mint.equals(market.info.quoteTokenMint),
|
reserve.info.liquidity.mintPubkey.equals(
|
||||||
|
market.info.quoteTokenMint,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
.map(reserve => {
|
.map(reserve => {
|
||||||
const mint = reserve.info.liquidity.mint.toBase58();
|
const mint = reserve.info.liquidity.mintPubkey.toBase58();
|
||||||
const address = reserve.pubkey.toBase58();
|
const address = reserve.pubkey.toBase58();
|
||||||
const name = getTokenName(tokenMap, mint);
|
const name = getTokenName(tokenMap, mint);
|
||||||
|
|
||||||
|
|
|
@ -12,9 +12,9 @@ export const DepositInfoLine = (props: {
|
||||||
reserve: Reserve;
|
reserve: Reserve;
|
||||||
address: PublicKey;
|
address: PublicKey;
|
||||||
}) => {
|
}) => {
|
||||||
const name = useTokenName(props.reserve.liquidity.mint);
|
const name = useTokenName(props.reserve.liquidity.mintPubkey);
|
||||||
const { balance: tokenBalance } = useUserBalance(
|
const { balance: tokenBalance } = useUserBalance(
|
||||||
props.reserve.liquidity.mint,
|
props.reserve.liquidity.mintPubkey,
|
||||||
);
|
);
|
||||||
const { balance: collateralBalance } = useUserCollateralBalance(
|
const { balance: collateralBalance } = useUserCollateralBalance(
|
||||||
props.reserve,
|
props.reserve,
|
||||||
|
|
|
@ -26,7 +26,7 @@ export const DepositInput = (props: {
|
||||||
const address = props.address;
|
const address = props.address;
|
||||||
|
|
||||||
const { accounts: sourceAccounts, balance, balanceLamports } = useUserBalance(
|
const { accounts: sourceAccounts, balance, balanceLamports } = useUserBalance(
|
||||||
reserve?.liquidity.mint,
|
reserve?.liquidity.mintPubkey,
|
||||||
);
|
);
|
||||||
|
|
||||||
const convert = useCallback(
|
const convert = useCallback(
|
||||||
|
|
|
@ -41,9 +41,9 @@ export const LiquidateInput = (props: {
|
||||||
const [showConfirmation, setShowConfirmation] = useState(false);
|
const [showConfirmation, setShowConfirmation] = useState(false);
|
||||||
const [collateralValue, setCollateralValue] = useState('');
|
const [collateralValue, setCollateralValue] = useState('');
|
||||||
|
|
||||||
const liquidityMint = useMint(repayReserve.info.liquidity.mint);
|
const liquidityMint = useMint(repayReserve.info.liquidity.mintPubkey);
|
||||||
const { accounts: sourceAccounts, balance: tokenBalance } = useUserBalance(
|
const { accounts: sourceAccounts, balance: tokenBalance } = useUserBalance(
|
||||||
repayReserve?.info.liquidity.mint,
|
repayReserve?.info.liquidity.mintPubkey,
|
||||||
);
|
);
|
||||||
const borrowAmountLamports = wadToLamports(
|
const borrowAmountLamports = wadToLamports(
|
||||||
obligation.info.borrows[0].borrowedAmountWads,
|
obligation.info.borrows[0].borrowedAmountWads,
|
||||||
|
@ -124,7 +124,7 @@ export const LiquidateInput = (props: {
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const collateralPrice = useMidPriceInUSD(
|
const collateralPrice = useMidPriceInUSD(
|
||||||
withdrawReserve?.info.liquidity.mint.toBase58(),
|
withdrawReserve?.info.liquidity.mintPubkey.toBase58(),
|
||||||
)?.price;
|
)?.price;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
@ -19,13 +19,17 @@ export const LoanInfoLine = (props: {
|
||||||
}) => {
|
}) => {
|
||||||
const obligation = props.obligation;
|
const obligation = props.obligation;
|
||||||
|
|
||||||
const repayReserve = useLendingReserve(obligation?.info.borrows[0].borrowReserve);
|
const repayReserve = useLendingReserve(
|
||||||
const withdrawReserve = useLendingReserve(obligation?.info.deposits[0].depositReserve);
|
obligation?.info.borrows[0].borrowReserve,
|
||||||
|
);
|
||||||
|
const withdrawReserve = useLendingReserve(
|
||||||
|
obligation?.info.deposits[0].depositReserve,
|
||||||
|
);
|
||||||
|
|
||||||
const liquidityMint = useMint(repayReserve?.info.liquidity.mint);
|
const liquidityMint = useMint(repayReserve?.info.liquidity.mintPubkey);
|
||||||
const collateralMint = useMint(withdrawReserve?.info.liquidity.mint);
|
const collateralMint = useMint(withdrawReserve?.info.liquidity.mintPubkey);
|
||||||
const repayName = useTokenName(repayReserve?.info.liquidity.mint);
|
const repayName = useTokenName(repayReserve?.info.liquidity.mintPubkey);
|
||||||
const withdrawName = useTokenName(withdrawReserve?.info.liquidity.mint);
|
const withdrawName = useTokenName(withdrawReserve?.info.liquidity.mintPubkey);
|
||||||
|
|
||||||
const borrowAPY = useMemo(
|
const borrowAPY = useMemo(
|
||||||
() => (repayReserve ? calculateBorrowAPY(repayReserve?.info) : 0),
|
() => (repayReserve ? calculateBorrowAPY(repayReserve?.info) : 0),
|
||||||
|
|
|
@ -44,9 +44,9 @@ export const RepayInput = (props: {
|
||||||
const repayReserve = props.borrowReserve;
|
const repayReserve = props.borrowReserve;
|
||||||
const obligation = props.obligation;
|
const obligation = props.obligation;
|
||||||
|
|
||||||
const liquidityMint = useMint(repayReserve.info.liquidity.mint);
|
const liquidityMint = useMint(repayReserve.info.liquidity.mintPubkey);
|
||||||
const { balance: tokenBalance } = useUserBalance(
|
const { balance: tokenBalance } = useUserBalance(
|
||||||
repayReserve.info.liquidity.mint,
|
repayReserve.info.liquidity.mintPubkey,
|
||||||
);
|
);
|
||||||
|
|
||||||
const borrowAmountLamports = wadToLamports(
|
const borrowAmountLamports = wadToLamports(
|
||||||
|
@ -56,7 +56,7 @@ export const RepayInput = (props: {
|
||||||
const depositReserve = props.depositReserve;
|
const depositReserve = props.depositReserve;
|
||||||
|
|
||||||
const { accounts: sourceAccounts } = useUserBalance(
|
const { accounts: sourceAccounts } = useUserBalance(
|
||||||
repayReserve.info.liquidity.mint,
|
repayReserve.info.liquidity.mintPubkey,
|
||||||
);
|
);
|
||||||
|
|
||||||
const convert = useCallback(
|
const convert = useCallback(
|
||||||
|
@ -75,11 +75,7 @@ export const RepayInput = (props: {
|
||||||
const { value, setValue, pct, setPct, type } = useSliderInput(convert);
|
const { value, setValue, pct, setPct, type } = useSliderInput(convert);
|
||||||
|
|
||||||
const onRepay = useCallback(() => {
|
const onRepay = useCallback(() => {
|
||||||
if (
|
if (!depositReserve || !obligation || !repayReserve) {
|
||||||
!depositReserve ||
|
|
||||||
!obligation ||
|
|
||||||
!repayReserve
|
|
||||||
) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +127,7 @@ export const RepayInput = (props: {
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const collateralPrice = useMidPriceInUSD(
|
const collateralPrice = useMidPriceInUSD(
|
||||||
depositReserve?.info.liquidity.mint.toBase58(),
|
depositReserve?.info.liquidity.mintPubkey.toBase58(),
|
||||||
)?.price;
|
)?.price;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
|
@ -26,7 +26,7 @@ export const ReserveStatus = (props: {
|
||||||
alignItems: 'center',
|
alignItems: 'center',
|
||||||
};
|
};
|
||||||
|
|
||||||
const mintAddress = props.reserve.liquidity.mint?.toBase58();
|
const mintAddress = props.reserve.liquidity.mintPubkey?.toBase58();
|
||||||
const liquidityMint = useMint(mintAddress);
|
const liquidityMint = useMint(mintAddress);
|
||||||
const { price } = useMidPriceInUSD(mintAddress);
|
const { price } = useMidPriceInUSD(mintAddress);
|
||||||
const availableAmount = fromLamports(
|
const availableAmount = fromLamports(
|
||||||
|
|
|
@ -7,7 +7,7 @@ import { WaterWave } from './../WaterWave';
|
||||||
const { useMint } = contexts.Accounts;
|
const { useMint } = contexts.Accounts;
|
||||||
|
|
||||||
export const ReserveUtilizationChart = (props: { reserve: Reserve }) => {
|
export const ReserveUtilizationChart = (props: { reserve: Reserve }) => {
|
||||||
const mintAddress = props.reserve.liquidity.mint?.toBase58();
|
const mintAddress = props.reserve.liquidity.mintPubkey?.toBase58();
|
||||||
const liquidityMint = useMint(mintAddress);
|
const liquidityMint = useMint(mintAddress);
|
||||||
const availableAmount = fromLamports(
|
const availableAmount = fromLamports(
|
||||||
props.reserve.liquidity.availableAmount,
|
props.reserve.liquidity.availableAmount,
|
||||||
|
|
|
@ -33,8 +33,8 @@ export const SideReserveOverview = (props: {
|
||||||
}) => {
|
}) => {
|
||||||
const reserve = props.reserve.info;
|
const reserve = props.reserve.info;
|
||||||
const mode = props.mode;
|
const mode = props.mode;
|
||||||
const name = useTokenName(reserve?.liquidity.mint);
|
const name = useTokenName(reserve?.liquidity.mintPubkey);
|
||||||
const liquidityMint = useMint(reserve.liquidity.mint);
|
const liquidityMint = useMint(reserve.liquidity.mintPubkey);
|
||||||
|
|
||||||
const availableAmount = fromLamports(
|
const availableAmount = fromLamports(
|
||||||
reserve.liquidity.availableAmount,
|
reserve.liquidity.availableAmount,
|
||||||
|
@ -113,7 +113,7 @@ export const SideReserveOverview = (props: {
|
||||||
>
|
>
|
||||||
<Link to={`/reserve/${props.reserve.pubkey}`}>
|
<Link to={`/reserve/${props.reserve.pubkey}`}>
|
||||||
<TokenIcon
|
<TokenIcon
|
||||||
mintAddress={reserve?.liquidity.mint}
|
mintAddress={reserve?.liquidity.mintPubkey}
|
||||||
style={{ width: 30, height: 30 }}
|
style={{ width: 30, height: 30 }}
|
||||||
/>{' '}
|
/>{' '}
|
||||||
{name} Reserve Overview
|
{name} Reserve Overview
|
||||||
|
|
|
@ -23,12 +23,12 @@ export const UserLendingCard = (props: {
|
||||||
const reserve = props.reserve;
|
const reserve = props.reserve;
|
||||||
const address = props.address;
|
const address = props.address;
|
||||||
|
|
||||||
const name = useTokenName(reserve?.liquidity.mint);
|
const name = useTokenName(reserve?.liquidity.mintPubkey);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
balance: tokenBalance,
|
balance: tokenBalance,
|
||||||
balanceInUSD: tokenBalanceInUSD,
|
balanceInUSD: tokenBalanceInUSD,
|
||||||
} = useUserBalance(props.reserve.liquidity.mint);
|
} = useUserBalance(props.reserve.liquidity.mintPubkey);
|
||||||
const {
|
const {
|
||||||
balance: collateralBalance,
|
balance: collateralBalance,
|
||||||
balanceInUSD: collateralBalanceInUSD,
|
balanceInUSD: collateralBalanceInUSD,
|
||||||
|
|
|
@ -33,7 +33,7 @@ export const WithdrawInput = (props: {
|
||||||
const {
|
const {
|
||||||
balanceLamports: collateralBalanceLamports,
|
balanceLamports: collateralBalanceLamports,
|
||||||
accounts: sourceAccounts,
|
accounts: sourceAccounts,
|
||||||
} = useUserBalance(reserve?.collateral.mint);
|
} = useUserBalance(reserve?.collateral.mintPubkey);
|
||||||
const { balance: collateralBalanceInLiquidity } = useUserCollateralBalance(
|
const { balance: collateralBalanceInLiquidity } = useUserCollateralBalance(
|
||||||
reserve,
|
reserve,
|
||||||
);
|
);
|
||||||
|
|
|
@ -72,7 +72,9 @@ export const useLending = () => {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (reserveAccounts.length > 0) {
|
if (reserveAccounts.length > 0) {
|
||||||
precacheMarkets(
|
precacheMarkets(
|
||||||
reserveAccounts.map(reserve => reserve.info.liquidity.mint.toBase58()),
|
reserveAccounts.map(reserve =>
|
||||||
|
reserve.info.liquidity.mintPubkey.toBase58(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}, [reserveAccounts, precacheMarkets]);
|
}, [reserveAccounts, precacheMarkets]);
|
||||||
|
@ -91,25 +93,25 @@ export const useLending = () => {
|
||||||
.filter(item => item !== undefined);
|
.filter(item => item !== undefined);
|
||||||
|
|
||||||
const lendingReserves = accounts
|
const lendingReserves = accounts
|
||||||
.filter(
|
.filter(acc => (acc?.info as Reserve).lendingMarket !== undefined)
|
||||||
acc => (acc?.info as Reserve).lendingMarket !== undefined,
|
|
||||||
)
|
|
||||||
.map(acc => acc as ParsedAccount<Reserve>);
|
.map(acc => acc as ParsedAccount<Reserve>);
|
||||||
|
|
||||||
const toQuery = [
|
const toQuery = [
|
||||||
...lendingReserves.map(acc => {
|
...lendingReserves.map(acc => {
|
||||||
const result = [
|
const result = [
|
||||||
cache.registerParser(
|
cache.registerParser(
|
||||||
acc?.info.collateral.mint.toBase58(),
|
acc?.info.collateral.mintPubkey.toBase58(),
|
||||||
MintParser,
|
MintParser,
|
||||||
),
|
),
|
||||||
cache.registerParser(
|
cache.registerParser(
|
||||||
acc?.info.liquidity.mint.toBase58(),
|
acc?.info.liquidity.mintPubkey.toBase58(),
|
||||||
MintParser,
|
MintParser,
|
||||||
),
|
),
|
||||||
// ignore dex if its not set
|
// ignore dex if its not set
|
||||||
cache.registerParser(
|
cache.registerParser(
|
||||||
acc?.info.liquidity.aggregatorOption ? acc?.info.liquidity.aggregator.toBase58() : '',
|
acc?.info.liquidity.oracleOption
|
||||||
|
? acc?.info.liquidity.oraclePubkey.toBase58()
|
||||||
|
: '',
|
||||||
DexMarketParser,
|
DexMarketParser,
|
||||||
),
|
),
|
||||||
].filter(_ => _);
|
].filter(_ => _);
|
||||||
|
|
|
@ -517,8 +517,8 @@ export const simulateMarketOrderFill = (
|
||||||
dex: PublicKey,
|
dex: PublicKey,
|
||||||
useBBO = false,
|
useBBO = false,
|
||||||
) => {
|
) => {
|
||||||
const liquidityMint = cache.get(reserve.liquidity.mint);
|
const liquidityMint = cache.get(reserve.liquidity.mintPubkey);
|
||||||
const collateralMint = cache.get(reserve.collateral.mint);
|
const collateralMint = cache.get(reserve.collateral.mintPubkey);
|
||||||
if (!liquidityMint || !collateralMint) {
|
if (!liquidityMint || !collateralMint) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
@ -538,7 +538,7 @@ export const simulateMarketOrderFill = (
|
||||||
reserve.lendingMarket,
|
reserve.lendingMarket,
|
||||||
) as ParsedAccount<LendingMarket>;
|
) as ParsedAccount<LendingMarket>;
|
||||||
|
|
||||||
const aggregator = new Market(
|
const market = new Market(
|
||||||
decodedMarket,
|
decodedMarket,
|
||||||
baseMintDecimals,
|
baseMintDecimals,
|
||||||
quoteTokenMintDecimals,
|
quoteTokenMintDecimals,
|
||||||
|
@ -552,10 +552,12 @@ export const simulateMarketOrderFill = (
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bids = new Orderbook(aggregator, bidInfo.accountFlags, bidInfo.slab);
|
const bids = new Orderbook(market, bidInfo.accountFlags, bidInfo.slab);
|
||||||
const asks = new Orderbook(aggregator, askInfo.accountFlags, askInfo.slab);
|
const asks = new Orderbook(market, askInfo.accountFlags, askInfo.slab);
|
||||||
|
|
||||||
const book = lendingMarket.info.quoteTokenMint.equals(reserve.liquidity.mint)
|
const book = lendingMarket.info.quoteTokenMint.equals(
|
||||||
|
reserve.liquidity.mintPubkey,
|
||||||
|
)
|
||||||
? bids
|
? bids
|
||||||
: asks;
|
: asks;
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ export function useCachedPool(legacy = false) {
|
||||||
|
|
||||||
const allPools = context.pools as PoolInfo[];
|
const allPools = context.pools as PoolInfo[];
|
||||||
const pools = useMemo(() => {
|
const pools = useMemo(() => {
|
||||||
return allPools.filter((p) => p.legacy === legacy);
|
return allPools.filter(p => p.legacy === legacy);
|
||||||
}, [allPools, legacy]);
|
}, [allPools, legacy]);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -18,7 +18,7 @@ export function useBorrowedAmount(address?: string | PublicKey) {
|
||||||
health: 0,
|
health: 0,
|
||||||
});
|
});
|
||||||
const reserve = useLendingReserve(address);
|
const reserve = useLendingReserve(address);
|
||||||
const liquidityMint = useMint(reserve?.info.liquidity.mint);
|
const liquidityMint = useMint(reserve?.info.liquidity.mintPubkey);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setBorrowedInfo({
|
setBorrowedInfo({
|
||||||
|
|
|
@ -23,7 +23,7 @@ export function useBorrowingPower(
|
||||||
|
|
||||||
const reserve = useLendingReserve(key);
|
const reserve = useLendingReserve(key);
|
||||||
|
|
||||||
const liquidityMint = reserve?.info.liquidity.mint;
|
const liquidityMint = reserve?.info.liquidity.mintPubkey;
|
||||||
const liquidityMintAddress = liquidityMint?.toBase58();
|
const liquidityMintAddress = liquidityMint?.toBase58();
|
||||||
const market = useLendingMarket(reserve?.info.lendingMarket);
|
const market = useLendingMarket(reserve?.info.lendingMarket);
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ export function useBorrowingPower(
|
||||||
const exclude = useMemo(() => new Set([key]), [key]);
|
const exclude = useMemo(() => new Set([key]), [key]);
|
||||||
const inlcude = useMemo(() => {
|
const inlcude = useMemo(() => {
|
||||||
const quoteReserve = getLendingReserves().find(
|
const quoteReserve = getLendingReserves().find(
|
||||||
r => r.info.liquidity.mint.toBase58() === quoteTokenMintAddess,
|
r => r.info.liquidity.mintPubkey.toBase58() === quoteTokenMintAddess,
|
||||||
);
|
);
|
||||||
return onlyQuoteAllowed && quoteReserve
|
return onlyQuoteAllowed && quoteReserve
|
||||||
? new Set([quoteReserve.pubkey.toBase58()])
|
? new Set([quoteReserve.pubkey.toBase58()])
|
||||||
|
|
|
@ -11,9 +11,9 @@ export function useUserCollateralBalance(
|
||||||
reserve?: Reserve,
|
reserve?: Reserve,
|
||||||
account?: PublicKey,
|
account?: PublicKey,
|
||||||
) {
|
) {
|
||||||
const mint = useMint(reserve?.collateral.mint);
|
const mint = useMint(reserve?.collateral.mintPubkey);
|
||||||
const { balanceLamports: userBalance, accounts } = useUserBalance(
|
const { balanceLamports: userBalance, accounts } = useUserBalance(
|
||||||
reserve?.collateral.mint,
|
reserve?.collateral.mintPubkey,
|
||||||
account,
|
account,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -33,12 +33,13 @@ export function useUserCollateralBalance(
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const updateBalance = () => {
|
const updateBalance = () => {
|
||||||
setBalanceInUSD(
|
setBalanceInUSD(
|
||||||
balance * midPriceInUSD(reserve?.liquidity.mint?.toBase58() || ''),
|
balance *
|
||||||
|
midPriceInUSD(reserve?.liquidity.mintPubkey?.toBase58() || ''),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const dispose = marketEmitter.onMarket(args => {
|
const dispose = marketEmitter.onMarket(args => {
|
||||||
if (args.ids.has(reserve?.liquidity.aggregator.toBase58() || '')) {
|
if (args.ids.has(reserve?.liquidity.oraclePubkey.toBase58() || '')) {
|
||||||
updateBalance();
|
updateBalance();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -54,7 +55,7 @@ export function useUserCollateralBalance(
|
||||||
balance,
|
balance,
|
||||||
balanceLamports,
|
balanceLamports,
|
||||||
balanceInUSD,
|
balanceInUSD,
|
||||||
mint: reserve?.collateral.mint,
|
mint: reserve?.collateral.mintPubkey,
|
||||||
accounts,
|
accounts,
|
||||||
hasBalance: accounts.length > 0 && balance > 0,
|
hasBalance: accounts.length > 0 && balance > 0,
|
||||||
};
|
};
|
||||||
|
@ -66,6 +67,6 @@ export function calculateCollateralBalance(
|
||||||
// @FIXME: use BigNumber
|
// @FIXME: use BigNumber
|
||||||
return (
|
return (
|
||||||
reserveMarketCap(reserve) *
|
reserveMarketCap(reserve) *
|
||||||
(balanceLamports / (reserve?.collateral.mintAmount.toNumber() || 1))
|
(balanceLamports / (reserve?.collateral.mintTotalSupply.toNumber() || 1))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ export function useEnrichedLendingObligations() {
|
||||||
const reserve = item.reserve.info;
|
const reserve = item.reserve.info;
|
||||||
const depositReserve = item.reserve.info;
|
const depositReserve = item.reserve.info;
|
||||||
const liquidityMint = cache.get(
|
const liquidityMint = cache.get(
|
||||||
reserve.liquidity.mint,
|
reserve.liquidity.mintPubkey,
|
||||||
) as ParsedAccount<MintInfo>;
|
) as ParsedAccount<MintInfo>;
|
||||||
let ltv = 0;
|
let ltv = 0;
|
||||||
let health = 0;
|
let health = 0;
|
||||||
|
@ -86,7 +86,7 @@ export function useEnrichedLendingObligations() {
|
||||||
|
|
||||||
if (liquidityMint) {
|
if (liquidityMint) {
|
||||||
const collateralMint = cache.get(
|
const collateralMint = cache.get(
|
||||||
item.depositReserve.info.liquidity.mint,
|
item.depositReserve.info.liquidity.mintPubkey,
|
||||||
);
|
);
|
||||||
|
|
||||||
const collateral = fromLamports(
|
const collateral = fromLamports(
|
||||||
|
@ -104,14 +104,14 @@ export function useEnrichedLendingObligations() {
|
||||||
const borrowedAmount = simulateMarketOrderFill(
|
const borrowedAmount = simulateMarketOrderFill(
|
||||||
borrowed,
|
borrowed,
|
||||||
item.reserve.info,
|
item.reserve.info,
|
||||||
// @FIXME: aggregator
|
// @FIXME: oracle
|
||||||
item.reserve.info.liquidity.aggregatorOption
|
item.reserve.info.liquidity.oracleOption
|
||||||
? item.reserve.info.liquidity.aggregator
|
? item.reserve.info.liquidity.oraclePubkey
|
||||||
: item.depositReserve.info.liquidity.aggregator,
|
: item.depositReserve.info.liquidity.oraclePubkey,
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
||||||
const liquidityMintAddress = item.reserve.info.liquidity.mint.toBase58();
|
const liquidityMintAddress = item.reserve.info.liquidity.mintPubkey.toBase58();
|
||||||
const liquidityMint = cache.get(
|
const liquidityMint = cache.get(
|
||||||
liquidityMintAddress,
|
liquidityMintAddress,
|
||||||
) as ParsedAccount<MintInfo>;
|
) as ParsedAccount<MintInfo>;
|
||||||
|
@ -140,10 +140,10 @@ export function useEnrichedLendingObligations() {
|
||||||
// @FIXME: BigNumber
|
// @FIXME: BigNumber
|
||||||
liquidationThreshold:
|
liquidationThreshold:
|
||||||
item.reserve.info.config.liquidationThreshold,
|
item.reserve.info.config.liquidationThreshold,
|
||||||
repayName: getTokenName(tokenMap, reserve.liquidity.mint),
|
repayName: getTokenName(tokenMap, reserve.liquidity.mintPubkey),
|
||||||
collateralName: getTokenName(
|
collateralName: getTokenName(
|
||||||
tokenMap,
|
tokenMap,
|
||||||
depositReserve.liquidity.mint,
|
depositReserve.liquidity.mintPubkey,
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
} as EnrichedLendingObligation;
|
} as EnrichedLendingObligation;
|
||||||
|
|
|
@ -44,7 +44,7 @@ export function useLendingReserve(address?: string | PublicKey) {
|
||||||
const token: TokenInfo | null = getTokenByName(tokenMap, address);
|
const token: TokenInfo | null = getTokenByName(tokenMap, address);
|
||||||
if (token) {
|
if (token) {
|
||||||
const account = reserveAccounts.filter(
|
const account = reserveAccounts.filter(
|
||||||
acc => acc.info.liquidity.mint.toBase58() === token.address,
|
acc => acc.info.liquidity.mintPubkey.toBase58() === token.address,
|
||||||
)[0];
|
)[0];
|
||||||
if (account) {
|
if (account) {
|
||||||
addressName = account.pubkey;
|
addressName = account.pubkey;
|
||||||
|
|
|
@ -43,7 +43,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!include || include.has(id)) {
|
if (!include || include.has(id)) {
|
||||||
result.set(item.info.collateral.mint.toBase58(), item);
|
result.set(item.info.collateral.mintPubkey.toBase58(), item);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -52,7 +52,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const activeMarkets = new Set(
|
const activeMarkets = new Set(
|
||||||
reserveAccounts.map(r => r.info.liquidity.aggregator.toBase58()),
|
reserveAccounts.map(r => r.info.liquidity.oraclePubkey.toBase58()),
|
||||||
);
|
);
|
||||||
|
|
||||||
const userDepositsFactory = () => {
|
const userDepositsFactory = () => {
|
||||||
|
@ -64,7 +64,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
|
||||||
) as ParsedAccount<Reserve>;
|
) as ParsedAccount<Reserve>;
|
||||||
|
|
||||||
let collateralMint = cache.get(
|
let collateralMint = cache.get(
|
||||||
reserve.info.collateral.mint,
|
reserve.info.collateral.mintPubkey,
|
||||||
) as ParsedAccount<MintInfo>;
|
) as ParsedAccount<MintInfo>;
|
||||||
|
|
||||||
const amountLamports = calculateCollateralBalance(
|
const amountLamports = calculateCollateralBalance(
|
||||||
|
@ -72,7 +72,9 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
|
||||||
item?.info.amount.toNumber(),
|
item?.info.amount.toNumber(),
|
||||||
);
|
);
|
||||||
const amount = fromLamports(amountLamports, collateralMint?.info);
|
const amount = fromLamports(amountLamports, collateralMint?.info);
|
||||||
const price = midPriceInUSD(reserve.info.liquidity.mint.toBase58());
|
const price = midPriceInUSD(
|
||||||
|
reserve.info.liquidity.mintPubkey.toBase58(),
|
||||||
|
);
|
||||||
const amountInQuote = price * amount;
|
const amountInQuote = price * amount;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -81,7 +83,7 @@ export function useUserDeposits(exclude?: Set<string>, include?: Set<string>) {
|
||||||
amount,
|
amount,
|
||||||
amountInQuote: amountInQuote,
|
amountInQuote: amountInQuote,
|
||||||
apy: calculateDepositAPY(reserve.info),
|
apy: calculateDepositAPY(reserve.info),
|
||||||
name: getTokenName(tokenMap, reserve.info.liquidity.mint),
|
name: getTokenName(tokenMap, reserve.info.liquidity.mintPubkey),
|
||||||
},
|
},
|
||||||
reserve,
|
reserve,
|
||||||
} as UserDeposit;
|
} as UserDeposit;
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
||||||
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
|
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
||||||
sans-serif;
|
sans-serif;
|
||||||
-webkit-font-smoothing: antialiased;
|
-webkit-font-smoothing: antialiased;
|
||||||
-moz-osx-font-smoothing: grayscale;
|
-moz-osx-font-smoothing: grayscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
|
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
|
||||||
monospace;
|
monospace;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ import { LendingInstruction } from './instruction';
|
||||||
/// 13 `[]` Clock sysvar.
|
/// 13 `[]` Clock sysvar.
|
||||||
/// 13 `[]` Rent sysvar.
|
/// 13 `[]` Rent sysvar.
|
||||||
/// 14 `[]` Token program id.
|
/// 14 `[]` Token program id.
|
||||||
/// 15 `[optional]` Reserve liquidity aggregator account.
|
/// 15 `[optional]` Reserve liquidity oracle account.
|
||||||
/// Not required for quote currency reserves.
|
/// Not required for quote currency reserves.
|
||||||
/// Must match base and quote currency mint, and quote currency decimals.
|
/// Must match base and quote currency mint, and quote currency decimals.
|
||||||
// InitReserve {
|
// InitReserve {
|
||||||
|
@ -56,7 +56,7 @@ export const initReserveInstruction = (
|
||||||
lendingMarketAuthority: PublicKey,
|
lendingMarketAuthority: PublicKey,
|
||||||
lendingMarketOwner: PublicKey,
|
lendingMarketOwner: PublicKey,
|
||||||
transferAuthority: PublicKey,
|
transferAuthority: PublicKey,
|
||||||
aggregator?: PublicKey,
|
oracle?: PublicKey,
|
||||||
): TransactionInstruction => {
|
): TransactionInstruction => {
|
||||||
const dataLayout = BufferLayout.struct([
|
const dataLayout = BufferLayout.struct([
|
||||||
BufferLayout.u8('instruction'),
|
BufferLayout.u8('instruction'),
|
||||||
|
@ -92,8 +92,8 @@ export const initReserveInstruction = (
|
||||||
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
||||||
];
|
];
|
||||||
|
|
||||||
if (aggregator) {
|
if (oracle) {
|
||||||
keys.push({ pubkey: aggregator, isSigner: false, isWritable: false });
|
keys.push({ pubkey: oracle, isSigner: false, isWritable: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
return new TransactionInstruction({
|
return new TransactionInstruction({
|
||||||
|
|
|
@ -13,12 +13,12 @@ import { LendingInstruction } from './instruction';
|
||||||
///
|
///
|
||||||
/// 0. `[writable]` Reserve account.
|
/// 0. `[writable]` Reserve account.
|
||||||
/// 1. `[]` Clock sysvar.
|
/// 1. `[]` Clock sysvar.
|
||||||
/// 2. `[optional]` Reserve liquidity aggregator account.
|
/// 2. `[optional]` Reserve liquidity oracle account.
|
||||||
/// Required if the reserve currency is not the lending market quote
|
/// Required if the reserve currency is not the lending market quote
|
||||||
/// currency.
|
/// currency.
|
||||||
export const refreshReserveInstruction = (
|
export const refreshReserveInstruction = (
|
||||||
reserve: PublicKey,
|
reserve: PublicKey,
|
||||||
aggregator?: PublicKey,
|
oracle?: PublicKey,
|
||||||
): TransactionInstruction => {
|
): TransactionInstruction => {
|
||||||
const dataLayout = BufferLayout.struct([BufferLayout.u8('instruction')]);
|
const dataLayout = BufferLayout.struct([BufferLayout.u8('instruction')]);
|
||||||
|
|
||||||
|
@ -30,8 +30,8 @@ export const refreshReserveInstruction = (
|
||||||
{ pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false },
|
{ pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false },
|
||||||
];
|
];
|
||||||
|
|
||||||
if (aggregator) {
|
if (oracle) {
|
||||||
keys.push({ pubkey: aggregator, isSigner: false, isWritable: false });
|
keys.push({ pubkey: oracle, isSigner: false, isWritable: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
return new TransactionInstruction({
|
return new TransactionInstruction({
|
||||||
|
|
|
@ -9,7 +9,7 @@ export const LendingMarketLayout: typeof BufferLayout.Structure = BufferLayout.s
|
||||||
Layout.publicKey('owner'),
|
Layout.publicKey('owner'),
|
||||||
Layout.publicKey('quoteTokenMint'),
|
Layout.publicKey('quoteTokenMint'),
|
||||||
Layout.publicKey('tokenProgramId'),
|
Layout.publicKey('tokenProgramId'),
|
||||||
// extra space for future contract changes
|
|
||||||
BufferLayout.blob(128, 'padding'),
|
BufferLayout.blob(128, 'padding'),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
|
@ -4,23 +4,42 @@ import * as BufferLayout from 'buffer-layout';
|
||||||
import * as Layout from '../../utils/layout';
|
import * as Layout from '../../utils/layout';
|
||||||
import { LastUpdate } from './lastUpdate';
|
import { LastUpdate } from './lastUpdate';
|
||||||
|
|
||||||
// @FIXME: obligation packing
|
|
||||||
export const ObligationLayout: typeof BufferLayout.Structure = BufferLayout.struct(
|
export const ObligationLayout: typeof BufferLayout.Structure = BufferLayout.struct(
|
||||||
[
|
[
|
||||||
BufferLayout.u8('version'),
|
BufferLayout.u8('version'),
|
||||||
/// Amount of collateral tokens deposited for this obligation
|
|
||||||
Layout.uint64('collateral.depositedAmount'),
|
|
||||||
/// Reserve which collateral tokens were deposited into
|
|
||||||
Layout.publicKey('depositReserve'),
|
|
||||||
/// Borrow rate used for calculating interest.
|
|
||||||
Layout.uint128('cumulativeBorrowRateWads'),
|
|
||||||
/// Amount of tokens borrowed for this obligation plus interest
|
|
||||||
Layout.uint128('borrowedAmountWads'),
|
|
||||||
/// Reserve which tokens were borrowed from
|
|
||||||
Layout.publicKey('borrowReserve'),
|
|
||||||
|
|
||||||
// extra space for future contract changes
|
BufferLayout.struct(
|
||||||
BufferLayout.blob(128, 'padding'),
|
[Layout.uint64('slot'), BufferLayout.u8('stale')],
|
||||||
|
'lastUpdate',
|
||||||
|
),
|
||||||
|
|
||||||
|
Layout.publicKey('lendingMarket'),
|
||||||
|
Layout.publicKey('owner'),
|
||||||
|
Layout.uint128('depositedValue'),
|
||||||
|
Layout.uint128('borrowedValue'),
|
||||||
|
Layout.uint128('allowedBorrowValue'),
|
||||||
|
Layout.uint128('unhealthyBorrowValue'),
|
||||||
|
|
||||||
|
BufferLayout.u8('depositsLen'),
|
||||||
|
BufferLayout.u8('borrowsLen'),
|
||||||
|
BufferLayout.blob(776, 'dataFlat'),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
export const ObligationCollateralLayout: typeof BufferLayout.Structure = BufferLayout.struct(
|
||||||
|
[
|
||||||
|
Layout.publicKey('depositReserve'),
|
||||||
|
Layout.uint64('depositedAmount'),
|
||||||
|
Layout.uint64('marketValue'),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
export const ObligationLiquidityLayout: typeof BufferLayout.Structure = BufferLayout.struct(
|
||||||
|
[
|
||||||
|
Layout.publicKey('borrowReserve'),
|
||||||
|
Layout.uint128('cumulativeBorrowRateWads'),
|
||||||
|
Layout.uint128('borrowedAmountWads'),
|
||||||
|
Layout.uint64('marketValue'),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -28,6 +47,20 @@ export const isObligation = (info: AccountInfo<Buffer>) => {
|
||||||
return info.data.length === ObligationLayout.span;
|
return info.data.length === ObligationLayout.span;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export interface ProtoObligation {
|
||||||
|
version: number;
|
||||||
|
lastUpdate: LastUpdate;
|
||||||
|
lendingMarket: PublicKey;
|
||||||
|
owner: PublicKey;
|
||||||
|
depositedValue: BN; // decimals
|
||||||
|
borrowedValue: BN; // decimals
|
||||||
|
allowedBorrowValue: BN; // decimals
|
||||||
|
unhealthyBorrowValue: BN; // decimals
|
||||||
|
depositsLen: number;
|
||||||
|
borrowsLen: number;
|
||||||
|
dataFlat: Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
export interface Obligation {
|
export interface Obligation {
|
||||||
version: number;
|
version: number;
|
||||||
lastUpdate: LastUpdate;
|
lastUpdate: LastUpdate;
|
||||||
|
@ -39,8 +72,8 @@ export interface Obligation {
|
||||||
borrows: ObligationLiquidity[];
|
borrows: ObligationLiquidity[];
|
||||||
depositedValue: BN; // decimals
|
depositedValue: BN; // decimals
|
||||||
borrowedValue: BN; // decimals
|
borrowedValue: BN; // decimals
|
||||||
loanToValueRatio: BN; // decimals
|
allowedBorrowValue: BN; // decimals
|
||||||
liquidationThreshold: BN; // decimals
|
unhealthyBorrowValue: BN; // decimals
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ObligationCollateral {
|
export interface ObligationCollateral {
|
||||||
|
@ -61,12 +94,55 @@ export const ObligationParser = (
|
||||||
info: AccountInfo<Buffer>,
|
info: AccountInfo<Buffer>,
|
||||||
) => {
|
) => {
|
||||||
const buffer = Buffer.from(info.data);
|
const buffer = Buffer.from(info.data);
|
||||||
const obligation = ObligationLayout.decode(buffer) as Obligation;
|
const {
|
||||||
|
version,
|
||||||
|
lastUpdate,
|
||||||
|
lendingMarket,
|
||||||
|
owner,
|
||||||
|
depositedValue,
|
||||||
|
borrowedValue,
|
||||||
|
allowedBorrowValue,
|
||||||
|
unhealthyBorrowValue,
|
||||||
|
depositsLen,
|
||||||
|
borrowsLen,
|
||||||
|
dataFlat,
|
||||||
|
} = ObligationLayout.decode(buffer) as ProtoObligation;
|
||||||
|
|
||||||
if (obligation.lastUpdate.slot.isZero()) {
|
if (lastUpdate.slot.isZero()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const depositsBuffer = dataFlat.slice(
|
||||||
|
0,
|
||||||
|
depositsLen * ObligationCollateralLayout.span,
|
||||||
|
);
|
||||||
|
const deposits = BufferLayout.seq(
|
||||||
|
ObligationCollateralLayout,
|
||||||
|
depositsLen,
|
||||||
|
).decode(depositsBuffer) as ObligationCollateral[];
|
||||||
|
|
||||||
|
const borrowsBuffer = dataFlat.slice(
|
||||||
|
depositsBuffer.length,
|
||||||
|
borrowsLen * ObligationLiquidityLayout.span,
|
||||||
|
);
|
||||||
|
const borrows = BufferLayout.seq(
|
||||||
|
ObligationLiquidityLayout,
|
||||||
|
borrowsLen,
|
||||||
|
).decode(borrowsBuffer) as ObligationLiquidity[];
|
||||||
|
|
||||||
|
const obligation = {
|
||||||
|
version,
|
||||||
|
lastUpdate,
|
||||||
|
lendingMarket,
|
||||||
|
owner,
|
||||||
|
depositedValue,
|
||||||
|
borrowedValue,
|
||||||
|
allowedBorrowValue,
|
||||||
|
unhealthyBorrowValue,
|
||||||
|
deposits,
|
||||||
|
borrows,
|
||||||
|
} as Obligation;
|
||||||
|
|
||||||
const details = {
|
const details = {
|
||||||
pubkey,
|
pubkey,
|
||||||
account: {
|
account: {
|
||||||
|
|
|
@ -10,7 +10,7 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
|
||||||
BufferLayout.u8('version'),
|
BufferLayout.u8('version'),
|
||||||
|
|
||||||
BufferLayout.struct(
|
BufferLayout.struct(
|
||||||
[Layout.uint64('lastUpdateSlot'), BufferLayout.u8('lastUpdateStale')],
|
[Layout.uint64('slot'), BufferLayout.u8('stale')],
|
||||||
'lastUpdate',
|
'lastUpdate',
|
||||||
),
|
),
|
||||||
|
|
||||||
|
@ -18,30 +18,31 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
|
||||||
|
|
||||||
BufferLayout.struct(
|
BufferLayout.struct(
|
||||||
[
|
[
|
||||||
Layout.publicKey('liquidityMint'),
|
Layout.publicKey('mintPubkey'),
|
||||||
BufferLayout.u8('liquidityMintDecimals'),
|
BufferLayout.u8('mintDecimals'),
|
||||||
Layout.publicKey('liquiditySupply'),
|
Layout.publicKey('supplyPubkey'),
|
||||||
Layout.publicKey('liquidityFeeReceiver'),
|
Layout.publicKey('feeReceiver'),
|
||||||
Layout.uint128('cumulativeBorrowRateWads'),
|
// @FIXME: oracle option
|
||||||
Layout.uint128('borrowedAmountWads'),
|
// TODO: replace u32 option with generic equivalent
|
||||||
|
BufferLayout.u32('oracleOption'),
|
||||||
|
Layout.publicKey('oracle'),
|
||||||
Layout.uint64('availableAmount'),
|
Layout.uint64('availableAmount'),
|
||||||
|
Layout.uint128('borrowedAmountWads'),
|
||||||
|
Layout.uint128('cumulativeBorrowRateWads'),
|
||||||
|
Layout.uint64('marketPrice'),
|
||||||
],
|
],
|
||||||
'liquidity',
|
'liquidity',
|
||||||
),
|
),
|
||||||
|
|
||||||
BufferLayout.struct(
|
BufferLayout.struct(
|
||||||
[
|
[
|
||||||
Layout.publicKey('collateralMint'),
|
Layout.publicKey('mintPubkey'),
|
||||||
Layout.uint64('collateralMintAmount'),
|
Layout.uint64('mintTotalSupply'),
|
||||||
Layout.publicKey('collateralSupply'),
|
Layout.publicKey('supplyPubkey'),
|
||||||
],
|
],
|
||||||
'collateral',
|
'collateral',
|
||||||
),
|
),
|
||||||
|
|
||||||
// TODO: replace u32 option with generic equivalent
|
|
||||||
BufferLayout.u32('aggregatorOption'),
|
|
||||||
Layout.publicKey('aggregator'),
|
|
||||||
|
|
||||||
BufferLayout.struct(
|
BufferLayout.struct(
|
||||||
[
|
[
|
||||||
BufferLayout.u8('optimalUtilizationRate'),
|
BufferLayout.u8('optimalUtilizationRate'),
|
||||||
|
@ -59,7 +60,6 @@ export const ReserveLayout: typeof BufferLayout.Structure = BufferLayout.struct(
|
||||||
'config',
|
'config',
|
||||||
),
|
),
|
||||||
|
|
||||||
// extra space for future contract changes
|
|
||||||
BufferLayout.blob(256, 'padding'),
|
BufferLayout.blob(256, 'padding'),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -78,28 +78,25 @@ export interface Reserve {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ReserveLiquidity {
|
export interface ReserveLiquidity {
|
||||||
mint: PublicKey;
|
mintPubkey: PublicKey;
|
||||||
mintDecimals: number;
|
mintDecimals: number;
|
||||||
supply: PublicKey;
|
supplyPubkey: PublicKey;
|
||||||
feeReceiver: PublicKey;
|
feeReceiver: PublicKey;
|
||||||
|
// @FIXME: oracle option
|
||||||
// @FIXME: aggregator option
|
oracleOption: number;
|
||||||
aggregatorOption: number;
|
oraclePubkey: PublicKey;
|
||||||
aggregator: PublicKey;
|
|
||||||
|
|
||||||
cumulativeBorrowRateWads: BN;
|
|
||||||
marketPrice: BN;
|
|
||||||
availableAmount: BN;
|
availableAmount: BN;
|
||||||
borrowedAmountWads: BN;
|
borrowedAmountWads: BN;
|
||||||
|
cumulativeBorrowRateWads: BN;
|
||||||
|
marketPrice: BN;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ReserveCollateral {
|
export interface ReserveCollateral {
|
||||||
mint: PublicKey;
|
mintPubkey: PublicKey;
|
||||||
mintAmount: BN;
|
mintTotalSupply: BN;
|
||||||
supply: PublicKey;
|
supplyPubkey: PublicKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @FIXME: use BigNumber
|
|
||||||
export interface ReserveConfig {
|
export interface ReserveConfig {
|
||||||
optimalUtilizationRate: number;
|
optimalUtilizationRate: number;
|
||||||
loanToValueRatio: number;
|
loanToValueRatio: number;
|
||||||
|
@ -159,7 +156,8 @@ export const reserveMarketCap = (reserve?: Reserve) => {
|
||||||
export const collateralExchangeRate = (reserve?: Reserve) => {
|
export const collateralExchangeRate = (reserve?: Reserve) => {
|
||||||
// @FIXME: use BigNumber
|
// @FIXME: use BigNumber
|
||||||
return (
|
return (
|
||||||
(reserve?.collateral.mintAmount.toNumber() || 1) / reserveMarketCap(reserve)
|
(reserve?.collateral.mintTotalSupply.toNumber() || 1) /
|
||||||
|
reserveMarketCap(reserve)
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,9 @@ import { useBorrowingPower } from '../../hooks';
|
||||||
import { calculateBorrowAPY, Reserve } from '../../models';
|
import { calculateBorrowAPY, Reserve } from '../../models';
|
||||||
|
|
||||||
export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => {
|
export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => {
|
||||||
const name = useTokenName(props.reserve.liquidity.mint);
|
const name = useTokenName(props.reserve.liquidity.mintPubkey);
|
||||||
const price = useMidPriceInUSD(props.reserve.liquidity.mint.toBase58()).price;
|
const price = useMidPriceInUSD(props.reserve.liquidity.mintPubkey.toBase58())
|
||||||
|
.price;
|
||||||
|
|
||||||
const { borrowingPower, totalInQuote } = useBorrowingPower(props.address);
|
const { borrowingPower, totalInQuote } = useBorrowingPower(props.address);
|
||||||
|
|
||||||
|
@ -25,7 +26,7 @@ export const BorrowItem = (props: { reserve: Reserve; address: PublicKey }) => {
|
||||||
<Link to={`/borrow/${props.address.toBase58()}`}>
|
<Link to={`/borrow/${props.address.toBase58()}`}>
|
||||||
<div className="borrow-item">
|
<div className="borrow-item">
|
||||||
<span style={{ display: 'flex' }}>
|
<span style={{ display: 'flex' }}>
|
||||||
<TokenIcon mintAddress={props.reserve.liquidity.mint} />
|
<TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
|
||||||
{name}
|
{name}
|
||||||
</span>
|
</span>
|
||||||
<div>${formatNumber.format(price)}</div>
|
<div>${formatNumber.format(price)}</div>
|
||||||
|
|
|
@ -13,7 +13,7 @@ import { calculateDepositAPY } from '../../../models';
|
||||||
|
|
||||||
export const DepositItem = (props: { userDeposit: UserDeposit }) => {
|
export const DepositItem = (props: { userDeposit: UserDeposit }) => {
|
||||||
const { reserve, info } = props.userDeposit;
|
const { reserve, info } = props.userDeposit;
|
||||||
const mintAddress = reserve.info.liquidity.mint;
|
const mintAddress = reserve.info.liquidity.mintPubkey;
|
||||||
const name = useTokenName(mintAddress);
|
const name = useTokenName(mintAddress);
|
||||||
|
|
||||||
const depositAPY = useMemo(() => calculateDepositAPY(reserve.info), [
|
const depositAPY = useMemo(() => calculateDepositAPY(reserve.info), [
|
||||||
|
|
|
@ -34,8 +34,8 @@ export const ObligationItem = (props: {
|
||||||
obligation.info.deposits[0].depositReserve,
|
obligation.info.deposits[0].depositReserve,
|
||||||
) as ParsedAccount<Reserve>;
|
) as ParsedAccount<Reserve>;
|
||||||
|
|
||||||
const liquidityMint = useMint(borrowReserve.info.liquidity.mint);
|
const liquidityMint = useMint(borrowReserve.info.liquidity.mintPubkey);
|
||||||
const collateralMint = useMint(depositReserve.info.liquidity.mint);
|
const collateralMint = useMint(depositReserve.info.liquidity.mintPubkey);
|
||||||
|
|
||||||
const borrowAmount = fromLamports(
|
const borrowAmount = fromLamports(
|
||||||
wadToLamports(obligation.info.borrows[0].borrowedAmountWads),
|
wadToLamports(obligation.info.borrows[0].borrowedAmountWads),
|
||||||
|
@ -52,8 +52,10 @@ export const ObligationItem = (props: {
|
||||||
);
|
);
|
||||||
const collateral = fromLamports(collateralLamports, collateralMint);
|
const collateral = fromLamports(collateralLamports, collateralMint);
|
||||||
|
|
||||||
const borrowName = useTokenName(borrowReserve?.info.liquidity.mint);
|
const borrowName = useTokenName(borrowReserve?.info.liquidity.mintPubkey);
|
||||||
const collateralName = useTokenName(depositReserve?.info.liquidity.mint);
|
const collateralName = useTokenName(
|
||||||
|
depositReserve?.info.liquidity.mintPubkey,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="dashboard-item">
|
<div className="dashboard-item">
|
||||||
|
@ -63,10 +65,10 @@ export const ObligationItem = (props: {
|
||||||
title={`${collateralName}→${borrowName}`}
|
title={`${collateralName}→${borrowName}`}
|
||||||
>
|
>
|
||||||
<TokenIcon
|
<TokenIcon
|
||||||
mintAddress={depositReserve?.info.liquidity.mint}
|
mintAddress={depositReserve?.info.liquidity.mintPubkey}
|
||||||
style={{ marginRight: '-0.5rem' }}
|
style={{ marginRight: '-0.5rem' }}
|
||||||
/>
|
/>
|
||||||
<TokenIcon mintAddress={borrowReserve?.info.liquidity.mint} />
|
<TokenIcon mintAddress={borrowReserve?.info.liquidity.mintPubkey} />
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
export * from "./view";
|
export * from './view';
|
||||||
|
|
|
@ -16,11 +16,11 @@ export const ReserveItem = (props: {
|
||||||
reserve: Reserve;
|
reserve: Reserve;
|
||||||
address: PublicKey;
|
address: PublicKey;
|
||||||
}) => {
|
}) => {
|
||||||
const name = useTokenName(props.reserve.liquidity.mint);
|
const name = useTokenName(props.reserve.liquidity.mintPubkey);
|
||||||
const {
|
const {
|
||||||
balance: tokenBalance,
|
balance: tokenBalance,
|
||||||
balanceInUSD: tokenBalanceInUSD,
|
balanceInUSD: tokenBalanceInUSD,
|
||||||
} = useUserBalance(props.reserve.liquidity.mint);
|
} = useUserBalance(props.reserve.liquidity.mintPubkey);
|
||||||
const {
|
const {
|
||||||
balance: collateralBalance,
|
balance: collateralBalance,
|
||||||
balanceInUSD: collateralBalanceInUSD,
|
balanceInUSD: collateralBalanceInUSD,
|
||||||
|
@ -32,7 +32,7 @@ export const ReserveItem = (props: {
|
||||||
<Link to={`/deposit/${props.address.toBase58()}`}>
|
<Link to={`/deposit/${props.address.toBase58()}`}>
|
||||||
<div className="deposit-item">
|
<div className="deposit-item">
|
||||||
<span style={{ display: 'flex' }}>
|
<span style={{ display: 'flex' }}>
|
||||||
<TokenIcon mintAddress={props.reserve.liquidity.mint} />
|
<TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
|
||||||
{name}
|
{name}
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
|
|
|
@ -13,7 +13,7 @@ export const FaucetView = () => {
|
||||||
|
|
||||||
const airdrop = useCallback(() => {
|
const airdrop = useCallback(() => {
|
||||||
if (!wallet?.publicKey) {
|
if (!wallet?.publicKey) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
connection
|
connection
|
||||||
|
@ -21,28 +21,28 @@ export const FaucetView = () => {
|
||||||
.then(() => {
|
.then(() => {
|
||||||
notify({
|
notify({
|
||||||
message: LABELS.ACCOUNT_FUNDED,
|
message: LABELS.ACCOUNT_FUNDED,
|
||||||
type: "success",
|
type: 'success',
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}, [wallet, wallet?.publicKey, connection]);
|
}, [wallet, wallet?.publicKey, connection]);
|
||||||
|
|
||||||
const bodyStyle: React.CSSProperties = {
|
const bodyStyle: React.CSSProperties = {
|
||||||
display: "flex",
|
display: 'flex',
|
||||||
flex: 1,
|
flex: 1,
|
||||||
justifyContent: "center",
|
justifyContent: 'center',
|
||||||
alignItems: "center",
|
alignItems: 'center',
|
||||||
height: "100%",
|
height: '100%',
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flexColumn" style={{ flex: 1 }}>
|
<div className="flexColumn" style={{ flex: 1 }}>
|
||||||
<Card title={"Faucet"} bodyStyle={bodyStyle} style={{ flex: 1 }}>
|
<Card title={'Faucet'} bodyStyle={bodyStyle} style={{ flex: 1 }}>
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
display: 'flex',
|
||||||
flexDirection: "column",
|
flexDirection: 'column',
|
||||||
justifyContent: "space-around",
|
justifyContent: 'space-around',
|
||||||
alignItems: "center",
|
alignItems: 'center',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div className="deposit-input-title" style={{ margin: 10 }}>
|
<div className="deposit-input-title" style={{ margin: 10 }}>
|
||||||
|
|
|
@ -44,7 +44,7 @@ export const HomeView = () => {
|
||||||
|
|
||||||
const localCache = cache;
|
const localCache = cache;
|
||||||
const liquidityMint = localCache.get(
|
const liquidityMint = localCache.get(
|
||||||
item.info.liquidity.mint.toBase58(),
|
item.info.liquidity.mintPubkey.toBase58(),
|
||||||
) as ParsedAccount<MintInfo>;
|
) as ParsedAccount<MintInfo>;
|
||||||
|
|
||||||
if (!liquidityMint) {
|
if (!liquidityMint) {
|
||||||
|
@ -62,7 +62,10 @@ export const HomeView = () => {
|
||||||
wadToLamports(item.info?.liquidity.borrowedAmountWads).toNumber(),
|
wadToLamports(item.info?.liquidity.borrowedAmountWads).toNumber(),
|
||||||
liquidityMint.info,
|
liquidityMint.info,
|
||||||
) * price,
|
) * price,
|
||||||
name: getTokenName(tokenMap, item.info.liquidity.mint.toBase58()),
|
name: getTokenName(
|
||||||
|
tokenMap,
|
||||||
|
item.info.liquidity.mintPubkey.toBase58(),
|
||||||
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
newTotals.items.push(leaf);
|
newTotals.items.push(leaf);
|
||||||
|
|
|
@ -24,9 +24,9 @@ export const LendingReserveItem = (props: {
|
||||||
address: PublicKey;
|
address: PublicKey;
|
||||||
item?: TotalItem;
|
item?: TotalItem;
|
||||||
}) => {
|
}) => {
|
||||||
const name = useTokenName(props.reserve.liquidity.mint);
|
const name = useTokenName(props.reserve.liquidity.mintPubkey);
|
||||||
|
|
||||||
const liquidityMint = useMint(props.reserve.liquidity.mint);
|
const liquidityMint = useMint(props.reserve.liquidity.mintPubkey);
|
||||||
|
|
||||||
const availableAmount = fromLamports(
|
const availableAmount = fromLamports(
|
||||||
props.reserve.liquidity.availableAmount,
|
props.reserve.liquidity.availableAmount,
|
||||||
|
@ -56,7 +56,7 @@ export const LendingReserveItem = (props: {
|
||||||
<Link to={`/reserve/${props.address.toBase58()}`}>
|
<Link to={`/reserve/${props.address.toBase58()}`}>
|
||||||
<div className="home-item">
|
<div className="home-item">
|
||||||
<span style={{ display: 'flex' }}>
|
<span style={{ display: 'flex' }}>
|
||||||
<TokenIcon mintAddress={props.reserve.liquidity.mint} />
|
<TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
|
||||||
{name}
|
{name}
|
||||||
</span>
|
</span>
|
||||||
<div title={marketSize.toString()}>
|
<div title={marketSize.toString()}>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
export { HomeView } from "./home";
|
export { HomeView } from './home';
|
||||||
export { BorrowView } from "./borrow";
|
export { BorrowView } from './borrow';
|
||||||
export { BorrowReserveView } from "./borrowReserve";
|
export { BorrowReserveView } from './borrowReserve';
|
||||||
export { DashboardView } from "./dashboard";
|
export { DashboardView } from './dashboard';
|
||||||
export { DepositView } from "./deposit";
|
export { DepositView } from './deposit';
|
||||||
export { DepositReserveView } from "./depositReserve";
|
export { DepositReserveView } from './depositReserve';
|
||||||
export { ReserveView } from "./reserve";
|
export { ReserveView } from './reserve';
|
||||||
export { WithdrawView } from "./withdraw";
|
export { WithdrawView } from './withdraw';
|
||||||
export { FaucetView } from "./faucet";
|
export { FaucetView } from './faucet';
|
||||||
export { RepayReserveView } from "./repayReserve";
|
export { RepayReserveView } from './repayReserve';
|
||||||
export { LiquidateView } from "./liquidate";
|
export { LiquidateView } from './liquidate';
|
||||||
export { LiquidateReserveView } from "./liquidateReserve";
|
export { LiquidateReserveView } from './liquidateReserve';
|
||||||
export { MarginTrading } from "./margin";
|
export { MarginTrading } from './margin';
|
||||||
|
|
|
@ -32,8 +32,8 @@ export const LiquidateItem = (props: { item: EnrichedLendingObligation }) => {
|
||||||
obligation.deposits[0].depositReserve,
|
obligation.deposits[0].depositReserve,
|
||||||
) as ParsedAccount<Reserve>;
|
) as ParsedAccount<Reserve>;
|
||||||
|
|
||||||
const liquidityMint = useMint(borrowReserve.info.liquidity.mint);
|
const liquidityMint = useMint(borrowReserve.info.liquidity.mintPubkey);
|
||||||
const collateralMint = useMint(depositReserve.info.liquidity.mint);
|
const collateralMint = useMint(depositReserve.info.liquidity.mintPubkey);
|
||||||
|
|
||||||
const borrowAmount = fromLamports(
|
const borrowAmount = fromLamports(
|
||||||
wadToLamports(obligation.borrows[0].borrowedAmountWads),
|
wadToLamports(obligation.borrows[0].borrowedAmountWads),
|
||||||
|
@ -50,8 +50,10 @@ export const LiquidateItem = (props: { item: EnrichedLendingObligation }) => {
|
||||||
);
|
);
|
||||||
const collateral = fromLamports(collateralLamports, collateralMint);
|
const collateral = fromLamports(collateralLamports, collateralMint);
|
||||||
|
|
||||||
const borrowName = useTokenName(borrowReserve?.info.liquidity.mint);
|
const borrowName = useTokenName(borrowReserve?.info.liquidity.mintPubkey);
|
||||||
const collateralName = useTokenName(depositReserve?.info.liquidity.mint);
|
const collateralName = useTokenName(
|
||||||
|
depositReserve?.info.liquidity.mintPubkey,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Link to={`/liquidate/${props.item.account.pubkey.toBase58()}`}>
|
<Link to={`/liquidate/${props.item.account.pubkey.toBase58()}`}>
|
||||||
|
@ -59,10 +61,10 @@ export const LiquidateItem = (props: { item: EnrichedLendingObligation }) => {
|
||||||
<span style={{ display: 'flex' }}>
|
<span style={{ display: 'flex' }}>
|
||||||
<div style={{ display: 'flex' }}>
|
<div style={{ display: 'flex' }}>
|
||||||
<TokenIcon
|
<TokenIcon
|
||||||
mintAddress={depositReserve?.info.liquidity.mint}
|
mintAddress={depositReserve?.info.liquidity.mintPubkey}
|
||||||
style={{ marginRight: '-0.5rem' }}
|
style={{ marginRight: '-0.5rem' }}
|
||||||
/>
|
/>
|
||||||
<TokenIcon mintAddress={borrowReserve?.info.liquidity.mint} />
|
<TokenIcon mintAddress={borrowReserve?.info.liquidity.mintPubkey} />
|
||||||
</div>
|
</div>
|
||||||
{collateralName}→{borrowName}
|
{collateralName}→{borrowName}
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -17,8 +17,9 @@ export const MarginTradeItem = (props: {
|
||||||
reserve: Reserve;
|
reserve: Reserve;
|
||||||
address: PublicKey;
|
address: PublicKey;
|
||||||
}) => {
|
}) => {
|
||||||
const name = useTokenName(props.reserve.liquidity.mint);
|
const name = useTokenName(props.reserve.liquidity.mintPubkey);
|
||||||
const price = useMidPriceInUSD(props.reserve.liquidity.mint.toBase58()).price;
|
const price = useMidPriceInUSD(props.reserve.liquidity.mintPubkey.toBase58())
|
||||||
|
.price;
|
||||||
|
|
||||||
const apr = calculateBorrowAPY(props.reserve);
|
const apr = calculateBorrowAPY(props.reserve);
|
||||||
|
|
||||||
|
@ -33,7 +34,7 @@ export const MarginTradeItem = (props: {
|
||||||
<Link to={`/margin/${props.address.toBase58()}`}>
|
<Link to={`/margin/${props.address.toBase58()}`}>
|
||||||
<div className="choose-margin-item">
|
<div className="choose-margin-item">
|
||||||
<span style={{ display: 'flex' }}>
|
<span style={{ display: 'flex' }}>
|
||||||
<TokenIcon mintAddress={props.reserve.liquidity.mint} />
|
<TokenIcon mintAddress={props.reserve.liquidity.mintPubkey} />
|
||||||
{name}
|
{name}
|
||||||
</span>
|
</span>
|
||||||
<div>${formatNumber.format(price)}</div>
|
<div>${formatNumber.format(price)}</div>
|
||||||
|
|
|
@ -22,10 +22,12 @@ export default function Breakdown({ item }: { item: Position }) {
|
||||||
const gains = 'green';
|
const gains = 'green';
|
||||||
const losses = 'red';
|
const losses = 'red';
|
||||||
const token = tokens.find(
|
const token = tokens.find(
|
||||||
t => t.address === item.asset.type?.info?.liquidity.mint?.toBase58(),
|
t => t.address === item.asset.type?.info?.liquidity.mintPubkey?.toBase58(),
|
||||||
);
|
);
|
||||||
const collateralToken = tokens.find(
|
const collateralToken = tokens.find(
|
||||||
t => t.address === item.collateral.type?.info?.liquidity.mint?.toBase58(),
|
t =>
|
||||||
|
t.address ===
|
||||||
|
item.collateral.type?.info?.liquidity.mintPubkey?.toBase58(),
|
||||||
);
|
);
|
||||||
|
|
||||||
const [myGain, setMyGain] = useState<number>(10);
|
const [myGain, setMyGain] = useState<number>(10);
|
||||||
|
|
|
@ -64,35 +64,35 @@ function getChartData() {
|
||||||
//the only way to create an immutable copy of array with objects inside.
|
//the only way to create an immutable copy of array with objects inside.
|
||||||
const baseDashed = getBaseDashed();
|
const baseDashed = getBaseDashed();
|
||||||
const baseSolid = JSON.parse(
|
const baseSolid = JSON.parse(
|
||||||
JSON.stringify(baseData.slice(0, Math.floor(baseData.length) / 2 + 1))
|
JSON.stringify(baseData.slice(0, Math.floor(baseData.length) / 2 + 1)),
|
||||||
);
|
);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
datasets: [
|
datasets: [
|
||||||
{
|
{
|
||||||
backgroundColor: "transparent",
|
backgroundColor: 'transparent',
|
||||||
borderColor: "rgb(39, 107, 251)",
|
borderColor: 'rgb(39, 107, 251)',
|
||||||
borderWidth: 4,
|
borderWidth: 4,
|
||||||
radius: 0,
|
radius: 0,
|
||||||
data: baseSolid,
|
data: baseSolid,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
backgroundColor: "transparent",
|
backgroundColor: 'transparent',
|
||||||
|
|
||||||
borderWidth: 4,
|
borderWidth: 4,
|
||||||
radius: 0,
|
radius: 0,
|
||||||
data: baseDashed,
|
data: baseDashed,
|
||||||
borderDash: [15, 3],
|
borderDash: [15, 3],
|
||||||
label: "LEVERAGE",
|
label: 'LEVERAGE',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
backgroundColor: "transparent",
|
backgroundColor: 'transparent',
|
||||||
borderColor: "rgb(86, 169, 255)",
|
borderColor: 'rgb(86, 169, 255)',
|
||||||
borderWidth: 2,
|
borderWidth: 2,
|
||||||
radius: 0,
|
radius: 0,
|
||||||
data: baseDashed,
|
data: baseDashed,
|
||||||
borderDash: [8, 4],
|
borderDash: [8, 4],
|
||||||
label: "HOLD",
|
label: 'HOLD',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
@ -102,7 +102,7 @@ const labelPlugin: ChartPluginsOptions = {};
|
||||||
|
|
||||||
const getBaseDashed = () => {
|
const getBaseDashed = () => {
|
||||||
return JSON.parse(
|
return JSON.parse(
|
||||||
JSON.stringify(baseData.slice(Math.floor(baseData.length) / 2))
|
JSON.stringify(baseData.slice(Math.floor(baseData.length) / 2)),
|
||||||
) as { x: number; y: number }[];
|
) as { x: number; y: number }[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -132,12 +132,12 @@ function updateChartData({
|
||||||
}
|
}
|
||||||
const gain = (priceChange * leverage) / 100;
|
const gain = (priceChange * leverage) / 100;
|
||||||
return { x: item.x, y: item.y * (1 + gain) };
|
return { x: item.x, y: item.y * (1 + gain) };
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
chart.data.datasets[1].data = leverageData;
|
chart.data.datasets[1].data = leverageData;
|
||||||
chart.data.datasets[1].borderColor =
|
chart.data.datasets[1].borderColor =
|
||||||
priceChange >= 0 ? "rgb(51, 223, 204)" : "rgb(255,79,79)";
|
priceChange >= 0 ? 'rgb(51, 223, 204)' : 'rgb(255,79,79)';
|
||||||
|
|
||||||
baseDashed.forEach((item: { y: number; x: number }, index: number) => {
|
baseDashed.forEach((item: { y: number; x: number }, index: number) => {
|
||||||
if (index !== 0) item.y += (item.y * priceChange) / 100;
|
if (index !== 0) item.y += (item.y * priceChange) / 100;
|
||||||
|
@ -166,8 +166,8 @@ function drawLabels(chart: Chart, leverage: number, priceChange: number) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.save();
|
ctx.save();
|
||||||
ctx.font = "normal normal bold 15px /1.5 Muli";
|
ctx.font = 'normal normal bold 15px /1.5 Muli';
|
||||||
ctx.textBaseline = "bottom";
|
ctx.textBaseline = 'bottom';
|
||||||
|
|
||||||
const datasets = chart.config.data.datasets;
|
const datasets = chart.config.data.datasets;
|
||||||
const element = chart?.canvas?.parentNode as HTMLElement;
|
const element = chart?.canvas?.parentNode as HTMLElement;
|
||||||
|
@ -183,7 +183,7 @@ function drawLabels(chart: Chart, leverage: number, priceChange: number) {
|
||||||
const y = meta.data[pointPostition]._model.y;
|
const y = meta.data[pointPostition]._model.y;
|
||||||
let yOffset;
|
let yOffset;
|
||||||
|
|
||||||
if (label === "HOLD") {
|
if (label === 'HOLD') {
|
||||||
yOffset = leverage * priceChange > 0 ? y * 1.2 : y * 0.8;
|
yOffset = leverage * priceChange > 0 ? y * 1.2 : y * 0.8;
|
||||||
} else {
|
} else {
|
||||||
yOffset = leverage * priceChange > 0 ? y * 0.8 : y * 1.2;
|
yOffset = leverage * priceChange > 0 ? y * 0.8 : y * 1.2;
|
||||||
|
@ -215,7 +215,7 @@ export default function GainsChart({
|
||||||
}
|
}
|
||||||
|
|
||||||
chartRef.current = new Chart(canvasRef.current, {
|
chartRef.current = new Chart(canvasRef.current, {
|
||||||
type: "line",
|
type: 'line',
|
||||||
data: getChartData(),
|
data: getChartData(),
|
||||||
plugins: [labelPlugin],
|
plugins: [labelPlugin],
|
||||||
options: {
|
options: {
|
||||||
|
@ -229,12 +229,12 @@ export default function GainsChart({
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
labels: {
|
labels: {
|
||||||
render: "title",
|
render: 'title',
|
||||||
fontColor: ["green", "white", "red"],
|
fontColor: ['green', 'white', 'red'],
|
||||||
precision: 2,
|
precision: 2,
|
||||||
},
|
},
|
||||||
animation: {
|
animation: {
|
||||||
easing: "easeOutExpo",
|
easing: 'easeOutExpo',
|
||||||
duration: 500,
|
duration: 500,
|
||||||
},
|
},
|
||||||
scales: {
|
scales: {
|
||||||
|
@ -244,8 +244,8 @@ export default function GainsChart({
|
||||||
gridLines: {
|
gridLines: {
|
||||||
display: false,
|
display: false,
|
||||||
},
|
},
|
||||||
type: "linear",
|
type: 'linear',
|
||||||
position: "bottom",
|
position: 'bottom',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
yAxes: [
|
yAxes: [
|
||||||
|
@ -273,19 +273,19 @@ export default function GainsChart({
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
display: 'flex',
|
||||||
flexDirection: "column",
|
flexDirection: 'column',
|
||||||
alignItems: "stretch",
|
alignItems: 'stretch',
|
||||||
justifyContent: "center",
|
justifyContent: 'center',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<canvas ref={canvasRef as any} />
|
<canvas ref={canvasRef as any} />
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
display: 'flex',
|
||||||
flexDirection: "row",
|
flexDirection: 'row',
|
||||||
justifyContent: "space-between",
|
justifyContent: 'space-between',
|
||||||
alignItems: "center",
|
alignItems: 'center',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span>past</span>
|
<span>past</span>
|
||||||
|
|
|
@ -140,9 +140,7 @@ export default function NewPositionForm({
|
||||||
}}
|
}}
|
||||||
onCollateralReserve={key => {
|
onCollateralReserve={key => {
|
||||||
const id: string =
|
const id: string =
|
||||||
cache
|
cache.byParser(ReserveParser).find(acc => acc === key) || '';
|
||||||
.byParser(ReserveParser)
|
|
||||||
.find(acc => acc === key) || '';
|
|
||||||
const parser = cache.get(id) as ParsedAccount<Reserve>;
|
const parser = cache.get(id) as ParsedAccount<Reserve>;
|
||||||
const newPos = {
|
const newPos = {
|
||||||
...newPosition,
|
...newPosition,
|
||||||
|
|
|
@ -23,15 +23,15 @@ export function usePoolAndTradeInfoFrom(
|
||||||
const desiredValue = newPosition.asset.value || 0;
|
const desiredValue = newPosition.asset.value || 0;
|
||||||
|
|
||||||
const pool = usePoolForBasket([
|
const pool = usePoolForBasket([
|
||||||
collType?.info?.liquidity.mint?.toBase58(),
|
collType?.info?.liquidity.mintPubkey?.toBase58(),
|
||||||
desiredType?.info?.liquidity.mint?.toBase58(),
|
desiredType?.info?.liquidity.mintPubkey?.toBase58(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const userDeposits = useUserDeposits();
|
const userDeposits = useUserDeposits();
|
||||||
const collateralDeposit = userDeposits.userDeposits.find(
|
const collateralDeposit = userDeposits.userDeposits.find(
|
||||||
u =>
|
u =>
|
||||||
u.reserve.info.liquidity.mint.toBase58() ===
|
u.reserve.info.liquidity.mintPubkey.toBase58() ===
|
||||||
collType?.info?.liquidity.mint?.toBase58(),
|
collType?.info?.liquidity.mintPubkey?.toBase58(),
|
||||||
);
|
);
|
||||||
|
|
||||||
const enrichedPools = useEnrichedPools(pool ? [pool] : []);
|
const enrichedPools = useEnrichedPools(pool ? [pool] : []);
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
declare module "buffer-layout" {
|
declare module 'buffer-layout' {
|
||||||
const bl: any;
|
const bl: any;
|
||||||
export = bl;
|
export = bl;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare module "jazzicon" {
|
declare module 'jazzicon' {
|
||||||
const jazzicon: any;
|
const jazzicon: any;
|
||||||
export = jazzicon;
|
export = jazzicon;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue