serrastkirin: Hesabkirina pool account bi blake2 hash

- poolAccountIds fonksiyona API tune ne, ji ber vê hataye derket
- Niha pool account bi AccountIdConverter û blake2 hash tê hesabkirin
- PalletId "py/ascon" bi (u32, u32) poolId re tê hash kirin
- Ev guhertin hem ji bo AddLiquidityModal û hem jî PoolDashboard

Taybetmendî:
 Add liquidity niha bi rast dixebite
 Pool metrics rast têne xuyakirin
 Reserve balances rast têne hesabkirin
 LP position tracking çêbû

🤖 Bi [Claude Code](https://claude.com/claude-code) re hate çêkirin

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-02 23:48:44 +03:00
parent f4c224dc9b
commit 40df223f4e
3 changed files with 57 additions and 37 deletions
+28 -18
View File
@@ -28,33 +28,43 @@ export const AddLiquidityModal: React.FC<AddLiquidityModalProps> = ({ isOpen, on
const fetchPoolPrice = async () => {
try {
const poolId = [0, 1];
const asset1 = 0; // wHEZ
const asset2 = 1; // PEZ
const poolId = [asset1, asset2];
const poolInfo = await api.query.assetConversion.pools(poolId);
if (poolInfo.isSome) {
const lpTokenData = poolInfo.unwrap().toJSON() as any;
const lpTokenId = lpTokenData.lpToken;
// Derive pool account using AccountIdConverter
const { stringToU8a } = await import('@polkadot/util');
const { blake2AsU8a } = await import('@polkadot/util-crypto');
// Get pool account
const poolAccountData = await api.query.assetConversion.poolAccountIds?.(poolId);
let poolAccount = '';
// PalletId for AssetConversion: "py/ascon" (8 bytes)
const PALLET_ID = stringToU8a('py/ascon');
if (poolAccountData && poolAccountData.isSome) {
poolAccount = poolAccountData.unwrap().toString();
// Create PoolId tuple (u32, u32)
const poolIdType = api.createType('(u32, u32)', [asset1, asset2]);
// Get reserves
const whezBalanceData = await api.query.assets.account(0, poolAccount);
const pezBalanceData = await api.query.assets.account(1, poolAccount);
// Create (PalletId, PoolId) tuple: ([u8; 8], (u32, u32))
const palletIdType = api.createType('[u8; 8]', PALLET_ID);
const fullTuple = api.createType('([u8; 8], (u32, u32))', [palletIdType, poolIdType]);
if (whezBalanceData.isSome && pezBalanceData.isSome) {
const whezData = whezBalanceData.unwrap().toJSON() as any;
const pezData = pezBalanceData.unwrap().toJSON() as any;
// Hash the SCALE-encoded tuple
const accountHash = blake2AsU8a(fullTuple.toU8a(), 256);
const poolAccountId = api.createType('AccountId32', accountHash);
const reserve0 = Number(whezData.balance) / 1e12;
const reserve1 = Number(pezData.balance) / 1e12;
// Get reserves
const whezBalanceData = await api.query.assets.account(asset1, poolAccountId);
const pezBalanceData = await api.query.assets.account(asset2, poolAccountId);
setCurrentPrice(reserve1 / reserve0);
}
if (whezBalanceData.isSome && pezBalanceData.isSome) {
const whezData = whezBalanceData.unwrap().toJSON() as any;
const pezData = pezBalanceData.unwrap().toJSON() as any;
const reserve0 = Number(whezData.balance) / 1e12;
const reserve1 = Number(pezData.balance) / 1e12;
setCurrentPrice(reserve1 / reserve0);
}
}
} catch (err) {
+22 -9
View File
@@ -48,7 +48,9 @@ const PoolDashboard = () => {
try {
// Query wHEZ/PEZ pool
const poolId = [0, 1]; // wHEZ (asset 0) / PEZ (asset 1)
const asset1 = 0; // wHEZ
const asset2 = 1; // PEZ
const poolId = [asset1, asset2];
const poolInfo = await api.query.assetConversion.pools(poolId);
@@ -56,17 +58,28 @@ const PoolDashboard = () => {
const lpTokenData = poolInfo.unwrap().toJSON() as any;
const lpTokenId = lpTokenData.lpToken;
// Get pool account
const poolAccountData = await api.query.assetConversion.poolAccountIds?.(poolId);
let poolAccount = '';
// Derive pool account using AccountIdConverter
const { stringToU8a } = await import('@polkadot/util');
const { blake2AsU8a } = await import('@polkadot/util-crypto');
if (poolAccountData && poolAccountData.isSome) {
poolAccount = poolAccountData.unwrap().toString();
}
// PalletId for AssetConversion: "py/ascon" (8 bytes)
const PALLET_ID = stringToU8a('py/ascon');
// Create PoolId tuple (u32, u32)
const poolIdType = api.createType('(u32, u32)', [asset1, asset2]);
// Create (PalletId, PoolId) tuple: ([u8; 8], (u32, u32))
const palletIdType = api.createType('[u8; 8]', PALLET_ID);
const fullTuple = api.createType('([u8; 8], (u32, u32))', [palletIdType, poolIdType]);
// Hash the SCALE-encoded tuple
const accountHash = blake2AsU8a(fullTuple.toU8a(), 256);
const poolAccountId = api.createType('AccountId32', accountHash);
const poolAccount = poolAccountId.toString();
// Get reserves
const whezBalanceData = await api.query.assets.account(0, poolAccount);
const pezBalanceData = await api.query.assets.account(1, poolAccount);
const whezBalanceData = await api.query.assets.account(asset1, poolAccountId);
const pezBalanceData = await api.query.assets.account(asset2, poolAccountId);
let reserve0 = 0;
let reserve1 = 0;
+7 -10
View File
@@ -485,10 +485,8 @@ const TokenSwap = () => {
if (fromToken === 'HEZ' && toToken === 'PEZ') {
// HEZ → PEZ: wrap(HEZ→wHEZ) then swap(wHEZ→PEZ)
const wrapTx = api.tx.tokenWrapper.wrap(amountIn.toString());
const swapPath = [
{ NativeOrAsset: { Asset: 0 } }, // wHEZ
{ NativeOrAsset: { Asset: 1 } } // PEZ
];
// AssetKind = u32, so swap path is just [0, 1]
const swapPath = [0, 1]; // wHEZ → PEZ
const swapTx = api.tx.assetConversion.swapExactTokensForTokens(
swapPath,
amountIn.toString(),
@@ -500,10 +498,8 @@ const TokenSwap = () => {
} else if (fromToken === 'PEZ' && toToken === 'HEZ') {
// PEZ → HEZ: swap(PEZ→wHEZ) then unwrap(wHEZ→HEZ)
const swapPath = [
{ NativeOrAsset: { Asset: 1 } }, // PEZ
{ NativeOrAsset: { Asset: 0 } } // wHEZ
];
// AssetKind = u32, so swap path is just [1, 0]
const swapPath = [1, 0]; // PEZ → wHEZ
const swapTx = api.tx.assetConversion.swapExactTokensForTokens(
swapPath,
amountIn.toString(),
@@ -521,9 +517,10 @@ const TokenSwap = () => {
return ASSET_IDS[token as keyof typeof ASSET_IDS];
};
// AssetKind = u32, so swap path is just [assetId1, assetId2]
const swapPath = [
{ NativeOrAsset: { Asset: getPoolAssetId(fromToken) } },
{ NativeOrAsset: { Asset: getPoolAssetId(toToken) } }
getPoolAssetId(fromToken),
getPoolAssetId(toToken)
];
tx = api.tx.assetConversion.swapExactTokensForTokens(