Skip to content

Commit

Permalink
Use TOKEN_2022_PROGRAM_ID with TOKEN_PROGRAM_ID
Browse files Browse the repository at this point in the history
  • Loading branch information
joncinque committed Dec 12, 2023
1 parent a2befef commit 4893272
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 16 deletions.
4 changes: 2 additions & 2 deletions app/components/account/TokenHistoryCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
import { isTokenSwapInstruction, parseTokenSwapInstructionTitle } from '@components/instruction/token-swap/types';
import { isTokenProgramData } from '@providers/accounts';
import { useAccountHistories, useFetchAccountHistory } from '@providers/accounts/history';
import { TOKEN_PROGRAM_ID, TokenInfoWithPubkey, useAccountOwnedTokens } from '@providers/accounts/tokens';
import { isTokenProgramId, TokenInfoWithPubkey, useAccountOwnedTokens } from '@providers/accounts/tokens';
import { CacheEntry, FetchStatus } from '@providers/cache';
import { useCluster } from '@providers/cluster';
import { Details, useFetchTransactionDetails, useTransactionDetailsCache } from '@providers/transactions/parsed';
Expand Down Expand Up @@ -426,7 +426,7 @@ const TokenTransactionRow = React.memo(function TokenTransactionRow({
return undefined;
}
} else {
if (ix.accounts.findIndex(account => account.equals(TOKEN_PROGRAM_ID)) >= 0) {
if (ix.accounts.findIndex(account => isTokenProgramId(account)) >= 0) {
name = 'Unknown (Inner)';
} else {
return undefined;
Expand Down
27 changes: 17 additions & 10 deletions app/components/inspector/SimulatorCard.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ProgramLogsCardBody } from '@components/ProgramLogsCardBody';
import { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@providers/accounts/tokens';
import { useCluster } from '@providers/cluster';
import { AccountLayout, MintLayout, TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { AccountLayout, MintLayout } from "@solana/spl-token";
import { AccountInfo, AddressLookupTableAccount, Connection, MessageAddressTableLookup, ParsedAccountData, ParsedMessageAccount, SimulatedTransactionAccountInfo, TokenBalance, VersionedMessage, VersionedTransaction } from '@solana/web3.js';
import { PublicKey } from '@solana/web3.js';
import { InstructionLogs, parseProgramLogs } from '@utils/program-logs';
Expand Down Expand Up @@ -140,9 +141,9 @@ function useSimulator(message: VersionedMessage) {
const accountOwnerPost = resp.value.accounts?.at(index)?.owner;

if (
(parsedAccountPre?.owner.toBase58() == TOKEN_PROGRAM_ID.toBase58() ||
parsedAccountPre?.owner.toBase58() == "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb") &&
(parsedAccountPre?.data as ParsedAccountData).parsed.type === 'account'
parsedAccountPre &&
isTokenProgramBase58(parsedAccountPre.owner.toBase58()) &&
(parsedAccountPre.data as ParsedAccountData).parsed.type === 'account'
) {
const mint = (parsedAccountPre?.data as ParsedAccountData).parsed.info.mint;
const owner = (parsedAccountPre?.data as ParsedAccountData).parsed.info.owner;
Expand All @@ -157,8 +158,8 @@ function useSimulator(message: VersionedMessage) {
}

if (
(accountOwnerPost === TOKEN_PROGRAM_ID.toBase58() ||
accountOwnerPost === "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb") &&
accountOwnerPost &&
isTokenProgramBase58(accountOwnerPost) &&
Buffer.from(accountDataPost!, 'base64').length >= 165
) {
const accountParsedPost = AccountLayout.decode(Buffer.from(accountDataPost!, 'base64'));
Expand Down Expand Up @@ -235,6 +236,10 @@ function useSimulator(message: VersionedMessage) {
};
}

function isTokenProgramBase58(programIdBase58: string): boolean {
return programIdBase58 === TOKEN_PROGRAM_ID.toBase58() || programIdBase58 === TOKEN_2022_PROGRAM_ID.toBase58();
}

function getMintDecimals(
accountKeys: PublicKey[],
parsedAccountsPre: (AccountInfo<ParsedAccountData | Buffer> | null)[],
Expand All @@ -249,16 +254,18 @@ function getMintDecimals(

// Token account before
if (
parsedAccount?.owner.toBase58() == TOKEN_PROGRAM_ID.toBase58() &&
(parsedAccount?.data as ParsedAccountData).parsed.type === 'account'
parsedAccount &&
isTokenProgramBase58(parsedAccount.owner.toBase58()) &&
(parsedAccount.data as ParsedAccountData).parsed.type === 'account'
) {
mintToDecimals[(parsedAccount?.data as ParsedAccountData).parsed.info.mint] = (
parsedAccount?.data as ParsedAccountData
).parsed.info.tokenAmount.decimals;
}
// Mint account before
if (
parsedAccount?.owner.toBase58() == TOKEN_PROGRAM_ID.toBase58() &&
parsedAccount &&
isTokenProgramBase58(parsedAccount.owner.toBase58()) &&
(parsedAccount?.data as ParsedAccountData).parsed.type === 'mint'
) {
mintToDecimals[key.toBase58()] = (parsedAccount?.data as ParsedAccountData).parsed.info.decimals;
Expand All @@ -267,7 +274,7 @@ function getMintDecimals(
// Token account after
const accountDataPost = accountDatasPost.at(index)?.data[0];
const accountOwnerPost = accountDatasPost.at(index)?.owner;
if (accountOwnerPost === TOKEN_PROGRAM_ID.toBase58() && Buffer.from(accountDataPost!, 'base64').length === 82) {
if (accountOwnerPost && isTokenProgramBase58(accountOwnerPost) && Buffer.from(accountDataPost!, 'base64').length === 82) {
const accountParsedPost = MintLayout.decode(Buffer.from(accountDataPost!, 'base64'));
mintToDecimals[key.toBase58()] = accountParsedPost.decimals;
}
Expand Down
11 changes: 9 additions & 2 deletions app/providers/accounts/tokens.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ export function TokensProvider({ children }: ProviderProps) {
}

export const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA');
export const TOKEN_2022_PROGRAM_ID = new PublicKey('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb');
export function isTokenProgramId(programId: PublicKey) {
return programId.equals(TOKEN_PROGRAM_ID) || programId.equals(TOKEN_2022_PROGRAM_ID);
}

async function fetchAccountTokens(dispatch: Dispatch, pubkey: PublicKey, cluster: Cluster, url: string) {
const key = pubkey.toBase58();
Expand All @@ -59,11 +63,14 @@ async function fetchAccountTokens(dispatch: Dispatch, pubkey: PublicKey, cluster
let status;
let data;
try {
const { value } = await new Connection(url, 'processed').getParsedTokenAccountsByOwner(pubkey, {
const { value: tokenAccounts } = await new Connection(url, 'processed').getParsedTokenAccountsByOwner(pubkey, {
programId: TOKEN_PROGRAM_ID,
});
const { value: token2022Accounts } = await new Connection(url, 'processed').getParsedTokenAccountsByOwner(pubkey, {
programId: TOKEN_2022_PROGRAM_ID,
});

const tokens: TokenInfoWithPubkey[] = value.slice(0, 101).map(accountInfo => {
const tokens: TokenInfoWithPubkey[] = tokenAccounts.concat(token2022Accounts).slice(0, 101).map(accountInfo => {
const parsedInfo = accountInfo.account.data.parsed.info;
const info = create(parsedInfo, TokenAccountInfo);
return { info, pubkey: accountInfo.pubkey };
Expand Down
4 changes: 2 additions & 2 deletions app/utils/instruction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
parseTokenLendingInstructionTitle,
} from '@components/instruction/token-lending/types';
import { isTokenSwapInstruction, parseTokenSwapInstructionTitle } from '@components/instruction/token-swap/types';
import { TOKEN_PROGRAM_ID } from '@providers/accounts/tokens';
import { isTokenProgramId } from '@providers/accounts/tokens';
import {
ConfirmedSignatureInfo,
ParsedInstruction,
Expand Down Expand Up @@ -105,7 +105,7 @@ export function getTokenInstructionName(
}
}

if (ix.accounts.findIndex(account => account.equals(TOKEN_PROGRAM_ID)) >= 0) {
if (ix.accounts.findIndex(account => isTokenProgramId(account)) >= 0) {
name = 'Unknown (Inner)';
} else {
return undefined;
Expand Down

0 comments on commit 4893272

Please sign in to comment.