Solana 如何按所有者获取所有代币帐户

317 阅读1分钟

HackQuest & Solana

每日一练:如何按所有者获取所有代币帐户

通过所有者获取代币账户

  • 使用 getParsedTokenAccountsByOwner 方法

每个代币帐户都有有关代币的信息,例如所有者、铸币厂、金额(余额)和小数。

let tokenAccount = await getAccount(connection, tokenAccountPubkey);

通过 getTokenMetadata,用来从 Solscan 的 API 获取指定 Solana token 的元数据

async function getTokenMetadata(mintAddress: string): Promise<any> {
  try {
    const response = await fetch(
      `https://pro-api.solscan.io/v2.0/token/meta?address=${mintAddress}`,
      {
        method: 'get',
        headers: {
          token: SOLSCAN_API_TOKEN,
        },
      },
    );
    return await response.json();
  } catch (error) {
    console.error('Error fetching token metadata:', error);
    return null;
  }
}

获取 token 信息:例如,通过 mintAddress 查询 token 的符号、名称、小数位数、总供应量等。

const tokenMetadata = await getTokenMetadata(accountData.mint);
          if (tokenMetadata?.data) {
            metadata = {
              name: tokenMetadata.data.name,
              symbol: tokenMetadata.data.symbol,
              image: tokenMetadata.data.icon,
            };
          }

完整代码

const { connection } = useConnection()

const fetchToken = async () => {
    const walletTokends = await getWalletTokens(publicKey.toString(), connection)
}
export async function getWalletTokens(
  walletAddress: string,
  connection: Connection,
): Promise<TokenInfo[]> {
  try {
    const publicKey = new PublicKey(walletAddress);

    // Get all token accounts for this wallet
    const tokenAccounts = await connection.getParsedTokenAccountsByOwner(
      publicKey,
      {
        programId: TOKEN_PROGRAM_ID,
      },
    );
    console.log('tokenAccounts',tokenAccounts)
    // Get detailed token information
    const tokens = await Promise.all(
      tokenAccounts.value.map(async (tokenAccount) => {
        const accountData = tokenAccount.account.data.parsed.info;
        const tokenAccountInfo = await getAccount(
          connection,
          tokenAccount.pubkey,
        );

        let metadata = undefined;
        if (accountData.mint) {
          const tokenMetadata = await getTokenMetadata(accountData.mint);
          if (tokenMetadata?.data) {
            metadata = {
              name: tokenMetadata.data.name,
              symbol: tokenMetadata.data.symbol,
              image: tokenMetadata.data.icon,
            };
          }
        }

        return {
          mint: accountData.mint,
          amount: accountData.tokenAmount.uiAmount,
          decimals: accountData.tokenAmount.decimals,
          tokenAccount: tokenAccount.pubkey.toString(),
          owner: accountData.owner,
          state: accountData.state,
          isNative: tokenAccountInfo.isNative,
          metadata,
        };
      }),
    );

    // Filter out tokens with zero balance (optional)
    const nonZeroTokens = tokens.filter((token) => token.amount > 0);

    return nonZeroTokens;
  } catch (error) {
    console.error('Error fetching wallet tokens:', error);
    return [];
  }
}

image.png