From 5402c3be3e29b8bbc8294e6e98c33cee41581a24 Mon Sep 17 00:00:00 2001 From: "daniel.andrade1991@gmail.com" Date: Sat, 30 Nov 2024 20:42:56 -0300 Subject: [PATCH 1/6] Fix: Adjust volume calculation to exclude liquidity events --- .env.example | 14 --------- src/utils/info/pools/index.ts | 59 ++++++++++++++++++++--------------- src/zephyr/helpers.ts | 22 +++++++++++-- tsconfig.json | 2 +- 4 files changed, 55 insertions(+), 42 deletions(-) delete mode 100644 .env.example diff --git a/.env.example b/.env.example deleted file mode 100644 index 8bbda19..0000000 --- a/.env.example +++ /dev/null @@ -1,14 +0,0 @@ -NEXT_PUBLIC_SOROSWAP_APP_URL=https://app.soroswap.finance - -#Mercury MAINNET -MERCURY_EMAIL_MAINNET= -MERCURY_PASSWORD_MAINNET= -MERCURY_BACKEND_ENDPOINT_MAINNET=https://mainnet.mercurydata.app -MERCURY_GRAPHQL_ENDPOINT_MAINNET=https://mainnet.mercurydata.app:2083 - -#Mercury TESTNET -MERCURY_EMAIL_TESTNET= -MERCURY_PASSWORD_TESTNET= -MERCURY_BACKEND_ENDPOINT_TESTNET=https://api.mercurydata.app:8443 -MERCURY_GRAPHQL_ENDPOINT_TESTNET=https://api.mercurydata.app:2083 - diff --git a/src/utils/info/pools/index.ts b/src/utils/info/pools/index.ts index f6e4ed6..41ac08b 100644 --- a/src/utils/info/pools/index.ts +++ b/src/utils/info/pools/index.ts @@ -285,41 +285,44 @@ export const getPoolFees = ( }; export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { - const poolEvents = events.filter((e) => { - if ( - e.tokenA === pool?.tokenA.contract && - e.tokenB === pool?.tokenB.contract - ) { - return true; - } + console.log("All events received:", events); - if ( - e.tokenA === pool?.tokenB.contract && - e.tokenB === pool?.tokenA.contract - ) { - return true; - } + // Filtramos solo eventos de tipo swap + const swapEvents = events.filter(e => { + console.log("Event type:", e.eType); + return e.eType === "swap"; + }); + console.log("Filtered swap events:", swapEvents); - return false; + // Filtramos eventos del pool específico + const poolEvents = swapEvents.filter((e) => { + const isPoolEvent = ( + (e.tokenA === pool?.tokenA.contract && e.tokenB === pool?.tokenB.contract) || + (e.tokenA === pool?.tokenB.contract && e.tokenB === pool?.tokenA.contract) + ); + console.log(`Event for pool ${pool.address}:`, isPoolEvent); + return isPoolEvent; }); const poolsEventsWithTokensOrdered = poolEvents.map((e) => { + // Si los tokens están en orden inverso, los intercambiamos if ( - e.tokenA === pool?.tokenA.contract && - e.tokenB === pool?.tokenB.contract + e.tokenA === pool?.tokenB.contract && + e.tokenB === pool?.tokenA.contract ) { - return e; + return { + ...e, + tokenA: e.tokenB, + tokenB: e.tokenA, + amountA: e.amountB, + amountB: e.amountA, + }; } - - return { - ...e, - tokenA: e.tokenB, - tokenB: e.tokenA, - amountA: e.amountB, - amountB: e.amountA, - }; + return e; }); + console.log("Events with ordered tokens:", poolsEventsWithTokensOrdered); + const volumeChartData = poolsEventsWithTokensOrdered.map((e) => { const volumes = getPoolVolume( e.amountA, @@ -329,6 +332,11 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { pool?.tokenA.decimals, pool?.tokenB.decimals ); + console.log("Calculated volumes for event:", { + date: getDate(e.timestamp), + volumes + }); + return { timestamp: e.timestamp, date: getDate(e.timestamp), @@ -339,6 +347,7 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { }); const filledVolumeChartData = fillChart(volumeChartData, "volume", false); + console.log("Final volume chart data:", filledVolumeChartData); return filledVolumeChartData as VolumeChartData[]; }; diff --git a/src/zephyr/helpers.ts b/src/zephyr/helpers.ts index 2df3b30..fb87d2b 100644 --- a/src/zephyr/helpers.ts +++ b/src/zephyr/helpers.ts @@ -14,17 +14,26 @@ export const parseScvalValue = (value: any) => { }; export const parseMercuryScvalResponse = (data: any) => { + console.log("Raw data to parse:", data); + return data?.map((d: any) => { let n: any = {}; for (let key in d) { const value = parseScvalValue(d[key]); + console.log(`Parsing field ${key}:`, value); + if (typeof value === "bigint" || typeof value === "number") { n[key] = value.toString(); - } else if( key == 'txHash'){ + } else if(key == 'txHash'){ const txHash = StellarSdk.xdr.Hash.fromXDR(value, 'hex').toString('hex') - if(txHash.length != 64)throw new Error('Invalid txHash length'); + if(txHash.length != 64) throw new Error('Invalid txHash length'); n[key] = txHash; + } else if(key == 'eType') { + // Asegurarnos que eType sea un string válido y esté normalizado + const eventType = String(value).toLowerCase(); + console.log("Parsed event type:", eventType); + n[key] = eventType; } else { n[key] = value; } @@ -120,11 +129,17 @@ export const getMercuryRsvCh = async (network: Network) => { export const getMercuryEvents = async (network: Network) => { const mercuryInstance = getMercuryInstance(network); const { soroswap_events } = await fetchZephyrTables({ network }); + + console.log("Fetching events from table:", soroswap_events); + const response = await mercuryInstance.getCustomQuery({ request: GET_ALL_EVENTS(soroswap_events), }); + console.log("Raw Mercury Events Response:", response); + if (!response.ok) { + console.error("Error fetching Mercury events:", response); return []; } @@ -132,5 +147,8 @@ export const getMercuryEvents = async (network: Network) => { response.data?.events?.data ); + console.log("Parsed Mercury Events:", parsedData); + console.log("Event types present:", [...new Set(parsedData.map(e => e.eType))]); + return parsedData; }; diff --git a/tsconfig.json b/tsconfig.json index cf4ee35..60e779a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es2015", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, From 1bd1ceab177f99871f1cc9c8ebdc2aeb90977f78 Mon Sep 17 00:00:00 2001 From: "daniel.andrade1991@gmail.com" Date: Wed, 4 Dec 2024 08:46:21 -0300 Subject: [PATCH 2/6] Add filter eType='swap' --- src/utils/info/pools/index.ts | 51 +++++++++++++---------------------- src/zephyr/helpers.ts | 28 +++++++++++++------ 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/src/utils/info/pools/index.ts b/src/utils/info/pools/index.ts index 41ac08b..9669f33 100644 --- a/src/utils/info/pools/index.ts +++ b/src/utils/info/pools/index.ts @@ -44,6 +44,7 @@ export const buildPoolsInfo = async ( const rsvch = await getMercuryRsvCh(network); const events = await getMercuryEvents(network); + //console.log("Events received from getMercuryEvents:", events); const tokens = await Promise.all( tokenList.map(async (token) => { @@ -285,31 +286,20 @@ export const getPoolFees = ( }; export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { - console.log("All events received:", events); - - // Filtramos solo eventos de tipo swap - const swapEvents = events.filter(e => { - console.log("Event type:", e.eType); - return e.eType === "swap"; - }); - console.log("Filtered swap events:", swapEvents); - - // Filtramos eventos del pool específico - const poolEvents = swapEvents.filter((e) => { - const isPoolEvent = ( - (e.tokenA === pool?.tokenA.contract && e.tokenB === pool?.tokenB.contract) || - (e.tokenA === pool?.tokenB.contract && e.tokenB === pool?.tokenA.contract) + // Filtrar eventos de tipo "swap" relacionados con el pool + const poolEvents = events.filter((e) => { + return ( + e.eType === "swap" && // Verificar que sea un evento de tipo "swap" + ( + (e.tokenA === pool?.tokenA.contract && e.tokenB === pool?.tokenB.contract) || + (e.tokenA === pool?.tokenB.contract && e.tokenB === pool?.tokenA.contract) + ) ); - console.log(`Event for pool ${pool.address}:`, isPoolEvent); - return isPoolEvent; }); - const poolsEventsWithTokensOrdered = poolEvents.map((e) => { - // Si los tokens están en orden inverso, los intercambiamos - if ( - e.tokenA === pool?.tokenB.contract && - e.tokenB === pool?.tokenA.contract - ) { + // Ordenar los tokens si están en orden inverso + const orderedPoolEvents = poolEvents.map((e) => { + if (e.tokenA === pool?.tokenB.contract && e.tokenB === pool?.tokenA.contract) { return { ...e, tokenA: e.tokenB, @@ -321,9 +311,8 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { return e; }); - console.log("Events with ordered tokens:", poolsEventsWithTokensOrdered); - - const volumeChartData = poolsEventsWithTokensOrdered.map((e) => { + // Calcular el volumen para cada evento + const volumeChartData = orderedPoolEvents.map((e) => { const volumes = getPoolVolume( e.amountA, e.amountB, @@ -332,26 +321,24 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { pool?.tokenA.decimals, pool?.tokenB.decimals ); - console.log("Calculated volumes for event:", { - date: getDate(e.timestamp), - volumes - }); - + return { timestamp: e.timestamp, date: getDate(e.timestamp), - volume: volumes.volumeA + volumes.volumeB, + volume: volumes.volumeA + volumes.volumeB, // Volumen total del evento valueA: volumes.volumeA, valueB: volumes.volumeB, }; }); + // Llenar los datos faltantes para el gráfico (p.ej., días sin eventos) const filledVolumeChartData = fillChart(volumeChartData, "volume", false); - console.log("Final volume chart data:", filledVolumeChartData); + // Retornar los datos completos como `VolumeChartData` return filledVolumeChartData as VolumeChartData[]; }; + export const getPoolFeesChartData = (events: MercuryEvent[], pool: Pool) => { const poolEvents = events.filter((e) => { if ( diff --git a/src/zephyr/helpers.ts b/src/zephyr/helpers.ts index fb87d2b..fd5a580 100644 --- a/src/zephyr/helpers.ts +++ b/src/zephyr/helpers.ts @@ -14,14 +14,14 @@ export const parseScvalValue = (value: any) => { }; export const parseMercuryScvalResponse = (data: any) => { - console.log("Raw data to parse:", data); + // console.log("Raw data to parse (first 5):", data.slice(0, 5)); return data?.map((d: any) => { let n: any = {}; for (let key in d) { const value = parseScvalValue(d[key]); - console.log(`Parsing field ${key}:`, value); + // console.log(`Parsing field ${key} (first 5):`, value); if (typeof value === "bigint" || typeof value === "number") { n[key] = value.toString(); @@ -32,7 +32,7 @@ export const parseMercuryScvalResponse = (data: any) => { } else if(key == 'eType') { // Asegurarnos que eType sea un string válido y esté normalizado const eventType = String(value).toLowerCase(); - console.log("Parsed event type:", eventType); + // console.log("Parsed event type:", eventType); n[key] = eventType; } else { n[key] = value; @@ -50,6 +50,8 @@ export const getMercuryPools = async (network: Network) => { request: GET_ALL_PAIRS(soroswap_pairs), }); + // console.log("Raw Mercury Pools Response (first 5):", response.data?.events?.data.slice(0, 5)); + if (!response.ok) { return []; } @@ -58,6 +60,8 @@ export const getMercuryPools = async (network: Network) => { response.data?.events?.data ); + // console.log("Parsed Mercury Pools (first 5):", parsedData.slice(0, 5)); + return parsedData; }; @@ -68,7 +72,7 @@ export const getMercuryPhoenixPools = async (network: Network) => { request: GET_ALL_PAIRS(phoenix_pairs), }); - console.log(response); + // console.log("Raw Mercury Phoenix Pools Response (first 5):", response.data?.events?.data.slice(0, 5)); if (!response.ok) { return []; @@ -78,6 +82,8 @@ export const getMercuryPhoenixPools = async (network: Network) => { response.data?.events?.data ); + // console.log("Parsed Mercury Phoenix Pools (first 5):", parsedData.slice(0, 5)); + return parsedData; }; @@ -88,7 +94,7 @@ export const getMercuryAquaPools = async (network: Network) => { request: GET_ALL_PAIRS(aqua_pairs), }); - console.log(response); + // console.log("Raw Mercury Aqua Pools Response (first 5):", response.data?.events?.data.slice(0, 5)); if (!response.ok) { return []; @@ -98,6 +104,8 @@ export const getMercuryAquaPools = async (network: Network) => { response.data?.events?.data ); + // console.log("Parsed Mercury Aqua Pools (first 5):", parsedData.slice(0, 5)); + return parsedData; }; @@ -115,6 +123,8 @@ export const getMercuryRsvCh = async (network: Network) => { request: GET_ALL_RSV_CH(soroswap_rsv_ch), }); + // console.log("Raw Mercury RsvCh Response (first 5):", response.data?.events?.data.slice(0, 5)); + if (!response.ok) { return []; } @@ -123,6 +133,8 @@ export const getMercuryRsvCh = async (network: Network) => { response.data?.events?.data ); + // console.log("Parsed Mercury RsvCh (first 5):", parsedData.slice(0, 5)); + return parsedData; }; @@ -136,7 +148,7 @@ export const getMercuryEvents = async (network: Network) => { request: GET_ALL_EVENTS(soroswap_events), }); - console.log("Raw Mercury Events Response:", response); + // console.log("Raw Mercury Events Response (first 5):", response.data?.events?.data.slice(0, 5)); if (!response.ok) { console.error("Error fetching Mercury events:", response); @@ -147,8 +159,8 @@ export const getMercuryEvents = async (network: Network) => { response.data?.events?.data ); - console.log("Parsed Mercury Events:", parsedData); - console.log("Event types present:", [...new Set(parsedData.map(e => e.eType))]); + // console.log("Parsed Mercury Events (first 5):", parsedData.slice(0, 5)); + // console.log("Event types present (first 5):", [...new Set(parsedData.map(e => e.eType))].slice(0, 5)); return parsedData; }; From dc646035438a14fb8c4863700238b1151441c5b3 Mon Sep 17 00:00:00 2001 From: "daniel.andrade1991@gmail.com" Date: Thu, 5 Dec 2024 07:55:42 -0300 Subject: [PATCH 3/6] Refactor buildPoolsInfo function to filter pools with events and fetch token prices dynamically --- src/utils/info/pools/index.ts | 282 +++++++++++++++++++--------------- 1 file changed, 154 insertions(+), 128 deletions(-) diff --git a/src/utils/info/pools/index.ts b/src/utils/info/pools/index.ts index 9669f33..16027a5 100644 --- a/src/utils/info/pools/index.ts +++ b/src/utils/info/pools/index.ts @@ -31,135 +31,154 @@ export const stellarNetworkDict = { }; export const buildPoolsInfo = async ( - data: MercuryPair[], - tokenList: TokenType[], - network: Network -) => { - const sdkNetwork = stellarNetworkDict[network]; - - const router = getRouterFromPools(data, sdkNetwork); - - const USDC = tokenList.find((token) => token.code === "USDC"); - - const rsvch = await getMercuryRsvCh(network); - - const events = await getMercuryEvents(network); - //console.log("Events received from getMercuryEvents:", events); - - const tokens = await Promise.all( - tokenList.map(async (token) => { - const tokenPrice = await getTokenPrice( - token.contract, - USDC?.contract!, - sdkNetwork, - router - ); - - return { - ...token, - price: Number(tokenPrice || 0), - }; - }) - ); - - const result: Pool[] = await Promise.all( - data.map(async (pool) => { - const tokenA = tokens.find( - (token: TokenType) => token.contract === pool.tokenA - ); - - const tokenB = tokens.find( - (token: TokenType) => token.contract === pool.tokenB - ); - - const tokenAPrice = tokenA?.price || 0; - const tokenBPrice = tokenB?.price || 0; - - const tvl = getPoolTVL( - pool.reserveA, - pool.reserveB, - tokenAPrice, - tokenBPrice, - tokenA?.decimals, - tokenB?.decimals + data: MercuryPair[], + tokenList: TokenType[], + network: Network + ) => { + const sdkNetwork = stellarNetworkDict[network]; + + // Filter pools to ensure both tokens exist in the token list + const validPools = data.filter((pool) => { + const tokenAExists = tokenList.some((token) => token.contract === pool.tokenA); + const tokenBExists = tokenList.some((token) => token.contract === pool.tokenB); + return tokenAExists && tokenBExists; + }); + + const router = getRouterFromPools(validPools, sdkNetwork); + + // Ensure critical tokens (USDC, USDx) are available + const USDC = tokenList.find((token) => token.code === "USDC"); + const USDx = tokenList.find((token) => token.code === "USDx"); + + if (!USDC || !USDx) { + throw new Error("Critical tokens (USDC or USDx) are missing from the token list."); + } + + // Dynamic pricing control + const forceGetTokenPrice = true; + const staticTokenPrices: Record = { + [USDC.contract]: 1, + [USDx.contract]: 1, + }; + + const rsvch = await getMercuryRsvCh(network); + const events = await getMercuryEvents(network); + + + // Utility to fetch token price dynamically or use static price + const getTokenPriceOrStatic = async (tokenContract: string) => { + if (!tokenContract) return 0; + + if (!forceGetTokenPrice && staticTokenPrices[tokenContract] !== undefined) { + return staticTokenPrices[tokenContract]; + } + + return Number( + await getTokenPrice(tokenContract, USDC.contract, sdkNetwork, router, USDx.contract) ); - - const poolData = { - ...pool, - tokenA: tokenA - ? tokenA - : { contract: pool.tokenA, code: pool.tokenA, name: pool.tokenA }, - tokenB: tokenB - ? tokenB - : { contract: pool.tokenB, code: pool.tokenB, name: pool.tokenB }, - tokenAPrice, - tokenBPrice, - fees24h: 0, - feesYearly: 0, - tvl, - volume24h: 0, - volume7d: 0, - }; - - const tvlChartData = getPoolTVLChartData(rsvch, poolData); - const volumeChartData = getPoolVolumeChartData(events, poolData); - const feesChartData = getPoolFeesChartData(events, poolData); - - const nowTimestamp = new Date().getTime() / 1000; - - const volume7d = volumeChartData.reduce((acc, item) => { - const itemTimestamp = new Date(item.date).getTime() / 1000; - - if (nowTimestamp - itemTimestamp <= 7 * 24 * 3600) { - return acc + item.volume; - } - return acc; - }, 0); - - const volume24h = volumeChartData.reduce((acc, item) => { - const itemTimestamp = new Date(item.date).getTime() / 1000; - - if (nowTimestamp - itemTimestamp <= 24 * 3600) { - return acc + item.volume; - } - return acc; - }, 0); - - const fees24h = feesChartData.reduce((acc, item) => { - const itemTimestamp = new Date(item.date).getTime() / 1000; - - if (nowTimestamp - itemTimestamp < 24 * 3600) { - return acc + item.fees; - } - return acc; - }, 0); - - const fees7d = feesChartData.reduce((acc, item) => { - const itemTimestamp = new Date(item.date).getTime() / 1000; - - if (nowTimestamp - itemTimestamp < 7 * 24 * 3600) { - return acc + item.fees; - } - return acc; - }, 0); - - const feesYearly = fees7d * 52; - - return { - ...poolData, - tvlChartData, - volumeChartData, - feesChartData, - volume7d, - volume24h, - fees24h, - feesYearly, - }; - }) - ); - - return result; -}; + }; + + const result: Array = await Promise.all( + validPools.map(async (pool) => { + // Fetch token information + const tokenA = tokenList.find((token) => token.contract === pool.tokenA)!; + const tokenB = tokenList.find((token) => token.contract === pool.tokenB)!; + console.log("tokenA", tokenA); + console.log("tokenB", tokenB); + console.log("events", events); + + // Fetch token prices + const tokenAPrice = await getTokenPriceOrStatic(tokenA.contract); + const tokenBPrice = await getTokenPriceOrStatic(tokenB.contract); + console.log("tokenAPrice", tokenAPrice); + console.log("tokenBPrice", tokenBPrice); + + + // Calculate TVL + const tvl = getPoolTVL( + pool.reserveA, + pool.reserveB, + tokenAPrice, + tokenBPrice, + tokenA.decimals, + tokenB.decimals + ); + + const poolData = { + ...pool, + tokenA, + tokenB, + tokenAPrice, + tokenBPrice, + fees24h: 0, + feesYearly: 0, + tvl, + volume24h: 0, + volume7d: 0, + }; + + // Generate chart data + const tvlChartData = getPoolTVLChartData(rsvch, poolData); + const volumeChartData = getPoolVolumeChartData(events, poolData); + const feesChartData = getPoolFeesChartData(events, poolData); + + // Fix potential volume calculation errors + const nowTimestamp = new Date().getTime() / 1000; + + const volume7d = volumeChartData.reduce((acc, item) => { + const itemTimestamp = new Date(item.date).getTime() / 1000; + + if (nowTimestamp - itemTimestamp <= 7 * 24 * 3600) { + return acc + (item.volume || 0); // Ensure valid volume values + } + return acc; + }, 0); + + const volume24h = volumeChartData.reduce((acc, item) => { + const itemTimestamp = new Date(item.date).getTime() / 1000; + + if (nowTimestamp - itemTimestamp <= 24 * 3600) { + return acc + (item.volume || 0); // Ensure valid volume values + } + return acc; + }, 0); + + const fees24h = feesChartData.reduce((acc, item) => { + const itemTimestamp = new Date(item.date).getTime() / 1000; + + if (nowTimestamp - itemTimestamp < 24 * 3600) { + return acc + (item.fees || 0); // Ensure valid fees values + } + return acc; + }, 0); + + const fees7d = feesChartData.reduce((acc, item) => { + const itemTimestamp = new Date(item.date).getTime() / 1000; + + if (nowTimestamp - itemTimestamp < 7 * 24 * 3600) { + return acc + (item.fees || 0); // Ensure valid fees values + } + return acc; + }, 0); + + const feesYearly = fees7d * 52; + + return { + ...poolData, + tvlChartData, + volumeChartData, + feesChartData, + volume7d, + volume24h, + fees24h, + feesYearly, + }; + }) + ); + + return result; + }; + export const getDate = (timestamp: string) => { return new Date(parseInt(timestamp) * 1000).toISOString().split("T")[0]; @@ -321,6 +340,13 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { pool?.tokenA.decimals, pool?.tokenB.decimals ); + // // Parsear el timestamp + // const readableDate = new Date(e.timestamp * 1000).toLocaleString(); // Convierte a una fecha legible + // console.log(`Transacción en fecha: ${readableDate}`); + // console.log(`Hash de la transacción: ${e.txHash}`); // <-- Aquí se muestra el hash + // console.log(`Token A: ${pool.tokenA.code}, Precio: ${pool.tokenAPrice}`); + // console.log(`Token B: ${pool.tokenB.code}, Precio: ${pool.tokenBPrice}`); + // console.log(`Volúmenes calculados:`, volumes); return { timestamp: e.timestamp, From 712f3b26f3b60800461606d595070c30b90646c9 Mon Sep 17 00:00:00 2001 From: "daniel.andrade1991@gmail.com" Date: Thu, 5 Dec 2024 13:44:23 -0300 Subject: [PATCH 4/6] fix filter --- src/utils/info/pools/index.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/utils/info/pools/index.ts b/src/utils/info/pools/index.ts index 16027a5..f8788d7 100644 --- a/src/utils/info/pools/index.ts +++ b/src/utils/info/pools/index.ts @@ -63,8 +63,8 @@ export const buildPoolsInfo = async ( const rsvch = await getMercuryRsvCh(network); const events = await getMercuryEvents(network); + - // Utility to fetch token price dynamically or use static price const getTokenPriceOrStatic = async (tokenContract: string) => { if (!tokenContract) return 0; @@ -74,7 +74,7 @@ export const buildPoolsInfo = async ( } return Number( - await getTokenPrice(tokenContract, USDC.contract, sdkNetwork, router, USDx.contract) + await getTokenPrice(tokenContract, USDC.contract, sdkNetwork, router) ); }; @@ -83,16 +83,11 @@ export const buildPoolsInfo = async ( // Fetch token information const tokenA = tokenList.find((token) => token.contract === pool.tokenA)!; const tokenB = tokenList.find((token) => token.contract === pool.tokenB)!; - console.log("tokenA", tokenA); - console.log("tokenB", tokenB); - console.log("events", events); - + // Fetch token prices const tokenAPrice = await getTokenPriceOrStatic(tokenA.contract); const tokenBPrice = await getTokenPriceOrStatic(tokenB.contract); - console.log("tokenAPrice", tokenAPrice); - console.log("tokenBPrice", tokenBPrice); - + // Calculate TVL const tvl = getPoolTVL( From de6e4e0595038a346e24e4903e2bf81cce2411c9 Mon Sep 17 00:00:00 2001 From: "daniel.andrade1991@gmail.com" Date: Thu, 5 Dec 2024 15:18:34 -0300 Subject: [PATCH 5/6] fix .env.example --- .env.example | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..95a2d08 --- /dev/null +++ b/.env.example @@ -0,0 +1,14 @@ +NEXT_PUBLIC_SOROSWAP_APP_URL=https://app.soroswap.finance + +#Mercury MAINNET +MERCURY_EMAIL_MAINNET= +MERCURY_PASSWORD_MAINNET= +MERCURY_BACKEND_ENDPOINT_MAINNET=https://mainnet.mercurydata.app +MERCURY_GRAPHQL_ENDPOINT_MAINNET=https://mainnet.mercurydata.app:2083 + +#Mercury TESTNET +MERCURY_EMAIL_TESTNET= +MERCURY_PASSWORD_TESTNET= +MERCURY_BACKEND_ENDPOINT_TESTNET=https://api.mercurydata.app:8443 +MERCURY_GRAPHQL_ENDPOINT_TESTNET=https://api.mercurydata.app:2083 + From 96835d1f9a51e225030812f700af6e7a39433fcc Mon Sep 17 00:00:00 2001 From: "daniel.andrade1991@gmail.com" Date: Thu, 5 Dec 2024 22:30:18 -0300 Subject: [PATCH 6/6] Fix: Cleaned code and prepared for review --- src/utils/info/pools/index.ts | 16 ++-------------- src/zephyr/helpers.ts | 29 ----------------------------- 2 files changed, 2 insertions(+), 43 deletions(-) diff --git a/src/utils/info/pools/index.ts b/src/utils/info/pools/index.ts index f8788d7..75bf24b 100644 --- a/src/utils/info/pools/index.ts +++ b/src/utils/info/pools/index.ts @@ -300,10 +300,9 @@ export const getPoolFees = ( }; export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { - // Filtrar eventos de tipo "swap" relacionados con el pool const poolEvents = events.filter((e) => { return ( - e.eType === "swap" && // Verificar que sea un evento de tipo "swap" + e.eType === "swap" && ( (e.tokenA === pool?.tokenA.contract && e.tokenB === pool?.tokenB.contract) || (e.tokenA === pool?.tokenB.contract && e.tokenB === pool?.tokenA.contract) @@ -311,7 +310,6 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { ); }); - // Ordenar los tokens si están en orden inverso const orderedPoolEvents = poolEvents.map((e) => { if (e.tokenA === pool?.tokenB.contract && e.tokenB === pool?.tokenA.contract) { return { @@ -325,7 +323,6 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { return e; }); - // Calcular el volumen para cada evento const volumeChartData = orderedPoolEvents.map((e) => { const volumes = getPoolVolume( e.amountA, @@ -335,27 +332,18 @@ export const getPoolVolumeChartData = (events: MercuryEvent[], pool: Pool) => { pool?.tokenA.decimals, pool?.tokenB.decimals ); - // // Parsear el timestamp - // const readableDate = new Date(e.timestamp * 1000).toLocaleString(); // Convierte a una fecha legible - // console.log(`Transacción en fecha: ${readableDate}`); - // console.log(`Hash de la transacción: ${e.txHash}`); // <-- Aquí se muestra el hash - // console.log(`Token A: ${pool.tokenA.code}, Precio: ${pool.tokenAPrice}`); - // console.log(`Token B: ${pool.tokenB.code}, Precio: ${pool.tokenBPrice}`); - // console.log(`Volúmenes calculados:`, volumes); return { timestamp: e.timestamp, date: getDate(e.timestamp), - volume: volumes.volumeA + volumes.volumeB, // Volumen total del evento + volume: volumes.volumeA + volumes.volumeB, valueA: volumes.volumeA, valueB: volumes.volumeB, }; }); - // Llenar los datos faltantes para el gráfico (p.ej., días sin eventos) const filledVolumeChartData = fillChart(volumeChartData, "volume", false); - // Retornar los datos completos como `VolumeChartData` return filledVolumeChartData as VolumeChartData[]; }; diff --git a/src/zephyr/helpers.ts b/src/zephyr/helpers.ts index fd5a580..c27c11a 100644 --- a/src/zephyr/helpers.ts +++ b/src/zephyr/helpers.ts @@ -14,14 +14,11 @@ export const parseScvalValue = (value: any) => { }; export const parseMercuryScvalResponse = (data: any) => { - // console.log("Raw data to parse (first 5):", data.slice(0, 5)); - return data?.map((d: any) => { let n: any = {}; for (let key in d) { const value = parseScvalValue(d[key]); - // console.log(`Parsing field ${key} (first 5):`, value); if (typeof value === "bigint" || typeof value === "number") { n[key] = value.toString(); @@ -30,9 +27,7 @@ export const parseMercuryScvalResponse = (data: any) => { if(txHash.length != 64) throw new Error('Invalid txHash length'); n[key] = txHash; } else if(key == 'eType') { - // Asegurarnos que eType sea un string válido y esté normalizado const eventType = String(value).toLowerCase(); - // console.log("Parsed event type:", eventType); n[key] = eventType; } else { n[key] = value; @@ -50,8 +45,6 @@ export const getMercuryPools = async (network: Network) => { request: GET_ALL_PAIRS(soroswap_pairs), }); - // console.log("Raw Mercury Pools Response (first 5):", response.data?.events?.data.slice(0, 5)); - if (!response.ok) { return []; } @@ -60,8 +53,6 @@ export const getMercuryPools = async (network: Network) => { response.data?.events?.data ); - // console.log("Parsed Mercury Pools (first 5):", parsedData.slice(0, 5)); - return parsedData; }; @@ -72,8 +63,6 @@ export const getMercuryPhoenixPools = async (network: Network) => { request: GET_ALL_PAIRS(phoenix_pairs), }); - // console.log("Raw Mercury Phoenix Pools Response (first 5):", response.data?.events?.data.slice(0, 5)); - if (!response.ok) { return []; } @@ -82,8 +71,6 @@ export const getMercuryPhoenixPools = async (network: Network) => { response.data?.events?.data ); - // console.log("Parsed Mercury Phoenix Pools (first 5):", parsedData.slice(0, 5)); - return parsedData; }; @@ -94,8 +81,6 @@ export const getMercuryAquaPools = async (network: Network) => { request: GET_ALL_PAIRS(aqua_pairs), }); - // console.log("Raw Mercury Aqua Pools Response (first 5):", response.data?.events?.data.slice(0, 5)); - if (!response.ok) { return []; } @@ -104,8 +89,6 @@ export const getMercuryAquaPools = async (network: Network) => { response.data?.events?.data ); - // console.log("Parsed Mercury Aqua Pools (first 5):", parsedData.slice(0, 5)); - return parsedData; }; @@ -123,8 +106,6 @@ export const getMercuryRsvCh = async (network: Network) => { request: GET_ALL_RSV_CH(soroswap_rsv_ch), }); - // console.log("Raw Mercury RsvCh Response (first 5):", response.data?.events?.data.slice(0, 5)); - if (!response.ok) { return []; } @@ -133,8 +114,6 @@ export const getMercuryRsvCh = async (network: Network) => { response.data?.events?.data ); - // console.log("Parsed Mercury RsvCh (first 5):", parsedData.slice(0, 5)); - return parsedData; }; @@ -142,16 +121,11 @@ export const getMercuryEvents = async (network: Network) => { const mercuryInstance = getMercuryInstance(network); const { soroswap_events } = await fetchZephyrTables({ network }); - console.log("Fetching events from table:", soroswap_events); - const response = await mercuryInstance.getCustomQuery({ request: GET_ALL_EVENTS(soroswap_events), }); - // console.log("Raw Mercury Events Response (first 5):", response.data?.events?.data.slice(0, 5)); - if (!response.ok) { - console.error("Error fetching Mercury events:", response); return []; } @@ -159,8 +133,5 @@ export const getMercuryEvents = async (network: Network) => { response.data?.events?.data ); - // console.log("Parsed Mercury Events (first 5):", parsedData.slice(0, 5)); - // console.log("Event types present (first 5):", [...new Set(parsedData.map(e => e.eType))].slice(0, 5)); - return parsedData; };