diff --git a/app/address/[address]/attributes/page-client.tsx b/app/address/[address]/attributes/page-client.tsx index a161dd1d..3e4ecbc3 100644 --- a/app/address/[address]/attributes/page-client.tsx +++ b/app/address/[address]/attributes/page-client.tsx @@ -2,6 +2,7 @@ import { MetaplexNFTAttributesCard } from '@components/account/MetaplexNFTAttributesCard'; import { ParsedAccountRenderer } from '@components/account/ParsedAccountRenderer'; +import { isTokenProgramData } from '@providers/accounts'; import React from 'react'; type Props = Readonly<{ @@ -15,7 +16,7 @@ function MetaplexNFTAttributesCardRenderer({ onNotFound, }: React.ComponentProps['renderComponent']>) { const parsedData = account?.data?.parsed; - if (!parsedData || parsedData.program !== 'spl-token' || parsedData.parsed.type !== 'mint' || !parsedData.nftData) { + if (!parsedData || !isTokenProgramData(parsedData) || parsedData.parsed.type !== 'mint' || !parsedData.nftData) { return onNotFound(); } return ; diff --git a/app/address/[address]/layout.tsx b/app/address/[address]/layout.tsx index 41ef791e..d6b1030a 100644 --- a/app/address/[address]/layout.tsx +++ b/app/address/[address]/layout.tsx @@ -22,6 +22,7 @@ import { LoadingCard } from '@components/common/LoadingCard'; import { Account, AccountsProvider, + isTokenProgramData, TokenProgramData, useAccountInfo, useFetchAccountInfo, @@ -76,6 +77,30 @@ const TABS_LOOKUP: { [id: string]: Tab[] } = { title: 'Concurrent Merkle Tree', }, ], + 'spl-token-2022:mint': [ + { + path: 'transfers', + slug: 'transfers', + title: 'Transfers', + }, + { + path: 'instructions', + slug: 'instructions', + title: 'Instructions', + }, + ], + 'spl-token-2022:mint:metaplexNFT': [ + { + path: 'metadata', + slug: 'metadata', + title: 'Metadata', + }, + { + path: 'attributes', + slug: 'attributes', + title: 'Attributes', + }, + ], 'spl-token:mint': [ { path: 'transfers', @@ -142,7 +167,7 @@ const TABS_LOOKUP: { [id: string]: Tab[] } = { ], }; -const TOKEN_TABS_HIDDEN = ['spl-token:mint', 'config', 'vote', 'sysvar', 'config']; +const TOKEN_TABS_HIDDEN = ['spl-token:mint', 'spl-token-2022:mint', 'config', 'vote', 'sysvar', 'config']; type Props = PropsWithChildren<{ params: { address: string } }>; @@ -164,10 +189,10 @@ function AddressLayoutInner({ children, params: { address } }: Props) { } const infoStatus = info?.status; - const infoProgram = info?.data?.data.parsed?.program; + const infoParsed = info?.data?.data.parsed; const { data: fullTokenInfo, isLoading: isFullTokenInfoLoading } = useSWRImmutable( - infoStatus === FetchStatus.Fetched && infoProgram === "spl-token" && pubkey ? ['get-full-token-info', address, cluster, url] : null, + infoStatus === FetchStatus.Fetched && infoParsed && isTokenProgramData(infoParsed) && pubkey ? ['get-full-token-info', address, cluster, url] : null, fetchFullTokenInfo ); @@ -208,7 +233,7 @@ function AccountHeader({ address, account, tokenInfo, isTokenInfoLoading }: { ad const mintInfo = useMintAccountInfo(address); const parsedData = account?.data.parsed; - const isToken = parsedData?.program === 'spl-token' && parsedData?.parsed.type === 'mint'; + const isToken = parsedData && isTokenProgramData(parsedData) && parsedData?.parsed.type === 'mint'; if (isMetaplexNFT(parsedData, mintInfo) && parsedData.nftData) { return ; @@ -346,7 +371,7 @@ function InfoSection({ account, tokenInfo }: { account: Account, tokenInfo?: Ful ); } else if (account.owner.toBase58() === NFTOKEN_ADDRESS) { return ; - } else if (parsedData && parsedData.program === 'spl-token') { + } else if (parsedData && isTokenProgramData(parsedData)) { return ; } else if (parsedData && parsedData.program === 'nonce') { return ; @@ -447,7 +472,7 @@ function getTabs(pubkey: PublicKey, account: Account): TabComponent[] { } // Add the key for Metaplex NFTs - if (parsedData && programTypeKey === 'spl-token:mint' && (parsedData as TokenProgramData).nftData) { + if (parsedData && (programTypeKey === 'spl-token:mint' || programTypeKey == 'spl-token-2022:mint') && (parsedData as TokenProgramData).nftData) { tabs.push(...TABS_LOOKUP[`${programTypeKey}:metaplexNFT`]); } diff --git a/app/address/[address]/metadata/page-client.tsx b/app/address/[address]/metadata/page-client.tsx index 23b797f0..ba2f1fae 100644 --- a/app/address/[address]/metadata/page-client.tsx +++ b/app/address/[address]/metadata/page-client.tsx @@ -2,6 +2,7 @@ import { MetaplexMetadataCard } from '@components/account/MetaplexMetadataCard'; import { ParsedAccountRenderer } from '@components/account/ParsedAccountRenderer'; +import { isTokenProgramData } from '@providers/accounts'; import React from 'react'; type Props = Readonly<{ @@ -15,7 +16,7 @@ function MetaplexMetadataCardRenderer({ onNotFound, }: React.ComponentProps['renderComponent']>) { const parsedData = account?.data?.parsed; - if (!parsedData || parsedData.program !== 'spl-token' || parsedData.parsed.type !== 'mint' || !parsedData.nftData) { + if (!parsedData || !isTokenProgramData(parsedData) || parsedData.parsed.type !== 'mint' || !parsedData.nftData) { return onNotFound(); } return ; diff --git a/app/components/account/TokenAccountSection.tsx b/app/components/account/TokenAccountSection.tsx index ecacd4b4..a27b0315 100644 --- a/app/components/account/TokenAccountSection.tsx +++ b/app/components/account/TokenAccountSection.tsx @@ -3,6 +3,7 @@ import { Copyable } from '@components/common/Copyable'; import { LoadingCard } from '@components/common/LoadingCard'; import { TableCardBody } from '@components/common/TableCardBody'; import { Account, NFTData, TokenProgramData, useFetchAccountInfo } from '@providers/accounts'; +import { TOKEN_2022_PROGRAM_ID } from '@providers/accounts/tokens'; import isMetaplexNFT from '@providers/accounts/utils/isMetaplexNFT'; import { useCluster } from '@providers/cluster'; import { PublicKey } from '@solana/web3.js'; @@ -151,7 +152,7 @@ function FungibleTokenMintAccountCard({ account, mintInfo, tokenInfo }: { accoun

- {tokenInfo ? 'Overview' : 'Token Mint'} + {tokenInfo ? 'Overview' : account.owner.toBase58() === TOKEN_2022_PROGRAM_ID.toBase58() ? 'Token-2022 Mint' : 'Token Mint'}