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 [];
}
}