diff --git a/projects/akronswap/index.js b/projects/akronswap/index.js new file mode 100644 index 00000000000..fea9a6e6afa --- /dev/null +++ b/projects/akronswap/index.js @@ -0,0 +1,17 @@ +const { getUniTVL } = require('../helper/unknownTokens'); + +module.exports = { + misrepresentedTokens: true, + ethereum:{ + tvl: getUniTVL({ factory: '0x6624Ac5F9abFA36174511607860e81C8dB9e84E9', useDefaultCoreAssets: true, fetchBalances: true, }), + }, + arbitrum:{ + tvl: getUniTVL({ factory: '0x40Cbdf84475f8Dd7C9a9c665eDE551EeaaF21F8d', useDefaultCoreAssets: true, fetchBalances: true, }), + }, + base:{ + tvl: getUniTVL({ factory: '0xD2156Bb9ed200FE88705443BfFcA788BA8b205f6', useDefaultCoreAssets: true, fetchBalances: true, }), + }, + bsc:{ + tvl: getUniTVL({ factory: '0x40Cbdf84475f8Dd7C9a9c665eDE551EeaaF21F8d', useDefaultCoreAssets: true, fetchBalances: true, }), + }, +} \ No newline at end of file diff --git a/projects/cake-defi/index.js b/projects/cake-defi/index.js index da5cdbe6505..8d2bcba9ddc 100644 --- a/projects/cake-defi/index.js +++ b/projects/cake-defi/index.js @@ -3,11 +3,22 @@ const { cexExports } = require('../helper/cex') const config = { ethereum: { owners: [ + '0xc5a0a17eabbb0e64dcd567b5670c8c5d5c34128c', '0x94fa70d079d76279e1815ce403e9b985bccc82ac', + '0xb5e2d774c4672aa4297272f62d61e8a041175cb5', + '0x3ec49e613ae70beb0631d7666f46d4ff2813932e', + '0xC889Faf456439Fb932B9Ce3d4F43D8078177fD29', + '0x883C4599C455Fc337CA43BF9d63eBA45F995a769', + ], }, + polygon: { + owners: [ + '0xaa6c7eAF827E04185D7A6a6A6156195AB5BDBE4c', + ] + }, bitcoin: { - owners: ['38pZuWUti3vSQuvuFYs8Lwbyje8cmaGhrT'] + owners: ['3GcSHxkKY8ADMWRam51T1WYxYSb2vH62VL'] }, litecoin: { owners: ['MLYQxJfnUfVqRwfYXjDJfmLbyA77hqzSXE'] @@ -15,7 +26,8 @@ const config = { } module.exports = cexExports(config) -module.exports.methodology = 'As Cake DeFi is a CeDeFi platform, its assets associated to the staking nodes are not included for the purposes of the TVL calculation. In this case, there are approximately $121.4M in DFI chain (nodes), and around $24.7M in ETH chain (nodes) as of 31 March 2023. The calculation methodology are as follows: DFI: 10846 (nodes) * 20K (collateral per node) *$0.56 = $121.4M. ETH: 430 * 32 *$1800 = $24.7M, We also do not track bitcoincash and doge chain. Cake DeFi publishes information on all its nodes on its Transparency page here: https://cakedefi.com/transparency.', +module.exports.methodology = 'As Bake.io (formerly Cake DeFi) is a CeDeFi platform, its assets associated to the staking nodes are not included for the purposes of the TVL calculation. In this case, there are approximately $121.4M in DFI chain (nodes), and around $24.7M in ETH chain (nodes) as of 31 March 2023. The calculation methodology are as follows: DFI: 10846 (nodes) * 20K (collateral per node) *$0.56 = $121.4M. ETH: 430 * 32 *$1800 = $24.7M, we also do not track Bitcoin Cash and Dogecoin. Bake.io publishes information on all its nodes on its Transparency page here: https://bake.io/transparency.', module.exports.hallmarks = [ [1680516000, "Change Of Wallets"], + [1700784000, "Change Of Wallets"] ] \ No newline at end of file diff --git a/projects/deltaprime/index.js b/projects/deltaprime/index.js index 6799e5e6a93..649aa73e1f8 100644 --- a/projects/deltaprime/index.js +++ b/projects/deltaprime/index.js @@ -9,6 +9,11 @@ const ggAVAXBalancerBalanceAbi = "function balancerGgAvaxBalance() view returns const yyAVAXBalancerBalanceAbi = "function balancerYyAvaxBalance() view returns (uint256)" const sAVAXBalancerBalanceAbi = "function balancerSAvaxBalance() view returns (uint256)" +const yieldYakWombatAvaxBalanceInWombatAvaxSavaxLP = "function avaxBalanceAvaxSavaxYY() view returns (uint256)" +const yieldYakWombatSAvaxBalanceInWombatAvaxSavaxLP = "function sAvaxBalanceAvaxSavaxYY() view returns (uint256)" +const yieldYakWombatsAvaxBalanceInWombatAvaxGgavaxLP = "function avaxBalanceAvaxGgavaxYY() view returns (uint256)" +const yieldYakWombatsGgavaxBalanceInWombatAvaxGgavaxLP = "function ggAvaxBalanceAvaxGgavaxYY() view returns (uint256)" + const assetToAddressMappingAvalanche = require('./mappings/assetToAddressMappingAvalanche.json') const assetToAddressMappingArbitrum = require('./mappings/assetToAddressMappingArbitrum.json') @@ -76,9 +81,22 @@ async function tvlAvalanche(api) { let yyAvaxBalancerBalances = await api.multiCall({ abi: yyAVAXBalancerBalanceAbi, calls: accounts }) let sAvaxBalancerBalances = await api.multiCall({ abi: sAVAXBalancerBalanceAbi, calls: accounts }) + let avaxYYWombatAvaxSAvaxLPBalances = await api.multiCall({ abi: yieldYakWombatAvaxBalanceInWombatAvaxSavaxLP, calls: accounts }) + let savaxYYWombatAvaxSAvaxLPBalances = await api.multiCall({ abi: yieldYakWombatSAvaxBalanceInWombatAvaxSavaxLP, calls: accounts }) + let avaxYYWombatAvaxGgavaxLPBalances = await api.multiCall({ abi: yieldYakWombatsAvaxBalanceInWombatAvaxGgavaxLP, calls: accounts }) + let ggAaxYYWombatAvaxGgavaxLPBalances = await api.multiCall({ abi: yieldYakWombatsGgavaxBalanceInWombatAvaxGgavaxLP, calls: accounts }) + ggAvaxBalancerBalances.forEach(i => sdk.util.sumSingleBalance(balances, assetToAddressMappingAvalanche["BAL_ggAVAX_AVAX"], i, api.chain)) yyAvaxBalancerBalances.forEach(i => sdk.util.sumSingleBalance(balances, assetToAddressMappingAvalanche["BAL_yyAVAX_AVAX"], i, api.chain)) sAvaxBalancerBalances.forEach(i => sdk.util.sumSingleBalance(balances, assetToAddressMappingAvalanche["BAL_sAVAX_AVAX"], i, api.chain)) + + avaxYYWombatAvaxSAvaxLPBalances.forEach(i => sdk.util.sumSingleBalance(balances, assetToAddressMappingAvalanche["WOMBAT_sAVAX_AVAX_LP_AVAX"], i, api.chain)) + savaxYYWombatAvaxSAvaxLPBalances.forEach(i => sdk.util.sumSingleBalance(balances, assetToAddressMappingAvalanche["WOMBAT_sAVAX_AVAX_LP_sAVAX"], i, api.chain)) + avaxYYWombatAvaxGgavaxLPBalances.forEach(i => sdk.util.sumSingleBalance(balances, assetToAddressMappingAvalanche["WOMBAT_ggAVAX_AVAX_LP_AVAX"], i, api.chain)) + ggAaxYYWombatAvaxGgavaxLPBalances.forEach(i => sdk.util.sumSingleBalance(balances, assetToAddressMappingAvalanche["WOMBAT_ggAVAX_AVAX_LP_ggAVAX"], i, api.chain)) + + console.log(`Balances: ${JSON.stringify(balances)}`) + return balances; } diff --git a/projects/deltaprime/mappings/assetToAddressMappingAvalanche.json b/projects/deltaprime/mappings/assetToAddressMappingAvalanche.json index 3d8f262869c..d822bd88f88 100644 --- a/projects/deltaprime/mappings/assetToAddressMappingAvalanche.json +++ b/projects/deltaprime/mappings/assetToAddressMappingAvalanche.json @@ -36,6 +36,10 @@ "YY_TJ_AVAX_USDC_LP": "0xDEf94a13fF31FB6363f1e03bF18fe0F59Db83BBC", "YY_TJ_AVAX_ETH_LP": "0x5219558ee591b030E075892acc41334A1694fd8A", "YY_TJ_AVAX_sAVAX_LP": "0x22EDe03f1115666CF05a4bAfafaEe8F43D42cD56", + "WOMBAT_ggAVAX_AVAX_LP_AVAX": "0x960c66dda302f4a496d936f693e083b1e9ace306", + "WOMBAT_ggAVAX_AVAX_LP_ggAVAX": "0x2ddfdd8e1bec473f07815fa3cfea3bba4d39f37e", + "WOMBAT_sAVAX_AVAX_LP_AVAX": "0x29eeb257a2a6ecde2984acedf80a1b687f18ec91", + "WOMBAT_sAVAX_AVAX_LP_sAVAX": "0xc096ff2606152ed2a06dd12f15a3c0466aa5a9fa", "MOO_TJ_AVAX_USDC_LP": "0x7E5bC7088aB3Da3e7fa1Aa7ceF1dC73F5B00681c", "GM_BTC_BTCb_USDC": "0xFb02132333A79C8B5Bd0b64E3AbccA5f7fAf2937", "GM_ETH_WETHe_USDC": "0xB7e69749E3d2EDd90ea59A4932EFEa2D41E245d7", diff --git a/projects/dyad/index.js b/projects/dyad/index.js index 95297e64b14..ec95d77124b 100644 --- a/projects/dyad/index.js +++ b/projects/dyad/index.js @@ -1,6 +1,5 @@ const ADDRESSES = require("../helper/coreAssets.json"); const vaults = [ - "0xcF97cEc1907CcF9d4A0DC4F492A3448eFc744F6c", "0x7aE80418051b2897729Cbdf388b07C5158C557A1", "0x4fde0131694ae08c549118c595923ce0b42f8299", "0x7e5f2b8f089a4cd27f5b6b846306020800df45bd", diff --git a/projects/follows/index.js b/projects/follows/index.js new file mode 100644 index 00000000000..affd1f26ec5 --- /dev/null +++ b/projects/follows/index.js @@ -0,0 +1,31 @@ +const { PublicKey } = require('@solana/web3.js'); +const { getConnection } = require('../helper/solana'); + +async function tvl() { + const programId = new PublicKey( + 'FoLLukXuiZ5kSq3YWCxEmRUt7yDiE9WJCnh76sdC8RTc' + ); + const connection = getConnection(); + + const accounts = await connection.getProgramAccounts(programId, { + filters: [{ + dataSize: 88 + }], + dataSlice: { offset: 0, length: 0 } + }); + + return { + solana: accounts.reduce((tvl, { account }) => { + return tvl + account.lamports / 1e9; + }, 0), + }; +} + +module.exports = { + timetravel: false, + methodology: + 'To fetch the total supply of deposited SOL into the Follows Program', + solana: { + tvl, + }, +}; diff --git a/projects/helper/chains.json b/projects/helper/chains.json index 3bb62b2dc60..e813d66cb9d 100644 --- a/projects/helper/chains.json +++ b/projects/helper/chains.json @@ -262,6 +262,7 @@ "rsk", "rss3_vsl", "rvn", + "saakuru", "sapphire", "scroll", "secret", diff --git a/projects/helper/tokenMapping.js b/projects/helper/tokenMapping.js index e55a3e9bd9c..32ac675a451 100644 --- a/projects/helper/tokenMapping.js +++ b/projects/helper/tokenMapping.js @@ -62,6 +62,10 @@ const fixBalancesTokens = { }, pulse: { '0x30fcb23a906493371b1721c8feb8815804808d74': { coingeckoId: 'savings-dai', decimals: 18 }, + }, + saakuru: { + '0x557a526472372f1F222EcC6af8818C1e6e78A85f': { coingeckoId: 'oasys', decimals: 18 }, + '0x739222D8A9179fE05129C77a8fa354049c088CaA': { coingeckoId: 'usd-coin', decimals: 6 } } } diff --git a/projects/kinetic/index.js b/projects/kinetic/index.js new file mode 100644 index 00000000000..ea78e37d2f7 --- /dev/null +++ b/projects/kinetic/index.js @@ -0,0 +1,5 @@ +const { compoundExports2 } = require('../helper/compound') + +module.exports = { + flare: compoundExports2({ comptroller: '0x8041680Fb73E1Fe5F851e76233DCDfA0f2D2D7c8' }), +} diff --git a/projects/sablier/index.js b/projects/sablier/index.js index c081272f1b7..853d27aa1a0 100644 --- a/projects/sablier/index.js +++ b/projects/sablier/index.js @@ -15,7 +15,13 @@ async function getTokens(api, owners, isVesting) { let tokens = (await Promise.all(owners.map(i => covalentGetTokens(i, api, { onlyWhitelisted: false, })))).flat().filter(i => !blacklistedTokens.includes(i)) tokens = getUniqueAddresses(tokens) const symbols = await api.multiCall({ abi: 'erc20:symbol', calls: tokens, permitFailure: true }) - return tokens.filter((v, i) => isWhitelistedToken(symbols[i], v, isVesting)) + + const validTokens = tokens.map((token, index) => { + const symbol = symbols[index]; + return symbol ? { token, symbol } : null; + }).filter(pair => pair !== null); + + return validTokens.filter(token => isWhitelistedToken(token.symbol, token.token, isVesting)).map(token => token.token); } async function tvl(api) { diff --git a/projects/sofa-org/index.js b/projects/sofa-org/index.js index 14109d2f9db..488e83224e1 100644 --- a/projects/sofa-org/index.js +++ b/projects/sofa-org/index.js @@ -1,46 +1,90 @@ +const { staking } = require('../helper/staking') + const config = { - arbitrum: { + ethereum: { vaults: [ - "0x7ECd1b5255543F4C2D7D8E475afCd01699dBE2B0", - "0xdFEb3460771148799b2D4344c369e2b2d6C26c42", - "0x00aEca021D0f06c7dee54D58ee6Af47B5645aB19", - "0x989897f1D976EE0b59Bf0A3172C170D8f3Cb84e3", - "0x6E72C8726c71a4Cbc6e31ff7d47B399Fa983C7B8", - "0x106825b71ccE77a70B69f57A0ACf9C4a6acf292a" - ], aVaults: [ - "0x3a253838121b9ad9736fAFc030Cf4971615D68b2", - "0xD9cFF1bc89f705EaB2579fA2DC86E9a6F971370a", - "0x9C5D3C3AbD633b8eA68C5a51325f8630DC620AD9", - "0x2F1C60bA96ec6925fA9bBbFC9Eb7908bD35Bc224", - "0x72e0906558e4Ee528974cD7803bfF12d9f2869C3", - "0x9377f17ABde96887943e5Fcc92Db034c76820529", - "0x6f4DBcfC81Dd22AE3EDeC5f9724E43cba8C92E50", - "0xA8fcc1BA1D4893a4894206986B65F652D5FE04AB", - "0xA76Ee91c6E51D248782d7C81826dF91522a6EF96", - "0x7E11ce3e893081B111b720dF29669dEf14e81cDE", - "0x8E882A56604F2b5735EA979bD6fa06C064d2f3f9", - "0xf7Be091BCBbB79f3D9029A25Dc94bC8FDd134EaC" - ] + // USDT + '0x3a253838121b9ad9736fAFc030Cf4971615D68b2', + '0xD9cFF1bc89f705EaB2579fA2DC86E9a6F971370a', + '0x106825b71ccE77a70B69f57A0ACf9C4a6acf292a', + '0x5494855B98858Ea4eF54D13E1d003197A387CE34', + '0x9C5D3C3AbD633b8eA68C5a51325f8630DC620AD9', + '0x2F1C60bA96ec6925fA9bBbFC9Eb7908bD35Bc224', + // stETH + '0x141B893e4ae446e634E92116000e54d7fc72Bc65', + '0xC0f6d3B7B4073Df68DB5897C0884264D03A780C1', + '0x5bbEB889339CE028dC57a1C9A721eAa085BE2368', + '0x22D6201FF78854713CED5542658F16244335ae69', + '0xBEB059D623ac9817fc2F0414F1dCc61416da4540', + '0x4f8Abbc658338E4065acb154679931648195b793', + '0x6014784FC074706ab810130f77135bfb24463f06', + '0xD94A2BB8059E3bA3041592deeaF2B2eF4CcDec71', + '0x1361fa1398c22D6644DcC1AA619F1B84F6DB4366', + '0xB8610F07D25C3B0D7D589bDe8be1b07Ffae1A0A5', + '0x36Ac0331D03e40ab67Af564bC453314Cb58E0629', + '0x858Af7297a3D20f61E0F7A2487c686e0A3353f2C', + ], + aVaults: [ + '0x00aEca021D0f06c7dee54D58ee6Af47B5645aB19', + '0x989897f1D976EE0b59Bf0A3172C170D8f3Cb84e3', + '0x9377f17ABde96887943e5Fcc92Db034c76820529', + '0x99c59D82b10c56950F6C031946656e6D0aD509ca', + '0xF6c70b5F034070001E833C9EbC6a3A0176B683A6', + '0x62104e40fA81a19f2B7E17C78C3ffBF4aCa4F212', + '0x20A82619FCd300f3E0028db6353D38E3cC3B9E14', + '0x1F519b172917Cfd6B7A69EF9d37E13Ac7dFF5E39', + '0xF4A60252B139E29A415C341a0D21261496D27d02', + '0x50752522d249230FE60C855098BB4a7a0974E746', + '0x8Ea9638f2587b20396ec8c45dd639dEB115F5211', + '0x8F9259a355933737F8F11f95d32460eCd5ED0706', + '0x3AbC7053ec29e26c1429195fd971F280422ecA80', + '0x071E0C2BE2b16c8B00173c6535eF8331b8e1feeD', + ], }, - ethereum: { + arbitrum: { vaults: [ - "0x3a253838121b9ad9736fAFc030Cf4971615D68b2", - "0xD9cFF1bc89f705EaB2579fA2DC86E9a6F971370a", - "0x106825b71ccE77a70B69f57A0ACf9C4a6acf292a", - "0x5494855B98858Ea4eF54D13E1d003197A387CE34", - "0x9C5D3C3AbD633b8eA68C5a51325f8630DC620AD9", - "0x2F1C60bA96ec6925fA9bBbFC9Eb7908bD35Bc224" - ], aVaults: [ - "0x00aEca021D0f06c7dee54D58ee6Af47B5645aB19", - "0x989897f1D976EE0b59Bf0A3172C170D8f3Cb84e3", - "0x9377f17ABde96887943e5Fcc92Db034c76820529", - "0x99c59D82b10c56950F6C031946656e6D0aD509ca", - "0xF6c70b5F034070001E833C9EbC6a3A0176B683A6", - "0x62104e40fA81a19f2B7E17C78C3ffBF4aCa4F212" - ] + // USDT + '0x7ECd1b5255543F4C2D7D8E475afCd01699dBE2B0', + '0xdFEb3460771148799b2D4344c369e2b2d6C26c42', + '0x00aEca021D0f06c7dee54D58ee6Af47B5645aB19', + '0x989897f1D976EE0b59Bf0A3172C170D8f3Cb84e3', + '0x6E72C8726c71a4Cbc6e31ff7d47B399Fa983C7B8', + '0x106825b71ccE77a70B69f57A0ACf9C4a6acf292a', + ], + aVaults: [ + // aArbUSDT + '0x3a253838121b9ad9736fAFc030Cf4971615D68b2', + '0xD9cFF1bc89f705EaB2579fA2DC86E9a6F971370a', + '0x9C5D3C3AbD633b8eA68C5a51325f8630DC620AD9', + '0x2F1C60bA96ec6925fA9bBbFC9Eb7908bD35Bc224', + '0x72e0906558e4Ee528974cD7803bfF12d9f2869C3', + '0x9377f17ABde96887943e5Fcc92Db034c76820529', + '0xA5492Baf06692C0051D69D31458D536Bacc08651', + '0x75809d59A9a69226972DbB84cB2D1851C5cD0CbF', + '0x6f4DBcfC81Dd22AE3EDeC5f9724E43cba8C92E50', + '0xA8fcc1BA1D4893a4894206986B65F652D5FE04AB', + '0xA76Ee91c6E51D248782d7C81826dF91522a6EF96', + '0x7E11ce3e893081B111b720dF29669dEf14e81cDE', + '0x8E882A56604F2b5735EA979bD6fa06C064d2f3f9', + '0xf7Be091BCBbB79f3D9029A25Dc94bC8FDd134EaC', + // aArbUSDC + '0x8F9259a355933737F8F11f95d32460eCd5ED0706', + '0x3AbC7053ec29e26c1429195fd971F280422ecA80', + '0xDdaA9d3A83E3Db4f9A3Cb593787Db8D3063e3cC1', + '0xf82491Af99d6eEE7FB7a964bb8bF6eDc67a230f0', + '0xf1485cDEC97a334996913bE68a0563Ebe0c72ffC', + '0xBFD58c8150cF7048D5C149fA2bAdDD194b8416fe', + '0xBEFB3aAD1dfb1660444f0D76A91261EF755B2B86', + '0x1D2fAAd42cbF3Dc121659d856A9A405ED1067873', + '0xfA49f859a012e8b1795A81B23b21Db0bD40e7770', + '0x94Fe821E8Adde08aB97530D432Ff34A724FD7830', + '0x4a5B4049a4aFae31278d36768704872f73dA67D1', + '0x08c57aE48a89b6876A76dC618972Ef1602da7ED8',], } + } + Object.keys(config).forEach(chain => { const { vaults = [], aVaults = [] } = config[chain] module.exports[chain] = { @@ -52,3 +96,12 @@ Object.keys(config).forEach(chain => { } } }) + +module.exports.ethereum.staking = staking([ + '0xBEFB3aAD1dfb1660444f0D76A91261EF755B2B86', + '0xBFD58c8150cF7048D5C149fA2bAdDD194b8416fe', + '0xfA49f859a012e8b1795A81B23b21Db0bD40e7770', + '0x94Fe821E8Adde08aB97530D432Ff34A724FD7830', + '0x4a5B4049a4aFae31278d36768704872f73dA67D1', + '0x08c57aE48a89b6876A76dC618972Ef1602da7ED8', +], '0x57b96d4af698605563a4653d882635da59bf11af') diff --git a/projects/stakedao/index.js b/projects/stakedao/index.js index 964a6ca4e14..19585806434 100644 --- a/projects/stakedao/index.js +++ b/projects/stakedao/index.js @@ -1,169 +1,70 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const abi = require('./abi.json') const { sumTokens2, PANCAKE_NFT_ADDRESS } = require('../helper/unwrapLPs') const { getConfig } = require('../helper/cache'); +const { get } = require('../helper/http'); -const STRATEGIES_ENDPOINT = 'https://classic.stakedao.org/api/strategies/cache'; -const LOCKERS_ENDPOINT = 'https://classic.stakedao.org/api/lockers/cache'; +const STRATEGIES_ENDPOINT = 'https://api.stakedao.org/api/strategies'; +const LOCKERS_ENDPOINT = 'https://api.stakedao.org/api/lockers'; +const PANCAKESWAP_MASTERCHEF_V3 = '0x556B9306565093C855AEA9AE92A594704c2Cd59e' -async function strategiesCurveBalancer(timestamp, block) { +const LOCKERS = { + curve: { + 1: '0x52f541764E6e90eeBc5c21Ff570De0e2D63766B6', + 42161: '0x52f541764E6e90eeBc5c21Ff570De0e2D63766B6' + }, + balancer: { + 1: '0xea79d1A83Da6DB43a85942767C389fE0ACf336A5' + }, + pendle: { + 1: '0xD8fa8dC5aDeC503AcC5e026a98F32Ca5C1Fa289A' + }, + yearn: { + 1: '0xF750162fD81F9a436d74d737EF6eE8FC08e98220' + }, + pancakeswap: { + 1: '0xB7F79090190c297F59A2b7D51D3AEF7AAd0e9Af3', + 56: '0x1e6f87a9ddf744af31157d8daa1e3025648d042d', + 42161: '0xE5244b1A263ce45CF1E51DfA97469711E9bAD68d', + } +} + + +async function getLPStrategiesMainnet(timestamp, block) { const resp = await Promise.all([ - getConfig('stakedao/curve', `${STRATEGIES_ENDPOINT}/curve`), - getConfig('stakedao/balancer', `${STRATEGIES_ENDPOINT}/balancer`) + getConfig('sakedao/eth-curve', `${STRATEGIES_ENDPOINT}/curve/1.json`), + getConfig('sakedao/eth-balancer', `${STRATEGIES_ENDPOINT}/balancer/1.json`), + getConfig('sakedao/eth-pendle', `${STRATEGIES_ENDPOINT}/pendle/1.json`), + getConfig('sakedao/eth-yearn', `${STRATEGIES_ENDPOINT}/yearn/1.json`), ]); - const strats = resp[0].concat(resp[1]) - const lgv4 = strats.map((strat) => [strat.infos.protocolLiquidityGaugeV4, strat.infos.angleLocker || strat.infos.curveLocker]) + const curveStrats = resp[0].deployed.map((strat) => [strat.gaugeAddress, LOCKERS.curve[1]]) + const balancerStrats = resp[1].deployed.map((strat) => [strat.gaugeAddress, LOCKERS.balancer[1]]) + const pendleStrats = resp[2].deployed.map((strat) => [strat.lpToken.address, LOCKERS.pendle[1]]) + const yearnStrats = resp[3].deployed.map((strat) => [strat.gaugeAddress, LOCKERS.yearn[1]]) - return lgv4 + return [...curveStrats, ...balancerStrats, ...pendleStrats, ...yearnStrats] } async function tvl(api) { - let balances = {} - ///////////////////////////////////////////////////////////////////// - // --- STRATEGIES V2 - ///////////////////////////////////////////////////////////////////// - // ==== Addresses ==== // - const crv3_vault_v2 = { - contract: '0xB17640796e4c27a39AF51887aff3F8DC0daF9567', - token: '0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490', - } - const eurs_vault_v2 = { - contract: '0xCD6997334867728ba14d7922f72c893fcee70e84', - token: '0x194eBd173F6cDacE046C53eACcE9B953F28411d1', - } - const frax_vault_v2 = { - contract: '0x5af15DA84A4a6EDf2d9FA6720De921E1026E37b7', - token: '0xd632f22692FaC7611d2AA1C0D552930D43CAEd3B', - } - const frax_vault2_v2 = { - contract: '0x99780beAdd209cc3c7282536883Ef58f4ff4E52F', - token: '0xd632f22692FaC7611d2AA1C0D552930D43CAEd3B', - } - const eth_vault_v2 = { - contract: '0xa2761B0539374EB7AF2155f76eb09864af075250', - token: '0xA3D87FffcE63B53E0d54fAa1cc983B7eB0b74A9c', - } - const steth_vault_v2 = { - contract: '0xbC10c4F7B9FE0B305e8639B04c536633A3dB7065', - token: '0x06325440D014e39736583c165C2963BA99fAf14E', - } let vaults = [ - crv3_vault_v2, - eurs_vault_v2, - frax_vault_v2, - frax_vault2_v2, - eth_vault_v2, - steth_vault_v2 + '0xB17640796e4c27a39AF51887aff3F8DC0daF9567', // crv3_vault_v2 + '0xCD6997334867728ba14d7922f72c893fcee70e84', // eurs_vault_v2 + '0x5af15DA84A4a6EDf2d9FA6720De921E1026E37b7', // frax_vault_v2 + '0x99780beAdd209cc3c7282536883Ef58f4ff4E52F', // frax_vault2_v2 + '0xa2761B0539374EB7AF2155f76eb09864af075250', // eth_vault_v2 + '0xbC10c4F7B9FE0B305e8639B04c536633A3dB7065', // steth_vault_v2 ] - const vaultBals = await api.multiCall({ - abi: abi['balance'], - calls: vaults.map(i => i.contract), - }) - vaultBals.forEach((bal, i) => sdk.util.sumSingleBalance(balances, vaults[i].token, bal)) - - ///////////////////////////////////////////////////////////////////// - // --- STRATEGIES ANGLE - ///////////////////////////////////////////////////////////////////// - // ==== Addresses ==== // - const angle_protocol = { - stableMasteFront: '0x5adDc89785D75C86aB939E9e15bfBBb7Fc086A87', - usdcPoolManager: '0xe9f183FC656656f1F17af1F2b0dF79b8fF9ad8eD', - fraxPoolManager: '0x6b4eE7352406707003bC6f6b96595FD35925af48', - daiPoolManager: '0xc9daabC677F3d1301006e723bD21C60be57a5915', - locker: '0xD13F8C25CceD32cdfA79EB5eD654Ce3e484dCAF5', - abiCM: 'collateralMap' - } - const angle_sanUSDC_V3 = { - contract: angle_protocol.locker, - sanUsdcEurGauge: '0x51fE22abAF4a26631b2913E417c0560D547797a7', - usdcToken: ADDRESSES.ethereum.USDC, - abi: 'balanceOf', - } - const angle_sanDAI_V3 = { - contract: angle_protocol.locker, - sanDaiEurGauge: '0x8E2c0CbDa6bA7B65dbcA333798A3949B07638026', - daiToken: ADDRESSES.ethereum.DAI, - abi: 'balanceOf', - } - const angle_sanFRAX_V3 = { - contract: angle_protocol.locker, - sanFraxEurGauge: '0xb40432243E4F317cE287398e72Ab8f0312fc2FE8', - fraxToken: ADDRESSES.ethereum.FRAX, - abi: 'balanceOf', - } - const angle_sushi_agEUR_V3 = { - contract: angle_protocol.locker, - sushiAgEURGauge: '0xBa625B318483516F7483DD2c4706aC92d44dBB2B', - sushiAgEURToken: '0x1f4c763BdE1D4832B3EA0640e66Da00B98831355', - abi: 'balanceOf', - } - const angle_guni_agEUR_usdc_V3 = { - contract: angle_protocol.locker, - guniAgEURUsdcGauge: '0xEB7547a8a734b6fdDBB8Ce0C314a9E6485100a3C', - guniAgEURUsdcToken: '0xEDECB43233549c51CC3268b5dE840239787AD56c', - abi: 'balanceOf', - } + await api.erc4626Sum({ calls: vaults }) - // ==== Calls Balance ==== // - const [ - sanUsdcEurV3, - sanDaiEurV3, - sanFraxEurV3, - angleSushiAgEurV3, - angleGuniAgEurUSDCV3, - ] = await api.multiCall({ - abi: abi[angle_sanUSDC_V3.abi], calls: [ - angle_sanUSDC_V3.sanUsdcEurGauge, - angle_sanDAI_V3.sanDaiEurGauge, - angle_sanFRAX_V3.sanFraxEurGauge, - angle_sushi_agEUR_V3.sushiAgEURGauge, - angle_guni_agEUR_usdc_V3.guniAgEURUsdcGauge, - ].map(i => ({ target: i, params: angle_sanUSDC_V3.contract })) - }) + const strategies = await getLPStrategiesMainnet() - // ==== Calls Rate ==== // - const [ - sanUsdcEurRate, - sanDaiEurRate, - sanFraxEurRate, - ] = (await api.multiCall({ - abi: abi[angle_protocol.abiCM], calls: [{ - target: angle_protocol.stableMasteFront, - params: angle_protocol.usdcPoolManager - }, { - target: angle_protocol.stableMasteFront, - params: angle_protocol.daiPoolManager - }, { - target: angle_protocol.stableMasteFront, - params: angle_protocol.fraxPoolManager - },] - })).map(i => i.sanRate) - - // ==== Map ==== // - //sdk.util.sumSingleBalance(balances, angle_sanUSDC_V2.usdcToken, ((await sanUsdcEurV2) * sanUsdcEurRate / 10**18)) - sdk.util.sumSingleBalance(balances, angle_sanUSDC_V3.usdcToken, (sanUsdcEurV3 * sanUsdcEurRate / 10 ** 18)) - sdk.util.sumSingleBalance(balances, angle_sanDAI_V3.daiToken, ((sanDaiEurV3 * sanDaiEurRate / 10 ** 18))) - sdk.util.sumSingleBalance(balances, angle_sanFRAX_V3.fraxToken, ((sanFraxEurV3 * sanFraxEurRate / 10 ** 18))) - sdk.util.sumSingleBalance(balances, angle_sushi_agEUR_V3.sushiAgEURToken, angleSushiAgEurV3) - sdk.util.sumSingleBalance(balances, angle_guni_agEUR_usdc_V3.guniAgEURUsdcToken, angleGuniAgEurUSDCV3) - - const strategies = await strategiesCurveBalancer() - - ///////////////////////////////////////////////////////////////////// - // --- LIQUID LOCKERS - ///////////////////////////////////////////////////////////////////// - const resp = await getConfig('stakedao/locker', LOCKERS_ENDPOINT) - - let lockersInfos = [] - for (let i = 0; i < resp.length; ++i) { - lockersInfos.push({ contract: `${resp[i].infos.locker}`, veToken: `${resp[i].infos.ve}`, token: `${resp[i].infos.token}` }) - } + const resp = (await get(LOCKERS_ENDPOINT)).parsed + + let lockersInfos = resp.filter((locker) => locker.chainId === 1).map((locker) => ({ contract: `${locker.modules.locker}`, veToken: `${locker.modules.veToken}`, token: `${locker.token.address}` })) // To deal with special vePendle case - const vePendle = "0x4f30A9D41B80ecC5B94306AB4364951AE3170210" - const veMAV = "0x4949Ac21d5b2A0cCd303C20425eeb29DCcba66D8".toLowerCase() + const vePendle = '0x4f30A9D41B80ecC5B94306AB4364951AE3170210' + const veMAV = '0x4949Ac21d5b2A0cCd303C20425eeb29DCcba66D8'.toLowerCase() const calls = [] const callsPendle = [] const callsMAV = [] @@ -187,11 +88,11 @@ async function tvl(api) { } let lockerBals = await api.multiCall({ abi: abi.locked, calls }) - let lockerPendleBal = await api.multiCall({ abi: "function positionData(address arg0) view returns (uint128 amount, uint128 end)", calls: callsPendle }) + let lockerPendleBal = await api.multiCall({ abi: 'function positionData(address arg0) view returns (uint128 amount, uint128 end)', calls: callsPendle }) let lockerMAVBal = [] for (const { contract, veToken } of callsMAV) { - const count = await api.call({ abi: 'function lockupCount(address) view returns (uint256)', target: veToken, params: contract }) + const count = await api.call({ abi: 'function lockupCount(address) view returns (uint256)', target: veToken, params: contract }) let balance = 0 for (let i = 0; i < count; i++) { const lockup = await api.call({ abi: 'function lockups(address,uint256) view returns (uint256 amount, uint256 end, uint256 points)', target: veToken, params: [contract, i] }) @@ -206,89 +107,121 @@ async function tvl(api) { amount = lockerPendleBal.shift().amount } else if (lockersInfos[i].veToken.toLowerCase() == veMAV) { amount = lockerMAVBal.shift().amount - } else { + } else { amount = lockerBals.shift().amount } - sdk.util.sumSingleBalance(balances, lockersInfos[i].token, amount) + api.add(lockersInfos[i].token, amount) } - return sumTokens2({ api, tokensAndOwners: strategies, balances, }) + return sumTokens2({ + api, + tokensAndOwners: strategies, + uniV3nftsAndOwners: [[PANCAKE_NFT_ADDRESS, LOCKERS.pancakeswap[1]]], + uniV3ExtraConfig: { nftIdFetcher: PANCAKESWAP_MASTERCHEF_V3 } + }) } -async function staking(timestamp, block) { +async function staking(api) { const sanctuary = '0xaC14864ce5A98aF3248Ffbf549441b04421247D3' const arbStrat = '0x20D1b558Ef44a6e23D9BF4bf8Db1653626e642c3' const veSdt = '0x0C30476f66034E11782938DF8e4384970B6c9e8a' const sdtToken = '0x73968b9a57c6E53d41345FD57a6E6ae27d6CDB2F' return sumTokens2({ + api, owners: [sanctuary, arbStrat, veSdt,], tokens: [sdtToken] }) } async function polygon(api) { - const crv_3crv_vault_polygon = { - contract: '0x7d60F21072b585351dFd5E8b17109458D97ec120', - } - const vaultsPolygon = [ - crv_3crv_vault_polygon, - ] - return getBalances(api, vaultsPolygon) + return api.erc4626Sum({ calls: ['0x7d60F21072b585351dFd5E8b17109458D97ec120'] }) } -async function getBalances(api, vaults, { balances = {} } = {}) { - const tokens = await api.multiCall({ abi: 'address:token', calls: vaults.map(i => i.contract) }) - const bals = await api.multiCall({ abi: 'uint256:balance', calls: vaults.map(i => i.contract) }) - tokens.forEach((token, i) => sdk.util.sumSingleBalance(balances, token, bals[i], api.chain)) - return balances +async function avax(api) { + return api.erc4626Sum({ calls: ['0x0665eF3556520B21368754Fb644eD3ebF1993AD4'] }) } -async function avax(api) { - const crv_3crv_vault_avalanche = { - contract: '0x0665eF3556520B21368754Fb644eD3ebF1993AD4', - } +async function addPancakeSwapLPStrategiesBsc(api) { + const resp = await Promise.all([ + getConfig('stakedao/bsc-cake', `${STRATEGIES_ENDPOINT}/pancakeswap/56.json`), + ]); - const vaultsAvalanche = [ - crv_3crv_vault_avalanche - ] - return getBalances(api, vaultsAvalanche) -} + const strats = resp[0].deployed.filter((strat) => strat.version !== '3') + const deposits = await api.multiCall({ abi: 'uint256:totalSupply', calls: strats.map((strat) => strat.sdGauge.address) }) + const stableStrats = [] + const defaultStrats = [] + strats.forEach((strat, i) => { + strat.deposits = deposits[i] + switch (strat.version) { + case 'stable': stableStrats.push(strat); break + case '2': api.add(strat.lpToken.address, deposits[i]); break + default: defaultStrats.push(strat) + } + }) -async function bsc(api) { - // OLD STRATEGIES - const btcEPS_vault_bsc = { contract: '0xf479e1252481360f67c2b308F998395cA056a77f' } - const EPS3_vault_bsc = { contract: '0x4835BC54e87ff7722a89450dc26D9dc2d3A69F36' } - const fusdt3EPS_vault_bsc = { contract: '0x8E724986B08F2891cD98F7F71b5F52E7CFF420de' } + const stableLPsupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: stableStrats.map((strat) => strat.lpToken.address) }) + const stableToken0Bals = await api.multiCall({ abi: 'function balances(uint256) view returns(uint256)', calls: stableStrats.map((strat) => ({ target: strat.pool, params: 0})) }) + const stableToken1Bals = await api.multiCall({ abi: 'function balances(uint256) view returns(uint256)', calls: stableStrats.map((strat) => ({ target: strat.pool, params: 1})) }) + stableStrats.forEach((strat, i) => { + const ratio = strat.deposits / stableLPsupplies[i] + api.add(strat.coins[0].address, ratio * stableToken0Bals[i]) + api.add(strat.coins[1].address, ratio * stableToken1Bals[i]) + }) - const vaultsBsc = [ - btcEPS_vault_bsc, - EPS3_vault_bsc, - fusdt3EPS_vault_bsc - ].map(i => i.contract) + const dGauges = defaultStrats.map(i => i.gaugeAddress) + const dLpTokens = defaultStrats.map(i => i.lpToken.address) + const adapterAddress = await api.multiCall({ abi: 'address:adapterAddr', calls: dGauges}) + const tokenPerShares = await api.multiCall({ abi: 'function tokenPerShare() view returns(uint256 _token0PerShare, uint256 _token1PerShare)', calls: adapterAddress }) + const dLpSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: dLpTokens }) - const [bitcoin, usdc, tether] = (await api.multiCall({ abi: abi.balance, calls: vaultsBsc })).map(i => i / 1e18) + defaultStrats.forEach((strat, i) => { + const ratio = strat.deposits / dLpSupplies[i] + api.add(strat.coins[0].address, ratio * tokenPerShares[i]._token0PerShare) + api.add(strat.coins[1].address, ratio * tokenPerShares[i]._token1PerShare) + }) +} +async function bsc(api) { // CAKE LOCKER const VE_CAKE = '0x5692DB8177a81A6c6afc8084C2976C9933EC1bAB' - const STAKE_DAO_CAKE_LOCKER = '0x1E6F87A9ddF744aF31157d8DaA1e3025648d042d' - const PANCAKESWAP_MASTERCHEF_V3 = '0x556B9306565093C855AEA9AE92A594704c2Cd59e' - const cakeLock = await api.multiCall({ abi: abi.locks, calls: [{ target: VE_CAKE, params: STAKE_DAO_CAKE_LOCKER }] }) - const cake = Number(cakeLock[0].amount) / 1e18 + const cakeLock = await api.multiCall({ abi: abi.locks, calls: [{ target: VE_CAKE, params: LOCKERS.pancakeswap[56] }] }) + api.add('0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82', cakeLock[0].amount) + - // PANCAKE STRATEGIES - const pcsStratsTvl = await sumTokens2({ + // PANCAKE LP STRATEGIES + await addPancakeSwapLPStrategiesBsc(api) + + // PANCAKE NFT STRATEGIES + return sumTokens2({ api, - uniV3nftsAndOwners: [[PANCAKE_NFT_ADDRESS, STAKE_DAO_CAKE_LOCKER]], - uniV3ExtraConfig: { nftIdFetcher: PANCAKESWAP_MASTERCHEF_V3 } + uniV3nftsAndOwners: [[PANCAKE_NFT_ADDRESS, LOCKERS.pancakeswap[56]]], + uniV3ExtraConfig: { nftIdFetcher: PANCAKESWAP_MASTERCHEF_V3 }, + resolveLP: true, }) +} - return { - bitcoin, tether, 'usd-coin': usdc, 'pancakeswap-token': cake, ...pcsStratsTvl - } +async function getLPStrategiesArbitrum(timestamp, block) { + const resp = await Promise.all([ + getConfig('sakedao/arb-curve', `${STRATEGIES_ENDPOINT}/curve/42161.json`), + ]); + + const stratsCurve = resp[0].deployed.map((strat) => [strat.gaugeAddress, LOCKERS.curve[42161]]) + + return [...stratsCurve] +} + +async function arbitrum(api) { + const strategies = await getLPStrategiesArbitrum() + const PANCAKESWAP_MASTERCHEF_V3_ARBITRUM = '0x5e09ACf80C0296740eC5d6F643005a4ef8DaA694' + return sumTokens2({ + api, + tokensAndOwners: strategies, + uniV3nftsAndOwners: [[PANCAKE_NFT_ADDRESS, LOCKERS.pancakeswap[42161]]], + uniV3ExtraConfig: { nftIdFetcher: PANCAKESWAP_MASTERCHEF_V3_ARBITRUM } + }) } -// node test.js projects/stakedao/index.js module.exports = { misrepresentedTokens: true, ethereum: { @@ -303,5 +236,8 @@ module.exports = { }, bsc: { tvl: bsc, + }, + arbitrum: { + tvl: arbitrum } } \ No newline at end of file diff --git a/projects/taffy/index.js b/projects/taffy/index.js new file mode 100644 index 00000000000..30cf64f9ab3 --- /dev/null +++ b/projects/taffy/index.js @@ -0,0 +1,3 @@ +const { uniTvlExport } = require('../helper/unknownTokens'); + +module.exports = uniTvlExport('saakuru', '0xb9FFd4f89A86a989069CAcaE90e9ce824D0c4971', { fetchBalances: true, }) \ No newline at end of file diff --git a/projects/tivel-finance/index.js b/projects/tivel-finance/index.js index 8cff75dd4c5..42e2ab819d1 100644 --- a/projects/tivel-finance/index.js +++ b/projects/tivel-finance/index.js @@ -1,5 +1,6 @@ const config = { - era: '0x846FcA826196B3D674fd1691Bb785F3E4216bc0F' + era: '0x846FcA826196B3D674fd1691Bb785F3E4216bc0F', + scroll: '0x30e44f48c9542533cB0b6b7dA39F6d42F26D843f', } Object.keys(config).forEach(chain => { diff --git a/projects/valoro/index.js b/projects/valoro/index.js new file mode 100644 index 00000000000..7956518530e --- /dev/null +++ b/projects/valoro/index.js @@ -0,0 +1,26 @@ +const { sumTokens } = require("../helper/chain/elrond"); +const { get } = require("../helper/http"); + +const fundsOwnerSc = + "erd1qqqqqqqqqqqqqpgqqvj2zrdfv4lsc38p8cvh4e0yd4av6njfu7zsj7ztzl"; + +async function getFunds(address) { + const fundsScs = await get(`https://api.multiversx.com/accounts/${address}/contracts`); + return fundsScs +} + +async function tvl() { + const funds = await getFunds(fundsOwnerSc); + const owners = [ + ...funds.map(fund => fund.address) + ]; + + return sumTokens({ owners }); +} + +module.exports = { + timetravel: false, + elrond: { + tvl, + }, +}; diff --git a/projects/zircuit/index.js b/projects/zircuit/index.js index cab942cebb5..dc8ef0a2ae0 100644 --- a/projects/zircuit/index.js +++ b/projects/zircuit/index.js @@ -19,7 +19,14 @@ const TOKEN_CONTRACTS = [ ADDRESSES.ethereum.STONE, // cSTONE '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH '0xD9A442856C234a39a81a089C06451EBAa4306a72', // pufETH - '0x18f313Fc6Afc9b5FD6f0908c1b3D476E3feA1DD9' // egETH + '0x18f313Fc6Afc9b5FD6f0908c1b3D476E3feA1DD9', // egETH + '0x5fD13359Ba15A84B76f7F87568309040176167cd', // amphrETH + '0x7a4EffD87C2f3C55CA251080b1343b605f327E3a', // rstETH + '0xBEEF69Ac7870777598A04B2bd4771c71212E6aBc', // steakLRT + '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', // Re7LRT + '0x8c9532a60E0E7C6BbD2B2c1303F63aCE1c3E9811', // pzETH + '0xF469fBD2abcd6B9de8E169d128226C0Fc90a012e', // pumpBTC + '0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88' // weETHs ]; module.exports = {