From da4c11e3d01b99e0f8b3631573436f3472d5f315 Mon Sep 17 00:00:00 2001 From: Lantt Date: Tue, 14 Jun 2022 01:48:53 +0800 Subject: [PATCH 1/2] fix: add collectible owner check --- .../Wallets/components/AddCollectibleDialog/index.tsx | 7 ++----- packages/plugins/EVM/src/state/Connection/connection.ts | 4 +++- packages/plugins/EVM/src/state/Hub/hub.ts | 2 +- packages/web3-providers/src/opensea/index.ts | 1 + 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx b/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx index f06233eb138d..de17fa633637 100644 --- a/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx +++ b/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx @@ -61,13 +61,10 @@ export const AddCollectibleDialog = memo(({ open, onC const tokenAsset = await hub?.getNonFungibleAsset(address ?? '', tokenId) const token = await connection?.getNonFungibleToken(address ?? '', tokenId, SchemaType.ERC721) const tokenDetailed = { ...token, ...tokenAsset } + const isOwner = await connection?.getNonFungibleTokenOwnership(address, account, tokenId) // If the NonFungible token is belong this account - if ( - (tokenDetailed && !isSameAddress(tokenDetailed?.contract?.owner, account)) || - !tokenDetailed || - !tokenDetailed.contract?.owner - ) { + if (!isOwner) { throw new Error(FormErrorType.NotExist) } else { await Token?.addToken?.(tokenDetailed) diff --git a/packages/plugins/EVM/src/state/Connection/connection.ts b/packages/plugins/EVM/src/state/Connection/connection.ts index ae5b72b012a6..cc0dd19ec140 100644 --- a/packages/plugins/EVM/src/state/Connection/connection.ts +++ b/packages/plugins/EVM/src/state/Connection/connection.ts @@ -301,7 +301,9 @@ class Connection implements EVM_Connection { if (actualSchema !== SchemaType.ERC1155) { const contract = await this.getERC721Contract(address, options) - ownerId = await contract?.methods.ownerOf(tokenId).call() + try { + ownerId = await contract?.methods.ownerOf(tokenId).call() + } catch {} } return createNonFungibleToken( diff --git a/packages/plugins/EVM/src/state/Hub/hub.ts b/packages/plugins/EVM/src/state/Hub/hub.ts index 0f47378015a1..9fd4a6219b44 100644 --- a/packages/plugins/EVM/src/state/Hub/hub.ts +++ b/packages/plugins/EVM/src/state/Hub/hub.ts @@ -147,7 +147,7 @@ class Hub implements EVM_Hub { account: string, options?: HubOptions | undefined, ): Promise>> { - return OpenSea.getCollections(account, options) + return OpenSea.getCollections(account, { ...options, chainId: options?.chainId ?? this.chainId }) } getFungibleTokenPrice( chainId: ChainId, diff --git a/packages/web3-providers/src/opensea/index.ts b/packages/web3-providers/src/opensea/index.ts index 6b7efffef852..b59961621531 100644 --- a/packages/web3-providers/src/opensea/index.ts +++ b/packages/web3-providers/src/opensea/index.ts @@ -391,6 +391,7 @@ export class OpenSeaAPI implements NonFungibleTokenAPI.Provider = {}, ) { + if (chainId !== ChainId.Mainnet) return createPageable([], createIndicator(indicator)) const response = await fetchFromOpenSea( urlcat('/api/v1/collections', { asset_owner: address, From 16dd617f6967b1df7b3507e014080b5cea0a6250 Mon Sep 17 00:00:00 2001 From: Lantt Date: Tue, 14 Jun 2022 15:56:02 +0800 Subject: [PATCH 2/2] fix: dashboard add nft with chain id and send nft from nft list --- .../components/AddCollectibleDialog/index.tsx | 27 +++++--- .../pages/Wallets/components/Assets/index.tsx | 6 +- .../components/CollectibleList/index.tsx | 9 +-- .../components/Transfer/TransferERC721.tsx | 66 +++++++++++-------- .../Wallets/components/Transfer/index.tsx | 4 +- 5 files changed, 63 insertions(+), 49 deletions(-) diff --git a/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx b/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx index de17fa633637..d8b6c537e829 100644 --- a/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx +++ b/packages/dashboard/src/pages/Wallets/components/AddCollectibleDialog/index.tsx @@ -9,17 +9,18 @@ import { Controller, useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { useWeb3Connection, - useChainId, useNonFungibleTokenContract, useAccount, useWeb3State, useTrustedNonFungibleTokens, useCurrentWeb3NetworkPluginID, useWeb3Hub, + Web3Helper, } from '@masknet/plugin-infra/web3' -import { SchemaType } from '@masknet/web3-shared-evm' +import type { ChainId } from '@masknet/web3-shared-evm' export interface AddCollectibleDialogProps { + selectedNetwork: Web3Helper.NetworkDescriptorAll open: boolean onClose: () => void } @@ -34,22 +35,24 @@ enum FormErrorType { NotExist = 'NOT_EXIST', } -export const AddCollectibleDialog = memo(({ open, onClose }) => { +export const AddCollectibleDialog = memo(({ open, onClose, selectedNetwork }) => { const currentNetworkPluginID = useCurrentWeb3NetworkPluginID() const account = useAccount(NetworkPluginID.PLUGIN_EVM) const { Token } = useWeb3State<'all'>() const trustedNonFungibleTokens = useTrustedNonFungibleTokens(currentNetworkPluginID) const hub = useWeb3Hub() const connection = useWeb3Connection(NetworkPluginID.PLUGIN_EVM) - const chainId = useChainId(NetworkPluginID.PLUGIN_EVM) const [address, setAddress] = useState('') const [tokenId, setTokenId] = useState('') - const { value, loading } = useNonFungibleTokenContract(NetworkPluginID.PLUGIN_EVM, address) + const { value: contract, loading } = useNonFungibleTokenContract(NetworkPluginID.PLUGIN_EVM, address, undefined, { + chainId: selectedNetwork.chainId as ChainId, + }) const onSubmit = useCallback(async () => { - if (loading || !account || !value || !hub?.getNonFungibleAsset) return + if (loading || !account || !hub?.getNonFungibleAsset) return + if (address && tokenId && !contract) throw new Error(FormErrorType.NotExist) // If the NonFungible token is added const tokenInDB = trustedNonFungibleTokens.find( @@ -58,10 +61,14 @@ export const AddCollectibleDialog = memo(({ open, onC ) if (tokenInDB) throw new Error(FormErrorType.Added) - const tokenAsset = await hub?.getNonFungibleAsset(address ?? '', tokenId) - const token = await connection?.getNonFungibleToken(address ?? '', tokenId, SchemaType.ERC721) + const tokenAsset = await hub?.getNonFungibleAsset(address ?? '', tokenId, { chainId: selectedNetwork.chainId }) + const token = await connection?.getNonFungibleToken(address ?? '', tokenId, undefined, { + chainId: selectedNetwork.chainId as ChainId, + }) const tokenDetailed = { ...token, ...tokenAsset } - const isOwner = await connection?.getNonFungibleTokenOwnership(address, account, tokenId) + const isOwner = await connection?.getNonFungibleTokenOwnership(address, account, tokenId, undefined, { + chainId: selectedNetwork.chainId as ChainId, + }) // If the NonFungible token is belong this account if (!isOwner) { @@ -74,7 +81,7 @@ export const AddCollectibleDialog = memo(({ open, onC account, address, tokenId, - value, + contract, loading, hub?.getNonFungibleAsset, connection?.getNonFungibleToken, diff --git a/packages/dashboard/src/pages/Wallets/components/Assets/index.tsx b/packages/dashboard/src/pages/Wallets/components/Assets/index.tsx index cb4828a3ca50..5e8ec2a59171 100644 --- a/packages/dashboard/src/pages/Wallets/components/Assets/index.tsx +++ b/packages/dashboard/src/pages/Wallets/components/Assets/index.tsx @@ -75,7 +75,7 @@ export const Assets = memo(({ network }) => { ))} - {pluginId === NetworkPluginID.PLUGIN_EVM && ( + {pluginId === NetworkPluginID.PLUGIN_EVM && (currentTab === AssetTab.Token ? true : !!network) && (