[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:
parent
96e5342292
commit
9ff561134d
|
@ -1,4 +1,9 @@
|
||||||
import { Account, NFTData, useFetchAccountInfo } from "providers/accounts";
|
import {
|
||||||
|
Account,
|
||||||
|
NFTData,
|
||||||
|
TokenProgramData,
|
||||||
|
useFetchAccountInfo,
|
||||||
|
} from "providers/accounts";
|
||||||
import {
|
import {
|
||||||
TokenAccount,
|
TokenAccount,
|
||||||
MintAccountInfo,
|
MintAccountInfo,
|
||||||
|
@ -20,6 +25,7 @@ import { CoingeckoStatus, useCoinGecko } from "utils/coingecko";
|
||||||
import { displayTimestampWithoutDate } from "utils/date";
|
import { displayTimestampWithoutDate } from "utils/date";
|
||||||
import { LoadingCard } from "components/common/LoadingCard";
|
import { LoadingCard } from "components/common/LoadingCard";
|
||||||
import { PublicKey } from "@solana/web3.js";
|
import { PublicKey } from "@solana/web3.js";
|
||||||
|
import isMetaplexNFT from "providers/accounts/utils/isMetaplexNFT";
|
||||||
|
|
||||||
const getEthAddress = (link?: string) => {
|
const getEthAddress = (link?: string) => {
|
||||||
let address = "";
|
let address = "";
|
||||||
|
@ -48,14 +54,11 @@ export function TokenAccountSection({
|
||||||
case "mint": {
|
case "mint": {
|
||||||
const info = create(tokenAccount.info, MintAccountInfo);
|
const info = create(tokenAccount.info, MintAccountInfo);
|
||||||
|
|
||||||
if (
|
if (isMetaplexNFT(account.details?.data, info.decimals)) {
|
||||||
account.details?.data?.program === "spl-token" &&
|
|
||||||
account.details.data.nftData
|
|
||||||
) {
|
|
||||||
return (
|
return (
|
||||||
<NonFungibleTokenMintAccountCard
|
<NonFungibleTokenMintAccountCard
|
||||||
account={account}
|
account={account}
|
||||||
nftData={account.details.data.nftData}
|
nftData={(account.details!.data as TokenProgramData).nftData!}
|
||||||
mintInfo={info}
|
mintInfo={info}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,6 +7,7 @@ import {
|
||||||
Account,
|
Account,
|
||||||
ProgramData,
|
ProgramData,
|
||||||
TokenProgramData,
|
TokenProgramData,
|
||||||
|
useMintAccountInfo,
|
||||||
} from "providers/accounts";
|
} from "providers/accounts";
|
||||||
import { StakeAccountSection } from "components/account/StakeAccountSection";
|
import { StakeAccountSection } from "components/account/StakeAccountSection";
|
||||||
import { TokenAccountSection } from "components/account/TokenAccountSection";
|
import { TokenAccountSection } from "components/account/TokenAccountSection";
|
||||||
|
@ -38,6 +39,7 @@ import { RewardsCard } from "components/account/RewardsCard";
|
||||||
import { MetaplexMetadataCard } from "components/account/MetaplexMetadataCard";
|
import { MetaplexMetadataCard } from "components/account/MetaplexMetadataCard";
|
||||||
import { NFTHeader } from "components/account/MetaplexNFTHeader";
|
import { NFTHeader } from "components/account/MetaplexNFTHeader";
|
||||||
import { DomainsCard } from "components/account/DomainsCard";
|
import { DomainsCard } from "components/account/DomainsCard";
|
||||||
|
import isMetaplexNFT from "providers/accounts/utils/isMetaplexNFT";
|
||||||
|
|
||||||
const IDENTICON_WIDTH = 64;
|
const IDENTICON_WIDTH = 64;
|
||||||
|
|
||||||
|
@ -159,13 +161,18 @@ export function AccountHeader({
|
||||||
}) {
|
}) {
|
||||||
const { tokenRegistry } = useTokenRegistry();
|
const { tokenRegistry } = useTokenRegistry();
|
||||||
const tokenDetails = tokenRegistry.get(address);
|
const tokenDetails = tokenRegistry.get(address);
|
||||||
|
const mintInfo = useMintAccountInfo(address);
|
||||||
const account = info?.data;
|
const account = info?.data;
|
||||||
const data = account?.details?.data;
|
const data = account?.details?.data;
|
||||||
const isToken = data?.program === "spl-token" && data?.parsed.type === "mint";
|
const isToken = data?.program === "spl-token" && data?.parsed.type === "mint";
|
||||||
const isNFT = isToken && data.nftData;
|
|
||||||
|
|
||||||
if (isNFT) {
|
if (isMetaplexNFT(data, mintInfo?.decimals)) {
|
||||||
return <NFTHeader nftData={data.nftData!} address={address} />;
|
return (
|
||||||
|
<NFTHeader
|
||||||
|
nftData={(data as TokenProgramData).nftData!}
|
||||||
|
address={address}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tokenDetails || isToken) {
|
if (tokenDetails || isToken) {
|
||||||
|
|
|
@ -251,10 +251,6 @@ async function fetchAccountInfo(
|
||||||
connection
|
connection
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!editionInfo.masterEdition && !editionInfo.edition) {
|
|
||||||
throw new Error("No edition found");
|
|
||||||
}
|
|
||||||
|
|
||||||
nftData = { metadata: metadata.data, editionInfo };
|
nftData = { metadata: metadata.data, editionInfo };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in New Issue