Flash unwinder contracts and scripts, relay lane tuning, trustless bridge and token-aggregation updates.

Made-with: Cursor
This commit is contained in:
defiQUG
2026-04-12 06:33:54 -07:00
parent 662b35ad69
commit 6817f53591
40 changed files with 682 additions and 88 deletions

View File

@@ -283,38 +283,57 @@ router.get('/tokens/:address/pools', cacheMiddleware(60 * 1000), async (req: Req
return res.status(400).json({ error: 'chainId is required' });
}
const pools = await getPoolsByTokenWithFallback(chainId, address);
let pools: LiquidityPool[];
try {
pools = await getPoolsByTokenWithFallback(chainId, address);
} catch (error) {
logger.error('Error resolving pools list:', error);
pools = [];
}
res.json({
pools: await Promise.all(
pools.map(async (pool) => {
const { token0, token1 } = await resolvePoolTokenDisplays(tokenRepo, chainId, pool.token0Address, pool.token1Address);
return {
address: pool.poolAddress,
dex: pool.dexType,
token0: {
address: pool.token0Address,
symbol: token0.symbol,
name: token0.name,
source: token0.source,
},
token1: {
address: pool.token1Address,
symbol: token1.symbol,
name: token1.name,
source: token1.source,
},
reserves: {
token0: pool.reserve0,
token1: pool.reserve1,
},
tvl: pool.totalLiquidityUsd,
volume24h: pool.volume24h,
feeTier: pool.feeTier,
};
})
),
});
const settled = await Promise.allSettled(
pools.map(async (pool) => {
const { token0, token1 } = await resolvePoolTokenDisplays(tokenRepo, chainId, pool.token0Address, pool.token1Address);
return {
address: pool.poolAddress,
dex: String(pool.dexType ?? ''),
token0: {
address: pool.token0Address,
symbol: token0.symbol,
name: token0.name,
source: token0.source,
},
token1: {
address: pool.token1Address,
symbol: token1.symbol,
name: token1.name,
source: token1.source,
},
reserves: {
token0: pool.reserve0,
token1: pool.reserve1,
},
tvl: pool.totalLiquidityUsd,
volume24h: pool.volume24h,
feeTier: pool.feeTier,
};
})
);
const poolsOut = [];
for (const row of settled) {
if (row.status === 'fulfilled') {
poolsOut.push(row.value);
} else {
logger.warn('Skipping pool row in /tokens/:address/pools:', row.reason);
}
}
// BigInt (e.g. from live RPC paths) breaks res.json; stringify replacer keeps Mission Control / E2E stable.
const payload = JSON.parse(
JSON.stringify({ pools: poolsOut }, (_key, value) => (typeof value === 'bigint' ? value.toString() : value))
) as { pools: typeof poolsOut };
res.json(payload);
} catch (error) {
logger.error('Error fetching pools:', error);
res.status(500).json({ error: 'Internal server error' });