From be4b2d5ef7e669e8ff4efa4f54535303abd20d59 Mon Sep 17 00:00:00 2001 From: g1nt0ki <99907941+g1nt0ki@users.noreply.github.com> Date: Tue, 21 Oct 2025 10:28:16 +0200 Subject: [PATCH] fix dyson tvl --- projects/dyson-money/index.js | 118 ++++++++++++++++------------------ 1 file changed, 54 insertions(+), 64 deletions(-) diff --git a/projects/dyson-money/index.js b/projects/dyson-money/index.js index 6d600f37f..156f63468 100644 --- a/projects/dyson-money/index.js +++ b/projects/dyson-money/index.js @@ -1,8 +1,7 @@ +const { getConfig } = require('../helper/cache'); const ADDRESSES = require('../helper/coreAssets.json') -const { staking } = require('../helper/staking') +const { staking } = require('../helper/staking'); const { sumTokens2 } = require('../helper/unwrapLPs'); -const utils = require('../helper/utils'); -const { toUSDTBalances } = require('../helper/balances'); const TVL_URL = 'https://api2.dyson.money/vaults/metrics/tvl'; @@ -11,14 +10,13 @@ const sphere_token = "0x62F594339830b90AE4C084aE7D223fFAFd9658A7" const ylSPHEREvault = "0x4Af613f297ab00361D516454E5E46bc895889653" -let TVL_byNetwork; +module.exports = { + doublecounted: true, + methodology: "Counts the tokens locked in the contracts.", +}; -async function polygonTvl(timestamp, block, chainBlocks) { - let balances = {}; - - // add tokens in ylSPHERE vault - await sumTokens2({ - balances, +const config = { + polygon: { owners: [ylSPHEREvault], tokens: [ ADDRESSES.polygon.WMATIC_2, @@ -28,61 +26,53 @@ async function polygonTvl(timestamp, block, chainBlocks) { ADDRESSES.polygon.WBTC, "0x172370d5Cd63279eFa6d502DAB29171933a610AF" ], - chain: 'polygon', - block: chainBlocks.polygon - }) - - // calculate TVL for polygon from API - const polygon_tvl = await fetchNetworkTVL('polygon')(); - for (const [token, balance] of Object.entries(polygon_tvl)) { - balances[token] = (balances[token] || 0) + balance - } - return balances; -} - -function fetchNetworkTVL(network) { - return async () => { - try { - if(!TVL_byNetwork) TVL_byNetwork = utils.fetchURL(`${TVL_URL}`).then(response => response.data); - - const response = await TVL_byNetwork; - const total = Number(response[network].total); // all numeric values on the API are stored as string for precision - - if(!total) return {} - - return toUSDTBalances(total); - } catch(e) { - console.error(`There was an error trying to fetch 'dyson-money' TVL on network - ${network}. Exited with error: ${e}`); - return {}; - } - } + staking: staking(ylSPHEREvault, sphere_token), + }, + optimism: {}, + arbitrum: { + blacklistedVaults: [ + '0x5e14aa6dd1606e789be9de8ded0b78b36d1fa4a3', + '0x3b443e9b9b7f340c7b1417abfdc64132341873d4', + ] + }, + bsc: { key: 'binance' }, + avax: { key: 'avalanche', + blacklistedVaults: ['0xe5b584f5f8b2872202433d56299e3867ba246c6e', '0xe98786b94520772dd9efcc670d72939e184a6198'], + }, + kava: { + blacklistedVaults: ['0x489e54eec6c228a1457975eb150a7efb8350b5be'], + }, + base: {}, } +Object.keys(config).forEach(chain => { + let { key, owners, tokens, staking, blacklistedVaults = []} = config[chain] + blacklistedVaults = new Set(blacklistedVaults.map(i => i.toLowerCase())) -module.exports = { - doublecounted: true, - methodology: "Counts the tokens locked in the contracts.", - polygon: { - tvl: polygonTvl, - staking: staking(ylSPHEREvault, sphere_token) - }, - optimism: { - tvl: fetchNetworkTVL('optimism'), - }, - arbitrum: { - tvl: fetchNetworkTVL('arbitrum'), - }, - bsc: { - tvl: fetchNetworkTVL('binance') - }, - avax: { - tvl: fetchNetworkTVL('avalanche') - }, - kava: { - tvl: fetchNetworkTVL('kava'), - }, - base: { - tvl: fetchNetworkTVL('base'), - }, -}; + module.exports[chain] = { + tvl: async (api) => { + if (owners && tokens) await api.sumTokens({ owners, tokens, }) + const config = await getConfig('dyson-money/api2', 'https://api2.dyson.money/vaults') + const chainConfig = key ? config[key] : config[chain] + let vaultsAll = Object.values(chainConfig ?? {}).map(i => i.address).filter(i => !blacklistedVaults.has(i.toLowerCase())) + let vaults1 = [] + let vaults2 = [] + + const isVault1 = await api.multiCall({ abi: 'address:want', calls: vaultsAll, permitFailure: true }) + isVault1.forEach((v, i) => { + if (v) vaults1.push(vaultsAll[i]) + else vaults2.push(vaultsAll[i]) + }); + + const token = await api.multiCall({ abi: 'address:want', calls: vaults1 }) + const balance = await api.multiCall({ abi: 'uint256:balance', calls: vaults1 }) + const token2 = await api.multiCall({ abi: 'address:underlying', calls: vaults2 }) + const balance2 = await api.multiCall({ abi: 'uint256:underlyingBalanceWithInvestment', calls: vaults2 }) + api.add(token, balance) + api.add(token2, balance2) + return sumTokens2({ api, resolveLP: true, }) + } + } + if (staking) module.exports[chain].staking = staking +}) \ No newline at end of file