diff --git a/projects/hyperbeat/index.js b/projects/hyperbeat/index.js index a05d43ecb11..77a3c4cbe19 100644 --- a/projects/hyperbeat/index.js +++ b/projects/hyperbeat/index.js @@ -1,9 +1,5 @@ const { sumERC4626VaultsExport } = require('../helper/erc4626'); -const liquidHypeStrategist = "0x83a80e5b64086197c01cbb123df2aea79a149c1d" -const oracle = "0x1ceab703956e24b18a0af6b272e0bf3f499aca0f" -const beHype = "0xd8FC8F0b03eBA61F64D08B0bef69d80916E5DdA9" - const config = { morphoVaults: { '0x5eEC795d919FA97688Fb9844eeB0072E6B846F9d': '0x5d3a1ff2b6bab83b63cd9ad0787074081a52ef34', @@ -21,18 +17,33 @@ const config = { '0x08C00F8279dFF5B0CB5a04d349E7d79708Ceadf3': '0xb88339cb7199b77e23db6e890353e22632ba630f', // Gauntlet USDC '0x4851D4891321035729713D43bE1F4bb883Dffd34': '0xb88339cb7199b77e23db6e890353e22632ba630f', // MEV USDC }, - standaloneVaults: { + midasVaults: { '0x5e105266db42f78fa814322bce7f388b4c2e61eb': '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb', // USDT0 '0x6EB6724D8D3D4FF9E24d872E8c38403169dC05f8': '0xf4D9235269a96aaDaFc9aDAe454a0618eBE37949', // xAUT - '0x81e064d0eB539de7c3170EDF38C1A42CBd752A76': '0x5555555555555555555555555555555555555555', // lstHYPE - '0x441794D6a8F9A3739F5D4E98a728937b33489D29': '0x5555555555555555555555555555555555555555', // liquidHYPE - '0xD66d69c288d9a6FD735d7bE8b2e389970fC4fD42': '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb', // wVLP + '0xD66d69c288d9a6FD735d7bE8b2e389970fC4fD42': '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb', // wVLP '0x949a7250Bb55Eb79BC6bCC97fCd1C473DB3e6F29': '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb', // dnHYPE '0x8858A307a85982c2B3CB2AcE1720237f2f09c39B': '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb', // dnPUMP - // '0xd8FC8F0b03eBA61F64D08B0bef69d80916E5DdA9': '0x5555555555555555555555555555555555555555', // beHYPE → lst adapter '0x057ced81348D57Aad579A672d521d7b4396E8a61': '0xb88339CB7199b77E23DB6E890353E22632Ba630f', //hbUSDC + '0x441794D6a8F9A3739F5D4E98a728937b33489D29': '0x5555555555555555555555555555555555555555', // liquidHYPE + '0x81e064d0eB539de7c3170EDF38C1A42CBd752A76': '0x5555555555555555555555555555555555555555', // lstHYPE + }, + midasVaultTokenOracles: { + '0x5e105266db42f78fa814322bce7f388b4c2e61eb': '0xac3d811f5ff30aa3ab4b26760d0560faf379536a', // USDT0 + '0x6EB6724D8D3D4FF9E24d872E8c38403169dC05f8': '0xf3dB9f59f9C90495D1c9556fC5737A679720921d', // xAUT + '0xD66d69c288d9a6FD735d7bE8b2e389970fC4fD42': '0xA9fFe62E785324cb39cB5E2B3Ef713674391d31F', // wVLP + '0x949a7250Bb55Eb79BC6bCC97fCd1C473DB3e6F29': '0xEB3459316211aB3e2bfee836B989f50fe08AA469', // dnHYPE + '0x8858A307a85982c2B3CB2AcE1720237f2f09c39B': '0x707e99655f24747cECEB298B3AAF7FA721EC77fC', // dnPUMP + '0x057ced81348D57Aad579A672d521d7b4396E8a61': '0xc82CAd78983436BddfcAf0F21316207D87b87462', //hbUSDC + '0x441794D6a8F9A3739F5D4E98a728937b33489D29': '0x1CeaB703956e24b18a0AF6b272E0bF3F499aCa0F', // liquidHYPE + '0x81e064d0eB539de7c3170EDF38C1A42CBd752A76': '0x2b959a9Deb8e62FaaEA1b226F3bbcbcC0Af31560', // lstHYPE + }, + hyperbeatInfraVaults: { '0x4Cc221cf1444333510a634CE0D8209D2D11B9bbA': '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb', // nLP + }, + hyperbeatInfraVaultTokenOracles: { + '0x4Cc221cf1444333510a634CE0D8209D2D11B9bbA': '0xC23cdFe493bB5E69bedfCF6E710f508710ac668B', // nLP } + } const sixDecimalTokens = [ @@ -42,38 +53,69 @@ const sixDecimalTokens = [ '0xb88339cb7199b77e23db6e890353e22632ba630f', // USDC ] -const unwrapBeHype = async (api, underlying, supply) => { - const [lastAnswer, beHypeBalance] = await Promise.all([ - api.call({ target: oracle, abi: 'uint256:lastAnswer' }), - api.call({ target: beHype, params: [liquidHypeStrategist], abi: 'erc20:balanceOf' }) - ]) - const beHypeToHypeShare = beHypeBalance * lastAnswer / 1e8 - api.add(underlying, supply-beHypeToHypeShare) // subtraction of beHype’s share present in the vault - api.add(beHype, beHypeBalance) +const tvlMidasVaults = async (api) => { + const { midasVaults = {}, midasVaultTokenOracles = {} } = config + const vaultTokens = Object.keys(midasVaults) + const supplies = await api.multiCall({ calls: vaultTokens, abi: 'erc20:totalSupply' }) + const tokenOracles = Object.values(midasVaultTokenOracles) + const exchangeRates = await api.multiCall({ calls: tokenOracles, abi: 'int256:lastAnswer' }) + + + for (const [index, vault] of vaultTokens.entries()) { + const underlying = midasVaults[vault].toLowerCase() + + const tvlInToken = sixDecimalTokens.includes(underlying) ? supplies[index] * exchangeRates[index] / 1e20 : supplies[index] * exchangeRates[index] / 1e8; + + api.add(underlying, tvlInToken) + } + + +} +const tvlHyperbeatInfraVaults = async (api) => { + const { hyperbeatInfraVaults = {}, hyperbeatInfraVaultTokenOracles = {} } = config + const vaultTokens = Object.keys(hyperbeatInfraVaults) + const supplies = await api.multiCall({ calls: vaultTokens, abi: 'erc20:totalSupply' }) + const tokenOracles = Object.values(hyperbeatInfraVaultTokenOracles) + const exchangeRates = await api.multiCall({ calls: tokenOracles, abi: 'int128:getRate' }) + for (const [index, vault] of vaultTokens.entries()) { + const underlying = hyperbeatInfraVaults[vault].toLowerCase() + const tvlInToken = supplies[index] * exchangeRates[index] / 1e8; + api.add(underlying, tvlInToken) + } } -const tvl = async (api) => { - const { morphoVaults = {}, standaloneVaults = {} } = config - const vaultToUnderlyings = { ...morphoVaults, ...standaloneVaults } +const morphoBeatTvl = async (api) => { + const { morphoVaults = {} } = config + const vaultToUnderlyings = { ...morphoVaults } const vaults = Object.keys(vaultToUnderlyings) - const supplies = await api.multiCall({ calls: vaults, abi: 'erc20:totalSupply' }) + const assets = await api.multiCall({ + abi: "function asset() view returns (address)", + calls: vaults, + }); - for (const [index, vault] of vaults.entries()) { - const underlying = vaultToUnderlyings[vault].toLowerCase() - const supply = supplies[index] + const totalAssets = await api.multiCall({ + abi: "function totalAssets() view returns (uint256)", + calls: vaults, + }); - if (vault == "0x441794D6a8F9A3739F5D4E98a728937b33489D29") { - await unwrapBeHype(api, underlying, supply); - continue + assets.forEach((asset, i) => { + if (asset && totalAssets[i]) { + api.add(asset, totalAssets[i]); } + }); + +} + +const tvl = async (api) => { + + await tvlMidasVaults(api) + await tvlHyperbeatInfraVaults(api) + await morphoBeatTvl(api) - const scaled = sixDecimalTokens.includes(underlying) ? supply / 1e18 * 1e6 : supply - api.add(underlying, scaled) - } - return sumERC4626VaultsExport({ vaults: ['0x96C6cBB6251Ee1c257b2162ca0f39AA5Fa44B1FB', '0xc061d38903b99aC12713B550C2CB44B221674F94'], isOG4626: true })(api) + return sumERC4626VaultsExport({ vaults: ['0x96C6cBB6251Ee1c257b2162ca0f39AA5Fa44B1FB', '0xc061d38903b99aC12713B550C2CB44B221674F94'], isOG4626: true })(api) } module.exports = {