From 4ddacdfa15fe28ce30a3f3dcc5b79d6aeadbe517 Mon Sep 17 00:00:00 2001 From: Lantt Date: Tue, 10 Aug 2021 15:15:42 +0800 Subject: [PATCH 1/5] feat: update zerion get asset api --- .../src/plugins/Wallet/apis/zerion.ts | 4 +- .../src/plugins/Wallet/pipes/index.ts | 15 +++ .../src/plugins/Wallet/services/assets.ts | 111 ++++++++++-------- .../src/plugins/Wallet/types/zerion.ts | 31 ++++- .../src/UI/components/TokenIcon/index.tsx | 2 +- packages/web3-shared/src/context/type.ts | 2 +- .../src/hooks/useAssetsFromProvider.ts | 14 +-- 7 files changed, 114 insertions(+), 65 deletions(-) diff --git a/packages/maskbook/src/plugins/Wallet/apis/zerion.ts b/packages/maskbook/src/plugins/Wallet/apis/zerion.ts index 17c44f4a37eb..c2763f70b019 100644 --- a/packages/maskbook/src/plugins/Wallet/apis/zerion.ts +++ b/packages/maskbook/src/plugins/Wallet/apis/zerion.ts @@ -63,9 +63,9 @@ export async function getTransactionList(address: string, scope: string, page?: })) as ZerionTransactionResponseBody } -export async function getAssetsList(address: string, scope: string) { +export async function getAssetsList(address: string, scope: string[]) { return (await subscribeFromZerion(addressSocket, { - scope: [scope], + scope: scope, payload: { address, currency: 'usd', diff --git a/packages/maskbook/src/plugins/Wallet/pipes/index.ts b/packages/maskbook/src/plugins/Wallet/pipes/index.ts index e0809ab761f2..3c7d3a14fbbf 100644 --- a/packages/maskbook/src/plugins/Wallet/pipes/index.ts +++ b/packages/maskbook/src/plugins/Wallet/pipes/index.ts @@ -1,5 +1,6 @@ import { safeUnreachable, unreachable } from '@dimensiondev/kit' import { NetworkType, PortfolioProvider } from '@masknet/web3-shared' +import type { SocketRequestAssetScope } from '../types' export function resolvePortfolioDataProviderName(provider: PortfolioProvider) { switch (provider) { @@ -44,6 +45,20 @@ export function resolveZerionAssetsScopeName(network: NetworkType) { } } +export function resolveChainByScope(scope: SocketRequestAssetScope) { + switch (scope) { + case 'assets': + return 'eth' + case 'bsc-assets': + return 'bsc' + case 'polygon-assets': + return 'matic' + default: + safeUnreachable(scope) + return '' + } +} + export function resolveZerionTransactionsScopeName(network: NetworkType) { switch (network) { case NetworkType.Ethereum: diff --git a/packages/maskbook/src/plugins/Wallet/services/assets.ts b/packages/maskbook/src/plugins/Wallet/services/assets.ts index e58485ec65d5..d95d917b7694 100644 --- a/packages/maskbook/src/plugins/Wallet/services/assets.ts +++ b/packages/maskbook/src/plugins/Wallet/services/assets.ts @@ -2,6 +2,7 @@ import { unreachable } from '@dimensiondev/kit' import { Asset, ChainId, + CollectibleProvider, createERC1155Token, createERC20Token, createERC721Token, @@ -12,10 +13,8 @@ import { getChainIdFromName, getTokenConstants, isChainIdMainnet, - NetworkType, - pow10, - CollectibleProvider, PortfolioProvider, + pow10, } from '@masknet/web3-shared' import BigNumber from 'bignumber.js' import { values } from 'lodash-es' @@ -23,8 +22,16 @@ import { EthereumAddress } from 'wallet.ts' import * as DebankAPI from '../apis/debank' import * as OpenSeaAPI from '../apis/opensea' import * as ZerionAPI from '../apis/zerion' -import { resolveZerionAssetsScopeName } from '../pipes' -import type { BalanceRecord, ZerionAddressAsset } from '../types' +import { resolveChainByScope } from '../pipes' +import type { + BalanceRecord, + SocketRequestAssetScope, + ZerionAddressAsset, + ZerionAddressBSCAsset, + ZerionAddressPolygonAsset, + ZerionAsset, + ZerionCovalentAsset, +} from '../types' export async function getAssetsListNFT( address: string, @@ -81,22 +88,28 @@ export async function getAssetsListNFT( } } -export async function getAssetsList( - address: string, - network: NetworkType, - provider: PortfolioProvider, -): Promise { +export async function getAssetsList(address: string, provider: PortfolioProvider): Promise { if (!EthereumAddress.isValid(address)) return [] switch (provider) { case PortfolioProvider.ZERION: - if (network !== NetworkType.Ethereum) return [] - const scope = resolveZerionAssetsScopeName(network) - if (!scope) return [] - const { meta, payload } = await ZerionAPI.getAssetsList(address, scope) + const { meta, payload } = await ZerionAPI.getAssetsList(address, ['assets', 'bsc-assets', 'polygon-assets']) if (meta.status !== 'ok') throw new Error('Fail to load assets.') - // skip NFT assets - const assetsList = values(payload.assets).filter((x) => x.asset.is_displayable && x.asset.icon_url) - return formatAssetsFromZerion(assetsList) + + const assets = Object.entries(payload).map(([key, value]) => { + if (key === 'assets') { + const assetsList = (values(value) as ZerionAddressAsset[]).filter( + ({ asset }) => + asset.is_displayable && + !filterAssetType.some((type) => type === asset.type) && + asset.icon_url, + ) + return formatAssetsFromZerion(assetsList, key) + } + + return formatAssetsFromZerion(values(value) as ZerionAddressBSCAsset[], key as SocketRequestAssetScope) + }) + + return assets.flat() case PortfolioProvider.DEBANK: const { data = [], error_code } = await DebankAPI.getAssetsList(address) if (error_code === 0) return formatAssetsFromDebank(data) @@ -135,35 +148,37 @@ function formatAssetsFromDebank(data: BalanceRecord[]) { const filterAssetType = ['compound', 'trash', 'uniswap', 'uniswap-v2', 'nft'] -function formatAssetsFromZerion(data: ZerionAddressAsset[]) { - return data - .filter(({ asset }) => asset.is_displayable && !filterAssetType.some((type) => type === asset.type)) - .map(({ asset, quantity }) => { - const balance = Number(new BigNumber(quantity).dividedBy(pow10(asset.decimals)).toString()) - return { - token: { - name: asset.name, - symbol: asset.symbol, - decimals: asset.decimals, - address: - asset.name === 'Ether' || asset.name === 'Ethereum' - ? getTokenConstants().NATIVE_TOKEN_ADDRESS - : asset.asset_code, - chainId: ChainId.Mainnet, - type: - asset.name === 'Ether' || asset.name === 'Ethereum' - ? EthereumTokenType.Native - : EthereumTokenType.ERC20, - }, - chain: 'eth', - balance: quantity, - price: { - usd: new BigNumber(asset.price?.value ?? 0).toString(), - }, - value: { - usd: new BigNumber(balance).multipliedBy(asset.price?.value ?? 0).toString(), - }, - logoURI: asset.icon_url, - } - }) as Asset[] +function formatAssetsFromZerion( + data: ZerionAddressAsset[] | ZerionAddressBSCAsset[] | ZerionAddressPolygonAsset[], + scope: SocketRequestAssetScope, +) { + return data.map(({ asset, quantity }) => { + const balance = Number(new BigNumber(quantity).dividedBy(pow10(asset.decimals)).toString()) + const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 + return { + token: { + name: asset.name, + symbol: asset.symbol, + decimals: asset.decimals, + address: + asset.name === 'Ether' || asset.name === 'Ethereum' + ? getTokenConstants().NATIVE_TOKEN_ADDRESS + : asset.asset_code, + chainId: ChainId.Mainnet, + type: + asset.name === 'Ether' || asset.name === 'Ethereum' + ? EthereumTokenType.Native + : EthereumTokenType.ERC20, + }, + chain: resolveChainByScope(scope), + balance: quantity, + price: { + usd: new BigNumber(value).toString(), + }, + value: { + usd: new BigNumber(balance).multipliedBy(value).toString(), + }, + logoURI: asset.icon_url, + } + }) as Asset[] } diff --git a/packages/maskbook/src/plugins/Wallet/types/zerion.ts b/packages/maskbook/src/plugins/Wallet/types/zerion.ts index 042e895105dc..02769f625371 100644 --- a/packages/maskbook/src/plugins/Wallet/types/zerion.ts +++ b/packages/maskbook/src/plugins/Wallet/types/zerion.ts @@ -3,6 +3,8 @@ export type SocketNameSpace = { socket: SocketIOClient.Socket } +export type SocketRequestAssetScope = 'assets' | 'bsc-assets' | 'polygon-assets' + export type SocketRequestBody = { scope: string[] payload: Record @@ -60,11 +62,30 @@ export interface ZerionAsset { price?: ZerionPrice } +export interface ZerionCovalentAsset { + asset_code: string + name: string + symbol: string + decimals: number + icon_url?: string + value: number +} + export interface ZerionAddressAsset { asset: ZerionAsset quantity: string } +export interface ZerionAddressBSCAsset { + asset: ZerionCovalentAsset + quantity: string +} + +export interface ZerionAddressPolygonAsset { + asset: ZerionCovalentAsset + quantity: string +} + export interface ZerionTransactionChange { asset: ZerionAsset value: number @@ -112,6 +133,12 @@ export interface ZerionTransactionResponseBody extends SocketResponseBody { } } +type ZerionAssetResponseBodyPayload = { + assets: Record + 'bsc-assets': Record + 'polygon-assets': Record +} + export interface ZerionAssetResponseBody extends SocketResponseBody { meta: { address: string @@ -120,7 +147,5 @@ export interface ZerionAssetResponseBody extends SocketResponseBody { currency: string status: string } - payload: { - assets: Record - } + payload: Partial } diff --git a/packages/shared/src/UI/components/TokenIcon/index.tsx b/packages/shared/src/UI/components/TokenIcon/index.tsx index 1fd798848af3..7cd8d0bb0f21 100644 --- a/packages/shared/src/UI/components/TokenIcon/index.tsx +++ b/packages/shared/src/UI/components/TokenIcon/index.tsx @@ -56,7 +56,7 @@ export function TokenIcon(props: TokenIconProps) { _logoURI = nativeToken?.nativeCurrency.logoURI } - const { TOKEN_ASSET_BASE_URI } = useTokenAssetBaseURLConstants(chainId) + const { TOKEN_ASSET_BASE_URI } = useTokenAssetBaseURLConstants(chainId ?? _chainId) const fallbackLogos = getFallbackIcons(address, TOKEN_ASSET_BASE_URI ?? []) const tokenBlockie = useBlockie(address) diff --git a/packages/web3-shared/src/context/type.ts b/packages/web3-shared/src/context/type.ts index 664b830b0c9e..d238be793c86 100644 --- a/packages/web3-shared/src/context/type.ts +++ b/packages/web3-shared/src/context/type.ts @@ -31,7 +31,7 @@ export interface Web3ProviderType { erc20Tokens: Subscription getERC20TokensPaged: (index: number, count: number, query?: string) => Promise portfolioProvider: Subscription - getAssetList: (address: string, network: NetworkType, provider: PortfolioProvider) => Promise + getAssetList: (address: string, provider: PortfolioProvider) => Promise getAssetsListNFT: ( address: string, chainId: ChainId, diff --git a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts index a0009446c097..a0b7c20b70b0 100644 --- a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts +++ b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts @@ -1,21 +1,15 @@ -import { useAccount } from './useAccount' -import { useChainDetailed } from './useChainDetailed' import { useWeb3Context, useWeb3State } from '../context' import { useAsyncRetry } from 'react-use' -import { useNetworkType } from './useNetworkType' -import { getNetworkTypeFromChainId } from '../utils' +import { useAccount } from './useAccount' export function useAssetsFromProvider() { const { getAssetList } = useWeb3Context() const { portfolioProvider } = useWeb3State() const account = useAccount() - const network = useNetworkType() - const chainDetailed = useChainDetailed() return useAsyncRetry(async () => { if (!account) return [] - if (chainDetailed?.network !== 'mainnet') return [] - if (getNetworkTypeFromChainId(chainDetailed.chainId) !== network) return [] - return getAssetList(account.toLowerCase(), network, portfolioProvider) - }, [account, network, portfolioProvider, chainDetailed]) + + return getAssetList(account.toLowerCase(), portfolioProvider) + }, [account, portfolioProvider]) } From fee48b3bc484be3fcaef11061348378a839ae5ba Mon Sep 17 00:00:00 2001 From: Lantt Date: Thu, 12 Aug 2021 13:14:24 +0800 Subject: [PATCH 2/5] feat: get zerion asset by chain id --- .../src/plugins/Wallet/apis/zerion.ts | 4 ++-- .../src/plugins/Wallet/pipes/index.ts | 2 +- .../src/plugins/Wallet/services/assets.ts | 24 +++++++++++++------ .../src/plugins/Wallet/types/zerion.ts | 11 +++------ packages/web3-shared/src/context/type.ts | 2 +- .../src/hooks/useAssetsFromProvider.ts | 11 +++++++-- 6 files changed, 33 insertions(+), 21 deletions(-) diff --git a/packages/maskbook/src/plugins/Wallet/apis/zerion.ts b/packages/maskbook/src/plugins/Wallet/apis/zerion.ts index c2763f70b019..17c44f4a37eb 100644 --- a/packages/maskbook/src/plugins/Wallet/apis/zerion.ts +++ b/packages/maskbook/src/plugins/Wallet/apis/zerion.ts @@ -63,9 +63,9 @@ export async function getTransactionList(address: string, scope: string, page?: })) as ZerionTransactionResponseBody } -export async function getAssetsList(address: string, scope: string[]) { +export async function getAssetsList(address: string, scope: string) { return (await subscribeFromZerion(addressSocket, { - scope: scope, + scope: [scope], payload: { address, currency: 'usd', diff --git a/packages/maskbook/src/plugins/Wallet/pipes/index.ts b/packages/maskbook/src/plugins/Wallet/pipes/index.ts index 3c7d3a14fbbf..64665d014e1c 100644 --- a/packages/maskbook/src/plugins/Wallet/pipes/index.ts +++ b/packages/maskbook/src/plugins/Wallet/pipes/index.ts @@ -55,7 +55,7 @@ export function resolveChainByScope(scope: SocketRequestAssetScope) { return 'matic' default: safeUnreachable(scope) - return '' + return 'Unknown' } } diff --git a/packages/maskbook/src/plugins/Wallet/services/assets.ts b/packages/maskbook/src/plugins/Wallet/services/assets.ts index d95d917b7694..2bce4f7d6de5 100644 --- a/packages/maskbook/src/plugins/Wallet/services/assets.ts +++ b/packages/maskbook/src/plugins/Wallet/services/assets.ts @@ -13,6 +13,7 @@ import { getChainIdFromName, getTokenConstants, isChainIdMainnet, + NetworkType, PortfolioProvider, pow10, } from '@masknet/web3-shared' @@ -22,13 +23,12 @@ import { EthereumAddress } from 'wallet.ts' import * as DebankAPI from '../apis/debank' import * as OpenSeaAPI from '../apis/opensea' import * as ZerionAPI from '../apis/zerion' -import { resolveChainByScope } from '../pipes' +import { resolveChainByScope, resolveZerionAssetsScopeName } from '../pipes' import type { BalanceRecord, SocketRequestAssetScope, ZerionAddressAsset, - ZerionAddressBSCAsset, - ZerionAddressPolygonAsset, + ZerionAddressCovalentAsset, ZerionAsset, ZerionCovalentAsset, } from '../types' @@ -88,11 +88,17 @@ export async function getAssetsListNFT( } } -export async function getAssetsList(address: string, provider: PortfolioProvider): Promise { +export async function getAssetsList( + address: string, + network: NetworkType, + provider: PortfolioProvider, +): Promise { if (!EthereumAddress.isValid(address)) return [] switch (provider) { case PortfolioProvider.ZERION: - const { meta, payload } = await ZerionAPI.getAssetsList(address, ['assets', 'bsc-assets', 'polygon-assets']) + const scope = resolveZerionAssetsScopeName(network) + + const { meta, payload } = await ZerionAPI.getAssetsList(address, scope) if (meta.status !== 'ok') throw new Error('Fail to load assets.') const assets = Object.entries(payload).map(([key, value]) => { @@ -106,7 +112,10 @@ export async function getAssetsList(address: string, provider: PortfolioProvider return formatAssetsFromZerion(assetsList, key) } - return formatAssetsFromZerion(values(value) as ZerionAddressBSCAsset[], key as SocketRequestAssetScope) + return formatAssetsFromZerion( + values(value) as ZerionAddressCovalentAsset[], + key as SocketRequestAssetScope, + ) }) return assets.flat() @@ -149,7 +158,7 @@ function formatAssetsFromDebank(data: BalanceRecord[]) { const filterAssetType = ['compound', 'trash', 'uniswap', 'uniswap-v2', 'nft'] function formatAssetsFromZerion( - data: ZerionAddressAsset[] | ZerionAddressBSCAsset[] | ZerionAddressPolygonAsset[], + data: ZerionAddressAsset[] | ZerionAddressCovalentAsset[], scope: SocketRequestAssetScope, ) { return data.map(({ asset, quantity }) => { @@ -169,6 +178,7 @@ function formatAssetsFromZerion( asset.name === 'Ether' || asset.name === 'Ethereum' ? EthereumTokenType.Native : EthereumTokenType.ERC20, + logoURI: asset.icon_url, }, chain: resolveChainByScope(scope), balance: quantity, diff --git a/packages/maskbook/src/plugins/Wallet/types/zerion.ts b/packages/maskbook/src/plugins/Wallet/types/zerion.ts index 02769f625371..d39248b20e6e 100644 --- a/packages/maskbook/src/plugins/Wallet/types/zerion.ts +++ b/packages/maskbook/src/plugins/Wallet/types/zerion.ts @@ -76,12 +76,7 @@ export interface ZerionAddressAsset { quantity: string } -export interface ZerionAddressBSCAsset { - asset: ZerionCovalentAsset - quantity: string -} - -export interface ZerionAddressPolygonAsset { +export interface ZerionAddressCovalentAsset { asset: ZerionCovalentAsset quantity: string } @@ -135,8 +130,8 @@ export interface ZerionTransactionResponseBody extends SocketResponseBody { type ZerionAssetResponseBodyPayload = { assets: Record - 'bsc-assets': Record - 'polygon-assets': Record + 'bsc-assets': Record + 'polygon-assets': Record } export interface ZerionAssetResponseBody extends SocketResponseBody { diff --git a/packages/web3-shared/src/context/type.ts b/packages/web3-shared/src/context/type.ts index d238be793c86..664b830b0c9e 100644 --- a/packages/web3-shared/src/context/type.ts +++ b/packages/web3-shared/src/context/type.ts @@ -31,7 +31,7 @@ export interface Web3ProviderType { erc20Tokens: Subscription getERC20TokensPaged: (index: number, count: number, query?: string) => Promise portfolioProvider: Subscription - getAssetList: (address: string, provider: PortfolioProvider) => Promise + getAssetList: (address: string, network: NetworkType, provider: PortfolioProvider) => Promise getAssetsListNFT: ( address: string, chainId: ChainId, diff --git a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts index a0b7c20b70b0..daf1af1510ba 100644 --- a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts +++ b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts @@ -1,15 +1,22 @@ import { useWeb3Context, useWeb3State } from '../context' import { useAsyncRetry } from 'react-use' import { useAccount } from './useAccount' +import { useChainDetailed } from './useChainDetailed' +import { useNetworkType } from './useNetworkType' +import { getNetworkTypeFromChainId } from '../utils' export function useAssetsFromProvider() { const { getAssetList } = useWeb3Context() const { portfolioProvider } = useWeb3State() const account = useAccount() + const network = useNetworkType() + const chainDetailed = useChainDetailed() return useAsyncRetry(async () => { if (!account) return [] + if (!chainDetailed) return [] + if (getNetworkTypeFromChainId(chainDetailed.chainId) !== network) return [] - return getAssetList(account.toLowerCase(), portfolioProvider) - }, [account, portfolioProvider]) + return getAssetList(account.toLowerCase(), network, portfolioProvider) + }, [account, portfolioProvider, network, chainDetailed]) } From 8ac74df43d98fe792fd414456fa93d5573c0253b Mon Sep 17 00:00:00 2001 From: Lantt Date: Thu, 12 Aug 2021 13:46:52 +0800 Subject: [PATCH 3/5] feat: should handle native token when format zerion asset --- .../maskbook/src/plugins/Wallet/services/assets.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/maskbook/src/plugins/Wallet/services/assets.ts b/packages/maskbook/src/plugins/Wallet/services/assets.ts index 2bce4f7d6de5..75a8ff582f07 100644 --- a/packages/maskbook/src/plugins/Wallet/services/assets.ts +++ b/packages/maskbook/src/plugins/Wallet/services/assets.ts @@ -164,20 +164,16 @@ function formatAssetsFromZerion( return data.map(({ asset, quantity }) => { const balance = Number(new BigNumber(quantity).dividedBy(pow10(asset.decimals)).toString()) const value = (asset as ZerionAsset).price?.value ?? (asset as ZerionCovalentAsset).value ?? 0 + const isNativeToken = (symbol: string) => ['ETH', 'BNB', 'MATIC'].includes(symbol) + return { token: { name: asset.name, symbol: asset.symbol, decimals: asset.decimals, - address: - asset.name === 'Ether' || asset.name === 'Ethereum' - ? getTokenConstants().NATIVE_TOKEN_ADDRESS - : asset.asset_code, + address: isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code, chainId: ChainId.Mainnet, - type: - asset.name === 'Ether' || asset.name === 'Ethereum' - ? EthereumTokenType.Native - : EthereumTokenType.ERC20, + type: isNativeToken(asset.symbol) ? EthereumTokenType.Native : EthereumTokenType.ERC20, logoURI: asset.icon_url, }, chain: resolveChainByScope(scope), From 88584ae1d5f2fc73dcfbc44971ada0bb9534e63a Mon Sep 17 00:00:00 2001 From: Lantt Date: Thu, 12 Aug 2021 17:28:36 +0800 Subject: [PATCH 4/5] fix: should return empty list when is not mainnet --- packages/web3-shared/src/hooks/useAssetsFromProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts index daf1af1510ba..76dfc9f9ddac 100644 --- a/packages/web3-shared/src/hooks/useAssetsFromProvider.ts +++ b/packages/web3-shared/src/hooks/useAssetsFromProvider.ts @@ -14,7 +14,7 @@ export function useAssetsFromProvider() { return useAsyncRetry(async () => { if (!account) return [] - if (!chainDetailed) return [] + if (chainDetailed?.network !== 'mainnet') return [] if (getNetworkTypeFromChainId(chainDetailed.chainId) !== network) return [] return getAssetList(account.toLowerCase(), network, portfolioProvider) From b0dc33217be34065bfad976dbaf266595578906e Mon Sep 17 00:00:00 2001 From: Lantt Date: Thu, 12 Aug 2021 17:29:22 +0800 Subject: [PATCH 5/5] fix: and convert chain id right in asset from zerion --- .../src/plugins/Wallet/pipes/index.ts | 41 ++++++++++++------- .../src/plugins/Wallet/services/assets.ts | 4 +- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/packages/maskbook/src/plugins/Wallet/pipes/index.ts b/packages/maskbook/src/plugins/Wallet/pipes/index.ts index 64665d014e1c..9e46e8c444bc 100644 --- a/packages/maskbook/src/plugins/Wallet/pipes/index.ts +++ b/packages/maskbook/src/plugins/Wallet/pipes/index.ts @@ -1,5 +1,5 @@ import { safeUnreachable, unreachable } from '@dimensiondev/kit' -import { NetworkType, PortfolioProvider } from '@masknet/web3-shared' +import { ChainId, NetworkType, PortfolioProvider } from '@masknet/web3-shared' import type { SocketRequestAssetScope } from '../types' export function resolvePortfolioDataProviderName(provider: PortfolioProvider) { @@ -45,20 +45,6 @@ export function resolveZerionAssetsScopeName(network: NetworkType) { } } -export function resolveChainByScope(scope: SocketRequestAssetScope) { - switch (scope) { - case 'assets': - return 'eth' - case 'bsc-assets': - return 'bsc' - case 'polygon-assets': - return 'matic' - default: - safeUnreachable(scope) - return 'Unknown' - } -} - export function resolveZerionTransactionsScopeName(network: NetworkType) { switch (network) { case NetworkType.Ethereum: @@ -74,3 +60,28 @@ export function resolveZerionTransactionsScopeName(network: NetworkType) { return '' } } + +export function resolveChainByScope(scope: SocketRequestAssetScope) { + switch (scope) { + case 'assets': + return { + chain: 'eth', + chainId: ChainId.Mainnet, + } + case 'bsc-assets': + return { + chain: 'bsc', + chainId: ChainId.BSC, + } + case 'polygon-assets': + return { + chain: 'matic', + chainId: ChainId.Matic, + } + default: + safeUnreachable(scope) + return { + chain: 'unknown', + } + } +} diff --git a/packages/maskbook/src/plugins/Wallet/services/assets.ts b/packages/maskbook/src/plugins/Wallet/services/assets.ts index 75a8ff582f07..f14cca52048c 100644 --- a/packages/maskbook/src/plugins/Wallet/services/assets.ts +++ b/packages/maskbook/src/plugins/Wallet/services/assets.ts @@ -172,11 +172,11 @@ function formatAssetsFromZerion( symbol: asset.symbol, decimals: asset.decimals, address: isNativeToken(asset.symbol) ? getTokenConstants().NATIVE_TOKEN_ADDRESS : asset.asset_code, - chainId: ChainId.Mainnet, + chainId: resolveChainByScope(scope).chainId, type: isNativeToken(asset.symbol) ? EthereumTokenType.Native : EthereumTokenType.ERC20, logoURI: asset.icon_url, }, - chain: resolveChainByScope(scope), + chain: resolveChainByScope(scope).chain, balance: quantity, price: { usd: new BigNumber(value).toString(),