diff --git a/packages/plugins/Debugger/src/SiteAdaptor/components/HubDialog.tsx b/packages/plugins/Debugger/src/SiteAdaptor/components/HubDialog.tsx index aefd54d932d1..95ef1ac359c9 100644 --- a/packages/plugins/Debugger/src/SiteAdaptor/components/HubDialog.tsx +++ b/packages/plugins/Debugger/src/SiteAdaptor/components/HubDialog.tsx @@ -1,8 +1,6 @@ import { DialogContent } from '@mui/material' import { InjectedDialog } from '@masknet/shared' import { useRemoteControlledDialog } from '@masknet/shared-base-ui' -import { ChainId } from '@masknet/web3-shared-evm' -import { EVMWeb3ContextProvider } from '@masknet/web3-hooks-base' import { HubContent } from './HubContent.js' import { PluginDebuggerMessages } from '../../messages.js' @@ -11,9 +9,7 @@ export function HubDialog() { return ( - - - + ) diff --git a/packages/web3-providers/src/Web3/Solana/apis/FungibleTokenAPI.ts b/packages/web3-providers/src/Web3/Solana/apis/FungibleTokenAPI.ts index 3f4066ad3c35..062ca5ff7abf 100644 --- a/packages/web3-providers/src/Web3/Solana/apis/FungibleTokenAPI.ts +++ b/packages/web3-providers/src/Web3/Solana/apis/FungibleTokenAPI.ts @@ -19,7 +19,7 @@ import { } from '@masknet/web3-shared-solana' import { SolanaChainResolver } from './ResolverAPI.js' import * as CoinGeckoPriceSolana from /* webpackDefer: true */ '../../../CoinGecko/index.js' -import { RAYDIUM_TOKEN_LIST, SPL_TOKEN_PROGRAM_ID } from '../constants/index.js' +import { JUP_TOKEN_LIST, RAYDIUM_TOKEN_LIST, SPL_TOKEN_PROGRAM_ID } from '../constants/index.js' import { createFungibleAsset, createFungibleToken, requestRPC } from '../helpers/index.js' import type { GetBalanceResponse, @@ -27,6 +27,7 @@ import type { RaydiumTokenList, MaskToken, SolanaHubOptions, + JupToken, } from '../types/index.js' import { fetchJSON } from '../../../helpers/fetchJSON.js' import type { FungibleTokenAPI, TokenListAPI } from '../../../entry-types.js' @@ -35,23 +36,45 @@ const fetchRaydiumTokenList = memoizePromise( memoize, async (url: string): Promise>> => { const tokenList = await fetchJSON(url, { cache: 'force-cache' }) - const tokens: Array> = [...tokenList.official, ...tokenList.unOfficial].map( - (token) => { - if (isSameAddress(token.mint, '11111111111111111111111111111111')) - return SolanaChainResolver.nativeCurrency(ChainId.Mainnet) - return { - id: token.mint, - chainId: ChainId.Mainnet, - type: TokenType.Fungible, - schema: SchemaType.Fungible, - address: token.mint, - name: token.name, - symbol: token.symbol, - decimals: token.decimals, - logoURL: token.icon, - } - }, - ) + const tokens: Array> = tokenList.data.mintList.map((token) => { + if (isSameAddress(token.address, '11111111111111111111111111111111')) + return SolanaChainResolver.nativeCurrency(ChainId.Mainnet) + return { + id: token.address, + chainId: ChainId.Mainnet, + type: TokenType.Fungible, + schema: SchemaType.Fungible, + address: token.address, + name: token.name, + symbol: token.symbol, + decimals: token.decimals, + logoURL: token.logoURI, + } + }) + return tokens + }, + (url) => url, +) + +const fetchJupTokenList = memoizePromise( + memoize, + async (url: string): Promise>> => { + const tokenList = await fetchJSON(url, { cache: 'force-cache' }) + const tokens: Array> = tokenList.map((token) => { + if (isSameAddress(token.address, '11111111111111111111111111111111')) + return SolanaChainResolver.nativeCurrency(ChainId.Mainnet) + return { + id: token.address, + chainId: ChainId.Mainnet, + type: TokenType.Fungible, + schema: SchemaType.Fungible, + address: token.address, + name: token.name, + symbol: token.symbol, + decimals: token.decimals, + logoURL: token.logoURI, + } + }) return tokens }, (url) => url, @@ -169,8 +192,10 @@ class SolanaFungibleTokenAPI const { FUNGIBLE_TOKEN_LISTS = EMPTY_LIST } = getTokenListConstants(chainId) const maskTokenList = await fetchMaskTokenList(FUNGIBLE_TOKEN_LISTS[0]) const raydiumTokenList = await fetchRaydiumTokenList(RAYDIUM_TOKEN_LIST) - - return uniqBy([...maskTokenList, ...raydiumTokenList], (x) => x.address).filter((x) => x.name && x.symbol) + const jupTokenList = await fetchJupTokenList(JUP_TOKEN_LIST) + return uniqBy([...maskTokenList, ...raydiumTokenList, ...jupTokenList], (x) => x.address).filter( + (x) => x.name && x.symbol, + ) } async getNonFungibleTokenList( diff --git a/packages/web3-providers/src/Web3/Solana/constants/index.ts b/packages/web3-providers/src/Web3/Solana/constants/index.ts index a3db5c08bed3..3cdb7446f502 100644 --- a/packages/web3-providers/src/Web3/Solana/constants/index.ts +++ b/packages/web3-providers/src/Web3/Solana/constants/index.ts @@ -1,4 +1,5 @@ import { TOKEN_PROGRAM_ID } from '@solana/spl-token' -export const RAYDIUM_TOKEN_LIST = 'https://api.raydium.io/v2/sdk/token/raydium.mainnet.json' +export const RAYDIUM_TOKEN_LIST = 'https://api-v3.raydium.io/mint/list' export const SPL_TOKEN_PROGRAM_ID = TOKEN_PROGRAM_ID.toBase58() +export const JUP_TOKEN_LIST = 'https://tokens.jup.ag/tokens?tags=lst,community' diff --git a/packages/web3-providers/src/Web3/Solana/types/index.ts b/packages/web3-providers/src/Web3/Solana/types/index.ts index 1675971563c4..1483480582e4 100644 --- a/packages/web3-providers/src/Web3/Solana/types/index.ts +++ b/packages/web3-providers/src/Web3/Solana/types/index.ts @@ -55,16 +55,32 @@ interface SplToken { icon: string } -export interface RaydiumTokenList { +interface RaydiumToken { + address: string + chainId: number + decimals: number + logoURI: string name: string - timestamp: string - version: { - major: number - minor: number - patch: number + programId: string + symbol: string +} + +export interface JupToken { + address: string + created_at: string + dayliy_volume: number + decimals: number + logoURI: string + name: string + symbol: string +} + +export interface RaydiumTokenList { + data: { + mintList: RaydiumToken[] } - official: SplToken[] - unOfficial: SplToken[] + id: string + success: boolean } export interface MaskToken {