diff --git a/projects/TurtleClub/assets.js b/projects/TurtleClub/assets.js index a93f8afa6b..e51b149c03 100644 --- a/projects/TurtleClub/assets.js +++ b/projects/TurtleClub/assets.js @@ -96,6 +96,8 @@ const tokens = { WBTC: '0x3aAB2285ddcDdaD8edf438C1bAB47e1a9D05a9b4', FOXY: '0x5FBDF89403270a1846F5ae7D113A989F850d1566', CROAK: '0xaCb54d07cA167934F57F829BeE2cC665e1A5ebEF', + REX33: '0xe4eeb461ad1e4ef8b8ef71a33694ccd84af051c4', + xREX: '0xc93b315971a4f260875103f5da84cb1e30f366cc', z0weETH: '0x77E305B4D4D3b9DA4e82Cefd564F5b948366A44b', // TODO all ZeroLend not priced properly z0WETH: '0xB4FFEf15daf4C02787bC5332580b838cE39805f5', z0ezETH: '0x0684FC172a0B8e6A65cF4684eDb2082272fe9050', @@ -137,7 +139,16 @@ const tokens = { } }; -const exceptions = { +const tokenMapping = { + linea: { + [tokens.linea.xREX]: { + coingeckoId: 'etherex', + decimals: 18, + }, + }, +} + +const tokenMappingERC20 = { ethereum: [ { token: tokens.ethereum.rEUL, use: tokens.ethereum.EUL }, { token: tokens.ethereum.ezREZ, use: tokens.ethereum.REZ }, // TODO ezREZ not priced properly @@ -146,6 +157,8 @@ const exceptions = { ], linea: [ { token: tokens.linea.oLYNX, use: tokens.linea.LYNX }, + { token: tokens.linea.xREX, coingeckoId: "etherex", decimals: 18 }, + { token: tokens.linea.REX33, coingeckoId: "etherex", decimals: 18 }, // { token: tokens.linea.z0WETH, use: tokens.linea.ETH }, // { token: tokens.linea.z0ezETH, use: tokens.linea.ETH }, // { token: tokens.linea.z0rsETH, use: tokens.linea.ETH }, @@ -190,13 +203,18 @@ const vaultContracts = [ '0x294eecec65A0142e84AEdfD8eB2FBEA8c9a9fbad', // tacETH '0x6Bf340dB729d82af1F6443A0Ea0d79647b1c3DDf', // tacBTC '0x699e04F98dE2Fc395a7dcBf36B48EC837A976490', // tacUSD + '0xbca723C30d55F0915e32019a95AA29ea21fd555C', // Lagoon WETH + '0x423b469268b15821107C38d1E1f702877219bc52', // Lagoon WBTC + '0xd56031b6E6860Bd41dCe2729D1beD21c387B26ce', // Lagoon USDC + '0xE0dfbE4748eD96350754f1328679bd9647bf9621', // Lagoon USDT ]; module.exports = { defaultTokens, tokens, treasuryMultisigs, - exceptions, + tokenMapping, + tokenMappingERC20, treasuryNFTs, vaultContracts, }; diff --git a/projects/TurtleClub/index.js b/projects/TurtleClub/index.js index 7bad1b6f4e..6af99d0cd6 100644 --- a/projects/TurtleClub/index.js +++ b/projects/TurtleClub/index.js @@ -1,7 +1,7 @@ const { sumTokensExport } = require("../helper/unwrapLPs"); const { tokens, vaultContracts } = require("./assets"); -const plainTokens = Object.values(tokens).map(chain => Object.values(chain)).flat(1); +const plainTokens = Object.values(tokens).flatMap(chain => Object.values(chain)); module.exports = { // All vaults currently ethereum diff --git a/projects/treasury/turtleclub.js b/projects/treasury/turtleclub.js index 7d5da7010a..4b4c260c87 100644 --- a/projects/treasury/turtleclub.js +++ b/projects/treasury/turtleclub.js @@ -1,4 +1,4 @@ -const { tokens, treasuryMultisigs, treasuryNFTs, defaultTokens, exceptions } = require('../TurtleClub/assets'); +const { tokens, treasuryMultisigs, treasuryNFTs, defaultTokens, tokenMappingERC20, tokenMapping } = require('../TurtleClub/assets'); const { ankrChainMapping } = require('../helper/token'); const { sumTokens2, unwrapSolidlyVeNft } = require('../helper/unwrapLPs'); const SOLIDLY_VE_NFT_ABI = require('../helper/abis/solidlyVeNft.json'); @@ -13,7 +13,7 @@ function formatForTreasuryExport(tokens = {}) { return treasuryExportsFormat; } -async function sumPositions(api, NFTs) { +async function sumNFTs(api, NFTs) { const waitNFTs = []; for (const treasuryNFT of NFTs) { const { veNft, owner, baseToken, useLocked = true } = treasuryNFT; @@ -50,9 +50,12 @@ function turtleTreasuryExports(config, treasuryNFTs) { } const tvl = async (api) => { - if (exceptions[chain]?.length > 0) { + if (tokenMappingERC20[chain]?.length > 0) { const es = []; - exceptions[chain].forEach(async ({ token, use }) => { + tokenMappingERC20[chain].forEach(async ({ token, use, coingeckoId, decimals }) => { + const balanceLogic = coingeckoId ? + bal => api.add(coingeckoId, bal / (10 ** decimals), { skipChain: true }) : + bal => api.add(use, bal); es.push((async () => { const balances = await api.multiCall({ abi: 'erc20:balanceOf', @@ -62,14 +65,29 @@ function turtleTreasuryExports(config, treasuryNFTs) { })), permitFailure: true }); - balances.filter(b => b !== '0' && !!b).forEach(bal => api.add(use, bal)); + balances.filter(b => b !== '0' && !!b).map(bal => Number(bal)).forEach(balanceLogic); })()); }); await Promise.allSettled(es); } + const xRexAddr = tokens.linea.xREX; + const xRexStakedBalances = await api.multiCall({ + abi: 'function balanceOf(address) view returns (uint256)', + calls: treasuryMultisigs.map(owner => ({ params: [owner] })), + target: '0xedd7cbc9c47547d0b552d5bc2be76135f49c15b1', // VoteModule staking contract + permitFailure: true, + }); + xRexStakedBalances.filter(b => b && b !== '0').map(bal => Number(bal)).forEach(balance => { + const xRexMapping = tokenMapping.linea[xRexAddr]; + if (xRexMapping) + api.add(xRexMapping.coingeckoId, balance / (10 ** xRexMapping.decimals), { skipChain: true }); + else + api.add(xRexAddr, balance); + }); + await sumTokens2({ ...api, api, ...tvlConfig }); - if (treasuryNFTs[chain]?.length > 0) await sumPositions(api, treasuryNFTs[chain]); + if (treasuryNFTs[chain]?.length > 0) await sumNFTs(api, treasuryNFTs[chain]); }; exportObj[chain] = { tvl }; }