From 8365898d3d12256490c29d066bd8f1e2d8e1b5ff Mon Sep 17 00:00:00 2001 From: vik Date: Fri, 25 Apr 2025 18:22:04 +0300 Subject: [PATCH 1/4] feat: add yuzu-finance adapter --- src/adaptors/yuzu-finance/index.ts | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/adaptors/yuzu-finance/index.ts diff --git a/src/adaptors/yuzu-finance/index.ts b/src/adaptors/yuzu-finance/index.ts new file mode 100644 index 0000000000..a315c0d0b8 --- /dev/null +++ b/src/adaptors/yuzu-finance/index.ts @@ -0,0 +1,81 @@ +const utils = require('../utils'); + +const YUZU_API_URL_BASE = 'https://mainnet-api.yuzu.finance/v1'; + +async function getPools() { + const pageSize = 100; + let currentPage = 1; + let allPools = []; + + while (true) { + const response = await utils.getData( + `${YUZU_API_URL_BASE}/pools?page=${currentPage}&pageSize=${pageSize}` + ); + + if (!response?.data || response.data.length === 0) { + break; + } + + allPools = allPools.concat(response.data); + + // If we've fetched all pools, break + if (allPools.length >= response.total) { + break; + } + + currentPage++; + } + + return allPools; +} + +async function getTokens() { + const response = await utils.getData( + `${YUZU_API_URL_BASE}/tokens?pageSize=100` + ); + + if (!response?.data) { + return []; + } + + return response.data; +} + +async function main() { + // We're not using on-chain RPC requests here due to the rate limiting and instability of both official and third party RPCs and using our own load-balanced API. + const pools = await getPools(); + const tokens = await getTokens(); + + const defiLlamaPools = pools + .map((pool) => { + // Skip pools with TVL < 10K USD + if (parseFloat(pool.tvl) < 10000) return null; + + const token0 = tokens.find((token) => token.metadata === pool.token0); + const token1 = tokens.find((token) => token.metadata === pool.token1); + const symbol = + token0 && token1 ? `${token0.symbol}-${token1.symbol}` : 'unknown'; + + return { + pool: pool.poolAddr + '-move', + chain: utils.formatChain('move'), + project: 'yuzu-finance', + symbol, + tvlUsd: parseFloat(pool.tvl), + apyBase: pool.feeApr, + apyReward: pool.rewardApr, + rewardTokens: + pool.rewardInfos?.map((reward) => reward.tokenMetadata) || [], + underlyingTokens: [pool.token0, pool.token1], + }; + }) + .filter(Boolean); // Remove null entries + + return defiLlamaPools; +} + +module.exports = { + timetravel: false, + apy: main, + url: `${YUZU_API_URL_BASE}/pools`, +}; From c7fa22a6a02bb17f0baef54fb37fd2765c6707b0 Mon Sep 17 00:00:00 2001 From: vik Date: Fri, 25 Apr 2025 18:26:41 +0300 Subject: [PATCH 2/4] fix: add missing percentage conversion --- src/adaptors/yuzu-finance/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/adaptors/yuzu-finance/index.ts b/src/adaptors/yuzu-finance/index.ts index a315c0d0b8..7263a51a42 100644 --- a/src/adaptors/yuzu-finance/index.ts +++ b/src/adaptors/yuzu-finance/index.ts @@ -62,8 +62,8 @@ async function main() { project: 'yuzu-finance', symbol, tvlUsd: parseFloat(pool.tvl), - apyBase: pool.feeApr, - apyReward: pool.rewardApr, + apyBase: pool.feeApr * 100, + apyReward: pool.rewardApr * 100, rewardTokens: pool.rewardInfos?.map((reward) => reward.tokenMetadata) || [], underlyingTokens: [pool.token0, pool.token1], From 20aa011a58d8433a0c2a8eb09e6e2b74aa42ec63 Mon Sep 17 00:00:00 2001 From: vik Date: Fri, 25 Apr 2025 18:30:51 +0300 Subject: [PATCH 3/4] fix: ensure unique reward tokens in yuzu-finance adapter --- src/adaptors/yuzu-finance/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/adaptors/yuzu-finance/index.ts b/src/adaptors/yuzu-finance/index.ts index 7263a51a42..36669daa13 100644 --- a/src/adaptors/yuzu-finance/index.ts +++ b/src/adaptors/yuzu-finance/index.ts @@ -64,8 +64,11 @@ async function main() { tvlUsd: parseFloat(pool.tvl), apyBase: pool.feeApr * 100, apyReward: pool.rewardApr * 100, - rewardTokens: - pool.rewardInfos?.map((reward) => reward.tokenMetadata) || [], + // Ensure unique reward tokens since the frontend allows adding the same token multiple times + // This prevents duplicate rewards from appearing in the DefiLlama dashboard + rewardTokens: Array.from( + new Set(pool.rewardInfos?.map((reward) => reward.tokenMetadata) || []) + ), underlyingTokens: [pool.token0, pool.token1], }; }) From acc9f6e01cb68ea1754af3b38bbb429c95b80aca Mon Sep 17 00:00:00 2001 From: vik Date: Fri, 25 Apr 2025 19:06:53 +0300 Subject: [PATCH 4/4] refactor: remove TVL filter from yuzu-finance adapter --- src/adaptors/yuzu-finance/index.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/adaptors/yuzu-finance/index.ts b/src/adaptors/yuzu-finance/index.ts index 36669daa13..eab9b93325 100644 --- a/src/adaptors/yuzu-finance/index.ts +++ b/src/adaptors/yuzu-finance/index.ts @@ -48,9 +48,6 @@ async function main() { const defiLlamaPools = pools .map((pool) => { - // Skip pools with TVL < 10K USD - if (parseFloat(pool.tvl) < 10000) return null; - const token0 = tokens.find((token) => token.metadata === pool.token0); const token1 = tokens.find((token) => token.metadata === pool.token1); const symbol =