mirror of
https://github.com/pezkuwichain/pwap.git
synced 2026-06-13 11:11:01 +00:00
fix: use Asset Hub API for custom tokens instead of relay chain
This commit is contained in:
@@ -229,8 +229,9 @@ export const AccountBalance: React.FC = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Fetch other tokens (only custom tokens - wrapped tokens are backend-only)
|
// Fetch other tokens (only custom tokens - wrapped tokens are backend-only)
|
||||||
|
// IMPORTANT: Assets are on Asset Hub, use assetHubApi (not relay chain api)
|
||||||
const fetchOtherTokens = async () => {
|
const fetchOtherTokens = async () => {
|
||||||
if (!api || !isApiReady || !selectedAccount) return;
|
if (!assetHubApi || !isAssetHubReady || !selectedAccount) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const tokens: TokenBalance[] = [];
|
const tokens: TokenBalance[] = [];
|
||||||
@@ -246,54 +247,55 @@ export const AccountBalance: React.FC = () => {
|
|||||||
|
|
||||||
for (const assetId of assetIdsToCheck) {
|
for (const assetId of assetIdsToCheck) {
|
||||||
try {
|
try {
|
||||||
const assetBalance = await api.query.assets.account(assetId, selectedAccount.address);
|
// Use Asset Hub API - assets are on Asset Hub, not relay chain
|
||||||
const assetMetadata = await api.query.assets.metadata(assetId);
|
const assetMetadata = await assetHubApi.query.assets.metadata(assetId);
|
||||||
|
const metadata = assetMetadata.toJSON() as { symbol?: string; name?: string; decimals?: number };
|
||||||
|
|
||||||
|
// Decode hex strings properly
|
||||||
|
let symbol = metadata.symbol || '';
|
||||||
|
let name = metadata.name || '';
|
||||||
|
|
||||||
|
if (typeof symbol === 'string' && symbol.startsWith('0x')) {
|
||||||
|
symbol = hexToString(symbol);
|
||||||
|
}
|
||||||
|
if (typeof name === 'string' && name.startsWith('0x')) {
|
||||||
|
name = hexToString(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback to known symbols if metadata is empty
|
||||||
|
if (!symbol || symbol.trim() === '') {
|
||||||
|
symbol = getAssetSymbol(assetId);
|
||||||
|
}
|
||||||
|
if (!name || name.trim() === '') {
|
||||||
|
name = symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
const decimals = metadata.decimals || getAssetDecimals(assetId);
|
||||||
|
|
||||||
|
// Get balance (may be 0 if user hasn't received any)
|
||||||
|
let balanceFormatted = '0';
|
||||||
|
const assetBalance = await assetHubApi.query.assets.account(assetId, selectedAccount.address);
|
||||||
if (assetBalance.isSome) {
|
if (assetBalance.isSome) {
|
||||||
const assetData = assetBalance.unwrap();
|
const assetData = assetBalance.unwrap();
|
||||||
const balance = assetData.balance.toString();
|
const balance = assetData.balance.toString();
|
||||||
|
balanceFormatted = (parseInt(balance) / Math.pow(10, decimals)).toFixed(6);
|
||||||
const metadata = assetMetadata.toJSON() as { symbol?: string; name?: string; decimals?: number };
|
|
||||||
|
|
||||||
// Decode hex strings properly
|
|
||||||
let symbol = metadata.symbol || '';
|
|
||||||
let name = metadata.name || '';
|
|
||||||
|
|
||||||
if (typeof symbol === 'string' && symbol.startsWith('0x')) {
|
|
||||||
symbol = hexToString(symbol);
|
|
||||||
}
|
|
||||||
if (typeof name === 'string' && name.startsWith('0x')) {
|
|
||||||
name = hexToString(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fallback to known symbols if metadata is empty
|
|
||||||
if (!symbol || symbol.trim() === '') {
|
|
||||||
symbol = getAssetSymbol(assetId);
|
|
||||||
}
|
|
||||||
if (!name || name.trim() === '') {
|
|
||||||
name = symbol;
|
|
||||||
}
|
|
||||||
|
|
||||||
const decimals = metadata.decimals || getAssetDecimals(assetId);
|
|
||||||
const balanceFormatted = (parseInt(balance) / Math.pow(10, decimals)).toFixed(6);
|
|
||||||
|
|
||||||
// Simple USD calculation (would use real price feed in production)
|
|
||||||
let usdValue = 0;
|
|
||||||
if (assetId === ASSET_IDS.WUSDT) {
|
|
||||||
usdValue = parseFloat(balanceFormatted); // 1 wUSDT = 1 USD
|
|
||||||
} else if (assetId === ASSET_IDS.WHEZ) {
|
|
||||||
usdValue = parseFloat(balanceFormatted) * 0.5; // Placeholder price
|
|
||||||
}
|
|
||||||
|
|
||||||
tokens.push({
|
|
||||||
assetId,
|
|
||||||
symbol: symbol.trim(),
|
|
||||||
name: name.trim(),
|
|
||||||
balance: balanceFormatted,
|
|
||||||
decimals,
|
|
||||||
usdValue
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Simple USD calculation (would use real price feed in production)
|
||||||
|
let usdValue = 0;
|
||||||
|
if (assetId === ASSET_IDS.WUSDT) {
|
||||||
|
usdValue = parseFloat(balanceFormatted); // 1 wUSDT = 1 USD
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always show the token (even with 0 balance) since user explicitly added it
|
||||||
|
tokens.push({
|
||||||
|
assetId,
|
||||||
|
symbol: symbol.trim(),
|
||||||
|
name: name.trim(),
|
||||||
|
balance: balanceFormatted,
|
||||||
|
decimals,
|
||||||
|
usdValue
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (import.meta.env.DEV) console.error(`Failed to fetch token ${assetId}:`, error);
|
if (import.meta.env.DEV) console.error(`Failed to fetch token ${assetId}:`, error);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user