Fetch decimals before creating the market client (#38)

This commit is contained in:
Armani Ferrante 2021-06-10 19:15:34 -07:00 committed by GitHub
parent cfcd8849bb
commit 5d745f3dd9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 27 deletions

View File

@ -1,4 +1,5 @@
import React, { useContext, useState, useEffect } from "react"; import React, { useContext, useState, useEffect } from "react";
import * as assert from "assert";
import { useAsync } from "react-async-hook"; import { useAsync } from "react-async-hook";
import { TokenInfo } from "@solana/spl-token-registry"; import { TokenInfo } from "@solana/spl-token-registry";
import { MintLayout } from "@solana/spl-token"; import { MintLayout } from "@solana/spl-token";
@ -94,19 +95,14 @@ export function DexContextProvider(props: any) {
publicKey: programAccount?.publicKey, publicKey: programAccount?.publicKey,
account: new Market( account: new Market(
Market.getLayout(DEX_PID).decode(programAccount?.account.data), Market.getLayout(DEX_PID).decode(programAccount?.account.data),
-1, // Not used so don't bother fetching. -1, // Set below so that we can batch fetch mints.
-1, // Not used so don't bother fetching. -1, // Set below so that we can batch fetch mints.
swapClient.program.provider.opts, swapClient.program.provider.opts,
DEX_PID DEX_PID
), ),
}; };
}); });
marketClients.forEach((m) => {
_MARKET_CACHE.set(
m.publicKey!.toString(),
new Promise<Market>((resolve) => resolve(m.account))
);
});
setOoAccounts(newOoAccounts); setOoAccounts(newOoAccounts);
// Batch fetch all the mints, since we know we'll need them at some // Batch fetch all the mints, since we know we'll need them at some
@ -131,8 +127,28 @@ export function DexContextProvider(props: any) {
swapClient.program.provider.connection, swapClient.program.provider.connection,
mintPubkeys mintPubkeys
); );
mints.forEach((mint) => { const mintInfos = mints.map((mint) => {
setMintCache(mint!.publicKey, MintLayout.decode(mint!.account.data)); const mintInfo = MintLayout.decode(mint!.account.data);
setMintCache(mint!.publicKey, mintInfo);
return { publicKey: mint!.publicKey, mintInfo };
});
marketClients.forEach((m) => {
const baseMintInfo = mintInfos.filter((mint) =>
mint.publicKey.equals(m.account.baseMintAddress)
)[0];
const quoteMintInfo = mintInfos.filter((mint) =>
mint.publicKey.equals(m.account.baseMintAddress)
)[0];
assert.ok(baseMintInfo && quoteMintInfo);
// @ts-ignore
m.account._baseSplTokenDecimals = baseMintInfo.mintInfo.decimals;
// @ts-ignore
m.account._quoteSplTokenDecimals = quoteMintInfo.mintInfo.decimals;
_MARKET_CACHE.set(
m.publicKey!.toString(),
new Promise<Market>((resolve) => resolve(m.account))
);
}); });
}); });
}, [ }, [
@ -179,15 +195,11 @@ export function useMarket(market?: PublicKey): Market | undefined {
} }
const marketClient = new Promise<Market>(async (resolve) => { const marketClient = new Promise<Market>(async (resolve) => {
const marketAccount = // TODO: if we already have the mints, then pass them through to the
await swapClient.program.provider.connection.getAccountInfo(market); // market client here to save a network request.
if (marketAccount === null) { const marketClient = await Market.load(
throw new Error("Invalid market"); swapClient.program.provider.connection,
} market,
const marketClient = new Market(
Market.getLayout(DEX_PID).decode(marketAccount.data),
-1,
-1,
swapClient.program.provider.opts, swapClient.program.provider.opts,
DEX_PID DEX_PID
); );

View File

@ -35,14 +35,12 @@ export function TokenListContextProvider(props: any) {
// Tokens with USD(x) quoted markets. // Tokens with USD(x) quoted markets.
const swappableTokens = useMemo(() => { const swappableTokens = useMemo(() => {
const tokens = tokenList const tokens = tokenList.filter((t: TokenInfo) => {
.filter((t: TokenInfo) => { const isUsdxQuoted =
const isUsdxQuoted = t.extensions?.serumV3Usdt || t.extensions?.serumV3Usdc;
t.extensions?.serumV3Usdt || t.extensions?.serumV3Usdc; const isSol = t.address === "So11111111111111111111111111111111111111112";
const isSol = return isUsdxQuoted && !isSol;
t.address === "So11111111111111111111111111111111111111112"; });
return isUsdxQuoted && !isSol;
})
tokens.sort((a: TokenInfo, b: TokenInfo) => tokens.sort((a: TokenInfo, b: TokenInfo) =>
a.symbol < b.symbol ? -1 : a.symbol > b.symbol ? 1 : 0 a.symbol < b.symbol ? -1 : a.symbol > b.symbol ? 1 : 0
); );