Use serum-js for list of markets and tokens
This commit is contained in:
parent
3a6e2a467c
commit
ea174e38ce
|
@ -6,7 +6,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ant-design/icons": "^4.2.1",
|
"@ant-design/icons": "^4.2.1",
|
||||||
"@craco/craco": "^5.6.4",
|
"@craco/craco": "^5.6.4",
|
||||||
"@project-serum/serum": "^0.11.2",
|
"@project-serum/serum": "^0.12.0",
|
||||||
"@project-serum/sol-wallet-adapter": "^0.1.0",
|
"@project-serum/sol-wallet-adapter": "^0.1.0",
|
||||||
"@solana/web3.js": "^0.71.10",
|
"@solana/web3.js": "^0.71.10",
|
||||||
"@testing-library/jest-dom": "^4.2.4",
|
"@testing-library/jest-dom": "^4.2.4",
|
||||||
|
|
|
@ -1,33 +1,35 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { Modal } from 'antd';
|
import { Modal } from 'antd';
|
||||||
import {
|
import {
|
||||||
COIN_MINTS,
|
|
||||||
useSelectedBaseCurrencyAccount,
|
useSelectedBaseCurrencyAccount,
|
||||||
useMarket,
|
useMarket,
|
||||||
useSelectedQuoteCurrencyAccount,
|
useSelectedQuoteCurrencyAccount,
|
||||||
} from '../utils/markets';
|
} from '../utils/markets';
|
||||||
|
import { TOKEN_MINTS } from '@project-serum/serum';
|
||||||
import { useWallet } from '../utils/wallet';
|
import { useWallet } from '../utils/wallet';
|
||||||
import Link from './Link';
|
import Link from './Link';
|
||||||
|
|
||||||
export default function DepositDialog({ onClose, depositCoin }) {
|
export default function DepositDialog({ onClose, depositCoin }) {
|
||||||
let coinMint =
|
let coinMint =
|
||||||
depositCoin &&
|
depositCoin &&
|
||||||
Object.keys(COIN_MINTS).find(
|
TOKEN_MINTS.find(({ name }) => name === depositCoin)?.address;
|
||||||
(address) => COIN_MINTS[address] === depositCoin,
|
|
||||||
);
|
|
||||||
const { market } = useMarket();
|
const { market } = useMarket();
|
||||||
const { providerName, providerUrl } = useWallet();
|
const { providerName, providerUrl } = useWallet();
|
||||||
const baseCurrencyAccount = useSelectedBaseCurrencyAccount();
|
const baseCurrencyAccount = useSelectedBaseCurrencyAccount();
|
||||||
const quoteCurrencyAccount = useSelectedQuoteCurrencyAccount();
|
const quoteCurrencyAccount = useSelectedQuoteCurrencyAccount();
|
||||||
let account;
|
|
||||||
if (market?.baseMintAddress?.toBase58() === coinMint) {
|
|
||||||
account = baseCurrencyAccount;
|
|
||||||
} else {
|
|
||||||
account = quoteCurrencyAccount;
|
|
||||||
}
|
|
||||||
if (!coinMint) {
|
if (!coinMint) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let account;
|
||||||
|
if (market?.baseMintAddress?.equals(coinMint)) {
|
||||||
|
account = baseCurrencyAccount;
|
||||||
|
} else if (market?.quoteMintAddress?.equals(coinMint)) {
|
||||||
|
account = quoteCurrencyAccount;
|
||||||
|
} else {
|
||||||
|
account = null;
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
title={depositCoin}
|
title={depositCoin}
|
||||||
|
@ -37,7 +39,7 @@ export default function DepositDialog({ onClose, depositCoin }) {
|
||||||
>
|
>
|
||||||
<div style={{ paddingTop: '20px' }}>
|
<div style={{ paddingTop: '20px' }}>
|
||||||
<p style={{ color: 'white' }}>Mint address:</p>
|
<p style={{ color: 'white' }}>Mint address:</p>
|
||||||
<p style={{ color: 'rgba(255,255,255,0.5)' }}>{coinMint}</p>
|
<p style={{ color: 'rgba(255,255,255,0.5)' }}>{coinMint.toBase58()}</p>
|
||||||
<div>
|
<div>
|
||||||
<p style={{ color: 'white' }}>Deposit address:</p>
|
<p style={{ color: 'white' }}>Deposit address:</p>
|
||||||
<p style={{ color: 'rgba(255,255,255,0.5)' }}>
|
<p style={{ color: 'rgba(255,255,255,0.5)' }}>
|
||||||
|
|
|
@ -2,11 +2,11 @@ import {
|
||||||
Market,
|
Market,
|
||||||
Orderbook,
|
Orderbook,
|
||||||
decodeEventQueue,
|
decodeEventQueue,
|
||||||
DEX_PROGRAM_ID,
|
|
||||||
TokenInstructions,
|
TokenInstructions,
|
||||||
|
MARKETS,
|
||||||
|
TOKEN_MINTS,
|
||||||
} from '@project-serum/serum';
|
} from '@project-serum/serum';
|
||||||
import React, { useContext, useEffect, useState } from 'react';
|
import React, { useContext, useEffect, useState } from 'react';
|
||||||
import { PublicKey } from '@solana/web3.js';
|
|
||||||
import { useLocalStorageState } from './utils';
|
import { useLocalStorageState } from './utils';
|
||||||
import { useAsyncData } from './fetch-loop';
|
import { useAsyncData } from './fetch-loop';
|
||||||
import { useAccountData, useAccountInfo, useConnection } from './connection';
|
import { useAccountData, useAccountInfo, useConnection } from './connection';
|
||||||
|
@ -15,120 +15,8 @@ import tuple from 'immutable-tuple';
|
||||||
import { notify } from './notifications';
|
import { notify } from './notifications';
|
||||||
import { BN } from 'bn.js';
|
import { BN } from 'bn.js';
|
||||||
|
|
||||||
const DEFAULT_MARKET_NAME = 'SRM/USDT';
|
|
||||||
|
|
||||||
export const COIN_MINTS = {
|
|
||||||
'9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E': 'BTC',
|
|
||||||
'2FPyTwcZLUg1MDrwsyoP4D6s1tM7hAkHYRjkNb5w6Pxk': 'ETH',
|
|
||||||
AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3: 'FTT',
|
|
||||||
'3JSf5tPeuscJGtaCp5giEiDhv51gQ4v3zWg8DGgyLfAB': 'YFI',
|
|
||||||
CWE8jPTUYhdCTZYWPTe1o5DFqfdjzWKc9WKz6rSjQUdG: 'LINK',
|
|
||||||
Ga2AXHpfAF6mv2ekZwcsJFqu7wB4NV331qNH7fW9Nst8: 'XRP',
|
|
||||||
BQcdHdAQW1hczDbBi9hiegXAR7A98Q9jx3X3iBBBDiq4: 'USDT',
|
|
||||||
BXXkv6z8ykpG1yuvUDPgh732wzVHB69RnB9YgSYh3itW: 'USDC',
|
|
||||||
MSRMcoVyrFxnSgo5uXwone5SKcGhT1KEJMFEkMEWf9L: 'MSRM',
|
|
||||||
SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt: 'SRM',
|
|
||||||
AR1Mtgh7zAtxuxGd2XPovXPVjcSdY3i4rQYisNadjfKy: 'SUSHI',
|
|
||||||
SF3oTvfWzEP3DTwGSvUXRrGTvr75pdZNnBLAH9bzMuX: 'SXP',
|
|
||||||
CsZ5LZkDS7h9TDKjrbL7VAwQZ9nsRu8vJLhRYfmGaN8K: 'ALEPH',
|
|
||||||
[TokenInstructions.WRAPPED_SOL_MINT]: 'SOL',
|
|
||||||
};
|
|
||||||
|
|
||||||
export const MARKET_INFO_BY_NAME = {
|
|
||||||
'ALEPH/USDT': {
|
|
||||||
address: 'EmCzMQfXMgNHcnRoFwAdPe1i2SuiSzMj1mx6wu3KN2uA',
|
|
||||||
name: 'ALEPH/USDT',
|
|
||||||
},
|
|
||||||
'ALEPH/USDC': {
|
|
||||||
address: 'B37pZmwrwXHjpgvd9hHDAx1yeDsNevTnbbrN9W12BoGK',
|
|
||||||
name: 'ALEPH/USDC',
|
|
||||||
},
|
|
||||||
'BTC/USDT': {
|
|
||||||
address: '8AcVjMG2LTbpkjNoyq8RwysokqZunkjy3d5JDzxC6BJa',
|
|
||||||
name: 'BTC/USDT',
|
|
||||||
},
|
|
||||||
'BTC/USDC': {
|
|
||||||
address: 'CAgAeMD7quTdnr6RPa7JySQpjf3irAmefYNdTb6anemq',
|
|
||||||
name: 'BTC/USDC',
|
|
||||||
},
|
|
||||||
'ETH/USDT': {
|
|
||||||
address: 'HfCZdJ1wfsWKfYP2qyWdXTT5PWAGWFctzFjLH48U1Hsd',
|
|
||||||
name: 'ETH/USDT',
|
|
||||||
},
|
|
||||||
'ETH/USDC': {
|
|
||||||
address: 'ASKiV944nKg1W9vsf7hf3fTsjawK6DwLwrnB2LH9n61c',
|
|
||||||
name: 'ETH/USDC',
|
|
||||||
},
|
|
||||||
'SOL/USDT': {
|
|
||||||
address: '8mDuvJJSgoodovMRYArtVVYBbixWYdGzR47GPrRT65YJ',
|
|
||||||
name: 'SOL/USDT',
|
|
||||||
programId: 'BJ3jrUzddfuSrZHXSCxMUUQsjKEyLmuuyZebkcaFp2fg',
|
|
||||||
},
|
|
||||||
'SOL/USDC': {
|
|
||||||
address: 'Cdp72gDcYMCLLk3aDkPxjeiirKoFqK38ECm8Ywvk94Wi',
|
|
||||||
name: 'SOL/USDC',
|
|
||||||
programId: 'BJ3jrUzddfuSrZHXSCxMUUQsjKEyLmuuyZebkcaFp2fg',
|
|
||||||
},
|
|
||||||
'SRM/USDT': {
|
|
||||||
address: 'HARFLhSq8nECZk4DVFKvzqXMNMA9a3hjvridGMFizeLa',
|
|
||||||
name: 'SRM/USDT',
|
|
||||||
},
|
|
||||||
'SRM/USDC': {
|
|
||||||
address: '68J6nkWToik6oM9rTatKSR5ibVSykAtzftBUEAvpRsys',
|
|
||||||
name: 'SRM/USDC',
|
|
||||||
},
|
|
||||||
'SUSHI/USDT': {
|
|
||||||
address: 'DzFjazak6EKHnaB2w6qSsArnj28CV1TKd2Smcj9fqtHW',
|
|
||||||
name: 'SUSHI/USDT',
|
|
||||||
},
|
|
||||||
'SUSHI/USDC': {
|
|
||||||
address: '9wDmxsfwaDb2ysmZpBLzxKzoWrF1zHzBN7PV5EmJe19R',
|
|
||||||
name: 'SUSHI/USDC',
|
|
||||||
},
|
|
||||||
'SXP/USDT': {
|
|
||||||
address: 'GuvWMATdEV6DExWnXncPYEzn4ePWYkvGdC8pu8gsn7m7',
|
|
||||||
name: 'SXP/USDT',
|
|
||||||
},
|
|
||||||
'SXP/USDC': {
|
|
||||||
address: 'GbQSffne1NcJbS4jsewZEpRGYVR4RNnuVUN8Ht6vAGb6',
|
|
||||||
name: 'SXP/USDC',
|
|
||||||
},
|
|
||||||
'MSRM/USDT': {
|
|
||||||
address: 'H4snTKK9adiU15gP22ErfZYtro3aqR9BTMXiH3AwiUTQ',
|
|
||||||
name: 'MSRM/USDT',
|
|
||||||
},
|
|
||||||
'MSRM/USDC': {
|
|
||||||
address: '7kgkDyW7dmyMeP8KFXzbcUZz1R2WHsovDZ7n3ihZuNDS',
|
|
||||||
name: 'MSRM/USDC',
|
|
||||||
},
|
|
||||||
'FTT/USDT': {
|
|
||||||
address: 'DHDdghmkBhEpReno3tbzBPtsxCt6P3KrMzZvxavTktJt',
|
|
||||||
name: 'FTT/USDT',
|
|
||||||
},
|
|
||||||
'FTT/USDC': {
|
|
||||||
address: 'FZqrBXz7ADGsmDf1TM9YgysPUfvtG8rJiNUrqDpHc9Au',
|
|
||||||
name: 'FTT/USDC',
|
|
||||||
},
|
|
||||||
'YFI/USDT': {
|
|
||||||
address: '5zu5bTZZvqESAAgFsr12CUMxdQvMrvU9CgvC1GW8vJdf',
|
|
||||||
name: 'YFI/USDT',
|
|
||||||
},
|
|
||||||
'YFI/USDC': {
|
|
||||||
address: 'FJg9FUtbN3fg3YFbMCFiZKjGh5Bn4gtzxZmtxFzmz9kT',
|
|
||||||
name: 'YFI/USDC',
|
|
||||||
},
|
|
||||||
'LINK/USDT': {
|
|
||||||
address: 'F5xschQBMpu1gD2q1babYEAVJHR1buj1YazLiXyQNqSW',
|
|
||||||
name: 'LINK/USDT',
|
|
||||||
},
|
|
||||||
'LINK/USDC': {
|
|
||||||
address: '7GZ59DMgJ7D6dfoJTpszPayTRyua9jwcaGJXaRMMF1my',
|
|
||||||
name: 'LINK/USDC',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export function useMarketsList() {
|
export function useMarketsList() {
|
||||||
return Object.values(MARKET_INFO_BY_NAME);
|
return MARKETS;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useAllMarkets() {
|
export function useAllMarkets() {
|
||||||
|
@ -138,17 +26,14 @@ export function useAllMarkets() {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const getAllMarkets = async () => {
|
const getAllMarkets = async () => {
|
||||||
const markets = [];
|
const markets = [];
|
||||||
const marketList = Object.values(MARKET_INFO_BY_NAME);
|
|
||||||
let marketInfo;
|
let marketInfo;
|
||||||
for (marketInfo of marketList) {
|
for (marketInfo of MARKETS) {
|
||||||
try {
|
try {
|
||||||
const market = await Market.load(
|
const market = await Market.load(
|
||||||
connection,
|
connection,
|
||||||
new PublicKey(marketInfo.address),
|
marketInfo.address,
|
||||||
{},
|
{},
|
||||||
marketInfo.programId
|
marketInfo.programId,
|
||||||
? new PublicKey(marketInfo.programId)
|
|
||||||
: DEX_PROGRAM_ID,
|
|
||||||
);
|
);
|
||||||
markets.push({ market, marketName: marketInfo.name });
|
markets.push({ market, marketName: marketInfo.name });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -179,11 +64,11 @@ const _FAST_REFRESH_INTERVAL = 1000;
|
||||||
export function MarketProvider({ children }) {
|
export function MarketProvider({ children }) {
|
||||||
const [marketName, setMarketName] = useLocalStorageState(
|
const [marketName, setMarketName] = useLocalStorageState(
|
||||||
'market',
|
'market',
|
||||||
DEFAULT_MARKET_NAME,
|
'SRM/USDT',
|
||||||
);
|
);
|
||||||
|
|
||||||
const connection = useConnection();
|
const connection = useConnection();
|
||||||
const marketInfo = MARKET_INFO_BY_NAME[marketName];
|
const marketInfo = MARKETS.find((market) => market.name === marketName);
|
||||||
const [market, setMarket] = useState();
|
const [market, setMarket] = useState();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setMarket(null);
|
setMarket(null);
|
||||||
|
@ -195,14 +80,7 @@ export function MarketProvider({ children }) {
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Market.load(
|
Market.load(connection, marketInfo.address, {}, marketInfo.programId)
|
||||||
connection,
|
|
||||||
new PublicKey(marketInfo.address),
|
|
||||||
{},
|
|
||||||
marketInfo.programId
|
|
||||||
? new PublicKey(marketInfo.programId)
|
|
||||||
: DEX_PROGRAM_ID,
|
|
||||||
)
|
|
||||||
.then(setMarket)
|
.then(setMarket)
|
||||||
.catch((e) =>
|
.catch((e) =>
|
||||||
notify({
|
notify({
|
||||||
|
@ -214,9 +92,15 @@ export function MarketProvider({ children }) {
|
||||||
}, [connection, marketName, marketInfo]);
|
}, [connection, marketName, marketInfo]);
|
||||||
|
|
||||||
const baseCurrency =
|
const baseCurrency =
|
||||||
COIN_MINTS[market?.baseMintAddress?.toBase58()] || 'UNKNOWN';
|
(market?.baseMintAddress &&
|
||||||
|
TOKEN_MINTS.find((token) => token.address.equals(market.baseMintAddress))
|
||||||
|
?.name) ||
|
||||||
|
'UNKNOWN';
|
||||||
const quoteCurrency =
|
const quoteCurrency =
|
||||||
COIN_MINTS[market?.quoteMintAddress?.toBase58()] || 'UNKNOWN';
|
(market?.quoteMintAddress &&
|
||||||
|
TOKEN_MINTS.find((token) => token.address.equals(market.quoteMintAddress))
|
||||||
|
?.name) ||
|
||||||
|
'UNKNOWN';
|
||||||
return (
|
return (
|
||||||
<MarketContext.Provider
|
<MarketContext.Provider
|
||||||
value={{
|
value={{
|
||||||
|
|
|
@ -1467,10 +1467,10 @@
|
||||||
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
|
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
|
||||||
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
|
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
|
||||||
|
|
||||||
"@project-serum/serum@^0.11.2":
|
"@project-serum/serum@^0.12.0":
|
||||||
version "0.11.2"
|
version "0.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.11.2.tgz#4d25412d40d9dc8dcc41f72f5b51f4e735fdbdad"
|
resolved "https://registry.yarnpkg.com/@project-serum/serum/-/serum-0.12.0.tgz#27110e4c28a4cdb44a8539f442bbf9c926f27dbe"
|
||||||
integrity sha512-iQFzAqPMvTFbReh/xvUxb4iqeTJmlCRZVY/lac8r5KEXUWRTxGh/DNaGafyuQw30YUZH374kRSR8oWU3BNp0bw==
|
integrity sha512-QaHZsdhmxfVXMJpCApbFD3gg80sknr/t5LXhmCxdZePf21LLtGl2wug4DYgSMOV73JULiEzU6FpH9qSRAIYtiA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@solana/web3.js" "^0.71.10"
|
"@solana/web3.js" "^0.71.10"
|
||||||
bn.js "^5.1.2"
|
bn.js "^5.1.2"
|
||||||
|
|
Loading…
Reference in New Issue