[Explorer] Reverted a change to require that Metaplex NFTs have a `MasterEdition` and added a decimal check (#21132)

* Fixed an issue where NFTs without an Editon were not shown as NFTs

* Added a central isMetaplexNFT helper and added the correct logic to TokenAccountSection

Co-authored-by: Will Roeder <roederw@titan.lan>
This commit is contained in:
Will Roeder 2021-11-01 21:30:26 -07:00 committed by GitHub
parent 96e5342292
commit 9ff561134d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 13 deletions

View File

@ -1,4 +1,9 @@
import { Account, NFTData, useFetchAccountInfo } from "providers/accounts";
import {
Account,
NFTData,
TokenProgramData,
useFetchAccountInfo,
} from "providers/accounts";
import {
TokenAccount,
MintAccountInfo,
@ -20,6 +25,7 @@ import { CoingeckoStatus, useCoinGecko } from "utils/coingecko";
import { displayTimestampWithoutDate } from "utils/date";
import { LoadingCard } from "components/common/LoadingCard";
import { PublicKey } from "@solana/web3.js";
import isMetaplexNFT from "providers/accounts/utils/isMetaplexNFT";
const getEthAddress = (link?: string) => {
let address = "";
@ -48,14 +54,11 @@ export function TokenAccountSection({
case "mint": {
const info = create(tokenAccount.info, MintAccountInfo);
if (
account.details?.data?.program === "spl-token" &&
account.details.data.nftData
) {
if (isMetaplexNFT(account.details?.data, info.decimals)) {
return (
<NonFungibleTokenMintAccountCard
account={account}
nftData={account.details.data.nftData}
nftData={(account.details!.data as TokenProgramData).nftData!}
mintInfo={info}
/>
);

View File

@ -7,6 +7,7 @@ import {
Account,
ProgramData,
TokenProgramData,
useMintAccountInfo,
} from "providers/accounts";
import { StakeAccountSection } from "components/account/StakeAccountSection";
import { TokenAccountSection } from "components/account/TokenAccountSection";
@ -38,6 +39,7 @@ import { RewardsCard } from "components/account/RewardsCard";
import { MetaplexMetadataCard } from "components/account/MetaplexMetadataCard";
import { NFTHeader } from "components/account/MetaplexNFTHeader";
import { DomainsCard } from "components/account/DomainsCard";
import isMetaplexNFT from "providers/accounts/utils/isMetaplexNFT";
const IDENTICON_WIDTH = 64;
@ -159,13 +161,18 @@ export function AccountHeader({
}) {
const { tokenRegistry } = useTokenRegistry();
const tokenDetails = tokenRegistry.get(address);
const mintInfo = useMintAccountInfo(address);
const account = info?.data;
const data = account?.details?.data;
const isToken = data?.program === "spl-token" && data?.parsed.type === "mint";
const isNFT = isToken && data.nftData;
if (isNFT) {
return <NFTHeader nftData={data.nftData!} address={address} />;
if (isMetaplexNFT(data, mintInfo?.decimals)) {
return (
<NFTHeader
nftData={(data as TokenProgramData).nftData!}
address={address}
/>
);
}
if (tokenDetails || isToken) {

View File

@ -251,10 +251,6 @@ async function fetchAccountInfo(
connection
);
if (!editionInfo.masterEdition && !editionInfo.edition) {
throw new Error("No edition found");
}
nftData = { metadata: metadata.data, editionInfo };
}
}

View File

@ -0,0 +1,10 @@
import { ProgramData } from "..";
export default function isMetaplexNFT(data?: ProgramData, decimals?: number) {
return (
data?.program === "spl-token" &&
data?.parsed.type === "mint" &&
data?.nftData &&
decimals === 0
);
}