From 842dc9d8c23e9a1e46f3c57e23f2e87bc64bacb8 Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Fri, 6 Feb 2026 11:06:28 +0300 Subject: [PATCH] feat: add HEZ/DOT pool support and fix user-facing token names - Add HEZ/DOT pool to PoolDashboard - Display DOT, ETH, BTC instead of wDOT, wETH, wBTC to users - Update priceOracle with correct symbol mappings - Fix lint errors in check_all_pools.mjs - Extract MINTABLE_ASSETS to separate file for fast refresh --- shared/lib/priceOracle.ts | 7 +- web/check_all_pools.mjs | 91 +++++++++++++++++++++++ web/src/components/PoolDashboard.tsx | 7 ++ web/src/components/dex/DEXDashboard.tsx | 3 +- web/src/components/dex/MintAssetModal.tsx | 51 +------------ web/src/components/dex/SwapInterface.tsx | 12 +-- web/src/components/dex/mintableAssets.ts | 49 ++++++++++++ 7 files changed, 159 insertions(+), 61 deletions(-) create mode 100644 web/check_all_pools.mjs create mode 100644 web/src/components/dex/mintableAssets.ts diff --git a/shared/lib/priceOracle.ts b/shared/lib/priceOracle.ts index f3f3f301..36a7791b 100644 --- a/shared/lib/priceOracle.ts +++ b/shared/lib/priceOracle.ts @@ -7,10 +7,9 @@ const COINGECKO_API = 'https://api.coingecko.com/api/v3'; // CoinGecko ID mappings export const COINGECKO_IDS: Record = { - 'wDOT': 'polkadot', - 'wETH': 'ethereum', - 'wBTC': 'bitcoin', - 'wUSDT': 'tether', + 'DOT': 'polkadot', + 'ETH': 'ethereum', + 'BTC': 'bitcoin', 'USDT': 'tether', }; diff --git a/web/check_all_pools.mjs b/web/check_all_pools.mjs new file mode 100644 index 00000000..ffdb488b --- /dev/null +++ b/web/check_all_pools.mjs @@ -0,0 +1,91 @@ +import { ApiPromise, WsProvider } from '@pezkuwi/api'; + +async function checkAllPools() { + const provider = new WsProvider('wss://asset-hub-rpc.pezkuwichain.io'); + const api = await ApiPromise.create({ provider }); + + console.log('Connected to Asset Hub\n'); + + const userAddress = '5CyuFfbF95rzBxru7c9yEsX4XmQXUxpLUcbj9RLg9K1cGiiF'; + + // Get all pools + const poolKeys = await api.query.assetConversion.pools.keys(); + console.log('=== ALL POOLS ==='); + console.log('Total pools found:', poolKeys.length, '\n'); + + for (const key of poolKeys) { + const poolPair = key.args[0]; + console.log('Pool key:', JSON.stringify(poolPair.toHuman())); + + const poolInfo = await api.query.assetConversion.pools(poolPair); + if (!poolInfo.isEmpty) { + const poolData = poolInfo.unwrap().toJSON(); + console.log('LP Token ID:', poolData.lpToken); + + // Get LP supply + const lpAsset = await api.query.poolAssets.asset(poolData.lpToken); + if (lpAsset.isSome) { + const supply = lpAsset.unwrap().toJSON().supply; + console.log('Total LP Supply:', Number(BigInt(supply)) / 1e12); + } + + // Get user's LP balance + const userLp = await api.query.poolAssets.account(poolData.lpToken, userAddress); + if (userLp.isSome) { + const balance = userLp.unwrap().toJSON().balance; + console.log('User LP Balance:', Number(BigInt(balance)) / 1e12); + } else { + console.log('User LP Balance: 0'); + } + + // Try to get price + try { + const asset1 = poolPair[0]; + const asset2 = poolPair[1]; + const oneUnit = BigInt(1e12); + const quote = await api.call.assetConversionApi.quotePriceExactTokensForTokens( + asset1, + asset2, + oneUnit.toString(), + true + ); + if (quote && !quote.isNone) { + console.log('Price (1 asset1 -> asset2):', Number(BigInt(quote.unwrap().toString())) / 1e12); + } + } catch { + // Try with 6 decimals for USDT + try { + const asset1 = poolPair[0]; + const asset2 = poolPair[1]; + const oneUnit = BigInt(1e12); + const quote = await api.call.assetConversionApi.quotePriceExactTokensForTokens( + asset1, + asset2, + oneUnit.toString(), + true + ); + if (quote && !quote.isNone) { + console.log('Price (1 asset1 -> asset2):', Number(BigInt(quote.unwrap().toString())) / 1e6, 'USDT'); + } + } catch { + console.log('Could not get price'); + } + } + } + console.log('---'); + } + + // Check all LP token balances for user + console.log('\n=== USER LP TOKEN BALANCES ==='); + for (let lpId = 0; lpId < 5; lpId++) { + const userLp = await api.query.poolAssets.account(lpId, userAddress); + if (userLp.isSome) { + const balance = userLp.unwrap().toJSON().balance; + console.log(`LP Token ${lpId}: ${Number(BigInt(balance)) / 1e12}`); + } + } + + await api.disconnect(); +} + +checkAllPools().catch(console.error); diff --git a/web/src/components/PoolDashboard.tsx b/web/src/components/PoolDashboard.tsx index 546a5758..685982bf 100644 --- a/web/src/components/PoolDashboard.tsx +++ b/web/src/components/PoolDashboard.tsx @@ -19,6 +19,9 @@ const getDisplayTokenName = (assetId: number): string => { if (assetId === ASSET_IDS.WHEZ || assetId === 2) return 'wHEZ'; if (assetId === ASSET_IDS.PEZ || assetId === 1) return 'PEZ'; if (assetId === ASSET_IDS.WUSDT || assetId === 1000) return 'USDT'; + if (assetId === 1001) return 'DOT'; + if (assetId === 1002) return 'ETH'; + if (assetId === 1003) return 'BTC'; return getAssetSymbol(assetId); // Fallback for other assets }; @@ -75,6 +78,7 @@ const PoolDashboard = () => { [NATIVE_TOKEN_ID, ASSET_IDS.PEZ], // Native HEZ / PEZ [NATIVE_TOKEN_ID, ASSET_IDS.WUSDT], // Native HEZ / wUSDT [NATIVE_TOKEN_ID, ASSET_IDS.WHEZ], // Native HEZ / wHEZ + [NATIVE_TOKEN_ID, 1001], // Native HEZ / wDOT // wHEZ pools [ASSET_IDS.WHEZ, ASSET_IDS.PEZ], // wHEZ / PEZ [ASSET_IDS.WHEZ, ASSET_IDS.WUSDT], // wHEZ / wUSDT @@ -155,6 +159,9 @@ const PoolDashboard = () => { // Get decimals for each asset const getAssetDecimals = (assetId: number): number => { if (assetId === ASSET_IDS.WUSDT || assetId === 1000) return 6; // wUSDT has 6 decimals + if (assetId === 1001) return 10; // wDOT has 10 decimals + if (assetId === 1002) return 18; // wETH has 18 decimals + if (assetId === 1003) return 8; // wBTC has 8 decimals return 12; // Native, wHEZ, PEZ have 12 decimals }; diff --git a/web/src/components/dex/DEXDashboard.tsx b/web/src/components/dex/DEXDashboard.tsx index 1624cda7..8b4cfb0a 100644 --- a/web/src/components/dex/DEXDashboard.tsx +++ b/web/src/components/dex/DEXDashboard.tsx @@ -8,7 +8,8 @@ import PoolDashboard from '@/components/PoolDashboard'; import { CreatePoolModal } from './CreatePoolModal'; import { InitializeHezPoolModal } from './InitializeHezPoolModal'; import { InitializeUsdtModal } from './InitializeUsdtModal'; -import { MintAssetModal, MINTABLE_ASSETS, type AssetConfig } from './MintAssetModal'; +import { MintAssetModal } from './MintAssetModal'; +import { MINTABLE_ASSETS, type AssetConfig } from './mintableAssets'; import { XCMConfigurationWizard } from '@/components/admin/XCMConfigurationWizard'; import { ArrowRightLeft, Droplet, Settings } from 'lucide-react'; import { isFounderWallet } from '@pezkuwi/utils/auth'; diff --git a/web/src/components/dex/MintAssetModal.tsx b/web/src/components/dex/MintAssetModal.tsx index 47cd04be..fd31389f 100644 --- a/web/src/components/dex/MintAssetModal.tsx +++ b/web/src/components/dex/MintAssetModal.tsx @@ -8,16 +8,7 @@ import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { useToast } from '@/hooks/use-toast'; - -export interface AssetConfig { - id: number; - symbol: string; - name: string; - decimals: number; - logo?: string; - defaultAmount?: string; - color?: string; // For theming (green, blue, orange, etc.) -} +import type { AssetConfig } from './mintableAssets'; interface MintAssetModalProps { isOpen: boolean; @@ -327,43 +318,3 @@ export const MintAssetModal: React.FC = ({ ); }; - -// Pre-configured assets for easy use -export const MINTABLE_ASSETS: Record = { - wUSDT: { - id: 1000, - symbol: 'wUSDT', - name: 'Wrapped USDT', - decimals: 6, - logo: '/shared/images/USDT(hez)logo.png', - defaultAmount: '10000', - color: 'green', - }, - wDOT: { - id: 1001, - symbol: 'wDOT', - name: 'Wrapped DOT', - decimals: 10, - logo: '/shared/images/dot.png', - defaultAmount: '100', - color: 'pink', - }, - wETH: { - id: 1002, - symbol: 'wETH', - name: 'Wrapped ETH', - decimals: 18, - logo: '/shared/images/etherium.png', - defaultAmount: '10', - color: 'purple', - }, - wBTC: { - id: 1003, - symbol: 'wBTC', - name: 'Wrapped BTC', - decimals: 8, - logo: '/shared/images/bitcoin.png', - defaultAmount: '1', - color: 'orange', - }, -}; diff --git a/web/src/components/dex/SwapInterface.tsx b/web/src/components/dex/SwapInterface.tsx index 92d83b7f..7445de0f 100644 --- a/web/src/components/dex/SwapInterface.tsx +++ b/web/src/components/dex/SwapInterface.tsx @@ -28,9 +28,9 @@ type TransactionStatus = 'idle' | 'signing' | 'submitting' | 'success' | 'error' const USER_TOKENS = [ { symbol: 'HEZ', emoji: '🟡', assetId: -1, name: 'HEZ', decimals: 12, displaySymbol: 'HEZ', logo: '/shared/images/hez_token_512.png' }, { symbol: 'USDT', emoji: '💵', assetId: 1000, name: 'USDT', decimals: 6, displaySymbol: 'USDT', logo: '/shared/images/USDT(hez)logo.png' }, - { symbol: 'wDOT', emoji: '🔴', assetId: 1001, name: 'Wrapped DOT', decimals: 10, displaySymbol: 'wDOT', logo: '/shared/images/dot.png' }, - { symbol: 'wETH', emoji: '💎', assetId: 1002, name: 'Wrapped ETH', decimals: 18, displaySymbol: 'wETH', logo: '/shared/images/etherium.png' }, - { symbol: 'wBTC', emoji: '🟠', assetId: 1003, name: 'Wrapped BTC', decimals: 8, displaySymbol: 'wBTC', logo: '/shared/images/bitcoin.png' }, + { symbol: 'DOT', emoji: '🔴', assetId: 1001, name: 'DOT', decimals: 10, displaySymbol: 'DOT', logo: '/shared/images/dot.png' }, + { symbol: 'ETH', emoji: '💎', assetId: 1002, name: 'ETH', decimals: 18, displaySymbol: 'ETH', logo: '/shared/images/etherium.png' }, + { symbol: 'BTC', emoji: '🟠', assetId: 1003, name: 'BTC', decimals: 8, displaySymbol: 'BTC', logo: '/shared/images/bitcoin.png' }, ] as const; export const SwapInterface: React.FC = ({ pools }) => { @@ -266,9 +266,9 @@ export const SwapInterface: React.FC = ({ pools }) => { switch (symbol) { case 'HEZ': return nativeLocation; case 'USDT': return usdtLocation; - case 'wDOT': return wdotLocation; - case 'wETH': return wethLocation; - case 'wBTC': return wbtcLocation; + case 'DOT': return wdotLocation; + case 'ETH': return wethLocation; + case 'BTC': return wbtcLocation; default: return formatAssetLocation(fromAssetId!); } }; diff --git a/web/src/components/dex/mintableAssets.ts b/web/src/components/dex/mintableAssets.ts new file mode 100644 index 00000000..e7fa72fa --- /dev/null +++ b/web/src/components/dex/mintableAssets.ts @@ -0,0 +1,49 @@ +export interface AssetConfig { + id: number; + symbol: string; + name: string; + decimals: number; + logo?: string; + defaultAmount?: string; + color?: string; // For theming (green, blue, orange, etc.) +} + +// Pre-configured assets for easy use +export const MINTABLE_ASSETS: Record = { + wUSDT: { + id: 1000, + symbol: 'wUSDT', + name: 'Wrapped USDT', + decimals: 6, + logo: '/shared/images/USDT(hez)logo.png', + defaultAmount: '10000', + color: 'green', + }, + wDOT: { + id: 1001, + symbol: 'wDOT', + name: 'Wrapped DOT', + decimals: 10, + logo: '/shared/images/dot.png', + defaultAmount: '100', + color: 'pink', + }, + wETH: { + id: 1002, + symbol: 'wETH', + name: 'Wrapped ETH', + decimals: 18, + logo: '/shared/images/etherium.png', + defaultAmount: '10', + color: 'purple', + }, + wBTC: { + id: 1003, + symbol: 'wBTC', + name: 'Wrapped BTC', + decimals: 8, + logo: '/shared/images/bitcoin.png', + defaultAmount: '1', + color: 'orange', + }, +};