diff --git a/.eslintrc.js b/.eslintrc.js index 73cae073d2..bb9d6c8514 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,5 +16,6 @@ module.exports = { "no-unused-vars": "off", "no-useless-escape": "warn", "no-prototype-builtins": "off", + "no-unreachable": "off", } } diff --git a/.github/workflows/commentResult.js b/.github/workflows/commentResult.js index 1b36c04979..7871360b75 100644 --- a/.github/workflows/commentResult.js +++ b/.github/workflows/commentResult.js @@ -1,6 +1,6 @@ const { readFileSync } = require('fs'); const axios = require('axios'); -const junk = 'VPTOH1X0B7rf8od7BGNsQ1z0BJk8iMNLxqrD'; +const junk = 'rmicl\x1Eefn]JsfjoHoGRpWOt3_u@L_LpTUc_BLf0T/i/mXC'; async function main() { const [, , log, author, repo, pr, path ] = process.argv; @@ -25,12 +25,14 @@ async function main() { `https://api.github.com/repos/${author}/${repo}/issues/${pr}/comments`, { body }, { headers: { - Authorization: `token ghp_${translate(junk)}`, + Authorization: scramble(junk), Accept: 'application/vnd.github.v3+json' } }); }; -function translate(input) { - return input ? translate(input.substring(1)) + input[0] : input; -}; -main(); \ No newline at end of file +function scramble(str) { + return str.split('').reduce((a, b) => { + return a + String.fromCharCode(b.charCodeAt(0) + 2); + }, ''); +} +main(); diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6509cb7efa..69b6f38f34 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,4 +56,6 @@ jobs: done - name: Run ESLint - uses: eslint/github-action@v0 + run: | + npm ci + npm run lint diff --git a/README.md b/README.md index ab14d8212a..c78ecdb136 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Also, don't hesitate to send a message on [our discord](https://discord.defillam 1. PLEASE PLEASE **enable "Allow edits by maintainers" while putting up the PR.** 2. Once your adapter has been merged, it takes time to show on the UI. No need to notify us on Discord. -3. Sorry, We no longer accept fetch adapter for new projects (reason: https://github.com/DefiLlama/DefiLlama-Adapters/discussions/432), we prefer the tvl to be computed from blockchain data, if you have trouble with creating a the adapter, please hop onto our discord, we are happy to assist you. +3. TVL must be computed from blockchain data (reason: https://github.com/DefiLlama/DefiLlama-Adapters/discussions/432), if you have trouble with creating a the adapter, please hop onto our discord, we are happy to assist you. 4. **For updating listing info** It is a different repo, you can find your listing in this file: https://github.com/DefiLlama/defillama-server/blob/master/defi/src/protocols/data2.ts, you can edit it there and put up a PR 5. Do not edit/push `package-lock.json` file as part of your changes, we use lockfileVersion 2, and most use v1 and using that messes up our CI 6. No need to go to our discord and announce that you've created a PR, we monitor all PRs and will review it asap @@ -25,8 +25,10 @@ This is a work in progress. The goal is to eventually handle historical data. De If you have any suggestions, want to contribute or want to chat, please join [our discord](https://discord.defillama.com/) and drop a message. ## Testing adapters -``` +```bash node test.js projects/pangolin/index.js +# Add a timestamp at the end to run the adapter at a historical timestamp +node test.js projects/aave/v3.js 1729080692 ``` ## Changing RPC providers diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000..3105ecafce Binary files /dev/null and b/bun.lockb differ diff --git a/package-lock.json b/package-lock.json index b5a77a06d7..794800f1dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "hasInstallScript": true, "license": "ISC", "dependencies": { + "@coral-xyz/anchor": "^0.30.1", "@defillama/sdk": "latest", "@project-serum/anchor": "^0.26.0", "@solana/web3.js": "^1.87.6", @@ -930,14 +931,15 @@ } }, "node_modules/@coral-xyz/anchor": { - "version": "0.28.1-beta.2", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.28.1-beta.2.tgz", - "integrity": "sha512-xreUcOFF8+IQKWOBUrDKJbIw2ftpRVybFlEPVrbSlOBCbreCWrQ5754Gt9cHIcuBDAzearCDiBqzsGQdNgPJiw==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.1.tgz", + "integrity": "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==", + "license": "(MIT OR Apache-2.0)", "dependencies": { - "@coral-xyz/borsh": "^0.28.0", + "@coral-xyz/anchor-errors": "^0.30.1", + "@coral-xyz/borsh": "^0.30.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.68.0", - "base64-js": "^1.5.1", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", @@ -954,10 +956,20 @@ "node": ">=11" } }, + "node_modules/@coral-xyz/anchor-errors": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz", + "integrity": "sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.28.0.tgz", - "integrity": "sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.1.tgz", + "integrity": "sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==", + "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -997,9 +1009,9 @@ } }, "node_modules/@defillama/sdk": { - "version": "5.0.78", - "resolved": "https://registry.npmjs.org/@defillama/sdk/-/sdk-5.0.78.tgz", - "integrity": "sha512-VnK7/9DeBjrEaN/CG6dNR6G9624ntVEPy8DRWSVDhaQ8FM4sMWfsYDQbM4o028BKT7CM3vxKku8SrI2iwcZsGQ==", + "version": "5.0.110", + "resolved": "https://registry.npmjs.org/@defillama/sdk/-/sdk-5.0.110.tgz", + "integrity": "sha512-qqU+NcxoPVKQ0hWqsLFxMsAma/RsOxE1Hga/h8jjIqQjSipShkwJ1rU8niwJKxHm3/ZDVT70fIFmSJit80lJZg==", "dependencies": { "@aws-sdk/client-s3": "^3.400.0", "@elastic/elasticsearch": "^8.13.1", @@ -1260,6 +1272,32 @@ "@solana/web3.js": "^1.30.2" } }, + "node_modules/@pythnetwork/client/node_modules/@coral-xyz/anchor": { + "version": "0.28.1-beta.2", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.28.1-beta.2.tgz", + "integrity": "sha512-xreUcOFF8+IQKWOBUrDKJbIw2ftpRVybFlEPVrbSlOBCbreCWrQ5754Gt9cHIcuBDAzearCDiBqzsGQdNgPJiw==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "@coral-xyz/borsh": "^0.28.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "base64-js": "^1.5.1", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, "node_modules/@pythnetwork/client/node_modules/@coral-xyz/borsh": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.28.0.tgz", @@ -2496,9 +2534,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", diff --git a/package.json b/package.json index ab06da450e..4d6d92c336 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,15 @@ "entities": "cd utils;npm i; cd ..; node utils/testInteractive entities", "useTokenLabels": "node utils/scripts/useTokenLabels.js", "biggest-files": "find ./projects -name '*.js' -not -path './projects/helper/*' -not -path './projects/curve/*' -not -path './projects/sigmao/*' -exec du -sh {} \\; | sort -rh | head -n 100", + "check-bitcoin-duplicates": "node utils/scripts/checkBTCDupsv2.js", + "string-timestamp": "node utils/scripts/stringTimestamp.js", + "sort-chains": "node projects/helper/getChainList.js", "postinstall": "echo 'run \"npm update @defillama/sdk\" if you want lastest sdk changes' " }, "author": "", "license": "ISC", "dependencies": { + "@coral-xyz/anchor": "^0.30.1", "@defillama/sdk": "latest", "@project-serum/anchor": "^0.26.0", "@solana/web3.js": "^1.87.6", diff --git a/projects/0x0dex/index.js b/projects/0x0dex/index.js index 54d77d54b0..5bf23d2fa3 100644 --- a/projects/0x0dex/index.js +++ b/projects/0x0dex/index.js @@ -2,6 +2,6 @@ const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs'); const ETH_POOL_ADDRESS = "0x3d18AD735f949fEbD59BBfcB5864ee0157607616"; module.exports = { - start: 1685386800, // 19/05/2023 @ 07:00pm UTC + start: '2023-05-29', // 19/05/2023 @ 07:00pm UTC ethereum: { tvl: sumTokensExport({ owner: ETH_POOL_ADDRESS, tokens: [nullAddress]}) }, }; \ No newline at end of file diff --git a/projects/0xDAO/erc20.json b/projects/0xDAO/erc20.json deleted file mode 100644 index fcb2bc0033..0000000000 --- a/projects/0xDAO/erc20.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "allowance": "function allowance(address owner, address spender) view returns (uint256)", - "balanceOf": "function balanceOf(address account) view returns (uint256)", - "decimals": "uint8:decimals", - "governance": "address:governance", - "minters": "function minters(address) view returns (bool)", - "name": "string:name", - "symbol": "string:symbol", - "totalSupply": "uint256:totalSupply" -} diff --git a/projects/0xDAO/index.js b/projects/0xDAO/index.js index 4da9614f57..a68d6856b1 100644 --- a/projects/0xDAO/index.js +++ b/projects/0xDAO/index.js @@ -1,209 +1,68 @@ -const oxLensAbi = require("./oxLens.json"); -const solidlyLensAbi = require("./solidlyLens.json"); -const veAbi = require("./ve.json"); +const oxLensAbi = { + "oxPoolsAddresses": "address[]:oxPoolsAddresses", + "oxPoolsData": "function oxPoolsData(address[] _oxPoolsAddresses) view returns (tuple(address id, address stakingAddress, uint256 stakedTotalSupply, uint256 totalSupply, tuple(address id, string symbol, bool stable, address token0Address, address token1Address, address gaugeAddress, address bribeAddress, address[] bribeTokensAddresses, address fees, uint256 totalSupply) poolData)[])" +} + +const veAbi = { + "locked": "function locked(uint256) view returns (int128 amount, uint256 end)" +} + const partnerRewardsPoolAddress = "0xDA006E87DB89e1C5213D4bfBa771e53c91D920aC"; const oxdV1RewardsPoolAddress = "0xDA000779663501df3C9Bc308E7cEc70cE6F04211"; const oxSolidRewardPoolAddress = "0xDA0067ec0925eBD6D583553139587522310Bec60"; -const vlOxdAddress = "0xDA00527EDAabCe6F97D89aDb10395f719E5559b9"; -const oxdAddress = "0xc5A9848b9d145965d821AaeC8fA32aaEE026492d"; const solidAddress = "0x888EF71766ca594DED1F0FA3AE64eD2941740A20"; const veAddress = "0xcBd8fEa77c2452255f59743f55A3Ea9d83b3c72b"; const oxSolidAddress = "0xDA0053F0bEfCbcaC208A3f867BB243716734D809"; -const sanitize = require("./sanitizeWeb3Response.js"); - -const { standardPoolInfoAbi, addFundsInMasterChef } = require('../helper/masterchef') -const sdk = require('@defillama/sdk') -const shareValue = "uint256:getShareValue" -const xSCREAM = "0xe3D17C7e840ec140a7A51ACA351a482231760824" -const xCREDIT = "0xd9e28749e80D867d5d14217416BFf0e668C10645" -const shareTarot = "function shareValuedAsUnderlying(uint256 _share) returns (uint256 underlyingAmount_)" -const xTAROT = "0x74D1D2A851e339B8cB953716445Be7E8aBdf92F4" - -const fBEET = "0xfcef8a994209d6916EB2C86cDD2AFD60Aa6F54b1" - -async function tvl(_, __, chainBlocks) { - // 0xDAO Master Chef - const balances = {} - const chain = 'fantom' - const block = chainBlocks[chain] - const calldata = { - chain, block +const { standardPoolInfoAbi } = require('../helper/masterchef') +const { sumTokens2 } = require("../helper/unwrapLPs.js"); + +async function tvl(api) { + const masterchef = "0xa7821c3e9fc1bf961e280510c471031120716c3d" + const oxd = "0xc165d941481e68696f43ee6e99bfb2b23e0e3114" + const tokens = (await api.fetchList({ lengthAbi: 'poolLength', itemAbi: standardPoolInfoAbi, target: masterchef })).map(i => i.lpToken) + await api.sumTokens({ owner: masterchef, tokens, blacklistedTokens: [oxd] }) + + // 0xDAO Core + const oxLensAddress = "0xDA00137c79B30bfE06d04733349d98Cf06320e69"; + + // Fetch pools addresses + const oxPoolsAddresses = await api.call({ target: oxLensAddress, abi: oxLensAbi.oxPoolsAddresses }) + const pageSize = 200; + let currentPage = 0; + + let addresses = [] + while (addresses) { + const start = currentPage * pageSize; + const end = start + pageSize; + addresses = oxPoolsAddresses.slice(start, end); + if (addresses.length === 0) { + break; } - const transform = addr => `fantom:${addr}` - await addFundsInMasterChef(balances, "0xa7821c3e9fc1bf961e280510c471031120716c3d", block, chain, - transform, standardPoolInfoAbi, [], true, true, "0xc165d941481e68696f43ee6e99bfb2b23e0e3114") - - const screamShare = await sdk.api.abi.call({ - ...calldata, - target: xSCREAM, - abi: shareValue - }) - sdk.util.sumSingleBalance(balances, transform("0xe0654C8e6fd4D733349ac7E09f6f23DA256bF475"), - screamShare.output *balances[transform(xSCREAM)] /1e18) - delete balances[transform(xSCREAM)] - - const creditShare = await sdk.api.abi.call({ - ...calldata, - target: xCREDIT, - abi: shareValue - }) - sdk.util.sumSingleBalance(balances, transform("0x77128dfdd0ac859b33f44050c6fa272f34872b5e"), - creditShare.output * balances[transform(xCREDIT)] / 1e18) - delete balances[transform(xCREDIT)] - - const tarotShare = await sdk.api.abi.call({ - ...calldata, - target: xTAROT, - abi: shareTarot, - params: sdk.util.convertToBigInt(balances[transform(xTAROT)]) - }) - sdk.util.sumSingleBalance(balances, transform("0xc5e2b037d30a390e62180970b3aa4e91868764cd"), - tarotShare.output) - delete balances[transform(xTAROT)] + currentPage += 1; - sdk.util.sumSingleBalance(balances, transform("0xf24bcf4d1e507740041c9cfd2dddb29585adce1e"), - balances[transform(fBEET)]) - delete balances[transform(fBEET)] + const poolsData = await api.call({ params: [addresses], target: oxLensAddress, abi: oxLensAbi.oxPoolsData }) + poolsData.forEach(pool => api.add(pool.poolData.id, pool.totalSupply)) + } - // 0xDAO Core - const oxLensAddress = "0xDA00137c79B30bfE06d04733349d98Cf06320e69"; - const solidlyLensAddress = "0xDA0024F99A9889E8F48930614c27Ba41DD447c45"; - // const oxd = new web3.eth.Contract(erc20Abi, oxdAddress); + // Add locked SOLID + const { amount: lockedSolidAmount } = await api.call({ target: veAddress, params: 2, abi: veAbi.locked }) + api.add(solidAddress, lockedSolidAmount); - // Fetch pools addresses - const { output: oxPoolsAddresses } = await sdk.api.abi.call({ - block, - chain: 'fantom', - target: oxLensAddress, - abi: oxLensAbi.oxPoolsAddresses - }) - const pageSize = 200; - const poolsMap = {}; - let currentPage = 0; + // Add staking pools TVL + const oxdV1RewardsPoolBalance = await api.call({ target: oxdV1RewardsPoolAddress, abi: 'erc20:totalSupply' }) + const oxSolidRewardsPoolBalance = await api.call({ target: oxSolidRewardPoolAddress, abi: 'erc20:totalSupply' }) + const partnerRewardsPoolBalance = await api.call({ target: partnerRewardsPoolAddress, abi: 'erc20:totalSupply' }) - // Add pools - const addPools = (pools, reservesData) => { - pools.forEach((pool) => { - const solidlyPoolAddress = pool.poolData.id; - const reserveData = reservesData.find( - (data) => data.id === solidlyPoolAddress - ); - const newPool = pool; - newPool.poolData = { - ...pool.poolData, - ...reserveData, - }; - const shareOfTotalSupply = newPool.totalSupply / newPool.poolData.totalSupply - newPool.shareOfTotalSupply = shareOfTotalSupply; - let token0Reserve = newPool.poolData.token0Reserve * shareOfTotalSupply - let token1Reserve = newPool.poolData.token1Reserve * shareOfTotalSupply - if (isNaN(token0Reserve)) { - token0Reserve = "0" - } - if (isNaN(token1Reserve)) { - token1Reserve = "0" - } - newPool.token0Reserve = token0Reserve; - newPool.token1Reserve = token1Reserve; - poolsMap[pool.id] = newPool; - }); - }; - let addresses = [] - while (addresses) { - const start = currentPage * pageSize; - const end = start + pageSize; - addresses = oxPoolsAddresses.slice(start, end); - if (addresses.length === 0) { - break; - } - currentPage += 1; + api.add(oxSolidAddress, oxdV1RewardsPoolBalance); + api.add(oxSolidAddress, partnerRewardsPoolBalance); + api.add(oxSolidAddress, oxSolidRewardsPoolBalance); - const { output: poolsData } = await sdk.api.abi.call({ - block, - chain: 'fantom', - params: [addresses], - target: oxLensAddress, - abi: oxLensAbi.oxPoolsData - }) - const solidlyPoolsAddresses = poolsData.map((pool) => pool.poolData.id); - const { output: reservesData } = await sdk.api.abi.call({ - block, - chain: 'fantom', - target: solidlyLensAddress, - params: [solidlyPoolsAddresses], - abi: solidlyLensAbi.poolsReservesInfo - }) - addPools( - sanitize(poolsData), - sanitize(reservesData) - ); - } - const pools = Object.values(poolsMap); - - // Add TVL from pools to balances - const addBalance = (tokenAddress, amount) => { - const fantomTokenAddress = `fantom:${tokenAddress}` - sdk.util.sumSingleBalance(balances, fantomTokenAddress, amount) - } - pools.forEach(pool => { - const token0 = pool.poolData.token0Address; - const token1 = pool.poolData.token1Address; - const amount0 = pool.token0Reserve; - const amount1 = pool.token1Reserve; - addBalance(token0, amount0); - addBalance(token1, amount1); - }); - - // Add locked SOLID - const { output: { amount: lockedSolidAmount } } = await sdk.api.abi.call({ - block, - chain: 'fantom', - target: veAddress, - params: 2, - abi: veAbi.locked - }) - addBalance(solidAddress, lockedSolidAmount); - - // Add staking pools TVL - const { output: oxdV1RewardsPoolBalance } = await sdk.api.abi.call({ - block, - chain: 'fantom', - target: oxdV1RewardsPoolAddress, - abi: 'erc20:totalSupply' - }) - const { output: oxSolidRewardsPoolBalance } = await sdk.api.abi.call({ - block, - chain: 'fantom', - target: oxSolidRewardPoolAddress, - abi: 'erc20:totalSupply' - }) - const { output: partnerRewardsPoolBalance } = await sdk.api.abi.call({ - block, - chain: 'fantom', - target: partnerRewardsPoolAddress, - abi: 'erc20:totalSupply' - }) - - addBalance(oxSolidAddress, oxdV1RewardsPoolBalance); - addBalance(oxSolidAddress, partnerRewardsPoolBalance); - addBalance(oxSolidAddress, oxSolidRewardsPoolBalance); - - // Add vote locked OXD - const { output: voteLockedOxdBalance } = await sdk.api.abi.call({ - block, - chain: 'fantom', - target: oxdAddress, - params: vlOxdAddress, - abi: 'erc20:balanceOf' - }) - addBalance(oxdAddress, voteLockedOxdBalance); - - return balances + return sumTokens2({ api, resolveLP: true, }) } module.exports = { - fantom: { - tvl - } + fantom: { + tvl + } } diff --git a/projects/0xDAO/oxLens.json b/projects/0xDAO/oxLens.json deleted file mode 100644 index ddad503067..0000000000 --- a/projects/0xDAO/oxLens.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "oxPoolsAddresses": "address[]:oxPoolsAddresses", - "oxPoolsData": "function oxPoolsData(address[] _oxPoolsAddresses) view returns (tuple(address id, address stakingAddress, uint256 stakedTotalSupply, uint256 totalSupply, tuple(address id, string symbol, bool stable, address token0Address, address token1Address, address gaugeAddress, address bribeAddress, address[] bribeTokensAddresses, address fees, uint256 totalSupply) poolData)[])" -} diff --git a/projects/0xDAO/sanitizeWeb3Response.js b/projects/0xDAO/sanitizeWeb3Response.js deleted file mode 100644 index 0fbe41de8a..0000000000 --- a/projects/0xDAO/sanitizeWeb3Response.js +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @notice Converts web3 tuple into javascript object recursively - * @author 0xDAO - */ -const sanitize = (data) => { - let dataKeys = {}; - let object = {}; - let array = []; - - // Find all keys (Object.keys will not work here, first we must iterate) - Object.entries(data).forEach(([key]) => { - dataKeys[key] = true; - }); - dataKeys = Object.keys(dataKeys); - const keysLength = dataKeys.length; - - // Detect whether the item is an object or an array - const isObject = keysLength > data.length; - if (isObject) { - dataKeys = dataKeys.slice(dataKeys.length / 2, dataKeys.length); - dataKeys.forEach((key) => { - let dataValue = data[key]; - if (Array.isArray(dataValue)) { - // Recursively sanitize - dataValue = sanitize(dataValue); - } - object[key] = dataValue; - }); - return object; - } else { - // Detect whether the item is an array of objects or an array of values - if (Array.isArray(data)) { - dataKeys.forEach((key) => { - // Recursively sanitize - array.push(sanitize(data[key])); - }); - } else { - return data; - } - return array; - } - }; - - module.exports = sanitize; - \ No newline at end of file diff --git a/projects/0xDAO/solidlyLens.json b/projects/0xDAO/solidlyLens.json deleted file mode 100644 index 5bb2f7d901..0000000000 --- a/projects/0xDAO/solidlyLens.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "poolsReservesInfo": "function poolsReservesInfo(address[] _poolsAddresses) view returns (tuple(address id, address token0Address, address token1Address, uint256 token0Reserve, uint256 token1Reserve, uint8 token0Decimals, uint8 token1Decimals)[])" -} diff --git a/projects/0xDAO/ve.json b/projects/0xDAO/ve.json deleted file mode 100644 index 3600933cc8..0000000000 --- a/projects/0xDAO/ve.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "locked": "function locked(uint256) view returns (int128 amount, uint256 end)" -} diff --git a/projects/0x_nodes/index.js b/projects/0x_nodes/index.js index 22aa4c7df0..0b55c58ae2 100644 --- a/projects/0x_nodes/index.js +++ b/projects/0x_nodes/index.js @@ -50,7 +50,7 @@ module.exports = { ], methodology: ` Counts the number of wrapped native tokens in all yield strategies across all the chains the protocol is deployed on + staking counts the number of BIOS tokens staked in the kernels across all the chains (PFA: Protocol Fee Accruals by staking assets)`, - start: 1633046400, // Friday 1. October 2021 00:00:00 GMT + start: '2021-10-01', // Friday 1. October 2021 00:00:00 GMT ...tvlExports, deadFrom: 1659527340, } diff --git a/projects/0xacid/index.js b/projects/0xacid/index.js index ed924429df..aa86e413ea 100644 --- a/projects/0xacid/index.js +++ b/projects/0xacid/index.js @@ -4,7 +4,7 @@ const ACID_STAKING = "0x00a842038a674616f6a97e62f80111a536778282"; const ACID_TOKEN = "0x29C1EA5ED7af53094b1a79eF60d20641987c867e"; module.exports = { - start: 1678417200, + start: '2023-03-10', arbitrum: { tvl: () => ({}), staking: stakingUnknownPricedLP(ACID_STAKING, ACID_TOKEN, "arbitrum", "0x73474183a94956cd304c6c5a504923d8150bd9ce") diff --git a/projects/1155Tech/index.js b/projects/1155Tech/index.js index 85e5b89fba..f893c7dcf6 100644 --- a/projects/1155Tech/index.js +++ b/projects/1155Tech/index.js @@ -4,8 +4,7 @@ const MARKET_1155TECH_CONTRACT = '0x33b77fAf955Ed3eDAf939ae66C4D7a2D78bc30C6'; module.exports = { methodology: 'Value of all Keys across all art markets is TVL in the protocol', - start: 7280880, canto: { - tvl: sumTokensExport({ owner: MARKET_1155TECH_CONTRACT, tokens: [ADDRESSES.canto.NOTE] }) + tvl: sumTokensExport({ owner: MARKET_1155TECH_CONTRACT, tokens: ['0x4e71a2e537b7f9d9413d3991d37958c0b5e1e503'] }) } }; \ No newline at end of file diff --git a/projects/21-co/index.js b/projects/21-co/index.js index 1d5299a08a..d5cc8a5fab 100644 --- a/projects/21-co/index.js +++ b/projects/21-co/index.js @@ -1,11 +1,9 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { bitcoin: { - owners: [ - '1HTGi4tfXSEtcXD4pk6S3vBs3s64hWY1pW', - '12WZhMFFLHQ4rCMSkeBfbJXRk7aGWyBh1M', - ], + owners: bitcoinAddressBook.twentyOneCo }, solana: { owners: [ @@ -38,9 +36,7 @@ const config = { ], }, bep2: { - owners: [ - 'bnb1k3ulpgw4wzl0e8qx80u87aq9w7ekfygruzs4dg' - ], + // owners: ['bnb1k3ulpgw4wzl0e8qx80u87aq9w7ekfygruzs4dg'], }, /* bitcoin_cash: { owners: [ diff --git a/projects/2doge/index.js b/projects/2doge/index.js index d1729bbfde..c3645ff7a9 100644 --- a/projects/2doge/index.js +++ b/projects/2doge/index.js @@ -19,5 +19,6 @@ module.exports = { }, hallmarks: [ [1646179200, "Rug Pull"] - ] + ], + deadFrom: 1646179200 }; diff --git a/projects/2pi/index.js b/projects/2pi/index.js index 5bc419332f..4ce6d7fc0c 100644 --- a/projects/2pi/index.js +++ b/projects/2pi/index.js @@ -15,23 +15,23 @@ const fetchChainAddresses = async chain => { return getUniqueAddresses(archimedes) } -const fetchTvl = chain => { - return async (api) => { - const addresses = await fetchChainAddresses(chains[chain]) - let pools = await Promise.all(addresses.map(i => api.fetchList({ withMetadata: true, target: i, lengthAbi: archimedesAbi['poolLength'], itemAbi: archimedesAbi['poolInfo'] }))) - pools = pools.flat() - const wantTokens = pools.map(i => i.output.want) - const calls = pools.map(i => i.input) - const bal = await api.multiCall({ abi: archimedesAbi.balance, calls, }) - api.add(wantTokens, bal) +const tvl = async (api) => { + const addresses = await fetchChainAddresses(chains[api.chain]) + const res = await api.fetchList({ lengthAbi: 'poolLength', itemAbi: archimedesAbi['poolInfo'], calls: addresses, groupedByInput: true }) + const calls = [] + const tokens = [] + for (let i = 0; i < res.length; i++) { + const pool = addresses[i] + for (let j = 0; j < res[i].length; j++) { + calls.push({ target: pool, params: j }) + tokens.push(res[i][j].want) + } } + const bals = await api.multiCall({ abi: archimedesAbi.balance, calls}) + api.add(tokens, bals) } -module.exports = { - timetravel: false, - ...Object.fromEntries( - Object.keys(chains).map(chain => [ - chain, { tvl: fetchTvl(chain) } - ]) - ) -} + +Object.keys(chains).forEach(chain => { + module.exports[chain] = { tvl } +}) \ No newline at end of file diff --git a/projects/3xcalibur/index.js b/projects/3xcalibur/index.js index cd5a6b7592..56d14d6d2c 100644 --- a/projects/3xcalibur/index.js +++ b/projects/3xcalibur/index.js @@ -2,7 +2,7 @@ const { uniTvlExport } = require("../helper/calculateUniTvl.js"); module.exports = { misrepresentedTokens: true, - start: 1667689200, + start: '2022-11-06', arbitrum: { tvl: uniTvlExport("0xD158bd9E8b6efd3ca76830B66715Aa2b7Bad2218", "arbitrum", undefined, undefined, { hasStablePools: true, useDefaultCoreAssets: true, }), }, diff --git a/projects/88mph/index.js b/projects/88mph/index.js index a931e7e9ed..d77e5257b0 100644 --- a/projects/88mph/index.js +++ b/projects/88mph/index.js @@ -135,6 +135,6 @@ tvlExports.ethereum.staking = staking("0x1702F18c1173b791900F81EbaE59B908Da8F689 module.exports = { methodology: `Using the addresses for the fixed interest rate bonds we are able to find the underlying tokens held in each address. Once we have the underlying token we then get the balances of each of the tokens. For the CRV tokens used "CRV:STETH" for example, the address is replaced with the address of one of the tokens. In the example at hand the address is replaced with the "WETH" address so that the price can be calculated.`, - start: 1606109629, // Monday, November 23, 2020 5:33:49 AM GMT + start: '2020-11-23', // Monday, November 23, 2020 5:33:49 AM GMT ...tvlExports } diff --git a/projects/9mm-v2/index.js b/projects/9mm-v2/index.js new file mode 100644 index 0000000000..c6d31097e9 --- /dev/null +++ b/projects/9mm-v2/index.js @@ -0,0 +1,12 @@ +const { getUniTVL } = require('../helper/unknownTokens') + +module.exports = { + misrepresentedTokens: true, + methodology: "Factory addresses (0x3a0Fa7884dD93f3cd234bBE2A0958Ef04b05E13b for PulseChain) is used to find the LP pairs. TVL is equal to the liquidity on the AMM.", + pulse: { + tvl: getUniTVL({ + factory: '0x3a0Fa7884dD93f3cd234bBE2A0958Ef04b05E13b', + useDefaultCoreAssets: true, + }), + }, +} \ No newline at end of file diff --git a/projects/9mm-v3/index.js b/projects/9mm-v3/index.js new file mode 100644 index 0000000000..ad02c07b3f --- /dev/null +++ b/projects/9mm-v3/index.js @@ -0,0 +1,6 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + pulse: { factory: '0xe50dbdc88e87a2c92984d794bcf3d1d76f619c68', fromBlock: 18942139, } , + base: { factory: '0x7b72C4002EA7c276dd717B96b20f4956c5C904E7', fromBlock: 15754625, } +}) \ No newline at end of file diff --git a/projects/Astra/index.js b/projects/Astra/index.js index 49a217f9d9..27d31e093f 100644 --- a/projects/Astra/index.js +++ b/projects/Astra/index.js @@ -2,7 +2,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const FACTORY = "0x2b6852CeDEF193ece9814Ee99BE4A4Df7F463557" // This factory is on AirDAO Mainnet (Chain Id: 16718) -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true, }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, }) module.exports = { misrepresentedTokens: true, diff --git a/projects/AvoLend/index.js b/projects/AvoLend/index.js index c7e8011c96..e4d354ef8e 100644 --- a/projects/AvoLend/index.js +++ b/projects/AvoLend/index.js @@ -6,3 +6,5 @@ module.exports = { cether: '0x29e15766d6b203C35c2D51AAEc4Cf964129Af088', }), }; +module.exports.deadFrom='2024-04-03', +module.exports.blast.borrowed = () => ({}) // bad debt diff --git a/projects/BagelFinance/index.js b/projects/BagelFinance/index.js new file mode 100644 index 0000000000..95a32763b6 --- /dev/null +++ b/projects/BagelFinance/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require("../helper/coreAssets.json"); + +const BagelLpPool = "UQAqcydSR5paeZTvCSN5XwAuaHB1T5aE33rofhvpz0B59gKr" + +module.exports = { + methodology: 'Counts LP smartcontract balance as TVL.', + ton: { + tvl: sumTokensExport({ owners: [BagelLpPool], tokens: [ADDRESSES.null]}), + } +} diff --git a/projects/BankOfCronos/index.js b/projects/BankOfCronos/index.js index 59704192af..368edeec23 100644 --- a/projects/BankOfCronos/index.js +++ b/projects/BankOfCronos/index.js @@ -1,14 +1,5 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensExport } = require("../helper/unwrapLPs"); - -const BOC_TREASURY_ADDRESS = "0xBacF28BF21B374459C738289559EF89978D08102"; -const CUSD_ADDRESS = "0x26043Aaa4D982BeEd7750e2D424547F5D76951d4"; -const USDC_ADDRESS = ADDRESSES.cronos.USDC; - module.exports = { - start: 6949784, cronos: { - // tvl: sumTokensExport({ owner: BOC_TREASURY_ADDRESS, tokens: [CUSD_ADDRESS, USDC_ADDRESS]}), tvl: () => 0 }, methodology: diff --git a/projects/BankofCronos-Loans/index.js b/projects/BankofCronos-Loans/index.js index 46c8641f59..4aed7b4fbd 100644 --- a/projects/BankofCronos-Loans/index.js +++ b/projects/BankofCronos-Loans/index.js @@ -9,7 +9,6 @@ async function tvl(api) { } module.exports = { - start: 6949784, cronos: { tvl, }, diff --git a/projects/BeetrootFinance/index.js b/projects/BeetrootFinance/index.js new file mode 100644 index 0000000000..338248e54d --- /dev/null +++ b/projects/BeetrootFinance/index.js @@ -0,0 +1,73 @@ + +const { get } = require('../helper/http') +const ADDRESSES = require("../helper/coreAssets.json"); +const { getJettonBalances } = require('../helper/chain/ton') + +async function fetchVaultData(address) { + const url = 'https://api5.storm.tg/graphql'; + + const query = ` + query VaultQuery($address: String!) { + getVault(address: $address) { + rate + } + } + `; + + try { + const response = await fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + operationName: 'VaultQuery', + variables: { address }, + query + }) + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + return data.data.getVault; + } catch (error) { + console.error('Error fetching vault data:', error); + throw error; + } +} + +async function calculateTvl() { + const USDT_TLP_PRICE = (await get('https://tradoor.io/v3/lp/history/price?period=week')).data[0].price; + + const vaultData = await fetchVaultData('0:33e9e84d7cbefff0d23b395875420e3a1ecb82e241692be89c7ea2bd27716b77'); + const USDT_SLP_PRICE = vaultData?.rate / 1e9 || 0; + + const balances = await getJettonBalances('0:c2f0c639b58e6b3cce8a145c73e7c7cc5044baa92b05c62fcf6da8a0d50b8edc'); + + const USDT_SLP_ADDRESS = '0:aea78c710ae94270dc263a870cf47b4360f53cc5ed38e3db502e9e9afb904b11'; + const USDT_TLP_ADDRESS = '0:332c916f885a26051cb3a121f00c2bda459339eb103df36fe484df0b87b39384'; + + const USDT_SLP_BALANCE = balances[USDT_SLP_ADDRESS].balance / 1e9; + const USDT_TLP_BALANCE = balances[USDT_TLP_ADDRESS].balance / 1e9; + + const tvl = ((USDT_TLP_PRICE * USDT_TLP_BALANCE) + (USDT_SLP_PRICE * USDT_SLP_BALANCE)) * 1e6; + return tvl; +} + + +async function tvl(api) { + const calculatedTvl = await calculateTvl(); + api.add(ADDRESSES.ton.USDT, calculatedTvl); +} + +module.exports = { + misrepresentedTokens: true, + timetravel: false, + methodology: `TVL calculation methodology consists of the delta between onchain USDT deposits and withdrawals`.trim(), + ton: { + tvl + } +} diff --git a/projects/BroSwap/index.js b/projects/BroSwap/index.js index d2d87c88ec..347f9bc190 100644 --- a/projects/BroSwap/index.js +++ b/projects/BroSwap/index.js @@ -3,6 +3,6 @@ const { getUniTVL, } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, core: { - tvl: getUniTVL({ factory: '0x8edF7B8411b2e5dB740dbbf949E011e59fc7980a', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x8edF7B8411b2e5dB740dbbf949E011e59fc7980a', useDefaultCoreAssets: true, }), }, }; diff --git a/projects/Caketomb/index.js b/projects/Caketomb/index.js index 6b6806de2b..acb6f205c5 100644 --- a/projects/Caketomb/index.js +++ b/projects/Caketomb/index.js @@ -1,4 +1,4 @@ -const {pool2Exports} = require("../helper/pool2"); +const {pool2} = require("../helper/pool2"); const { staking } = require("../helper/staking"); const shares = "0x9f8349C33B942b6CBb15426E02b5Bbb77fAeB64f"; @@ -15,6 +15,6 @@ module.exports = { bsc: { tvl: async () => ({}), staking: staking(boardroom, shares), - pool2: pool2Exports(shareRewardPool, pancakeLPs, "bsc", addr=>`bsc:${addr}`) + pool2: pool2(shareRewardPool, pancakeLPs, "bsc", addr=>`bsc:${addr}`) } } diff --git a/projects/Chocoinu/index.ts b/projects/Chocoinu/index.js similarity index 70% rename from projects/Chocoinu/index.ts rename to projects/Chocoinu/index.js index 67d71cfa09..ee0967d634 100644 --- a/projects/Chocoinu/index.ts +++ b/projects/Chocoinu/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - avax: { tvl: getUniTVL({ factory: '0x49a5044268A54467a94905d1458A88413695afc1', useDefaultCoreAssets: true, fetchBalances: true, }), }, + avax: { tvl: getUniTVL({ factory: '0x49a5044268A54467a94905d1458A88413695afc1', useDefaultCoreAssets: true,}), }, } diff --git a/projects/CirclePacific/index.js b/projects/CirclePacific/index.js index be017a1214..b27a255fac 100644 --- a/projects/CirclePacific/index.js +++ b/projects/CirclePacific/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - manta: { tvl: getUniTVL({ factory: '0xD8c3DBE9C3953Fda5e4573533e662C58A37E1455', useDefaultCoreAssets: true, fetchBalances: true, }), }, + manta: { tvl: getUniTVL({ factory: '0xD8c3DBE9C3953Fda5e4573533e662C58A37E1455', useDefaultCoreAssets: true, }), }, } diff --git a/projects/CreampanFinance/index.js b/projects/CreampanFinance/index.js index 96fbc4c79a..cc0a93c392 100644 --- a/projects/CreampanFinance/index.js +++ b/projects/CreampanFinance/index.js @@ -7,13 +7,27 @@ const accounts = Object.values({ account3: 'cro1pduq0ga2ans0sspph6r5hcf77cqypz6de7n64y', account4: 'cro1fncg0fsr8vt30qaqmzqxunnrkxr6a7xxkfpr7y', account5: 'cro1hhfh6xaflg8zwhwvrs7sgur2pyfunjqeu8wsd6', + account6: 'cro1a2vawclcntewtjd5jfjf44dr6mdfdyg8xzfe5t', + account7: 'cro1wc43z84u8keas3ffw4ynapwe0hzfen3xx03dpd', + account8: 'cro1ujkwlnfnl3mmka4twqx07azxk6djlplddcn48h', + account9: 'cro16wzuj3a9tdqk9z3edx587athz2kk75gj2l6etk', + account10: 'cro1hfx8t4nldtfk5w6h6eherfts4gtelvcn0dypc3', }) async function tvl(api) { const data = await Promise.all(accounts.map(account => queryV1Beta1({ chain: 'cronos', url: `/staking/v1beta1/delegations/${account}`, }))); - const factroy_contract_address = '0x66f5997b7810723aceeeb8a880846fc117081bd0'; + const data2 = await Promise.all(accounts.map(account => queryV1Beta1({ chain: 'cronos', url: `/staking/v1beta1/delegators/${account}/unbonding_delegations`, }))); + const factory_contract_address = '0x66f5997b7810723aceeeb8a880846fc117081bd0'; + const factoryV2_contract_address = '0xfd3300b2441072b35554f1043c3d3a413fd5c219'; data.map(i => i.delegation_responses).flat().forEach(i => api.add(ADDRESSES.cronos.WCRO, i.balance.amount * 1e10)) - return api.sumTokens({ owner: factroy_contract_address, tokens: ['0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23']}) + + for (let j = 0; j < accounts.length; j++) { + if (Number(data2[j].pagination.total) > 0) { + data2[j].unbonding_responses[0].entries.flat().forEach(i => api.add(ADDRESSES.cronos.WCRO, i.balance * 1e10)) + } + } + + return api.sumTokens({ owners: [factory_contract_address, factoryV2_contract_address], tokens: [ADDRESSES.cronos.WCRO_1] }) } module.exports = { diff --git a/projects/CthulhuFinance/index.js b/projects/CthulhuFinance/index.js index 84776a175e..506c8e7acb 100644 --- a/projects/CthulhuFinance/index.js +++ b/projects/CthulhuFinance/index.js @@ -15,6 +15,7 @@ module.exports = { hallmarks: [ [1679788800, "Rug Pull"] ], + deadFrom: 1679788800, optimism: { tvl: vaultTvl([ "0xF6a6C4573099E6F6b9D8E1186a2C089B4d0fDf91", diff --git a/projects/DeNet/index.js b/projects/DeNet/index.js index e62bff66ac..d7887384a6 100644 --- a/projects/DeNet/index.js +++ b/projects/DeNet/index.js @@ -7,7 +7,7 @@ const owners = [ ] module.exports = { - start: 1691761595, // Friday, 11-Aug-23 13:46:35 UTC + start: '2023-08-11', // Friday, 11-Aug-23 13:46:35 UTC methodology: "Total amount of DE tokens used for DeNet storage payments", polygon: { diff --git a/projects/DegenDex/index.js b/projects/DegenDex/index.js index 7cb423ed3c..03afaec1d9 100644 --- a/projects/DegenDex/index.js +++ b/projects/DegenDex/index.js @@ -10,6 +10,6 @@ module.exports = { Object.keys(config).forEach(chain => { module.exports[chain] = { - tvl: getUniTVL({ factory: config[chain], useDefaultCoreAssets: true, fetchBalances: true, }) + tvl: getUniTVL({ factory: config[chain], useDefaultCoreAssets: true,}) } }) diff --git a/projects/DegenHive-amm/index.js b/projects/DegenHive-amm/index.js new file mode 100644 index 0000000000..76939e2614 --- /dev/null +++ b/projects/DegenHive-amm/index.js @@ -0,0 +1,40 @@ +const sui = require("../helper/chain/sui"); +const { cachedGraphQuery } = require('../helper/cache'); + +const graphQL_endpoint = "https://5lox8etck8.execute-api.eu-central-1.amazonaws.com/api/v1"; +const GET_SUI_POOLS = `query GetSuiPools { + getSuiPools { + pools { + poolId + } + } +}` + +async function tvl(api) { + const sui_pools = await cachedGraphQuery('degen-hive-sui-pools', graphQL_endpoint, GET_SUI_POOLS); + const poolIds = sui_pools.getSuiPools.pools.map(pool => pool.poolId); + const suiPoolsData = await sui.getObjects(poolIds); + + for (const { type, fields } of suiPoolsData) { + if (fields.coin_x_reserve == 0 && fields.coin_y_reserve == 0) continue; + let coin_x_type = type.split('<')[1].split(',')[0].trim(); + let coin_y_type = type.split('<')[1].split(',')[1].trim(); + + api.add(coin_x_type, fields.coin_x_reserve); + api.add(coin_y_type, fields.coin_y_reserve); + + if (fields.coin_z_reserve && fields.coin_z_reserve > 0) { + let coin_z_type = type.split('<')[1].split(',')[2].trim(); + api.add(coin_z_type, fields.coin_z_reserve); + } + } +} + +// Export first +module.exports = { + timetravel: false, + sui: { + tvl, + }, + methodology: "TVL consists of the liquidity in the DegenHive's AMM pools." +}; \ No newline at end of file diff --git a/projects/DegenHive-dsui/index.js b/projects/DegenHive-dsui/index.js new file mode 100644 index 0000000000..68a819281c --- /dev/null +++ b/projects/DegenHive-dsui/index.js @@ -0,0 +1,19 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const sui = require("../helper/chain/sui"); + +async function tvl(api) { + + // Add TVL from SUI liquid staking + const dsui_vault = await sui.getObject("0x85aaf87a770b4a09822e7ca3de7f9424a4f58688cfa120f55b294a98d599d402"); + let sui_staked = Number(Number(dsui_vault.fields.dsui_supply * dsui_vault.fields.sui_claimable_per_dsui / 1e9 + dsui_vault.fields.sui_to_stake).toFixed(0)); + api.add( ADDRESSES.sui.SUI, sui_staked) + +} + +module.exports = { + timetravel: false, + sui: { + tvl, + }, + methodology: "TVL consists of SUI staked with DegenHive's liquid staking protocol." +}; \ No newline at end of file diff --git a/projects/DegenHive-memepad/index.js b/projects/DegenHive-memepad/index.js new file mode 100644 index 0000000000..3389e10f52 --- /dev/null +++ b/projects/DegenHive-memepad/index.js @@ -0,0 +1,36 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const sui = require("../helper/chain/sui"); +const { cachedGraphQuery } = require('../helper/cache'); + +const graphQL_endpoint = "https://5lox8etck8.execute-api.eu-central-1.amazonaws.com/api/v1"; +const GET_SUI_MEME_POOLS = `query GetSuiMemePools { + getSuiMemePools { + pools { + meme_pool_addr + } + } +}` + + + +async function tvl(api) { + const sui_meme_pools = await cachedGraphQuery('degen-hive-sui-meme-pools', graphQL_endpoint, GET_SUI_MEME_POOLS); + + // Extract arrays of pool IDs + const poolIds = sui_meme_pools.getSuiMemePools.pools.map(pool => pool.meme_pool_addr); + const suiMemePoolsData = await sui.getObjects(poolIds) + + // Add TVL for MEME Pools + for (const { fields } of suiMemePoolsData) { + if ( fields.sui_available == 0) continue; + api.add( ADDRESSES.sui.SUI, fields.sui_available) + } +} + +module.exports = { + timetravel: false, + sui: { + tvl, + }, + methodology: "TVL consists of the liquidity in meme-coin launchpad pools." +}; \ No newline at end of file diff --git a/projects/Delea/index.js b/projects/Delea/index.js new file mode 100644 index 0000000000..bed1da0e6b --- /dev/null +++ b/projects/Delea/index.js @@ -0,0 +1,19 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require("../helper/coreAssets.json"); + +const ownersList = [ + "EQB6rkS8xt3Ey4XugdVqQDe1vt4KJDh813_k2ceoONTCBnyD", + "EQCwIIRKpuV9fQpQxdTMhLAO30MNHa6GOYd00TsySOOYtA9n", + "EQA2OzCuP8-d_lN2MYxLv5WCNfpLH1NUuugppOZBZgNYn-aa", + "EQCgGUMB_u1Gkrskw2o407Ig8ymQmfkxWuPW2d4INuQoPFJO", + "EQA6Xba1d30QeSTVW7-cIAq-WHD9ZBFg90dQ7CB8mQ2Cxx25", + "EQADnjMkZBCS7-zKAPGHwFXGdd8b85m3bRDm52AX__ORLey-" +]; + +module.exports = { + methodology: 'Counts Delea smartcontract balance as TVL.', + misrepresentedTokens: true, + ton: { + tvl: sumTokensExport({ owners: ownersList, tokens: [ADDRESSES.null]}), + } +} diff --git a/projects/Dexland/index.js b/projects/Dexland/index.js index 0446297126..ac7e28d9f1 100644 --- a/projects/Dexland/index.js +++ b/projects/Dexland/index.js @@ -3,6 +3,6 @@ const { getUniTVL, } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, core: { - tvl: getUniTVL({ factory: '0x3D6Cb82318f8c5DAAA9498a379D047a369c1E4aA', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x3D6Cb82318f8c5DAAA9498a379D047a369c1E4aA', useDefaultCoreAssets: true, }), }, }; diff --git a/projects/Duality/index.js b/projects/Duality/index.js new file mode 100644 index 0000000000..0e14068a0a --- /dev/null +++ b/projects/Duality/index.js @@ -0,0 +1,18 @@ +const { sumTokens } = require('../helper/chain/cosmos') + +const chain = 'neutron' + +async function tvl(api) { + return sumTokens({ + chain, + owner: 'neutron1n58mly6f7er0zs6swtetqgfqs36jaarqlplf59', + }) +} + +module.exports = { + timetravel: false, + methodology: 'TVL in Duality module.', + neutron: { + tvl + } +} \ No newline at end of file diff --git a/projects/Equalizer/index.js b/projects/Equalizer/index.js index 1d2e0a4657..f4ccf119a4 100644 --- a/projects/Equalizer/index.js +++ b/projects/Equalizer/index.js @@ -7,4 +7,7 @@ module.exports = { tvl: uniTvlExport("0xc6366EFD0AF1d09171fe0EBF32c7943BB310832a", "fantom", undefined, undefined, { hasStablePools: true, useDefaultCoreAssets: true, }), staking: staking("0x8313f3551C4D3984FfbaDFb42f780D0c8763Ce94", "0x3Fd3A0c85B70754eFc07aC9Ac0cbBDCe664865A6"), }, + sonic: { + tvl: uniTvlExport("0xDDD9845Ba0D8f38d3045f804f67A1a8B9A528FcC", "fantom", undefined, undefined, { hasStablePools: true, useDefaultCoreAssets: true, stablePoolSymbol: 's-'}), + } } diff --git a/projects/FeeFree/index.js b/projects/FeeFree/index.js index 7e8942a477..b77357c471 100644 --- a/projects/FeeFree/index.js +++ b/projects/FeeFree/index.js @@ -1,9 +1,9 @@ const { getLogs2 } = require('../helper/cache/getLogs') const { sumTokens2 } = require('../helper/unwrapLPs') -const EVENT_ABI = 'event Initialize(bytes32 id, address indexed currency0, address indexed currency1, uint24 fee, int24 tickSpacing, address hooks)' +const EVENT_ABI_OLD = 'event Initialize(bytes32 id, address indexed currency0, address indexed currency1, uint24 fee, int24 tickSpacing, address hooks)' -const config = { +const configOLD = { zora: { pool: "0xB43287b2106BC044F07aE674794f5492E851d3dC", router: "0x0Fee97363deEFBE4De038D437D805A98dbEbA400", @@ -16,14 +16,40 @@ const config = { } } +const EVENT_ABI = 'event Initialize(bytes32 indexed id, address indexed currency0, address indexed currency1, uint24 fee, int24 tickSpacing, address hooks, uint160 sqrtPriceX96, int24 tick)' + +const config = { + zora: { + pool: "0x2BB2DeAeF5D4E62D3798Ce67C3D623da09188AB9", + fromBlock: 23864003, + }, + base: { + pool: "0x60B393a76cEa4a3AFff00e1Fb08d0F63A8F4A314", + fromBlock: 23809396, + }, + scroll: { + pool: "0xA407e0637b22e1F64395D177C8EAD26C03dC3294", + fromBlock: 11975196, + } +} + + module.exports = { - start: 1714060800, // Apr 26 2024 + start: '2024-04-25', // Apr 26 2024 } Object.keys(config).forEach(chain => { const { pool, fromBlock, } = config[chain] module.exports[chain] = { tvl: async (api) => { + + if (configOLD[chain]) { + const { pool, fromBlock, } = configOLD[chain] + const logs = await getLogs2({ api, factory: pool, eventAbi: EVENT_ABI_OLD, fromBlock, }) + const tokens = logs.map(i => [i.currency0, i.currency1]).flat() + await sumTokens2({ api, owner: pool, tokens, }) + } + const logs = await getLogs2({ api, factory: pool, eventAbi: EVENT_ABI, fromBlock, }) const tokens = logs.map(i => [i.currency0, i.currency1]).flat() return sumTokens2({ api, owner: pool, tokens, }) diff --git a/projects/FirepotSwap/index.js b/projects/FirepotSwap/index.js index 1a845539f4..185f18a3c3 100644 --- a/projects/FirepotSwap/index.js +++ b/projects/FirepotSwap/index.js @@ -2,7 +2,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const FACTORY = "0xe63Cf585Dae8273A5e37AfF6da2f823FBf3Eb5BE" // This factory is on AirDAO Mainnet (Chain Id: 16718) -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true, }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, }) module.exports = { misrepresentedTokens: true, diff --git a/projects/FlashLiquidity/index.js b/projects/FlashLiquidity/index.js index 54711fd727..c2094aa267 100644 --- a/projects/FlashLiquidity/index.js +++ b/projects/FlashLiquidity/index.js @@ -1,7 +1,7 @@ const { getUniTVL } = require("../helper/unknownTokens"); const factory = "0x6e553d5f028bD747a27E138FA3109570081A23aE" -const tvl = getUniTVL({ factory, useDefaultCoreAssets: true, fetchBalances: true, }) +const tvl = getUniTVL({ factory, useDefaultCoreAssets: true, }) module.exports = { misrepresentedTokens: true, diff --git a/projects/FlitSwap/index.js b/projects/FlitSwap/index.js index f72478cc59..dc0b84a270 100644 --- a/projects/FlitSwap/index.js +++ b/projects/FlitSwap/index.js @@ -4,7 +4,6 @@ module.exports = { misrepresentedTokens: true, op_bnb: { tvl: getUniTVL({ - fetchBalances: true, useDefaultCoreAssets: true, factory: '0x243f0218EF4cB8FC922ddd6d44e2DdE5b95DCa89', }) diff --git a/projects/Fountain-Protocol/index.js b/projects/Fountain-Protocol/index.js index 391f1c2ba9..7c44d2f60c 100644 --- a/projects/Fountain-Protocol/index.js +++ b/projects/Fountain-Protocol/index.js @@ -1,23 +1,14 @@ -const {usdCompoundExports} = require('../helper/compound'); -const sdk = require("@defillama/sdk"); +const {compoundExports2} = require('../helper/compound'); +const { mergeExports } = require('../helper/utils'); const unitroller_classic_oasis = '0xA7684aE7e07Dac91113900342b3ef25B9Fd1D841'; -const ftoken_classic_oasis = '0xD7d588bAbFb99E82Cd6dd0cA7677A5599AA678B5'; - const unitroller_usd_oasis = '0x1C0C30795802Bf2B3232a824f41629BbBCF63127'; -const ftoken_usd_oasis ='0x2552707D66C102c12b0f8284824F80e1299cB6B7'; - const unitroller_lpt_oasis = '0x7c4d0c834701C6E7F57b8c1424d30aDC46eA0840'; -const ftoken_lpt_oasis ='0x63f1Fe2E1da490611FC16E4a5d92b7ec7d0911a9'; - -const classic_lending = usdCompoundExports(unitroller_classic_oasis, "oasis", ftoken_classic_oasis) -const stable_lending = usdCompoundExports(unitroller_usd_oasis, "oasis", ftoken_usd_oasis) -const lpt_lending = usdCompoundExports(unitroller_lpt_oasis, "oasis", ftoken_lpt_oasis) -module.exports={ - oasis:{ - tvl: sdk.util.sumChainTvls([classic_lending.tvl, stable_lending.tvl, lpt_lending.tvl]), - borrowed: sdk.util.sumChainTvls([classic_lending.borrowed, stable_lending.borrowed, lpt_lending.borrowed]) - }, - methodology: "TVL is comprised of tokens deposited to the protocol as collateral from serveral pools, similar to Compound Finance and the borrowed tokens are not counted as TVL. ", -}; +module.exports= mergeExports([ + [unitroller_classic_oasis, '0xd7d588babfb99e82cd6dd0ca7677a5599aa678b5'], + [unitroller_usd_oasis], + [unitroller_lpt_oasis, '0x63f1fe2e1da490611fc16e4a5d92b7ec7d0911a9'], +].map( ([comptroller, cether]) => ({ + oasis: compoundExports2({ comptroller, cether, }), +}))) \ No newline at end of file diff --git a/projects/HyperBlast/index.js b/projects/HyperBlast/index.js index be608acd72..0a8d4b1656 100644 --- a/projects/HyperBlast/index.js +++ b/projects/HyperBlast/index.js @@ -6,7 +6,6 @@ module.exports = { tvl: getUniTVL({ factory: '0xD97fFc2041a8aB8f6bc4aeE7eE8ECA485381D088', useDefaultCoreAssets: true, - fetchBalances: true, }), }, } \ No newline at end of file diff --git a/projects/Infernoswap/index.js b/projects/Infernoswap/index.js index 7150a5b11a..27c48287e2 100644 --- a/projects/Infernoswap/index.js +++ b/projects/Infernoswap/index.js @@ -1,4 +1,5 @@ const { uniTvlExport } = require('../helper/unknownTokens'); module.exports.hallmarks = [[1703808000, "Rug Pull"]] -module.exports = uniTvlExport('beam', '0x671235E91df0A21F319260F9e93Fc459519E163C', { fetchBalances: true}) \ No newline at end of file +module.exports = uniTvlExport('beam', '0x671235E91df0A21F319260F9e93Fc459519E163C', { fetchBalances: true}) // lies about token balance +module.exports.deadFrom = 1703808000 \ No newline at end of file diff --git a/projects/Inufair/index.js b/projects/Inufair/index.js index d598957130..24c851862e 100644 --- a/projects/Inufair/index.js +++ b/projects/Inufair/index.js @@ -1,4 +1,4 @@ const { uniTvlExport } = require('../helper/unknownTokens'); module.exports.hallmarks=[[1705708800,"Rug Pull"]]; -module.exports = uniTvlExport('zkfair', '0x3582Ccde3F786229CE6Dbd88c5aDb86bF64DAA31', { fetchBalances: true, }) +module.exports = uniTvlExport('zkfair', '0x3582Ccde3F786229CE6Dbd88c5aDb86bF64DAA31') diff --git a/projects/KyborgExchange/index.js b/projects/KyborgExchange/index.js index ce604dec3b..63333c7f9f 100644 --- a/projects/KyborgExchange/index.js +++ b/projects/KyborgExchange/index.js @@ -9,6 +9,7 @@ module.exports = { hallmarks: [ [1684108800, "Rug Pull"] ], + deadFrom: '2023-05-15', methodology: `Counts the tokens balances of the KyborgHub contract`, }; diff --git a/projects/LairFinance/index.js b/projects/LairFinance/index.js new file mode 100644 index 0000000000..8e815ec5ce --- /dev/null +++ b/projects/LairFinance/index.js @@ -0,0 +1,13 @@ +const contracts = { + stKAIA: '0x42952B873ed6f7f0A7E4992E2a9818E3A9001995', + node: '0x7949597f453592B782EC9036Af27d63Ed9774b2d', +} + +async function tvl(api) { + const tvl = await api.call({ target: contracts.node, abi: "uint256:getTotalClaimable" }) + api.addGasToken(tvl) +} + +module.exports = { + klaytn: { tvl } +} \ No newline at end of file diff --git a/projects/LamaMiner/index.js b/projects/LamaMiner/index.js index 0c13ec936a..8df22f0176 100644 --- a/projects/LamaMiner/index.js +++ b/projects/LamaMiner/index.js @@ -9,7 +9,7 @@ const LP_LQDX_LAMA = "0x3a74922803415Dfc43c0030d47707b20f4c1b05d" module.exports = { misrepresentedTokens: true, methodology: 'counts the number of LAMA tokens in the Lama Miner contract.', - start: 1711962980, + start: '2024-04-01', avax: { tvl: sumTokensExport({ owner: LAMA_MINER_CONTRACT, tokens: [LAMA_TOKEN_CONTRACT], lps: [LP_LAMA_WAVAX], useDefaultCoreAssets: true, }), staking: sumTokensExport({ owner: LAMA_STAKING_CONTRACT, tokens: [LAMA_TOKEN_CONTRACT], lps: [LP_LAMA_WAVAX, LP_LQDX_LAMA], useDefaultCoreAssets: true, }) diff --git a/projects/LemonBlast/index.js b/projects/LemonBlast/index.js index 018a1e7110..937330fcee 100644 --- a/projects/LemonBlast/index.js +++ b/projects/LemonBlast/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - blast: { tvl: getUniTVL({ factory: '0x31329BcDC90faD4d65764ccf91f833ec1d5fB5A4', useDefaultCoreAssets: true, fetchBalances: true, }), }, + blast: { tvl: getUniTVL({ factory: '0x31329BcDC90faD4d65764ccf91f833ec1d5fB5A4', useDefaultCoreAssets: true,}), }, } diff --git a/projects/LuigiSwap/index.js b/projects/LuigiSwap/index.js index e510d69846..cbe4b40e00 100644 --- a/projects/LuigiSwap/index.js +++ b/projects/LuigiSwap/index.js @@ -6,14 +6,12 @@ module.exports = { tvl: getUniTVL({ factory: "0x0dAe6d22182c20AB9150a4DCB3160591Dc41027a", useDefaultCoreAssets: true, - fetchBalances: true, }), }, scroll: { tvl: getUniTVL({ factory: "0x0dAe6d22182c20AB9150a4DCB3160591Dc41027a", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/Magnate/index.js b/projects/Magnate/index.js index 707b662419..4f66a7b269 100644 --- a/projects/Magnate/index.js +++ b/projects/Magnate/index.js @@ -8,4 +8,5 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2023-08-25')/1e3), 'Project Rugged'], ], + deadFrom: Math.floor(new Date('2023-08-25')/1e3) }; diff --git a/projects/MantaTimeLockContract/index.js b/projects/MantaTimeLockContract/index.js index 48c2933078..fcac3efcfd 100644 --- a/projects/MantaTimeLockContract/index.js +++ b/projects/MantaTimeLockContract/index.js @@ -6,7 +6,6 @@ const TIME_LOCK_CONTRACT = '0x8Bb6CaE3f1CADA07Dd14bA951e02886ea6bBA183'; module.exports = { methodology: 'counts the number of (MANTA OR STONE) in the time lock contract.', - start: 1497066, manta: { tvl: sumTokensExport({ owner: TIME_LOCK_CONTRACT, tokens: [MANTA, STONE] }), } diff --git a/projects/MeowMiner/index.js b/projects/MeowMiner/index.js index 5ef8c54a5a..e4a47d8026 100644 --- a/projects/MeowMiner/index.js +++ b/projects/MeowMiner/index.js @@ -5,7 +5,7 @@ const LP_MEOW_WAVAX = "0xbbf8e4b9AD041edE1F5270CAf5b7B41F0e55f719" module.exports = { methodology: 'counts the number of MEOW tokens in the Meow Miner contract.', - start: 1710293916, + start: '2024-03-13', avax: { tvl: sumTokensExport({ owner: MEOW_MINER_CONTRACT, tokens: [MEOW_TOKEN_CONTRACT], lps: [LP_MEOW_WAVAX], useDefaultCoreAssets: true, }), } diff --git a/projects/MeowProtocol/index.js b/projects/MeowProtocol/index.js index 73cb330368..2a1fd28619 100644 --- a/projects/MeowProtocol/index.js +++ b/projects/MeowProtocol/index.js @@ -19,4 +19,7 @@ Object.keys(config).forEach(chain => { return api.getBalances() } } -}) \ No newline at end of file +}) + + + module.exports.deadFrom = '2024-05-09' \ No newline at end of file diff --git a/projects/Metahub-Finance/index.js b/projects/Metahub-Finance/index.js new file mode 100644 index 0000000000..9108edcd6e --- /dev/null +++ b/projects/Metahub-Finance/index.js @@ -0,0 +1,22 @@ +const { sumTokensExport } = require("../helper/unwrapLPs") +const ADDRESSES = require('../helper/coreAssets.json') +const MEN_TOKEN_CONTRACT = '0x94b959c93761835f634B8d6E655070C58E2CAa12'; +const owners = [ + '0xF3Bc54A6b9615569194a203f852E64476f70d875', + '0x58e353BA88F22d6955b99Ee3a84826751F5B01be', + '0x126b40E61efAE1ef7b86ed3ffF4083369E3DaDF3', + '0x8Db60A7F9Ff1C92288C905fE780aE4D6f69Dd72e', + '0x0C6feFB39a0fe19054490F18C3Cb2412f407F650', + '0xf72d1642a6ce6e8b50597b6dca636488e14b666b', + '0xf416E1c9AdeCc1F8AF16E5fc26b06F69520A613b', + '0x1a0900f58ed4c558a0b35f184276ec9383ff29b0', + '0x56485038b32a24C7f5Ee1449eaC7f444ca4b21F2' +] + +module.exports = { + polygon: { + tvl: sumTokensExport({ owners, token: ADDRESSES.polygon.USDT, }), + staking: sumTokensExport({ owners, token: MEN_TOKEN_CONTRACT }), + pool2: sumTokensExport({ owners, token: '0xD12bA2A40289Ed8728682447DC77D001F03675F9', resolveLP: true, }), + }, +} \ No newline at end of file diff --git a/projects/MorFi/index.js b/projects/MorFi/index.js new file mode 100644 index 0000000000..c0ab9c3f66 --- /dev/null +++ b/projects/MorFi/index.js @@ -0,0 +1,9 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +module.exports = uniV3Export({ + morph: { + factory: "0x1be404c921ef85537233ef2be251a27583072861", + fromBlock: 166014, + isAlgebra: true, + }, +}); \ No newline at end of file diff --git a/projects/MorpheusAI/index.js b/projects/MorpheusAI/index.js index 9166275130..52c17377f1 100644 --- a/projects/MorpheusAI/index.js +++ b/projects/MorpheusAI/index.js @@ -16,7 +16,7 @@ module.exports = { timetravel: true, misrepresentedTokens: false, methodology: 'Calculates TVL based on stETH deposits in the project contract.', - start: 1707378815, // Feb-08-2024 07:33:35 AM UTC in Unix timestamp + start: '2024-02-08', // Feb-08-2024 07:33:35 AM UTC in Unix timestamp ethereum: { tvl }, diff --git a/projects/OCP/index.js b/projects/OCP/index.js index 745ef6b4d6..4bde384bb6 100644 --- a/projects/OCP/index.js +++ b/projects/OCP/index.js @@ -1,7 +1,7 @@ const { compoundExports } = require('../helper/compound') module.exports = { - bsc: compoundExports('0xc001c415b7e78ea4a3edf165d8f44b70391f8c3c', 'bsc', undefined, undefined, undefined, undefined, { blacklistedTokens: ['0x3c70260eee0a2bfc4b375feb810325801f289fbd', '0x5801d0e1c7d977d78e4890880b8e579eb4943276']}), + bsc: compoundExports('0xc001c415b7e78ea4a3edf165d8f44b70391f8c3c', undefined, undefined, { blacklistedTokens: ['0x3c70260eee0a2bfc4b375feb810325801f289fbd', '0x5801d0e1c7d977d78e4890880b8e579eb4943276']}), hallmarks: [ [Math.floor(new Date('2022-02-14')/1e3), 'Project abandoned by the team'], ], diff --git a/projects/Omnidrome/index.js b/projects/Omnidrome/index.js index f5fc988682..79149493ce 100644 --- a/projects/Omnidrome/index.js +++ b/projects/Omnidrome/index.js @@ -6,6 +6,6 @@ module.exports = { tvl: uniTvlExport("0x769d1BcB5FDf30F5a9D19f1ab8A3cF8b60a6e855", undefined, undefined, { allPairsLength: 'uint256:allPoolsLength', allPairs: 'function allPools(uint256) view returns (address)', - }, { fetchBalances: true, useDefaultCoreAssets: true, hasStablePools: true, }), + }, { useDefaultCoreAssets: true, hasStablePools: true, }), }, } diff --git a/projects/OpankeSwap/index.js b/projects/OpankeSwap/index.js index a523d98fdf..5c73708b24 100644 --- a/projects/OpankeSwap/index.js +++ b/projects/OpankeSwap/index.js @@ -6,7 +6,6 @@ module.exports = { tvl: getUniTVL({ factory: "0x4523A7f5414bAc9BfbDfc6eF0932Bf580C3cf9f1", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/OreSwap/index.js b/projects/OreSwap/index.js index f2bd8b4d59..ddf01264a4 100644 --- a/projects/OreSwap/index.js +++ b/projects/OreSwap/index.js @@ -3,6 +3,6 @@ const { getUniTVL, } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, core: { - tvl: getUniTVL({ factory: '0xbA862e0B955c612EEd514E722c84F1E70962457e', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0xbA862e0B955c612EEd514E722c84F1E70962457e', useDefaultCoreAssets: true, }), }, }; diff --git a/projects/PattieSwap/index.js b/projects/PattieSwap/index.js index c5c5a6d69e..118acef1dd 100644 --- a/projects/PattieSwap/index.js +++ b/projects/PattieSwap/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - bsc: { tvl: getUniTVL({ factory: '0x71f6a913b317d2BF0Bf51Fd48d90e4cC6e62C4Dd', useDefaultCoreAssets: true, fetchBalances: true, }), }, + bsc: { tvl: getUniTVL({ factory: '0x71f6a913b317d2BF0Bf51Fd48d90e4cC6e62C4Dd', useDefaultCoreAssets: true, }), }, } diff --git a/projects/PinSwap/index.js b/projects/PinSwap/index.js new file mode 100644 index 0000000000..10fc1049a5 --- /dev/null +++ b/projects/PinSwap/index.js @@ -0,0 +1,10 @@ +const { getUniTVL } = require("../helper/unknownTokens"); +module.exports = { + misrepresentedTokens: true, + iotex: { + tvl: getUniTVL({ + factory: "0x0A753dD1AFDE272a2d4bf55dF616568744201577", + useDefaultCoreAssets: true, + }), + }, +}; diff --git a/projects/PoorExchange/index.js b/projects/PoorExchange/index.js index 2a8e7f52a3..e9140ed148 100644 --- a/projects/PoorExchange/index.js +++ b/projects/PoorExchange/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('arbitrum', '0x9fA0988D9e4b6362e0aaA02D1A09196a78c177e1', { fetchBalances: true, }) +module.exports = uniTvlExport('arbitrum', '0x9fA0988D9e4b6362e0aaA02D1A09196a78c177e1') diff --git a/projects/Produs/index.js b/projects/Produs/index.js index be8684fb5c..ab90dd59a9 100644 --- a/projects/Produs/index.js +++ b/projects/Produs/index.js @@ -3,6 +3,6 @@ const { getUniTVL, } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, bsc: { - tvl: getUniTVL({ factory: '0x8ae5527706446943cBA8589313EC217a4a7288a4', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x8ae5527706446943cBA8589313EC217a4a7288a4', useDefaultCoreAssets: true, }), }, }; diff --git a/projects/PyreSwap/index.js b/projects/PyreSwap/index.js index bd1797bd0e..3fb46e898b 100644 --- a/projects/PyreSwap/index.js +++ b/projects/PyreSwap/index.js @@ -6,6 +6,6 @@ module.exports = { ['fantom', 'bsc', 'avax'].forEach(chain => { module.exports[chain] = { - tvl: getUniTVL({ factory: '0x045d720873f0260e23da812501a7c5930e510aa4', useDefaultCoreAssets: true, fetchBalances: true, }) + tvl: getUniTVL({ factory: '0x045d720873f0260e23da812501a7c5930e510aa4', useDefaultCoreAssets: true, }) } }) \ No newline at end of file diff --git a/projects/SRWAio/index.js b/projects/SRWAio/index.js new file mode 100644 index 0000000000..a1ed193b07 --- /dev/null +++ b/projects/SRWAio/index.js @@ -0,0 +1,31 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const { queryAddresses, sumTokens } = require('../helper/chain/radixdlt'); + +const componentAddress = 'component_rdx1cps7jyr7vqrtm2uxj8d77a9fyjkv804nhqzvfn2u7m58tg3wdk2qky' + +const resources = [ + { + address: ADDRESSES.radixdlt.XRD, + }, + { + address: 'resource_rdx1t4upr78guuapv5ept7d7ptekk9mqhy605zgms33mcszen8l9fac8vf', + } +] + +async function tvl(api) { + return sumTokens({ api, owners: [componentAddress] }); +} + +async function borrowed(api) { + const componentData = await queryAddresses({ addresses: [componentAddress] }); + resources.forEach((resource) => { + const matchingEntry = componentData[0].details.state.fields[12]?.entries.find((entry) => entry.key.value === resource.address); + api.add(matchingEntry.key.value, Number(matchingEntry.value.value)); + }); +} + +module.exports = { + radixdlt: { tvl, borrowed }, + timetravel: false, +}; \ No newline at end of file diff --git a/projects/Scale/index.js b/projects/Scale/index.js index 2b179553ea..ff0a304401 100644 --- a/projects/Scale/index.js +++ b/projects/Scale/index.js @@ -4,7 +4,7 @@ const { staking } = require('../helper/staking') module.exports = { misrepresentedTokens: true, base:{ - tvl: uniTvlExport("0xEd8db60aCc29e14bC867a497D94ca6e3CeB5eC04", "base", undefined, undefined, { hasStablePools: true, useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: uniTvlExport("0xEd8db60aCc29e14bC867a497D94ca6e3CeB5eC04", "base", undefined, undefined, { hasStablePools: true, useDefaultCoreAssets: true, }), staking: staking("0x28c9c71c776a1203000b56c0cca48bef1cd51c53", "0x54016a4848a38f257b6e96331f7404073fd9c32c"), }, } diff --git a/projects/SquadSwap-v3/index.js b/projects/SquadSwap-v3/index.js index 289e6633ba..56b4d2953b 100644 --- a/projects/SquadSwap-v3/index.js +++ b/projects/SquadSwap-v3/index.js @@ -1,6 +1,10 @@ const { uniV3Export } = require('../helper/uniswapV3') -const factory = '0x009c4ef7C0e0Dd6bd1ea28417c01Ea16341367c3' module.exports = uniV3Export({ - bsc: { factory, fromBlock: 34184408 } + bsc: { factory: '0x009c4ef7C0e0Dd6bd1ea28417c01Ea16341367c3', fromBlock: 34184408 }, + base: { factory: '0xa1288b64F2378276d0Cc56F08397F70BecF7c0EA', fromBlock: 19730499 }, + blast: { factory: '0x6Ea64BDCa26F69fdeF36C1137A0eAe5Bf434e8fd', fromBlock: 5644236 }, + arbitrum: { factory: '0x0558921f7C0f32274BB957D5e8BF873CE1c0c671', fromBlock: 253170358 }, + polygon: { factory: '0x633Faf3DAc3677b51ea7A53a81b79AEe944714dc', fromBlock: 61864971 }, + optimism: { factory: '0xa1288b64F2378276d0Cc56F08397F70BecF7c0EA', fromBlock: 125326692 }, }) diff --git a/projects/SquadSwap/index.js b/projects/SquadSwap/index.js index ce4ef4e103..eff4b963aa 100644 --- a/projects/SquadSwap/index.js +++ b/projects/SquadSwap/index.js @@ -1,19 +1,27 @@ const { stakings } = require("../helper/staking"); const { getUniTVL } = require('../helper/unknownTokens') -const masterchefV2Address = '0x2e881a10f682a3b2CBaaF8fc5A9a94E98D4879B4'; // SquadSwap's MasterChef V2 contract -const masterchefV3Address = '0x44eC8143EB368cAbB00c4EfF085AF276260202B5'; // SquadSwap's MasterChef V3 contract -const squadTokenAddress = '0x2d2567dec25c9795117228adc7fd58116d2e310c'; // SquadSwap token contract + + +const config = { + bsc: { factory: '0x1D9F43a6195054313ac1aE423B1f810f593b6ac1', masterchefs: ['0x2e881a10f682a3b2CBaaF8fc5A9a94E98D4879B4', '0x44eC8143EB368cAbB00c4EfF085AF276260202B5'], token: '0x2d2567dec25c9795117228adc7fd58116d2e310c' }, + base: { factory: '0xba34aA640b8Be02A439221BCbea1f48c1035EEF9', masterchefs: ['0xB6171582C75421A740dcC15E4D873a34Cb2Ebb48', '0x89c0619E7A798309193438b3Cff11f1F31266711'], token: '0x08Ccb86a31270Fd97D927A4e17934C6262A68b7E' }, + blast: { factory: '0x4B599f3425D54AfBf94bFD41EA9931fF92AD6551', masterchefs: ['0xdeE10310E729C36a560c72c0E8E3be0e46673063', '0xda3840837Df961A710C889e0D23295dF82cCfF8b'], token: '0x08Ccb86a31270Fd97D927A4e17934C6262A68b7E' }, + arbitrum: { factory: '0xba34aA640b8Be02A439221BCbea1f48c1035EEF9', masterchefs: ['0x6dAafc12F65801afb2F0B0212a8229F224Acf576', '0xA9E236aa88D3D9d5D4499D1b6ffA7ec170dA5DCA'], token: '0x08Ccb86a31270Fd97D927A4e17934C6262A68b7E' }, + polygon: { factory: '0xEE8F37D490CB7Ea1dae7d080c5738894731299f0', masterchefs: ['0x1D9F43a6195054313ac1aE423B1f810f593b6ac1', '0xb4286E807A8107cC3344d3094468DC44D73b49c2'], token: '0x5eBB1ff6dc0759f7A6253d0568A610650Dd0d050' }, + optimism: { factory: '0xba34aA640b8Be02A439221BCbea1f48c1035EEF9', masterchefs: ['0xB6171582C75421A740dcC15E4D873a34Cb2Ebb48', '0x89c0619E7A798309193438b3Cff11f1F31266711'], token: '0x08Ccb86a31270Fd97D927A4e17934C6262A68b7E' }, + +} + module.exports = { - methodology: "TVL is calculated from total liquidity of SquadSwap's active pools", - bsc: { - tvl: getUniTVL({ - factory: '0x1D9F43a6195054313ac1aE423B1f810f593b6ac1', - useDefaultCoreAssets: true, - }), - staking: stakings([ - masterchefV2Address, - masterchefV3Address, - ], squadTokenAddress) - } -}; + methodology: "TVL is calculated from total liquidity of SquadSwap's active pools", + misrepresentedTokens: true +} + +Object.keys(config).forEach(chain => { + const { factory, masterchefs, token, } = config[chain] + module.exports[chain] = { + tvl: getUniTVL({ factory, useDefaultCoreAssets: true, }), + staking: token && stakings(masterchefs, token) + } +}) \ No newline at end of file diff --git a/projects/SwapX-algebra/index.js b/projects/SwapX-algebra/index.js new file mode 100644 index 0000000000..4cc6ff5bd0 --- /dev/null +++ b/projects/SwapX-algebra/index.js @@ -0,0 +1,11 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +const SWAPX_ALGEBRA_FACTORY = "0x8121a3F8c4176E9765deEa0B95FA2BDfD3016794" + +module.exports = uniV3Export({ + sonic: { + factory: SWAPX_ALGEBRA_FACTORY, + fromBlock: 1440914, + isAlgebra: true + } +}); \ No newline at end of file diff --git a/projects/SwapX-v2/index.js b/projects/SwapX-v2/index.js new file mode 100644 index 0000000000..54438ef295 --- /dev/null +++ b/projects/SwapX-v2/index.js @@ -0,0 +1,9 @@ +const { uniTvlExport } = require("../helper/calculateUniTvl"); + +module.exports = { + misrepresentedTokens: true, + sonic: { + tvl: uniTvlExport("0x05c1be79d3aC21Cc4B727eeD58C9B2fF757F5663", undefined, undefined, { + }, { useDefaultCoreAssets: true, hasStablePools: true, }), + } +}; diff --git a/projects/TonStable/index.js b/projects/TonStable/index.js new file mode 100644 index 0000000000..6f0a12dad5 --- /dev/null +++ b/projects/TonStable/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require("../helper/coreAssets.json"); + +const tonStableAddr = "EQC2Bt4vwcSgCwABlOfgl75GbGuC0GpRU2GsZKqqMHu-T0gk"; + +module.exports = { + methodology: "TonStable's TVL includes all deposited supported assets", + ton: { + tvl: sumTokensExport({ owner: tonStableAddr, tokens: [ADDRESSES.null] }), + }, +}; diff --git a/projects/XDX/index.js b/projects/XDX/index.js index 388e2f70dd..5bcc175f7e 100644 --- a/projects/XDX/index.js +++ b/projects/XDX/index.js @@ -4,7 +4,6 @@ module.exports = { misrepresentedTokens: true, blast: { tvl: getUniTVL({ - fetchBalances: true, useDefaultCoreAssets: true, factory: '0xF55dE36072beCebF162d2d54C49964f3b0683711', }) diff --git a/projects/ZTLN/index.js b/projects/ZTLN/index.js new file mode 100644 index 0000000000..c8f8aff25d --- /dev/null +++ b/projects/ZTLN/index.js @@ -0,0 +1,43 @@ +const { request } = require("graphql-request"); + +const endpoint = "https://api.studio.thegraph.com/query/77016/wallet-mainnet/version/latest"; + +const securityAddress = '0x917991d52Aa2fC1b5612A6aa5e4e81d580F97532'; +const query = ` +query MyQuery { + securities(where: {security: "${securityAddress}"}) { + secondaryInvestors { + amount + } + } +} +`; + +async function tvl(api) { + const data = await request(endpoint, query); + + const securities = data.securities || []; + + let tokens = 0; + const currencyDecimal = 10 ** 18; + + securities.forEach(security => { + security.secondaryInvestors.forEach(investor => { + const amt = parseFloat(investor.amount); + tokens += amt / currencyDecimal; + }); + }); + + const price = 100.5; + const tvl = tokens * price + api.addUSDValue(tvl); +} + +module.exports = { + timetravel: false, + misrepresentedTokens: true, + methodology: "The value in RWA held by the protocol", + ethereum: { + tvl + }, +}; \ No newline at end of file diff --git a/projects/Zolidly/index.js b/projects/Zolidly/index.js index ebb6c6a558..c3fa2b9879 100644 --- a/projects/Zolidly/index.js +++ b/projects/Zolidly/index.js @@ -5,6 +5,7 @@ module.exports = { hallmarks: [ [1684713600, "Rug Pull"] ], + deadFrom: '2023-05-22', era: { tvl: getUniTVL({ factory: '0x6E1315819908Eaa036405f405c033cC2BfFBFc75', diff --git a/projects/ZukeSwap/index.js b/projects/ZukeSwap/index.js index 6d16f07a58..c9f4fe1215 100644 --- a/projects/ZukeSwap/index.js +++ b/projects/ZukeSwap/index.js @@ -4,6 +4,7 @@ module.exports = { hallmarks: [ [1680307200, "Rug Pull"] ], + deadFrom: '2023-04-01', misrepresentedTokens: true, loop: { tvl: getUniTVL({ diff --git a/projects/a51-finance-v3/index.js b/projects/a51-finance-v3/index.js index 7d3e171b29..5b18a09575 100644 --- a/projects/a51-finance-v3/index.js +++ b/projects/a51-finance-v3/index.js @@ -40,6 +40,8 @@ const config = { manta: [{ target: "0x69317029384c3305fC04670c68a2b434e2D8C44C", helper: "0xa1d8180f4482359ceb7eb7437fcf4a2616830f81", startBlock: 1834975 },], // lynex linea: [{target: "0xA8Dc31c8C9F93dB2e42A5472F580689794639576",helper: "0x965356eb2C208Ce4130E267342cA720042Cce7b2",startBlock: 4518443,},], + // swapmode + mode: [{ target: "0x69317029384c3305fC04670c68a2b434e2D8C44C", helper: "0xFFD9acf25F2D930BE88D486D588ecBa7a418DE0B", startBlock: 11042629 },], } module.exports = { diff --git a/projects/aave-v3/index.js b/projects/aave-v3/index.js new file mode 100644 index 0000000000..2bb6fcc040 --- /dev/null +++ b/projects/aave-v3/index.js @@ -0,0 +1,58 @@ +const abi = { + getReserveTokensAddresses: "function getReserveTokensAddresses(address asset) view returns (address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress)", + getAllReservesTokens: "function getAllReservesTokens() view returns ((string symbol, address tokenAddress)[])", + getReserveData: "function getReserveData(address asset) view returns (uint256 unbacked, uint256 accruedToTreasuryScaled, uint256 totalAToken, uint256 totalStableDebt, uint256 totalVariableDebt, uint256 liquidityRate, uint256 variableBorrowRate, uint256 stableBorrowRate, uint256 averageStableBorrowRate, uint256 liquidityIndex, uint256 variableBorrowIndex, uint40 lastUpdateTimestamp)", +}; + +const CONFIG = { + ethereum: ['0x41393e5e337606dc3821075Af65AeE84D7688CBD', '0x08795CFE08C7a81dCDFf482BbAAF474B240f31cD', '0xE7d490885A68f00d9886508DF281D67263ed5758'], + polygon: ['0x7F23D86Ee20D869112572136221e173428DD740B'], + avax: ['0x7F23D86Ee20D869112572136221e173428DD740B'], + arbitrum: ['0x7F23D86Ee20D869112572136221e173428DD740B'], + optimism: ['0x7F23D86Ee20D869112572136221e173428DD740B'], + harmony: ['0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654'], + fantom: ['0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654'], + metis: ['0xC01372469A17b6716A38F00c277533917B6859c0'], + base: ['0xd82a47fdebB5bf5329b09441C3DaB4b5df2153Ad'], + xdai: ['0x57038C3e3Fe0a170BB72DE2fD56E98e4d1a69717'], + scroll: ['0xe2108b60623C6Dcf7bBd535bD15a451fd0811f7b'], + bsc: ['0x23dF2a19384231aFD114b036C14b6b03324D79BC'], + era: ['0x5F2A704cE47B373c908fE8A29514249469b52b99'] +}; + +const fetchReserveData = async (api, poolDatas, isBorrowed) => { + const reserveTokens = await api.multiCall({ calls: poolDatas, abi: abi.getAllReservesTokens }); + const calls = [] + + poolDatas.map((pool, i) => { + reserveTokens[i].forEach(({ tokenAddress }) => calls.push({ target: pool, params: tokenAddress })); + }); + const reserveData = await api.multiCall({ abi: isBorrowed ? abi.getReserveData : abi.getReserveTokensAddresses, calls, }) + const tokensAndOwners = [] + reserveData.forEach((data, i) => { + const token = calls[i].params + if (isBorrowed) { + api.add(token, data.totalVariableDebt) + api.add(token, data.totalStableDebt) + } else + tokensAndOwners.push([token, data.aTokenAddress]) + }) + + if (isBorrowed) return api.getBalances() + return api.sumTokens({ tokensAndOwners }) +} + +module.exports.methodology = "Counts the tokens locked in the contracts to be used as collateral to borrow or to earn yield. Borrowed coins are not counted towards the TVL, so only the coins actually locked in the contracts are counted. There's multiple reasons behind this but one of the main ones is to avoid inflating the TVL through cycled lending." + +Object.keys(CONFIG).forEach((chain) => { + const poolDatas = CONFIG[chain]; + module.exports[chain] = { + tvl: (api) => fetchReserveData(api, poolDatas), + borrowed: (api) => fetchReserveData(api, poolDatas, true), + }; +}); + +module.exports.hallmarks = [ + [1659630089, "Start OP Rewards"], + [1650471689, "Start AVAX Rewards"] +] diff --git a/projects/aave/v3.js b/projects/aave/v3.js deleted file mode 100644 index 302270d49b..0000000000 --- a/projects/aave/v3.js +++ /dev/null @@ -1,40 +0,0 @@ -const { aaveChainTvl, aaveExports } = require('../helper/aave'); -const methodologies = require('../helper/methodologies'); -const { mergeExports } = require('../helper/utils'); - -const v3params = ["0x770ef9f4fe897e59daCc474EF11238303F9552b6", undefined, ["0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654"]] - -function v3(chain) { - let params = v3params - if (chain === 'ethereum') - params = ['0xbaA999AC55EAce41CcAE355c77809e68Bb345170', undefined, ['0x7B4EB56E7CD4b454BA8ff71E4518426369a138a3']] - else if (chain === 'metis') - params = ['0x9E7B73ffD9D2026F3ff4212c29E209E09C8A91F5', undefined, ['0x99411FC17Ad1B56f49719E3850B2CDcc0f9bBFd8']] - else if (chain === 'base') - params = ['0x2f6571d3Eb9a4e350C68C36bCD2afe39530078E2', undefined, ['0x2d8A3C5677189723C4cB8873CfC9C8976FDF38Ac']] - else if (chain === 'xdai') - params = ['0x36616cf17557639614c1cdDb356b1B83fc0B2132', undefined, ['0x501B4c19dd9C2e06E94dA7b6D5Ed4ddA013EC741']] - else if (chain === 'scroll') - params = ['0xFBedc64AeE24921cb43004312B9eF367a4162b57', undefined, ['0xa99F4E69acF23C6838DE90dD1B5c02EA928A53ee']] - else if (chain === 'bsc') - params = ['0x117684358D990E42Eb1649E7e8C4691951dc1E71', undefined, ['0x41585C50524fb8c3899B43D7D797d9486AAc94DB']] - const section = borrowed => aaveChainTvl(chain, ...params, borrowed, true); - return { - tvl: section(false), - borrowed: section(true) - } -} - -module.exports = mergeExports({ - methodology: methodologies.lendingMarket, - avax: v3("avax"), - ...["optimism", "fantom", "harmony", "arbitrum", "polygon", "ethereum", "metis", "base", "xdai", "scroll", "bsc"].reduce((t, c) => ({ ...t, [c]: v3(c) }), {}), - hallmarks: [ - [1659630089, "Start OP Rewards"], - [1650471689, "Start AVAX Rewards"] - ], -}, { - // Lido pool - ethereum: aaveExports(undefined, "0x770ef9f4fe897e59daCc474EF11238303F9552b6", undefined, ["0xa3206d66cF94AA1e93B21a9D8d409d6375309F4A"], { v3: true, }), -}); -// node test.js projects/aave/index.js diff --git a/projects/aavegotchi/index.js b/projects/aavegotchi/index.js index 912aa44ba8..ba5ebf7e23 100644 --- a/projects/aavegotchi/index.js +++ b/projects/aavegotchi/index.js @@ -1,7 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const { staking } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const { request, gql } = require("graphql-request"); const { getBlock } = require('../helper/http') @@ -19,24 +17,14 @@ const vaultContractsPolygon = [ const GHST_Polygon = "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7"; const stkGHST_QUICKContract = "0xA02d547512Bb90002807499F05495Fe9C4C3943f"; const GHST_pools2 = [ - "0xccb9d2100037f1253e6c1682adf7dc9944498aff", // WETH_GHST_UNIV2 - "0x8B1Fd78ad67c7da09B682c5392b65CA7CaA101B9", // GHST_QUICK_UNIV2 - "0x096C5CCb33cFc5732Bcd1f3195C13dBeFC4c82f4" // GHST_USDC_UNIV2 + "0xccb9d2100037f1253e6c1682adf7dc9944498aff", // WETH_GHST_UNIV2 + "0x8B1Fd78ad67c7da09B682c5392b65CA7CaA101B9", // GHST_QUICK_UNIV2 + "0x096C5CCb33cFc5732Bcd1f3195C13dBeFC4c82f4" // GHST_USDC_UNIV2 ] -const ethTvl = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - for (const token of tokensETH) { - await sumTokensAndLPsSharedOwners( - balances, - [[token, false]], - [vaultContractETH] - ); - } - - return balances; -}; +const ethTvl = async (api) => { + return api.sumTokens({ owner: vaultContractETH, tokens: tokensETH }) +} const graphUrl = 'https://subgraph.satsuma-prod.com/tWYl5n5y04oz/aavegotchi/aavegotchi-core-matic/api' @@ -58,14 +46,14 @@ query GET_SUMMONED_GOTCHIS ($minGotchiId: Int, $block: Int) { stakedAmount } }` -async function getGotchisCollateral(timestamp, block) { +async function getGotchisCollateral(timestamp, block, api) { const allGotchis = []; let minGotchiId = 0; while (minGotchiId !== -1) { const { aavegotchis } = await request( graphUrl, - graphQuery, - {minGotchiId, block} + graphQuery, + { minGotchiId, block } ); if (aavegotchis && aavegotchis.length > 0) { minGotchiId = parseInt(aavegotchis[aavegotchis.length - 1].gotchiId); @@ -74,42 +62,18 @@ async function getGotchisCollateral(timestamp, block) { minGotchiId = -1; } } - const gotchisBalances = { - output: allGotchis.map(g => ({ - input: {target: g.collateral}, - success: true, - output: g.stakedAmount - })) - }; - - const balances = {}; - sdk.util.sumMultiBalanceOf(balances, gotchisBalances, true, x => 'polygon:' + x); - return gotchisBalances; + allGotchis.map(i => api.add(i.collateral, i.stakedAmount)); } -const polygonTvl = async (_, _block, chainBlocks) => { - const balances = {}; - const block = await getBlock(_, 'polygon', chainBlocks) - 500 - - let transformAddress = i => `polygon:${i}`; - - await sumTokensAndLPsSharedOwners( - balances, - [[GHST_Polygon, false]], - vaultContractsPolygon, - block, - "polygon", - transformAddress - ); - - const gotchisBalances = await getGotchisCollateral(_, block); - sdk.util.sumMultiBalanceOf(balances, gotchisBalances, true, x => 'polygon:' + x); +const polygonTvl = async (api) => { + const block = await getBlock(api.timestamp, 'polygon', { polygon: api.block }) - 500 - return balances; + await api.sumTokens({ owners: vaultContractsPolygon, tokens: [GHST_Polygon] }) + await getGotchisCollateral(api.timestamp, block, api); }; module.exports = { - ethereum: { + ethereum: { tvl: ethTvl, }, polygon: { diff --git a/projects/abacus/index.js b/projects/abacus/index.js index 08c6fd4eb8..cd42e3ee9f 100644 --- a/projects/abacus/index.js +++ b/projects/abacus/index.js @@ -6,6 +6,7 @@ const config = { bsc: { strategy: '0x37e46C030e0d843b39F692c9108E54945F4CCCf7', veToken: '0xfBBF371C9B0B994EebFcC977CEf603F7f31c070D', token: '0xF4C8E32EaDEC4BFe97E0F595AdD0f4450a863a11' }, polygon: { strategy: '0x32dAc1B8AD93b53F549D6555e01c35dCC50b6229', veToken: '0xB419cE2ea99f356BaE0caC47282B9409E38200fa', token: '0xBFA35599c7AEbb0dAcE9b5aa3ca5f2a79624D8Eb' }, mantle: { strategy: '0xCaAF554900E33ae5DBc66ae9f8ADc3049B7D31dB', veToken: '0xAAAEa1fB9f3DE3F70E89f37B69Ab11B47eb9Ce6F', token: '0xC1E0C8C30F251A07a894609616580ad2CEb547F2' }, + scroll: { strategy: '0xDDFc6B230656010f314F2F659eC8ff33FaB7A9Db', veToken: '0xAAAEa1fB9f3DE3F70E89f37B69Ab11B47eb9Ce6F', token: '0xAAAE8378809bb8815c08D3C59Eb0c7D1529aD769' }, } Object.keys(config).forEach(chain => { diff --git a/projects/abc-pool/index.js b/projects/abc-pool/index.js index e358ef7546..7f61095bd7 100644 --- a/projects/abc-pool/index.js +++ b/projects/abc-pool/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const PoSPoolProxy1967_core = "cfx:type.contract:accpx9uxky39pg1hzav757vdej95w1kbcp13d0hvm7"; const PoSPoolProxy1967_espace = "0xb6eb7aa86f3886b6edc0fc1c826221b1fb26e437"; const core_rpc = "https://main.confluxrpc.com"; diff --git a/projects/aboard-exchange/index.js b/projects/aboard-exchange/index.js index 7478d5e87d..26cbc8fb9c 100644 --- a/projects/aboard-exchange/index.js +++ b/projects/aboard-exchange/index.js @@ -6,7 +6,7 @@ const { sumTokensExport } = require('../helper/unwrapLPs'); module.exports = { methodology: "TVL is equal to users' deposits minus withdrawals", - start: 1641625200, // Jan-08-2022 07:00:00 AM +UTC + start: '2022-01-08', // Jan-08-2022 07:00:00 AM +UTC } const config = { diff --git a/projects/abracadabra/market.json b/projects/abracadabra/market.json index 8d045db778..dd0f5d0a27 100644 --- a/projects/abracadabra/market.json +++ b/projects/abracadabra/market.json @@ -9,7 +9,11 @@ "0x7962ACFcfc2ccEBC810045391D60040F635404fb": "0x09400D9DB990D5ed3f35D7be61DfAEB900Af03C9", "0x66805F6e719d7e67D46e8b2501C1237980996C6a": "0x7f1fa204bb700853D36994DA19F830b6Ad18455C", "0x49De724D7125641F56312EBBcbf48Ef107c8FA57": "0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f", - "0x780db9770dDc236fd659A39430A8a7cC07D0C320": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1" + "0x780db9770dDc236fd659A39430A8a7cC07D0C320": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "0x6B04C535C852AD19345571247ee12B5BF23dAcB6": "0x6985884C4392D348587B19cb9eAAf157F13271cd", + "0xFCE0b2fe7d7d5057C82A896e4D8EC0e4b813f71f": "0x58538e6A46E07434d7E7375Bc268D3cb839C0133", + "0x9fF8b4C842e4a95dAB5089781427c836DAE94831": "0x7C11F78Ce78768518D743E81Fdfa2F860C6b9A77", + "0x625Fe79547828b1B54467E5Ed822a9A8a074bD61": "0x450bb6774Dd8a756274E0ab4107953259d2ac541" }, "avax": { "0x35fA7A723B3B39f15623Ff1Eb26D8701E7D6bB21": "0x0da67235dD5787D67955420C84ca1cEcd4E5Bb3b", @@ -67,7 +71,10 @@ "0x1062eb452f8c7a94276437ec1f4aaca9b1495b72": "0x38EA452219524Bb87e18dE1C24D3bB59510BD783", "0x692887E8877C6Dd31593cda44c382DB5b289B684": "0xf35b31B941D94B249EaDED041DB1b05b7097fEb6", "0x406b89138782851d3a8C04C743b010CEb0374352": "0xdCD90C7f6324cfa40d7169ef80b12031770B4325", - "0x85f60D3ea4E86Af43c9D4E9CC9095281fC25c405": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599" + "0x85f60D3ea4E86Af43c9D4E9CC9095281fC25c405": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", + "0x00380CB5858664078F2289180CC32F74440AC923": "0x5C5b196aBE0d54485975D1Ec29617D42D9198326", + "0x38E7D1e4E2dE5b06b6fc9A91C2c37828854A41bb": "0x5C5b196aBE0d54485975D1Ec29617D42D9198326", + "0xE8ed7455fa1b2a3D8959cD2D59c7f136a45BF341": "0x73075fD1522893D9dC922991542f98F08F2c1C99" }, "fantom": { "0xed745b045f9495b8bfc7b58eea8e0d0597884e12": "0x0DEC85e74A92c52b7F708c4B10207D9560CEFaf0", diff --git a/projects/abstraDex/index.js b/projects/abstraDex/index.js index 823febf75e..75dcb1d9ba 100644 --- a/projects/abstraDex/index.js +++ b/projects/abstraDex/index.js @@ -10,6 +10,7 @@ const config = { blast: '0xA7afB6163c331DDb0845843889D6f9544328846F', cyeth: '0x174c4c03dfea09682728a5959a253bf1f7c7766f', cronos_zkevm: '0x76D1fC018676f8A973474C24F40A2e14e401b770', + morph: '0x174c4C03DfeA09682728A5959A253bf1F7C7766F', } module.exports = { diff --git a/projects/acala-euphrates/index.js b/projects/acala-euphrates/index.js index 1d3c3ca66c..15c7bd079c 100644 --- a/projects/acala-euphrates/index.js +++ b/projects/acala-euphrates/index.js @@ -16,7 +16,7 @@ async function tvl(api) { module.exports = { misrepresentedTokens: true, - start: 1695657600, + start: '2023-09-25', methodology: 'total ldot and tdot locked in the euphrates contract', acala: { tvl, diff --git a/projects/access-protocol/index.js b/projects/access-protocol/index.js new file mode 100644 index 0000000000..de1f60c510 --- /dev/null +++ b/projects/access-protocol/index.js @@ -0,0 +1,24 @@ +const { getMultipleAccounts, decodeAccount } = require("../helper/solana"); +const { PublicKey } = require("@solana/web3.js"); + +async function staking(api) { + const programId = new PublicKey('6HW8dXjtiTGkD4jzXs7igdFmZExPpmwUrRN5195xGup') + const accountKey = getKey(programId); + const [account] = await getMultipleAccounts([accountKey]); + const decoded = decodeAccount('access', account); + api.add(decoded.tokenMint.toBase58(), decoded.totalStaked); +} + +const getKey = (address) => { + return PublicKey.findProgramAddressSync([address.toBuffer()], address)[0].toBase58(); +} + +module.exports = { + timetravel: false, + methodology: + "Uses the Access Protocol SDK to fetch the total supply of staked ACS tokens", + solana: { + tvl: async () => ({}), + staking, + }, +}; diff --git a/projects/accumulated-finance/index.js b/projects/accumulated-finance/index.js index 95eed412e7..4aaef007b0 100644 --- a/projects/accumulated-finance/index.js +++ b/projects/accumulated-finance/index.js @@ -62,6 +62,21 @@ const config = { "LST": "0xcba2aeec821b0b119857a9ab39e09b034249681a" }, } + ], + "oasis": [ + { + "sapphire": { + "LST": "0xed57966f1566de1a90042d07403021ea52ad4724" + } + } + ], + "stETH": [ + { + "ethereum": { + "baseToken": ADDRESSES.ethereum.STETH, + "LST": "0x684d7fd1067ed8e9686e6fd764d048b9bf92dfa9" + } + }, ] } diff --git a/projects/acet/index.js b/projects/acet/index.js new file mode 100644 index 0000000000..68378f6005 --- /dev/null +++ b/projects/acet/index.js @@ -0,0 +1,19 @@ +const stakingAccounts = [ + "0x64D2C3a33F5bc09Dc045f9A20fA4cA4f42215c0b", + "0xfb62ea552eeba8b00cc5db56ba8d7c50429c0001", + "0x38506a479E8959150466cE9253c19089fd0907D7", +]; + +const token = "0x9F3BCBE48E8b754F331Dfc694A894e8E686aC31D"; + +module.exports = { + bsc: { + tvl: async () => ({}), + staking: async (api) => { + return api.sumTokens({ + tokensAndOwners: stakingAccounts.map((account) => [token, account]), + }); + }, + }, +}; + \ No newline at end of file diff --git a/projects/acoconut/abis/singlePlus.json b/projects/acoconut/abis/singlePlus.json deleted file mode 100644 index 7936ebcea1..0000000000 --- a/projects/acoconut/abis/singlePlus.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "totalUnderlying": "uint256:totalUnderlying", - "token": "address:token" -} \ No newline at end of file diff --git a/projects/acoconut/index.js b/projects/acoconut/index.js index 65fdc8aeac..6a534fb4b6 100644 --- a/projects/acoconut/index.js +++ b/projects/acoconut/index.js @@ -1,7 +1,4 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk'); -const singlePlusAbi = require('./abis/singlePlus'); -const { sumTokens2 } = require('../helper/unwrapLPs') const tokensInacBTC = [ ADDRESSES.ethereum.WBTC, @@ -19,28 +16,13 @@ const bscSingleTokens = [ const btcb = 'bsc:' + ADDRESSES.bsc.BTCB -async function eth(timestamp, block) { - return sumTokens2({ block, owner: acBTCTokenHolder, tokens: tokensInacBTC}) +async function eth(api) { + return api.sumTokens({ owner: acBTCTokenHolder, tokens: tokensInacBTC}) } -async function bsc(timestamp, _, {bsc: block}) { - const balances = {}; - - const totalUnderlyingResults = await sdk.api.abi.multiCall({ - block, - calls: bscSingleTokens.map((address) => ({ - target: address - })), - abi: singlePlusAbi["totalUnderlying"], - chain: 'bsc' - }); - - totalUnderlyingResults.output.forEach((tokenBalanceResult) => { - const valueInToken = tokenBalanceResult.output; - sdk.util.sumSingleBalance(balances, btcb, valueInToken) - }); - - return balances; +async function bsc(api) { + const tokens = await api.multiCall({ abi: 'address:token', calls: bscSingleTokens}) + return api.sumTokens({ tokensAndOwners2: [tokens, bscSingleTokens]}) } module.exports = { @@ -50,5 +32,5 @@ module.exports = { bsc:{ tvl: bsc }, - start: 1600185600, // 09/16/2020 @ 12:00am (UTC+8) + start: '2020-09-15', // 09/16/2020 @ 12:00am (UTC+8) }; diff --git a/projects/adamantfinance/abi.json b/projects/adamantfinance/abi.json deleted file mode 100644 index dea346007a..0000000000 --- a/projects/adamantfinance/abi.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "balance": "uint256:balance", - "balanceOfVault": "uint256:balanceOf", - "balanceOf": "function balanceOf(address arg0) view returns (uint256)", - "minter": "address:minter", - "totalSupply": "uint256:totalSupply", - "coins": "function coins(uint256 arg0) view returns (address)", - "lp_token": "address:lp_token", - "decimals": "uint8:decimals" -} \ No newline at end of file diff --git a/projects/adamantfinance/index.js b/projects/adamantfinance/index.js index 8ef3d10fba..d36fbf527d 100644 --- a/projects/adamantfinance/index.js +++ b/projects/adamantfinance/index.js @@ -1,12 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); const { stakings } = require("../helper/staking"); const { getConfig } = require('../helper/cache') -const { unwrapLPsAuto, sumTokens2, } = require("../helper/unwrapLPs"); -const { - getChainTransform, -} = require("../helper/portedTokens"); +const { sumTokens2, } = require("../helper/unwrapLPs"); const { staking: stakingUnknown, } = require("../helper/unknownTokens"); const vaultsUrl = { @@ -22,15 +17,6 @@ const vaultsUrl = { const allVaultsUrl = "https://raw.githubusercontent.com/eepdev/vaults/main/current_vaults_all_chains.json"; -const NetworkID = { - ETH_MAINNET: 1, - POLYGON: 137, - ARBITRUM: 42161, - CRONOS: 25, - FRAXTAL: 252, - OPTIMISM: 10 -}; - /*** Polygon Addresses ***/ const stakingContracts_polygon = [ "0x920f22E1e5da04504b765F8110ab96A20E6408Bd", @@ -50,7 +36,6 @@ const stakingContracts_Arbitrum = [ "0x9d5d0cb1B1210d4bf0e0FdCC6aCA1583fA48f0fD", ]; -const lpAddresses_arbitrum = []; const ARBY = ADDRESSES.arbitrum.ARBY /*** Cronos Addresses ***/ @@ -61,11 +46,6 @@ const stakingContracts_cronos = [ ]; const CADDY = ADDRESSES.arbitrum.ARBY; -const vaultAddresses_cronos = [ - "0x3a9645ee664DCE6529Af678aaB4fE3AD9d68323f", - "0x6681EDBf50C0758C719F3024C282de1694807CcB", -]; - const lpAddresses_cronos = [ "0x332937463df26f46a1a715a41205765774beef80", //CADDY-WCRO Cronos "0x2a008ef8ec3ef6b03eff10811054e989aad1cf71", //CADDY-WCRO Cronos @@ -73,119 +53,60 @@ const lpAddresses_cronos = [ async function pool2Polygon(api) { - const bals = await api.multiCall({ abi: 'erc20:totalSupply', calls: vaultAddresses_polygon}) - const tokens = await api.multiCall({ abi: 'address:stakingToken', calls: vaultAddresses_polygon}) + const bals = await api.multiCall({ abi: 'erc20:totalSupply', calls: vaultAddresses_polygon }) + const tokens = await api.multiCall({ abi: 'address:stakingToken', calls: vaultAddresses_polygon }) api.addTokens(tokens, bals) return sumTokens2({ api, resolveLP: true }) } -async function polygonTvl(timestamp, block, chainBlocks) { - return await tvl2(timestamp, "polygon", NetworkID.POLYGON, chainBlocks, lpAddresses_polygon); -} - -async function arbitrumTvl(timestamp, block, chainBlocks) { - return await tvl(timestamp, "arbitrum", chainBlocks, lpAddresses_arbitrum); -} - -async function cronosTvl(timestamp, block, chainBlocks) { - return await tvl2(timestamp, "cronos", NetworkID.CRONOS, chainBlocks, lpAddresses_cronos); -} - -async function fraxtalTvl(timestamp, block, chainBlocks) { - return await tvl2(timestamp, "fraxtal", NetworkID.FRAXTAL, chainBlocks, []); //no Adamant platform token on Fraxtal -} - -async function uniTvl(balances, chain, block, uniVaults, lpAddressesIgnored, transformAddress = (a) => a) { - const vault_balances = ( - await sdk.api.abi.multiCall({ - chain: chain, - block: block, - calls: uniVaults.map((vault) => ({ - target: vault.vaultAddress, - })), - abi: abi.balance, - }) - ).output.map((val) => val.output); - - uniVaults.forEach((v, idx) => { - if ( - !lpAddressesIgnored.some( - (addr) => addr.toLowerCase() === v.lpAddress.toLowerCase() - ) - ) { - sdk.util.sumSingleBalance(balances, chain + ':' + v.lpAddress, vault_balances[idx]) - } - }); - await unwrapLPsAuto({ balances, block, chain, }); - return balances; -} - -const tvl = async (timestamp, chain, chainBlocks, lpAddressesIgnored) => { - - const block = chainBlocks[chain]; - const transformAddress = await getChainTransform(chain) - let balances = {}; - - let resp = await getConfig('adamant-fi/'+chain, vaultsUrl[chain]); - - let uniVaults = resp - .filter( - (vault) => - vault.vaultAddress !== adMESH && - vault.platform !== "dodo" - ) - .map((vault) => ({ - vaultAddress: vault.vaultAddress, - lpAddress: vault.lpAddress, - })); - balances = await uniTvl(balances, chain, block, uniVaults, lpAddressesIgnored, transformAddress); +const blacklistedTokens = [ + ...lpAddresses_polygon, + ...lpAddresses_cronos, +] - return balances; -}; - -const tvl2 = async (timestamp, chain, chainId, chainBlocks, lpAddressesIgnored) => { - - const block = chainBlocks[chain]; - const transformAddress = await getChainTransform(chain) - let balances = {}; +const blacklistedOwners = new Set([ + adMESH, + "0x01d2833e6d86D5Ad8380044DEb2cA520fc60D326", //adMESH related token/deposit + "0xbe6aa0AF32984fE3f65a73071DECC09Ab607e310", //adMESH related token/deposit +].map(i => i.toLowerCase())) - let resp = await getConfig('adamant-fi/'+chain, allVaultsUrl); +const tvl = async (api) => { + let info = await getConfig('adamant-fi/allVaults', allVaultsUrl) + if (api.chain === 'arbitrum') { + info = await getConfig('adamant-fi/arbitrumVaults', vaultsUrl.arbitrum) - let uniVaults = resp - .filter( - (vault) => - vault.vaultAddress !== adMESH && - vault.vaultAddress !== "0x01d2833e6d86D5Ad8380044DEb2cA520fc60D326" && //adMESH related token/deposit - vault.vaultAddress !== "0xbe6aa0AF32984fE3f65a73071DECC09Ab607e310" && //adMESH related token/deposit - vault.platform !== "dodo" && - vault.chainId == chainId + info = info.filter((vault) => vault.platform !== "dodo" && !blacklistedOwners.has(vault.lpAddress.toLowerCase()) ) - .map((vault) => ({ - vaultAddress: vault.vaultAddress, - lpAddress: vault.lpAddress, - })); - - balances = await uniTvl(balances, chain, block, uniVaults, lpAddressesIgnored, transformAddress); - return balances; + } else { + info = info + .filter((vault) => vault.platform !== "dodo" && vault.chainId == api.chainId && !blacklistedOwners.has(vault.lpAddress.toLowerCase())) + } + + + const tokens = info.map(i => i.lpAddress) + const vaults = info.map(i => i.vaultAddress) + const bals = await api.multiCall({ abi: "uint256:balance", calls: vaults, permitFailure: true, }) + api.addTokens(tokens, bals.map(i => i ?? 0)) + for (const token of blacklistedTokens) + api.removeTokenBalance(token) + return sumTokens2({ api, resolveLP: true }) }; module.exports = { polygon: { staking: stakings(stakingContracts_polygon, ADDY), pool2: pool2Polygon, - tvl: polygonTvl, + tvl, }, arbitrum: { staking: stakings(stakingContracts_Arbitrum, ARBY), - tvl: arbitrumTvl, + tvl, }, cronos: { staking: stakingUnknown({ owners: stakingContracts_cronos, tokens: [CADDY], chain: 'cronos', lps: lpAddresses_cronos, useDefaultCoreAssets: true }), - tvl: cronosTvl, - }, - fraxtal: { - tvl: fraxtalTvl, + tvl, }, + fraxtal: { tvl, }, methodology: "The current vaults on Adamant Finance are found on the Github. Once we have the vaults, we filter out the LP addresses of each vault and unwrap the LPs so that each token can be accounted for. Coingecko is used to price the tokens and the sum of all tokens is provided as the TVL", }; diff --git a/projects/adaxPro/index.js b/projects/adaxPro/index.js index d8edf47e0e..da9196e5d1 100644 --- a/projects/adaxPro/index.js +++ b/projects/adaxPro/index.js @@ -8,4 +8,5 @@ module.exports={ hallmarks: [ [Math.floor(new Date('2023-08-29')/1e3), 'Website offline! Rug pull?'], ], + deadFrom: Math.floor(new Date('2023-08-29')/1e3) } \ No newline at end of file diff --git a/projects/adrastea-lrt/index.js b/projects/adrastea-lrt/index.js new file mode 100644 index 0000000000..24c53d662b --- /dev/null +++ b/projects/adrastea-lrt/index.js @@ -0,0 +1,7 @@ +const { sumTokensExport } = require('../helper/solana') +module.exports = { + doublecounted: true, + solana: { + tvl: sumTokensExport({ owners: ['wYPqKV6XuRBSBU1zYiYB1ZTPhkR8PsDRz5kKgmSyum1'] }) + } +} diff --git a/projects/adrastea/index.js b/projects/adrastea/index.js new file mode 100644 index 0000000000..ff48a69156 --- /dev/null +++ b/projects/adrastea/index.js @@ -0,0 +1,6 @@ +const { sumTokensExport } = require('../helper/solana') +module.exports = { + solana: { + tvl: sumTokensExport({ owners: ['Ec5tJ1H24iVSM2L8Yd7SHf7bjtD7FUWDiYSeESpFYynM'] }) + } +} diff --git a/projects/adrena/index.js b/projects/adrena/index.js new file mode 100644 index 0000000000..510b18bf1d --- /dev/null +++ b/projects/adrena/index.js @@ -0,0 +1,35 @@ +const { sumTokens2, getConnection } = require("../helper/solana"); +const { PublicKey } = require("@solana/web3.js") +const { decodeAccount } = require('../helper/utils/solana/layout') +const ADDRESSES = require('../helper/coreAssets.json') + +async function staking() { + return sumTokens2({ tokenAccounts: ['9nD5AenzdbhRqWo7JufdNBbC4VjZ5QH7jzLuvPZy2rhb']}) +} + +async function tvl(api) { + const connection = getConnection("solana"); + + await sumTokens2({ + owner: '4o3qAErcapJ6gRLh1m1x4saoLLieWDu7Rx3wpwLc7Zk9', + balances: api.getBalances(), + blacklistedTokens: [ + 'AuQaustGiaqxRvj2gtCdrd22PBzTn8kM3kEPEkZCtuDw', // ADX + '4yCLi5yWGzpTWMQ1iWHG5CrGYAdBkhyEdsuSugjDUqwj', // ALP + ], + }); + + const rewards = await connection.getAccountInfo(new PublicKey('5GAFPnocJ4GUDJJxtExBDsH5wXzJd3RYzG8goGGCneJi')); + + // Remove rewards from AUM + api.add(ADDRESSES.solana.USDC, +decodeAccount('tokenAccount', rewards).amount.toString() * -1) +} + +module.exports = { + timetravel: false, + methodology: "TVL counts tokens deposited in the Liquidity Pool.", + solana: { + tvl, + staking, + }, +}; diff --git a/projects/aelin/index.js b/projects/aelin/index.js index 9470314fdf..68f8cc6e04 100644 --- a/projects/aelin/index.js +++ b/projects/aelin/index.js @@ -87,6 +87,9 @@ function pool2TVL(chain) { } module.exports = { + hallmarks : [ + [1702598400, "Frontend was shut down"] + ], ethereum: { tvl: tvl('ethereum'), pool2: pool2TVL('ethereum'), diff --git a/projects/aera/index.js b/projects/aera/index.js index 762598907b..0f96ce1949 100644 --- a/projects/aera/index.js +++ b/projects/aera/index.js @@ -4,6 +4,10 @@ const { getLogs } = require('../helper/cache/getLogs') const COMPOUND_ORACLE_NAME = 'CompoundV3PositionOracle' const AAVE_ORACLE_NAME = 'AaveV3PositionOracle' +const LLAMAPAY_ROUTER_ORACLE_NAME = 'LlamaPayRouterOracle' +const GEARBOX_TOKEN_PREFIX = 'Farming of' +const ARRAKIS_TOKEN_PREFIX = 'Arrakis Vault V2' +const ESXAI_POSITION_ORACLE_NAME = 'EsXai Position Oracle' const config = { polygon: { @@ -16,23 +20,24 @@ const config = { } ], cometReward: '0x45939657d1CA34A8FA39A924B71D28Fe8431e581', + arrakisHelper: '0x89E4bE1F999E3a58D16096FBe405Fc2a1d7F07D6', vaultFactories: [ - { - address: "0xfa6295a04f99815e8fa65240ed2cf9ad383c50ba", - fromBlock: 42027977 - }, - { - address: "0x3c14801dc6402e0560d69083f2b238b4c4b4dafe", - fromBlock: 42835719 - }, - { - address: "0x49b428ea1cd536e7d103e9729ea14400785e30ec", - fromBlock: 54062542 - }, - { - address: "0xa1c908cf7371047649dfca9ece01327dc6db3094", - fromBlock: 48024333 - } + { + address: "0xfa6295a04f99815e8fa65240ed2cf9ad383c50ba", + fromBlock: 42027977 + }, + { + address: "0x3c14801dc6402e0560d69083f2b238b4c4b4dafe", + fromBlock: 42835719 + }, + { + address: "0x49b428ea1cd536e7d103e9729ea14400785e30ec", + fromBlock: 54062542 + }, + { + address: "0xa1c908cf7371047649dfca9ece01327dc6db3094", + fromBlock: 48024333 + } ] }, ethereum: { @@ -49,28 +54,29 @@ const config = { } ], cometReward: '0x1B0e765F6224C21223AeA2af16c1C46E38885a40', + arrakisHelper: '0x89E4bE1F999E3a58D16096FBe405Fc2a1d7F07D6', vaultFactories: [ { - address: "0x8a7c03e9f037ba096f1fa8b48bfd65c7578327c9", - fromBlock: 17642780 + address: "0x8a7c03e9f037ba096f1fa8b48bfd65c7578327c9", + fromBlock: 17642780 }, { - address: "0xbebb92ed09688e64dc38c240b600d0b1d504ee56", - fromBlock: 17694550 + address: "0xbebb92ed09688e64dc38c240b600d0b1d504ee56", + fromBlock: 17694550 }, { - address: "0x6b8d4485e11aae228a32FAe5802c6d4BA25EA404", - fromBlock: 18143506 + address: "0x6b8d4485e11aae228a32FAe5802c6d4BA25EA404", + fromBlock: 18143506 }, { - address: "0x9500948c2BEeeB2Da4CC3aA21CB05Bd2e7C27191", - fromBlock: 18192390 + address: "0x9500948c2BEeeB2Da4CC3aA21CB05Bd2e7C27191", + fromBlock: 18192390 }, { - address: "0x38896b4ac8420b8A2B768001Da44d11109F1797D", - fromBlock: 18737324 + address: "0x38896b4ac8420b8A2B768001Da44d11109F1797D", + fromBlock: 18737324 } - ] + ] }, arbitrum: { aavePool: '0x794a61358D6845594F94dc1DB02A252b5b4814aD', @@ -86,11 +92,19 @@ const config = { }, ], cometReward: '0x88730d254A2f7e6AC8388c3198aFd694bA9f7fae', + arrakisHelper: '0x89E4bE1F999E3a58D16096FBe405Fc2a1d7F07D6', + esXaiPoolFactory: '0xF9E08660223E2dbb1c0b28c82942aB6B5E38b8E5', + xai: '0x4Cb9a7AE498CEDcBb5EAe9f25736aE7d428C9D66', + esXai: '0x4C749d097832DE2FEcc989ce18fDc5f1BD76700c', vaultFactories: [ - { - address: "0xaF2762E1F75DeCdb8d240576e7A2CEc1A365cD46", - fromBlock: 203397910 - } + { + address: "0xaF2762E1F75DeCdb8d240576e7A2CEc1A365cD46", + fromBlock: 203397910 + }, + { + address: '0x49b428ea1cd536e7d103e9729ea14400785e30ec', + fromBlock: 245595750 + } ] }, base: { @@ -111,16 +125,21 @@ const config = { }, ], cometReward: '0x123964802e6ABabBE1Bc9547D72Ef1B69B00A6b1', + arrakisHelper: '0x89E4bE1F999E3a58D16096FBe405Fc2a1d7F07D6', vaultFactories: [ - { - address: "0x5CD0Cb0DcDEF98a8d07a8D44054a13F2c35C53E1", - fromBlock: 13582859 - } + { + address: "0x5CD0Cb0DcDEF98a8d07a8D44054a13F2c35C53E1", + fromBlock: 13582859 + }, + { + address: "0x1395C314782bba704ca984ad41e57275f6E77b09", + fromBlock: 23294637 + } ] }, } -module.exports.methodology = 'Counts tokens held directly in vaults, as well as aave and compound positions.' +module.exports.methodology = 'Counts tokens held directly in vaults, as well as all managed DeFi positions.' module.exports.start = 1682619377 Object.keys(config).forEach(chain => { @@ -130,10 +149,14 @@ Object.keys(config).forEach(chain => { const AAVE_POOL_DATA_PROVIDER = config[chain].aavePoolDataProvider const COMETS = config[chain].comets const COMET_REWARD = config[chain].cometReward + const ARRAKIS_HELPER = config[chain].arrakisHelper const vaultFactories = config[chain].vaultFactories - + const ESXAI_POOL_FACTORY = config[chain].esXaiPoolFactory + const XAI = config[chain].xai + const ESXAI = config[chain].esXai + const vaultCreateds = [] - for (const { address, fromBlock} of vaultFactories) { + for (const { address, fromBlock } of vaultFactories) { const logs = await getLogs({ api, target: address, @@ -142,7 +165,7 @@ Object.keys(config).forEach(chain => { onlyArgs: true, fromBlock, }) - vaultCreateds.push(...logs.map(x => ({vault: x.vault, assetRegistry: x.assetRegistry}))) + vaultCreateds.push(...logs.map(x => ({ vault: x.vault, assetRegistry: x.assetRegistry }))) } const vaults = [] @@ -153,24 +176,61 @@ Object.keys(config).forEach(chain => { }) const assets = await api.multiCall({ abi: abi.assets, calls: assetRegistries }) + const uniqueAssets = [...new Set(assets.flatMap(x => x.map(y => y.asset)))] + const assetNames = await api.multiCall({ abi: 'string:name', calls: uniqueAssets, permitFailure: true }) const erc4626sAndOwners = [] const tokensAndOwners = [] const erc4626UnderylingMap = {} - const positions = [] + const aaveVaults = [] + const compoundVaults = [] + const llamapayRouters = [] + const gearboxFarmingPools = [] + const arrakisVaults = [] + const xaiPositionVaults = [] + const esXaiVaults = [] for (let i = 0; i < vaults.length; ++i) { const vault = vaults[i] for (let j = 0; j < assets[i].length; ++j) { const assetInfo = assets[i][j] - // position assets - if (assetInfo.asset === assetInfo.oracle) { - positions.push([assetInfo.asset, vault]) + const assetName = assetNames[uniqueAssets.findIndex(x => x === assetInfo.asset)] + if (assetName) { + if (assetName === COMPOUND_ORACLE_NAME) { + compoundVaults.push(vault) + continue + } + if (assetName === AAVE_ORACLE_NAME) { + aaveVaults.push(vault) + continue + } + if (assetName === LLAMAPAY_ROUTER_ORACLE_NAME) { + llamapayRouters.push(assetInfo.asset) + continue + } + if (assetName.startsWith(GEARBOX_TOKEN_PREFIX)) { + gearboxFarmingPools.push([vault, assetInfo.asset]) + continue + } + if (assetName.startsWith(ARRAKIS_TOKEN_PREFIX)) { + arrakisVaults.push(assetInfo.asset) + continue + } + if (assetName === ESXAI_POSITION_ORACLE_NAME) { + xaiPositionVaults.push(vault) + continue + } + } + + + if (ESXAI && assetInfo.asset.toLowerCase() === ESXAI.toLowerCase()) { + esXaiVaults.push(vault) continue } + if (assetInfo.isERC4626) { if (!erc4626UnderylingMap[assetInfo.asset]) erc4626UnderylingMap[assetInfo.asset] = null erc4626sAndOwners.push([assetInfo.asset, vault]) @@ -180,12 +240,24 @@ Object.keys(config).forEach(chain => { } } - const [underlyingTokens, vaultErc4626Balances, tokenNames,] = await Promise.all([ + const [underlyingTokens, vaultErc4626Balances, esXaiVaultBalances] = await Promise.all([ api.multiCall({ abi: 'address:asset', calls: Object.keys(erc4626UnderylingMap) }), api.multiCall({ abi: 'erc20:balanceOf', calls: erc4626sAndOwners.map(x => ({ target: x[0], params: x[1] })) }), - api.multiCall({ abi: 'string:name', calls: positions.map(x => x[0]), permitFailure: true }), + api.multiCall({ abi: 'erc20:balanceOf', calls: esXaiVaults.map(x => ({target: ESXAI, params: [x]}))}) + ]) + + esXaiVaultBalances.forEach(x => { + api.addToken(XAI, x) + }) + + await Promise.all([ + processAaveTvl(aaveVaults, api, AAVE_POOL, AAVE_POOL_DATA_PROVIDER), + processCompoundTvl(compoundVaults, api, COMETS, vaults, COMET_REWARD), + processLlamaPayTvl(llamapayRouters, api), + processGearboxTvl(gearboxFarmingPools, api), + processArrakisTvl(arrakisVaults, api, ARRAKIS_HELPER), + processXaiTvl(xaiPositionVaults, api, ESXAI_POOL_FACTORY, XAI) ]) - await processLendingTvls(positions, tokenNames, api, AAVE_POOL, AAVE_POOL_DATA_PROVIDER, COMETS, vaults, COMET_REWARD) Object.keys(erc4626UnderylingMap).forEach((erc4626Asset, i) => erc4626UnderylingMap[erc4626Asset] = underlyingTokens[i]) @@ -201,80 +273,140 @@ Object.keys(config).forEach(chain => { } }) -async function processLendingTvls(positions, tokenNames, api, AAVE_POOL, AAVE_POOL_DATA_PROVIDER, COMETS, vaults, COMET_REWARD) { - const compoundVaults = []; - const aaveVaults = []; - for (let i = 0; i < positions.length; ++i) { - if (tokenNames[i] === COMPOUND_ORACLE_NAME) { - compoundVaults.push(positions[i][1]); - } else if (tokenNames[i] === AAVE_ORACLE_NAME) { - aaveVaults.push(positions[i][1]); - } - } +async function processXaiTvl(xaiPositionVaults, api, ESXAI_POOL_FACTORY, XAI) { + if (xaiPositionVaults.length === 0) return + + const pools = await api.multiCall({ abi: abi.getPoolIndicesOfUser, calls: xaiPositionVaults.map(x => ({target: ESXAI_POOL_FACTORY, params: [x]}))}) + const vaultPools = xaiPositionVaults.flatMap((vault, i) => pools[i].map(pool => ([vault, pool]))) - await Promise.all([ - processAaveTvl(aaveVaults, api, AAVE_POOL, AAVE_POOL_DATA_PROVIDER), - processCompoundTvl(compoundVaults, api, COMETS, vaults, COMET_REWARD) + const [bucketTrackers, stakedAmounts] = await Promise.all([ + api.multiCall({ abi: abi.esXaiStakeBucket, calls: vaultPools.map(x => x[1]) }), + api.multiCall({ abi: abi.getStakedAmounts, calls: vaultPools.map(x => ({target: x[1], params: [x[0]]}))}) ]) + + stakedAmounts.forEach(x => { + api.addToken(XAI, x) + }) + + const bucketWithdrawables = await api.multiCall({ abi: abi.withdrawableDividendOf, calls: vaultPools.map((x, i) => ({target: bucketTrackers[i], params: [x[0]]}))}) + + bucketWithdrawables.forEach(x => { + api.addToken(XAI, x) + }) +} + +async function processArrakisTvl(arrakisVaults, api, arrakisHelper) { + if (arrakisVaults.length === 0) return + + const [tokens0, tokens1, totalUnderlyings] = await Promise.all([ + api.multiCall({ abi: abi.token0, calls: arrakisVaults}), + api.multiCall({ abi: abi.token1, calls: arrakisVaults}), + api.multiCall({ abi: abi.totalUnderlying, calls: arrakisVaults.map(x => ({target: arrakisHelper, params: [x]}))}) + ]) + + totalUnderlyings.forEach((v, i) => { + api.addToken(tokens0[i], v.totalAmount0) + api.addToken(tokens1[i], v.totalAmount1) + }) +} + +async function processGearboxTvl(farmingPools, api) { + if (farmingPools.length === 0) return + + const [stakingTokens, stakingTokenBalances, rewardTokens, farmed] = await Promise.all([ + api.multiCall({ abi: abi.stakingToken, calls: farmingPools.map(x => x[1])}), + api.multiCall({ abi: 'erc20:balanceOf', calls: farmingPools.map(x => ({target: x[1], params:[x[0]]}))}), + api.multiCall({ abi: abi.rewardsToken, calls: farmingPools.map(x => x[1])}), + api.multiCall({ abi: abi.farmed, calls: farmingPools.map(x => ({target: x[1], params: [x[0]]}))}) + ]) + + const [underlyingTokens, underlyingBalances] = await Promise.all([ + api.multiCall({ abi: 'address:asset', calls: stakingTokens}), + api.multiCall({ abi: abi.convertToAssets, calls: stakingTokens.map((x, i) => ({target: x, params: [stakingTokenBalances[i]]}))}) + ]) + + rewardTokens.forEach((rewardToken, i) => { + api.addToken(rewardToken, farmed[i]) + }) + underlyingTokens.forEach((underlyingToken, i) => { + api.addToken(underlyingToken, underlyingBalances[i]) + }) +} + +async function processLlamaPayTvl(llamaPayRouters, api) { + if (llamaPayRouters.length === 0) return + + const llamaPayInfos = await api.multiCall({ abi: abi.llamaPayInfoList, calls: llamaPayRouters.map(x => ({target: x})) }) + + const [llamaPayTokens, decimalDivisors, llamaPayBalances] = await Promise.all([ + api.multiCall({abi: abi.token, calls: llamaPayInfos.flatMap(x => x.map(y => y[0]))}), + api.multiCall({abi: abi.DECIMALS_DIVISOR, calls: llamaPayInfos.flatMap(x => x.map(y => y[0]))}), + api.multiCall({abi: abi.balances, calls: llamaPayInfos.flatMap((v, i) => v.map(y => ({target: y[0], params:[llamaPayRouters[i]]})))}) + ]) + + llamaPayTokens.forEach((token, i) => { + api.addToken(token, BigInt(llamaPayBalances[i]) / BigInt(decimalDivisors[i])) + }) } async function processCompoundTvl(compoundVaults, api, COMETS, vaults, COMET_REWARD) { - if (compoundVaults.length) { - const numAssets = await api.multiCall({ abi: 'uint8:numAssets', calls: COMETS.map(x => x.address) }); - - - const collateralCalls = []; - COMETS.forEach((comet, i) => [...Array(parseInt(numAssets[i])).keys()].forEach(assetIndex => collateralCalls.push({ target: comet.address, params: assetIndex }))); - const balanceOfCalls = []; - vaults.forEach(vault => COMETS.forEach(comet => balanceOfCalls.push({ target: comet.address, params: vault, baseToken: comet.baseToken }))); - const rewardOwedCalls = []; - vaults.forEach(vault => COMETS.forEach(comet => rewardOwedCalls.push({ target: COMET_REWARD, params: [comet.address, vault] }))); - - const [collateralInfos, balanceOfs, borrowBalanceOfs, rewardOwed] = await Promise.all([ - api.multiCall({ abi: abi.getAssetInfo, calls: collateralCalls }), - api.multiCall({ abi: 'erc20:balanceOf', calls: balanceOfCalls }), - api.multiCall({ abi: abi.borrowBalanceOf, calls: balanceOfCalls }), - api.multiCall({ abi: abi.getRewardOwed, calls: rewardOwedCalls }) - ]); - - balanceOfs.forEach((balance, i) => { - const sum = (BigInt(balance) - BigInt(borrowBalanceOfs[i])).toString(); - api.addToken(balanceOfCalls[i].baseToken, sum); - }); - - rewardOwed.forEach(reward => { - api.addToken(reward.token, reward.owed); - }); - - const collateralBalanceOfCalls = []; - vaults.forEach(vault => collateralInfos.forEach((collateral, i) => collateralBalanceOfCalls.push({ target: collateralCalls[i].target, params: [vault, collateral.asset] }))); - const collateralBalanceOfs = await api.multiCall({ abi: abi.collateralBalanceOf, calls: collateralBalanceOfCalls }); - - collateralBalanceOfs.forEach((balance, i) => { - api.addToken(collateralBalanceOfCalls[i].params[1], balance); - }); - } + if (compoundVaults.length === 0 || !COMETS || !COMET_REWARD) return + + const numAssets = await api.multiCall({ abi: 'uint8:numAssets', calls: COMETS.map(x => x.address) }); + + + const collateralCalls = []; + COMETS.forEach((comet, i) => [...Array(parseInt(numAssets[i])).keys()].forEach(assetIndex => collateralCalls.push({ target: comet.address, params: assetIndex }))); + const balanceOfCalls = []; + vaults.forEach(vault => COMETS.forEach(comet => balanceOfCalls.push({ target: comet.address, params: vault, baseToken: comet.baseToken }))); + const rewardOwedCalls = []; + vaults.forEach(vault => COMETS.forEach(comet => rewardOwedCalls.push({ target: COMET_REWARD, params: [comet.address, vault] }))); + + const [collateralInfos, balanceOfs, borrowBalanceOfs, rewardOwed] = await Promise.all([ + api.multiCall({ abi: abi.getAssetInfo, calls: collateralCalls }), + api.multiCall({ abi: 'erc20:balanceOf', calls: balanceOfCalls }), + api.multiCall({ abi: abi.borrowBalanceOf, calls: balanceOfCalls }), + api.multiCall({ abi: abi.getRewardOwed, calls: rewardOwedCalls }) + ]); + + balanceOfs.forEach((balance, i) => { + const sum = (BigInt(balance) - BigInt(borrowBalanceOfs[i])).toString(); + api.addToken(balanceOfCalls[i].baseToken, sum); + }); + + rewardOwed.forEach(reward => { + api.addToken(reward.token, reward.owed); + }); + + const collateralBalanceOfCalls = []; + vaults.forEach(vault => collateralInfos.forEach((collateral, i) => collateralBalanceOfCalls.push({ target: collateralCalls[i].target, params: [vault, collateral.asset] }))); + const collateralBalanceOfs = await api.multiCall({ abi: abi.collateralBalanceOf, calls: collateralBalanceOfCalls }); + + collateralBalanceOfs.forEach((balance, i) => { + api.addToken(collateralBalanceOfCalls[i].params[1], balance); + }); } async function processAaveTvl(aaveVaults, api, AAVE_POOL, AAVE_POOL_DATA_PROVIDER) { - if (aaveVaults.length) { - const aaveReservesList = await api.call({ abi: abi.getReservesList, target: AAVE_POOL }); + if (aaveVaults.length === 0 || !AAVE_POOL || !AAVE_POOL_DATA_PROVIDER) return - const aaveReserveDetails = await api.multiCall({ abi: abi.getReserveData, target: AAVE_POOL, calls: aaveReservesList }); + const aaveReservesList = await api.call({ abi: abi.getReservesList, target: AAVE_POOL }); - const aaveQueryParams = []; - aaveReservesList.forEach(asset => aaveVaults.forEach(vault => aaveQueryParams.push({ params: [asset, vault], }))); - const aavePositions = await api.multiCall({ abi: abi.getUserReserveData, target: AAVE_POOL_DATA_PROVIDER, calls: aaveQueryParams }); + const aaveReserveDetails = await api.multiCall({ abi: abi.getReserveData, target: AAVE_POOL, calls: aaveReservesList }); - for (const i in aavePositions) { - const aavePosition = aavePositions[i]; - const reserveIdx = aaveReservesList.findIndex(x => x === aaveQueryParams[i].params[0]); + const aaveQueryParams = []; + aaveReservesList.forEach(asset => aaveVaults.forEach(vault => aaveQueryParams.push({ params: [asset, vault], }))); + const aavePositions = await api.multiCall({ abi: abi.getUserReserveData, target: AAVE_POOL_DATA_PROVIDER, calls: aaveQueryParams }); - api.addToken(aaveReserveDetails[reserveIdx].aTokenAddress, aavePosition.currentATokenBalance); - api.addToken(aaveReserveDetails[reserveIdx].stableDebtTokenAddress, aavePosition.currentStableDebt); - api.addToken(aaveReserveDetails[reserveIdx].variableDebtTokenAddress, aavePosition.currentVariableDebt); - } + for (const i in aavePositions) { + const aavePosition = aavePositions[i]; + const reserveIdx = aaveReservesList.findIndex(x => x === aaveQueryParams[i].params[0]); + + api.addToken(aaveReserveDetails[reserveIdx].aTokenAddress, aavePosition.currentATokenBalance); + api.addToken(aaveReserveDetails[reserveIdx].stableDebtTokenAddress, aavePosition.currentStableDebt); + api.addToken(aaveReserveDetails[reserveIdx].variableDebtTokenAddress, aavePosition.currentVariableDebt); } + } const abi = { @@ -286,5 +418,25 @@ const abi = { "getReservesList": "address[]:getReservesList", "getAssetInfo": "function getAssetInfo(uint8 i) view returns ((uint8 offset, address asset, address priceFeed, uint64 scale, uint64 borrowCollateralFactor, uint64 liquidateCollateralFactor, uint64 liquidationFactor, uint128 supplyCap))", "borrowBalanceOf": "function borrowBalanceOf(address account) view returns (uint256)", - "getRewardOwed": "function getRewardOwed(address comet, address account) returns ((address token, uint256 owed))" + "getRewardOwed": "function getRewardOwed(address comet, address account) returns ((address token, uint256 owed))", + "llamaPayCount": "function llamaPayCount() returns (uint256 count)", + "llamaPayInfoList": "function llamaPayInfoList() returns ((address llamapay, address priceFeed, bool invertPrice)[])", + "token": "function token() returns (address token)", + "balances": "function balances(address) returns (uint256)", + "DECIMALS_DIVISOR": "function DECIMALS_DIVISOR() returns (uint256)", + "stakingToken": "function stakingToken() returns (address)", + "rewardsToken": "function rewardsToken() returns (address)", + "farmed": "function farmed(address) returns (uint256)", + "totalUnderlying": "function totalUnderlying(address) returns (uint256 totalAmount0, uint256 totalAmount1)", + "token0": "function token0() returns (address)", + "token1": "function token1() returns (address)", + "stakerStrategyShares": "function stakerStrategyShares(address,address) returns (uint256)", + "strategy": "function stakerStrategyShares() returns (address)", + "underlyingToken": "function underlyingToken() returns (address)", + "sharesToUnderlyingView": "function sharesToUnderlyingView(uint256) returns (uint256)", + "queuedWithdrawals": "function queuedWithdrawals(uint256) returns (bytes32 root, uint256 shares)", + "getPoolIndicesOfUser": "function getPoolIndicesOfUser(address user) returns (address[])", + "esXaiStakeBucket": "function esXaiStakeBucket() returns (address)", + "getStakedAmounts": "function getStakedAmounts(address) returns (uint256)", + "withdrawableDividendOf": "function withdrawableDividendOf(address) returns (uint256)" } \ No newline at end of file diff --git a/projects/affine-defi-liquid/index.js b/projects/affine-defi-liquid/index.js index 3399d44ae4..24ad3ae987 100644 --- a/projects/affine-defi-liquid/index.js +++ b/projects/affine-defi-liquid/index.js @@ -1,5 +1,19 @@ const { sumERC4626VaultsExport } = require('../helper/erc4626') +// LINEA +const LINEA_VAULT = "0xB838Eb4F224c2454F2529213721500faf732bf4d" + +async function addL2TVL(api, target) { + const tokens = await api.call({abi: 'erc20:totalSupply', target: target}) + const sharePrice = await api.call({abi: 'uint256:sharePrice', target: target}) + const decimals = await api.call({abi: 'uint256:decimals', target: target}) + + // Convert to human-readable format + const totalInEth = tokens * sharePrice / 10 ** decimals + + api.addGasToken(totalInEth) +} + module.exports = { doublecounted: true, ethereum: { @@ -11,4 +25,7 @@ module.exports = { isOG4626: true, }), }, + linea: { + tvl: async (api) => await addL2TVL(api, LINEA_VAULT) + }, } diff --git a/projects/agdex/index.js b/projects/agdex/index.js new file mode 100644 index 0000000000..3be03c6e20 --- /dev/null +++ b/projects/agdex/index.js @@ -0,0 +1,103 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { function_view, getResource } = require("../helper/chain/aptos"); + +const primary_fungible_asset_balance = "0x1::primary_fungible_store::balance" +const AGDEX = + "0xfa69897532f069bc0806868eaeec3328727d90c0cec710a17dde327e0bfab44f"; +const lzUSDC = + ADDRESSES.aptos.USDC_2; +const USDT = + ADDRESSES.aptos.USDT_2; +const APT = + ADDRESSES.aptos.APT; +const BTC = + ADDRESSES.aptos.CELER_WBTC; +const ETH = + ADDRESSES.aptos.CELER_ETH; + +const usdc_resource_account = "0x19fb80bd79fa8f7538404af85196396973e3fbbda1503495598172c8813f7ca5"; +const usdc_metadata = "0x2b3be0a97a73c87ff62cbdd36837a9fb5bbd1d7f06a73b7ed62ec15c5326c1b8"; + +const usdt_resource_account = "0xbb3c1b88599c563062e2b08fe3a92ab048d700f9aa44617c680d59a4aa69b23f"; +const usdt_metadata = ADDRESSES.aptos.USDt; + +const eth_resource_account = "0x38bca0c288df1e13d9a30d33c4ce8ee778333c52bd4e730b49c6c9379be39b10"; +const eth_metadata = "0xae02f68520afd221a5cd6fda6f5500afedab8d0a2e19a916d6d8bc2b36e758db"; + +const btc_resource_account = "0x70d303ed5dbfbae1f5ac76d50d5073f69a7115dfdfa737e82bb7c3c9364b3d17"; +const btc_metadata = "0xa64d2d6f5e26daf6a3552f51d4110343b1a8c8046d0a9e72fa4086a337f3236c"; + +const apt_resource_account = "0x8afc7aaa4616c0defbe655f3928a72ff849ef9a6889178f1c18c7c3ad006ebf7"; +const apt_metadata = "0xa"; + +async function tvl(api) { + const usdc_balance = + await function_view({ + "functionStr": primary_fungible_asset_balance, + "type_arguments": ["0x1::fungible_asset::Metadata"], + "args": [usdc_resource_account, usdc_metadata] + }); + const usdc_r = await getResource( + AGDEX, + `${AGDEX}::pool::Vault<0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::USDC>` + ); + const usdc_value = parseInt(usdc_balance) + parseInt(usdc_r.reserved_amount); + + const usdt_balance = + await function_view({ + "functionStr": primary_fungible_asset_balance, + "type_arguments": ["0x1::fungible_asset::Metadata"], + "args": [usdt_resource_account, usdt_metadata] + }); + const usdt_r = await getResource( + AGDEX, + `${AGDEX}::pool::Vault<0xfa69897532f069bc0806868eaeec3328727d90c0cec710a17dde327e0bfab44f::token_map::USDT>` + ); + const usdt_value = parseInt(usdt_balance) + parseInt(usdt_r.reserved_amount); + + const eth_balance = + await function_view({ + "functionStr": primary_fungible_asset_balance, + "type_arguments": ["0x1::fungible_asset::Metadata"], + "args": [eth_resource_account, eth_metadata] + }); + const eth_r = await getResource( + AGDEX, + `${AGDEX}::pool::Vault<0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::WETH>` + ); + const eth_value = parseInt(eth_balance) + parseInt(eth_r.reserved_amount); + + const btc_balance = + await function_view({ + "functionStr": primary_fungible_asset_balance, + "type_arguments": ["0x1::fungible_asset::Metadata"], + "args": [btc_resource_account, btc_metadata] + }); + const btc_r = await getResource( + AGDEX, + `${AGDEX}::pool::Vault<0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::WBTC>` + ); + const btc_value = parseInt(btc_balance) + parseInt(btc_r.reserved_amount); + + const apt_balance = + await function_view({ + "functionStr": primary_fungible_asset_balance, + "type_arguments": ["0x1::fungible_asset::Metadata"], + "args": [apt_resource_account, apt_metadata] + }); + const apt_r = await getResource( + AGDEX, + `${AGDEX}::pool::Vault<0x1::aptos_coin::AptosCoin>` + ); + const apt_value = parseInt(apt_balance) + parseInt(apt_r.reserved_amount); + api.add(lzUSDC, usdc_value); + api.add(BTC, btc_value); + api.add(ETH, eth_value); + api.add(USDT, usdt_value); + api.add(APT, apt_value); +} + +module.exports = { + timetravel: false, + aptos: { tvl }, +}; diff --git a/projects/agile/index.js b/projects/agile/index.js index 49d534e3ce..f639ee2639 100644 --- a/projects/agile/index.js +++ b/projects/agile/index.js @@ -1,16 +1,18 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { compoundExports, } = require('../helper/compound') const sdk = require('@defillama/sdk') const { getUniTVL } = require("../helper/unknownTokens"); const unitroller = '0x643dc7C5105d1a3147Bd9524DFC3c5831a373F1e' -const lendingMarket = compoundExports(unitroller, "cronos", "0x2e909694B362c2FcA3C8168613bd47842245504B", "0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23", undefined, undefined, { +const lendingMarket = compoundExports(unitroller, "0x2e909694B362c2FcA3C8168613bd47842245504B", ADDRESSES.cronos.WCRO_1, { blacklistedTokens: [ '0xa4434afeae0decb9820d906bf01b13291d00651a', ] }) module.exports = { + deadFrom: '2022-06-28', methodology: "Liquidity on DEX and supplied and borrowed amounts found using the unitroller address(0x643dc7C5105d1a3147Bd9524DFC3c5831a373F1e)", cronos: { //staking: stakingPricedLP("0x37619cC85325aFea778830e184CB60a3ABc9210B", "0x9A92B5EBf1F6F6f7d93696FCD44e5Cf75035A756", "moonriver", "0xbBe2f34367972Cb37ae8dea849aE168834440685", "moonriver"), @@ -23,4 +25,6 @@ module.exports = { ]), borrowed: lendingMarket.borrowed } -} \ No newline at end of file +} + +module.exports.cronos.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/agora/index.js b/projects/agora/index.js index 60c8624464..5a5a0e902b 100644 --- a/projects/agora/index.js +++ b/projects/agora/index.js @@ -1,43 +1,13 @@ -const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk"); const { compoundExports, methodology, } = require("../helper/compound"); const { getUniTVL } = require('../helper/unknownTokens') const factory = '0x3c4063B964B1b3bF229315fCc4df61a694B0aE84' -const metis = ADDRESSES.metis.Metis -const agora = '0x0Ed0Ca6872073E02cd3aE005BaF04bA43BE947fA' -const { tvl: agoraTvl, } = compoundExports( - "0x3fe29D7412aCDade27e21f55a65a7ddcCE23d9B3", - "metis", - "0xcFd482DcE13cA1d27834D381AF1b570E9E6C6810", - metis, -); - -const { tvl: agoraPlusTvl, } = compoundExports( - "0x92DcecEaF4c0fDA373899FEea00032E8E8Da58Da", - "metis", - "0xE85A1ae1A2A21135c49ADEd398D3FD5Ed032B28e", - metis, - undefined, - symbol => symbol.indexOf('appuffNetswap') > -1 -); - -const { tvl: agoraStakeTvl, } = compoundExports( - "0xb36DF0773AbD23081516F54f9dbB9a99Ec27dbB0", - "metis", - "0xc3034143816398d37Ec9447c9CA17c407e96Dc12", - metis, - undefined, -); - -const { tvl: agoraFarmTvl, } = compoundExports( - "0xEC1A06f320E6e295Ab6892BB4e0f9e29c712F11F", - "metis", - "0x13Cb104a1D94A89a260b27DfAAB07C862da622E5", - metis, - undefined, -); +const { tvl: agoraTvl, } = compoundExports("0x3fe29D7412aCDade27e21f55a65a7ddcCE23d9B3", "0xcFd482DcE13cA1d27834D381AF1b570E9E6C6810",); +const { tvl: agoraPlusTvl, } = compoundExports("0x92DcecEaF4c0fDA373899FEea00032E8E8Da58Da", "0xE85A1ae1A2A21135c49ADEd398D3FD5Ed032B28e",); +const { tvl: agoraStakeTvl, } = compoundExports("0xb36DF0773AbD23081516F54f9dbB9a99Ec27dbB0", "0xc3034143816398d37Ec9447c9CA17c407e96Dc12",); +const { tvl: agoraFarmTvl, } = compoundExports("0xEC1A06f320E6e295Ab6892BB4e0f9e29c712F11F", "0x13Cb104a1D94A89a260b27DfAAB07C862da622E5",); const chainTvl = getUniTVL({ factory, useDefaultCoreAssets: true, }) @@ -49,6 +19,6 @@ module.exports = { misrepresentedTokens: true, metis: { tvl: sdk.util.sumChainTvls([chainTvl, agoraTvl, agoraPlusTvl, agoraFarmTvl, agoraStakeTvl]), - borrowed: ()=>({}), + borrowed: () => ({}), }, }; diff --git a/projects/agoric/index.js b/projects/agoric/index.js new file mode 100644 index 0000000000..dad9523b75 --- /dev/null +++ b/projects/agoric/index.js @@ -0,0 +1,58 @@ +const { post } = require('../helper/http') + +const query = ` +query { + vaultManagerMetrics { + nodes { + liquidatingCollateralBrand + totalCollateral + } + } + oraclePrices { + nodes { + typeInAmount + typeOutAmount + typeInName + } + } + boardAuxes { + nodes { + allegedName + decimalPlaces + } + } +} +` + +const coingeckoMapping = { + 'stATOM': 'stride-staked-atom', + 'stkATOM': 'stkatom', + 'ATOM': 'cosmos', + 'stOSMO': 'stride-staked-osmo', + 'stTIA': 'stride-staked-tia', +} +const decimals = {} + +const tvl = async (api) => { + const { data: { vaultManagerMetrics, boardAuxes } } = await post('https://api.subquery.network/sq/agoric-labs/agoric-mainnet-v2', { query }) + + boardAuxes.nodes.forEach(board => { + decimals[board.allegedName] = 10 ** board.decimalPlaces + }) + + vaultManagerMetrics.nodes.forEach(vault => { + const key = vault.liquidatingCollateralBrand + if (!coingeckoMapping[key]) { + throw new Error(`Unknown coin ${key} (coingecko mapping is missing)`) + } + const decimal = decimals[key] ?? 1e6 + const balance = vault.totalCollateral / decimal + api.addCGToken(coingeckoMapping[key], balance) + }) +} + +module.exports = { + agoric: { + tvl, + }, +} diff --git a/projects/agus/index.js b/projects/agus/index.js index 66d9c57c49..dfb8d1e49a 100644 --- a/projects/agus/index.js +++ b/projects/agus/index.js @@ -3,9 +3,9 @@ const { getUniTVL, } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, bsc: { - tvl: getUniTVL({ factory: '0x1aEa6414e7F7A9581Ce53385b2902c59b34D4a94', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x1aEa6414e7F7A9581Ce53385b2902c59b34D4a94', useDefaultCoreAssets: true,}), }, core: { - tvl: getUniTVL({ factory: '0x1aEa6414e7F7A9581Ce53385b2902c59b34D4a94', useDefaultCoreAssets: true, fetchBalances: true, }) + tvl: getUniTVL({ factory: '0x1aEa6414e7F7A9581Ce53385b2902c59b34D4a94', useDefaultCoreAssets: true,}) }, }; diff --git a/projects/ainn-layer2/index.js b/projects/ainn-layer2/index.js index 6768c352a4..34e9eec375 100644 --- a/projects/ainn-layer2/index.js +++ b/projects/ainn-layer2/index.js @@ -1,34 +1,11 @@ -const sdk = require('@defillama/sdk'); const { sumTokensExport } = require('../helper/sumTokens'); - -const BTCOwners = [ - "bc1q6dtp7ayaj5k2zv0z5ayhkdsvmtvdqgyaa9zs53", - "3H8cmLndtkBs7kiHByhHAddTzy8taUwYPt", - "bc1pepsapf26n8y2f4uftlmhy60ksghx6rqlxdcj4uacfqrkcg6pmncs52rzuu", - "bc1qu4ru2sph5jatscx5xuf0ttka36yvuql7hl5h4c", - "1JA46eiDpfx589wawn5RvtEXgwc518QfhZ", - "bc1qaajdlp5yrj5f77wq2ndtfqnmsamvvxhpy95662zkzykn9qhvdgys580hcs", - "368vZZKUWDFZRLWMFNRJzHo1HnibNeAJir", - "33hE9Wq65kjbiLsGD1NYwwNatP6hbsZv5H", - "32GU8Jux7SbsEbaAaLUnEQmc6JemLF6BUb", - "3CP5WJ2JSLCew7SETWUe5FxpBGrekMBiwk", - "39Fvw2Ho1fEkyDsos5sNTN5iMJZKzTL526", - "3Kptt4TZZRcjuGH8ikoQ8mV1TVxq45dnuS", - "3G4sMXWAAVTvTXTksr8u9zuu7W8RKsicEz", - "335DRGzLLG2tu4H4PnFBHYAwcj5pvV8zei", - "bc1qqg3cdyadq25zn99sdprr4lgpsxg2za998eygy8", - "bc1qw4vp94e9egkaxc04qsu5z9aq5pqpku2p6pzer8", - "bc1q3q7afjarz7l6v49538qs2prffhtawf38ss85k8", - "bc1q3smt9ut40eld6tgn42sdlp9yrx98s90unqw3pl" -]; +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { methodology: "Staking tokens via AINN Layer2 Dataset counts as TVL.", bitcoin: { - tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners: BTCOwners }), - ]), + tvl: sumTokensExport({ owners: bitcoinAddressBook.ainn }), }, zklink: { tvl: sumTokensExport({ diff --git a/projects/airdao-harbor/index.js b/projects/airdao-harbor/index.js new file mode 100644 index 0000000000..c129cf5ee5 --- /dev/null +++ b/projects/airdao-harbor/index.js @@ -0,0 +1,11 @@ +async function tvl(api) { + const totalStake = await api.call({ abi: 'uint256:getTotalStAmb', target: '0xBda7cf631Db4535A500ED16Dd98099C04e66F1d5' }) + api.addGasToken(totalStake) +} + +module.exports = { + methodology: `TVL counts deposits made to Harbor liquid staking on AirDAO.`, + airdao: { + tvl + } +} \ No newline at end of file diff --git a/projects/aixcb/index.js b/projects/aixcb/index.js new file mode 100644 index 0000000000..6a81da4a4c --- /dev/null +++ b/projects/aixcb/index.js @@ -0,0 +1,25 @@ +const ADDRESSES = require('../helper/coreAssets.json'); +const { staking } = require("../helper/staking"); + +// Token addresses +const AIXCB_TOKEN = "0x76C71F1703Fbf19FFdcF3051E1e684Cb9934510f"; +const WETH = ADDRESSES.base.WETH; + +// LP and staking addresses +const AERODROME_LP_TOKEN = "0x19C3c7EEfb070EE00ddE367A9768De1DF52cbE5d"; +const LP_STAKING = "0xEE5C223aD4055beE465244d8Cb344fb22DaDa570"; +const AIXCB_STAKING = "0xF5acA5c3a0B70f847dE4652AC77BD601ccFE8339"; + +async function stakingTvl(api) { + const totalStaked = await api.call({ abi: 'uint256:getTotalStaked', target: AIXCB_STAKING, }); + api.add(AIXCB_TOKEN, totalStaked); +} + +module.exports = { + methodology: 'TVL consists of aixCB tokens staked in the AIXCBStaking contract (getTotalStaked) and Aerodrome vAMM-aixCB/WETH LP tokens staked in the AIXCBLPStaking contract (totalStakedAmount).', + base: { + tvl: () => ({}), + staking: stakingTvl, + pool2: staking(LP_STAKING, AERODROME_LP_TOKEN), + }, +}; \ No newline at end of file diff --git a/projects/ajna-v2/index.js b/projects/ajna-v2/index.js index f4cfaf1894..609ed669b1 100644 --- a/projects/ajna-v2/index.js +++ b/projects/ajna-v2/index.js @@ -6,7 +6,12 @@ const poolFactories = { arbitrum: '0x595c823EdAA612972d77aCf324C11F6284B9f5F6', base: '0x154FFf344f426F99E328bacf70f4Eb632210ecdc', optimism: '0x43cD60250CBBC0C22663438dcf644F5162988C06', - polygon: '0x3D6b8B4a2AEC46961AE337F4A9EBbf283aA482AA' + polygon: '0x3D6b8B4a2AEC46961AE337F4A9EBbf283aA482AA', + blast: '0xcfCB7fb8c13c7bEffC619c3413Ad349Cbc6D5c91', + filecoin: '0x0E4a2276Ac259CF226eEC6536f2b447Fc26F2D8a', + linea: '0xd72A448C3BC8f47EAfFc2C88Cf9aC9423Bfb5067', + mode: '0x62Cf5d9075D1d6540A6c7Fa836162F01a264115A', + rari: '0x10cE36851B0aAf4b5FCAdc93f176aC441D4819c9' }; async function getTvl(poolFactory, api) { @@ -33,4 +38,4 @@ module.exports = Object.keys(poolFactories).reduce((acc, chain) => { borrowed: (api) => getBorrowed(poolFactories[chain], api) }; return acc; -}, { misrepresentedTokens: true }); \ No newline at end of file +}, { misrepresentedTokens: true }); diff --git a/projects/akronswap/index.js b/projects/akronswap/index.js index ed0555999c..b309ff8589 100644 --- a/projects/akronswap/index.js +++ b/projects/akronswap/index.js @@ -1,6 +1,6 @@ const { getUniTVL } = require('../helper/unknownTokens'); -const tvl = getUniTVL({ factory: '0xAf39606bec181887951Ab6912Ac7EA216Bd6E4B4', useDefaultCoreAssets: true, fetchBalances: true, }) +const tvl = getUniTVL({ factory: '0xAf39606bec181887951Ab6912Ac7EA216Bd6E4B4', useDefaultCoreAssets: true, }) module.exports = { misrepresentedTokens: true, diff --git a/projects/alcor/index.js b/projects/alcor/index.js index f23d4dc835..b8b614282e 100644 --- a/projects/alcor/index.js +++ b/projects/alcor/index.js @@ -20,6 +20,7 @@ async function wax() { ["alien.worlds", "TLM", "alien-worlds"], ["token.rfox", "USD", "redfox-labs"], ["usdt.alcor", "USDT", "usdt-alcor"], + ["token.fusion", "LSWAX", "waxfusion-staked-wax"], ]; return await get_account_tvl(accounts, tokens, "wax"); } diff --git a/projects/alephium-bridge/index.js b/projects/alephium-bridge/index.js index 884308d9e0..4fc07c5cdc 100644 --- a/projects/alephium-bridge/index.js +++ b/projects/alephium-bridge/index.js @@ -2,26 +2,42 @@ const sdk = require("@defillama/sdk"); const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require('../helper/unwrapLPs'); -const tokenBridgeAddress = '0x579a3bde631c3d8068cbfe3dc45b0f14ec18dd43' -const bridgedAlphAddress = '0x590f820444fa3638e022776752c5eef34e2f89a6' +const ethTokenBridgeAddress = '0x579a3bde631c3d8068cbfe3dc45b0f14ec18dd43' +const ethBridgedAlphAddress = '0x590f820444fa3638e022776752c5eef34e2f89a6' +const bscTokenBridgeAddress = '0x2971F580C34d3D584e0342741c6a622f69424dD8' +const bscBridgedAlphAddress = '0x8683BA2F8b0f69b2105f26f488bADe1d3AB4dec8' -async function tvl(ts, block) { - const totalBridgedAlphSupply = await sdk.api.erc20.totalSupply({ target: bridgedAlphAddress, block }) - return { - alephium: totalBridgedAlphSupply.output / 1e18, - } +async function tvl(api) { + const ethApi = new sdk.ChainApi({ chain: 'ethereum', timestamp: api.timestamp }) + const bscApi = new sdk.ChainApi({ chain: 'bsc', timestamp: api.timestamp }) + await ethApi.getBlock() + await bscApi.getBlock() + const ethBal = await ethApi.call({ abi: 'erc20:totalSupply', target: ethBridgedAlphAddress }) + const bscBal = await bscApi.call({ abi: 'erc20:totalSupply', target: bscBridgedAlphAddress }) + api.addCGToken('alephium', (+ethBal + +bscBal) / 1e18) } module.exports = { - methodology: "Tracks funds locked in the Alephium Bridge Token contracts on Ethereum", + methodology: "Tracks funds locked in the Alephium Bridge Token contracts on Ethereum and Binance Smart Chain", ethereum: { - tvl: sumTokensExport({ owner: tokenBridgeAddress, tokens: [ - ADDRESSES.ethereum.WETH, - ADDRESSES.ethereum.USDT, - ADDRESSES.ethereum.USDC, - ADDRESSES.ethereum.WBTC, - ADDRESSES.ethereum.DAI - ] }), + tvl: sumTokensExport({ + owner: ethTokenBridgeAddress, tokens: [ + ADDRESSES.ethereum.WETH, + ADDRESSES.ethereum.USDT, + ADDRESSES.ethereum.USDC, + ADDRESSES.ethereum.WBTC, + ADDRESSES.ethereum.DAI + ] + }), + }, + bsc: { + tvl: sumTokensExport({ + owner: bscTokenBridgeAddress, tokens: [ + ADDRESSES.bsc.WBNB, + ADDRESSES.bsc.USDC, + ADDRESSES.bsc.USDT + ] + }), }, alephium: { tvl diff --git a/projects/alexar/index.js b/projects/alexar/index.js index d3dd0f8e1f..73cbe4349d 100644 --- a/projects/alexar/index.js +++ b/projects/alexar/index.js @@ -1,8 +1,6 @@ const { getConfig } = require('../helper/cache') const { sumTokens } = require('../helper/sumTokens') -const blacklistedAssets = ['uaxl']; - const chainMapping = { avax: 'avalanche', cosmos: 'cosmoshub', @@ -10,16 +8,25 @@ const chainMapping = { bsc: 'binance' }; -const chainListSupply = ['juno', 'cosmos', 'comdex', 'carbon', /*'crescent',*/ 'injective', 'kujira', 'osmosis', 'persistence', 'stargaze', 'secret', 'stargaze', 'umee', 'evmos', 'terra2']; +const blackListChains = ['comdex', 'crescent']; +const chainListSupply = ['juno', 'cosmos', 'injective', 'kujira', 'osmosis', 'persistence', 'stargaze', 'secret', 'stargaze', 'umee', 'evmos', 'terra2']; const chainListTotal = ['avax', 'bsc', 'moonbeam', 'polygon', 'fantom', 'arbitrum', 'aurora', 'celo', 'kava', 'mantle', 'ethereum', 'base']; +const blacklistedTokensChain = { + ethereum: ['0x946fb08103b400d1c79e07acCCDEf5cfd26cd374'], // KIP tvl is higher than the circulating supply +} chainListSupply.concat(chainListTotal).forEach(chain => { - module.exports[chain] = { tvl }; + if (blackListChains.includes(chain)) { + module.exports[chain] = { tvl: () => ({}) }; + } else { + module.exports[chain] = { tvl }; + } async function tvl(api) { const config = await getConfig('alexar', 'https://api.axelarscan.io/api/getTVL') const tokensAndOwners = [] const owners = [] + const blacklistedTokens = blacklistedTokensChain[chain] || [] const mappedChain = chainMapping[chain] || chain; config.data.forEach(({ tvl: { [mappedChain]: assetTvl } = {} }) => { if (!assetTvl) return; @@ -37,8 +44,8 @@ chainListSupply.concat(chainListTotal).forEach(chain => { } }) if (tokensAndOwners.length > 0) - return api.sumTokens({ tokensAndOwners }) - return sumTokens({ chain, owners }) + return api.sumTokens({ tokensAndOwners, blacklistedTokens }) + return sumTokens({ chain, owners, blacklistedTokens, }) } }); diff --git a/projects/algem/index.js b/projects/algem/index.js index d66a69e601..e31d8d61c4 100644 --- a/projects/algem/index.js +++ b/projects/algem/index.js @@ -13,7 +13,6 @@ async function tvl(timestamp, block, chainBlocks) { module.exports = { methodology: 'counts the number of ASTR tokens locked in Liquid Staking contract', - start: 1502025, astar: { tvl, } diff --git a/projects/alien-finance/index.js b/projects/alien-finance/index.js index ba6bff29a8..abd2d1339d 100644 --- a/projects/alien-finance/index.js +++ b/projects/alien-finance/index.js @@ -6,7 +6,7 @@ module.exports = { blast: { tvl, borrowed, }, - start: 1709630412, + start: '2024-03-05', }; async function tvl(api) { diff --git a/projects/alienbase-v3/index.js b/projects/alienbase-v3/index.js index 8240ecdc52..84e9b10caa 100644 --- a/projects/alienbase-v3/index.js +++ b/projects/alienbase-v3/index.js @@ -2,5 +2,5 @@ const { uniV3Export } = require('../helper/uniswapV3') const factory = '0x0Fd83557b2be93617c9C1C1B6fd549401C74558C' module.exports = uniV3Export({ - base: { factory, fromBlock: 7150708, }, + base: { factory, fromBlock: 7150708, permitFailure: true }, }) diff --git a/projects/alkemi/index.js b/projects/alkemi/index.js index e30d6514c4..a1dd5cc212 100644 --- a/projects/alkemi/index.js +++ b/projects/alkemi/index.js @@ -71,6 +71,6 @@ async function tvl(timestamp, block) { module.exports = { methodology: "TVL consists of Assets (ETH, WBTC, Stablecoins) deposited in Alkemi Earn, Assets (ETH, WBTC, Stablecoins) deposited in Alkemi Earn Open, and does NOT currently consider assets borrowed", - start: 1609380306, // unix timestamp (utc 0) specifying when the project began, or where live data begins + start: '2020-12-31', // unix timestamp (utc 0) specifying when the project began, or where live data begins ethereum: { tvl } // tvl adapter }; diff --git a/projects/allo/index.js b/projects/allo/index.js new file mode 100644 index 0000000000..51a9d7ca84 --- /dev/null +++ b/projects/allo/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/sumTokens"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + + +module.exports = { + methodology: `Total amount of BTC in restaked on babylon`, + doublecounted:true, + bitcoin: { + tvl: sumTokensExport({ owners: bitcoinAddressBook.allo }), + }, +}; diff --git a/projects/allspark/index.js b/projects/allspark/index.js index e59b148d7b..224d8852c6 100644 --- a/projects/allspark/index.js +++ b/projects/allspark/index.js @@ -3,7 +3,6 @@ const {staking} = require("../helper/staking"); module.exports = { methodology: 'allspark counts the staking values as tvl', - start: 1690371, zklink:{ tvl: staking( ["0xD06B5A208b736656A8F9cD04ed43744C738BD8A9"], diff --git a/projects/allstake/idls/strategy_manager.json b/projects/allstake/idls/strategy_manager.json deleted file mode 100644 index c543451595..0000000000 --- a/projects/allstake/idls/strategy_manager.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "version": "0.1.0", - "name": "strategy_manager", - "instructions": [], - "accounts": [ - { - "name": "StrategyManager", - "type": { - "kind": "struct", - "fields": [ - { - "name": "data", - "type": { - "defined": "VersionedStrategyManager" - } - } - ] - } - } - ], - "types": [ - { - "name": "StrategyManagerV1", - "type": { - "kind": "struct", - "fields": [ - { - "name": "owner", - "docs": [ - "owner of strategy manager program" - ], - "type": "publicKey" - }, - { - "name": "strategyMints", - "docs": [ - "list of supported strategies' mint address" - ], - "type": { - "array": [ - "publicKey", - 32 - ] - } - }, - { - "name": "strategyMintsLen", - "docs": [ - "size of the list above" - ], - "type": "u8" - }, - { - "name": "minWithdrawDelay", - "docs": [ - "min withdraw queueing delay length in seconds" - ], - "type": "i64" - } - ] - } - }, - { - "name": "VersionedStrategyManager", - "type": { - "kind": "enum", - "variants": [ - { - "name": "V1", - "fields": [ - { - "defined": "StrategyManagerV1" - } - ] - } - ] - } - } - ], - "events": [], - "errors": [] -} \ No newline at end of file diff --git a/projects/allstake/index.js b/projects/allstake/index.js index a685108ede..c8b3dbaa44 100644 --- a/projects/allstake/index.js +++ b/projects/allstake/index.js @@ -1,12 +1,18 @@ const { getUniqueAddresses } = require('../helper/utils'); -const { call, sumTokens } = require('../helper/chain/near'); -const { sumTokens2, getProvider } = require('../helper/solana'); -const { Program } = require('@coral-xyz/anchor'); +const { call, sumTokens, } = require('../helper/chain/near'); +const { sumTokens2, getConnection } = require('../helper/solana'); +const { sumTokens2: evmSumTokens2 } = require("../helper/unwrapLPs") const { PublicKey } = require('@solana/web3.js'); const ALLSTAKE_NEAR_CONTRACT = 'allstake.near'; const ALLSTAKE_SOLANA_PROGRAM = new PublicKey('a11zL6Uxue6mYG3JD3APmnVhS4RVjGTJZbENY7L6ZfD'); -const ALLSTAKE_SOLANA_PROGRAM_IDL = require('./idls/strategy_manager.json'); +const ALLSTAKE_ETHEREUM_STRATEGY_MANAGER_CONTRACT = '0x344F8B88357A710937f2b3db9d1B974B9a002afB'; + +async function ethereumTvl(api) { + const strategies = await api.fetchList({ lengthAbi: 'strategiesLen', itemAbi: 'strategies', target: ALLSTAKE_ETHEREUM_STRATEGY_MANAGER_CONTRACT }) + const tokens = await api.multiCall({ abi: 'address:underlying', calls: strategies }); + return evmSumTokens2({ api, tokensAndOwners2: [tokens, strategies] }); +} async function nearTvl() { const strategies = await call(ALLSTAKE_NEAR_CONTRACT, 'get_strategies', {}); @@ -18,30 +24,17 @@ async function nearTvl() { } async function solanaTvl() { - const provider = getProvider(); - const programId = ALLSTAKE_SOLANA_PROGRAM; - // const idl = await Program.fetchIdl(programId, provider) - const program = new Program(ALLSTAKE_SOLANA_PROGRAM_IDL, programId, provider); - const state = await program.account.strategyManager.all(); - const strategyManager = state[0].account.data.v1[0]; - const tokens = getUniqueAddresses(strategyManager.strategyMints.slice(0, strategyManager.strategyMintsLen).map(mint => mint.toBase58()), true); - - const tokensAndOwners = []; - for (const token of tokens) { - const pubKey = new PublicKey(token); - const owner = PublicKey.findProgramAddressSync( - [ - Buffer.from('STRATEGY'), - pubKey.toBuffer(), - ], - ALLSTAKE_SOLANA_PROGRAM - )[0].toBase58(); - tokensAndOwners.push([token, owner]); - } - - return sumTokens2({ - tokensAndOwners + const result = await getConnection().getProgramAccounts(ALLSTAKE_SOLANA_PROGRAM, { + encoding: "base64", + // We only care about the strategy addresses. + dataSlice: { offset: 0, length: 0 }, + filters: [ + { dataSize: 316 }, + ], }); + const owners = result.map(({ pubkey }) => pubkey); + + return sumTokens2({ owners }); } module.exports = { @@ -49,7 +42,10 @@ module.exports = { tvl: nearTvl, }, solana: { - tvl: solanaTvl, + tvl: solanaTvl + }, + ethereum: { + tvl: ethereumTvl, }, timetravel: false, methodology: 'Summed up all the tokens deposited in the contract', diff --git a/projects/alpaca-finance-lend/index.js b/projects/alpaca-finance-lend/index.js index 4ddec9ca94..ab96424579 100644 --- a/projects/alpaca-finance-lend/index.js +++ b/projects/alpaca-finance-lend/index.js @@ -2,7 +2,7 @@ const { tvl, borrowed } = require("./lend"); // node test.js projects/alpaca-finance-lend/index.js module.exports = { - start: 1602054167, + start: '2020-10-07', methodology: "Sum floating balance and vaultDebtValue in each vault", bsc: { tvl, borrowed, }, fantom: { tvl, borrowed, }, diff --git a/projects/alpaca-finance-v2/index.js b/projects/alpaca-finance-v2/index.js index 546dabaa96..e3dfbaef57 100644 --- a/projects/alpaca-finance-v2/index.js +++ b/projects/alpaca-finance-v2/index.js @@ -1,7 +1,7 @@ const { lendingTvl, borrowTvl } = require("./moneyMarket"); module.exports = { - start: 1602054167, + start: '2020-10-07', methodology: "Sum floating balance and borrow for each token", bsc: { tvl: lendingTvl, diff --git a/projects/alpaca-finance/ausd.js b/projects/alpaca-finance/ausd.js index 9c96cb515d..fbc4fbd119 100644 --- a/projects/alpaca-finance/ausd.js +++ b/projects/alpaca-finance/ausd.js @@ -1,6 +1,4 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const BigNumber = require("bignumber.js"); const { getConfig } = require('../helper/cache') async function getProcolAUSDAddresses(chain) { @@ -30,70 +28,31 @@ async function getProcolLYFAddresses(chain) { } } -async function calAusdTvl(chain, block) { - /// @dev Initialized variables - const balances = {}; +async function calAusdTvl(api) { + const chain = api.chain; const ausdAddresses = await getProcolAUSDAddresses(chain); const lyfAddresses = await getProcolLYFAddresses(chain); - - const pids = await sdk.api.abi.multiCall({ - block, - abi: abi.pid, - calls: ausdAddresses["IbTokenAdapters"].map((each) => { - return { - target: each.address, - }; - }), - chain, - }); - const failaunchUserInfos = await sdk.api.abi.multiCall({ - block, + const ibTokens = ausdAddresses["IbTokenAdapters"].map((i) => i.address) + const pids = await api.multiCall({ abi: abi.pid, calls: ibTokens }); + const failaunchUserInfos = await api.multiCall({ abi: abi.userInfo, - calls: pids.output.map((each) => { - return { - target: lyfAddresses["FairLaunch"].address, - params: [each.output, each.input.target], - }; - }), - chain, - }); - const totalTokens = await sdk.api.abi.multiCall({ - block, - abi: abi.totalToken, - calls: ausdAddresses["IbTokenAdapters"].map((each) => { + target: lyfAddresses["FairLaunch"].address, + calls: pids.map((each, i) => { return { - target: each.collateralToken, + params: [each, ibTokens[i]], }; }), - chain, }); - const totalSupplys = await sdk.api.abi.multiCall({ - block, - abi: abi.totalSupply, - calls: ausdAddresses["IbTokenAdapters"].map((each) => { - return { - target: each.collateralToken, - }; - }), - chain, - }); - const vaultTokens = await sdk.api.abi.multiCall({ - block, - abi: abi.token, - calls: ausdAddresses["IbTokenAdapters"].map((each) => { - return { - target: each.collateralToken, - }; - }), - chain, - }); - - failaunchUserInfos.output.forEach((eachUserInfo, i) => { - const balance = new BigNumber(eachUserInfo.output.amount).multipliedBy(totalTokens.output[i].output).dividedBy(totalSupplys.output[i].output) - balances[`${chain}:${vaultTokens.output[i].output}`] = balance.toFixed(0); + const collateralTokens = ausdAddresses.IbTokenAdapters.map((each) => each.collateralToken); + const totalTokens = await api.multiCall({ abi: abi.totalToken, calls: collateralTokens }); + const totalSupplys = await api.multiCall({ abi: abi.totalSupply, calls: collateralTokens, }); + const vaultTokens = await api.multiCall({ abi: abi.token, calls: collateralTokens, }); + + failaunchUserInfos.forEach((eachUserInfo, i) => { + api.add(vaultTokens[i], eachUserInfo.amount * totalTokens[i] / totalSupplys[i]); }) - return balances; + return api.getBalances() } module.exports = { diff --git a/projects/alpaca-finance/index.js b/projects/alpaca-finance/index.js index 81ee4eeb26..042b95927e 100644 --- a/projects/alpaca-finance/index.js +++ b/projects/alpaca-finance/index.js @@ -4,34 +4,14 @@ const { calAusdTvl } = require('./ausd'); const { calxALPACAtvl } = require('./xalpaca'); const aExports = require('../alpaca-finance-lend'); -async function bscTvl(timestamp, ethBlock, chainBlocks) { - const lyfTvl = await calLyfTvl('bsc', chainBlocks.bsc); - const ausdTvl = await calAusdTvl('bsc', chainBlocks.bsc); - return {...lyfTvl, ...ausdTvl}; -} - -async function bscStaking(timestamp, ethBlock, chainBlocks) { - return await calxALPACAtvl('bsc', chainBlocks.bsc); -} - -async function fantomTvl(timestamp, ethBlock, chainBlocks) { - const lyfTvl = await calLyfTvl('fantom', chainBlocks.fantom); - return {...lyfTvl}; -} - -async function ftmStaking(timestamp, ethBlock, chainBlocks) { - return await calxALPACAtvl('fantom', chainBlocks.fantom); -} - -// node test.js projects/alpaca-finance/index.js module.exports = { - start: 1602054167, + start: '2020-10-07', bsc: { - tvl: sdk.util.sumChainTvls([bscTvl, aExports.bsc.tvl]), - staking: bscStaking, + tvl: sdk.util.sumChainTvls([calLyfTvl, calAusdTvl, aExports.bsc.tvl]), + staking: calxALPACAtvl, }, fantom: { - tvl: sdk.util.sumChainTvls([fantomTvl, aExports.fantom.tvl]), - staking: ftmStaking, + tvl: sdk.util.sumChainTvls([calLyfTvl, aExports.fantom.tvl]), + staking: calxALPACAtvl, } }; diff --git a/projects/alpaca-finance/lyf.js b/projects/alpaca-finance/lyf.js index d448335c57..5dd21568b9 100644 --- a/projects/alpaca-finance/lyf.js +++ b/projects/alpaca-finance/lyf.js @@ -1,8 +1,4 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); -const BigNumber = require("bignumber.js"); const { getConfig } = require('../helper/cache') -const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); async function getProcolAddresses(chain) { if (chain == 'bsc') { @@ -21,121 +17,14 @@ async function getProcolAddresses(chain) { } } -async function calLyfTvl(chain, block) { - /// @dev Initialized variables - const balances = {}; - - /// @dev Getting all addresses from Github +async function calLyfTvl(api) { + const chain = api.chain; const addresses = await getProcolAddresses(chain); - - for (let i = 0; i < addresses["Vaults"].length; i++) { - /// @dev getting balances that each of workers holding - const stakingTokenInfos = ( - await sdk.api.abi.multiCall({ - block, - abi: abi.userInfo, - calls: addresses["Vaults"][i]["workers"].filter((n) => { - /// @dev filter only workers that are working with LPs - if (n.name.includes("CakeMaxiWorker")) { - return false; - } - return true; - }).map((worker) => { - return { - target: worker["stakingTokenAt"], - params: [worker["pId"], worker["address"]], - }; - }), - chain, - }) - ).output; - - /// @dev unwrap LP to get underlaying token balances for workers that are working with LPs - await unwrapUniswapLPs( - balances, - stakingTokenInfos - .filter((n) => { - /// @dev filter only workers that are working with LPs - const name = addresses["Vaults"][i]["workers"].find( - (w) => w.address === n.input.params[1] - ).name; - if (name.includes("CakeMaxiWorker")) { - return false; - } - return true; - }) - .map((info) => { - /// @dev getting LP address and return the object that unwrapUniswapLPs want - const lpAddr = addresses["Vaults"][i]["workers"].find( - (w) => w.address === info.input.params[1] - ).stakingToken; - return { - token: lpAddr, - balance: info.output.amount, - }; - }), - block, - chain, - (addr) => `${chain}:${addr}` - ); - - /// @dev update balances directly for single-asset workers - const singleAssetWorkersInfos = ( - await sdk.api.abi.multiCall({ - block, - abi: abi.userInfoCake, - calls: addresses["Vaults"][i]["workers"].filter((n) => { - /// @dev filter only single-asset LYF workers - return n.name.includes("CakeMaxiWorker"); - }).map((worker) => { - return { - target: worker["stakingTokenAt"], - params: [worker["address"]], - }; - }), - chain, - }) - ).output; - - const singleAssetPrice = ( - await sdk.api.abi.multiCall({ - block, - abi: abi.singleAssetPrice, - calls: addresses["Vaults"][0]["workers"].filter((n) => { - /// @dev filter only single-asset LYF workers - return n.name.includes("CakeMaxiWorker"); - }).map((worker) => { - return { - target: worker["stakingTokenAt"], - }; - }), - chain, - }) - ).output; - - const singleAssetWorkersBalances = singleAssetWorkersInfos - .map((n) => { - /// @dev getting staking token address and return the object to be sum with balances - const stakingTokenAddr = addresses["Vaults"][i]["workers"].find( - (w) => w.address === n.input.params[0] - ).stakingToken; - return { - token: stakingTokenAddr, - balance: BigNumber(n.output.shares).multipliedBy(BigNumber(singleAssetPrice[0].output)).div(1e18), - }; - }); - - /// @dev sum single-asset balances to balances variable - singleAssetWorkersBalances.forEach((s) => { - balances[`${chain}:${s.token}`] = BigNumber( - balances[`${chain}:${s.token}`] || 0 - ) - .plus(BigNumber(s.balance)) - .toFixed(0); - }); - } - - return balances; + const vaults = addresses["Vaults"].map(i => i.address) + const tokens = await api.multiCall({ abi: 'address:token', calls: vaults}) + const bals = await api.multiCall({ abi: 'uint256:totalToken', calls: vaults}) + api.add(tokens, bals) + return api.getBalances() } module.exports = { diff --git a/projects/alpaca-finance/xalpaca.js b/projects/alpaca-finance/xalpaca.js index 490a9dd403..00c4de8660 100644 --- a/projects/alpaca-finance/xalpaca.js +++ b/projects/alpaca-finance/xalpaca.js @@ -1,4 +1,3 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const { getConfig } = require('../helper/cache') @@ -18,25 +17,14 @@ async function getProcolXAlpacaAddresses(chain) { ) } } - -async function calxALPACAtvl(chain, block) { - const xalpacaAddresses = await getProcolXAlpacaAddresses(chain); - const xalpacaTVL = ( - await sdk.api.abi.multiCall({ - block, - abi: abi.xalpacaTotalSupply, - calls: [ - { - target: xalpacaAddresses["xALPACA"], - }, - ], - chain, - }) - ).output; +async function calxALPACAtvl(api) { + const xalpacaAddresses = await getProcolXAlpacaAddresses(api.chain); + + const xalpacaTVL = await api.call({ abi: abi.xalpacaTotalSupply, target: xalpacaAddresses["xALPACA"], }) const alpacaAddress = xalpacaAddresses["Tokens"]["ALPACA"]; - return { [`${chain}:${alpacaAddress}`]: xalpacaTVL[0].output }; + api.add(alpacaAddress, xalpacaTVL) } module.exports = { diff --git a/projects/alpha-homora/index.js b/projects/alpha-homora/index.js index d512fa9997..b614e73bde 100644 --- a/projects/alpha-homora/index.js +++ b/projects/alpha-homora/index.js @@ -1,32 +1,11 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const BigNumber = require("bignumber.js"); const {tvlV1Eth, tvlV1Bsc} = require('./v1.js') const {tvlV2, tvlV2Onchain} = require('./v2.js') -async function ethTvl(timestamp, block) { - const ethAddress = ADDRESSES.null; - const balances = {}; - - const tvls = await Promise.all([ - tvlV1Eth(timestamp, block), - tvlV2(block, "ethereum", true), - ]); - - const ethTvl = BigNumber.sum(tvls[0], tvls[1]); - balances[ethAddress] = ethTvl.toFixed(0); - - return balances; -} - -async function avaxTvl(timestamp, block, chainBlocks) { - return tvlV2Onchain(chainBlocks.avax, "avax") -} - -async function fantomTvl(timestamp, block, chainBlocks) { - return tvlV2Onchain(chainBlocks.fantom, "fantom") -} -async function opTvl(timestamp, block, chainBlocks) { - return tvlV2Onchain(chainBlocks.optimism, "optimism") +async function ethTvl(api) { + await Promise.all([ + tvlV1Eth(api), + tvlV2(api), + ]) } module.exports = { @@ -39,15 +18,15 @@ module.exports = { tvl: tvlV1Bsc }, avax:{ - tvl: avaxTvl + tvl: tvlV2Onchain }, fantom:{ - tvl: fantomTvl + tvl: tvlV2Onchain }, optimism:{ - tvl: opTvl + tvl: tvlV2Onchain }, - start: 1602054167, // unix timestamp (utc 0) specifying when the project began, or where live data begins + start: '2020-10-07', // unix timestamp (utc 0) specifying when the project began, or where live data begins hallmarks: [ [1613178000, "37M exploit"], // Feb 13, 2021 [1626220800, "Upgrade to V2 on ETH"], // July 14, 2021 00:00 UTC diff --git a/projects/alpha-homora/v1.js b/projects/alpha-homora/v1.js index 3e8ed453dd..77aa2b7856 100644 --- a/projects/alpha-homora/v1.js +++ b/projects/alpha-homora/v1.js @@ -1,139 +1,35 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const { getConfig } = require('../helper/cache') -const BigNumber = require("bignumber.js"); +const { getConfig } = require('../helper/cache'); +const { sumTokens2 } = require('../helper/unwrapLPs'); module.exports = { - tvlV1Eth, - tvlV1Bsc + tvlV1Eth, + tvlV1Bsc } -async function tvlV1Eth({timestamp}, block) { - const startTimestamp = 1602054167; - const startBlock = 11007158; - - if (timestamp < startTimestamp || block < startBlock) { - return BigNumber(0); - } - return tvlV1("ethereum", block, "https://homora.alphafinance.io/static/contracts.json", "WETHAddress", "totalETH") +async function tvlV1Eth(api) { + return tvlV1(api, "https://homora.alphafinance.io/static/contracts.json") } const wBNB = ADDRESSES.bsc.WBNB -async function tvlV1Bsc(timestamp, block, chainBlocks) { - const tvlBNB = await tvlV1("bsc", chainBlocks.bsc, "https://homora-bsc.alphafinance.io/static/contracts.json", "WBNBAddress", "totalBNB") - return { - ["bsc:"+wBNB]: tvlBNB.toFixed(0) - } +async function tvlV1Bsc(api) { + await tvlV1(api, "https://homora-bsc.alphafinance.io/static/contracts.json") } -async function tvlV1(chain, block, contractsUrl, wrappedBaseName, totalEthMethodName) { - const data = await getConfig('alpha-hormora/v1/'+chain, - contractsUrl - ); - - const bankAddress = data.bankAddress.toLowerCase(); - const WETHAddress = data[wrappedBaseName].toLowerCase(); - - let pools = data.pools; - - const uniswapPools = pools.filter( - (pool) => pool.id === undefined - ); - - const sushiswapPools = pools.filter( - (pool) => pool.id !== undefined - ); - pools = [...uniswapPools, ...sushiswapPools]; - - const { output: _totalETH } = await sdk.api.abi.call({ - target: bankAddress, - block, - chain, - abi: 'uint256:'+totalEthMethodName, - }); - - const totalETH = BigNumber(_totalETH); - - const { output: _totalDebt } = await sdk.api.abi.call({ - target: bankAddress, - block, - chain, - abi: abi["glbDebtVal"], - }); - - const totalDebt = BigNumber(_totalDebt); - - // Uniswap Pools - const { output: _UnilpTokens } = await sdk.api.abi.multiCall({ - calls: uniswapPools.map((pool) => ({ - target: pool.lpStakingAddress, - params: [pool.goblinAddress], - })), - chain, - abi: abi["balanceOf"], - block, - }); - - // Sushiswap Pools - const { output: _SushilpTokens } = await sdk.api.abi.multiCall({ - calls: sushiswapPools.map((pool) => ({ - target: pool.lpStakingAddress, - params: [pool.id, pool.goblinAddress], - })), - chain, - abi: abi["userInfo"], - block, - }); - - const _lpTokens = [ - ..._UnilpTokens, - ..._SushilpTokens.map((x) => ({ - output: x.output[0], - })), - ]; - - const lpTokens = _lpTokens.map((_lpToken) => BigNumber(_lpToken.output || 0)); - - const { output: _totalETHOnStakings } = await sdk.api.abi.multiCall({ - calls: pools.map((pool) => ({ - target: WETHAddress, - params: [pool.lpTokenAddress], - })), - chain, - abi: abi["balanceOf"], - block, - }); - - const totalETHOnStakings = _totalETHOnStakings.map((stake) => - BigNumber(stake.output || 0) - ); - - const { output: _totalLpTokens } = await sdk.api.abi.multiCall({ - calls: pools.map((pool) => ({ - target: pool.lpTokenAddress, - })), - chain, - abi: abi["totalSupply"], - block, - }); - - const totalLpTokens = _totalLpTokens.map((_totalLpToken) => - BigNumber(_totalLpToken.output || 0) - ); - - const unUtilizedValue = totalETH.minus(totalDebt); - - let tvl = BigNumber(unUtilizedValue); - for (let i = 0; i < lpTokens.length; i++) { - if (totalLpTokens[i].gt(0)) { - const amount = lpTokens[i] - .times(totalETHOnStakings[i]) - .div(totalLpTokens[i]) - .times(BigNumber(2)); - - tvl = tvl.plus(amount); - } - } - return tvl; - } \ No newline at end of file +async function tvlV1(api, contractsUrl) { + const data = await getConfig('alpha-hormora/v1/' + api.chain, contractsUrl); + + const bankAddress = data.bankAddress + + let pools = data.pools.map(i => i.goblinAddress) + const tokens = await api.multiCall({ abi: 'address:lpToken', calls: pools }) + const shares = await api.multiCall({ abi: 'uint256:totalShare', calls: pools }) + const bals = await api.multiCall({ abi: 'function shareToBalance(uint256) view returns (uint256)', calls: shares.map((v, i) => ({ target: pools[i], params: v})) }) + api.add(tokens, bals) + const totalEthMethodName = api.chain === 'bsc' ? 'totalBNB' : 'totalETH'; + const totalETH = await api.call({ target: bankAddress, abi: 'uint256:' + totalEthMethodName, }); + const totalDebt = await api.call({ target: bankAddress, abi: abi.glbDebtVal, }); + api.addGasToken(totalETH - totalDebt); + return sumTokens2({ api, resolveLP: true}) +} \ No newline at end of file diff --git a/projects/alpha-homora/v2.js b/projects/alpha-homora/v2.js index ab58294362..293e35739d 100644 --- a/projects/alpha-homora/v2.js +++ b/projects/alpha-homora/v2.js @@ -1,369 +1,174 @@ -const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const BigNumber = require("bignumber.js"); -const { request, gql } = require("graphql-request"); -const { unwrapCreamTokens, unwrapUniswapLPs, sumTokens2 } = require('../helper/unwrapLPs') +const { request, } = require("graphql-request"); +const { sumTokens2 } = require('../helper/unwrapLPs') const { getConfig } = require('../helper/cache') const chainParams = { - optimism: { - safeBoxApi: "https://api.homora.alphaventuredao.io/v2/10/safeboxes", - latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('B3g98fbbStVKtff6QUY6iMUqp7rxqrdDyGdrXAmcWG6B'), - poolsJsonUrl: "https://api.homora.alphaventuredao.io/v2/10/pools", - instances: [ ] - }, - avax: { - safeBoxApi: "https://homora-api.alphafinance.io/v2/43114/safeboxes", - latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('8zVTsZBmd8CU7vnmonPr7qex4A69yM7NSzxKCpGHw6Q6'), + optimism: { + safeBoxApi: "https://api.homora.alphaventuredao.io/v2/10/safeboxes", + latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('B3g98fbbStVKtff6QUY6iMUqp7rxqrdDyGdrXAmcWG6B'), + poolsJsonUrl: "https://api.homora.alphaventuredao.io/v2/10/pools", + instances: [] + }, + avax: { + safeBoxApi: "https://homora-api.alphafinance.io/v2/43114/safeboxes", + latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('8zVTsZBmd8CU7vnmonPr7qex4A69yM7NSzxKCpGHw6Q6'), + poolsJsonUrl: "https://homora-api.alphafinance.io/v2/43114/pools", + instances: [ + { + wMasterChefAddress: "0xb41de9c1f50697cc3fd63f24ede2b40f6269cbcb", + wLiquidityGauge: "0xf1f32c8eeb06046d3cc3157b8f9f72b09d84ee5b", // wrong poolsJsonUrl: "https://homora-api.alphafinance.io/v2/43114/pools", - instances: [ - { - wMasterChefAddress: "0xb41de9c1f50697cc3fd63f24ede2b40f6269cbcb", - wLiquidityGauge: "0xf1f32c8eeb06046d3cc3157b8f9f72b09d84ee5b", // wrong - poolsJsonUrl: "https://homora-api.alphafinance.io/v2/43114/pools", - graphUrl: sdk.graph.modifyEndpoint('8zVTsZBmd8CU7vnmonPr7qex4A69yM7NSzxKCpGHw6Q6'), - }, - ] - }, - fantom: { - safeBoxApi: "https://homora-api.alphafinance.io/v2/250/safeboxes", - latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('H4Q15YbQxRWw14HaABfWiTptSwRzanXNwyACY8MCRqVS'), - poolsJsonUrl: "https://homora-api.alphafinance.io/v2/250/pools", - instances: [ - { - wMasterChefAddress: "0x5FC20fCD1B50c5e1196ac790DADCfcDD416bb0C7", - wLiquidityGauge: "0xf1f32c8eeb06046d3cc3157b8f9f72b09d84ee5b", // wrong - poolsJsonUrl: "https://homora-api.alphafinance.io/v2/43114/pools", - graphUrl: sdk.graph.modifyEndpoint('H4Q15YbQxRWw14HaABfWiTptSwRzanXNwyACY8MCRqVS'), - }, - ] - }, - ethereum: { - safeBoxApi: "https://homora-api.alphafinance.io/v2/1/safeboxes", - coreOracleAddress: "0x6be987c6d72e25f02f6f061f94417d83a6aa13fc", - latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('CnfAARjTUna6ZVo7RjJvQmm44e7uWx6kbaRm4Xh5MR5N'), - instances: [ - { - // Current - werc20Address: "0x06799a1e4792001aa9114f0012b9650ca28059a3", - wMasterChefAddress: "0xa2caea05ff7b98f10ad5ddc837f15905f33feb60", - wLiquidityGauge: "0xf1f32c8eeb06046d3cc3157b8f9f72b09d84ee5b", - wStakingRewardIndex: "0x011535fd795fd28c749363e080662d62fbb456a7", - wStakingRewardPerp: "0xc4635854480fff80f742645da0310e9e59795c63", - poolsJsonUrl: "https://homora-api.alphafinance.io/v2/1/pools", - graphUrl: sdk.graph.modifyEndpoint('37CbUUxwQC7uTqQquQXtQQF8b2bU7L3VBrkEntiHxf4r'), - }, - { - // Legacy - werc20Address: "0xe28d9df7718b0b5ba69e01073fe82254a9ed2f98", - wMasterChefAddress: "0x373ae78a14577682591e088f2e78ef1417612c68", - wLiquidityGauge: "0xfdb4f97953150e47c8606758c13e70b5a789a7ec", - wStakingRewardIndex: "0x713df2ddda9c7d7bda98a9f8fcd82c06c50fbd90", - wStakingRewardPerp: "0xc4635854480fff80f742645da0310e9e59795c63", - poolsJsonUrl: - "local", - graphUrl: sdk.graph.modifyEndpoint('CnfAARjTUna6ZVo7RjJvQmm44e7uWx6kbaRm4Xh5MR5N'), - } - ] - } + graphUrl: sdk.graph.modifyEndpoint('8zVTsZBmd8CU7vnmonPr7qex4A69yM7NSzxKCpGHw6Q6'), + }, + ] + }, + fantom: { + safeBoxApi: "https://homora-api.alphafinance.io/v2/250/safeboxes", + latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('H4Q15YbQxRWw14HaABfWiTptSwRzanXNwyACY8MCRqVS'), + poolsJsonUrl: "https://homora-api.alphafinance.io/v2/250/pools", + instances: [ + { + wMasterChefAddress: "0x5FC20fCD1B50c5e1196ac790DADCfcDD416bb0C7", + wLiquidityGauge: "0xf1f32c8eeb06046d3cc3157b8f9f72b09d84ee5b", // wrong + poolsJsonUrl: "https://homora-api.alphafinance.io/v2/43114/pools", + graphUrl: sdk.graph.modifyEndpoint('H4Q15YbQxRWw14HaABfWiTptSwRzanXNwyACY8MCRqVS'), + }, + ] + }, + ethereum: { + safeBoxApi: "https://homora-api.alphafinance.io/v2/1/safeboxes", + coreOracleAddress: "0x6be987c6d72e25f02f6f061f94417d83a6aa13fc", + latestAlphaHomoraV2GraphUrl: sdk.graph.modifyEndpoint('CnfAARjTUna6ZVo7RjJvQmm44e7uWx6kbaRm4Xh5MR5N'), + instances: [ + { + // Current + werc20Address: "0x06799a1e4792001aa9114f0012b9650ca28059a3", + wMasterChefAddress: "0xa2caea05ff7b98f10ad5ddc837f15905f33feb60", + wLiquidityGauge: "0xf1f32c8eeb06046d3cc3157b8f9f72b09d84ee5b", + wStakingRewardIndex: "0x011535fd795fd28c749363e080662d62fbb456a7", + wStakingRewardPerp: "0xc4635854480fff80f742645da0310e9e59795c63", + poolsJsonUrl: "https://homora-api.alphafinance.io/v2/1/pools", + graphUrl: sdk.graph.modifyEndpoint('37CbUUxwQC7uTqQquQXtQQF8b2bU7L3VBrkEntiHxf4r'), + }, + { + // Legacy + werc20Address: "0xe28d9df7718b0b5ba69e01073fe82254a9ed2f98", + wMasterChefAddress: "0x373ae78a14577682591e088f2e78ef1417612c68", + wLiquidityGauge: "0xfdb4f97953150e47c8606758c13e70b5a789a7ec", + wStakingRewardIndex: "0x713df2ddda9c7d7bda98a9f8fcd82c06c50fbd90", + wStakingRewardPerp: "0xc4635854480fff80f742645da0310e9e59795c63", + poolsJsonUrl: + "local", + graphUrl: sdk.graph.modifyEndpoint('CnfAARjTUna6ZVo7RjJvQmm44e7uWx6kbaRm4Xh5MR5N'), + } + ] + } } -const GET_TOTAL_COLLATERALS = gql` - query GET_TOTAL_COLLATERALS($block: Int) { - werc20Collaterals(block: { number: $block }) { +const GET_TOTAL_COLLATERALS = ` + query GET_TOTAL_COLLATERALS{ + werc20Collaterals { lpToken amount } - sushiswapCollaterals(block: { number: $block }) { + sushiswapCollaterals{ pid amount } - crvCollaterals(block: { number: $block }) { + crvCollaterals { pid gid amount } - wstakingRewardCollaterals(block: { number: $block }) { + wstakingRewardCollaterals { wtoken amount } } `; -const GET_CY_TOKEN = gql` - query GET_CY_TOKEN($cyToken: String, $block: Int) { - cyTokenStates( - where: { cyToken: $cyToken } - first: 1 - orderBy: blockTimestamp - orderDirection: desc - block: { number: $block } - ) { - id - cyToken - safeboxBalance - exchangeRate - blockTimestamp - } - } -`; module.exports = { - tvlV2, - tvlV2Onchain -} - -async function getPools(poolsJsonUrl, chain){ - return poolsJsonUrl === "local"? require('./v2/legacy-pools.json') : (await getConfig('alpha-hormora/v2-pools/'+chain, poolsJsonUrl)) + tvlV2, + tvlV2Onchain } -async function tvlV2Onchain(block, chain) { - const balances = {} - const transform = addr => { - if (addr.toLowerCase() === '0x260bbf5698121eb85e7a74f2e45e16ce762ebe11') - return 'avax:' + ADDRESSES.avax.USDT_e // Axelar wrapped UST -> USDT - if (addr.toLowerCase() === '0x2147efff675e4a4ee1c2f918d181cdbd7a8e208f') - return '0xa1faa113cbe53436df28ff0aee54275c13b40975' // Wrapped Alpha Finance -> ALPHA (erc20) - return `${chain}:${addr}` - } - const { safeBoxApi, poolsJsonUrl, instances, } = chainParams[chain]; - let safebox = await getConfig('alpha-hormora/v2-safebox/'+chain, safeBoxApi); - const safeBoxRewards = safebox.filter(i => i.ibStakingReward) - safebox = safebox.filter(i => !i.ibStakingReward) - await unwrapIBRewards({ boxes: safeBoxRewards, balances, chain, block, transform, }) - await unwrapCreamTokens(balances, safebox.map(s=>[s.cyTokenAddress, s.safeboxAddress]), block, chain, transform) - let pools= await getPools(poolsJsonUrl, chain); - const owners = pools.filter(i => i.wTokenType === 'WUniswapV3').map(i => i.wTokenAddress).filter(i => i) - pools = pools.filter(i => i.wTokenType !== 'WUniswapV3') - let poolsWithPid = pools.filter(p => p.pid !== undefined) - let poolsWithoutPid = pools.filter(p => p.pid === undefined) - const { output: masterchefLpTokens } = await sdk.api.abi.multiCall({ - calls: poolsWithPid.map((pool) => ({ - target: pool.exchange.stakingAddress ?? pool.stakingAddress, - params: [pool.pid, pool.wTokenAddress], - })), - chain, - abi: abi["userInfo"], - block, - }); - let lpPools = masterchefLpTokens.map((amount, i) => ({ - balance: amount.output.amount, - token: poolsWithPid[i].lpTokenAddress - })) - const { output: stakingPoolsLpTokens } = await sdk.api.abi.multiCall({ - calls: poolsWithoutPid.map((pool) => ({ - target: pool.stakingAddress, - params: [pool.wTokenAddress], - })), - chain, - abi: "erc20:balanceOf", - block, - }); - stakingPoolsLpTokens.forEach((amount, i) => lpPools.push({ - balance: amount.output, - token: poolsWithoutPid[i].lpTokenAddress - })) - const blacklisted = ['0xf3a602d30dcb723a74a0198313a7551feaca7dac', '0x2a8a315e82f85d1f0658c5d66a452bbdd9356783',].map(i => i.toLowerCase()) - lpPools = lpPools.filter(p => !blacklisted.includes(p.token.toLowerCase())) - await unwrapUniswapLPs(balances, lpPools, block, chain, transform) - if (owners.length) await sumTokens2({ balances, chain, block, owners, resolveUniV3: true, }) - - return balances +async function getPools(poolsJsonUrl, chain) { + return poolsJsonUrl === "local" ? require('./v2/legacy-pools.json') : (await getConfig('alpha-hormora/v2-pools/' + chain, poolsJsonUrl)) } -async function unwrapIBRewards({ block, chain, boxes, balances, transform}) { - for (const { cyTokenAddress, ibStakingReward, safeboxAddress, } of boxes) { - const tempBalance = {} - const [ - { output: balanceOf,}, - { output: totalSupply,}, - ] = await Promise.all([ - sdk.api.erc20.balanceOf({ target: ibStakingReward, owner: safeboxAddress, chain, block, }), - sdk.api.erc20.totalSupply({ target: ibStakingReward, chain, block, }), - unwrapCreamTokens(tempBalance, [[cyTokenAddress, ibStakingReward]], block, chain, transform), - ]) - const ratio = balanceOf / totalSupply - for (const [token, balance] of Object.entries(tempBalance)) { - sdk.util.sumSingleBalance(balances, token, BigNumber(balance * ratio).toFixed(0)) - } - } +async function tvlV2Onchain(api) { + const chain = api.chain + const { safeBoxApi, poolsJsonUrl, } = chainParams[chain]; + let safebox = await getConfig('alpha-hormora/v2-safebox/' + chain, safeBoxApi); + const ownerTokens = safebox.map(s => [[s.cyTokenAddress], s.safeboxAddress]) + await sumTokens2({ api, ownerTokens }) + let pools = await getPools(poolsJsonUrl, chain); + const owners = pools.filter(i => i.wTokenType === 'WUniswapV3').map(i => i.wTokenAddress).filter(i => i) + pools = pools.filter(i => i.wTokenType !== 'WUniswapV3') + let poolsWithPid = pools.filter(p => p.pid !== undefined) + let poolsWithoutPid = pools.filter(p => p.pid === undefined) + const masterchefLpTokens = await api.multiCall({ + calls: poolsWithPid.map((pool) => ({ + target: pool.exchange.stakingAddress ?? pool.stakingAddress, + params: [pool.pid, pool.wTokenAddress], + })), + abi: abi["userInfo"], + }); + masterchefLpTokens.map((amount, i) => api.add(poolsWithPid[i].lpTokenAddress, amount.amount)) + const stakingPoolsLpTokens = await api.multiCall({ + calls: poolsWithoutPid.map((pool) => ({ target: pool.stakingAddress, params: [pool.wTokenAddress], })), + abi: "erc20:balanceOf", + }); + stakingPoolsLpTokens.forEach((amount, i) => api.add(poolsWithoutPid[i].lpTokenAddress, amount)) + const blacklisted = ['0xf3a602d30dcb723a74a0198313a7551feaca7dac', '0x2a8a315e82f85d1f0658c5d66a452bbdd9356783', '0x75E5509029c85fE08e4934B1275c5575aA5538bE'] + blacklisted.forEach(i => api.removeTokenBalance(i)) + await sumTokens2({ api, owners, resolveUniV3: api.chain === 'optimism', resolveLP: api.chain !== 'optimism', }) } - -async function tvlV2(block, chain) { - const { safeBoxApi, coreOracleAddress, latestAlphaHomoraV2GraphUrl, instances } = chainParams[chain]; - const cyTokens = await getCyTokens(block, safeBoxApi, latestAlphaHomoraV2GraphUrl, chain); - const collateralGroups = await Promise.all(instances.map(params => getTotalCollateral(block, params, chain))) - - const tokens = Array.from( - new Set([ - ...collateralGroups.map(collaterals => - collaterals.map((collateral) => collateral.lpTokenAddress) - .filter((lpToken) => !!lpToken)).flat(), - ...cyTokens.map((cy) => cy.token).filter((token) => !!token), - ]) - ); - - const tokenPrices = await getTokenPrices(tokens, block, chain, coreOracleAddress); - - const totalCollateralValue = BigNumber.sum(...collateralGroups.map(collaterals => sumCollaterals(collaterals, tokenPrices))) - - const totalCyValue = BigNumber.sum( - 0, - ...cyTokens.map((cy) => { - if (cy.token in tokenPrices) { - return BigNumber(cy.amount).times(tokenPrices[cy.token]); - } - return BigNumber(0); - }) - ); - - return totalCollateralValue - .plus(totalCyValue); +async function tvlV2(api) { + const chain = api.chain + const { safeBoxApi, instances } = chainParams[chain]; + await getCyTokens(api, safeBoxApi); + await Promise.all(instances.map(params => getTotalCollateral(params, api))) } -function sumCollaterals(collaterals, tokenPrices) { - return BigNumber.sum( - 0, // Default value - ...collaterals.map((collateral) => { - if (collateral.lpTokenAddress in tokenPrices) { - return BigNumber(collateral.amount).times( - tokenPrices[collateral.lpTokenAddress] - ); - } - return BigNumber(0); - }) - ); +async function getCyTokens(api, safeBoxApi) { + const safebox = await getConfig('alpha-hormora/v2-safebox/' + api.chain, safeBoxApi); + const ownerTokens = safebox.map(s => [[s.cyTokenAddress, s.address], s.safeboxAddress]) + return api.sumTokens({ ownerTokens, }) } -async function getCyTokens(block, safeBoxApi, AlphaHomoraV2GraphUrl, chain) { - const safebox = await getConfig('alpha-hormora/v2-safebox/'+chain, - safeBoxApi - ); - return Promise.all( - safebox.map(async (sb) => { - const cyToken = sb.cyTokenAddress; - const { cyTokenStates } = await request( - AlphaHomoraV2GraphUrl, - GET_CY_TOKEN, - { - block, - cyToken, - } - ); - const cyTokenState = cyTokenStates[0]; - if (!cyTokenState) { - return { amount: new BigNumber(0), token: null }; - } - const exchangeRate = new BigNumber(cyTokenState.exchangeRate).div(1e18); - const cyBalance = new BigNumber(cyTokenState.safeboxBalance); - return { amount: cyBalance.times(exchangeRate), token: sb.address }; - }) - ); -} -async function getTokenPrices(tokens, block, chain, coreOracleAddress) { - const { output: _ethPrices } = await sdk.api.abi.multiCall({ - calls: tokens.map((token) => ({ - target: coreOracleAddress, - params: [token], - })), - chain, - abi: abi["getETHPx"], - block, - permitFailure: true, - }); +async function getTotalCollateral({ wMasterChefAddress, wLiquidityGauge, poolsJsonUrl, graphUrl, }, api) { + const chain = api.chain + const pools = await getPools(poolsJsonUrl, chain); - const tokenPrices = {}; - for (let i = 0; i < _ethPrices.length; i++) { - const price = _ethPrices[i].output / 2 ** 112; - if (price > 0) { - tokenPrices[tokens[i]] = price; - } - } - return tokenPrices; -} + const { crvCollaterals, sushiswapCollaterals, werc20Collaterals, wstakingRewardCollaterals, } = await request(graphUrl, GET_TOTAL_COLLATERALS, { block: undefined }); -async function getTotalCollateral( - block, - { - werc20Address, - wMasterChefAddress, - wLiquidityGauge, - wStakingRewardIndex, - wStakingRewardPerp, - poolsJsonUrl, - graphUrl, - }, chain -) { - const pools = await getPools(poolsJsonUrl, chain); + crvCollaterals.map((coll) => { + const pool = pools.find((pool) => pool.wTokenAddress === wLiquidityGauge && Number(coll.pid) === pool.pid && Number(coll.gid) === pool.gid); + if (!pool || !pool.lpTokenAddress) + return; + api.add(pool.lpTokenAddress, coll.amount); + }) - const { - crvCollaterals, - sushiswapCollaterals, - werc20Collaterals, - wstakingRewardCollaterals, - } = await request(graphUrl, GET_TOTAL_COLLATERALS, { - block, - }); + sushiswapCollaterals.map((coll) => { + const pool = pools.find((pool) => pool.wTokenAddress === wMasterChefAddress && Number(coll.pid) === pool.pid); + if (!pool || !pool.lpTokenAddress) + return; + api.add(pool.lpTokenAddress, coll.amount); + }) - const collaterals = [ - ...crvCollaterals.map((coll) => { - const pool = pools.find( - (pool) => - pool.wTokenAddress === wLiquidityGauge && - Number(coll.pid) === pool.pid && - Number(coll.gid) === pool.gid - ); - if (!pool) { - return { - lpTokenAddress: null, - amount: BigNumber(0), - }; - } - return { - lpTokenAddress: pool.lpTokenAddress ? pool.lpTokenAddress : null, - amount: BigNumber(coll.amount), - }; - }), - ...sushiswapCollaterals.map((coll) => { - const pool = pools.find( - (pool) => - pool.wTokenAddress === wMasterChefAddress && - Number(coll.pid) === pool.pid - ); - if (!pool) { - return { - lpTokenAddress: null, - amount: BigNumber(0), - }; - } - return { - lpTokenAddress: pool.lpTokenAddress ? pool.lpTokenAddress : null, - amount: BigNumber(coll.amount), - }; - }), - ...werc20Collaterals.map((coll) => ({ - lpTokenAddress: - "0x" + - BigNumber(coll.lpToken).toString(16).padStart(40, "0").toLowerCase(), - amount: BigNumber(coll.amount), - })), - ...wstakingRewardCollaterals.map((coll) => { - const pool = pools.find((pool) => pool.wTokenAddress === coll.wtoken); - if (!pool) { - return { - lpTokenAddress: null, - amount: BigNumber(0), - }; - } - return { - lpTokenAddress: pool.lpTokenAddress ? pool.lpTokenAddress : null, - amount: BigNumber(coll.amount), - }; - }), - ]; + werc20Collaterals.map((coll) => api.add("0x" + BigNumber(coll.lpToken).toString(16).padStart(40, "0").toLowerCase(), coll.amount)) - return collaterals; + wstakingRewardCollaterals.map((coll) => { + const pool = pools.find((pool) => pool.wTokenAddress === coll.wtoken); + if (!pool || !pool.lpTokenAddress) + return; + api.add(pool.lpTokenAddress, coll.amount); + }) } diff --git a/projects/alphaX-protocol/index.js b/projects/alphaX-protocol/index.js index 0eb194a9a8..8eac5b407b 100644 --- a/projects/alphaX-protocol/index.js +++ b/projects/alphaX-protocol/index.js @@ -1,29 +1,18 @@ -const ADDRESSES = require('../helper/coreAssets.json'); -const { sumTokensExport } = require('../helper/unwrapLPs'); - -const tokens = [ - ADDRESSES.ethereum.USDT, -]; +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs') const walletAddresses = { - ethereum: ['0xA61a6E696B7C566DA42B80dA27d96e7104bcec99'], - arbitrum: ['0x552E7A55802f3350C707a243E402aa50Eda9D286'] - -}; + ethereum: ['0xA61a6E696B7C566DA42B80dA27d96e7104bcec99'], + arbitrum: ['0x552E7A55802f3350C707a243E402aa50Eda9D286'] +} const tokenAddress = { ethereum: [ADDRESSES.ethereum.USDT], arbitrum: [ADDRESSES.arbitrum.USDT], - - } -module.exports = { - ethereum: { - tvl: sumTokensExport({ owners: walletAddresses.ethereum, tokens: tokenAddress.ethereum }), - }, - arbitrum: { - tvl: sumTokensExport({ owners: walletAddresses.arbitrum, tokens: tokenAddress.arbitrum }), - }, - -}; +Object.keys(walletAddresses).forEach(chain => { + module.exports[chain] = { + tvl: sumTokensExport({ owners: walletAddresses[chain], tokens: tokenAddress[chain], }) + } +}) \ No newline at end of file diff --git a/projects/alphafi-stsui/index.js b/projects/alphafi-stsui/index.js new file mode 100644 index 0000000000..945514b6a7 --- /dev/null +++ b/projects/alphafi-stsui/index.js @@ -0,0 +1,16 @@ +const sui = require('../helper/chain/sui') + +async function tvl() { + const pool = await sui.getObject('0x1adb343ab351458e151bc392fbf1558b3332467f23bda45ae67cd355a57fd5f5'); + const suiAmount = pool.fields.storage.fields.total_sui_supply / 10 ** 9 + return { + sui: suiAmount, + } +} + +module.exports = { + methodology: "Calculates the amount of SUI staked in stSui liquid staking contracts.", + sui: { + tvl, + } +} diff --git a/projects/alphafi/index.js b/projects/alphafi/index.js index 4119f2420f..8515dc487c 100644 --- a/projects/alphafi/index.js +++ b/projects/alphafi/index.js @@ -1,61 +1,280 @@ const ADDRESSES = require('../helper/coreAssets.json') const sui = require("../helper/chain/sui") const { addUniV3LikePosition } = require("../helper/unwrapLPs") +const { log } = require('../helper/utils') const ALPHAFI_CETUS_TVL_IDS = [ { - +//usdt wusdc poolID: "0x30066d9879374276dc01177fbd239a9377b497bcd347c82811d75fcda35b18e5", - cetusPoolID: "0xc8d7a1503dc2f9f5b05449a87d8733593e2f0f3e7bffd90541252782e4d2ca20", + parentPoolID: "0xc8d7a1503dc2f9f5b05449a87d8733593e2f0f3e7bffd90541252782e4d2ca20", investorID: "0x87a76889bf4ed211276b16eb482bf6df8d4e27749ebecd13017d19a63f75a6d5", token0Type: ADDRESSES.sui.USDT, token1Type: ADDRESSES.sui.USDC }, - { + { //usdy wusdc poolID: "0xa7239a0c727c40ee3a139689b16b281acfd0682a06c23531b184a61721ece437", - cetusPoolID: "0x0e809689d04d87f4bd4e660cd1b84bf5448c5a7997e3d22fc480e7e5e0b3f58d", + parentPoolID: "0x0e809689d04d87f4bd4e660cd1b84bf5448c5a7997e3d22fc480e7e5e0b3f58d", investorID: "0x1b923520f19660d4eb013242c6d03c84fdea034b8f784cfd71173ef72ece50e1", token0Type: "0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY", token1Type: ADDRESSES.sui.USDC }, - { + { //wusdc sui poolID: "0xee6f6392cbd9e1997f6e4cf71db0c1ae1611f1f5f7f23f90ad2c64b8f23cceab", - cetusPoolID: "0xcf994611fd4c48e277ce3ffd4d4364c914af2c3cbb05f7bf6facd371de688630", + parentPoolID: "0xcf994611fd4c48e277ce3ffd4d4364c914af2c3cbb05f7bf6facd371de688630", investorID: "0xb6ca8aba0fb26ed264a3ae3d9c1461ac7c96cdcbeabb01e71086e9a8340b9c55", token0Type: ADDRESSES.sui.USDC, token1Type: ADDRESSES.sui.SUI }, { + //wusdc wbtc poolID: "0x676fc5cad79f51f6a7d03bfa3474ecd3c695d322380fc68e3d4f61819da3bf8a", - cetusPoolID: "0xaa57c66ba6ee8f2219376659f727f2b13d49ead66435aa99f57bb008a64a8042", + parentPoolID: "0xaa57c66ba6ee8f2219376659f727f2b13d49ead66435aa99f57bb008a64a8042", investorID: "0x9ae0e56aa0ebc27f9d8a17b5a9118d368ba262118d878977b6194a10a671bbbc", token0Type: ADDRESSES.sui.USDC, token1Type: ADDRESSES.sui.WBTC }, { + // weth wusdc poolID: "0xbdf4f673b34274f36be284bca3f765083380fefb29141f971db289294bf679c6", - cetusPoolID: "0x5b0b24c27ccf6d0e98f3a8704d2e577de83fa574d3a9060eb8945eeb82b3e2df", + parentPoolID: "0x5b0b24c27ccf6d0e98f3a8704d2e577de83fa574d3a9060eb8945eeb82b3e2df", investorID: "0x05fa099d1df7b5bfb2e420d5ee2d63508db17c40ce7c4e0ca0305cd5df974e43", token0Type: ADDRESSES.sui.WETH, token1Type: ADDRESSES.sui.USDC }, - { + { //navx sui poolID: "0x045e4e3ccd383bedeb8fda54c39a7a1b1a6ed6a9f66aec4998984373558f96a0", - cetusPoolID: "0x0254747f5ca059a1972cd7f6016485d51392a3fde608107b93bbaebea550f703", + parentPoolID: "0x0254747f5ca059a1972cd7f6016485d51392a3fde608107b93bbaebea550f703", investorID: "0xdd9018247d579bd7adfdbced4ed39c28821c6019461d37dbdf32f0d409959b1c", token0Type: "0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX", token1Type: ADDRESSES.sui.SUI }, { + // buck wusdc poolID: "0x59ff9c5df31bfd0a59ac8393cf6f8db1373252e845958953e6199952d194dae4", - cetusPoolID: "0x81fe26939ed676dd766358a60445341a06cea407ca6f3671ef30f162c84126d5", + parentPoolID: "0x81fe26939ed676dd766358a60445341a06cea407ca6f3671ef30f162c84126d5", investorID: "0x8051a9ce43f9c21e58331b1ba2b1925e4ae4c001b1400459236d86d5d3d2888b", token0Type: ADDRESSES.sui.BUCK, token1Type: ADDRESSES.sui.USDC }, - + {//wsol wusdc + poolID: "0xd50ec46c2514bc8c588760aa7ef1446dcd37993bc8a3f9e93563af5f31b43ffd", + parentPoolID: "0x9ddb0d269d1049caf7c872846cc6d9152618d1d3ce994fae84c1c051ee23b179", + investorID: "0x74308f0de7ea1fc4aae2046940522f8f79a6a76db94e1227075f1c2343689882", + token0Type: ADDRESSES.sui.SOL, + token1Type: ADDRESSES.sui.USDC + }, + { + //sca sui + poolID: "0x6eec371c24ad264ced3a1f40b83d7d720aa2b0afa860a6af85436f6a769842e1", + parentPoolID: "0xaa72bd551b25715b8f9d72f226fa02526bdf2e085a86faec7184230c5209bb6e", + investorID: "0x651acc1166023a08c17f24e71550982400e9b1f4950cc1324410300efc1af905", + token0Type: "0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA", + token1Type: ADDRESSES.sui.SUI + }, + // usdc sui + { + poolID: "0x727882553d1ab69b0cabad2984331e7e39445f91cb4046bf7113c36980685528", + parentPoolID: "0xb8d7d9e66a60c239e7a60110efcf8de6c705580ed924d0dde141f4a0e2c90105", + investorID: "0xba6acd0350eab1c6bc433b6c869e5592fe0667ae96a3115f89d5c79dd78396ef", + token0Type: ADDRESSES.sui.USDC_CIRCLE, + token1Type: ADDRESSES.sui.SUI + }, + // usdc usdt + { + poolID: "0xa213f04c6049f842a7ffe7d39e0c6138a863dc6e25416df950d23ddb27d75661", + parentPoolID: "0x6bd72983b0b5a77774af8c77567bb593b418ae3cd750a5926814fcd236409aaa", + investorID: "0xe553be450b7290025d5810da45102abdbaa211c5735e47f6740b4dd880edc0bd", + token0Type: ADDRESSES.sui.USDC_CIRCLE, + token1Type: ADDRESSES.sui.USDT + }, + // usdc wusdc + { + poolID: "0x568a47adf2b10219f0973a5600096822b38b4a460c699431afb6dad385614d66", + parentPoolID: "0x1efc96c99c9d91ac0f54f0ca78d2d9a6ba11377d29354c0a192c86f0495ddec7", + investorID: "0x6cc5e671a2a6e9b8c8635ff1fb16ae62abd7834558c3a632d97f393c0f022972", + token0Type: ADDRESSES.sui.USDC_CIRCLE, + token1Type: ADDRESSES.sui.USDC + }, + // usdc eth + { + poolID: "0xc04f71f32a65ddf9ebf6fb69f39261457da28918bfda5d3760013f3ea782a594", + parentPoolID: "0x9e59de50d9e5979fc03ac5bcacdb581c823dbd27d63a036131e17b391f2fac88", + investorID: "0xb0bff60783536f9dc0b38e43150a73b73b8a4f1969446f7721e187821915bd00", + token0Type: ADDRESSES.sui.USDC_CIRCLE, + token1Type: ADDRESSES.sui.ETH + }, + // deep sui + { + poolID: "0xff496f73a1f9bf7461882fbdad0c6c6c73d301d3137932f7fce2428244359eaa", + parentPoolID: "0xe01243f37f712ef87e556afb9b1d03d0fae13f96d324ec912daffc339dfdcbd2", + investorID: "0x5e195363175e4b5139749d901ddd5ef1ffc751777a7051b558c45fa12f24abc3", + token0Type: "0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP", + token1Type: ADDRESSES.sui.SUI + }, + // buck sui + { + poolID: "0xeb44ecef39cc7873de0c418311557c6b8a60a0af4f1fe1fecece85d5fbe02ab5", + parentPoolID: "0x59cf0d333464ad29443d92bfd2ddfd1f794c5830141a5ee4a815d1ef3395bf6c", + investorID: "0x9b7c9b6086d3baf413bccdfbb6f60f04dedd5f5387dee531eef5b811afdfaedc", + token0Type: ADDRESSES.sui.BUCK, + token1Type: ADDRESSES.sui.SUI + }, + // fud sui + { + poolID: "0x005a2ebeb982a1e569a54795bce1eeb4d88900b674440f8487c2846da1706182", + parentPoolID: "0xfc6a11998f1acf1dd55acb58acd7716564049cfd5fd95e754b0b4fe9444f4c9d", + investorID: "0xaa17ff01024678a94381fee24d0021a96d4f3a11855b0745facbb5d2eb9df730", + token0Type: "0x76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1::fud::FUD", + token1Type: ADDRESSES.sui.SUI + }, ] +const ALPHAFI_BLUEFIN_TVL_IDS = [ + { //sui usdc + poolID: "0x99b9bd1d07690a658b9723509278b83715f7c4bec2bc5983316c002b597dfabd", + parentPoolID: "0x3b585786b13af1d8ea067ab37101b6513a05d2f90cfe60e8b1d9e1b46a63c4fa", + investorID: "0x863909d3ced121e06053dec3fd2cb08ecda4c54607ad1b3f4fc8c75267c8012c", + token0Type: ADDRESSES.sui.SUI, + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //usdt usdc + poolID: "0x8d9220587b2969429c517e76b3695f01cb3749849d69937c4140a6715bf14c7f", + parentPoolID: "0x0321b68a0fca8c990710d26986ba433d06b351deba9384017cd6175f20466a8f", + investorID: "0x114bf16bd3504d6f491e35152d54f5340d66d7c6abaca7689b9081cd3af0cd93", + token0Type: ADDRESSES.sui.USDT, + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //sui BUCK + poolID: "0x58c4a8c5d18c61156e1a5a82811fbf71963a4de3f5d52292504646611a308888", + parentPoolID: "0xe63329f43a9474d421be85ff270bafc04667b811d215d4d4ee2512bcf2713896", + investorID: "0xc04ef6923ae5cf047cf853d2fa809ab56dbe712ca95f87c5f3c12dcfe66f7ecd", + token0Type: ADDRESSES.sui.SUI, + token1Type: ADDRESSES.sui.BUCK + }, + { //AUSD usdc + poolID: "0x8ed765497eeedf7960af787c0c419cb2c01c471ab47682a0619e8588c06a9aa6", + parentPoolID: "0x881639630836b703aa3e04898f8a3740584859838d986619d0ee0f63a784c078", + investorID: "0x1f9f325dfb23a3516679cd7bda58c26791b2a34c40ce5e1cd88ee6f8361a0ea6", + token0Type: "0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD", + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //sui ausd + poolID: "0x89793208211927a4d1458a59d34b775aaec17af8c98a59a1ba97f7b005c0e587", + parentPoolID: "0xb30df44907da6e9f3c531563f19e6f4a203d70f26f8a33ad57881cd7781e592d", + investorID: "0x275e4df83f6f7b9dc75504d02e5d32f21ca03a5a8b017c622a8b42d3671e2888", + token0Type: ADDRESSES.sui.SUI, + token1Type: "0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD" + }, + { //alpha usdc + poolID: "0x4540c5e7de64088c0c2c30abc51f7e6bbe6bc48703667c108aa1de23f6aa40e6", + parentPoolID: "0x6595edf6d8c8b6894a5c6760843ae2fde81cb37d8586984dd1345b0f00bfecd8", + investorID: "0x187ca6f373d20465a730125c93e62a96c6a73354a1a8b35cbdd2b39278b7b141", + token0Type: "0xfe3afec26c59e874f3c1d60b8203cb3852d2bb2aa415df9548b8d688e6683f93::alpha::ALPHA", + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //wbtc usdc + poolID: "0xbc0de037958d7988710c40f4e7317f8f3ffca4fa3cc9e1c18bc1ebd7ec65cd6e", + parentPoolID: "0x38282481e3a024c50254c31ebfc4710e003fe1b219c0aa31482a860bd58c4ab0", + investorID: "0x9d14a391953d5b853fb22c4135657da341f4db3b341dd4d5f603cfb008e91745", + token0Type: ADDRESSES.sui.WBTC, + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //navx vsui + poolID: "0xf495b997ae10b8bb0996c1ee56a1cc7832daec36a9380e0932e41256d97cabad", + parentPoolID: "0xa0b4fef70ccef039b94512d6384806979d4c201c5e12af9a4b0458454b80da35", + investorID: "0x3672719d64416d0f04575b500e853d9101dfca6488f705856c59ace1999e99d1", + token0Type: "0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX", + token1Type: "0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT" + }, + { //blue sui + poolID: "0xddecab961380225c95e6a6089660de2e6028170fbc2cd07ab79b8bf45e3c2645", + parentPoolID: "0xde705d4f3ded922b729d9b923be08e1391dd4caeff8496326123934d0fb1c312", + investorID: "0x56f05fc7b81cf45b8b223de9daba1ba82bf4ce32ba0bfa46c2780d78216b2b92", + token0Type: "0xe1b45a0e641b9955a20aa0ad1c1f4ad86aad8afb07296d4085e349a50e90bdca::blue::BLUE", + token1Type: ADDRESSES.sui.SUI + }, + { //blue usdc + poolID: "0x4b28663453af487a81d4fb2ba7c96cccd63978b83f950d3dcf60dd88116e3e91", + parentPoolID: "0x3717c637003c4274f20cde8c4eeadbffa2bbf16d995a0fe0f7bf99c03cf52e61", + investorID: "0xb1a991064c4cbf1d7fb64a01ce8b2e3aa2f7d25b3ff8de7cabc1cb9ccc0fc12f", + token0Type: "0xe1b45a0e641b9955a20aa0ad1c1f4ad86aad8afb07296d4085e349a50e90bdca::blue::BLUE", + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //send usdc + poolID: "0xd5757d9f00db3f21a0fa38a86a5c1d52ae44828cc59f1798550e2ccf260b2a34", + parentPoolID: "0xbd5b29a952040ccd47ce2822bddd4aba3affaae9d6ccdaf65aded5528e39b837", + investorID: "0xa57b9da796a2848853de7478ec64db63213cb409bfdf182c8b20c7a64896cbcc", + token0Type: "0xb45fcfcc2cc07ce0702cc2d229621e046c906ef14d9b25e8e4d25f6e8763fef7::send::SEND", + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //wbtc sui + poolID: "0x31cc72ec8a332d5e0ecd65c8d5d778333e1c8432a8826a88a8c51eb4e7dc6fac", + parentPoolID: "0xe71aa89df60e737f1b687f8dfbd51e2a9b35706e9e5540ce9b053bd53fcb9ec3", + investorID: "0x68d23ee66a167e39513747a75dd4af3fd2b5728a4653566bf3e813f684cf748b", + token0Type: ADDRESSES.sui.WBTC, + token1Type: ADDRESSES.sui.SUI + }, + { //deep sui + poolID: "0x46de57bfaa096c674492c3892caa261cf34cc46a2e539ece91f0db3e46e3f6c3", + parentPoolID: "0x1b06371d74082856a1be71760cf49f6a377d050eb57afd017f203e89b09c89a2", + investorID: "0x92454fe9c315328efb29607c30f6fb7b5ec55c0a8d9944285075386e381bbca0", + token0Type: "0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP", + token1Type: ADDRESSES.sui.SUI + }, + { //stsui sui + poolID: "0xf5e643282e76af102aada38c67aae7eaec1ba2fe3301871f9fcca482893f96f2", + parentPoolID: "0x73549e0918d10727e324ebeed11ab81ab46f8fadb11078a0641f117d9097b725", + investorID: "0xe348b843a54463afe5438fa76df127b2b78bc89caa9018ba70b3c2ba043f6a1e", + token0Type: "0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI", + token1Type: ADDRESSES.sui.SUI + }, + { // stsui usdc + poolID: "0x95f0543f861584f1a3c3129c46901d5c5cc1d44e77eb57aab63eec55cd128f29", + parentPoolID: "0x151d6959cb2a6d1a5b6cfec6d1eae690af0318e46e5fb3ec45dd4e3b67eebeda", + investorID: "0x65e4af88e543e41c410f969801d53e40acb23da7be811e4c61d05a7d7d235b3b", + token0Type: "0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI", + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { // alpha stsui + poolID: "0xd601c2d1f451a1493e8d071482272a83e6dafbcdb82b249ca5b3ac909c4138f3", + parentPoolID: "0xd4051b5dc76ca354e48813268aa79de38b274878ef6a9d274066ae5a47f46cc6", + investorID: "0x959f6df092073b23c0ad0278a9cf070b6779f2edc9b7124108207b4d7b4e94ca", + token0Type: "0xfe3afec26c59e874f3c1d60b8203cb3852d2bb2aa415df9548b8d688e6683f93::alpha::ALPHA", + token1Type: "0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI" + }, + { // suiusdt usdc + poolID: "0x5b975bf7d0f0e3784a5b2db8f0a3e0b45cdcc31b39a222e680716a6ad7eba67f", + parentPoolID: "0x0bd95d012d60190a6713ae51f2d833b24ae70c5fb07fcfb41db40f25549878b1", + investorID: "0x23c073d557e4512f1811bd7c767047de13de14c59bb9607373613531250910b7", + token0Type: ADDRESSES.sui.suiUSDT, + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + +] +const ALPHAFI_BLUEFIN_AUTOBALANCE_TVL_IDS = [ + { //sui usdc + poolID: "0x1ec0aacf500624de90dd21478da12fca4726b3837e78993aee1c82f631e8364d", + parentPoolID: "0x3b585786b13af1d8ea067ab37101b6513a05d2f90cfe60e8b1d9e1b46a63c4fa", + investorID: "0xcf2a8bfaafd4b50f068826e3e4217925b4280836d8f182e3481c3725269c2a1f", + token0Type: ADDRESSES.sui.SUI, + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //usdt usdc + poolID: "0x65a167f16da65732fc71ec5b8714e5beb293e931d54820f1fea188bbcf09383d", + parentPoolID: "0x0321b68a0fca8c990710d26986ba433d06b351deba9384017cd6175f20466a8f", + investorID: "0x685c0569675bb46b838941568f1123c03eeef374dc4160c7d9b3abbc3b93f25c", + token0Type: ADDRESSES.sui.USDT, + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, + { //suiUsdt Usdc + poolID: "0x8b68333ff71fa008bb2c8bc26d5989fba51cec27393172bb6bbfdbd360489542", + parentPoolID: "0x0bd95d012d60190a6713ae51f2d833b24ae70c5fb07fcfb41db40f25549878b1", + investorID: "0x07506ea66cb73fa60dbea5177c974ca6c98d7cd8ee2fae631af6e79f139f99ec", + token0Type: ADDRESSES.sui.suiUSDT, + token1Type: ADDRESSES.sui.USDC_CIRCLE + }, +] const ALPHAFI_NAVI_TVL_IDS = [ { poolID: "0x643f84e0a33b19e2b511be46232610c6eb38e772931f582f019b8bbfb893ddb3", @@ -82,15 +301,91 @@ const ALPHAFI_NAVI_TVL_IDS = [ tokenType: ADDRESSES.sui.WETH, expo: 8 }, + { + poolID: "0x04378cf67d21b41399dc0b6653a5f73f8d3a03cc7643463e47e8d378f8b0bdfa", + tokenType: ADDRESSES.sui.USDC_CIRCLE, + expo: 6 + }, + { + poolID: "0xea3c2a2d29144bf8f22e412ca5e2954c5d3021d3259ff276e3b62424a624ad1f", + tokenType: "0x960b531667636f39e85867775f52f6b1f220a058c4de786905bdf761e06a56bb::usdy::USDY", + expo: 6 + }, + { + poolID: "0x8ebe04b51e8a272d4db107ad19cfbc184d1dafeeaab0b61c26e613b804e7777a", + tokenType: "0x2053d08c1e2bd02791056171aab0fd12bd7cd7efad2ab8f6b9c8902f14df2ff2::ausd::AUSD", + expo: 6 + }, + { + poolID: "0xc37ec956fdef6c217505e62444ab93f833c20923755d67d1c8588c9b093ae00e", + tokenType: ADDRESSES.sui.ETH, + expo: 8 + }, + { + poolID: "0x55b7ae7eb570d3d2ee89a92dd8d958794f1e39c4ee067b28655359c0a152b3aa", + tokenType: "0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS", + expo: 6 + }, + { + poolID: "0x35f7260fefe3dde7fa5b4bf1319f15554934a94c74acd4ba54161f99470c348f", + tokenType: "0xa99b8952d4f7d947ea77fe0ecdcc9e5fc0bcab2841d6e2a5aa00c3044e5544b5::navx::NAVX", + expo: 9 + }, +] +const ALPHAFI_NAVI_LOOP_TVL_IDS = [ + { //sui vsui + poolID: "0xd013a1a0c6f2bad46045e3a1ba05932b4a32f15864021d7e0178d5c2fdcc85e3", + investorID: "0x36cc3135c255632f9275a5b594145745f8344ce8f6e46d9991ffb17596195869", + tokenType: "0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT", + expo: 9 + }, + { //usdt usdc + poolID: "0xdd886dd4828a44b7ae48bb7eaceca1cecedd1dcc06174f66ee398dc0feb71451", + investorID: "0xe512e692f4d48a79abcfd5970ccb44d6f7f149e81bb077ccd58b89d4ab557d0e", + tokenType: ADDRESSES.sui.USDT, + expo: 6 + }, + { //usdc usdt + poolID: "0xb90c7250627e0113df2e60d020df477cac14ca78108e3c5968230f3e7d4d8846", + investorID: "0x3b9fe28a07e8dd5689f3762ba45dbdf10bd5f7c85a14432928d9108a61ef2dc2", + tokenType: ADDRESSES.sui.USDC_CIRCLE, + expo: 6 + }, + { //hasui sui + poolID: "0x4b22c2fc59c7697eea08c1cc1eadf231415d66b842875ba4730a8619efa38ced", + investorID: "0xa65eaadb556a80e4cb02fe35efebb2656d82d364897530f45dabc1e99d15a8a9", + tokenType: "0xbde4ba4c2e274a60ce15c1cfff9e5c42e41654ac8b6d906a57efa4bd3c29f47d::hasui::HASUI", + expo: 9 + }, +] +const ALPHAFI_BUCKET_TVL_IDS = [ + { + poolID: "0x2c5c14b9fb21f93f36cac0f363acf59ecb21f34c4c9b1a1b383f635ecdc7b507", + tokenType: ADDRESSES.sui.BUCK, + }, + ] - const ALPHAFI_POOL2_IDS = [{ poolID: "0x594f13b8f287003fd48e4264e7056e274b84709ada31e3657f00eeedc1547e37", - cetusPoolID: "0xda7347c3192a27ddac32e659c9d9cbed6f8c9d1344e605c71c8886d7b787d720", + parentPoolID: "0xda7347c3192a27ddac32e659c9d9cbed6f8c9d1344e605c71c8886d7b787d720", investorID: "0x46d901d5e1dba34103038bd2ba789b775861ea0bf4d6566afd5029cf466a3d88", token0Type: "0xfe3afec26c59e874f3c1d60b8203cb3852d2bb2aa415df9548b8d688e6683f93::alpha::ALPHA", token1Type: ADDRESSES.sui.SUI }, +{ + poolID: "0x430986b53a787362e54fa83d0ae046a984fb4285a1bc4fb1335af985f4fe019d", + parentPoolID: "0x0cbe3e6bbac59a93e4d358279dff004c98b2b8da084729fabb9831b1c9f71db6", + investorID: "0x705c560fd1f05c64e0480af05853e27e1c3d04e255cd6c5cb6921f5d1df12b5a", + token0Type: "0xfe3afec26c59e874f3c1d60b8203cb3852d2bb2aa415df9548b8d688e6683f93::alpha::ALPHA", + token1Type: ADDRESSES.sui.USDC +}, +{ + poolID: "0x4c0e42f1826170ad9283b321a7f9a453ef9f65aaa626f7d9ee5837726664ecdc", + parentPoolID: "0x29e218b46e35b4cf8eedc7478b8795d2a9bcce9c61e11101b3a039ec93305126", + investorID: "0xb43d1defd5f76ef084d68d6b56e903b54d0a3b01be8bb920ed1fa84b42c32ee1", + token0Type: "0xfe3afec26c59e874f3c1d60b8203cb3852d2bb2aa415df9548b8d688e6683f93::alpha::ALPHA", + token1Type: ADDRESSES.sui.USDC_CIRCLE +}, ] const ALPHA_POOL_ID = "0x6ee8f60226edf48772f81e5986994745dae249c2605a5b12de6602ef1b05b0c1" @@ -100,16 +395,16 @@ function asIntN(int, bits = 32) { return Number(BigInt.asIntN(bits, BigInt(int))) } -async function addPoolTVL(api, alphafiCetusPools) { - for (const { poolID, cetusPoolID, investorID, token0Type, token1Type } of alphafiCetusPools) { +async function addPoolTVL(api, alphafiDoubleAssetPools) { + for (const { poolID, parentPoolID, investorID, token0Type, token1Type } of alphafiDoubleAssetPools) { let investorObject = await sui.getObject(investorID) let poolObject = await sui.getObject(poolID) - let cetusPoolObject = await sui.getObject(cetusPoolID) + let parentPoolObject = await sui.getObject(parentPoolID) addUniV3LikePosition({ api, tickLower: asIntN(investorObject.fields.lower_tick), tickUpper: asIntN(investorObject.fields.upper_tick), - tick: asIntN(cetusPoolObject.fields.current_tick_index.fields.bits), + tick: asIntN(parentPoolObject.fields.current_tick_index.fields.bits), liquidity: poolObject.fields.tokensInvested, token0: token0Type, token1: token1Type @@ -127,9 +422,41 @@ async function addPoolTVL2(api, alphafiNaviPools){ } } +async function addPoolTVL3(api, alphafiNaviLoopPools){ + + for (const { poolID, investorID, tokenType, expo } of alphafiNaviLoopPools){ + let poolObject = await sui.getObject(poolID); + let investorObject = await sui.getObject(investorID); + let tokensInvested = poolObject.fields.tokensInvested; + + let liquidity = parseFloat(tokensInvested); + /* + in the code below, we are subtracting the debt in the pool from the liquidity, since the borrowed tokens are supplied back to the pool (as part of our strategy). + we have current_debt_to_supply_ratio in the object, so current debt in the system is (current liquidity * current_debt_to_supply_ratio). + we subtract the above derived debt from the liquidity. + current_debt_to_supply_ratio in our system is scaled by 1e20, hence the division of 1e20 in the below used expression. + */ + liquidity = liquidity*(1-(parseFloat(investorObject.fields.current_debt_to_supply_ratio)/parseFloat(1e20))); + + tokensInvested = (liquidity.toString().split('.')[0]); + + let balance = BigInt(tokensInvested)/BigInt(Math.pow(10, 9-expo)); + api.add(tokenType, balance); + } +} + +async function addPoolTVL4(api, alphafiBucketPools){ + + for (const { poolID, tokenType } of alphafiBucketPools){ + let poolObject = await sui.getObject(poolID); + let tokensInvested = poolObject.fields.tokensInvested; + api.add(tokenType, tokensInvested); + } +} + async function tvl(api) { - await Promise.all([addPoolTVL(api, ALPHAFI_CETUS_TVL_IDS), addPoolTVL2(api, ALPHAFI_NAVI_TVL_IDS)]) + await Promise.all([addPoolTVL(api, ALPHAFI_CETUS_TVL_IDS), addPoolTVL2(api, ALPHAFI_NAVI_TVL_IDS), addPoolTVL3(api, ALPHAFI_NAVI_LOOP_TVL_IDS), addPoolTVL4(api, ALPHAFI_BUCKET_TVL_IDS), addPoolTVL(api, ALPHAFI_BLUEFIN_TVL_IDS), addPoolTVL(api, ALPHAFI_BLUEFIN_AUTOBALANCE_TVL_IDS)]); } async function pool2(api) { @@ -141,7 +468,7 @@ async function pool2(api) { async function staking(api) { let alphaPoolObject = await sui.getObject(ALPHA_POOL_ID) - api.addToken(ALPHA_COIN_TYPE, Number(alphaPoolObject.fields.alpha_bal)) + api.addToken(ALPHA_COIN_TYPE, BigInt(alphaPoolObject.fields.alpha_bal)) } module.exports = { diff --git a/projects/alternity/index.js b/projects/alternity/index.js index b5aba4a541..64a009c6c5 100644 --- a/projects/alternity/index.js +++ b/projects/alternity/index.js @@ -6,7 +6,7 @@ const STAKING_ADDRESS = "0x424891f1D6D4De5c07B6E3F74B3709D6BD9E77ea"; const ALTR_ADDRESS = "0xD1ffCacFc630CE68d3cd3369F5db829a3ed01fE2" module.exports = { - start: 1692423851, + start: '2023-08-19', ethereum: { tvl: getLiquityTvl('0x51c014510A5AdA43408b40D49eF52094014ef3A7'), staking: staking(STAKING_ADDRESS, ALTR_ADDRESS) diff --git a/projects/altr-lend/index.js b/projects/altr-lend/index.js index 6ae0ea96e5..83c24a523d 100644 --- a/projects/altr-lend/index.js +++ b/projects/altr-lend/index.js @@ -17,7 +17,7 @@ async function borrowed(api) { module.exports = { methodology: "Determined by querying from our public TheGraph the total USD value of all active loans", - start: 1707874007, + start: '2024-02-14', polygon: { tvl: () => ({}), borrowed, diff --git a/projects/ambient-finance/index.js b/projects/ambient-finance/index.js index 4739b3da09..c7f61e7190 100644 --- a/projects/ambient-finance/index.js +++ b/projects/ambient-finance/index.js @@ -7,16 +7,19 @@ const vault = { scroll: "0xaaaaAAAACB71BF2C8CaE522EA5fa455571A74106", blast: "0xaAaaaAAAFfe404EE9433EEf0094b6382D81fb958", ethereum: "0xAaAaAAAaA24eEeb8d57D431224f73832bC34f688", - canto: "0x9290c893ce949fe13ef3355660d07de0fb793618" + canto: "0x9290c893ce949fe13ef3355660d07de0fb793618", + swellchain: "0xaAAaAaaa82812F0a1f274016514ba2cA933bF24D", } const subgraphs = { scroll: 'https://ambindexer.net/scroll-gcgo/pool_list?chainId=0x82750', blast: 'https://ambindexer.net/blast-gcgo/pool_list?chainId=0x13e31', canto: "https://ambient-graphcache.fly.dev/gcgo/pool_list?chainId=0x1e14", - ethereum: sdk.graph.modifyEndpoint('DyHaLYK1keqcv3YD3VczKGYvxQGfGgV6bGTbZLMj5xME') + ethereum: sdk.graph.modifyEndpoint('DyHaLYK1keqcv3YD3VczKGYvxQGfGgV6bGTbZLMj5xME'), + swellchain: 'https://ambindexer.net/swell-gcgo/pool_list?chainId=0x783', } + async function tvl(api) { let pools if (subgraphs[api.chain].includes("gcgo")) { diff --git a/projects/amped/index.js b/projects/amped/index.js index 04f69f4f22..36ac7c82bb 100644 --- a/projects/amped/index.js +++ b/projects/amped/index.js @@ -6,7 +6,7 @@ const phoenixStakingAddress = '0x3c9586567a429BA0467Bc63FD38ea71bB6B912E0'; const phoenixAmpAddress = '0xca7F14F14d975bEFfEe190Cd3cD232a3a988Ab9C'; module.exports = { - start: 1717674114, + start: '2024-06-06', lightlink_phoenix: { staking: staking(phoenixStakingAddress, phoenixAmpAddress), tvl: gmxExports({ vault: phoenixVaultAddress, }) diff --git a/projects/amphor/index.js b/projects/amphor/index.js index 878b3c5968..df15db22ae 100644 --- a/projects/amphor/index.js +++ b/projects/amphor/index.js @@ -48,4 +48,5 @@ module.exports.hallmarks = [ [1710115200, 'Beta test closing'], [1712361600, 'ETH Boosted Vault Release'], [1718927999, 'Symbiotic LRT Vault Release'], + [1734454404, 'Migration to InceptionLRT'], ]; diff --git a/projects/ampleswap/index.js b/projects/ampleswap/index.js index 77bd25892b..085021d75d 100644 --- a/projects/ampleswap/index.js +++ b/projects/ampleswap/index.js @@ -12,5 +12,6 @@ module.exports = { staking: staking(MasterChefContract, AMPLE), }, alv: { tvl: getUniTVL({ factory: '0x01dC97C89DF7d3C616a696dD53F600aB3FF12983', useDefaultCoreAssets: true }), }, - dsc: { tvl: getUniTVL({ factory: '0x232Ba9f3B3643ab28d28ED7ee18600708D60E5fe', useDefaultCoreAssets: true, }), }, + dsc: { tvl: () => ({}) } + // dsc: { tvl: getUniTVL({ factory: '0x232Ba9f3B3643ab28d28ED7ee18600708D60E5fe', useDefaultCoreAssets: true, }), }, }; diff --git a/projects/amply-finance/index.js b/projects/amply-finance/index.js new file mode 100644 index 0000000000..5874c27456 --- /dev/null +++ b/projects/amply-finance/index.js @@ -0,0 +1,7 @@ +const { aaveExports } = require('../helper/aave'); +const methodologies = require('../helper/methodologies'); + +module.exports = { + methodology: methodologies.lendingMarket, + cronos_zkevm: aaveExports(undefined, undefined, undefined, ['0x47656eb2A31094b348EBF458Eccb942d471324eD'], { v3: true, }) +} \ No newline at end of file diff --git a/projects/amulet-finance/index.js b/projects/amulet-finance/index.js new file mode 100644 index 0000000000..2ff8f98074 --- /dev/null +++ b/projects/amulet-finance/index.js @@ -0,0 +1,91 @@ +const { PromisePool } = require("@supercharge/promise-pool"); +const { queryContract } = require("../helper/chain/cosmos"); + +const coinGeckIds = { + atom: "cosmos", + eth: "ethereum", + tia: "celestia", +}; + +function synthDenomToTicker(denom) { + const parts = denom.split("/"); + + if (parts.length != 3) throw new Error(`unexpected synthetic denom: ${denom}`); + + return denom.split("/").at(-1); +} + +async function getVaultStates(api, vaultSynthPairs) { + const { results, errors } = await PromisePool.for(vaultSynthPairs).process( + async ([vault, synthTicker]) => { + const state = await queryContract({ + contract: vault, + chain: api.chain, + data: { state: {} }, + }); + + return { vault, synthTicker, totalDeposits: state.total_deposits }; + }, + ); + + if (errors && errors.length) throw errors[0]; + + return results; +} + +function getTvl({ hub, mint }) { + return async (api) => { + const listVaultsPromise = queryContract({ + contract: hub, + chain: api.chain, + data: { list_vaults: {} }, + }); + + const allAssetsPromise = queryContract({ + contract: mint, + chain: api.chain, + data: { all_assets: {} }, + }); + + let [listVaultsRes, allAssetsRes] = await Promise.all([listVaultsPromise, allAssetsPromise]); + + // synthTicker => { underlyingTicker, decimals } + const assets = Object.fromEntries( + allAssetsRes.assets.map((asset) => [ + asset.ticker, + { underlyingTicker: asset.ticker.slice(2), decimals: asset.decimals }, + ]), + ); + + // [ [vaultAddress, synthTicker ] ] + const vaultSynthPairs = listVaultsRes.vaults.map((metadata) => [ + metadata.vault, + synthDenomToTicker(metadata.synthetic), + ]); + + // [{ vault, synthTicker, totalDeposits }] + const vaults = await getVaultStates(api, vaultSynthPairs); + + for (const v of vaults) { + const asset = assets[v.synthTicker]; + + const balance = Number(v.totalDeposits) / Math.pow(10, asset.decimals); + + const coinGeckoId = coinGeckIds[asset.underlyingTicker]; + + // ignore vaults with assets that don't have a CG mapping + if (!coinGeckoId) continue; + + api.addCGToken(coinGeckoId, balance); + } + }; +} + +module.exports = { + neutron: { + tvl: getTvl({ + hub: "neutron16d4a7q3wfkkawj4jwyzz6g97xtmj0crkyn06ev74fu4xsgkwnreswzfpcy", + mint: "neutron1shwxlkpdjd8h5wdtrykypwd2v62z5glr95yp0etdcspkkjwm5meq82ndxs", + }), + }, +}; diff --git a/projects/amun/index.js b/projects/amun/index.js index ed95afa5c1..8268809ca3 100644 --- a/projects/amun/index.js +++ b/projects/amun/index.js @@ -5,6 +5,7 @@ async function tvl(api) { } module.exports = { + deadFrom: '2023-03-22', timetravel: false, ethereum: { tvl: () => ({}), }, polygon: { tvl: () => ({}), }, diff --git a/projects/amyfinance/index.js b/projects/amyfinance/index.js index a3d082e495..b8d2e5fdb8 100644 --- a/projects/amyfinance/index.js +++ b/projects/amyfinance/index.js @@ -1,16 +1,16 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensAndLPsSharedOwners } = require('../helper/unwrapLPs'); +const { sumTokensExport } = require('../helper/unwrapLPs'); const tokens = [ - [ADDRESSES.arbitrum.USDC, false], //USDC - [ADDRESSES.arbitrum.USDT, false], //USDT - [ADDRESSES.optimism.DAI, false], //DAI - [ADDRESSES.arbitrum.WBTC, false], //WBTC - [ADDRESSES.arbitrum.WETH, false], //WETH - ["0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0", false], //UNI - [ADDRESSES.arbitrum.LINK, false], //LINK - [ADDRESSES.arbitrum.MIM, false], //MIM - ["0xd4d42F0b6DEF4CE0383636770eF773390d85c61A", false], //SUSHI + ADDRESSES.arbitrum.USDC, + ADDRESSES.arbitrum.USDT, + ADDRESSES.optimism.DAI, + ADDRESSES.arbitrum.WBTC, + ADDRESSES.arbitrum.WETH, + "0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0", + ADDRESSES.arbitrum.LINK, + ADDRESSES.arbitrum.MIM, + "0xd4d42F0b6DEF4CE0383636770eF773390d85c61A", ]; const aibContracts = [ "0xe76a422C30B09f8d20ad5d8A9D21206835F6c692", //aibUSDC @@ -22,18 +22,9 @@ const aibContracts = [ "0x9Dd192fca6A1E7c8a3C014a35087dE3fb9Da14E5", //aibLINK "0x381F8482ee0a12202F2A3735370859f5709B12d2", //aibMIM "0x52444Aa321dfD7b24aA263Af6F7DCC26565f3629", //aibSUSHI -]; - -async function tvl(timestamp, ethBlock, {arbitrum: block}) { - let balances = {}; - const transformAdress = i => `arbitrum:${i}` - - await sumTokensAndLPsSharedOwners(balances, tokens, aibContracts, - block, "arbitrum", transformAdress); - return balances; -} +] module.exports = { - arbitrum: { tvl, }, + arbitrum: { tvl: sumTokensExport({ owners: aibContracts, tokens }), }, deadFrom: '2022-10-23' } diff --git a/projects/anedak/index.js b/projects/anedak/index.js index 493ebe635b..950d501781 100644 --- a/projects/anedak/index.js +++ b/projects/anedak/index.js @@ -116,10 +116,11 @@ async function fetch() { } module.exports = { + // deadFrom: '2024-08-30', timetravel: false, misrepresentedTokens: true, methodology: "TVL accounts for the liquidity on all Anedak AMM pools, with all values calculated in terms of KDA price.", kadena: { - tvl: fetch, + tvl: () => ({}), }, }; diff --git a/projects/anemoy-capital/index.js b/projects/anemoy-capital/index.js new file mode 100644 index 0000000000..6a7aeb34e3 --- /dev/null +++ b/projects/anemoy-capital/index.js @@ -0,0 +1,33 @@ +const sdk = require('@defillama/sdk') +const ADDRESSES = require('../helper/coreAssets.json') + +const USDC = ADDRESSES.ethereum.USDC + +const LTF = { + ethereum: '0x8c213ee79581ff4984583c6a801e5263418c4b86', + base: '0x8c213ee79581ff4984583c6a801e5263418c4b86', + celo: '0x27e8c820d05aea8824b1ac35116f63f9833b54c8', +} + +const abi = 'function vault(address asset) view returns (address)' + +const getNav = async (timestamp) => { + const chain = 'ethereum' + const ethApi = new sdk.ChainApi({ chain, timestamp }) + await ethApi.getBlock() + const vault = await ethApi.call({ target: LTF[chain], params: [USDC], abi }) + return ethApi.call({ target: vault, abi: 'uint256:pricePerShare' }) +} + +const tvl = async (api) => { + const { chain } = api + const nav = await getNav(api.timestamp) + const balance = await api.call({ target: LTF[chain], abi: 'erc20:totalSupply' }) + api.add(USDC, balance * nav / 1e6, { skipChain :true }) +} + +Object.keys(LTF).forEach((chain) => { + module.exports[chain] = { tvl } +}) + +module.exports.misrepresentedTokens = true \ No newline at end of file diff --git a/projects/ankr/index.js b/projects/ankr/index.js index edef933246..d56fa0b489 100644 --- a/projects/ankr/index.js +++ b/projects/ankr/index.js @@ -29,6 +29,12 @@ async function getAvaxTvl() { } } +async function getFlowTvl() { + return { + 'flow': await getTvls("flowevm", "totalStaked"), + } +} + async function polkadot() { return { polkadot: await getTvls("dot", "totalStaked"), @@ -91,6 +97,9 @@ module.exports = { fantom: { tvl: getFantomTvl, }, + flow: { + tvl: getFlowTvl, + }, polkadot: { tvl: polkadot, }, diff --git a/projects/annex.js b/projects/annex.js index 140683c71b..bf06194e1b 100644 --- a/projects/annex.js +++ b/projects/annex.js @@ -4,7 +4,7 @@ const { compoundExports } = require('./helper/compound') const wBNB = ADDRESSES.bsc.WBNB; const cBNB = "0xC5a83aD9f3586e143D2C718E8999206887eF9dDc"; -const wCRO = "0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23"; +const wCRO = ADDRESSES.cronos.WCRO_1; const cCRO = "0x61FCA31c51aCc4CC683291Be936E6799AeAAFe41"; const wKAVA = ADDRESSES.kava.WKAVA; @@ -12,7 +12,7 @@ const cKAVA = "0x5642Aa2fC7028a203C689Bf21c1a92861D8C449B"; module.exports = { methodology: 'TVL is comprised of tokens deposited to the protocol as collateral, similar to Compound Finance and other lending protocols the borrowed tokens are not counted as TVL. Data is pull from the Annex API "https://api.annex.finance/api/v1/governance/annex".', - bsc: compoundExports("0xb13026db8aafa2fd6d23355533dccccbd4442f4c", "bsc", cBNB, wBNB,), - cronos: compoundExports("0xbC1f72e751DE303Ff545D2E348fef2E84D493645", "cronos", cCRO, wCRO,), - kava: compoundExports("0xFb6FE7d66E55831b7e108B77D11b8e4d479c2986", "kava", cKAVA, wKAVA,), + bsc: compoundExports("0xb13026db8aafa2fd6d23355533dccccbd4442f4c", cBNB,), + cronos: compoundExports("0xbC1f72e751DE303Ff545D2E348fef2E84D493645", cCRO,), + kava: compoundExports("0xFb6FE7d66E55831b7e108B77D11b8e4d479c2986", cKAVA,), }; // node test.js projects/annex.js \ No newline at end of file diff --git a/projects/ante/index.js b/projects/ante/index.js index 27f4b2a483..ef79007b87 100644 --- a/projects/ante/index.js +++ b/projects/ante/index.js @@ -1,5 +1,4 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk'); const { sumTokens2, nullAddress } = require('../helper/unwrapLPs'); const { createIncrementArray } = require('../helper/utils'); @@ -95,60 +94,37 @@ const CONFIG = { }; Object.keys(CONFIG).forEach((chain) => { - const { startBlock, factories } = CONFIG[chain]; + const { factories } = CONFIG[chain]; module.exports[chain] = { - tvl: async (_, _b, { [chain]: block }) => { - let calls, currentRes; + tvl: async (api) => { + let currentRes; const pools = []; - let tokens = []; + let tokens = [nullAddress]; let i = 0; - const length = 4; + const length = 10 for (const factory of factories) { if (factory.version >= '0.6') { - const controller = await sdk.api.abi.call({ - target: factory.factory, - abi: abis.getController, - chain, - block, - }); - const allowedTokens = await sdk.api.abi.call({ - target: controller.output, - abi: abis.getAllowedTokens, - chain, - block, - }); - - tokens = [...new Set([...tokens, ...allowedTokens.output])]; + const controller = await api.call({ target: factory.factory, abi: abis.getController, }); + const allowedTokens = await api.call({ target: controller, abi: abis.getAllowedTokens, }); + tokens.push(...allowedTokens); } do { - calls = createIncrementArray(4).map((j) => ({ - params: j + i * length, - })); - const { output: res } = await sdk.api.abi.multiCall({ + const calls = createIncrementArray(length).map((j) => ({ params: j + i * length, })); + const res = await api.multiCall({ target: factory.factory, abi: abis.allPools, calls, - chain, - block, permitFailure: true, }); - currentRes = res.map((i) => i.output).filter((i) => i); - + currentRes = res.filter((i) => i) pools.push(...currentRes); - i++; } while (currentRes.length === length); } - return sumTokens2({ - tokens: [nullAddress, ...tokens], - owners: pools, - chain, - block, - }); + return sumTokens2({ tokens, owners: pools, api }); }, - start: startBlock, }; }); diff --git a/projects/antihero-fi/index.js b/projects/antihero-fi/index.js index 1973a1222c..6547afa834 100644 --- a/projects/antihero-fi/index.js +++ b/projects/antihero-fi/index.js @@ -7,7 +7,7 @@ module.exports = { methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", arbitrum: { - ...compoundExports(unitroller, "arbitrum"), + ...compoundExports(unitroller), staking: staking( [ "0x2117E6449b3C50B70705bF1566383b1a94bd5192", @@ -15,4 +15,7 @@ module.exports = { "0x9d15bb4351E95A3FE213E48B410BA1aB7CF8Ce45" ), }, -}; \ No newline at end of file + deadFrom: "2023-08-27" +}; + +module.exports.arbitrum.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/anyhedge/index.js b/projects/anyhedge/index.js index a53a8e2d9c..f2673e2d0e 100644 --- a/projects/anyhedge/index.js +++ b/projects/anyhedge/index.js @@ -23,15 +23,15 @@ async function tvl({timestamp}) { // tvl data lags by contract duration since contracts are secret until settled // so tvl at current time will always be 0, and only later when contracts are revealed // can it be calculated in retrospect and stats back-filled - // for this reason, we cut-off the data at (today-31d) - const lastTimestamp = Math.floor(new Date().getTime() / 1000 - 31*86400); + // for this reason, we cut-off the data at (today-91d) + const lastTimestamp = Math.floor(new Date().getTime() / 1000 - 91*86400); if (timestamp > lastTimestamp) throw "Data for the date is incomplete, awaiting contract reveals." tvlAnyHedge = await getTVLAnyHedge(timestamp) - testDataSource = await getTVLAnyHedge(timestamp + 31*86400) + testDataSource = await getTVLAnyHedge(timestamp + 91*86400) - // if we're querying data for `timestamp`, a row for `timestamp+31d` should exist + // if we're querying data for `timestamp`, a row for `timestamp+91d` should exist if (testDataSource == null) throw "Data source hasn't been updated yet." @@ -47,20 +47,13 @@ async function tvl({timestamp}) { } module.exports = { - methodology: "Scrape the blockchain and filter for spent transaction outputs that match the contract's input script template. Aggregate them to compute TVL. The TVL data lags by contract duration since contracts are secret until settled. So, TVL at the current time will always be 0 and can only be calculated in retrospect and stats back-filled when contracts are revealed. For this reason, the code cuts-off the data at 31 days ago. See here for more details: https://gitlab.com/0353F40E/anyhedge-stats/-/blob/master/readme.md", - start: 1654787405, + methodology: "Scrape the blockchain and filter for spent transaction outputs that match the contract's input script template. Aggregate them to compute TVL. The TVL data lags by contract duration since contracts are secret until settled. So, TVL at the current time will always be 0 and can only be calculated in retrospect and stats back-filled when contracts are revealed. For this reason, the code cuts-off the data at 91 days ago. See here for more details: https://gitlab.com/0353F40E/anyhedge-stats/-/blob/master/readme.md", + start: '2022-06-09', bitcoincash: { tvl }, hallmarks: [ - [1654787405, "First AnyHedge v0.11 Contract"], - [1663106400, "AnyHedge Alpha is live and available"], - [1666585080, "The BCH Bull (Beta) goes live"], - [1666785960, "Paytaca wallet's product live"], - [1680356040, "BCH Bull trials P2P contracts"], - [1681725240, "BCH Bull is released"], - [1683634380, "BCH Bull adds Achievements"], - [1686651480, "BCH Bull raise max contract to $100k"], - [1687330080, "BCH Bull raise max leverage to 7.77x"], - [1703054100, "BCH Bull enables Early Settlements"], + [1681725240, "BCH Bull public release (AnyHedge v0.11 contract)"], + [1703054100, "BCH Bull enables early settlement feture"], + [1720612800, "BCH Bull enables leveraged shorting feature (AnyHedge v0.12 contract)"] ] }; diff --git a/projects/aof-stake-mining/index.js b/projects/aof-stake-mining/index.js new file mode 100644 index 0000000000..5f58b7ccb5 --- /dev/null +++ b/projects/aof-stake-mining/index.js @@ -0,0 +1,11 @@ +const { treasuryExports } = require("../helper/treasury"); +const { nullAddress } = require('../helper/tokenMapping'); + +module.exports = treasuryExports({ + metis: { + owners: ['0x946D86422775E7B32F3F8f0580504EADccF9b800'], + tokens: [ + nullAddress, + ], + }, + }) \ No newline at end of file diff --git a/projects/ape-express/index.js b/projects/ape-express/index.js new file mode 100644 index 0000000000..ad907f925c --- /dev/null +++ b/projects/ape-express/index.js @@ -0,0 +1,30 @@ +const { getLogs } = require('../helper/cache/getLogs'); +const { sumTokens2 } = require('../helper/unwrapLPs'); +const { nullAddress } = require('../helper/tokenMapping'); + +const configs = [ + { factory: "0xCd7a0227Bc48b1c14C5a1A6a4851010f80943476", fromBlock: 63905 }, + { factory: "0xBcace40e446b06E6A530D945eFbae222f84fA836", fromBlock: 3633933 } +] + +const tvl = async (api) => { + const logs = [] + for (const { factory, fromBlock } of configs) { + logs.push(await getLogs({ + api, + target: factory, + topics: ['0x8409923236a093dc9b93970d1428b15e2c21c325f3480269492056cdd1134023'], + eventAbi: 'event TokenCreated (address indexed token, address indexed bondingCurve, address indexed creator, string name, string symbol, address router, uint256 initialVirtualAPE, uint256 finalVirtualAPE, uint8 tradeFeePercent, uint8 apxSuccessFee, uint8 creatorSuccessFee)', + onlyArgs: true, + fromBlock, + })) + } + let pools = logs.flat().map(log => log.bondingCurve) + return sumTokens2({ api, owners: pools, token: nullAddress }) +} + +module.exports = { + apechain: { + tvl, + } +} \ No newline at end of file diff --git a/projects/ape-fi/index.js b/projects/ape-fi/index.js index b2ff6182dd..bbfdaf4734 100644 --- a/projects/ape-fi/index.js +++ b/projects/ape-fi/index.js @@ -1,6 +1,5 @@ -const sdk = require("@defillama/sdk"); -const { default: BigNumber } = require("bignumber.js"); -const { sumTokens2, sumTokensExport } = require("../helper/unwrapLPs"); +const { sumTokensExport } = require("../helper/unwrapLPs"); +const { staking } = require("../helper/staking"); const APE = "0x4d224452801ACEd8B2F0aebE155379bb5D594381"; const crvFRAX = "0x3175Df0976dFA876431C2E9eE6Bc45b65d3473CC"; @@ -12,31 +11,10 @@ const fraxStakingWrapper = "0x6a20FC1654A2167d00614332A5aFbB7EBcD9d414"; const apeAPE = "0xcaB90816f91CC25b04251857ED6002891Eb0D6Fa"; -const tvl = async (timestamp, block) => { - const toa = [ - [APE, apeAPE], - ] +const tvl = async (api) => { + const apeUSDCrvFraxTotalSupply = await api.call({ abi: 'erc20:totalSupply', target: apeUSDCrvFrax }) - const balances = await sumTokens2({ block, tokensAndOwners: toa }) - - const { - output: [ - { output: apeUSDCrvFraxTotalSupply }, - ] - } = await sdk.api.abi.multiCall({ - calls: [apeUSDCrvFrax].map((target) => ({ target })), - abi: "erc20:totalSupply", - block, - }); - - const { - output: [ - { output: amoV2LPBalance }, - { output: multisigLPBalance }, - { output: stakedLPBalance }, - { output: crvFraxBalance }, - ] - } = await sdk.api.abi.multiCall({ + const [amoV2LPBalance, multisigLPBalance, stakedLPBalance, crvFraxBalance,] = await api.multiCall({ calls: [ { target: convexRewardPool, params: amoV2, }, { target: convexRewardPool, params: multisig, }, @@ -44,13 +22,10 @@ const tvl = async (timestamp, block) => { { target: crvFRAX, params: apeUSDCrvFrax, }, ], abi: "erc20:balanceOf", - block: block, }); - const apeUSDCrvFraxShare = BigNumber((+stakedLPBalance + +multisigLPBalance + +amoV2LPBalance) /apeUSDCrvFraxTotalSupply ).toFixed(0) - const crvFraxShare = BigNumber(crvFraxBalance * apeUSDCrvFraxShare).toFixed(0) - sdk.util.sumSingleBalance(balances, crvFRAX, crvFraxShare) - return balances + const apeUSDCrvFraxShare = (+stakedLPBalance + +multisigLPBalance + +amoV2LPBalance) / apeUSDCrvFraxTotalSupply + api.add(crvFRAX, crvFraxBalance * apeUSDCrvFraxShare) }; module.exports = { @@ -61,11 +36,12 @@ module.exports = { ['0xfb7a3798c6fff187c8cf08c0b1322b52cfa70ace', '0xbcc28F6BA03642B9B5a3E7ad5C8f27991576796c'], // uni v2 ['0x84ab278a8140a8a9759de17895a8da8d756618f3', '0x0a2c0a2033eccc7cc57e42901f04b96972131579'], // uni v2 ['0x04b727C7e246CA70d496ecF52E6b6280f3c8077D', '0x0C63197017970596044f80778282BB5B2208f018'], // curve - ] + ], + resolveLP: true, }), tvl, + staking: staking(apeAPE, APE), }, - start: 15688276, methodology: "Counts liquidity as the Collateral APE and USDC & FRAX on all AMOs through their contracts", }; diff --git a/projects/apechain/index.js b/projects/apechain/index.js new file mode 100644 index 0000000000..b456cd56c7 --- /dev/null +++ b/projects/apechain/index.js @@ -0,0 +1,15 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs'); +const { staking } = require('../helper/staking') + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + tokensAndOwners: [ + [ADDRESSES.ethereum.WSTETH, '0xc8a12b1DB09ec5a43919906d94Fa7eeAef1131D1'], // wstETH + [ADDRESSES.ethereum.SDAI, '0xf33D21137cD0B878f3A18Cc60cD74F842c59cb00'], // sDAI + ] + }), + staking: staking('0x5954aB967Bc958940b7EB73ee84797Dc8a2AFbb9', '0x4d224452801ACEd8B2F0aebE155379bb5D594381') + }, +}; \ No newline at end of file diff --git a/projects/aperocket/abi.json b/projects/aperocket/abi.json deleted file mode 100644 index 8f90529e6e..0000000000 --- a/projects/aperocket/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "tvlOfPool": "function tvlOfPool(address vault) view returns (uint256)", - "tvlOfVault": "function tvlOfVault(address _vault, bool isLp, address tokenRouter) view returns (uint256)" -} \ No newline at end of file diff --git a/projects/aperocket/index.js b/projects/aperocket/index.js index d73d0b39ed..c53df55b26 100644 --- a/projects/aperocket/index.js +++ b/projects/aperocket/index.js @@ -1,12 +1,5 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); - -/* Certain portion of TVL accounted by their site is coming from their own native token - * in differente blockchains (i.e, bsc and polygon). Aprox $6.0M - */ - -const V2_READER = "0xDc84cbf85ADA13ACAe796FAa4472C19cC901b042" -const MERCURY_READER = "0xc9e54c7ec73aEe86e2BB07c4c6B65BE8BD86Ca90" +const { staking } = require("../helper/staking"); +const { sumTokens2 } = require("../helper/unwrapLPs"); const V2_VAULTS_CONTRACTS_BSC = [ "0xa13eF34F11cD905A1aACe891e3Fd1b355D770e7F", // BANANA @@ -38,54 +31,17 @@ const V2_VAULTS_CONTRACTS_BSC = [ "0x1AFB491895D301a7cea026a5c65316b2C05A56B4", // ETH-BTCB LP Maximizer (Biswap) ]; -const MERCURY_SINGLE_VAULTS_CONTRACTS_BSC = [ - { - address: "0xFfDcD49d902d71445B93DCbFa51E2F9797de05C9", // BANANA - isLp: false, - router: "0xcF0feBd3f17CEf5b47b0cD257aCf6025c5BFf3b7", - }, -]; - -const bscTvl = async (timestamp, block, chainBlocks) => { - block = chainBlocks.bsc - const getV2Tvls = ( - await sdk.api.abi.multiCall({ - abi: abi.tvlOfPool, - calls: V2_VAULTS_CONTRACTS_BSC.map((vcb) => ({ - target: V2_READER, - params: [vcb], - })), - block, - chain: "bsc", - }) - ).output.map((tvl) => tvl.output); - - const v2Tvl = getV2Tvls.reduce((previousValue, currentValue) => Number(previousValue) + Number(currentValue)) - - const getMercuryTvls = ( - await sdk.api.abi.multiCall({ - abi: abi.tvlOfVault, - calls: MERCURY_SINGLE_VAULTS_CONTRACTS_BSC.map((vcb) => ({ - target: MERCURY_READER, - params: [vcb.address, vcb.isLp, vcb.router], - })), - block, - chain: "bsc", - }) - ).output.map((tvl) => tvl.output); - - const mercuryTvl = getMercuryTvls.reduce((previousValue, currentValue) => Number(previousValue) + Number(currentValue)) - - const totalTvl = (v2Tvl / 10 ** 18) + (mercuryTvl / 10 ** 18) - - return { - 'tether': totalTvl, - }; +const bscTvl = async (api) => { + const tokens = await api.multiCall({ abi: 'address:STAKING_TOKEN', calls: V2_VAULTS_CONTRACTS_BSC}) + const bals = await api.multiCall({ abi: 'uint256:balance', calls: V2_VAULTS_CONTRACTS_BSC}) + api.add(tokens, bals) + return sumTokens2({ api, resolveLP: true}) }; module.exports = { bsc: { tvl: bscTvl, + staking: staking("0xFfDcD49d902d71445B93DCbFa51E2F9797de05C9", "0x603c7f932ED1fc6575303D8Fb018fDCBb0f39a95"), }, methodology: `TVL consists of deposits made to the Earn Vaults of ApeRocket minus the 'SPACE' vault and the 'SPACE-BNB' pool2 vault which are created using the protocol's native token.`, misrepresentedTokens: true, diff --git a/projects/aperture/abi.json b/projects/aperture/abi.json deleted file mode 100644 index 1406ebe36a..0000000000 --- a/projects/aperture/abi.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "getStrategyId": "uint64:nextStrategyId", - "getLeverage": "uint256:leverageLevel", - "getEquityETHValue": "uint256:getEquityETHValue", - "getETHPx": "function getETHPx(address oracle, address token) view returns (uint256)" -} \ No newline at end of file diff --git a/projects/aperture/getVaults.js b/projects/aperture/getVaults.js deleted file mode 100644 index dc2a35f748..0000000000 --- a/projects/aperture/getVaults.js +++ /dev/null @@ -1,28 +0,0 @@ -const sdk = require('@defillama/sdk') -const abi = require("./abi.json"); -const { getParamCalls, getUniqueAddresses } = require('../helper/utils') - -const APERTURE_MANAGER_ADDRESS = "0xeD380115259FcC9088c187Be1279678e23a6E565"; - -const abis = { - strategyIdToMetadata: "function strategyIdToMetadata(uint64 arg0) view returns (string, string, address)", -} - -async function getVaults(chain, block) { - const { output: nextStrategyId } = await sdk.api.abi.call({ - target: APERTURE_MANAGER_ADDRESS, - abi: abi.getStrategyId, - chain, block, - }) - const { output: vaults } = await sdk.api.abi.multiCall({ - target: APERTURE_MANAGER_ADDRESS, - abi: abis.strategyIdToMetadata, - calls: getParamCalls(nextStrategyId), - chain, block, - }) - return getUniqueAddresses(vaults.map(i => i.output[2])); -} - -module.exports = { - getVaults, -}; diff --git a/projects/aperture/index.js b/projects/aperture/index.js index d7f269fc48..2edccc060a 100644 --- a/projects/aperture/index.js +++ b/projects/aperture/index.js @@ -1,45 +1,21 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); -const { default: BigNumber } = require("bignumber.js"); -const { getVaults } = require("./getVaults.js"); +const APERTURE_MANAGER_ADDRESS = "0xeD380115259FcC9088c187Be1279678e23a6E565"; -async function avax_tvl(timestamp, _, { avax: block }) { - const chain = "avax"; - const vaultContracts = await getVaults(chain, block); - const calls = vaultContracts.map((i) => ({ target: i })); - const equityETHValues = ( - await sdk.api.abi.multiCall({ - abi: abi.getEquityETHValue, - calls, - chain, - block, - }) - ).output; - - const vaultLeverage = ( - await sdk.api.abi.multiCall({ - abi: abi.getLeverage, - calls, - chain, - block, - }) - ).output; - - let balances = {}; - for (let i = 0; i < vaultContracts.length; i++) { - const bal = (vaultLeverage[i].output * equityETHValues[i].output) / 1e22; - sdk.util.sumSingleBalance( - balances, - `coingecko:avalanche-2`, - BigNumber(bal).toFixed(0) - ); - } +const abis = { + strategyIdToMetadata: "function strategyIdToMetadata(uint64 arg0) view returns (string, string, address strategy)", + "getStrategyId": "uint64:nextStrategyId", + "getLeverage": "uint256:leverageLevel", + "getEquityETHValue": "uint256:getEquityETHValue", + "getETHPx": "function getETHPx(address oracle, address token) view returns (uint256)" +} - return balances; +async function avax_tvl(api) { + const strategies = (await api.fetchList({ lengthAbi: 'nextStrategyId', itemAbi: abis.strategyIdToMetadata, target: APERTURE_MANAGER_ADDRESS, })).map(i => i.strategy) + const equityETHValues = await api.multiCall({ abi: abis.getEquityETHValue, calls: strategies }) + const vaultLeverage = await api.multiCall({ abi: abis.getLeverage, calls: strategies }) + vaultLeverage.map((v, i) => api.addCGToken(`avalanche-2`, equityETHValues[i] * v / 1e22)) } module.exports = { - timetravel: false, avax: { tvl: avax_tvl, }, diff --git a/projects/apestore/index.js b/projects/apestore/index.js index f4350642fb..419a1d1d86 100644 --- a/projects/apestore/index.js +++ b/projects/apestore/index.js @@ -9,10 +9,17 @@ const routers = [ "0x0bf8edd756ff6caf3f583d67a9fd8b237e40f58a" ]; +const routersEth = [ + "0xA7d854eAf481846f7dA8CC863a46aC1F67b548D8" +]; + const tokens = [coreAssets.null]; module.exports = { base: { tvl: sumTokensExport({ owners: routers, tokens }) }, + ethereum: { + tvl: sumTokensExport({ owners: routersEth, tokens }) + } }; \ No newline at end of file diff --git a/projects/apeswap-lending/index.js b/projects/apeswap-lending/index.js index 788cafed4b..c89796e5a8 100644 --- a/projects/apeswap-lending/index.js +++ b/projects/apeswap-lending/index.js @@ -1,21 +1,7 @@ -const {usdCompoundExports} = require('../helper/compound'); -const methodologies = require('../helper/methodologies'); - -const unitroller_bsc = "0xad48b2c9dc6709a560018c678e918253a65df86e" - -const abis = { - oracle: "address:getRegistry", - underlyingPrice: "function getPriceForUnderling(address cToken) view returns (uint256)", -} - -const lendingMarket = usdCompoundExports(unitroller_bsc, "bsc", "0x34878F6a484005AA90E7188a546Ea9E52b538F6f", abis) - +const { compoundExports2 } = require('../helper/compound') +const methodologies = require('../helper/methodologies') module.exports = { - misrepresentedTokens: true, - bsc:{ - tvl: lendingMarket.tvl, - borrowed: lendingMarket.borrowed - }, + bsc: compoundExports2({ comptroller: '0xad48b2c9dc6709a560018c678e918253a65df86e' }), methodology: methodologies.lendingMarket, } \ No newline at end of file diff --git a/projects/apex-omni/index.js b/projects/apex-omni/index.js index 5c109418ef..b17cac8f80 100644 --- a/projects/apex-omni/index.js +++ b/projects/apex-omni/index.js @@ -18,7 +18,7 @@ const walletAddresses = { const tokenAddress = { bsc: [ADDRESSES.bsc.USDT], arbitrum: [ADDRESSES.arbitrum.USDT], - base: ['0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2'], + base: [ADDRESSES.base.USDT], mantle: [ADDRESSES.mantle.USDT] } diff --git a/projects/apexdefi/index.js b/projects/apexdefi/index.js new file mode 100644 index 0000000000..1437fcac87 --- /dev/null +++ b/projects/apexdefi/index.js @@ -0,0 +1,36 @@ +const { staking } = require('../helper/staking') +const ADDRESSES = require('../helper/coreAssets.json'); + +const config = { + avax: { factory: "0x754A0c42C35562eE7a41eb824d14bc1259820f01", wrapperFactory: '0x39aB4aabAd7656f94E32ebD90547C3c4a183f4B4' }, + base: { factory: "0x10d11Eb1d5aB87E65518458F990311480b321061", wrapperFactory: '0xc9fbf1e865eeababe92d47ddb11d580f37ce4e00' }, + ethereum: { factory: "0x820c889D5749847217599B43ab86FcC91781019f", }, +} + +async function _staking(api) { + const poolInfoAbi = "function getPoolInfo(uint256 _poolId) public view returns (address _staketoken, uint256 _allocationPoints, uint256 _lastRewardTimestamp, uint256 _rewardTokenPerShare, uint256 _totalStaked, uint256 _bonusMultiplier, address _rewarder)" + + const poolInfo = await api.fetchList({ lengthAbi: 'poolLength', itemAbi: poolInfoAbi, target: '0x5995876c9C6e2C23C1C5fc902661127fF9ed38D3', }) + poolInfo.forEach(pool => api.add(pool._staketoken, pool._totalStaked)) +} + +module.exports.methodology = "The Apex DeFi factory contract address is used to obtain the balances held in each token contract as liquidity and the staking contract is used to get the staked APEX balance."; + +Object.keys(config).forEach(chain => { + const { factory, wrapperFactory, } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + // count the value of erc20 wrapped and deposited in the pools + if (wrapperFactory) { + const wrapperPools = await api.fetchList({ lengthAbi: 'allWrappersLength', itemAbi: 'allWrappers', target: wrapperFactory }) + const tokens = await api.multiCall({ abi: 'address:originalToken', calls: wrapperPools }) + await api.sumTokens({ tokensAndOwners2: [tokens, wrapperPools]}) + } + + const tokens = await api.call({ abi: 'address[]:getAllTokens', target: factory }) + return api.sumTokens({ owners: tokens, tokens: [ADDRESSES.null] }) + } + } +}) + +// module.exports.avax.staking = staking('0x5995876c9C6e2C23C1C5fc902661127fF9ed38D3','0x98B172A09102869adD73116FC92A0A60BFF4778F') \ No newline at end of file diff --git a/projects/apexswap/index.js b/projects/apexswap/index.js index d509b1c8a3..f5ef357df5 100644 --- a/projects/apexswap/index.js +++ b/projects/apexswap/index.js @@ -5,6 +5,7 @@ module.exports = { hallmarks: [ [1665532800, "Rug Pull"] ], + deadFrom: '2022-10-12', avax: { tvl: getUniTVL({ factory: '0x21cadeb92c8bbfbef98c3098846f0999209c3a97', diff --git a/projects/apollox/index.js b/projects/apollox/index.js index fc8582d632..02c7f0d8a1 100644 --- a/projects/apollox/index.js +++ b/projects/apollox/index.js @@ -65,7 +65,7 @@ async function bscTVL(timestamp, _block, { bsc: block }) { } module.exports = { - start: 1640100600, // 12/21/2021 @ 15:30pm (UTC) + start: '2021-12-21', // 12/21/2021 @ 15:30pm (UTC) bsc: { tvl: bscTVL, staking: stakings([stakingContract_APX, daoContract], TOKEN_APX), diff --git a/projects/applepie/index.js b/projects/applepie/index.js index 1cb02e6575..87493ee6e0 100644 --- a/projects/applepie/index.js +++ b/projects/applepie/index.js @@ -6,7 +6,6 @@ const TOKENS = ["0x574f75bc522CB42ec2365dc54485D471f2eFb4B6"] module.exports = { methodology: "First Crosschain Pool as a Service Miner. Twist to generate 10%/daily reward.", - start: 35011373, bsc: { tvl: sumTokensExport({ tokensAndOwners: [ diff --git a/projects/apwine/index.js b/projects/apwine/index.js index 1de189ff1a..65d76621ae 100644 --- a/projects/apwine/index.js +++ b/projects/apwine/index.js @@ -108,11 +108,14 @@ module.exports = { doublecounted: true, ethereum: { tvl: tvl_from_registry('ethereum'), - staking: staking(veAPW, APW), + //staking: staking(veAPW, APW), }, polygon: { tvl: tvl_from_registry('polygon'), pool2: pool2s([APW_WETH_cometh_staking, APW_MUST_cometh_staking], [APW_WETH_cometh, APW_MUST_cometh]) }, - methodology: `Use the registry to retrieve futureVaults, and get for each vault the IBT which is the token that this vault holds - the user locked collateral` + methodology: `Use the registry to retrieve futureVaults, and get for each vault the IBT which is the token that this vault holds - the user locked collateral`, + hallmarks: [ + [1677798000, "Announcement of V1 Retirement"] + ], } diff --git a/projects/aqua-network/index.js b/projects/aqua-network/index.js index 621f7abeac..dd62253554 100644 --- a/projects/aqua-network/index.js +++ b/projects/aqua-network/index.js @@ -9,7 +9,7 @@ async function getData() { const data = await _data const res = {} data.forEach((item) => { - res[item.date] = item.tvl / 1e8 + res[item.date] = item.tvl / 1e7 }) return res } @@ -32,9 +32,9 @@ async function tvl(api) { } module.exports = { - start: 1719792000, + start: '2024-07-01', misrepresentedTokens: true, methodology: - 'counts the liquidity of the Pools on AMM, data is pulled from the Aquarius API: "https://amm-api.aqua.network/api/external/v1/statistics/totals/".', + 'counts the liquidity of the Pools on AMM, data is pulled from the Aquarius API.', stellar: { tvl }, }; diff --git a/projects/aqua-patina/index.js b/projects/aqua-patina/index.js new file mode 100644 index 0000000000..595973de90 --- /dev/null +++ b/projects/aqua-patina/index.js @@ -0,0 +1,15 @@ +const apETH = '0xAaAaAAaBC6CBc3A1FD3a0fe0FDec43251C6562F5' + +async function tvl(api) { + const supply = await api.call({ target: apETH, abi: 'uint256:totalSupply' }) + const multiplier = await api.call({ target: apETH, abi: 'uint256:ethPerAPEth' }) + api.addGasToken(supply * multiplier / 1e18) +} + +module.exports = { + doublecounted: true, + methodology: 'Returns the ETH equivalent value of the total supply of apETH tokens on Ethereum. This is calculated by the multiplier used in the contract to determine the ETH value of each token when minting apETH.', + ethereum: { + tvl, + } +} \ No newline at end of file diff --git a/projects/aquadex-v3/index.js b/projects/aquadex-v3/index.js new file mode 100644 index 0000000000..f02bf5326b --- /dev/null +++ b/projects/aquadex-v3/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + water: { factory: '0xc8F2534FF7c88EFeacF4Fdb0E81D87c6235C3bEA', fromBlock: 1, }, +}) \ No newline at end of file diff --git a/projects/aqualoan/index.js b/projects/aqualoan/index.js new file mode 100644 index 0000000000..9ffc6fb251 --- /dev/null +++ b/projects/aqualoan/index.js @@ -0,0 +1,44 @@ +const abi = { + getReserveTokensAddresses: "function getReserveTokensAddresses(address asset) view returns (address aTokenAddress, address stableDebtTokenAddress, address variableDebtTokenAddress)", + getAllReservesTokens: "function getAllReservesTokens() view returns ((string symbol, address tokenAddress)[])", + getReserveData: "function getReserveData(address asset) view returns (uint256 unbacked, uint256 accruedToTreasuryScaled, uint256 totalAToken, uint256 totalStableDebt, uint256 totalVariableDebt, uint256 liquidityRate, uint256 variableBorrowRate, uint256 stableBorrowRate, uint256 averageStableBorrowRate, uint256 liquidityIndex, uint256 variableBorrowIndex, uint40 lastUpdateTimestamp)", +}; + +const CONFIG = { + bsc: ['0xDc33eAA50B8707f791478Cec324e451E20FDa7ed'] +}; + +const fetchReserveData = async (api, poolDatas, isBorrowed) => { + const reserveTokens = await api.multiCall({ calls: poolDatas, abi: abi.getAllReservesTokens }); + const calls = [] + + poolDatas.map((pool, i) => { + reserveTokens[i].forEach(({ tokenAddress }) => calls.push({ target: pool, params: tokenAddress })); + }); + const reserveData = await api.multiCall({ abi: isBorrowed ? abi.getReserveData : abi.getReserveTokensAddresses, calls, }) + const tokensAndOwners = [] + reserveData.forEach((data, i) => { + const token = calls[i].params + if (isBorrowed) { + api.add(token, data.totalVariableDebt) + api.add(token, data.totalStableDebt) + } else + tokensAndOwners.push([token, data.aTokenAddress]) + }) + + if (isBorrowed) return api.getBalances() + return api.sumTokens({ tokensAndOwners }) +} + +module.exports.methodology = "Counts the tokens locked in the contracts to be used as collateral to borrow or to earn yield. Borrowed coins are not counted towards the TVL, so only the coins actually locked in the contracts are counted. There's multiple reasons behind this but one of the main ones is to avoid inflating the TVL through cycled lending." + +Object.keys(CONFIG).forEach((chain) => { + const poolDatas = CONFIG[chain]; + module.exports[chain] = { + tvl: (api) => fetchReserveData(api, poolDatas), + borrowed: (api) => fetchReserveData(api, poolDatas, true), + }; +}); + +module.exports.hallmarks = [ +] diff --git a/projects/aquaprotocol/index.js b/projects/aquaprotocol/index.js new file mode 100644 index 0000000000..52e266779e --- /dev/null +++ b/projects/aquaprotocol/index.js @@ -0,0 +1,12 @@ +const { sumTokensExport } = require('../helper/sumTokens') +const ADDRESSES = require("../helper/coreAssets.json"); + +const AQUA_ADDRESS = 'EQAWDyxARSl3ol2G1RMLMwepr3v6Ter5ls3jiAlheKshgg0K' + +module.exports = { + methodology: 'Total amount of collateral locked in the Aqua Protocol (EQAWDyxARSl3ol2G1RMLMwepr3v6Ter5ls3jiAlheKshgg0K)', + start: '2024-09-16', + ton: { + tvl: sumTokensExport({ owner: AQUA_ADDRESS, tokens: [ADDRESSES.null]}), + } +} diff --git a/projects/arable-protocol/index.js b/projects/arable-protocol/index.js index 74db2b8336..02538413b2 100644 --- a/projects/arable-protocol/index.js +++ b/projects/arable-protocol/index.js @@ -1,5 +1,5 @@ const { staking } = require("../helper/staking"); -const { pool2Exports } = require("../helper/pool2"); +const { pool2 } = require("../helper/pool2"); const acre = "0x00ee200df31b869a321b10400da10b561f3ee60d"; const stakingContract = "0x4bc722Cd3F7b29ae3A5e0a17a61b72Ea5020502B"; @@ -11,6 +11,6 @@ module.exports = { avax:{ tvl: async () => ({}), staking: staking(stakingContract, acre), - pool2: pool2Exports(farming, [acrewavaxpgl], "avax") + pool2: pool2(farming, [acrewavaxpgl], "avax") } } \ No newline at end of file diff --git a/projects/arbicheems/index.js b/projects/arbicheems/index.js index b1e6962476..8ccb415a59 100644 --- a/projects/arbicheems/index.js +++ b/projects/arbicheems/index.js @@ -1,7 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { stakingUnknownPricedLP } = require("../helper/staking"); -const { pool2Exports } = require("../helper/pool2"); +const { staking } = require("../helper/staking"); +const { pool2 } = require("../helper/pool2"); +const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs'); const cheems = "0x75a2f30929C539E7d4eE033c9331b89F879c0cf7"; const stakingContract = "0xaaCcB989FE1084c6935f09aE4BBD49AfF58Bdb94"; @@ -13,50 +13,11 @@ const ethPool = "0xd495Beb0011e3DFEC0C93376f5216C1C3dD01C23"; const cheemsEthPool = "0x1382EcDf09507ba87022c79312DfAfb2A5063d73"; const cheemsEthSLP = "0xce786f1f3d3025fe4a64e37d28fa76311ff5253f"; -async function tvl(timestamp, block, chainBlocks) { - let balances = {}; - - const ethBal = ( - await sdk.api.eth.getBalance({ - target: ethPool, - block: chainBlocks.arbitrum, - chain: "arbitrum", - }) - ).output; - sdk.util.sumSingleBalance( - balances, - ADDRESSES.ethereum.WETH, - ethBal - ); - - const mimBal = ( - await sdk.api.erc20.balanceOf({ - target: mim, - owner: mimPool, - block: chainBlocks.arbitrum, - chain: "arbitrum", - }) - ).output; - sdk.util.sumSingleBalance(balances, `arbitrum:${mim}`, mimBal); - - return balances; -} - module.exports = { + deadFrom: '2022-02-22', arbitrum: { - tvl, - staking: stakingUnknownPricedLP( - stakingContract, - cheems, - "arbitrum", - cheemsEthSLP, - (addr) => `arbitrum:${addr}` - ), - pool2: pool2Exports( - cheemsEthPool, - [cheemsEthSLP], - "arbitrum", - (addr) => `arbitrum:${addr}` - ), + tvl: sumTokensExport({ tokensAndOwners: [[nullAddress, ethPool], [mim, mimPool]] }), + staking: staking(stakingContract, cheems,), + pool2: pool2(cheemsEthPool, [cheemsEthSLP],), }, }; diff --git a/projects/arbinyan/index.js b/projects/arbinyan/index.js index 57b4c5a468..f8a6bd5f6f 100644 --- a/projects/arbinyan/index.js +++ b/projects/arbinyan/index.js @@ -1,83 +1,21 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); +const { pool2 } = require("../helper/pool2"); const { staking } = require("../helper/staking"); -const BigNumber = require("bignumber.js"); +const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs'); const stakingETHContract = "0x9F7968de728aC7A6769141F63dCA03FD8b03A76F"; -const WETH = ADDRESSES.ethereum.WETH; const stakingNYANContract = "0x32e5594F14de658b0d577D6560fA0d9C6F1aa724"; const NYAN = "0xed3fb761414da74b74f33e5c5a1f78104b188dfc"; const stakingPool2Contract = "0x62FF5Be795262999fc1EbaC29277575031d2dA2C"; -const NYAN_WETH_SLP = "0x70Df9Dd83be2a9F9Fcc58Dd7C00d032d007b7859"; -const WETH_arb = ADDRESSES.arbitrum.WETH; - -async function pool2(time, ethBlock, chainBlocks) { - const balances = {}; - - const balance_slp = ( - await sdk.api.abi.call({ - abi: 'erc20:balanceOf', - target: NYAN_WETH_SLP, - params: stakingPool2Contract, - chain: "arbitrum", - block: chainBlocks["arbitrum"], - }) - ).output; - - const totalSupply_slp = ( - await sdk.api.erc20.totalSupply({ - target: NYAN_WETH_SLP, - chain: "arbitrum", - block: chainBlocks["arbitrum"], - }) - ).output; - - const underlyingsBalance = ( - await sdk.api.abi.multiCall({ - calls: [NYAN, WETH_arb].map((token) => ({ - target: token, - params: NYAN_WETH_SLP, - })), - abi: 'erc20:balanceOf', - chain: "arbitrum", - block: chainBlocks["arbitrum"], - }) - ).output; - - underlyingsBalance.forEach((call) => { - const underlyingSetBalance = BigNumber(call.output) - .times(balance_slp) - .div(totalSupply_slp); - - sdk.util.sumSingleBalance( - balances, - `arbitrum:${call.input.target}`, - underlyingSetBalance.toFixed(0) - ); - }); - - return balances; -} - -async function arbTvl(time, _ethBlock, {arbitrum: block}) { - const eth = await sdk.api.eth.getBalance({ - target: stakingETHContract, - block, - chain: "arbitrum", - }); - return { - [WETH]: eth.output, - }; -} +const NYAN_WETH_SLP = "0x70df9dd83be2a9f9fcc58dd7c00d032d007b7859"; module.exports = { misrepresentedTokens: true, arbitrum: { staking: staking(stakingNYANContract, NYAN), - pool2: pool2, - tvl: arbTvl, + pool2: pool2(stakingPool2Contract, NYAN_WETH_SLP), + tvl: sumTokensExport({ owner: stakingETHContract, tokens: [nullAddress] }), }, methodology: "Counts as TVL the ETH asset deposited through StakingETH Contract, and we count Staking and Pool2 parts in the same way", diff --git a/projects/arbirise-finance/abis/arbiStakerERC20.json b/projects/arbirise-finance/abis/arbiStakerERC20.json deleted file mode 100644 index c9224c60fa..0000000000 --- a/projects/arbirise-finance/abis/arbiStakerERC20.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "stakedTokenTotal": "function stakedTokenTotal(address) view returns (uint256)", - "getNumTokensStaked": "uint256:getNumTokensStaked", - "getTokenStakedAt": "function getTokenStakedAt(uint256 index) view returns (address token)" -} \ No newline at end of file diff --git a/projects/arbirise-finance/contracts.json b/projects/arbirise-finance/contracts.json deleted file mode 100644 index b402c911dd..0000000000 --- a/projects/arbirise-finance/contracts.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "arbiStaker": "0x6a894bd1A5476Bdc52B709623B8751e244E6e975", - "sushiFactoryAddress": "0xc35DADB65012eC5796536bD9864eD8773aBc74C4", - "weth": "0x82af49447d8a07e3bd95bd0d56f35241523fbab1", - "usdc": "0xff970a61a04b1ca14834a43f5de4533ebddb5cc8", - "usdcWethPair": "0x905dfCD5649217c42684f23958568e533C711Aa3" -} diff --git a/projects/arbirise-finance/getPrice.js b/projects/arbirise-finance/getPrice.js deleted file mode 100644 index b3cd1bfeda..0000000000 --- a/projects/arbirise-finance/getPrice.js +++ /dev/null @@ -1,146 +0,0 @@ -const sdk = require("@defillama/sdk"); -const getReserves = 'function getReserves() view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast)'; -const token0 = "address:token0"; -const contracts = require("./contracts.json"); -const { default: BigNumber } = require("bignumber.js"); - -const getETHPrice = async (block) => { - const reserves = ( - await sdk.api.abi.call({ - target: contracts["usdcWethPair"], - abi: getReserves, - block: block, - chain: "arbitrum", - }) - ).output; - - const _token0 = ( - await sdk.api.abi.call({ - target: contracts["usdcWethPair"], - abi: token0, - block: block, - chain: "arbitrum", - }) - ).output; - - const WETHReserve = new BigNumber( - _token0.toLowerCase() === contracts["weth"].toLowerCase() - ? reserves._reserve0 - : reserves._reserve1 - ).div(1e18); - const USDCReserve = new BigNumber( - _token0.toLowerCase() === contracts["usdc"].toLowerCase() - ? reserves._reserve0 - : reserves._reserve1 - ).div(1e6); - - return new BigNumber(USDCReserve).div(new BigNumber(WETHReserve)); -}; - -const getPrice = async (tokenAddress, block) => { - try { - const ETHPrice = await getETHPrice(block); - - const symbol = ( - await sdk.api.abi.call({ - target: tokenAddress, - abi: "erc20:symbol", - chain: "arbitrum", - block - }) - ).output; - - const isLp = symbol === "SLP"; - - if (tokenAddress.toLowerCase() === contracts["weth"].toLowerCase()) { - return { price: ETHPrice, decimals: 18 }; - } - - const pairAddress = isLp - ? tokenAddress - : ( - await sdk.api.abi.call({ - target: contracts["sushiFactoryAddress"], - abi: 'function getPair(address, address) view returns (address)', - params: [tokenAddress, contracts["weth"]], - block: block, - chain: "arbitrum", - }) - ).output; - - const reserves = ( - await sdk.api.abi.call({ - target: pairAddress, - abi: getReserves, - block: block, - chain: "arbitrum", - }) - ).output; - - const _token0 = ( - await sdk.api.abi.call({ - target: pairAddress, - abi: token0, - block: block, - chain: "arbitrum", - }) - ).output; - - const decimals = ( - await sdk.api.abi.call({ - target: tokenAddress, - abi: "erc20:decimals", - chain: "arbitrum", - block - }) - ).output; - - const WETHReserve = new BigNumber( - _token0.toLowerCase() === contracts["weth"].toLowerCase() - ? reserves._reserve0 - : reserves._reserve1 - ).div(1e18); - const tokenReserve = new BigNumber( - _token0.toLowerCase() === tokenAddress.toLowerCase() - ? reserves._reserve0 - : reserves._reserve1 - ).div(`1e${decimals}`); - - if (isLp) { - const totalSupply = ( - await sdk.api.abi.call({ - target: tokenAddress, - abi: "erc20:totalSupply", - chain: "arbitrum", - block - }) - ).output; - - return { - price: new BigNumber(WETHReserve) - .times(ETHPrice) - .times(2) - .div(new BigNumber(totalSupply).div(`1e${decimals}`)), - decimals, - }; - } - - const priceInETH = new BigNumber(tokenReserve).div( - new BigNumber(WETHReserve) - ); - - return { - price: ETHPrice.div(priceInETH), - decimals, - }; - } catch (e) { - return { - price: new BigNumber(0), - decimals: 0, - }; - } -}; - -module.exports = { - getPrice, -}; diff --git a/projects/arbirise-finance/index.js b/projects/arbirise-finance/index.js index d7f66d495b..d6ef6d37e0 100644 --- a/projects/arbirise-finance/index.js +++ b/projects/arbirise-finance/index.js @@ -1,65 +1,18 @@ -const sdk = require("@defillama/sdk"); -const arbiStakerERC20 = require("./abis/arbiStakerERC20.json"); -const contracts = require("./contracts.json"); -const { default: BigNumber } = require("bignumber.js"); -const { getPrice } = require("./getPrice"); - -async function tvl(time, _ethBlock, {arbitrum: block}) { - - const nbOfPrograms = ( - await sdk.api.abi.call({ - block, - target: contracts["arbiStaker"], - abi: arbiStakerERC20["getNumTokensStaked"], - chain: "arbitrum", - }) - ).output; - - const stakingTokens = ( - await sdk.api.abi.multiCall({ - block, - abi: arbiStakerERC20["getTokenStakedAt"], - calls: [...Array(+nbOfPrograms).keys()].map((index) => ({ - target: contracts["arbiStaker"], - params: index, - })), - chain: "arbitrum", - }) - ).output.map((o) => o.output); - - const stakedByProgram = ( - await sdk.api.abi.multiCall({ - block, - abi: arbiStakerERC20["stakedTokenTotal"], - calls: stakingTokens.map((token) => ({ - target: contracts["arbiStaker"], - params: token, - })), - chain: "arbitrum", - }) - ).output; - - let balances = {}; - - for (let i = 0; i < stakedByProgram.length; i++) { - const { price, decimals } = await getPrice( - stakedByProgram[i].input.params[0], - block - ); - const staked = new BigNumber(stakedByProgram[i].output).div( - `1e${decimals}` - ); - // Adding USDC decimals (6)again here `price.times(staked).times(1e6)` because `sumSingleBalance` will remove them - const rewardProgramTVL = price.times(staked).times(1e6).toFixed(0); - sdk.util.sumSingleBalance( - balances, - `arbitrum:${contracts["usdc"]}`, - rewardProgramTVL - ); - } - - return balances; +const abi = { + "stakedTokenTotal": "function stakedTokenTotal(address) view returns (uint256)", + "getNumTokensStaked": "uint256:getNumTokensStaked", + "getTokenStakedAt": "function getTokenStakedAt(uint256 index) view returns (address token)" } +const { sumTokens2 } = require("../helper/unwrapLPs"); + +async function tvl(api) { + const staker = '0x6a894bd1A5476Bdc52B709623B8751e244E6e975'; + const tokens = await api.fetchList({ lengthAbi: abi.getNumTokensStaked, itemAbi: abi.getTokenStakedAt, target: staker}) + const bals = await api.multiCall({ abi: abi.stakedTokenTotal, calls: tokens, target: staker}) + api.add(tokens, bals) + return sumTokens2({ api, resolveLP: true}) +} + module.exports = { methodology: diff --git a/projects/arbor-finance/index.js b/projects/arbor-finance/index.js index f47256c6de..7eac787a02 100644 --- a/projects/arbor-finance/index.js +++ b/projects/arbor-finance/index.js @@ -18,7 +18,6 @@ async function tvl(api) { module.exports = { methodology: "Sum the collateral value of active Arbor Finance bonds.", - start: 14906553, ethereum: { tvl, }, diff --git a/projects/arcadia-finance-v2/index.js b/projects/arcadia-finance-v2/index.js index 561698f436..2fab62d8a9 100644 --- a/projects/arcadia-finance-v2/index.js +++ b/projects/arcadia-finance-v2/index.js @@ -6,8 +6,10 @@ const config = { pools: { wethPool: "0x803ea69c7e87D1d6C86adeB40CB636cC0E6B98E2", usdcPool: "0x3ec4a293Fb906DD2Cd440c20dECB250DeF141dF1", + cbbtcPool: "0xa37E9b4369dc20940009030BfbC2088F09645e3B" }, uniNFT: "0x03a520b32c04bf3beef7beb72e919cf822ed34f1", + alienBaseNFT: "0xb7996d1ecd07fb227e8dca8cd5214bdfb04534e5", slipNFT: "0x827922686190790b37229fd06084350e74485b72", wAeroNFT: "0x17B5826382e3a5257b829cF0546A08Bd77409270".toLowerCase(), sAeroNFT: "0x9f42361B7602Df1A8Ae28Bf63E6cb1883CD44C27".toLowerCase(), @@ -48,25 +50,26 @@ async function unwrapArcadiaAeroLP({ api, ownerIds, }) { wrappedData.forEach((data) => api.add(data.pool, data.amountWrapped)); stakedData.forEach((data) => api.add(data.pool, data.amountStaked)); - await uwrapStakedSlipstreamLP({api, sSlipNftIds, }); + await uwrapStakedSlipstreamLP({ api, sSlipNftIds, }); } -async function uwrapStakedSlipstreamLP( {api, sSlipNftIds, }) { +async function uwrapStakedSlipstreamLP({ api, sSlipNftIds, }) { const { slipNFT } = config[api.chain]; const balances = api.getBalances(); // Arcadia's staked slipstream NFT wrapper issues a position with the same ID as the wrapped NFT // -> fetch the values of the wrapped IDs by simply fetching the values of those IDs on the native slipstream NFT - await unwrapSlipstreamNFT({balances:balances, positionIds:sSlipNftIds, nftAddress:slipNFT, chain:'base', blacklistedTokens:[], whitelistedTokens:[], uniV3ExtraConfig:{} }); - } + await unwrapSlipstreamNFT({ balances: balances, positionIds: sSlipNftIds, nftAddress: slipNFT, chain: 'base', blacklistedTokens: [], whitelistedTokens: [], uniV3ExtraConfig: {} }); +} async function tvl(api) { - let { factory, pools, uniNFT, slipNFT, wAeroNFT, sAeroNFT, sSlipNFT } = - config[api.chain]; + let { factory, pools, uniNFT, slipNFT, wAeroNFT, sAeroNFT, sSlipNFT, alienBaseNFT } = config[api.chain]; pools = Object.values(pools); const uTokens = await api.multiCall({ abi: "address:asset", calls: pools }); await api.sumTokens({ tokensAndOwners2: [uTokens, pools] }); const accounts = await api.fetchList({ lengthAbi: 'allAccountsLength', itemAbi: 'allAccounts', target: factory, }); + if (alienBaseNFT) + await sumTokens2({ api, owners: accounts, uniV3ExtraConfig: { nftAddress: alienBaseNFT } }) const assetData = await api.multiCall({ abi: abi.assetData, calls: accounts, }); const ownerTokens = accounts.map((account, i) => [assetData[i].assets, account]) @@ -76,7 +79,7 @@ async function tvl(api) { account, ]); // add all simple ERC20s - await api.sumTokens({ ownerTokens, blacklistedTokens: [uniNFT, slipNFT, wAeroNFT, sAeroNFT, sSlipNFT], }); + await api.sumTokens({ ownerTokens, blacklistedTokens: [uniNFT, slipNFT, wAeroNFT, sAeroNFT, sSlipNFT, alienBaseNFT,], }); // add all Arcadia-wrapped LP positions await unwrapArcadiaAeroLP({ api, ownerIds }); @@ -90,7 +93,7 @@ module.exports = { methodology: "TVL is calculated as the sum of all Account values and the available balance in the liquidity pools. Assets are not double counted.", base: { tvl }, - start: 1711389600, // Mon Mar 25 2024 18:00:00 GMT+0000 + start: '2024-03-25', // Mon Mar 25 2024 18:00:00 GMT+0000 hallmarks: [ [Math.floor(new Date("2024-04-03") / 1e3), "Points program announced."], ], diff --git a/projects/arcadia-finance/index.js b/projects/arcadia-finance/index.js index a9d10c7b41..9ca0a500dc 100644 --- a/projects/arcadia-finance/index.js +++ b/projects/arcadia-finance/index.js @@ -5,7 +5,7 @@ module.exports = { "TVL includes ERC-20 tokens that have been supplied as collateral as well as ERC-20 tokens that are supplied by liquidity providers.", optimism: { tvl }, ethereum: { tvl }, - start: 1686391200, // Jun 10 2023 10:00:00 GMT+0000 + start: '2023-06-10', // Jun 10 2023 10:00:00 GMT+0000 hallmarks: [ [Math.floor(new Date('2023-07-10')/1e3), 'Protocol was exploited.'], ], diff --git a/projects/arcanum/index.js b/projects/arcanum/index.js index 49885497eb..3518e10927 100644 --- a/projects/arcanum/index.js +++ b/projects/arcanum/index.js @@ -20,7 +20,6 @@ const SPI_ASSETS_CONTRACTS = [ module.exports = { methodology: 'counts the quantities of all tokens in all multipool contracts.', - start: 1000235, arbitrum: { tvl: sumTokensExport({ ownerTokens: [[ARBI_ASSETS_CONTRACTS, ARBI_CONTRACT], [SPI_ASSETS_CONTRACTS, SPI_CONTRACT]] }) } diff --git a/projects/argofinance/index.js b/projects/argofinance/index.js index 065d7c9e99..62e70315a6 100644 --- a/projects/argofinance/index.js +++ b/projects/argofinance/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { queryV1Beta1 } = require("../helper/chain/cosmos"); const sdk = require("@defillama/sdk"); @@ -5,7 +6,7 @@ async function tvl() { const data = await queryV1Beta1({ chain: 'cronos', url: '/staking/v1beta1/delegations/cro1klkxkl2c59m5dcw4w0683ctfaxklsy9py26jg3', }) let total = data.delegation_responses.reduce((a, i) => a += +i.balance.amount, 0) const balances = {} - sdk.util.sumSingleBalance(balances, 'cronos:0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23', total * 1e10) + sdk.util.sumSingleBalance(balances, 'cronos:' + ADDRESSES.cronos.WCRO_1, total * 1e10) return balances } diff --git a/projects/aries-markets/index.js b/projects/aries-markets/index.js index 20a2e72f70..2a5ac23514 100644 --- a/projects/aries-markets/index.js +++ b/projects/aries-markets/index.js @@ -1,5 +1,4 @@ const sdk = require("@defillama/sdk"); -const { default: BigNumber } = require("bignumber.js"); const { getResources, getTableData, } = require("../helper/chain/aptos"); const { transformBalances } = require("../helper/portedTokens"); const toHex = (str) => Buffer.from(str, 'utf-8').toString('hex'); @@ -11,7 +10,8 @@ async function _getResources() { return resourcesCache } const extractCoinAddress = (str) => str.slice(str.indexOf("<") + 1, str.lastIndexOf(">")); -const reserveContrainerFilter = (i) => i.type.includes("0x9770fa9c725cbd97eb50b2be5f7416efdfd1f1554beb0750d4dae4c64e860da3::reserve::ReserveCoinContainer") +const reserveContrainerFilter = (i) => i.type.includes("0x9770fa9c725cbd97eb50b2be5f7416efdfd1f1554beb0750d4dae4c64e860da3::reserve::ReserveCoinContainer"); +const faWrapperFilter = (i) => i.type.includes("0x9770fa9c725cbd97eb50b2be5f7416efdfd1f1554beb0750d4dae4c64e860da3::fa_to_coin_wrapper::WrapperCoinInfo"); module.exports = { timetravel: false, @@ -26,11 +26,20 @@ module.exports = { lamports: i.data.underlying_coin.value, tokenAddress: extractCoinAddress(i.type), })); + const faWrappers = data.filter(faWrapperFilter) + .map((i) => ({ + lamports: i.data.fa_amount, + faAddress: i.data.metadata.inner, + })); coinContainers.forEach(({ lamports, tokenAddress }) => { sdk.util.sumSingleBalance(balances, tokenAddress, lamports); }); + faWrappers.forEach(({ lamports, faAddress }) => { + sdk.util.sumSingleBalance(balances, faAddress, lamports); + }); + return transformBalances("aptos", balances); }, borrowed: async () => { @@ -59,10 +68,13 @@ module.exports = { }); const total_borrowed = BigInt(reserveStatus.total_borrowed.val) / BigInt(10 ** 18); + + const faInfo = data.filter(faWrapperFilter).filter((i) => i.type.includes(coin_type)); + const normalizedAddress = faInfo.length == 0 ? coin_type : faInfo[0].data.metadata.inner; return { lamports: total_borrowed.toString(), - tokenAddress: coin_type, + tokenAddress: normalizedAddress, }; }) ); diff --git a/projects/arkham-exchange/index.js b/projects/arkham-exchange/index.js new file mode 100644 index 0000000000..cf1a7f9231 --- /dev/null +++ b/projects/arkham-exchange/index.js @@ -0,0 +1,42 @@ +const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const config = { + ethereum: { + owners: [ + '0x679Fb19dEc9d66C34450a8563FfDFD29C04e615A', + '0x0323718324218dcBfF7c9f89bA5a5954F61A6c74', + '0x794C629e4403CA7CEE126Cc19d6C7b002D0238a5', + ], + }, + bitcoin: { + owners: bitcoinAddressBook.arkhamExchange + }, + solana: { + owners: [ + 'H2qEpXtSEzQTH5xNFpA8VA1W2NKNZWxUoVpascxyWAK1', + '3huamNpghPSPbgQSLX56B18Sj1hq5SE4KGxwTvhwJGnC', + ], + }, + doge: { + owners: [ + '9xFftuJonFHopj9FB6tyW1kyxqusr4jrGh', + ] + }, + avax: { + owners: [ + '0xDc2822D0685c0CcEAb07b35d6de4aC9280FB9cFF', + '0x34407900475cEF87acE1597670A9A42F31961d02', + '0xaF4E837d27cD6A5B33D67d51b88Ae42c0Bb3f1af', + ] + }, + ton: { + owners: [ + 'UQDT3cimS92wrKXrc7U6quPIM1ose_N5-R4U5byIUDHkF8pt', + 'UQDd2gNTRcIsgdUgf0DYMVcpxZuV78hegZ4D1tIj7xLKTwWn', + ] + }, +} + +module.exports = cexExports(config) +module.exports.methodology = 'Wallets can be tracked here: https://intel.arkm.com/explorer/entity/arkham-exchange' diff --git a/projects/arrakis-modular/index.js b/projects/arrakis-modular/index.js new file mode 100644 index 0000000000..a9a7ed4b13 --- /dev/null +++ b/projects/arrakis-modular/index.js @@ -0,0 +1,41 @@ +const config = { + ethereum: { + factory: '0x820FB8127a689327C863de8433278d6181123982', + fromBlock: 20540819, + }, + arbitrum: { + factory: '0x820FB8127a689327C863de8433278d6181123982', + fromBlock: 243467827, + }, + base: { + factory: '0x820FB8127a689327C863de8433278d6181123982', + fromBlock: 18512550, + }, +} + +module.exports = { + doublecounted: true, +}; + +Object.keys(config).forEach(chain => { + const { factory } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const numPublicVaults = await api.call({ abi: 'uint256:numOfPublicVaults', target: factory }) + const numPrivateVaults = await api.call({ abi: 'uint256:numOfPrivateVaults', target: factory }) + const publicVaults = numPublicVaults > 0 ? await api.call({ abi: 'function publicVaults(uint256 startIndex_, uint256 endIndex_) returns (address[] memory)', target: factory, params: [0, numPublicVaults] }) : [] + const privateVaults = numPrivateVaults > 0 ? await api.call({ abi: 'function privateVaults(uint256 startIndex_, uint256 endIndex_) returns (address[] memory)', target: factory, params: [0, numPrivateVaults] }) : [] + const vaults = [...publicVaults, ...privateVaults] + const [token0s, token1s, bals] = await Promise.all([ + api.multiCall({ abi: 'address:token0', calls: vaults }), + api.multiCall({ abi: 'address:token1', calls: vaults }), + api.multiCall({ abi: 'function totalUnderlying() view returns (uint256, uint256)', calls: vaults }), + ]) + + bals.forEach(([v0, v1], i) => { + api.add(token0s[i], v0) + api.add(token1s[i], v1) + }) + } + } +}) \ No newline at end of file diff --git a/projects/ascentyield/index.js b/projects/ascentyield/index.js new file mode 100644 index 0000000000..25670debf3 --- /dev/null +++ b/projects/ascentyield/index.js @@ -0,0 +1,30 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokens2 } = require("../helper/solana"); +const { post } = require('../helper/http'); + +const hyperliquidSubAccount = "0x75b2e5c67d2116bcf1b77c5e6444fc18bc5d38a4" // for trading at hyperliquid +const jlpholder = "9nAgg9wAnuiPv57dXkmCwoGhhbTHS1RRzvYLjnRGZtXp" // for keeping JLP and USDC(buy JLP) +const arbiusdcholder = "0xa6Ff9a77D6bD8B0a759055Cd8885e23228bc10Ec" // USDC on arbi(will bridge to solana) +const hyperliquidMainAccount = "0x7151609Fdc7E0Cac89FB9720F0957AF9d552f8f9" // will transfer USDC to sub account + +module.exports = { + misrepresentedTokens: true, + doublecounted: true, + methodology: "Aggregate trading account margins in HyperLiquid and JLP, USDC on the solana network.", + arbitrum: { + tvl + }, +}; + + +async function tvl(api) { + // hyperliquid tvl + let data = await post('https://api.hyperliquid.xyz/info', { type: "clearinghouseState", user: hyperliquidSubAccount }) + data = parseInt(data.marginSummary.accountValue) + api.addCGToken('usd-coin', data) + + // solana tvl + await sumTokens2({ balances: api.getBalances(), owner: jlpholder }) + + return api.sumTokens({ owners: [arbiusdcholder, hyperliquidMainAccount], tokens: [ADDRESSES.arbitrum.USDC_CIRCLE,] }) +} \ No newline at end of file diff --git a/projects/asgardfinance/index.js b/projects/asgardfinance/index.js index bf5323aaa8..537325ed1b 100644 --- a/projects/asgardfinance/index.js +++ b/projects/asgardfinance/index.js @@ -1,68 +1,17 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { staking } = require('../helper/staking'); const AsgardStaking = "0x4EA2bb6Df87F66cbea70818aE92f3A48F98EBC93"; const ASG = "0x0DC5189Ec8CDe5732a01F0F592e927B304370551"; -const AsgardTreasury = "0x9D5818af130705F95444d78A55B4F3d85cBfCC13"; - -const DAI = ADDRESSES.ethereum.DAI; -const ASG_DAI_SLP = "0x024cc95611d478dd367240e72c82662d9e390a6a"; -const FRAX = ADDRESSES.ethereum.FRAX; -const ASG_FRAX_SLP = "0x5696cd9054ce11625141f5ee2c65fc4d57c2a5ca"; -const WUST = "0xa47c8bf37f92abed4a126bda807a7b7498661acd"; -const ASG_UST_SLP = "0x5a1abc007f031aa58238f45941d965ce6892fdff"; - -/*** Staking of native token (ASG) TVL Portion ***/ -const staking = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - const stakingBalance = ( - await sdk.api.abi.call({ - abi: 'erc20:balanceOf', - target: ASG, - params: AsgardStaking, - block: ethBlock, - }) - ).output; - - sdk.util.sumSingleBalance(balances, ASG, stakingBalance); - - return balances; -}; - -/*** Bonds TVL Portion (Treasury) *** - * Treasury TVL consists of DAI, UST and FRAX balances + Sushi SLPs balance - ***/ -async function ethTvl(timestamp, block) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [DAI, false], - [FRAX, false], - [WUST, false], - [ASG_DAI_SLP, true], - [ASG_FRAX_SLP, true], - [ASG_UST_SLP, true], - ], - [AsgardTreasury], - block - ); - - return balances; -} - module.exports = { hallmarks: [ [1643155200, "Token mint exploit"] ], ethereum: { - staking, - tvl: ethTvl, + staking: staking(AsgardStaking, ASG), + tvl: () => ({}), }, + deadFrom: '2021-08-28', methodology: "Counts DAI, DAI SLP (ASG-DAI), FRAX, FRAX SLP (ASG-FRAX), UST, UST SLP (ASG-UST) on the treasury", }; diff --git a/projects/aspida/index.js b/projects/aspida/index.js index ea3ff2f547..e9d0d5542b 100644 --- a/projects/aspida/index.js +++ b/projects/aspida/index.js @@ -1,4 +1,5 @@ module.exports = { + doublecounted: true, ethereum: { tvl: async (api) => { const totalSupply = await api.call({ target: "0xFC87753Df5Ef5C368b5FBA8D4C5043b77e8C5b39", abi: "uint256:totalSupply" }); diff --git a/projects/assetchain-swap/index.js b/projects/assetchain-swap/index.js new file mode 100644 index 0000000000..ec189ab1a5 --- /dev/null +++ b/projects/assetchain-swap/index.js @@ -0,0 +1,3 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ assetchain: { factory: '0xa9d53862D01190e78dDAf924a8F497b4F8bb5163', fromBlock: 17598, } }) \ No newline at end of file diff --git a/projects/astarter/index.js b/projects/astarter/index.js index c1629d936f..13481cbf1e 100644 --- a/projects/astarter/index.js +++ b/projects/astarter/index.js @@ -8,7 +8,7 @@ async function tvl() { } async function getPoolStake(poolIds) { - const response = await axios.post('https://api.koios.rest/api/v0/pool_info', { + const response = await axios.post('https://api.koios.rest/api/v1/pool_info', { "_pool_bech32_ids": poolIds }); return response.data.reduce((a, b) => a + b.live_stake / 1e6, 0); diff --git a/projects/asteria-finance/asteriaFinance.js b/projects/asteria-finance/asteriaFinance.js new file mode 100644 index 0000000000..ef1389d254 --- /dev/null +++ b/projects/asteria-finance/asteriaFinance.js @@ -0,0 +1,26 @@ +function asteriaFinanceExport(config) { + const exports = { + methodology: 'We count the token balances in in different liquidity book contracts', + } + + Object.keys(config).forEach(chain => { + let { factory } = config[chain] + + exports[chain] = { + tvl: async (api) => { + const pools = await api.fetchList({ target: factory, itemAbi: 'getLBPairAtIndex', lengthAbi: 'getNumberOfLBPairs', }) + const tokenA = await api.multiCall({ abi: 'address:getTokenX', calls: pools, }) + const tokenB = await api.multiCall({ abi: 'address:getTokenY', calls: pools, }) + const tokensAndOwners2 = [tokenA.concat(tokenB), pools.concat(pools)] + return api.sumTokens({ tokensAndOwners2 }) + } + } + }) + + return exports +} + + +module.exports = { + asteriaFinanceExport, +} \ No newline at end of file diff --git a/projects/asteria-finance/index.js b/projects/asteria-finance/index.js new file mode 100644 index 0000000000..d582769ab3 --- /dev/null +++ b/projects/asteria-finance/index.js @@ -0,0 +1,5 @@ +const { asteriaFinanceExport } = require('./asteriaFinance') + +module.exports = asteriaFinanceExport({ + scroll: { factory: '0x77C99431b679e21C42464f1714221eAE94C1e3ed' }, +}) \ No newline at end of file diff --git a/projects/asteroneo/index.js b/projects/asteroneo/index.js new file mode 100644 index 0000000000..dcc2069e39 --- /dev/null +++ b/projects/asteroneo/index.js @@ -0,0 +1,5 @@ +const { getUniTVL } = require('../helper/unknownTokens') + +module.exports = { + neox: { tvl: getUniTVL({ factory: '0x1dAbb81D9Faeb1DF4a8c97A60C5269c7D45e66B0', useDefaultCoreAssets: true })} +} \ No newline at end of file diff --git a/projects/astherus-asBNB/index.js b/projects/astherus-asBNB/index.js new file mode 100644 index 0000000000..afbeda68f5 --- /dev/null +++ b/projects/astherus-asBNB/index.js @@ -0,0 +1,22 @@ +const asBNB = "0x77734e70b6E88b4d82fE632a168EDf6e700912b6" + +module.exports = { + doublecounted: true, + bsc: { + tvl: async (api) => { + + // cake tvl + const locker = '0x8E6Ce60cbC6402B8b780AdCfc069A00c177D2B18' + const veCake = await api.call({ abi: 'address:veToken', target: locker }) + const cake = await api.call({ abi: 'address:token', target: locker }) + const totalDeposits = await api.call({ abi: 'erc20:balanceOf', target: veCake, params: locker }) + api.add(cake, totalDeposits) + + // asBNB tvl + const asBNBMinter = '0x2f31ab8950c50080e77999fa456372f276952fd8' + const token = await api.call({ abi: 'address:token', target: asBNBMinter}) + const bal = await api.call({ abi: 'uint256:totalTokens', target: asBNBMinter}) + api.add(token, bal) + }, + } +} \ No newline at end of file diff --git a/projects/astherus-asbtc/index.js b/projects/astherus-asbtc/index.js new file mode 100644 index 0000000000..3059a5e938 --- /dev/null +++ b/projects/astherus-asbtc/index.js @@ -0,0 +1,10 @@ +const asBTC = "0x184b72289c0992bdf96751354680985a7c4825d6" + +module.exports = { + bsc: { + tvl: async (api) => { + const supply = await api.call({ abi: 'erc20:totalSupply', target: asBTC }) + api.add(asBTC, supply) + }, + } +} \ No newline at end of file diff --git a/projects/astherus-basis-trading/index.js b/projects/astherus-basis-trading/index.js new file mode 100644 index 0000000000..79fcfcc24c --- /dev/null +++ b/projects/astherus-basis-trading/index.js @@ -0,0 +1,10 @@ +const USDF = "0x5A110fC00474038f6c02E89C707D638602EA44B5" + +module.exports = { + bsc: { + tvl: async (api) => { + const supply = await api.call({ abi: 'erc20:totalSupply', target: USDF }) + api.add(USDF, supply) + }, + } +} \ No newline at end of file diff --git a/projects/astherus/index.js b/projects/astherus/index.js index de07fb304d..beb00949af 100644 --- a/projects/astherus/index.js +++ b/projects/astherus/index.js @@ -7,7 +7,7 @@ const config = { } module.exports = { - start: 1706716800, // 02/01/2024 @ 00:00:00pm (UTC) + start: '2024-01-31', // 02/01/2024 @ 00:00:00pm (UTC) } Object.keys(config).forEach(chain => { diff --git a/projects/astra-dao/index.js b/projects/astra-dao/index.js index 165a0b75d0..fb38e05c08 100644 --- a/projects/astra-dao/index.js +++ b/projects/astra-dao/index.js @@ -24,7 +24,6 @@ async function tvl(api) { } module.exports = { - start: 17243078, ethereum: { tvl, }, diff --git a/projects/astriddao/index.js b/projects/astriddao/index.js index 53d43d0f0b..d1933ad79d 100644 --- a/projects/astriddao/index.js +++ b/projects/astriddao/index.js @@ -199,7 +199,6 @@ async function tvl(ts, _block, chainBlocks ) { } module.exports = { - start: 915830, methodology: "Total locked collateral assets (in ERC-20 form) in ActivePool and DefaultPool, plus total staked BAI in StabilityPool", astar: { tvl, diff --git a/projects/astrolend/idl.json b/projects/astrolend/idl.json new file mode 100644 index 0000000000..944881bdd8 --- /dev/null +++ b/projects/astrolend/idl.json @@ -0,0 +1,146 @@ +{ + "events": [], + "accounts": [{"discriminator": [142, 49, 166, 242, 50, 66, 97, 188], "name": "Bank"}], + "address": "Astro1oWvtB7cBTwi3efLMFB47WXx7DJDQeoxi235kA", + "instructions": [], + "metadata": {"description": "Created with Anchor", "name": "astrolend", "spec": "0.1.0", "version": "0.1.0"}, + "types": [ + { + "name": "Bank", + "repr": {"kind": "c"}, + "serialization": "bytemuckunsafe", + "type": { + "fields": [ + {"name": "mint", "type": "pubkey"}, + {"name": "mint_decimals", "type": "u8"}, + {"name": "group", "type": "pubkey"}, + {"name": "_pad0", "type": {"array": ["u8", 7]}}, + {"name": "asset_share_value", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "liability_share_value", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "liquidity_vault", "type": "pubkey"}, + {"name": "liquidity_vault_bump", "type": "u8"}, + {"name": "liquidity_vault_authority_bump", "type": "u8"}, + {"name": "insurance_vault", "type": "pubkey"}, + {"name": "insurance_vault_bump", "type": "u8"}, + {"name": "insurance_vault_authority_bump", "type": "u8"}, + {"name": "_pad1", "type": {"array": ["u8", 4]}}, + {"name": "collected_insurance_fees_outstanding", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "fee_vault", "type": "pubkey"}, + {"name": "fee_vault_bump", "type": "u8"}, + {"name": "fee_vault_authority_bump", "type": "u8"}, + {"name": "_pad2", "type": {"array": ["u8", 6]}}, + {"name": "collected_group_fees_outstanding", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "total_liability_shares", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "total_asset_shares", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "last_update", "type": "i64"}, + {"name": "config", "type": {"defined": {"name": "BankConfig"}}}, + { + "docs": [ + "Bank Config Flags", + "", + "- EMISSIONS_FLAG_BORROW_ACTIVE: 1", + "- EMISSIONS_FLAG_LENDING_ACTIVE: 2", + "- PERMISSIONLESS_BAD_DEBT_SETTLEMENT: 4", + "" + ], + "name": "flags", + "type": "u64" + }, + { + "docs": [ + "Emissions APR.", + "Number of emitted tokens (emissions_mint) per 1e(bank.mint_decimal) tokens (bank mint) (native amount) per 1 YEAR." + ], + "name": "emissions_rate", + "type": "u64" + }, + {"name": "emissions_remaining", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "emissions_mint", "type": "pubkey"}, + {"name": "_padding_0", "type": {"array": [{"array": ["u64", 2]}, 28]}}, + {"name": "_padding_1", "type": {"array": [{"array": ["u64", 2]}, 32]}} + ], + "kind": "struct" + } + }, + { + "name": "WrappedI80F48", + "repr": {"align": 8, "kind": "c"}, + "serialization": "bytemuck", + "type": {"fields": [{"name": "value", "type": {"array": ["u8", 16]}}], "kind": "struct"} + }, + { + "docs": ["TODO: Convert weights to (u64, u64) to avoid precision loss (maybe?)"], + "name": "BankConfig", + "repr": {"kind": "c"}, + "serialization": "bytemuckunsafe", + "type": { + "fields": [ + {"name": "asset_weight_init", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "asset_weight_maint", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "liability_weight_init", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "liability_weight_maint", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "deposit_limit", "type": "u64"}, + {"name": "interest_rate_config", "type": {"defined": {"name": "InterestRateConfig"}}}, + {"name": "operational_state", "type": {"defined": {"name": "BankOperationalState"}}}, + {"name": "oracle_setup", "type": {"defined": {"name": "OracleSetup"}}}, + {"name": "oracle_keys", "type": {"array": ["pubkey", 5]}}, + {"name": "_pad0", "type": {"array": ["u8", 6]}}, + {"name": "borrow_limit", "type": "u64"}, + {"name": "risk_tier", "type": {"defined": {"name": "RiskTier"}}}, + {"name": "auto_padding_0", "type": {"array": ["u8", 7]}}, + {"name": "_pad1", "type": {"array": ["u8", 7]}}, + { + "docs": [ + "USD denominated limit for calculating asset value for initialization astrol requirements.", + "Example, if total SOL deposits are equal to $1M and the limit it set to $500K,", + "then SOL assets will be discounted by 50%.", + "", + "In other words the max value of liabilities that can be backed by the asset is $500K.", + "This is useful for limiting the damage of orcale attacks.", + "", + "Value is UI USD value, for example value 100 -> $100" + ], + "name": "total_asset_value_init_limit", + "type": "u64" + }, + {"docs": ["Time window in seconds for the oracle price feed to be considered live."], "name": "oracle_max_age", "type": "u16"}, + {"name": "_padding", "type": {"array": ["u8", 38]}} + ], + "kind": "struct" + } + }, + { + "name": "InterestRateConfig", + "repr": {"kind": "c"}, + "serialization": "bytemuck", + "type": { + "fields": [ + {"name": "optimal_utilization_rate", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "plateau_interest_rate", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "max_interest_rate", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "insurance_fee_fixed_apr", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "insurance_ir_fee", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "protocol_fixed_fee_apr", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "protocol_ir_fee", "type": {"defined": {"name": "WrappedI80F48"}}}, + {"name": "_padding", "type": {"array": [{"array": ["u64", 2]}, 8]}} + ], + "kind": "struct" + } + }, + { + "name": "BankOperationalState", + "repr": {"kind": "rust"}, + "type": {"kind": "enum", "variants": [{"name": "Paused"}, {"name": "Operational"}, {"name": "ReduceOnly"}]} + }, + { + "name": "OracleSetup", + "repr": {"kind": "rust"}, + "type": { + "kind": "enum", + "variants": [{"name": "None"}, {"name": "PythLegacy"}, {"name": "SwitchboardV2"}, {"name": "PythPushOracle"}, {"name": "SwitchboardPull"}] + } + }, + {"name": "RiskTier", "repr": {"kind": "rust"}, "type": {"kind": "enum", "variants": [{"name": "Collateral"}, {"name": "Isolated"}]}} + ], + "errors": [] +} \ No newline at end of file diff --git a/projects/astrolend/index.js b/projects/astrolend/index.js new file mode 100644 index 0000000000..ec82246f11 --- /dev/null +++ b/projects/astrolend/index.js @@ -0,0 +1,32 @@ +const { Program } = require("@coral-xyz/anchor"); +const { getProvider, sumTokens2 } = require("../helper/solana"); +const idl = require('./idl.json') +const wrappedI80F48toBigNumber = require("./utils/conversion") + +let _banks + +async function getBanks() { + if (_banks) return _banks + const provider = getProvider('eclipse') + const program = new Program(idl, provider) + _banks = program.account.bank.all() + return _banks +} + +async function tvl(api) { + const banks = await getBanks() + return sumTokens2({ api, tokenAccounts: banks.map(bank => bank.account.liquidityVault) }); +} + +async function borrowed(api) { + const banks = await getBanks() + + banks.forEach(bank => { + api.add(bank.account.mint.toString(), wrappedI80F48toBigNumber(bank.account.totalLiabilityShares.value)) + }) +} + +module.exports = { + timetravel: false, + eclipse: { tvl, borrowed, }, +} diff --git a/projects/astrolend/utils/conversion.js b/projects/astrolend/utils/conversion.js new file mode 100644 index 0000000000..75e4c926e2 --- /dev/null +++ b/projects/astrolend/utils/conversion.js @@ -0,0 +1,93 @@ +function decodeI80F48FromHex(hex, fractionalBytes = 6, signChar = "") { + // 1) Parse the hex as BigInt + let value = BigInt(hex); + + // 2) Apply sign if needed + if (signChar === "-") { + value = -value; + } + + // 3) Separate integer/fractional bits + // Typically I80F48 -> 48 fractional bits = 6 bytes * 8 bits/byte. + const fractionBits = 8n * BigInt(fractionalBytes); + + // integerPart = value >> 48 + let integerPart = value >> fractionBits; + + // fractionalPart = value & ((1 << 48) - 1) + let fractionalPart = value & ((1n << fractionBits) - 1n); + + // Remember if final result should be negative + const isNegative = integerPart < 0n; + if (isNegative) { + integerPart = -integerPart; + fractionalPart = -fractionalPart; + // With two’s complement, you might have to do more nuance, + // but typically I80F48 is stored as a signed 128-bit or so. + // For many Solana-based I80F48 implementations, the fractional portion + // is treated as positive magnitude once you know the sign. + } + + // 4) Convert integer part to decimal string + const integerString = integerPart.toString(10); + + // 5) Convert fractional part to decimal string by repeated "multiply by 10, divide by 2^48" + let fractionString = ""; + const denominator = 1n << fractionBits; + + // Ensure fractionalPart is positive for the loop + if (fractionalPart < 0n) { + fractionalPart = -fractionalPart; + } + + while (fractionalPart !== 0n) { + fractionalPart *= 10n; + const digit = fractionalPart / denominator; + fractionString += digit.toString(10); + fractionalPart = fractionalPart % denominator; + } + + // Combine integer + fractional + let result = fractionString.length > 0 + ? integerString + "." + fractionString + : integerString; + + // Re-apply negative if needed + if (isNegative) { + result = "-" + result; + } + + return result; +} + +// -------------------------------------------------------------------- +// USAGE EXAMPLE: + +// Suppose we have 16 bytes in I80F48 format, with 8 fractional bytes (48 bits). +// (Adjust fractionalBytes as needed for your situation.) +const I80F48_FRACTIONAL_BYTES = 6; // typical for "I80F48" = 48 fractional bits + +function wrappedI80F48toBigNumber(wrapped) { + const I80F48_TOTAL_BYTES = 16 + let bytesLE = wrapped; + if (bytesLE.length !== I80F48_TOTAL_BYTES) { + throw new Error(`Expected a ${I80F48_TOTAL_BYTES}-byte buffer`); + } + + let bytesBE = bytesLE.slice(); + bytesBE.reverse(); + + let signChar = ""; + const msb = bytesBE[0]; + if (msb & 0x80) { + signChar = "-"; + bytesBE = bytesBE.map((v) => ~v & 0xff); + } + + let hex = signChar + "0x" + bytesBE.map((v) => v.toString(16).padStart(2, "0")).join(""); + const decimalString = decodeI80F48FromHex(hex, 6) + return decimalString.split(".")[0] + +} + +module.exports = wrappedI80F48toBigNumber diff --git a/projects/astroport-classic/index.js b/projects/astroport-classic/index.js index b15e40f8b5..f0b4b13d11 100644 --- a/projects/astroport-classic/index.js +++ b/projects/astroport-classic/index.js @@ -5,9 +5,11 @@ module.exports = { misrepresentedTokens: true, methodology: "Liquidity on the DEX", terra: { - tvl: getFactoryTvl("terra1fnywlw4edny3vw44x04xd67uzkdqluymgreu7g",) + // tvl: getFactoryTvl("terra1fnywlw4edny3vw44x04xd67uzkdqluymgreu7g",) // it stopped working and team no long maintains it + tvl: () => ({}) }, hallmarks: [ [1651881600, "UST depeg"], - ] -} // node test.js projects/astroport/index.js + ], + deadFrom: '2024-10-02' +} \ No newline at end of file diff --git a/projects/astrovault/index.js b/projects/astrovault/index.js index 793056b5ee..e022079319 100644 --- a/projects/astrovault/index.js +++ b/projects/astrovault/index.js @@ -2,17 +2,45 @@ const { queryContract, } = require("../helper/chain/cosmos"); const { PromisePool } = require('@supercharge/promise-pool') const { transformDexBalances } = require('../helper/portedTokens') -const STABLE_FACTORY_ARCHWAY = "archway19yzx44k7w7gsjjhumkd4sh9r0z6lscq583hgpu9s4yyl00z9lahq0ptra0"; -const STANDARD_FACTORY_ARCHWAY = "archway1cq6tgc32az7zpq5w7t2d89taekkn9q95g2g79ka6j46ednw7xkkq7n55a2"; -const HYBRID_FACTORY_ARCHWAY = "archway1zlc00gjw4ecan3tkk5g0lfd78gyfldh4hvkv2g8z5qnwlkz9vqmsdfvs7q"; +const data = { + archway: { + stableFactory: + "archway19yzx44k7w7gsjjhumkd4sh9r0z6lscq583hgpu9s4yyl00z9lahq0ptra0", + standardFactory: + "archway1cq6tgc32az7zpq5w7t2d89taekkn9q95g2g79ka6j46ednw7xkkq7n55a2", + hybridFactory: + "archway1zlc00gjw4ecan3tkk5g0lfd78gyfldh4hvkv2g8z5qnwlkz9vqmsdfvs7q", + }, + neutron: { + stableFactory: + "neutron10rtkhawvvqxp5zmdqn0ehcsygxjgtj64vrg58v6wnf9tn00uu97s7qfcdq", + standardFactory: + "neutron1r27at895fhu6sdj3v8jjra0n2pvu7jxrr3m90py058dkmm83wh8s9qkxw7", + hybridFactory: + "neutron16yn2gcz24s9qwpuxvrhl3xed0pmhrgwx2mz40zrazfc0pt5kq0psucs6xl", + }, + + nibiru: { + stableFactory: + "nibi143hmeallpaasdyull3gjcmasrcg63yl8f4cumah7xmcmjnqewa9s5jkan2", + standardFactory: + "nibi1gmw5eqnergfdx5qp4w53vwaywg63dwnvqeus3g6a2926pz2axyqshrlh2m", + hybridFactory: + "nibi1gwsrmpkkcl82aqs3vk4vy2lt0dm3kr3sshmruzhxhsqh8xglxrtsglzpqj", + }, +}; async function tvl(api) { const { chain } = api - for (const factory of [STABLE_FACTORY_ARCHWAY, STANDARD_FACTORY_ARCHWAY, HYBRID_FACTORY_ARCHWAY]) { + for (const factory of [ + data[chain].stableFactory, + data[chain].standardFactory, + data[chain].hybridFactory, + ]) { let allPools = []; let pagesRemaining = true; let start_after = null; - const key = factory === STANDARD_FACTORY_ARCHWAY ? 'pairs' : 'pools' + const key = factory === data[chain].standardFactory ? 'pairs' : 'pools' while (pagesRemaining) { const poolsList = await queryContract({ @@ -44,11 +72,11 @@ async function tvl(api) { }) await PromisePool - .withConcurrency(20) + .withConcurrency(3) .for(allPools) .process(getPoolAssetsState) - if (factory === STANDARD_FACTORY_ARCHWAY) await transformDexBalances({ chain, data: poolAssets, balances: api.getBalances() }) + if (factory === data[chain].standardFactory) await transformDexBalances({ chain, data: poolAssets, balances: api.getBalances() }) else { poolAssets.forEach(({ token0, token0Bal, token1, token1Bal }) => { api.add(token0, token0Bal) @@ -63,5 +91,11 @@ module.exports = { misrepresentedTokens: true, archway: { tvl, - } + }, + neutron: { + tvl, + }, + nibiru: { + tvl, + }, } \ No newline at end of file diff --git a/projects/atlantisloans/index.js b/projects/atlantisloans/index.js index 7acc9bff00..ae1eeac8bd 100644 --- a/projects/atlantisloans/index.js +++ b/projects/atlantisloans/index.js @@ -3,8 +3,6 @@ const { staking } = require("../helper/staking"); const { pool2 } = require("../helper/pool2"); const { compoundExports } = require("../helper/compound"); -const comptroller = "0xE7E304F136c054Ee71199Efa6E26E8b0DAe242F3"; -const polygonComptroller = "0x8f85ee1c0a96734cb76870106dd9c016db6de09a" const avaxComptroller = "0x8f85ee1c0a96734cb76870106dd9c016db6de09a" const dcComptroller = "0xA65722af4957CeF481Edb4cB255f804DD36E8aDc" @@ -19,28 +17,16 @@ module.exports = { bsc: { pool2: pool2(lpVaultStakingContract_BNB, ALT_BUSD_CakeLP_BNB), staking: staking(vaultStakingContract_BNB, ATL), - // ...compoundExports(comptroller, - // "bsc", - // "0x5A9A90983A369b6bB8F062f0AFe6219Ac01caF63", - // ADDRESSES.bsc.WBNB - // ), tvl: async () => ({}), }, - // polygon: compoundExports(polygonComptroller, - // "polygon", - // "0xa65722af4957cef481edb4cb255f804dd36e8adc", - // ADDRESSES.polygon.WMATIC_2 - // ), polygon: { tvl: async () => ({}), }, avax: compoundExports(avaxComptroller, - "avax", "0x6bd2154fbc086cb43411966e0e72584196ccd065", ADDRESSES.avax.WAVAX ), dogechain: compoundExports(dcComptroller, - "dogechain", "0xbc46Dc817ce983CfD1B36cBc599031aCBEc2FDfe", ADDRESSES.dogechain.WWDOGE ), diff --git a/projects/atlas-fi/index.js b/projects/atlas-fi/index.js index f3c59e9c9f..7bf2132ff7 100644 --- a/projects/atlas-fi/index.js +++ b/projects/atlas-fi/index.js @@ -30,5 +30,6 @@ module.exports = { tvl, pool2: sumTokensExport({ useDefaultCoreAssets: true, owner: FARM_PROXY, tokens: ['0x4edaa03fc13f8f13c3290c3728f587760b12e381'], lps: ['0x4edaa03fc13f8f13c3290c3728f587760b12e381'] }), staking: sumTokensExport({ useDefaultCoreAssets: true, owner: FARM_PROXY, tokens: ['0x296A0b8847BD4ED9af71a9ef238fa5Be0778B611'], lps: ['0x4edaa03fc13f8f13c3290c3728f587760b12e381'] }), - } + }, + deadFrom: 1681776000 } diff --git a/projects/atlendis-v2/index.js b/projects/atlendis-v2/index.js index fadb6463c4..5d1935198d 100644 --- a/projects/atlendis-v2/index.js +++ b/projects/atlendis-v2/index.js @@ -63,7 +63,7 @@ async function borrowed(api) { } module.exports = { - start: 1686642643, + start: '2023-06-13', hallmarks: [ [1702367571, "Launch of Fluna V2 Pool on Polygon"], [1713855195, "Launch of Arjan pool on Mode Network"], diff --git a/projects/atrix.js b/projects/atrix.js index b1a9202997..fcb5249d9d 100644 --- a/projects/atrix.js +++ b/projects/atrix.js @@ -1,29 +1,7 @@ -const { sumTokens2, getConnection , getProvider} = require('./helper/solana') -// const { getConfig } = require('./helper/cache') -// const { PublicKey, } = require("@solana/web3.js"); -// const { TokenAmountLayout, } = require("./helper/utils/solana/layouts/raydium-layout"); -// const { Program } = require('@project-serum/anchor'); +const { sumTokens2, } = require('./helper/solana') async function tvl() { - // previously we were incorrectly counting all tokens in serum pools as atrix tvl return sumTokens2({ owner: '3uTzTX5GBSfbW7eM9R9k95H7Txe32Qw3Z25MtyD2dzwC', }) -/* const connection = getConnection() - const provider = getProvider() - const program = new Program(idl, 'HvwYjjzPbXWpykgVZhqvvfeeaSraQVnTiQibofaFw9M7', provider) - - const acc = await program.account.poolAccount.all() - const tokenAccounts = acc.map(({ account:i}) => [i.poolCoinAccount, i.poolPcAccount, ]).flat() - - console.log(tokenAccounts, tokenAccounts.length) - return sumTokens2({ tokenAccounts }) - return {} - const auth = 'CmiPgGfWeteicRisWRuJzn7L649zWpw9Qya8g3ey9cZt' - - console.time('raydium: ammV4Tvl fetching vault balances') - const allPoolVaultAmount = await connection.getProgramAccounts(new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'), { filters: [{ dataSize: 165 }, { memcmp: { offset: 32, bytes: auth } }], dataSlice: { offset: 64, length: TokenAmountLayout.span } }) - console.timeEnd('raydium: ammV4Tvl fetching vault balances') - console.log(allPoolVaultAmount.length, 'fetched vault amounts') - return {} */ } @@ -34,257 +12,4 @@ module.exports = { [1665521360, "Mango Markets Hack"], [1667865600, "FTX collapse"] ], -} -/* -const idl = { - "version": "0.0.0", - "name": "atrix", - "instructions": [], - "accounts": [ - { - "name": "ProtocolAccount", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "publicKey" - }, - { - "name": "bump", - "type": "u8" - }, - { - "name": "lpFeeNumerator", - "type": "u16" - }, - { - "name": "protocolFeeNumerator", - "type": "u16" - }, - { - "name": "feeDenominator", - "type": "u16" - }, - { - "name": "maxCancelPerIx", - "type": "u8" - }, - { - "name": "maxPlacePerIx", - "type": "u8" - }, - { - "name": "maxPlacePostLiq", - "type": "u8" - }, - { - "name": "orderProportionNumerators", - "type": { - "array": [ - "u16", - 12 - ] - } - }, - { - "name": "orderProportionLen", - "type": "u8" - }, - { - "name": "orderProportionDenominator", - "type": "u16" - }, - { - "name": "crankSolAccount", - "type": "publicKey" - }, - { - "name": "poolInitCrankFee", - "type": "u64" - }, - { - "name": "solBond", - "type": "u64" - } - ] - } - }, - { - "name": "PoolAccount", - "type": { - "kind": "struct", - "fields": [ - { - "name": "coinMint", - "type": "publicKey" - }, - { - "name": "pcMint", - "type": "publicKey" - }, - { - "name": "market", - "type": "publicKey" - }, - { - "name": "openOrders", - "type": "publicKey" - }, - { - "name": "poolCoinAccount", - "type": "publicKey" - }, - { - "name": "poolPcAccount", - "type": "publicKey" - }, - { - "name": "poolLpAccount", - "type": "publicKey" - }, - { - "name": "lpMint", - "type": "publicKey" - }, - { - "name": "firstPlaced", - "type": "bool" - }, - { - "name": "orderIndex", - "type": "u8" - }, - { - "name": "lpFee", - "type": "u64" - }, - { - "name": "stableFee", - "type": "u64" - }, - { - "name": "ixi", - "type": "u8" - }, - { - "name": "icx", - "type": "u8" - }, - { - "name": "clientOrderId", - "type": "u64" - }, - { - "name": "orderProportionNumerators", - "type": { - "array": [ - "u16", - 12 - ] - } - }, - { - "name": "poolType", - "type": "u8" - }, - { - "name": "stableswapAmpCoef", - "type": "u64" - }, - { - "name": "coinDecimals", - "type": "u8" - }, - { - "name": "pcDecimals", - "type": "u8" - }, - { - "name": "lastAskCoin", - "type": "u64" - }, - { - "name": "lastAskPc", - "type": "u64" - }, - { - "name": "lastBidCoin", - "type": "u64" - }, - { - "name": "lastBidPc", - "type": "u64" - }, - { - "name": "version", - "type": "u64" - }, - { - "name": "placedAsks", - "type": { - "array": [ - { - "defined": "PlacedOrder" - }, - 12 - ] - } - }, - { - "name": "placedBids", - "type": { - "array": [ - { - "defined": "PlacedOrder" - }, - 12 - ] - } - }, - { - "name": "pca", - "type": "u64" - }, - { - "name": "ppca", - "type": "u64" - }, - { - "name": "mmActive", - "type": "bool" - } - ] - } - } - ], - "types": [ - { - "name": "PlacedOrder", - "type": { - "kind": "struct", - "fields": [ - { - "name": "limitPrice", - "type": "u64" - }, - { - "name": "coinQty", - "type": "u64" - }, - { - "name": "maxNativePcQtyIncludingFees", - "type": "u64" - }, - { - "name": "clientOrderId", - "type": "u64" - } - ] - } - } - ], - "events": [], - "errors": [] -} - */ +} \ No newline at end of file diff --git a/projects/auctus/index.js b/projects/auctus/index.js index abba97069d..3af3e435ad 100644 --- a/projects/auctus/index.js +++ b/projects/auctus/index.js @@ -94,6 +94,6 @@ async function tvl(api) { } module.exports = { - start: 1590014400, // 05/20/2020 @ 08:10:40pm (UTC) + start: '2020-05-21', // 05/20/2020 @ 08:10:40pm (UTC) ethereum: { tvl } } diff --git a/projects/aurigami.js b/projects/aurigami.js index 6df91e0837..1fea9e6c36 100644 --- a/projects/aurigami.js +++ b/projects/aurigami.js @@ -1,12 +1,9 @@ const { compoundExports } = require("./helper/compound"); module.exports = { - aurora: { - ...compoundExports( - '0x817af6cfAF35BdC1A634d6cC94eE9e4c68369Aeb', - 'aurora', - '0xca9511B610bA5fc7E311FDeF9cE16050eE4449E9', - '0xc9bdeed33cd01541e1eed10f90519d2c06fe3feb' - ) - } + aurora: compoundExports( + '0x817af6cfAF35BdC1A634d6cC94eE9e4c68369Aeb', + '0xca9511B610bA5fc7E311FDeF9cE16050eE4449E9', + '0xc9bdeed33cd01541e1eed10f90519d2c06fe3feb' + ) }; \ No newline at end of file diff --git a/projects/autotronic/index.js b/projects/autotronic/index.js index 77d074a242..278eb38494 100644 --- a/projects/autotronic/index.js +++ b/projects/autotronic/index.js @@ -1,6 +1,6 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { - start: 1692842880, + start: '2023-08-24', base: { tvl: getUniTVL({ factory: '0x55b3409335B81E7A8B7C085Bbb4047DDc23f7257', useDefaultCoreAssets: true, }), }, diff --git a/projects/avalance-btc/index.js b/projects/avalance-btc/index.js index 9ccfdf9a1a..ce1f9d4954 100644 --- a/projects/avalance-btc/index.js +++ b/projects/avalance-btc/index.js @@ -1,16 +1,11 @@ -const sdk = require('@defillama/sdk'); const { sumTokensExport } = require('../helper/sumTokens'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') //https://support.avax.network/en/articles/6349640-how-does-the-avalanche-bridge-work -const owners = [ -'bc1q2f0tczgrukdxjrhhadpft2fehzpcrwrz549u90', // https://prnt.sc/unrBvLvw3z1t -] module.exports = { methodology: 'BTC wallets on bc1q2f0tczgrukdxjrhhadpft2fehzpcrwrz549u90', bitcoin: { - tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners }), - ]), + tvl: sumTokensExport({ owners: bitcoinAddressBook.avalanche }), }, }; diff --git a/projects/avalon-finance-cedefi/index.js b/projects/avalon-finance-cedefi/index.js new file mode 100644 index 0000000000..2f7e5b7111 --- /dev/null +++ b/projects/avalon-finance-cedefi/index.js @@ -0,0 +1,50 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const sdk = require('@defillama/sdk'); +const { sumTokensExport } = require('../helper/sumTokens'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const abi = { + "getPoolManagerReserveInformation": "function getPoolManagerReserveInformation() view returns (tuple(uint256 userAmount, uint256 collateral, uint256 debt, uint256 claimableUSDT, uint256 claimableBTC) poolManagerReserveInfor)" +} + +const config = { + ethereum: { poolAddress: "0x02feDCff97942fe28e8936Cdc3D7A480fdD248f0", lfbtcAddress: "0x3119a1AD5B63A000aB9CA3F2470611eB997B93B9", usdtAddress: ADDRESSES.ethereum.USDT, }, +} + +// @dev btcOwnersOfCedefi: Bitcoin owners of the Avalon CeDefi pool contract. +const btcOwnersOfCedefi = bitcoinAddressBook.avalonCedefi + +// @dev getMetrics: call to get the collateral and debt of the Avalon CeDefi pool contract. +const getMetrics = async (api, borrowed) => { + const { poolAddress, lfbtcAddress, usdtAddress } = config[api.chain] + const marketData = await api.call({ abi: abi.getPoolManagerReserveInformation, target: poolAddress, }); + // @note: no more count collateral on Ethereum, count collateral on Bitcoin instead + // const balanceOfCollateral = marketData.collateral; + const balanceOfDebt = marketData.debt; + if (!borrowed) { + // pool balance of lfbtc + const balance = await api.call({ abi: 'erc20:balanceOf', target: config[api.chain].lfbtcAddress, params: poolAddress}) + api.add(config[api.chain].lfbtcAddress, balance) + } + + if (borrowed) + api.add(usdtAddress, balanceOfDebt); + // else + // api.add(lfbtcAddress, balanceOfCollateral); +} + +module.exports = { + methodology: `lfbtc collateral, USDT debt of Avalon CeDefi pool contract and Bitcoin owners of the Avalon CeDefi pool contract`, + doublecounted: false, + ethereum: { + tvl: (api) => getMetrics(api, false), + borrowed: (api) => getMetrics(api, true), + }, + // bitcoin: { + // tvl: sdk.util.sumChainTvls([ + // sumTokensExport({ owners: btcOwnersOfCedefi }), + // ]), + // }, +} + +delete module.exports.bitcoin diff --git a/projects/avalon-finance-usda/index.js b/projects/avalon-finance-usda/index.js new file mode 100644 index 0000000000..5e3a46b117 --- /dev/null +++ b/projects/avalon-finance-usda/index.js @@ -0,0 +1,34 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs"); + +const config = { + ethereum: { + poolAddress: '0x3f390dD6EF69f68f9877aACC086856a200808693', + fbtcAddress: ADDRESSES.bob.FBTC, + lfbtcAddress: '0x3119a1AD5B63A000aB9CA3F2470611eB997B93B9', + usdaAddress: '0x0b4D6DA52dF60D44Ce7140F1044F2aD5fabd6316', + }, + bsc: { + poolAddress: '0xC757E47d6bC20FEab54e16F2939F51Aa4826deF7', + fbtcAddress: ADDRESSES.bob.FBTC, + lfbtcAddress: '0x3119a1AD5B63A000aB9CA3F2470611eB997B93B9', + usdaAddress: '0x8a4bA6C340894B7B1De0F6A03F25Aa6afb7f0224', + }, + mantle: { + poolAddress: '0x8f778806CBea29F0f64BA6A4B7724BCD5EEd543E', + fbtcAddress: ADDRESSES.bob.FBTC, + lfbtcAddress: '0x3119a1AD5B63A000aB9CA3F2470611eB997B93B9', + usdaAddress: '0x2BDC204b6d192921605c66B7260cFEF7bE34Eb2E', + }, +} + +module.exports = { + methodology: `FBTC and LFBTC as collateral`, +} + +Object.keys(config).forEach(chain => { + const {poolAddress, lfbtcAddress, fbtcAddress,} = config[chain] + module.exports[chain] = { + tvl: sumTokensExport({ owner: poolAddress, tokens: [lfbtcAddress, fbtcAddress], }), + } +}) diff --git a/projects/avalon-finance-usdalend/index.js b/projects/avalon-finance-usdalend/index.js new file mode 100644 index 0000000000..d3222c7709 --- /dev/null +++ b/projects/avalon-finance-usdalend/index.js @@ -0,0 +1,22 @@ + +const { aaveExports } = require('../helper/aave') +const methodologies = require('../helper/methodologies') +const { mergeExports } = require('../helper/utils') + +//@note Main & Innovative Markets +const getExports = address => aaveExports(address, '', undefined, [address], { v3: true }) + +const mainMarket = { + iotex: getExports('0xDB52DD393e3a5e95d3B7C7e1C42cC06bb807A369'), + taiko: getExports('0x5EcDC2432ED77cD8E2cE6183712c5cc712c40ec0'), + zircuit: getExports('0x5EcDC2432ED77cD8E2cE6183712c5cc712c40ec0'), + corn: getExports('0xa15c0c3D6Ad3FeE623BEd68391923c9Ff79a50c3'), + sei: getExports('0x5EcDC2432ED77cD8E2cE6183712c5cc712c40ec0'), + sonic: getExports('0x1C6E9510055B71429022B997E6602FbaEEb0481F'), +} + +module.exports = mergeExports( + mainMarket, +) + +module.exports.methodology = methodologies.lendingMarket diff --git a/projects/avalon-finance/index.js b/projects/avalon-finance/index.js index 1c3171a6fe..fe1a314020 100644 --- a/projects/avalon-finance/index.js +++ b/projects/avalon-finance/index.js @@ -3,34 +3,104 @@ const { aaveExports } = require('../helper/aave') const methodologies = require('../helper/methodologies') const { mergeExports } = require('../helper/utils') + + +//@note Main & Innovative Markets const mainMarket = { merlin: aaveExports('', '0x6aB5d5E96aC59f66baB57450275cc16961219796', undefined, ['0x5F314b36412765f3E1016632fD1Ad528929536CA'], {v3: true}), btr: aaveExports('', '0x6aB5d5E96aC59f66baB57450275cc16961219796', undefined, ['0x5F314b36412765f3E1016632fD1Ad528929536CA'], {v3: true}), - arbitrum: aaveExports('', '0xa2ddc06baDc817C612111137c0cf6Bd43634EE1a', undefined, ['0xEc579d2cE07401258710199Ff12a5bb56e086a6F'],{v3: true}), - bsc: aaveExports('', '0x5395201A4DD625a0d69b99D917282f75928416c1', undefined, ['0x672b19DdA450120C505214D149Ee7F7B6DEd8C39'],{v3: true}), - core: aaveExports('', '0x410d2D3Dc79ec66A2Cfc3A4a0AD4af3a38D38bd0', undefined, ['0x802CB61844325dc9A161bC3A498E3BE1B7b6FE00'], { v3: true }), scroll: aaveExports('', '0xFBb77A68ee35e7902F1ABE0Bd34B263023e90c70', undefined, ['0x18cbe70602Ee17f79D56971F685E9EaF49DA53F2'], { v3: true }), - ethereum: aaveExports('', '0xff12470a969Dd362EB6595FFB44C82c959Fe9ACc', undefined, ['0xfabb0fDca4348d5A40EB1BB74AEa86A1C4eAd7E2'], { v3: true }), - mantle: aaveExports('', '0xc6517002bE432e60DEb311c2FD264aBdC7CC74F2', undefined, ['0xc8651Bc174A1f9c29dCDc0651917379d29aBE13F'], { v3: true }), + iotex: aaveExports('', '', undefined, ['0xBa77520d38953BF6a8395D118CfF714Ed672533f'], { v3: true }), + bsquared: aaveExports('', '', undefined, ['0x4Ea93E846b8C6E7b3D5a5BEDF4fe6B8AED58FCEe'], { v3: true }), + taiko: aaveExports('', '', undefined, ['0xF6Aa54a5b60c324602C9359E8221423793e5205d'], { v3: true }), + mode: aaveExports('', '', undefined, ['0xC5b05b7092257Ee3eEAf013198d30F1E8179B6C9'], { v3: true }), + klaytn: aaveExports('', '', undefined, ['0xddD3D480521bc027596e078BCd1b838d50Daa076'], { v3: true }), // Kaia V3 Main + zeta: aaveExports('', '', undefined, ['0xA34F1a928024E3609C8968fEA90C747e8D1fA20f'], { v3: true }), // Zetachain V3 Main + corn: aaveExports('', '', undefined, ['0x56552f4407113894Bfce34b5b88C57b941AFc519'], { v3: true }), // Corn V3 Main + duckchain: aaveExports('', '', undefined, ['0x100AC26ad2c253B18375f1dC4BC0EeeB66DEBc88'], { v3: true }), // Duckchain V3 Main } const innovativeMarket = { merlin: aaveExports('', '0x91b212e9FaF20117Eae59d6289CB38749DDFc070', undefined, ['0x883cb2E2d9c5D4D9aF5b0d37fc39Fa2284405682'], { v3: true }), - btr: aaveExports('', '0x90EA8C92AddE4D3f323Dad9E36f0E0395dbc929d', undefined, ['0x4c25c261Fe47bC216113D140BaF72B05E151bcE4'], { v3: true }), } + +//@note Protocol based markets: Solv, pumpBTC, stbtc, unibtc, others +const solvMarkets = { + base: aaveExports('', '', undefined, ['0xA9D15C669940a757Ab76C6604f2f8f1e198f7D50'], { v3: true }), + bsc: aaveExports('', '0x5395201A4DD625a0d69b99D917282f75928416c1', undefined, ['0x672b19DdA450120C505214D149Ee7F7B6DEd8C39'], { v3: true }), + ethereum: aaveExports('', '0xff12470a969Dd362EB6595FFB44C82c959Fe9ACc', undefined, ['0xfabb0fDca4348d5A40EB1BB74AEa86A1C4eAd7E2'], { v3: true }), + core: aaveExports('', '0x410d2D3Dc79ec66A2Cfc3A4a0AD4af3a38D38bd0', undefined, ['0x802CB61844325dc9A161bC3A498E3BE1B7b6FE00'], { v3: true }), + arbitrum: aaveExports('', '0xa2ddc06baDc817C612111137c0cf6Bd43634EE1a', undefined, ['0xEc579d2cE07401258710199Ff12a5bb56e086a6F'], { v3: true }), + bob: aaveExports('', '', undefined, ['0xfabb0fDca4348d5A40EB1BB74AEa86A1C4eAd7E2'], { v3: true }), + corn: aaveExports('', '', undefined, ['0xf0d077728D424Ee6C6Eba82d23ce56C2e91E57Ea'], { v3: true }), + sonic: aaveExports('', '', undefined, ['0x23f02C2eeFe2010298Ab74059393326d3df59a02'], { v3: true }), +} + const pumpBTCMarkets = { - // Ethereum - Pump BTC ethereum: aaveExports('', '0xE00A3FE97714765A1a2054E850724Fd1320FaCc0', undefined, ['0x2eE0438BCC1876cEA2c6fc43dD21417cF3D1c2eF'], { v3: true }), - // BSC - PumpBTC bsc: aaveExports('', '0xb1C93Ba1286b6CCA1496C266f0eBfCe94b0C0cc0', undefined, ['0x58c937fa2D147117dB43d187f9411151edfFf03c'], { v3: true }), + zeta: aaveExports('', '', undefined, ['0xC5b05b7092257Ee3eEAf013198d30F1E8179B6C9'], { v3: true }), + arbitrum: aaveExports('', '', undefined, ['0x2c4aEB7C9f0D196a51136B3c7bec49cB2DBD1966'], { v3: true }), + corn: aaveExports('', '', undefined, ['0x867885c1dB3020E25A86Db7e20E35dC7b81d76A2'], { v3: true }), +} + +const unibtcMarkets = { + merlin: aaveExports('', '0x0024818043D04B1Cc9685233D47eF7eea6Df0A5E', undefined, ['0x623700Fee1dF64088f258e2c4DAB4D6aEac4dDA6'], { v3: true }), + btr: aaveExports('', '', undefined, ['0x898D0EF6E20B7597728AEB41169c22608Fe4b234'], { v3: true }), + bsc: aaveExports('', '', undefined, ['0xF828A73cB00072843241C6294ed778F26854fe5C'], { v3: true }), + mode: aaveExports('', '', undefined, ['0x8F016F5dac399F20B34E35CBaF1dFf12eeE2dE74'], { v3: true }), + iotex: aaveExports('', '', undefined, ['0x28292e1ca36e400FB7d0B66AaA99EB808E3Cb8cB'], { v3: true }), +} + +const stbtcMarkets = { + bsc: aaveExports('', '', undefined, ['0x56F817eF5D1945E0772496020ff0F72c3984B351'], { v3: true }), + btr: aaveExports('', '0x90EA8C92AddE4D3f323Dad9E36f0E0395dbc929d', undefined, ['0x4c25c261Fe47bC216113D140BaF72B05E151bcE4'], { v3: true }), } const otherProtocolTokenMarkets = { // ETH - Swell BTC ethereum: aaveExports('', '0x3975BE5E668b189b8Ac9049B96A9D9561c4F5273', undefined, ['0x87Ed94868f6fbaA834Db81a1C5854c445caCaB67'], { v3: true }), - // Merlin - UniBTC - merlin: aaveExports('', '0x0024818043D04B1Cc9685233D47eF7eea6Df0A5E', undefined, ['0x623700Fee1dF64088f258e2c4DAB4D6aEac4dDA6'], { v3: true }), + // BSC - WBTC + bsc: aaveExports('', '', undefined, ['0xA34F1a928024E3609C8968fEA90C747e8D1fA20f'], { v3: true }), + // Kaia - stKaia + klaytn: aaveExports('', '', undefined, ['0x276c5119f63119921667842dA3B71EE10Ac486eA'], { v3: true }), + // Sonic - beetSonic + sonic: aaveExports('', '', undefined, ['0x28350E38f241d7F24106CE5eaB1684D6ebEB4700'], { v3: true }), + // Duckchain - MBTC + duckchain: aaveExports('', '', undefined, ['0x912b425D867a09608A884C83b3D5075E9037Aa6a'], { v3: true }), +} + +const obtcMarkets = { + core: aaveExports('', '', undefined, ['0x5c78EbB34cC5b52146D107365A66E37a677Fcf50'], { v3: true }), +} + +const ubtcMarkets = { + core: aaveExports('', '', undefined, ['0x2752237ccC6aB5e4B9e9BFca57D7a6956aF4FE3d'], { v3: true }), +} + +const xaumMarkets = { + bsc: aaveExports('', '', undefined, ['0x2c4aEB7C9f0D196a51136B3c7bec49cB2DBD1966'], { v3: true }), +} + +const lbtcMarkets = { + bsc: aaveExports('', '', undefined, ['0x5b9b3C211B81627Cc6b46824CB26829F31A587dc'], { v3: true }), + corn: aaveExports('', '', undefined, ['0x5EcDC2432ED77cD8E2cE6183712c5cc712c40ec0'], { v3: true }), +} + +const listaMarkets = { + bsc: aaveExports('', '', undefined, ['0x5157f63bE7808DEB090Eee7762e917745896A09E'], { v3: true }), // BSC - ListaDAO +} + +const uniIotxMarkets = { + iotex: aaveExports('', '', undefined, ['0x2c4aEB7C9f0D196a51136B3c7bec49cB2DBD1966'], { v3: true }), +} + + // BSC - USDX +const usdxMarkets = { + bsc: aaveExports('', '', undefined, ['0x9515dC23bBE46f9C9885D24Fa276745A11b7f9D8'], { v3: true }), } -module.exports = mergeExports(mainMarket, innovativeMarket,pumpBTCMarkets,otherProtocolTokenMarkets) +module.exports = mergeExports( + mainMarket, innovativeMarket, solvMarkets, pumpBTCMarkets, unibtcMarkets, stbtcMarkets, otherProtocolTokenMarkets, obtcMarkets, ubtcMarkets, xaumMarkets, lbtcMarkets, listaMarkets, uniIotxMarkets, usdxMarkets +) module.exports.methodology = methodologies.lendingMarket diff --git a/projects/avatr/index.js b/projects/avatr/index.js index 574576b847..23f07d4da8 100644 --- a/projects/avatr/index.js +++ b/projects/avatr/index.js @@ -26,6 +26,7 @@ module.exports = { hallmarks: [ [1682726400, "Rug Pull"] ], + deadFrom: '2023-04-29', ethereum: { tvl, }, diff --git a/projects/avaware/index.js b/projects/avaware/index.js index 6dc0119e34..ffc0651d38 100644 --- a/projects/avaware/index.js +++ b/projects/avaware/index.js @@ -1,43 +1,17 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const { sumTokens2 } = require("../helper/unwrapLPs"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { staking } = require('../helper/staking'); const FarmPoolManager = "0x7ec4AeaeB57EcD237F35088D11C59525f7D631FE"; const treasuryAddress = "0x9300736E333233F515E585c26A5b868772392709"; const AVE = "0x78ea17559B3D2CF85a7F9C2C704eda119Db5E6dE"; -/*** Staking of native token AVE TVL Portion ***/ -const staking = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - const transformAddress = addr => 'avax:'+addr; - - await sumTokensAndLPsSharedOwners( - balances, - [[AVE, false]], - [treasuryAddress], - chainBlocks["avax"], - "avax", - transformAddress - ); - - return balances; -}; - /*** farms TVL portion ***/ -const avaxTvl = async (timestamp, ethBlock, chainBlocks) => { +const avaxTvl = async (api) => { const chain = 'avax' - const block = chainBlocks[chain] - const CountOfPools = ( - await sdk.api.abi.call({ - abi: abi.poolCount, - target: FarmPoolManager, - chain, block, - }) - ).output; + const CountOfPools = await api.call({ abi: abi.poolCount, target: FarmPoolManager, }) const indices = [] @@ -48,28 +22,14 @@ const avaxTvl = async (timestamp, ethBlock, chainBlocks) => { indices.push(index) } - const { output: poolsRes } = await sdk.api.abi.multiCall({ - target: FarmPoolManager, - abi: abi.getPool, - calls: indices.map(i => ({ params: i })), - chain, block, - }) - const pools = poolsRes.map(i => i.output.pool) - - const { output: tokens } = await sdk.api.abi.multiCall({ - target: FarmPoolManager, - abi: abi.stakingToken, - calls: pools.map(i => ({ target: i })), - chain, block, - }) - const toa = [] - tokens.forEach(({ output, input: { target } }) => toa.push([output, target])) - return sumTokens2({ tokensAndOwners: toa, chain, block, }) + const pools = (await api.multiCall({ target: FarmPoolManager, abi: abi.getPool, calls: indices, })).map(i => i.pool) + const tokens = await api.multiCall({ abi: abi.stakingToken, calls: pools, }) + return sumTokens2({ api, tokensAndOwners2: [tokens, pools], resolveLP: true, }) }; module.exports = { - avax:{ - staking, + avax: { + staking: staking(treasuryAddress, AVE), tvl: avaxTvl, }, methodology: `We count TVL that is on the Farms threw FarmPoolManager contract diff --git a/projects/awaken/index.js b/projects/awaken/index.js index b40ea52d2c..1b4b29c8ea 100644 --- a/projects/awaken/index.js +++ b/projects/awaken/index.js @@ -2,7 +2,7 @@ const { request, gql } = require("graphql-request"); const { toUSDTBalances } = require("../helper/balances"); const GRAPH_QUERY = gql` - query get_tvl($dto: GetTotalValueLockedDto) { + query get_tvl($dto: GetTotalValueLockedDto!) { totalValueLocked(dto: $dto) { value } @@ -32,13 +32,13 @@ function getChainTvl(graphUrls) { } const v2graph = getChainTvl({ - aelf: "https://dapp.awaken.finance/AElfIndexer_Swap/SwapIndexerSchema/graphql", + aelf: "https://app.aefinder.io/awaken/995f8e7e957d43d6b1706a4e351e2e47/graphql", }); module.exports = { misrepresentedTokens: true, methodology: `Counts the tokens locked on AMM pools, pulling the data from the 'AElfIndexer_Swap' subgraph`, - start: 1706745600, + start: '2024-02-01', aelf: { tvl: v2graph("aelf"), }, diff --git a/projects/axe/index.js b/projects/axe/index.js index e3cab00080..603a2df4f0 100644 --- a/projects/axe/index.js +++ b/projects/axe/index.js @@ -1,43 +1,12 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); -const { staking } = require("../helper/staking.js"); - -const treasuryAddresses = ["0xa2039621Cc042567092fAaee89B03Ef959F89712"]; -const DAI = ADDRESSES.ethereum.DAI; -const USDC = ADDRESSES.ethereum.USDC; -const AXEStaking = "0x7f4d186b76a39a2da32804a8c35b3d04e0e174fd"; -const AXE = "0x30AC8317DfB0ab4263CD8dB1C4F10749911B126C"; - -const AXE_DAI_POOL = "0xd34d3b648db688bee383022dd26a9027592b82d5"; -/*** Bonds TVL Portion (Treasury) *** - * Treasury TVL consists of DAI and UNI-V2 balances - ***/ - async function ethTvl(timestamp, block) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [DAI, false], - [USDC, false], - [AXE_DAI_POOL, true] - ], - treasuryAddresses, - block - ); - - return balances; -} - module.exports = { hallmarks: [ [1648765747, "Rug Pull"] ], deadFrom: 1648765747, - start: 1637036516, // 16 Nov 2021 + start: '2021-11-16', // 16 Nov 2021 ethereum: { - tvl: ethTvl, - staking: staking(AXEStaking, AXE), + tvl: () => ({}), + staking: () => ({}), }, methodology: "Counts DAI, USDC and DAI SLP (AXE-DAI) on the treasury", diff --git a/projects/ayin/index.js b/projects/ayin/index.js index 375005468d..e4ef7ac6ec 100644 --- a/projects/ayin/index.js +++ b/projects/ayin/index.js @@ -14,30 +14,11 @@ const Addresses = { ayinUsdcPool: '2961aauvprhETv6TXGQRc3zZY4FbLnqKon2a4wK6ABH9q', ayinApadPool: '247rZysrruj8pj2GnFyK2bqB2nU4JsUj7k2idksAp4XMy', usdtUsdcPool: '27C75V9K5o9CkkGTMDQZ3x2eP82xnacraEqTYXA35Xuw5', - usdt: 'zSRgc7goAYUgYsEBYdAzogyyeKv3ne3uvWb3VDtxnaEK', - weth: 'vP6XSUyjmgWCB2B9tD5Rqun56WJqDdExWnfwZVEqzhQb', - ayin: 'vT49PY8ksoUL6NcXiZ1t2wAmC7tTPRfFfER8n3UCLvXy', - wbtc: 'xUTp3RXGJ1fJpCGqsAY6GgyfRQ3WQ1MdcYR1SiwndAbR', - usdc: '22Nb9JajRpAh9A2fWNgoKt867PA6zNyi541rtoraDfKXV', - apad: '27HxXZJBTPjhHXwoF1Ue8sLMcSxYdxefoN2U6d8TKmZsm', - cheng: '27DP28mGQzSrHGZgnRvYQH1VAWYZVVLUjGALazLrtrRJF', - ansd: '2AhEaQiUYtAF6g1vtRQHsPR7xTkMY1PRr3k7QkXuisynF', - alphaga: '26Mirs33zojnVMRkqVDJtMZvVZcbAFVyxGojGw7UtWp2K' } +const alephId = '0000000000000000000000000000000000000000000000000000000000000000' const XAyinAddress = 'zst5zMzizEeFYFis6DNSknY5GCYTpM85D3yXeRLe2ug3' -const TokenIds = { - usdt: alephium.contractIdFromAddress(Addresses.usdt), - weth: alephium.contractIdFromAddress(Addresses.weth), - ayin: alephium.contractIdFromAddress(Addresses.ayin), - wbtc: alephium.contractIdFromAddress(Addresses.wbtc), - usdc: alephium.contractIdFromAddress(Addresses.usdc), - apad: alephium.contractIdFromAddress(Addresses.apad), - cheng: alephium.contractIdFromAddress(Addresses.cheng), - ansd: alephium.contractIdFromAddress(Addresses.ansd) -} - async function ayinTvlForXAyin() { const results = await alephium.contractMultiCall([ { group: 0, address: XAyinAddress, methodIndex: 3 }, @@ -49,35 +30,18 @@ async function ayinTvlForXAyin() { return (Number(totalSupply) / 1e18) * (Number(currentPrice) / 1e18) } -async function tvl() { +async function tvl(api) { const alphTvls = await Promise.all([ Addresses.alphAyinPool, Addresses.alphUsdtPool, Addresses.alphUsdcPool, Addresses.alphWethPool, Addresses.alphApadPool, Addresses.alphChengPool, Addresses.alphAnsdPool, Addresses.alphAlphagaPool ].map(poolAddress => alephium.getAlphBalance(poolAddress))) const alphTvl = alphTvls.reduce((tvl, res) => tvl + Number(res.balance), 0) - const tokensTvls = await Promise.all([ - Addresses.alphAyinPool, Addresses.alphUsdtPool, Addresses.alphWethPool, Addresses.ayinUsdtPool, - Addresses.ayinUsdcPool,Addresses.alphWbtcPool, Addresses.usdtUsdcPool,Addresses.alphApadPool, Addresses.alphChengPool, Addresses.ayinApadPool, Addresses.alphAnsdPool, Addresses.alphAlphagaPool - ].map(poolAddress => alephium.getTokensBalance(poolAddress))) - const tokensTvl = tokensTvls.reduce((res, tokenTvls) => { + api.add(alephId, alphTvl) + const tokensTvls = await Promise.all(Object.values(Addresses).map(poolAddress => alephium.getTokensBalance(poolAddress))) + tokensTvls.forEach((tokenTvls) => { tokenTvls.forEach(tokenTvl => { - if (res[tokenTvl.tokenId] !== undefined) { - res[tokenTvl.tokenId] = Number(res[tokenTvl.tokenId]) + Number(tokenTvl.balance) - } + api.add(tokenTvl.tokenId, tokenTvl.balance) }); - return res - }, { [TokenIds.ayin]: 0, [TokenIds.usdt]: 0, [TokenIds.weth]: 0, [TokenIds.wbtc]: 0, [TokenIds.usdc]: 0, [TokenIds.apad]: 0, [TokenIds.cheng]: 0, [TokenIds.ansd]: 0, [TokenIds.ansd]: 0, [TokenIds.alphaga]: 0 }) - return { - alephium: alphTvl / 1e18, - ayin: tokensTvl[TokenIds.ayin] / 1e18, - weth: tokensTvl[TokenIds.weth] / 1e18, - tether: tokensTvl[TokenIds.usdt] / 1e6, - usdc: tokensTvl[TokenIds.usdc] / 1e6, - bitcoin: tokensTvl[TokenIds.wbtc] / 1e8, - alphpad: tokensTvl[TokenIds.apad] / 1e18, - gigacheng: tokensTvl[TokenIds.cheng] / 1e6, - alephiumdomains: tokensTvl[TokenIds.ansd] / 1e18, - alphaga: tokensTvl[TokenIds.alphaga] / 1e18 - } + }) } async function staking() { diff --git a/projects/b14g/index.js b/projects/b14g/index.js new file mode 100644 index 0000000000..eee96df07d --- /dev/null +++ b/projects/b14g/index.js @@ -0,0 +1,27 @@ +const { getLogs2 } = require("../helper/cache/getLogs"); +const { sumTokens } = require("../helper/chain/bitcoin"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +module.exports = { + core: { + tvl: async function tvl(api) { + const logs = await getLogs2({ + api, + target: "0x04EA61C431F7934d51fEd2aCb2c5F942213f8967", + eventAbi: 'event CreateRewardReceiver(address indexed from, address indexed rewardReceiver, uint256 portion, uint256 time)', + fromBlock: 19942300, + }) + const receiverRewards = logs.map(i => i.rewardReceiver) + const coreStakeAmounts = await api.multiCall({ abi: 'uint256:totalCoreStake', calls: receiverRewards }) + api.addGasToken(coreStakeAmounts) + } + }, + bitcoin: { + tvl: async () => { + let owners = await bitcoinAddressBook.b14g() + return sumTokens({ owners }) + } + } +} + + diff --git a/projects/babena/index.js b/projects/babena/index.js index 838dc98444..ab91127e72 100644 --- a/projects/babena/index.js +++ b/projects/babena/index.js @@ -104,9 +104,10 @@ async function stakingfetch() { module.exports = { timetravel: false, misrepresentedTokens: true, + // deadFrom: '2024-08-30', kadena: { - tvl: fetch, - staking: stakingfetch + tvl: () => ({}), + staking: () => ({}) } } \ No newline at end of file diff --git a/projects/babylon/index.js b/projects/babylon/index.js new file mode 100644 index 0000000000..356632dfbc --- /dev/null +++ b/projects/babylon/index.js @@ -0,0 +1,21 @@ +const axios = require('axios'); + +async function tvl(api) { + const response = await axios.get('https://staking-api.babylonlabs.io/v1/stats'); + const activeTvlSatoshis = response.data.data.active_tvl; + const activeTvlBitcoin = activeTvlSatoshis / 1e8; + + if (activeTvlBitcoin > 0) + api.addCGToken('bitcoin', activeTvlBitcoin) + else + throw new Error('Babylon: Invalid TVL value'); +} + +module.exports = { + methodology: 'TVL is fetched from Babylon’s Staking API and represents the total Bitcoin locked in the Babylon staking protocol.', + start: '2024-08-22', + timetravel: false, + bitcoin: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/backbonelabs/index.js b/projects/backbonelabs/index.js index f4d583c320..8e53eda9be 100644 --- a/projects/backbonelabs/index.js +++ b/projects/backbonelabs/index.js @@ -2,21 +2,21 @@ const { queryContract: queryContractCosmos } = require("../helper/chain/cosmos") const ADDRESSES = require('../helper/coreAssets.json') const config = { - terra2: { - token: ADDRESSES.terra2.LUNA, - hub: "terra1l2nd99yze5fszmhl5svyh5fky9wm4nz4etlgnztfu4e8809gd52q04n3ea", - boneToken: "terra17aj4ty4sz4yhgm08na8drc0v03v2jwr3waxcqrwhajj729zhl7zqnpc0ml", - }, - migaloo: { - token: ADDRESSES.migaloo.WHALE, - hub: "migaloo1mf6ptkssddfmxvhdx0ech0k03ktp6kf9yk59renau2gvht3nq2gqdhts4u", - boneToken: "factory/migaloo1mf6ptkssddfmxvhdx0ech0k03ktp6kf9yk59renau2gvht3nq2gqdhts4u/boneWhale" + archway: { + token: ADDRESSES.archway.ARCH, + hub: "archway12ejj99vkawuxfv0rg9l08hsun35juc6evprracmpe3mka3lsk5fqpjxhgl", + boneToken: "archway12yurzx8zynv3ck7uh4tucre48tqsm4fac4hfk9p3l24qs2cn08dqr684cg" }, chihuahua: { token: ADDRESSES.chihuahua.HUAHUA, hub: "chihuahua1psf89r2g9vdlttrjphspcpzzfx87r2r4nl5fg703ky42mp2706wsw5330f", boneToken: "chihuahua1jz5n4aynhpxx7clf2m8hrv9dp5nz83k67fgaxhy4p9dfwl6zssrq3ymr6w" }, + injective: { + token: ADDRESSES.injective.INJ, + hub: "inj1dxp690rd86xltejgfq2fa7f2nxtgmm5cer3hvu", + boneToken: "factory/inj1dxp690rd86xltejgfq2fa7f2nxtgmm5cer3hvu/bINJ" + }, juno: { token: ADDRESSES.juno.JUNO, hub: "juno102at0mu2xeluyw9efg257yy6pyhv088qqhmp4f8wszqcwxnpdcgqsfq0nv", @@ -27,10 +27,20 @@ const config = { hub: "kujira15e8q5wzlk5k38gjxlhse3vu6vqnafysncx2ltexd6y9gx50vuj2qpt7dgv", boneToken: "factory/kujira15e8q5wzlk5k38gjxlhse3vu6vqnafysncx2ltexd6y9gx50vuj2qpt7dgv/boneKuji" }, + migaloo: { + token: ADDRESSES.migaloo.WHALE, + hub: "migaloo1mf6ptkssddfmxvhdx0ech0k03ktp6kf9yk59renau2gvht3nq2gqdhts4u", + boneToken: "factory/migaloo1mf6ptkssddfmxvhdx0ech0k03ktp6kf9yk59renau2gvht3nq2gqdhts4u/boneWhale" + }, osmosis: { token: ADDRESSES.osmosis.OSMO, hub: "osmo1s3l0lcqc7tu0vpj6wdjz9wqpxv8nk6eraevje4fuwkyjnwuy82qsx3lduv", boneToken: "factory/osmo1s3l0lcqc7tu0vpj6wdjz9wqpxv8nk6eraevje4fuwkyjnwuy82qsx3lduv/boneOsmo" + }, + terra2: { + token: ADDRESSES.terra2.LUNA, + hub: "terra1l2nd99yze5fszmhl5svyh5fky9wm4nz4etlgnztfu4e8809gd52q04n3ea", + boneToken: "terra17aj4ty4sz4yhgm08na8drc0v03v2jwr3waxcqrwhajj729zhl7zqnpc0ml", } }; diff --git a/projects/bagel-finance/index.js b/projects/bagel-finance/index.js index 78510c9e78..7269ac6f90 100644 --- a/projects/bagel-finance/index.js +++ b/projects/bagel-finance/index.js @@ -221,6 +221,6 @@ async function tvl(timestamp, ethBlock, chainBlocks) { } module.exports = { - start: 1602054167, + start: '2020-10-07', bsc: { tvl }, }; diff --git a/projects/bagful/index.js b/projects/bagful/index.js new file mode 100644 index 0000000000..f9543aa99f --- /dev/null +++ b/projects/bagful/index.js @@ -0,0 +1,25 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +const AGGREGATOR = "0x6bD057Dae9aA5aE05c782F2eB988CBdE53Be9620"; + + +async function tvl(api) { + let pools = await api.call({ abi: abiInfo.poolTvls, target: AGGREGATOR }); + pools.forEach(pool=>{ + api.add(pool.poolAssets,pool.tvl) + }) + return await sumTokens2({api,resolveLP:true}) +} + + +module.exports = { +doublecounted: true, + linea: { + tvl, + }, +}; + +const abiInfo = { + poolTvls: + "function getPoolTotalTvl() view returns (tuple(uint256 pid, address poolAddress,address poolAssets, uint256 tvl)[])", +}; diff --git a/projects/bahamut-dex/index.js b/projects/bahamut-dex/index.js new file mode 100644 index 0000000000..7d68b7cf2f --- /dev/null +++ b/projects/bahamut-dex/index.js @@ -0,0 +1,3 @@ +const { uniTvlExport } = require('../helper/unknownTokens'); + +module.exports = uniTvlExport('ftn', '0x63D19A275fd468aA5A29FAc7B14697Ca0b5B3315') diff --git a/projects/bakerfi/index.js b/projects/bakerfi/index.js index 11aaf5cb15..ee598baa7f 100644 --- a/projects/bakerfi/index.js +++ b/projects/bakerfi/index.js @@ -1,24 +1,31 @@ const config = { "arbitrum": { - vaults: ["0x5c1b2312FaE6c0d61B6A15A8093842E9fE5b1e44"] + vaults: ["0x4c6d58749126FEBb1D28E8B8FdE97DC3107996d3"] }, base: { - vaults: ["0x37327c99bBc522e677a97d01021dB20227faF60A"] + vaults: ["0x37327c99bBc522e677a97d01021dB20227faF60A", "0x892022FE1431fdE03836725BBD0f0380e21E2095"] + }, + ethereum: { + vaults: ["0x01280b3683fE20Dc9cCF4D9526418F252871E4F7"] }, } async function getVaultTVL(api, vaults) { - const bals = await api.multiCall({ abi: 'uint256:totalAssets', calls: vaults }) - api.addGasToken(bals) + const bals = await api.multiCall({ + abi: "uint256:totalAssets", + calls: vaults, + }); + api.addGasToken(bals); } module.exports = { - methodology: 'Counts the number of assets that are deployed through the protocol', -} + methodology: + "Counts the number of assets that are deployed through the protocol", +}; -Object.keys(config).forEach(chain => { - const { vaults = [] } = config[chain] +Object.keys(config).forEach((chain) => { + const { vaults = [] } = config[chain]; module.exports[chain] = { tvl: async (api) => await getVaultTVL(api, vaults), - } -}) + }; +}); diff --git a/projects/baklava-space/index.js b/projects/baklava-space/index.js index abcb3083ff..976b87a6e1 100644 --- a/projects/baklava-space/index.js +++ b/projects/baklava-space/index.js @@ -38,7 +38,18 @@ const config = { '0x49AF8CAf88CFc8394FcF08Cf997f69Cee2105f2b', '0x83B2D994A1d16E6A3A44281D12542E2bc0d5EBFD', '0xea505C49B43CD0F9Ed3b40D77CAF1e32b0097328', - '0xc5DFb9698440Eaeb0A7C9dAA5a795e9B48CacadF' + '0xc5DFb9698440Eaeb0A7C9dAA5a795e9B48CacadF', + '0x6067776741a82Ad90Dff7e8D9af495F245b71782', + '0x0324a1a68d6Ef3C5037DCc5a305F941eD240197A', + '0x21c502F430A0Ff9Cbc37dcb60a0528e8C76d559f', + '0x3C27C6a8cD5A60dE337772c2c441fF83279d5855', + '0xFefa438D90227Bb6312b0846a28787Db8A0f0c2A', + '0xf81Ac49CEeA834deC340aB08a544fB1E79d44c31', + '0xed1031885D7DE7DB78BE921F5FeAacD3f6E9a127', + '0x9bD9b6600eeE5f8318913cCb17BF836E1e9d2f4F', + '0x25F0Bc213ED49ABe3AD36CB8D0919A138d19b648', + '0x59639E20A17EaD110aaBAF249001Ab140917C18e', + '0x90011B2AB095c9a9f70a8eBEe21313FB3989029f' // CLM pool(Not calculated by defillama) ], bsc: [ '0x6659B42C106222a50EE555F76BaD09b68EC056f9', diff --git a/projects/balanced/helper.js b/projects/balanced/helper.js index 68a9223e44..6e487e6465 100644 --- a/projects/balanced/helper.js +++ b/projects/balanced/helper.js @@ -41,7 +41,10 @@ const networkIdentifiers = { "archway-1": "archway", "injective-1/inj": "injective", "0xa4b1.arbitrum": "arbitrum", - "0x2105.base": "base" + "0x2105.base": "base", + "sui": "sui", + "solana" : "solana", + "stellar" : "stellar" } // Get decimals of cross-chain Balanced assets in balancedAssetManagerContract diff --git a/projects/balanced/index.js b/projects/balanced/index.js index bfa389909e..ef9b6cbbf4 100644 --- a/projects/balanced/index.js +++ b/projects/balanced/index.js @@ -19,7 +19,7 @@ async function tvl(api) { // https://github.com/balancednetwork/balanced-java-contracts/wiki/Contract-Addresses // https://github.com/DefiLlama/DefiLlama-Adapters/pull/9857#issuecomment-2060842344 module.exports = { - methodology: 'TVL consists of liquidity on the DEX, deposits made to the lending program and the stability fund. Data is pulled from the ICX API "https://ctz.solidwallet.io/api/v3" and Balanced stats API "https://balanced.sudoblock.io/api/v1/docs', + methodology: "TVL: The total liquidity held on the Balanced exchange and in the Stability Fund. Fees: Collected from traders", icon: { tvl }, @@ -41,4 +41,13 @@ module.exports = { arbitrum: { tvl: async () => await computeTVL("arbitrum"), }, + sui: { + tvl: async () => await computeTVL("sui"), + }, + solana: { + tvl: async () => await computeTVL("solana"), + }, + stellar: { + tvl: async () => await computeTVL("stellar"), + } }; diff --git a/projects/balancer-cow-amm/index.js b/projects/balancer-cow-amm/index.js index 35c72404d9..f9e8053eee 100644 --- a/projects/balancer-cow-amm/index.js +++ b/projects/balancer-cow-amm/index.js @@ -10,6 +10,9 @@ const config = { ['0x703Bd8115E6F21a37BB5Df97f78614ca72Ad7624', 35259725], ['0x7573B99BC09c11Dc0427fb9c6662bc603E008304', 35163914], ], + arbitrum: [ + ['0xE0e2Ba143EE5268DA87D529949a2521115987302', 248291297 ] + ] } Object.keys(config).forEach(chain => { diff --git a/projects/balancer-v3/index.js b/projects/balancer-v3/index.js new file mode 100644 index 0000000000..248757e14d --- /dev/null +++ b/projects/balancer-v3/index.js @@ -0,0 +1,13 @@ +const { v3Tvl } = require("../helper/balancer") + +const config = { + xdai: { vault: '0xbA1333333333a1BA1108E8412f11850A5C319bA9', fromBlock: 37360338 }, + ethereum: { vault: '0xbA1333333333a1BA1108E8412f11850A5C319bA9', fromBlock: 21332121 }, +} + +Object.keys(config).forEach(chain => { + const {vault, fromBlock,} = config[chain] + module.exports[chain] = { + tvl: v3Tvl(vault, fromBlock) + } +}) \ No newline at end of file diff --git a/projects/banano/index.js b/projects/banano/index.js index 8adc696432..c58390a92f 100644 --- a/projects/banano/index.js +++ b/projects/banano/index.js @@ -1,5 +1,4 @@ -const { pool2BalanceFromMasterChefExports} = require("../helper/pool2.js"); -const masterchefAbi = require("../helper/abis/masterchef.json"); +const { sumTokens2 } = require("../helper/unwrapLPs.js"); //Polygon and BSC staking contracts const polygonContract = "0xefa4aED9Cf41A8A0FcdA4e88EfA2F60675bAeC9F"; @@ -12,11 +11,16 @@ module.exports = { methodology: 'Pool2 TVL in Polygon and BSC LPs', polygon: { tvl: async ()=>({}), - pool2: pool2BalanceFromMasterChefExports(polygonContract, ban, "polygon", addr=>`polygon:${addr}`, masterchefAbi.poolInfo) + pool2: tvl, }, bsc: { tvl: async ()=>({}), - pool2: pool2BalanceFromMasterChefExports(bscContract, ban, "bsc", addr=>`bsc:${addr}`, masterchefAbi.poolInfo) + pool2: tvl, }, } +async function tvl(api) { + const contract = api.chain === 'bsc' ? bscContract : polygonContract; + const tokens = await api.fetchList({ lengthAbi: 'poolLength', itemAbi:'function poolInfo(uint256) view returns (address stakingToken , uint256 stakingTokenTotalAmount , uint256 accWBANPerShare , uint32 lastRewardTime , uint16 allocPoint )' , target: contract}) + return sumTokens2({ api, tokens: tokens.map(i => i.stakingToken), owner: contract, resolveLP: true}) +} \ No newline at end of file diff --git a/projects/bancor/index.js b/projects/bancor/index.js index 835254bea2..de79d14ade 100644 --- a/projects/bancor/index.js +++ b/projects/bancor/index.js @@ -42,7 +42,7 @@ async function generateCallsByBlockchain(api) { } module.exports = { - start: 1501632000, // 08/02/2017 @ 12:00am (UTC) + start: '2017-08-02', // 08/02/2017 @ 12:00am (UTC) ethereum: { tvl: generateCallsByBlockchain, }, diff --git a/projects/bancor/v3.js b/projects/bancor/v3.js index 266cd459a2..b0ee44a90b 100644 --- a/projects/bancor/v3.js +++ b/projects/bancor/v3.js @@ -12,7 +12,7 @@ async function addV3Balance(api) { } module.exports = { - start: 1650283200, // 18/04/2022 @ 1:00pm (UTC) + start: '2022-04-18', // 18/04/2022 @ 1:00pm (UTC) methodology: `Counts the tokens in the Master Vault Contract.`, ethereum: { tvl: addV3Balance, diff --git a/projects/bank-ai/index.js b/projects/bank-ai/index.js index b50971fb18..4444b6cbd7 100644 --- a/projects/bank-ai/index.js +++ b/projects/bank-ai/index.js @@ -3,6 +3,6 @@ const { staking } = require('../helper/staking') module.exports = { ethereum: { tvl: () => ({}), - staking: staking("0x140Fae0A43190A3D0Cbf8DBdB347200EB84E81d1", "0xf19693068120185664E211F619c4F0530cE07088") + staking: staking("0x804Bd4F1c9B5D7864d6F215644fb931349EEACA2", "0xe18ab3568fa19e0ed38bc1d974eddd501e61e12d") } } \ No newline at end of file diff --git a/projects/banx/index.js b/projects/banx/index.js index 02c5ddea41..f39198dd44 100644 --- a/projects/banx/index.js +++ b/projects/banx/index.js @@ -1,5 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { Program, } = require("@project-serum/anchor"); +const { Program } = require('@coral-xyz/anchor'); const { getConfig } = require('../helper/cache') const { bs58 } = require('@project-serum/anchor/dist/cjs/utils/bytes'); const { getProvider } = require('../helper/solana') @@ -11,28 +11,26 @@ async function getData() { return data async function getAllData() { - const programId = '4tdmkuY6EStxbS6Y8s5ueznL3VPMSugrvQuDeAHGZhSt' const provider = getProvider() const idl = await getConfig('banx-idl', 'https://api.banx.gg/idl') - const program = new Program(idl, programId, provider) + const program = new Program(idl, provider) - const bondOfferOffset = 32 + 8; const bondTradeTxnOffset = 8; + const userVaultOffset = 8; const [ - bondOffers, bondTradeTxn, + userVaults, ] = await Promise.all([ - getFilteredAccounts(program, 'bondOfferV3', bondOfferOffset, [5, 7,]), - getFilteredAccounts(program, 'bondTradeTransactionV3', bondTradeTxnOffset, [2, 6, 9]), - ]) + getFilteredAccounts(program, 'bondTradeTransactionV3', bondTradeTxnOffset, [2, 6, 9, 13]), + getFilteredAccounts(program, 'userVault', userVaultOffset, [1]), + ]); - // OffersSum is sum of sol in pools not yet lent out. The borrowedSum is the sum of SOL which has been borrowed and overcollaterized by the value of locked NFTs - const { offersSum, offersSumUsdc } = bondOffers.reduce(({ offersSum, offersSumUsdc }, offer) => { - if (offer.account.bondingCurve.bondingType.linearUsdc || offer.account.bondingCurve.bondingType.exponentialUsdc) { - return { offersSumUsdc: offersSumUsdc + (+offer.account.fundsSolOrTokenBalance) + Math.max(0, +offer.account.bidSettlement), offersSum }; + const { escrowSum, escrowSumUsdc } = userVaults.reduce(({ escrowSum, escrowSumUsdc }, userVault) => { + if (userVault.account.lendingTokenType.usdc) { + return { escrowSum, escrowSumUsdc: escrowSumUsdc + (+userVault.account.offerLiquidityAmount) } } - return { offersSum: offersSum + (+offer.account.fundsSolOrTokenBalance) + Math.max(0, +offer.account.bidSettlement), offersSumUsdc }; - }, { offersSum: 0, offersSumUsdc: 0 }); + return { escrowSum: escrowSum + (+userVault.account.offerLiquidityAmount), escrowSumUsdc } + }, { escrowSum: 0, escrowSumUsdc: 0 }) const { borrowedSum, borrowedSumUsdc } = bondTradeTxn.reduce(({ borrowedSum, borrowedSumUsdc }, bondTxn) => { if (bondTxn.account.lendingToken.usdc) { @@ -42,7 +40,7 @@ async function getData() { }, { borrowedSum: 0, borrowedSumUsdc: 0 }); - return { tvl: offersSum, tvlUsdc: offersSumUsdc, borrowed: borrowedSum, borrowedUsdc: borrowedSumUsdc } + return { tvl: escrowSum, tvlUsdc: escrowSumUsdc, borrowed: borrowedSum, borrowedUsdc: borrowedSumUsdc } } } diff --git a/projects/bao-baskets/index.js b/projects/bao-baskets/index.js index 648acd30ef..3c7df95e49 100644 --- a/projects/bao-baskets/index.js +++ b/projects/bao-baskets/index.js @@ -20,7 +20,7 @@ const basketTvl = async (api) => { } module.exports = { - start: 1640995200, // Jan 1 2022 00:00:00 GMT+0000 + start: '2022-01-01', // Jan 1 2022 00:00:00 GMT+0000 ethereum: { tvl: basketTvl, pool2: sumTokensExport({ diff --git a/projects/bao-markets/index.js b/projects/bao-markets/index.js index d92caa764f..8d30950c58 100644 --- a/projects/bao-markets/index.js +++ b/projects/bao-markets/index.js @@ -4,7 +4,7 @@ const { compoundExports } = require("../helper/compound"); // BaoMarkets const comptroller = "0x0Be1fdC1E87127c4fe7C05bAE6437e3cf90Bf8d8"; -const compoundTvl = compoundExports(comptroller, undefined, '0xf635fdf9b36b557bd281aa02fdfaebec04cd084a', nullAddress, undefined, undefined, { blacklistedTokens: ['0xe7a52262c1934951207c5fc7a944a82d283c83e5', '0xc0601094C0C88264Ba285fEf0a1b00eF13e79347', ]}) +const compoundTvl = compoundExports(comptroller, '0xf635fdf9b36b557bd281aa02fdfaebec04cd084a', nullAddress, { blacklistedTokens: ['0xe7a52262c1934951207c5fc7a944a82d283c83e5', '0xc0601094C0C88264Ba285fEf0a1b00eF13e79347', ]}) module.exports = { ethereum: compoundTvl diff --git a/projects/base3d/index.js b/projects/base3d/index.js index 938d138e4c..aa645787e4 100644 --- a/projects/base3d/index.js +++ b/projects/base3d/index.js @@ -10,5 +10,4 @@ module.exports = { tvl, }, methodology: 'Calculates TVL by checking the ETH balance of the main contract via the totalEthereumBalance function.', - start: 3331748, }; diff --git a/projects/basedai/index.js b/projects/basedai/index.js new file mode 100644 index 0000000000..fbdcdbf57a --- /dev/null +++ b/projects/basedai/index.js @@ -0,0 +1,12 @@ +const { staking } = require('../helper/staking'); + +module.exports = { + ethereum: { + tvl: () => ({}), + staking: staking( + "0xa6b816010ab51e088c4f19c71aba87e54b422e14", + "0xA9E8aCf069C58aEc8825542845Fd754e41a9489A" + ) + }, + methodology: "Currently, the TVL is considered as the amount of Pepecoin tokens held in the farming contract at '0xa6b816010ab51e088c4f19c71aba87e54b422e14'." +}; diff --git a/projects/basemax-finance/index.js b/projects/basemax-finance/index.js index 75051a460b..72d85d53fb 100644 --- a/projects/basemax-finance/index.js +++ b/projects/basemax-finance/index.js @@ -5,7 +5,6 @@ const LP = '0xd2eb1de935fe66501aece023b0437fa7b9c40a25' module.exports = { methodology: "Counts USDC deposited to trade and to mint BLP. Staking counts BSM and esBSM deposited to earn esBSM", - start: 1700488, base: { tvl: staking("0xEDFFF5d0C68cFBd44FA12659Fd9AD55F04748874", ADDRESSES.base.USDbC), pool2: sumTokensExport({ owner: "0xe2cb504d51fd16d8bdf533c58553ed3f4f755f00", tokens: [LP], useDefaultCoreAssets: true, }), diff --git a/projects/baseswap/index.js b/projects/baseswap/index.js index 233217ac68..aad434ca44 100644 --- a/projects/baseswap/index.js +++ b/projects/baseswap/index.js @@ -2,7 +2,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const BSWAP = "0x78a087d713Be963Bf307b18F2Ff8122EF9A63ae9"; const FACTORY = "0xFDa619b6d20975be80A10332cD39b9a4b0FAa8BB" -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true, permitFailure: true }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, permitFailure: true }) module.exports = { diff --git a/projects/basic/index.js b/projects/basic/index.js new file mode 100644 index 0000000000..b542170fe7 --- /dev/null +++ b/projects/basic/index.js @@ -0,0 +1,10 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { compoundExports2 } = require("../helper/compound"); + +module.exports = { + iotex: compoundExports2({ + cether: '0x83C51de03f03C5E23f02F674dbD2032e164112Fc', + comptroller: '0x47D7B83947Aa12fEb95f5f55527Dc9B32E4ec009', + cetheEquivalent: ADDRESSES.iotex.WIOTX + }) +}; \ No newline at end of file diff --git a/projects/basilisk/index.js b/projects/basilisk/index.js index 2dd0f26c6e..37f4698f7f 100644 --- a/projects/basilisk/index.js +++ b/projects/basilisk/index.js @@ -4,6 +4,5 @@ module.exports = { era: compoundExports2({ comptroller: '0x4085f99720e699106bc483dAb6CAED171EdA8D15', cether: '0x1e8F1099a3fe6D2c1A960528394F4fEB8f8A288D', - fetchBalances: true, }) }; \ No newline at end of file diff --git a/projects/basin/index.js b/projects/basin/index.js index f7b341d6c7..7fb35d0280 100644 --- a/projects/basin/index.js +++ b/projects/basin/index.js @@ -1,34 +1,29 @@ -const { getLogs2 } = require('../helper/cache/getLogs'); - -// Aquifer -const FACTORY = "0xba51aaaa95aeefc1292515b36d86c51dc7877773"; -const BORE_WELL_ABI = "event BoreWell (address well, address implementation, address[] tokens, (address, bytes) wellFunction, (address, bytes)[] pumps, bytes wellData)"; - -const startBlocks = { - ethereum: 17977905 +const { cachedGraphQuery } = require('../helper/cache') +const chains = { + ethereum: { + startBlock: 17977905, + subgraphUrl: "https://graph.bean.money/basin_eth" + }, + arbitrum: { + startBlock: 261772155, + subgraphUrl: "https://graph.bean.money/basin" + } } -function chainTvl(chain) { - return async (api) => { - // Find all BoreWell events - const START_BLOCK = startBlocks[chain]; - const logs = await getLogs2({ - api, - target: FACTORY, - fromBlock: START_BLOCK, - eventAbi: BORE_WELL_ABI, - topics: ['0xff64a5823907c85a1e7c0400576024f76bd1640c74350033bd0d689f793202f2'], - }); - - const ownerTokens = logs.map(log => [log.tokens, log.well]) - return api.sumTokens({ ownerTokens }) - } +async function tvl(api) { + const { subgraphUrl } = chains[api.chain]; + const wells = await cachedGraphQuery('basin/' + api.chain, subgraphUrl, `{ + wells { + id tokens { id } + } + }`) + const ownerTokens = wells.wells.map(well => [well.tokens.map(t => t.id), well.id]); + return api.sumTokens({ ownerTokens }); } module.exports = { methodology: "Counts the value of token reserves inside all deployed Wells.", - start: 17977905, - ethereum: { - tvl: chainTvl('ethereum') - } + start: '2023-08-23', + ethereum: { tvl }, + arbitrum: { tvl } }; diff --git a/projects/bastion/index.js b/projects/bastion/index.js index 3436be4a57..78cae181c7 100644 --- a/projects/bastion/index.js +++ b/projects/bastion/index.js @@ -1,27 +1,14 @@ const { compoundExports } = require("../helper/compound"); -const sdk = require('@defillama/sdk') const mainHubExport = compoundExports( "0x6De54724e128274520606f038591A00C5E94a1F6", - "aurora", "0x4E8fE8fd314cFC09BDb0942c5adCC37431abDCD0", "0xc9bdeed33cd01541e1eed10f90519d2c06fe3feb" ); -const auroraRealmExport = compoundExports( - "0xA195b3d7AA34E47Fb2D2e5A682DF2d9EFA2daF06", - "aurora" -); - -const multiChainRealmExport = compoundExports( - "0xe1cf09BDa2e089c63330F0Ffe3F6D6b790835973", - "aurora" -); - -const stakedNearRealmExport = compoundExports( - "0xE550A886716241AFB7ee276e647207D7667e1E79", - "aurora" -); +const auroraRealmExport = compoundExports("0xA195b3d7AA34E47Fb2D2e5A682DF2d9EFA2daF06",); +const multiChainRealmExport = compoundExports("0xe1cf09BDa2e089c63330F0Ffe3F6D6b790835973",); +const stakedNearRealmExport = compoundExports("0xE550A886716241AFB7ee276e647207D7667e1E79",); const bastion = [ mainHubExport, @@ -31,22 +18,14 @@ const bastion = [ ]; module.exports = { - aurora: { + aurora: { tvl: async (...args) => { - let balances = {}; - const tvls = await Promise.all(bastion.map(realm => realm.tvl(...args))) - tvls.forEach(tvl => { - Object.keys(tvl).forEach(key => sdk.util.sumSingleBalance(balances, key, tvl[key])) - }) - return balances; + await Promise.all(bastion.map(realm => realm.tvl(...args))) + return args[0].getBalances(); }, borrowed: async (...args) => { - let balances = {}; - const tvls = await Promise.all(bastion.map(realm => realm.borrowed(...args))) - tvls.forEach(tvl => { - Object.keys(tvl).forEach(key => sdk.util.sumSingleBalance(balances, key, tvl[key])) - }) - return balances; + await Promise.all(bastion.map(realm => realm.borrowed(...args))) + return args[0].getBalances(); }, }, }; \ No newline at end of file diff --git a/projects/baton/index.js b/projects/baton/index.js index 9338d62f64..0a6619c07d 100644 --- a/projects/baton/index.js +++ b/projects/baton/index.js @@ -36,7 +36,6 @@ module.exports = { misrepresentedTokens: true, methodology: "Sums the total staked in baton farms and the total amount of tokens deposited as yield farming rewards.", - start: 17411300, ethereum: { tvl } diff --git a/projects/bb-club-cdp/index.js b/projects/bb-club-cdp/index.js new file mode 100644 index 0000000000..f9c3ddabb7 --- /dev/null +++ b/projects/bb-club-cdp/index.js @@ -0,0 +1,7 @@ +const { sumTokensExport } = require('../helper/unwrapLPs'); + +module.exports = { + bouncebit: { + tvl: sumTokensExport({ owner: '0xdE1F1Ff02D565E554E63AEfe80cB6818eAaCD6A8', token: '0xF5e11df1ebCf78b6b6D26E04FF19cD786a1e81dC'}), + } +} \ No newline at end of file diff --git a/projects/bb-club-farm/index.js b/projects/bb-club-farm/index.js new file mode 100644 index 0000000000..c483544065 --- /dev/null +++ b/projects/bb-club-farm/index.js @@ -0,0 +1,15 @@ +const { stakingUnknownPricedLP } = require("../helper/staking"); +const BBTC = '0xF5e11df1ebCf78b6b6D26E04FF19cD786a1e81dC' +const stakingLNNGAddress= '0x997A1C457acB020CF668BB7d6f05A184854CD3ca' +const LNNGLPAddress = '0x2d2011408d0E76c521Cf6169E004c8BF893Af34E' + +async function tvl(api) { + return api.sumTokens({owners: ['0x05407cAe9FdaF5e8cC395089207E2E72b8Ae739b'], tokens: [BBTC], api }) +} + +module.exports = { + bouncebit: { + tvl, + staking: stakingUnknownPricedLP(stakingLNNGAddress, LNNGLPAddress, "bouncebit", LNNGLPAddress) + } +} \ No newline at end of file diff --git a/projects/bb-club-meme/index.js b/projects/bb-club-meme/index.js new file mode 100644 index 0000000000..961da573e7 --- /dev/null +++ b/projects/bb-club-meme/index.js @@ -0,0 +1,13 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +async function tvl(api) { + const factory = '0x0dB9ea3c097fC9fD709da54aA1eFcd6FFb3DdE2C'; + const memeCoins = await api.fetchList({ lengthAbi: 'allPairsLength', itemAbi: 'allPairs', target: factory }) + return api.sumTokens({owners: memeCoins, tokens: [ADDRESSES.null] }) +} + +module.exports = { + bouncebit: { + tvl + } +} \ No newline at end of file diff --git a/projects/bb-club-quanto/index.js b/projects/bb-club-quanto/index.js new file mode 100644 index 0000000000..e5f76ca482 --- /dev/null +++ b/projects/bb-club-quanto/index.js @@ -0,0 +1,7 @@ +const { sumTokensExport } = require('../helper/unwrapLPs'); + +module.exports = { + bouncebit: { + tvl: sumTokensExport({ owner: '0xA19237FFc49D1b71f00DA1a82cfF79CE7789f74A', token: '0xF4c20e5004C6FDCDdA920bDD491ba8C98a9c5863'}) + } +} \ No newline at end of file diff --git a/projects/bb-club-restaking/index.js b/projects/bb-club-restaking/index.js new file mode 100644 index 0000000000..3460141dff --- /dev/null +++ b/projects/bb-club-restaking/index.js @@ -0,0 +1,13 @@ +const BBTC = '0xF5e11df1ebCf78b6b6D26E04FF19cD786a1e81dC' + +async function BTCFIStaking(api) { + const totalStake = await api.call({abi: 'uint256:totalStaked', target: '0x0d5d4599eb4f48df6aeaf2f3c814f5a5302931e5'}) + api.add(BBTC, totalStake) +} + + +module.exports = { + bouncebit: { + tvl: BTCFIStaking + } +} \ No newline at end of file diff --git a/projects/bbbpump/index.js b/projects/bbbpump/index.js new file mode 100644 index 0000000000..3b818bdba1 --- /dev/null +++ b/projects/bbbpump/index.js @@ -0,0 +1,25 @@ +const { nullAddress } = require('../helper/unwrapLPs'); +const { stakingPricedLP } = require("../helper/staking"); + +// Contract addresses +const MegadropBBB = "0x37c00AE5C4b49Ab0F5fD2FFB1033588e9bC33B08"; // Megadrop BBB +const BBB = "0xfa4ddcfa8e3d0475f544d0de469277cf6e0a6fd1"; // BBB Token +const XDC_BBB_LP = "0x95ab47ff0056cdc81a42b35d96551d9c5534947d"; // XDC-BBB LP Token +const BBBPump = "0x2E24BFdE1EEDa0F1EA3E57Ba7Ff10ac6516ab5Ec"; // BBBPump + +async function bbbPumpTvl(api) { + return api.sumTokens({ + tokensAndOwners2: [ + [nullAddress], + [BBBPump] + ] + }); +} + +module.exports = { + start: '2024-10-10', + xdc: { + tvl: bbbPumpTvl, + staking: stakingPricedLP(MegadropBBB, BBB, "xdc", XDC_BBB_LP, "wrapped-xdc"), + }, +}; \ No newline at end of file diff --git a/projects/beam-dex/index.js b/projects/beam-dex/index.js new file mode 100644 index 0000000000..98f9d2a3c5 --- /dev/null +++ b/projects/beam-dex/index.js @@ -0,0 +1,4 @@ +const { uniV3Export } = require('../helper/uniswapV3') +module.exports = uniV3Export({ + zeta: { factory: '0x28b5244B6CA7Cb07f2f7F40edE944c07C2395603', fromBlock: 5320498, isAlgebra: true } +}) diff --git a/projects/bean/index.js b/projects/bean/index.js index f66b1d4a50..76cb7ebb4f 100644 --- a/projects/bean/index.js +++ b/projects/bean/index.js @@ -1,21 +1,41 @@ const ADDRESSES = require('../helper/coreAssets.json') -const BEANSTALK = "0xc1e088fc1323b20bcbee9bd1b9fc9546db5624c5"; - -const BEAN_ERC20_V1 = "0xdc59ac4fefa32293a95889dc396682858d52e5db"; -const BEANETH_V1 = "0x87898263b6c5babe34b4ec53f22d98430b91e371"; -const BEAN3CRV_V1 = "0x3a70dfa7d2262988064a2d051dd47521e43c9bdd"; -const BEANLUSD_V1 = "0xd652c40fbb3f06d6b58cb9aa9cff063ee63d465d"; - -const BEAN_ERC20 = "0xbea0000029ad1c77d3d5d23ba2d8893db9d1efab"; -const UNRIPE_BEAN_ERC20 = "0x1bea0050e63e05fbb5d8ba2f10cf5800b6224449"; -const UNRIPE_LP_ERC20 = "0x1bea3ccd22f4ebd3d37d731ba31eeca95713716d"; -const BEAN3CRV_V2 = "0xc9c32cd16bf7efb85ff14e0c8603cc90f6f2ee49"; -const BEANETH_V2 = "0xbea0e11282e2bb5893bece110cf199501e872bad"; - -// Underlying non-bean tokens -const WETH = ADDRESSES.ethereum.WETH; -const CRV3 = "0x6c3f90f043a72fa612cbac8115ee7e52bde6e490"; -const LUSD = ADDRESSES.ethereum.LUSD; +const ADDR = { + ethereum: { + BEANSTALK: "0xc1e088fc1323b20bcbee9bd1b9fc9546db5624c5", + BEAN_ERC20_V1: "0xdc59ac4fefa32293a95889dc396682858d52e5db", + BEANETH_V1: "0x87898263b6c5babe34b4ec53f22d98430b91e371", + BEAN3CRV_V1: "0x3a70dfa7d2262988064a2d051dd47521e43c9bdd", + BEANLUSD_V1: "0xd652c40fbb3f06d6b58cb9aa9cff063ee63d465d", + BEAN_ERC20: "0xbea0000029ad1c77d3d5d23ba2d8893db9d1efab", + UNRIPE_BEAN_ERC20: "0x1bea0050e63e05fbb5d8ba2f10cf5800b6224449", + UNRIPE_LP_ERC20: "0x1bea3ccd22f4ebd3d37d731ba31eeca95713716d", + BEAN3CRV_V2: "0xc9c32cd16bf7efb85ff14e0c8603cc90f6f2ee49", + BEANETH_V2: "0xbea0e11282e2bb5893bece110cf199501e872bad", + // Underlying non-bean tokens + WETH: ADDRESSES.ethereum.WETH, + CRV3: "0x6c3f90f043a72fa612cbac8115ee7e52bde6e490", + LUSD: ADDRESSES.ethereum.LUSD + }, + arbitrum: { + BEANSTALK: "0xd1a0060ba708bc4bcd3da6c37efa8dedf015fb70", + BEAN_ERC20: "0xbea0005b8599265d41256905a9b3073d397812e4", + BEANWETH: "0xbea00aa8130acad047e137ec68693c005f8736ce", + BEANWSTETH: "0xbea00bbe8b5da39a3f57824a1a13ec2a8848d74f", + BEANWEETH: "0xbea00cc9f93e9a8ac0dfdff2d64ba38eb9c2e48c", + BEANWBTC: "0xbea00dde4b34acdcb1a30442bd2b39ca8be1b09c", + BEANUSDC: "0xbea00ee04d8289aed04f92ea122a96dc76a91bd7", + BEANUSDT: "0xbea00ff437ca7e8354b174339643b4d1814bed33", + UNRIPE_BEAN_ERC20: "0x1bea054dddbca12889e07b3e076f511bf1d27543", + UNRIPE_LP_ERC20: "0x1bea059c3ea15f6c10be1c53d70c75fd1266d788", + // Underlying non-bean tokens + WETH: ADDRESSES.arbitrum.WETH, + WSTETH: ADDRESSES.arbitrum.WSTETH, + WEETH: "0x35751007a407ca6feffe80b3cb397736d2cf4dbe", + WBTC: ADDRESSES.arbitrum.WBTC, + USDC: ADDRESSES.arbitrum.USDC_CIRCLE, + USDT: ADDRESSES.arbitrum.USDT + } +}; /// REFERENCE BLOCKS TIMESTAMPS // Whitelist BEANETH_V1 12974075 1628288832 @@ -34,52 +54,96 @@ const LUSD = ADDRESSES.ethereum.LUSD; const EXPLOIT_TIME = 1650198256; const REPLANT_TIME = 1659657966; const BIP12_TIME = 1645038020; +const ARB_MIGRATION_TIME = 1728529200; // List of pools and time time periods they were valid within beanstalk const ALL_POOLS = { - [BEANETH_V1]: { - startTime: 1628288832, - endTime: EXPLOIT_TIME, - underlying: [BEAN_ERC20_V1, WETH] - }, - [BEAN3CRV_V1]: { - startTime: 1645038020, - endTime: EXPLOIT_TIME, - underlying: [BEAN_ERC20_V1, CRV3] - }, - [BEANLUSD_V1]: { - startTime: 1649451979, - endTime: EXPLOIT_TIME, - underlying: [BEAN_ERC20_V1, LUSD] - }, - [BEAN3CRV_V2]: { - startTime: 1659645914, - endTime: 999999999999, - // endTime: 1716407627, // Dewhitelisted upon BIP-45 deployment, but some tokens are still deposited and receive yield - underlying: [BEAN_ERC20, CRV3] + ethereum: { + [ADDR.ethereum.BEANETH_V1]: { + startTime: 1628288832, + endTime: EXPLOIT_TIME, + underlying: [ADDR.ethereum.BEAN_ERC20_V1, ADDR.ethereum.WETH] + }, + [ADDR.ethereum.BEAN3CRV_V1]: { + startTime: 1645038020, + endTime: EXPLOIT_TIME, + underlying: [ADDR.ethereum.BEAN_ERC20_V1, ADDR.ethereum.CRV3] + }, + [ADDR.ethereum.BEANLUSD_V1]: { + startTime: 1649451979, + endTime: EXPLOIT_TIME, + underlying: [ADDR.ethereum.BEAN_ERC20_V1, ADDR.ethereum.LUSD] + }, + [ADDR.ethereum.BEAN3CRV_V2]: { + startTime: 1659645914, + endTime: ARB_MIGRATION_TIME, + underlying: [ADDR.ethereum.BEAN_ERC20, ADDR.ethereum.CRV3] + }, + [ADDR.ethereum.BEANETH_V2]: { + startTime: 1693412759, + endTime: ARB_MIGRATION_TIME, + underlying: [ADDR.ethereum.BEAN_ERC20, ADDR.ethereum.WETH] + } }, - [BEANETH_V2]: { - startTime: 1693412759, - endTime: 999999999999, - underlying: [BEAN_ERC20, WETH] + arbitrum: { + [ADDR.arbitrum.BEANWETH]: { + startTime: ARB_MIGRATION_TIME, + endTime: 999999999999, + underlying: [ADDR.arbitrum.BEAN_ERC20, ADDR.arbitrum.WETH] + }, + [ADDR.arbitrum.BEANWSTETH]: { + startTime: ARB_MIGRATION_TIME, + endTime: 999999999999, + underlying: [ADDR.arbitrum.BEAN_ERC20, ADDR.arbitrum.WSTETH] + }, + [ADDR.arbitrum.BEANWEETH]: { + startTime: ARB_MIGRATION_TIME, + endTime: 999999999999, + underlying: [ADDR.arbitrum.BEAN_ERC20, ADDR.arbitrum.WEETH] + }, + [ADDR.arbitrum.BEANWBTC]: { + startTime: ARB_MIGRATION_TIME, + endTime: 999999999999, + underlying: [ADDR.arbitrum.BEAN_ERC20, ADDR.arbitrum.WBTC] + }, + [ADDR.arbitrum.BEANUSDC]: { + startTime: ARB_MIGRATION_TIME, + endTime: 999999999999, + underlying: [ADDR.arbitrum.BEAN_ERC20, ADDR.arbitrum.USDC] + }, + [ADDR.arbitrum.BEANUSDT]: { + startTime: ARB_MIGRATION_TIME, + endTime: 999999999999, + underlying: [ADDR.arbitrum.BEAN_ERC20, ADDR.arbitrum.USDT] + }, } }; +function invalidTime(api) { + if (api.chain === 'ethereum') { + return (api.timestamp >= EXPLOIT_TIME && api.timestamp <= REPLANT_TIME) || api.timestamp >= ARB_MIGRATION_TIME; + } else if (api.chain === 'arbitrum') { + return false; + } +} + // Returns the relevant tokens for the given timestamp function getBean(timestamp) { if (timestamp <= EXPLOIT_TIME) { - return BEAN_ERC20_V1; - } else if (timestamp >= REPLANT_TIME) { - return BEAN_ERC20; + return ADDR.ethereum.BEAN_ERC20_V1; + } else if ( timestamp <= ARB_MIGRATION_TIME) { + return ADDR.ethereum.BEAN_ERC20; + } else { + return ADDR.arbitrum.BEAN_ERC20; } - throw new Error("There was no Bean token during the requested timestamp"); } // Returns the relevant pools for the given timestamp -function getPools(timestamp) { +function getPools(api) { + const { chain, timestamp } = api; const pools = []; - for (const contract in ALL_POOLS) { - const pool = ALL_POOLS[contract]; + for (const contract in ALL_POOLS[chain]) { + const pool = ALL_POOLS[chain][contract]; if (timestamp >= pool.startTime && timestamp <= pool.endTime) { pools.push(contract); } @@ -100,14 +164,14 @@ async function getPoolReserves(api, pool) { pool = pool.toLowerCase(); const poolBalances = await api.multiCall({ - calls: (ALL_POOLS[pool] && ALL_POOLS[pool].underlying || []).map(token => ({ + calls: ALL_POOLS[api.chain][pool].underlying.map(token => ({ target: token, params: pool })), abi: 'erc20:balanceOf' }); - return poolBalances.map((balance, i) => ({ token: ALL_POOLS[pool].underlying[i], balance })); + return poolBalances.map((balance, i) => ({ token: ALL_POOLS[api.chain][pool].underlying[i], balance })); } // Returns the total silo'd amount of the requested token @@ -118,15 +182,15 @@ async function getSiloDeposited(api, token) { // Prior to BIP12, there was no generalized deposit getter result = await api.call({ abi: - token === BEAN_ERC20_V1 + token === ADDR.ethereum.BEAN_ERC20_V1 ? "function totalDepositedBeans() public view returns (uint256)" : "function totalDepositedLP() public view returns (uint256)", - target: BEANSTALK + target: ADDR[api.chain].BEANSTALK }); } else { result = await api.call({ abi: "function getTotalDeposited(address) external view returns (uint256)", - target: BEANSTALK, + target: ADDR[api.chain].BEANSTALK, params: token }); } @@ -164,12 +228,12 @@ async function getRipePooledBalances(api, unripeToken) { const [underlyingToken, underlyingPerUnripe, depositedUnripe] = await Promise.all([ api.call({ abi: "function getUnderlyingToken(address) external view returns (address)", - target: BEANSTALK, + target: ADDR[api.chain].BEANSTALK, params: unripeToken }), api.call({ abi: "function getUnderlyingPerUnripeToken(address) external view returns (uint256)", - target: BEANSTALK, + target: ADDR[api.chain].BEANSTALK, params: unripeToken }), getSiloDeposited(api, unripeToken), @@ -177,12 +241,13 @@ async function getRipePooledBalances(api, unripeToken) { // Add the underlying pooled token balances const underlyingAmount = underlyingPerUnripe * depositedUnripe / Math.pow(10, 6); - if (underlyingToken.toLowerCase() == BEAN_ERC20) { - ripePooledTokenBalances[BEAN_ERC20] = (ripePooledTokenBalances[BEAN_ERC20] ?? 0) + underlyingAmount; + const BEAN = ADDR[api.chain].BEAN_ERC20; + if (underlyingToken.toLowerCase() == BEAN) { + ripePooledTokenBalances[BEAN] = (ripePooledTokenBalances[BEAN] ?? 0) + underlyingAmount; } else { const underlyingSupply = await getTotalSupply(api, underlyingToken); const ratio = underlyingAmount / underlyingSupply; - const balances = await getPooledBalances(api, [underlyingToken], [ratio]); + const balances = await getPooledBalances(api, [underlyingToken.toLowerCase()], [ratio]); for (const token in balances) { ripePooledTokenBalances[token] = (ripePooledTokenBalances[token] ?? 0) + balances[token]; } @@ -192,7 +257,7 @@ async function getRipePooledBalances(api, unripeToken) { // Beans deposited in the silo async function staking(api) { - if (api.timestamp >= EXPLOIT_TIME && api.timestamp <= REPLANT_TIME) { + if (invalidTime(api)) { return {}; } @@ -200,23 +265,23 @@ async function staking(api) { const bean = getBean(api.timestamp); const [siloBeans, unripeSiloBeans] = await Promise.all([ getSiloDeposited(api, bean), - getRipePooledBalances(api, UNRIPE_BEAN_ERC20) + getRipePooledBalances(api, ADDR[api.chain].UNRIPE_BEAN_ERC20) ]); - const totalStaked = siloBeans + unripeSiloBeans[BEAN_ERC20]; + const totalStaked = siloBeans + unripeSiloBeans[ADDR[api.chain].BEAN_ERC20]; return { - [`ethereum:${bean.toLowerCase()}`]: totalStaked + [`${api.chain}:${bean.toLowerCase()}`]: totalStaked } } // Tokens in liquidity pools corresponding to lp tokens that are deposited in the silo async function pool2(api) { - if (api.timestamp >= EXPLOIT_TIME && api.timestamp <= REPLANT_TIME) { + if (invalidTime(api)) { return {}; } // Get the amount of lp tokens deposited in the silo - const pools = getPools(api.timestamp); + const pools = getPools(api); const poolPromises = pools.map(pool => [ getSiloDeposited(api, pool), getTotalSupply(api, pool) @@ -231,7 +296,7 @@ async function pool2(api) { // Gets the underlying token balances for both regular and unripe deposits const balancesResults = await Promise.all([ getPooledBalances(api, pools, ratios), - getRipePooledBalances(api, UNRIPE_LP_ERC20) + getRipePooledBalances(api, ADDR[api.chain].UNRIPE_LP_ERC20) ]); const pool2Balances = balancesResults[0]; @@ -242,21 +307,27 @@ async function pool2(api) { // Add chain info const retval = {}; for (const token in pool2Balances) { - retval[`ethereum:${token.toLowerCase()}`] = pool2Balances[token]; + retval[`${api.chain}:${token.toLowerCase()}`] = pool2Balances[token]; } return retval; } module.exports = { methodology: "Counts the value of deposited Beans and LP tokens in the silo.", - start: 12974077, + start: '2021-08-07', ethereum: { tvl: () => ({}), pool2, staking }, + arbitrum: { + tvl: () => ({}), + pool2, + staking + }, hallmarks: [ - [1650153600, "Governance Exploit"], - [1659602715, "Replant"] + [EXPLOIT_TIME, "Governance Exploit"], + [REPLANT_TIME, "Replant"], + [ARB_MIGRATION_TIME, "Migration to Arbitrum"], ] }; diff --git a/projects/bearnfi/index.js b/projects/bearnfi/index.js index 19af898bba..d0e7fde02f 100644 --- a/projects/bearnfi/index.js +++ b/projects/bearnfi/index.js @@ -4,10 +4,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const { compoundExports } = require('../helper/compound') const { getConfig } = require('../helper/cache') -const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); -const { getChainTransform } = require("../helper/portedTokens"); - -const abi = require("./abi.json"); +const { sumTokens2 } = require("../helper/unwrapLPs"); const url = "https://api.bdollar.fi/api/bvault/get-vaults"; @@ -15,76 +12,28 @@ const BDEX_FACTORY = "0x2C358A7C62cdb9D554A65A86EEa034bc55D1E715"; const COMPTROLLER = "0xEEea0D4aAd990c4ede8e064A8Cb0A627B432EDa0"; const wBNB = ADDRESSES.bsc.WBNB; const cBNB = "0xa3948b027f94ca195eac645746435aaa7eb555a7"; -const chain = 'bsc' - -async function yieldTVL(timestamp, chainBlocks) { - let balances = {}; +async function yieldTVL(api) { // --- bVaults & bDollar TVL section, all contract addresses grab from endpoint --- // --- Sections of boardroom is not considered in TVL (bDollar Shares related) --- let vaultsInfo = (await getConfig('bearn-fi', url)).data.vaultInfos; const keys = Object.keys(vaultsInfo); - const strategies = []; + const strategies = [] keys.forEach((key) => { - strategies.push({ - address: vaultsInfo[key].strategy, - token: vaultsInfo[key].token, - }); - }); - - let wantedLocked = ( - await sdk.api.abi.multiCall({ - block: chainBlocks["bsc"], - calls: strategies.map((strategy) => ({ target: strategy.address })), - abi: abi.wantLockedTotal, - chain: "bsc", - }) - ).output.map((el) => el.output); - - let wantedAddresses = ( - await sdk.api.abi.multiCall({ - block: chainBlocks["bsc"], - calls: strategies.map((strategy) => ({ target: strategy.address })), - abi: abi.wantAddress, - chain: "bsc", - }) - ).output.map((el) => el.output); - - const transformAdress = await getChainTransform(chain); - - const lpPositions = []; - - strategies.map((strategy, idx) => { - if ( - strategy.token.includes("CakeLP") || - strategy.token.includes("CLP") || - strategy.token.includes("vBSWAP") || - strategy.token.includes("VLP") && strategy.token !== "VLP_BDO_VDOLLAR" - ) { - lpPositions.push({ - token: wantedAddresses[idx], - balance: wantedLocked[idx], - }); - } else { - // apparently this strategy in the endpoint states 0 tvl, so it is filter out - if (!strategy.token.includes("ibBUSD")) { - sdk.util.sumSingleBalance( - balances, - `bsc:${wantedAddresses[idx]}`, - wantedLocked[idx] - ); - } - } + if (vaultsInfo[key].token !== "ibBUSD") + strategies.push(vaultsInfo[key].strategy) }); + const bals = await api.multiCall({ abi: "uint256:wantLockedTotal", calls: strategies }) + const tokens = await api.multiCall({ abi: "address:wantAddress", calls: strategies }) - await unwrapUniswapLPs(balances, lpPositions, chainBlocks["bsc"], "bsc", transformAdress); - return balances; + api.add(tokens, bals) + return sumTokens2({ api, resolveLP: true }) } -const cExports = compoundExports(COMPTROLLER, chain, cBNB, wBNB,) +const cExports = compoundExports(COMPTROLLER, cBNB, wBNB,) const dexTVL = getUniTVL({ factory: BDEX_FACTORY, diff --git a/projects/bedrock/index.js b/projects/bedrock/index.js new file mode 100644 index 0000000000..b673ced9d2 --- /dev/null +++ b/projects/bedrock/index.js @@ -0,0 +1,28 @@ +const { sumTokens } = require('../helper/chain/bitcoin') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') +const { getConfig } = require('../helper/cache.js') + +async function tvl() { + return sumTokens({ owners: await bitcoinAddressBook.bedrock() }) +} + +module.exports = { + timetravel: false, + doublecounted: true, + bitcoin: { + tvl + } +} + +async function tvlEvm(api) { + const API_URL = 'https://raw.githubusercontent.com/Bedrock-Technology/uniBTC/refs/heads/main/data/tvl/reserve_address.json' + const { evm, } = await getConfig('bedrock.btc_address', API_URL) + const chain = api.chain == 'btr' ? 'bitlayer' : api.chain + const { vault, tokens } = evm[chain] ?? {} + if (!vault) return; + return api.sumTokens({ api, owner: vault, tokens }) +} + +['btr', 'ethereum', 'bsc', 'arbitrum', 'mantle', 'merlin', 'optimism', 'bob', 'bsquared', 'zeta', 'mode'].forEach(chain => { + module.exports[chain] = { tvl: tvlEvm } +}) \ No newline at end of file diff --git a/projects/beeBase/index.js b/projects/beeBase/index.js new file mode 100644 index 0000000000..684b86cb84 --- /dev/null +++ b/projects/beeBase/index.js @@ -0,0 +1,16 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs') + +module.exports = { + base: { + tvl: sumTokensExport({ owners: + [ + "0xFD09F108D1728E6B6eD241ccd254775e322f1ed6", + "0x8a2fFD429d33FBfC6f5A91aa207e48bB095Db7d9" + ], tokens: [ + ADDRESSES.null, + ADDRESSES.base.USDC, + ADDRESSES.base.WETH, + ]}), + } +}; \ No newline at end of file diff --git a/projects/beefstake/index.js b/projects/beefstake/index.js index d96ff8d4d4..0aae034382 100644 --- a/projects/beefstake/index.js +++ b/projects/beefstake/index.js @@ -11,6 +11,7 @@ async function fetch() { } module.exports = { + deadFrom: "2024-06-01", timetravel: false, misrepresentedTokens: true, vite:{ diff --git a/projects/beefy/index.js b/projects/beefy/index.js index ee8c5d5e8c..003419f65d 100644 --- a/projects/beefy/index.js +++ b/projects/beefy/index.js @@ -34,17 +34,20 @@ const chains = { ethereum: 1, optimism: 10, cronos: 25, + rsk: 30, bsc: 56, xdai: 100, fuse: 122, heco: 128, polygon: 137, + sonic: 146, manta: 169, fantom: 250, fraxtal: 252, era: 324, metis: 1088, polygon_zkevm: 1101, + lisk: 1135, moonbeam: 1284, moonriver: 1285, sei: 1329, @@ -59,6 +62,7 @@ const chains = { avax: 43114, linea: 59144, real: 111188, + scroll: 534352, aurora: 1313161554, harmony: 1666600000 } diff --git a/projects/beethovenx-sftmx/index.js b/projects/beethovenx-sftmx/index.js index 9d02242bdb..d48f8736a6 100644 --- a/projects/beethovenx-sftmx/index.js +++ b/projects/beethovenx-sftmx/index.js @@ -1,17 +1,23 @@ -const ADDRESSES = require("../helper/coreAssets.json"); -const liquidStakingContract = "0xB458BfC855ab504a8a327720FcEF98886065529b"; - -async function tvl(api) { - const supply = await api.call({ - abi: "uint256:totalFTMWorth", - target: liquidStakingContract, - }); - api.add(ADDRESSES.null, supply); -} +const { sumTokens2 } = require("../helper/unwrapLPs"); module.exports = { - methodology: "Retrieve the total underlying FTM supply", - fantom: { - tvl, - }, + methodology: "Retrieve the total underlying FTM/sonic supply", }; + + +const config = { + fantom: '0xB458BfC855ab504a8a327720FcEF98886065529b', + sonic: '0xe5da20f15420ad15de0fa650600afc998bbe3955', +} + +Object.keys(config).forEach(chain => { + const liquidStakingContract = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const abi = chain === 'fantom' ? 'totalFTMWorth' : 'totalAssets' + const supply = await api.call({ abi: "uint256:" + abi, target: liquidStakingContract, }); + api.addGasToken(supply) + return sumTokens2({ api }) + } + } +}) \ No newline at end of file diff --git a/projects/beethovenx/index.js b/projects/beethovenx/index.js index 4866706c1d..c3763a50fc 100644 --- a/projects/beethovenx/index.js +++ b/projects/beethovenx/index.js @@ -7,4 +7,7 @@ module.exports = { optimism: { tvl: onChainTvl('0xBA12222222228d8Ba445958a75a0704d566BF2C8', 7003431), }, + sonic: { + tvl: onChainTvl('0xBA12222222228d8Ba445958a75a0704d566BF2C8', 368312), + }, }; diff --git a/projects/belt/abi.json b/projects/belt/abi.json deleted file mode 100644 index 87d3b9f162..0000000000 --- a/projects/belt/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "calcPoolValueInToken": "uint256:calcPoolValueInToken", - "token": "address:token" -} \ No newline at end of file diff --git a/projects/belt/config.js b/projects/belt/config.js new file mode 100644 index 0000000000..bb1fb3c5d3 --- /dev/null +++ b/projects/belt/config.js @@ -0,0 +1,102 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const CONFIG = { + bsc: [ + ADDRESSES.bsc.beltBTC, + ADDRESSES.bsc.beltBNB, + '0xcb3346ad40c947a2228b2e224c3931a5224ba7ad', + '0xecb589831eefbdbbc48d1f86294724c76acd3314', + ADDRESSES.bsc.beltETH, + '0x9a144edd7309bcc4e106a1a04e7fc402115a0980', + '0x5142f6857f029bed5ddf6247d8a1f75984a3a380', + '0x1794bb186c15fddbf4aac4a3b0e2f40659e9b841', + '0x9a86fc508a423ae8a243445dba7ed5364118ab1d', + '0x27932f578128211f4c593f864ee2054b78f94992', + '0x4f52533c9504df756ecdfd311a8b846a59422e4e', + '0x55e1b1e49b969c018f2722445cd2dd9818ddcc25', + '0xdcfe3ca4863059ae2da63c7fdea04541bea178f9', + '0x7a59bf07d529a5fdbab67d597d63d7d5a83e61e5', + '0xed8487acc0d124efb5e8cfb5cf391caefbf99cbf', + '0x48f7fbea3781b95a9ac1cedb3d277bc3570bdcab', + '0x5ace08ff6d79663f9bf90686744c214317d0df8e', + '0x9171bf7c050ac8b4cf7835e51f7b4841dfb2ccd0', + '0x87c6668d33f224fe00adb3ef85a4a5ab4d5bf257', + '0x4b91dac1229f41c4d322f5f0fea246f069fb81a3', + '0xba2f7cb88d818bba7e932310f49d754eb29eb2ef', + '0xe12135207747d2ec1d1f0aabd4535e6ee08b853b', + '0x94065e5740b9c0560be9b830da0b2896da5f86d8', + '0x090f22ca2e3429f1f4dd38052cb451653e98f0c2', + ], + klaytn: [ + '0x7B6A8e0c40D3C3405afd5b4BAd3F5c202e18d518', + '0x766A73C9f9d51C773c95C649e26c59063f570cf8', + '0xf70644e5650e2ef5f0D31dF46e7e369771c2707F', + '0x1f450aE0AfC30b19610A57b52F9ac8C317Ac5B6A', + '0x3331e6EE96416E1B52B3182b67Faa970DC9a4F54', + '0xB551b72c1fC69E349180e1Feb11D87C719321274', + '0xe510d40a4B92302798d6baA1eF004E4629438e81', + '0x9B433Fb8424fCB35d6614C12559bA513F77b376f', + '0x2aD2811A8387191Ba08DACf8B95cC018B108252B', + '0x36715E1C3FD2Df068292De739F925dbdd28D7617', + '0x99084eb75E406A55dB913FA3E4f822Ff3690eAF5', + '0x426533F501c3615A4244087d2A9981b037C40D46', + '0xc0c09760BA26434d5482f61ae82a543c72ea8D08', + '0x3677F31C23D668d4c733f2a032ee2d3bc37aB4d9', + '0x2df990677D1E71BAEa494Ff962b408c06B8Cf6E1', + '0x9D2a003fe5FE21aB7CB1235080e48Ef801A1EE01', + '0x826c88315bb441e6886a63f80164E67F89359C5A', + '0x415cA0bbeD91664F5f94D8c62d6CB480F182a9CE', + '0xa541f77f0049A828c3CB8C800d877822Bbc7305c', + '0xF1FF200995ceC953B0A8c8539c21AF4AcC455186', + '0x94A37969EEB922535080E102F74d3c7b29470Afe', + '0xe7fa18E435FE9aCBdFb5016514B00C61C9a27507', + '0x3D5e1dd34e80E71Bcecad3eC1892B8aEe161A786', + '0x4935d93a4fe73E0F7E8bDFc9eF2e4eC79CDf1eB7', + '0x1E5dF060e7320414a2E9300968C66DD01291ca79', + '0x6731582c2F003741c135eC79F74864944A2884b0', + '0x39Ff319dd1282452cd73154B6ac670449234230F', + '0xf54c5E2305Bfe7dc62c6f1C0506c904F5564734b', + '0xBb8E0F162d53E15Dc1121081defF153b3A9481eF', + '0x31a1FCeB1296c1FE0e0A3D29658fA95898aE4f69', + '0x8A5724CA16eE5Cd4B6Ed6aFC8ab7766134CEAc53', + '0x430a6768Ef348B06F65F1FEEf01B9b2B58C75f79' + ], + heco: [ + '0xe8f67d3Dd4587E065d4abE8dCBe454E84526A715', + '0x6D8C89C937B68352916904Cb9FB39BA3aCd05c75', + '0x0bd7a237672BB287E31B80671704f83335E571f2', + '0x46e0898B8C480Bc3bF864a5C64Cd06940Ff33B4b', + '0x4Cd59EEB3a4D2fa5c35FD3dE0BA1723EeaF1D258', + '0x9d5E7AC92a7495EbCC0190964A3b90dfaFc2CF51', + '0x7840c4C08ab91AB23F57018BF6202a64C7C67588', + '0x923C5DD2449d7DCc54a86635F9196BEB2a4921a1', + '0x8434b37b493B27a1e679062210B74B4B22a66F38', + '0xB1493B7bc8e260B0b25235ae5c34B0dC201ce8C3', + '0x8d3a8a05e74c41edc6cd2cba2ec7fca0e1c611bb', + '0xff8376a18db1889abdf325cd28f37a12d2685b86', + '0xeb751332103b713b40321f86f5ab5468143c45aa', + '0xD3E341FDfa1c71C138e59c088EeBC069e2CfF96e', + '0x86f5c8eb736c95dd687182779edd792fef0fa674', + '0x5d790E3485aa6Dfe5b4F810C77CD7A41dF7B4CAC', + '0xCC6c6d6a68f303DaEE2F75C3D0E8688987cad2d8', + '0x00e517A416827720F00e61d9033E99426a6C3C63', + '0x96a020e1B07089e92f67FbFf1b870E638bf5a711', + '0x0e564BC863c2072C47FB8f952062BD5bc673E142', + '0xbca98b7049562B3BDA2E095fEf40626cf77Bc2f3', + '0x871dA29944D9CAeB25e048e6196D27c683C33796', + '0xCD70C61807130FcD68d8E2d0F32b2FB8be7A6C40', + '0x280Ae883FD219a56ef5182799f324451eaFE201D', + '0x9bC7a8ec3a8b9d9AEc0C5808456e35A934f457e5', + '0x2c03530b77699F08c69eCc4D33F801fb667f3406', + '0xBB550cDE1C88C2041Db27DC2fCf67f5354ECa0Ae', + '0x44F95Fa54b2ac1cEF14F5085dB2B1a7850b6881C', + '0x25D6A0133CF98E98e462a2a1AD127a5faEB01602', + '0xA8714b9c86Fb590bF2CEE12bdFccC575aB454272', + '0x2df074959D0f3FCfE9b5bFc18E4f9a3F7f56EDCc', + '0x50Cb33F99e05688b4969F728431041f6AA83A086', + '0xF95a075F57887405a424BAE3825086DeEa5c2a99', + '0x50eBED91FDf0dD0bBf2a46eCfB00e31F897dc870', + '0xC04a84d0E3f290D0777c233E0945678469adF353', + ] +} + +module.exports = CONFIG; \ No newline at end of file diff --git a/projects/belt/index.js b/projects/belt/index.js index b9e351d07a..6665c603ed 100644 --- a/projects/belt/index.js +++ b/projects/belt/index.js @@ -1,111 +1,27 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk') -const abi = require('./abi.json') -const { get } = require('../helper/http') -const BigNumber = require("bignumber.js"); -const { toUSDTBalances } = require('../helper/balances'); +const CONFIG = require('./config') -// https://docs.belt.fi/contracts/contract-deployed-info -const bscVaults = [ - ADDRESSES.bsc.beltBTC, - ADDRESSES.bsc.beltETH, - ADDRESSES.bsc.beltBNB, - '0x9171Bf7c050aC8B4cf7835e51F7b4841DFB2cCD0', - '0x55E1B1e49B969C018F2722445Cd2dD9818dDCC25', - '0x7a59bf07D529A5FdBab67D597d63d7D5a83E61E5', - '0x9A86fc508a423AE8a243445dBA7eD5364118AB1D' -] +const beltView = '0xB543248F75fd9f64D10c247b5a57F142EFF88Aac' -const hecoVaults = [ - '0x4Cd59EEB3a4D2fa5c35FD3dE0BA1723EeaF1D258', - '0xB1493B7bc8e260B0b25235ae5c34B0dC201ce8C3', - '0x86f5C8EB736c95dd687182779edd792FEF0fA674', - '0xA8714b9c86Fb590bF2CEE12bdFccC575aB454272', - '0xC04a84d0E3f290D0777c233E0945678469adF353', - '0x9bC7a8ec3a8b9d9AEc0C5808456e35A934f457e5', - '0x0e564BC863c2072C47FB8f952062BD5bc673E142' -] - -// const klaytnVaults = [ -// '0xe510d40a4B92302798d6baA1eF004E4629438e81', -// '0x426533F501c3615A4244087d2A9981b037C40D46', -// '0x826c88315bb441e6886a63f80164E67F89359C5A', -// '0xe7fa18E435FE9aCBdFb5016514B00C61C9a27507', -// '0x39Ff319dd1282452cd73154B6ac670449234230F', -// '0x430a6768Ef348B06F65F1FEEf01B9b2B58C75f79', -// '0xf70644e5650e2ef5f0D31dF46e7e369771c2707F' -// ] - -const tetherLP = "0x04100231d548Df31a003BEb99e81e3305Be9647b" -// const BELT = "0xE0e514c71282b6f4e823703a39374Cf58dc3eA4f" - -async function getTvl(chain, block, address) { - const underlyingTokens = await sdk.api.abi.multiCall({ - chain: chain, - calls: address.map(v=>({target:v})), - block, - abi: abi.token - }) - const underlyingBalances = await sdk.api.abi.multiCall({ - chain: chain, - calls: address.map(v=>({target:v})), - block, - abi: abi.calcPoolValueInToken - }) - const balances = {} - underlyingBalances.output.forEach((balance, index)=>{ - sdk.util.sumSingleBalance(balances, chain+':'+underlyingTokens.output[index].output, balance.output) - }) - - const beltInfo = await get('https://ss.belt.fi/info/all.json') - const lockedUSDT = beltInfo.info[chain.toUpperCase()].vaultPools.find(x => x.wantToken.toLowerCase() === tetherLP.toLowerCase()) - const [ usdt, wantLocked ] = Object.entries(toUSDTBalances(lockedUSDT.wantLocked))[0] - balances[usdt] = wantLocked - - return balances +const abi = { + calcPoolValueInToken: "uint256:calcPoolValueInToken", + token: "address:token", + getStakingStat: "function getStakingStat() view returns (tuple(address token, address beltToken, uint256 totalLockedWant, uint256 tokenDecimal, uint256 beltTokenDecimal, uint256 beltTokenTotalSupply, uint256 lockUpPeriod, uint256 pricePerFullShare) info)" } - -function bscTvl(timestamp, ethBlock, chainBlocks) { - return getTvl('bsc', chainBlocks['bsc'], bscVaults) +const tvl = async (api) => { + const tokens = await api.multiCall({ calls: CONFIG[api.chain], abi: abi.token }) + const suppliesInToken = await api.multiCall({ calls: CONFIG[api.chain], abi: abi.calcPoolValueInToken }) + api.add(tokens, suppliesInToken) } -function hecoTvl(timestamp, ethBlock, chainBlocks) { - return getTvl('heco', chainBlocks['heco'], hecoVaults) -} - -async function klaytnTvl() { - const beltInfo = await get('https://ss.belt.fi/info/all.json') - var tvl = new BigNumber('0'); - - beltInfo.info.KLAYTN.vaults.forEach(vault =>{ - tvl = tvl.plus(vault.tvl) - }) - - const lockedUSDT = beltInfo.info.KLAYTN.vaultPools.find(x => x.wantToken.toLowerCase() === tetherLP.toLowerCase()) - tvl = tvl.plus(lockedUSDT.wantLocked) - - return toUSDTBalances(tvl.toFixed(2)) -} - -async function getStaking(chain) { - const beltInfo = await get('https://ss.belt.fi/info/all.json') - const stakingInfo = beltInfo.info[chain.toUpperCase()].staking - - return toUSDTBalances(stakingInfo.tvl) +const staking = async (api) => { + const { token, pricePerFullShare, beltTokenTotalSupply } = await api.call({ target: beltView, abi: abi.getStakingStat }) + api.add(token, beltTokenTotalSupply * pricePerFullShare / 1e18) } module.exports = { - timetravel: false, - methodology: 'TVL includes the liquidity of all the Vaults, 3Tether LP and staking counts the BELT that has been staked in BSC. Data is pulled from:"https://ss.belt.fi/info/all.json".', - bsc: { - tvl: bscTvl, - staking: () => getStaking('bsc'), - }, - heco: { - tvl: hecoTvl, - }, - klaytn: { - tvl: klaytnTvl, - }, -} + methodology: 'TVL includes the liquidity of all the Vaults, 3Tether LP and staking counts the BELT that has been staked in BSC.', + bsc: { tvl, staking }, + heco: { tvl }, + klaytn: { tvl } +} \ No newline at end of file diff --git a/projects/bencu/index.js b/projects/bencu/index.js index f73e5f5145..21c5cb1904 100644 --- a/projects/bencu/index.js +++ b/projects/bencu/index.js @@ -1,8 +1,7 @@ -const {usdCompoundExports} = require("../helper/compound") +const { compoundExports2 } = require("../helper/compound") -module.exports={ - misrepresentedTokens: true, - metis:usdCompoundExports("0xC5986Df018D1ff8ecA79fd3f266428616617cDF3", "metis", undefined, undefined, { - blacklist: ['0x718F2e019F8166d81523d959F720Ad4A6e379209'.toLowerCase()] - }) +module.exports = { + metis: compoundExports2({ + comptroller: '0xC5986Df018D1ff8ecA79fd3f266428616617cDF3', + }) } \ No newline at end of file diff --git a/projects/benqi/index.js b/projects/benqi/index.js index 91882701b7..65656996c3 100644 --- a/projects/benqi/index.js +++ b/projects/benqi/index.js @@ -6,12 +6,12 @@ module.exports = { methodology: "Same as compound, we just get all the collateral (not borrowed money) on the lending markets", avax: { tvl: sdk.util.sumChainTvls([ - compoundExports("0x486af39519b4dc9a7fccd318217352830e8ad9b4", "avax").tvl, - compoundExports("0xD7c4006d33DA2A0A8525791ed212bbCD7Aca763F", "avax").tvl, + compoundExports("0x486af39519b4dc9a7fccd318217352830e8ad9b4", "0x5C0401e81Bc07Ca70fAD469b451682c0d747Ef1c").tvl, + compoundExports("0xD7c4006d33DA2A0A8525791ed212bbCD7Aca763F").tvl, ]), borrowed: sdk.util.sumChainTvls([ - compoundExports("0x486af39519b4dc9a7fccd318217352830e8ad9b4", "avax").borrowed, - compoundExports("0xD7c4006d33DA2A0A8525791ed212bbCD7Aca763F", "avax").borrowed, + compoundExports("0x486af39519b4dc9a7fccd318217352830e8ad9b4", '0x5C0401e81Bc07Ca70fAD469b451682c0d747Ef1c').borrowed, + compoundExports("0xD7c4006d33DA2A0A8525791ed212bbCD7Aca763F").borrowed, ]), pool2: pool2("0x784da19e61cf348a8c54547531795ecfee2affd1", "0xe530dc2095ef5653205cf5ea79f8979a7028065c") } diff --git a/projects/bepro/index.js b/projects/bepro/index.js index d05e900a42..21d9fc176a 100644 --- a/projects/bepro/index.js +++ b/projects/bepro/index.js @@ -20,7 +20,6 @@ const config = { module.exports = { methodology: 'counts the number of BEPRO tokens on Moonbeam Network contracts', - start: 1000235, }; Object.keys(config).forEach(chain => { diff --git a/projects/betfolio/index.js b/projects/betfolio/index.js index e321d49224..be944728a7 100644 --- a/projects/betfolio/index.js +++ b/projects/betfolio/index.js @@ -1,23 +1,23 @@ const { getConfig } = require('../helper/cache') const ADDRESSES = require('../helper/coreAssets.json') -const config = { - polygon: ADDRESSES.polygon.USDC_CIRCLE, -} +const USDC = ADDRESSES.polygon.USDC_CIRCLE -async function getContracts() { - const [list0Res, list1Res] = await Promise.all([ +const tvl = async (api) => { + const [list0Res,list1Res] = await Promise.all([ getConfig('betfolio', 'https://api.betfolio.co/api/v1/user/predictionList?limit=1000&duration=&type='), getConfig('betfolioSoloPrediction', 'https://api.betfolio.co/api/v1/user/getSoloPredictions?limit=1000&type=All&theme=All&solo_type=All') - ]); - return [...list0Res.data.list, ...list1Res.data.list].map(i => i.contract_address) + ]) + + const owners = [...list0Res.data.list, ...list1Res.data.list].map( + (i) => i.contract_address + .includes('_') ? i.contract_address + .split('_')[0] : i.contract_address + ); + + return api.sumTokens({ owners, tokens: [USDC] }) } -Object.keys(config).forEach(chain => { - module.exports[chain] = { - tvl: async (api) => { - const owners = await getContracts(api) - return api.sumTokens({ owners, tokens: [config[chain]] }) - } - } -}) \ No newline at end of file +module.exports = { + polygon: { tvl } +} \ No newline at end of file diff --git a/projects/betmode/index.js b/projects/betmode/index.js index b0b34df336..299c6d1e51 100644 --- a/projects/betmode/index.js +++ b/projects/betmode/index.js @@ -9,4 +9,16 @@ module.exports = { tokens: [ADDRESSES.mode.USDC], }), }, + base: { + tvl: sumTokensExport({ + owners: ["0x1C6971510c02eAe2e0a7d02A51193fE0b7286De4"], + tokens: [ADDRESSES.base.USDC], + }), + }, + optimism: { + tvl: sumTokensExport({ + owners: ["0x4b9d8f10bB6F50765DbeB9F8FBBF3Dace0Db8f3c"], + tokens: [ADDRESSES.optimism.USDC_CIRCLE], + }), + }, }; diff --git a/projects/betswirl/index.js b/projects/betswirl/index.js index 7566436dd5..45662f1e22 100644 --- a/projects/betswirl/index.js +++ b/projects/betswirl/index.js @@ -3,7 +3,7 @@ const { sumTokens2 } = require("../helper/unwrapLPs.js") module.exports = { methodology: "TVL counts BETS tokens or 8020 LP deposited on the Staking contracts.", - start: 1687715559, + start: '2023-06-25', bsc: { staking: staking('0x20Df34eBe5dCB1082297A18BA8d387B55fB975a0', '0x94025780a1aB58868D9B2dBBB775f44b32e8E6e5'), }, diff --git a/projects/bevm/index.js b/projects/bevm/index.js index 342a3d12fb..d3fe043888 100644 --- a/projects/bevm/index.js +++ b/projects/bevm/index.js @@ -1,15 +1,10 @@ const { sumTokensExport } = require("../helper/sumTokens"); -const ADDRESSES = require("../helper/coreAssets.json"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { methodology: "TVL counts tokens deposited in BEVM", //doublecounted: true, bitcoin: { - tvl: sumTokensExport({ - owners: [ - "bc1p43kqxnf7yxcz5gacmqu98cr2r5gndtauzrwpypdzmsgp7n3lssgs5wruvy", - "bc1p2s98z85m7dwc7agceh58j54le0nedmqwxvuuj4ex4mwpsv52pjxqkczev9", - ], - }), + tvl: sumTokensExport({ owners: bitcoinAddressBook.bevm }), }, }; diff --git a/projects/bgsol/index.js b/projects/bgsol/index.js new file mode 100644 index 0000000000..12a938e64e --- /dev/null +++ b/projects/bgsol/index.js @@ -0,0 +1,12 @@ +const { sumTokens2 } = require("../helper/solana"); + +async function tvl() { + return sumTokens2({ tokenAccounts: ['Ejg5vqsthntG8wJDijzgEWvdvhoAh8pzu4Q4r4MqsdkR'] }) +} + +module.exports = { + timetravel: false, + doublecounted: true, + methodology: "Bitget Staked SOL (BGSOL) is a tokenized representation on your staked sSOL", + solana: { tvl }, +}; \ No newline at end of file diff --git a/projects/biconomy-cex/index.js b/projects/biconomy-cex/index.js new file mode 100644 index 0000000000..fff4938b34 --- /dev/null +++ b/projects/biconomy-cex/index.js @@ -0,0 +1,25 @@ +const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const config = { + ethereum: { + owners: [ + '0xb03eDB668008459B3c6D948ab5Ab305581DbF69c' + ], + }, + bitcoin: { + owners: bitcoinAddressBook.biconomy + }, + polygon: { + owners: [ + '0x366ba28Ec89113454EA6e82bB606426e8cA22780' + ], + }, + tron: { + owners: [ + 'TEi2hVWDRMo61PAoi1Dwbn8hNXufkwEVyp' + ] + }, +} + +module.exports = cexExports(config) diff --git a/projects/bifi/index.js b/projects/bifi/index.js index c5a0511bf9..23da261467 100644 --- a/projects/bifi/index.js +++ b/projects/bifi/index.js @@ -51,16 +51,11 @@ const chainPools = { UnifiedDAI: { pool: '0x2168dAb12A6A93181bbAD9C9dc769307C36fB45C', token: ADDRESSES.bfc.UnifiedDAI }, UnifiedWBTC: { pool: '0xEa3b4a2dA5DbE8379AD4c60aaD5184df69D7C9AD', token: ADDRESSES.bfc.WBTC}, UnifiedBTCB: { pool: '0x0B31FeE8bF53bFe2f5F7083B73A4c9C8B517E32F', token: ADDRESSES.bfc.BTCB}, - BitcoinUSD: { pool: '0xcF2FC1d354018A39D5Ef036aA865Ad8cbF7B611E', token: ADDRESSES.bfc.BitcoinUSD } + BitcoinUSD: { pool: '0xcF2FC1d354018A39D5Ef036aA865Ad8cbF7B611E', token: ADDRESSES.bfc.BitcoinUSD }, + WstBFC: { pool: '0xf9B2f6D2a61923E61aD9F6DAA78f52b7e1722b12', token: '0x386f2F5d9A97659C86f3cA9B8B11fc3F76eFDdaE' }, }, } -module.exports = { - bitcoin: { - tvl: bitcoin - }, -}; - Object.keys(chainPools).forEach(chain => { const pools = chainPools[chain] module.exports[chain] = { @@ -70,20 +65,4 @@ Object.keys(chainPools).forEach(chain => { } }) -const wbtc = ADDRESSES.ethereum.WBTC -async function bitcoin(timestamp, ethBlock) { - const tokenPool = { - pool: '0x986Eb51E67e154901ff9B482835788B8f3054076', - token: '0x4ca7a5Fb41660A9c5c31683B832A17f7f7457344' - } - let tokenLocked = await sdk.api.erc20.balanceOf({ - owner: tokenPool.pool, - target: tokenPool.token, - block: ethBlock - }); - return { - [wbtc]: tokenLocked.output - } -} - module.exports.ethereum.staking = stakings(stakingPool, bfcAddr) diff --git a/projects/bigone/index.js b/projects/bigone/index.js index 08ad8d6874..360b25c9ec 100644 --- a/projects/bigone/index.js +++ b/projects/bigone/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -9,10 +10,7 @@ const config = { ], }, bitcoin: { - owners: [ - 'bc1qu02z43yduyjx6saeea4l54qqulvz568qnzgaes', - '1L5D4Eq2RkEKuN717Gc817MH1Sxs5WwMQh' - ] + owners: bitcoinAddressBook.bigone }, solana: { owners: [ diff --git a/projects/bigpump/index.js b/projects/bigpump/index.js new file mode 100644 index 0000000000..76927102a3 --- /dev/null +++ b/projects/bigpump/index.js @@ -0,0 +1,15 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokens } = require("../helper/chain/ton"); +const { getConfig } = require("../helper/cache"); + +async function fetchTvl(api) { + const res = await getConfig('bigpump', 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=bigpump') + await sumTokens({ api, tokens: [ADDRESSES.ton.TON], owners: res, onlyWhitelistedTokens: true }) +} + +module.exports = { + timetravel: false, + ton: { + tvl: fetchTvl + } +} \ No newline at end of file diff --git a/projects/binance-btc/index.js b/projects/binance-btc/index.js index d9f2e15961..3847560af6 100644 --- a/projects/binance-btc/index.js +++ b/projects/binance-btc/index.js @@ -1,15 +1,12 @@ const sdk = require('@defillama/sdk'); const { sumTokensExport } = require('../helper/sumTokens'); - -const owners = [ -'3LYJfcfHPXYJreMsASk2jkn69LWEYKzexb' -] +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { methodology: "BTC on btc chain", bitcoin: { tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners }), + sumTokensExport({ owners: bitcoinAddressBook.binance2 }), ]), }, }; \ No newline at end of file diff --git a/projects/binance/config.js b/projects/binance/config.js index c5499e6452..d0cf269732 100644 --- a/projects/binance/config.js +++ b/projects/binance/config.js @@ -175,7 +175,6 @@ const assetList = [ ['DOGE', 'BEP20', '0xd3a22590f8243f8e83ac230d1842c9af0404c4a1'], ['DOGE', 'BEP20', '0xe2fc31f816a9b94326492132018c3aecc4a93ae1'], ['DOGE', 'BEP20', '0xf977814e90da44bfa03b6295a0616a897441acec'], - /* ['DOGE', 'DOGE', 'D73RQLGWW9TBT2AKspEP24wLiXFrXvnTqX'], ['DOGE', 'DOGE', 'D7BrtudMAdwz2U7vSGumVDuxZsZNibJuzw'], ['DOGE', 'DOGE', 'D7D2f2WuEkwhTWqBkisZ5sM3JagaBcNWBs'], @@ -213,7 +212,6 @@ const assetList = [ ['DOGE', 'DOGE', 'DTSop4ycWkpmDqpncVZ3jwKp3z7B4kW4T3'], ['DOGE', 'DOGE', 'DTbG3RJRejnM99g8MSnhSbJxJVW8X7YXy9'], ['DOGE', 'DOGE', 'DU8gPC5mh4KxWJARQRxoESFark2jAguBr5'], - */ ['DOT', 'BEP2', 'bnb1fnd0k5l4p3ck2j9x9dp36chk059w977pszdgdz'], ['DOT', 'BEP2', 'bnb1u2agwjat20494fmc6jnuau0ls937cfjn4pjwtn'], ['DOT', 'BEP20', '0x0e4158c85ff724526233c1aeb4ff6f0c46827fbe'], @@ -282,7 +280,7 @@ const assetList = [ ['ETH', 'OP', '0x5a52e96bacdabb82fd05763e25335261b270efcb'], ['ETH', 'OP', '0xacd03d601e5bb1b275bb94076ff46ed9d753435a'], ['ETH', 'OP', '0xf977814e90da44bfa03b6295a0616a897441acec'], - // ['ETH', 'STK', ' 0x0213c67ed78bc280887234fe5ed5e77272465317978ae86c25a71531d9332a2d'], + ['ETH', 'STK', '0x0213c67ed78bc280887234fe5ed5e77272465317978ae86c25a71531d9332a2d'], ['ETH', 'ERA', '0x7aed074ca56f5050d5a2e512ecc5bf7103937d76'], ['ETH', 'ERA', '0xa84fd90d8640fa63d194601e0b2d1c9094297083'], ['ETH', 'ERA', '0xf977814e90da44bfa03b6295a0616a897441acec'], @@ -573,35 +571,35 @@ const assetList = [ ['WRX', 'ETH', '0x28c6c06298d514db089934071355e5743bf21d60'], ['WRX', 'ETH', '0xdfd5293d8e347dfe59e90efd55b2956a1343963d'], ['WRX', 'ETH', '0xf977814e90da44bfa03b6295a0616a897441acec'], - ['XRP', 'BEP2', 'bnb1fnd0k5l4p3ck2j9x9dp36chk059w977pszdgdz'], - ['XRP', 'BEP2', 'bnb1u2agwjat20494fmc6jnuau0ls937cfjn4pjwtn'], - ['XRP', 'BEP20', '0x0e4158c85ff724526233c1aeb4ff6f0c46827fbe'], - ['XRP', 'BEP20', '0x5a52e96bacdabb82fd05763e25335261b270efcb'], - ['XRP', 'BEP20', '0x8894e0a0c962cb723c1976a4421c95949be2d4e3'], - ['XRP', 'BEP20', '0xbd612a3f30dca67bf60a39fd0d35e39b7ab80774'], - ['XRP', 'BEP20', '0xd3a22590f8243f8e83ac230d1842c9af0404c4a1'], - ['XRP', 'BEP20', '0xe2fc31f816a9b94326492132018c3aecc4a93ae1'], - ['XRP', 'BEP20', '0xeb2d2f1b8c558a40207669291fda468e50c8a0bb'], - ['XRP', 'BEP20', '0xf977814e90da44bfa03b6295a0616a897441acec'], - ['XRP', 'ETH', '0x21a31ee1afc51d94c2efccaa2092ad1028285549'], - ['XRP', 'ETH', '0x28c6c06298d514db089934071355e5743bf21d60'], - ['XRP', 'ETH', '0xdfd5293d8e347dfe59e90efd55b2956a1343963d'], - ['XRP', 'ETH', '0xf977814e90da44bfa03b6295a0616a897441acec'], - ['XRP', 'XRP', 'rBtttd61FExHC68vsZ8dqmS3DfjFEceA1A'], - ['XRP', 'XRP', 'rDAE53VfMvftPB4ogpWGWvzkQxfht6JPxr'], - ['XRP', 'XRP', 'rDecw8UhrZZUiaWc91e571b3TL41MUioh7'], - ['XRP', 'XRP', 'rEy8TFcrAPvhpKrwyrscNYyqBGUkE9hKaJ'], - ['XRP', 'XRP', 'rNU4eAowPuixS5ZCWaRL72UUeKgxcKExpK'], - ['XRP', 'XRP', 'rP3mUZyCDzZkTSd1VHoBbFt8HGm8fyq8qV'], - ['XRP', 'XRP', 'rPJ5GFpyDLv7gqeB1uZVUBwDwi41kaXN5A'], - ['XRP', 'XRP', 'rPz2qA93PeRCyHyFCqyNggnyycJR1N4iNf'], - ['XRP', 'XRP', 'rarG6FaeYhnzSKSS5EEPofo4gFsPn2bZKk'], - ['XRP', 'XRP', 'rfQ9EcLkU6WnNmkS3EwUkFeXeN47Rk8Cvi'], - ['XRP', 'XRP', 'rhWj9gaovwu2hZxYW7p388P8GRbuXFLQkK'], - ['XRP', 'XRP', 'rpmxpWis42eYV4oMhyxJNSzrLRdacJVooa'], - ['XRP', 'XRP', 'rs8ZPbYqgecRcDzQpJYAMhSxSi5htsjnza'], + [ADDRESSES.ripple.XRP, 'BEP2', 'bnb1fnd0k5l4p3ck2j9x9dp36chk059w977pszdgdz'], + [ADDRESSES.ripple.XRP, 'BEP2', 'bnb1u2agwjat20494fmc6jnuau0ls937cfjn4pjwtn'], + [ADDRESSES.ripple.XRP, 'BEP20', '0x0e4158c85ff724526233c1aeb4ff6f0c46827fbe'], + [ADDRESSES.ripple.XRP, 'BEP20', '0x5a52e96bacdabb82fd05763e25335261b270efcb'], + [ADDRESSES.ripple.XRP, 'BEP20', '0x8894e0a0c962cb723c1976a4421c95949be2d4e3'], + [ADDRESSES.ripple.XRP, 'BEP20', '0xbd612a3f30dca67bf60a39fd0d35e39b7ab80774'], + [ADDRESSES.ripple.XRP, 'BEP20', '0xd3a22590f8243f8e83ac230d1842c9af0404c4a1'], + [ADDRESSES.ripple.XRP, 'BEP20', '0xe2fc31f816a9b94326492132018c3aecc4a93ae1'], + [ADDRESSES.ripple.XRP, 'BEP20', '0xeb2d2f1b8c558a40207669291fda468e50c8a0bb'], + [ADDRESSES.ripple.XRP, 'BEP20', '0xf977814e90da44bfa03b6295a0616a897441acec'], + [ADDRESSES.ripple.XRP, 'ETH', '0x21a31ee1afc51d94c2efccaa2092ad1028285549'], + [ADDRESSES.ripple.XRP, 'ETH', '0x28c6c06298d514db089934071355e5743bf21d60'], + [ADDRESSES.ripple.XRP, 'ETH', '0xdfd5293d8e347dfe59e90efd55b2956a1343963d'], + [ADDRESSES.ripple.XRP, 'ETH', '0xf977814e90da44bfa03b6295a0616a897441acec'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rBtttd61FExHC68vsZ8dqmS3DfjFEceA1A'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rDAE53VfMvftPB4ogpWGWvzkQxfht6JPxr'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rDecw8UhrZZUiaWc91e571b3TL41MUioh7'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rEy8TFcrAPvhpKrwyrscNYyqBGUkE9hKaJ'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rNU4eAowPuixS5ZCWaRL72UUeKgxcKExpK'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rP3mUZyCDzZkTSd1VHoBbFt8HGm8fyq8qV'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rPJ5GFpyDLv7gqeB1uZVUBwDwi41kaXN5A'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rPz2qA93PeRCyHyFCqyNggnyycJR1N4iNf'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rarG6FaeYhnzSKSS5EEPofo4gFsPn2bZKk'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rfQ9EcLkU6WnNmkS3EwUkFeXeN47Rk8Cvi'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rhWj9gaovwu2hZxYW7p388P8GRbuXFLQkK'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rpmxpWis42eYV4oMhyxJNSzrLRdacJVooa'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rs8ZPbYqgecRcDzQpJYAMhSxSi5htsjnza'], // added on 31/07/2024 - ['XRP', 'XRP', 'rwkbXMJQLQhVhcjZnnHV4zu39N7WcQXQKX'], + [ADDRESSES.ripple.XRP, ADDRESSES.ripple.XRP, 'rwkbXMJQLQhVhcjZnnHV4zu39N7WcQXQKX'], ['USDT', 'ETH', '0x835678a611b28684005a5e2233695fb6cbbb0007'], ['ETH', 'ETH', '0x835678a611b28684005a5e2233695fb6cbbb0007'], ['ETH', 'ARB', '0xf92402bb795fd7cd08fb83839689db79099c8c9c'], @@ -626,13 +624,16 @@ const assetList = [ ['MATIC', 'MATIC', '0x505e71695e9bc45943c58adec1650577bca68fd9'], ['USDT', 'MATIC', '0x505e71695e9bc45943c58adec1650577bca68fd9'], ['USDT', 'TRX', 'TRGCqsUXeynKTgynp2j9g3sg7Nux2KtB3u'], + // added on the 27/08/2024 + ['BTC', 'BTC', '3PXBET2GrTwCamkeDzKCx8DeGDyrbuGKoc'], + ['BTC', 'BTC', '3QK5vQ9hucSg8ZC8Vizq83qEWeHFLAWMud'], ] function getAddresses(chain) { return assetList.filter(i => i[1] === chain).map(i => i[2]) } function getOwners(chain) { - const isCaseSensitive = ['BTC', 'TRX', 'SOL', 'XRP', 'LTC', 'DOT', 'ALGO', 'DOGE'].includes(chain) + const isCaseSensitive = ['BTC', 'TRX', 'SOL', ADDRESSES.ripple.XRP, 'LTC', 'DOT', 'ALGO', 'DOGE'].includes(chain) return getUniqueAddresses(assetList.filter(i => i[1] === chain).map(i => i[2]), isCaseSensitive) } @@ -655,8 +656,8 @@ module.exports = { ], }, bep2: { - geckoId: 'binancecoin', - owners: getAddresses('BEP2'), + // geckoId: 'binancecoin', + // owners: getAddresses('BEP2'), }, tron: { owners: getOwners('TRX'), @@ -677,7 +678,7 @@ module.exports = { owners: getOwners('OP') }, ripple: { - owners: getOwners('XRP') + owners: getOwners(ADDRESSES.ripple.XRP) }, solana: { owners: getOwners('SOL') @@ -712,9 +713,7 @@ module.exports = { near: { owners: getOwners('NEAR') }, - /* doge: { owners: getOwners('DOGE') }, - */ } \ No newline at end of file diff --git a/projects/bing-cex/index.js b/projects/bing-cex/index.js index 103fb69b2e..91bec7b4f8 100644 --- a/projects/bing-cex/index.js +++ b/projects/bing-cex/index.js @@ -1,11 +1,10 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + const config = { bitcoin: { - owners: [ - 'bc1qr8e6kmev99jxnk7hpyhex434t59ke5tpvmnyd3', - 'bc1qzzn5tszxn3ha87xfke540k8pr4favsk9cusakq' - ] + owners: bitcoinAddressBook.bingCex }, arbitrum: { owners: [ diff --git a/projects/biokript/index.js b/projects/biokript/index.js index 1b61c9b4fc..844050762c 100644 --- a/projects/biokript/index.js +++ b/projects/biokript/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('bsc', '0x795802cb01a7be4be2f7f114b232a83b3adce64a', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('bsc', '0x795802cb01a7be4be2f7f114b232a83b3adce64a') \ No newline at end of file diff --git a/projects/biquid/index.js b/projects/biquid/index.js new file mode 100644 index 0000000000..d162546b12 --- /dev/null +++ b/projects/biquid/index.js @@ -0,0 +1,11 @@ + +async function tvl(api) { + const totalSupply = await api.call({ target: '0xEff8378C6419b50C9D87f749f6852d96D4Cc5aE4', abi: "erc20:totalSupply", }); + api.addGasToken(totalSupply); +} + +module.exports = { + bfc: { + tvl, + } +} \ No newline at end of file diff --git a/projects/bit-reserve/index.js b/projects/bit-reserve/index.js index 580a2ea6a9..26e6fe2bd0 100644 --- a/projects/bit-reserve/index.js +++ b/projects/bit-reserve/index.js @@ -7,7 +7,7 @@ async function tvl(api) { module.exports = { methodology: 'The total value of BTC in the rBTC contract on the BIT-RESERVE platform.', - start: 1715917267, + start: '2024-05-17', core: { tvl } diff --git a/projects/bitcointry/index.js b/projects/bitcointry/index.js new file mode 100644 index 0000000000..b28662a5f8 --- /dev/null +++ b/projects/bitcointry/index.js @@ -0,0 +1,47 @@ +const { cexExports } = require('../helper/cex') + +const config = { + bsc: { + owners: [ + '0x13CB26668e11b39290AcaE7Bb8BFF1eC0B4dcAaD', //main wallet + '0xeb4b2ecaa3e732da97d5fa922634138b9c2be6b9', //broker account on Binance + '0x57078A682ac277D444D8CeE278Dc6E2Ff0A52eA8' //broker account on gate io + ] + }, + base: { + owners: [ + '0x13CB26668e11b39290AcaE7Bb8BFF1eC0B4dcAaD', //main wallet + ] + }, + arbitrum: { + owners: [ + '0x13CB26668e11b39290AcaE7Bb8BFF1eC0B4dcAaD', //main wallet + ] + }, + ethereum: { + owners: [ + '0x13CB26668e11b39290AcaE7Bb8BFF1eC0B4dcAaD', //main wallet + '0xeb4b2ecaa3e732da97d5fa922634138b9c2be6b9' //broker account on Binance + ] + }, + avax: { + owners: [ + '0x13CB26668e11b39290AcaE7Bb8BFF1eC0B4dcAaD', //main wallet + '0xeb4b2ecaa3e732da97d5fa922634138b9c2be6b9' //broker account on Binance + ] + }, + polygon: { + owners: [ + '0x13CB26668e11b39290AcaE7Bb8BFF1eC0B4dcAaD', //main wallet + '0xeb4b2ecaa3e732da97d5fa922634138b9c2be6b9' //broker account on Binance + ] + }, + optimism: { + owners: [ + '0x13CB26668e11b39290AcaE7Bb8BFF1eC0B4dcAaD', //main wallet + '0xeb4b2ecaa3e732da97d5fa922634138b9c2be6b9' //broker account on Binance + ] + }, +} + +module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/bitfi/index.js b/projects/bitfi/index.js index 4421b9d984..0bcd9b108d 100644 --- a/projects/bitfi/index.js +++ b/projects/bitfi/index.js @@ -1,31 +1,9 @@ -const sdk = require('@defillama/sdk'); -const { sumTokensExport } = require('../helper/sumTokens'); - -const owners = [ -'1JA46eiDpfx589wawn5RvtEXgwc518QfhZ', -'368vZZKUWDFZRLWMFNRJzHo1HnibNeAJir', -'33hE9Wq65kjbiLsGD1NYwwNatP6hbsZv5H', -'32GU8Jux7SbsEbaAaLUnEQmc6JemLF6BUb', -'3CP5WJ2JSLCew7SETWUe5FxpBGrekMBiwk', -'39Fvw2Ho1fEkyDsos5sNTN5iMJZKzTL526', -'3Kptt4TZZRcjuGH8ikoQ8mV1TVxq45dnuS', -'335DRGzLLG2tu4H4PnFBHYAwcj5pvV8zei', -'3G4sMXWAAVTvTXTksr8u9zuu7W8RKsicEz', -'bc1qu4ru2sph5jatscx5xuf0ttka36yvuql7hl5h4c', -'bc1q3smt9ut40eld6tgn42sdlp9yrx98s90unqw3pl', -'bc1q3q7afjarz7l6v49538qs2prffhtawf38ss85k8', -'bc1qw4vp94e9egkaxc04qsu5z9aq5pqpku2p6pzer8', -'bc1qqg3cdyadq25zn99sdprr4lgpsxg2za998eygy8', -'bc1q6dtp7ayaj5k2zv0z5ayhkdsvmtvdqgyaa9zs53', -'bc1qaajdlp5yrj5f77wq2ndtfqnmsamvvxhpy95662zkzykn9qhvdgys580hcs', -'bc1qcmmkxfp2rawrp6yx55rez9jcqdnxtam8jhu2v2d9kz46upf948wq2usauv', -] - +async function tvl(api) { + const BFBTC = '0xC2236204768456B21eAfEf0d232Ba1FccCe59823' + const supply = await api.call({ abi: 'erc20:totalSupply', target: BFBTC }) + api.add(BFBTC, supply) +} module.exports = { - methodology: "BTC on btc chain", - bitcoin: { - tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners }), - ]), - }, -}; + doublecounted: true, + ailayer: { tvl }, +} diff --git a/projects/bitfinex/index.js b/projects/bitfinex/index.js index ae30d0f51c..0b0caf02f2 100644 --- a/projects/bitfinex/index.js +++ b/projects/bitfinex/index.js @@ -1,12 +1,9 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { bitcoin: { - owners: [ - '1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g', //BTC hot wallet - '3JZq4atUahhuA9rLhXLMhhTo133J9rF97j', //BTC cold wallet - 'bc1qgdjqv0av3q56jvd82tkdjpy7gdp9ut8tlqmgrpmv24sq90ecnvqqjwvw97', // BTC cold wallet - ], + owners: bitcoinAddressBook.bitfinex, }, ethereum: { owners: [ diff --git a/projects/bitflux/index.js b/projects/bitflux/index.js new file mode 100644 index 0000000000..6bab5ca62c --- /dev/null +++ b/projects/bitflux/index.js @@ -0,0 +1,21 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +const swapFlashLoans = Object.values({ + 'BP1': "0x4bcb9Ea3dACb8FfE623317E0B102393A3976053C", + 'BP2': "0x6a63cbf00D15137756189c29496B14998b259254", + 'BP3': "0xE7E1b1F216d81a4b2c018657f26Eda8FE2F91e26", + 'BP4': "0xeC938Bc5b201E96b6AFE97070a8Ea967E0dcAe96" +}) + +async function tvl(api) { + const tokens = await api.multiCall({ abi: 'address[]:getTokens', calls: swapFlashLoans}) + const ownerTokens = tokens.map((token, idx) => [token, swapFlashLoans[idx]]) + return sumTokens2({ api, ownerTokens }) +} + +module.exports = { + core: { + tvl + }, + methodology: "Counts all BTC-pegged tokens in the Bitflux liquidity pools" +} \ No newline at end of file diff --git a/projects/bitget/index.js b/projects/bitget/index.js index 82a4da501b..d91d15a080 100644 --- a/projects/bitget/index.js +++ b/projects/bitget/index.js @@ -1,137 +1,262 @@ -const { cexExports } = require('../helper/cex') +const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require("../helper/bitcoin-book/index.js"); const config = { bsc: { owners: [ - '0x0639556F03714A74a5fEEaF5736a4A64fF70D206', - '0x149ded7438caf5e5bfdc507a6c25436214d445e1', - '0x3a7d1a8c3a8dc9d48a68e628432198a2ead4917c', - '0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689' + "0x0639556F03714A74a5fEEaF5736a4A64fF70D206", + "0x149ded7438caf5e5bfdc507a6c25436214d445e1", + "0x3a7d1a8c3a8dc9d48a68e628432198a2ead4917c", + "0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689", + "0xa316c725bc8401c97d6d96f283c14b827541744e", + "0xc43999113f8fe724d91356c26105def1449ebdfd", + "0x8911b8f5127eec40c14e1ad0500dc4dbd279d7a7", + "0x1ff33329a8f8c1927131cbb72362b00abeea02d3", + "0x5bdf85216ec1e38d6458c870992a69e38e03f7ef", + "0x80097a87a7dcde470e34c10b5cceb85abf83b531", + "0xe4786cfe980ef5a6428a2fffafabf24f1fc79b64", + "0x4c1d7de286d7c20df5f2ba44b3bc706c1e03bf13", + "0xac65bdf867103ae2c3a75cdd4b68f9d7178c604f", + "0x14b5f559c27bc00c39f668a88471498d68d18768", + "0xe7b3b0a59b026ec1fef16561daf93672a61bafec", + "0x1ab4973a48dc892cd9971ece8e01dcc7688f8f23", + "0x1084203d70950bd7a93aef75eb32a51df2422a07", + "0xbcf6011192399df75a96b0a4ce47c4820853e9e5", + "0x864a7fa57e0f8902a2de4892e925f1272edbe3fa", ], }, ethereum: { owners: [ - '0x0639556F03714A74a5fEEaF5736a4A64fF70D206', - '0x1Ae3739E17d8500F2b2D80086ed092596A116E0b', - '0x2bf7494111a59bD51f731DCd4873D7d71F8feEEC', - '0x31a36512d4903635b7dd6828a934c3915a5809be', - '0x461f6dCdd5Be42D41FE71611154279d87c06B406', - '0x5bdf85216ec1e38d6458c870992a69e38e03f7ef', - '0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689', - '0x9E00816F61a709fa124D36664Cd7b6f14c13eE05', - '0xdFE4B89cf009BFfa33D9BCA1f19694FC2d4d943d', - '0xe2b406ec9227143a8830229eeb3eb6e24b5c60be', - '0xe6a421f24d330967a3af2f4cdb5c34067e7e4d75', - '0xe80623a9d41f2f05780d9cd9cea0f797fd53062a', - '0xf646d9B7d20BABE204a89235774248BA18086dae', - '0x1d5ba5414f2983212e03bf7725add9eb4cdb00dc', //add on 12/01/2024 - '0x51971c86b04516062c1e708cdc048cb04fbe959f', //add on 12/01/2024 - '0x5051e9860c1889eb1bfa394365364b3dd61787f1', //add on 12/01/2024 - '0x731309e453972598ea05d706c6ee6c3c21ab4d2a', //add on 12/01/2024 - '0x842ea89f73add9e4fe963ae7929fdc1e80acdb52', //add on 12/01/2024 - '0x1a96e5da1315efcf9b75100f5757d5e8b76abb0c', //add on 12/01/2024 - '0x4dfc15890972ecea7a213bda2b478dabc382e7a1', //add on 12/01/2024 - '0x70213959a644baa94840bbfb4129550bceceb3c2', // add on 27/05/2024 - '0x54a679e853281a440911f72eae0e24107e9413dc', // add on 27/05/2024 - '0x1ab4973a48dc892cd9971ece8e01dcc7688f8f23', // add on 27/05/2024 - '0x0edd5b0de0fe748be331186bf0aa878f47f601db', // add on 27/05/2024 - '0x4121217c238db06e942f3d87371106d30d0f8c84', // add on 27/05/2024 - '0xed470553f61f23cd30ccf51ab066dc1598ed0c4f', // add on 27/05/2024 - '0x59708733fbbf64378d9293ec56b977c011a08fd2', // add on 27/05/2024 - '0xaab0039de2a8dba8696ee4d42c0d1aa30d7e1059', // add on 27/05/2024 - '0xf207b2f9f9417fc73cad069f7aa5ae1c6a5b428d', // add on 27/05/2024 - '0x4d216d2682f3997f6c19420beee4530d08d0ea5f', // add on 27/05/2024 - '0xdbe46a02322e636b92296954637e1d7db9d5ed26', // add on 27/05/2024 - ] + "0x0639556F03714A74a5fEEaF5736a4A64fF70D206", + "0x1Ae3739E17d8500F2b2D80086ed092596A116E0b", + "0x2bf7494111a59bD51f731DCd4873D7d71F8feEEC", + "0x31a36512d4903635b7dd6828a934c3915a5809be", + "0x461f6dCdd5Be42D41FE71611154279d87c06B406", + "0x5bdf85216ec1e38d6458c870992a69e38e03f7ef", + "0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689", + "0x9E00816F61a709fa124D36664Cd7b6f14c13eE05", + "0xdFE4B89cf009BFfa33D9BCA1f19694FC2d4d943d", + "0xe2b406ec9227143a8830229eeb3eb6e24b5c60be", + "0xe6a421f24d330967a3af2f4cdb5c34067e7e4d75", + "0xe80623a9d41f2f05780d9cd9cea0f797fd53062a", + "0xf646d9B7d20BABE204a89235774248BA18086dae", + "0x1d5ba5414f2983212e03bf7725add9eb4cdb00dc", //add on 12/01/2024 + "0x51971c86b04516062c1e708cdc048cb04fbe959f", //add on 12/01/2024 + "0x5051e9860c1889eb1bfa394365364b3dd61787f1", //add on 12/01/2024 + "0x731309e453972598ea05d706c6ee6c3c21ab4d2a", //add on 12/01/2024 + "0x842ea89f73add9e4fe963ae7929fdc1e80acdb52", //add on 12/01/2024 + "0x1a96e5da1315efcf9b75100f5757d5e8b76abb0c", //add on 12/01/2024 + "0x4dfc15890972ecea7a213bda2b478dabc382e7a1", //add on 12/01/2024 + "0x70213959a644baa94840bbfb4129550bceceb3c2", // add on 27/05/2024 + "0x54a679e853281a440911f72eae0e24107e9413dc", // add on 27/05/2024 + "0x1ab4973a48dc892cd9971ece8e01dcc7688f8f23", // add on 27/05/2024 + "0x0edd5b0de0fe748be331186bf0aa878f47f601db", // add on 27/05/2024 + "0x4121217c238db06e942f3d87371106d30d0f8c84", // add on 27/05/2024 + "0xed470553f61f23cd30ccf51ab066dc1598ed0c4f", // add on 27/05/2024 + "0x59708733fbbf64378d9293ec56b977c011a08fd2", // add on 27/05/2024 + "0xaab0039de2a8dba8696ee4d42c0d1aa30d7e1059", // add on 27/05/2024 + "0xf207b2f9f9417fc73cad069f7aa5ae1c6a5b428d", // add on 27/05/2024 + "0x4d216d2682f3997f6c19420beee4530d08d0ea5f", // add on 27/05/2024 + "0xdbe46a02322e636b92296954637e1d7db9d5ed26", // add on 27/05/2024 + "0xbff5092f83bd810e0926068b89633bf66eaa037b", + "0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b", + "0x80097a87a7dcde470e34c10b5cceb85abf83b531", + "0xe4786cfe980ef5a6428a2fffafabf24f1fc79b64", + "0x4c1d7de286d7c20df5f2ba44b3bc706c1e03bf13", + "0xac65bdf867103ae2c3a75cdd4b68f9d7178c604f", + "0x14b5f559c27bc00c39f668a88471498d68d18768", + "0xe7b3b0a59b026ec1fef16561daf93672a61bafec", + "0x3c2a309d9005433c1bc2c92ef1be06489e5bf258", + "0xa7fc83c0cdf12cdccb8e7e5350994aa8ae881c9a", + "0xe368759445438b8ec4e50bf4094e939341174e62", + "0x2dd64ee5ea8706097a5674154288989e3dbe3a05", + "0x85cf18558263505e1152c0e478763aa68b4e8f31", + "0x72049af618eba3a50e9e4eb85bf4476bff0a76ca", + "0xa700c091687afbfada6b84b5e02a5e672ee35597", + "0xd509ff5d6e530401b53cc7d3b80607824d85ff60", + "0x255e91ab794da40d39a5aceff20d98841df873af", + "0x9756b4eedc434ca23dffd209c8ea01d4c95ff881", + "0x9a449ef3665f60af503ea5b8ef5191aeb315b809", + "0x58751ce78f174b58b8f5e345244984a78524a899", + "0x9f199b93ae33c330880bdb31422fca37c6d3fb14", + "0x9c9c8f4f33679ce7f2c46cbf8ab4feb4cf45fe46", + "0x8028270e06fca18e212306a7c93bfee52b440fc5", + "0x0635ac6675e05c7f58383493bb7d1a513cd65688", + ], }, tron: { owners: [ - 'TAa8e7U7seCy7NcZ52xYVQXXybFfwvsUxz', - 'TBXEdr2pD1tszUNAkVX18K7nie1MptkZ1y', - 'TBytnmJqL47n8bAP2NgPWfboXCwEUfEayv', - 'TFrRVZFoHty7scd2a1q6BDxPU5fyqiB4iR', - 'TGJagVsVg9QSePG5GreotgdefgaXPRo8SH', - 'TGZ959FTLRk8droUqDNgLxML1X9mEVej8q', - 'TYiQTHtgLo6KX6hYgbKLJsTbWK5hu9X5MG', - 'TZHW3PJe6VoyV8NWAaeukqWNRe3bVU7u8n', - 'TBM2FK4KBEEsMVYjm4WAW2Q8Es2NKdmUB8', //add on 12/01/2024 - 'TCvfZC9h6fFXnF7KbHPgY4jgfen93VkfVW', //add on 12/01/2024 - 'TGp7SNzjrctsWNwaFFN2PNTh3b1Kgxdtib', //add on 12/01/2024 - 'TBpo1Sh7vKCLrfxocZHd8CA5wc2R75kSJM', // add on 27/05/2024 - 'TMauqkA78pfysSTn8jD1dvEUkjme2gEEdn', // add on 27/05/2024 - 'TKPqvBMU2v23RyjjViKvp16kiHPx7FnrHQ', // add on 27/05/2024 - 'TVSdtELybCCa9DPDH15CMAPjeRcENAmDJZ', // add on 27/05/2024 - ] + "TAa8e7U7seCy7NcZ52xYVQXXybFfwvsUxz", + "TBXEdr2pD1tszUNAkVX18K7nie1MptkZ1y", + "TBytnmJqL47n8bAP2NgPWfboXCwEUfEayv", + "TFrRVZFoHty7scd2a1q6BDxPU5fyqiB4iR", + "TGJagVsVg9QSePG5GreotgdefgaXPRo8SH", + "TGZ959FTLRk8droUqDNgLxML1X9mEVej8q", + "TYiQTHtgLo6KX6hYgbKLJsTbWK5hu9X5MG", + "TZHW3PJe6VoyV8NWAaeukqWNRe3bVU7u8n", + "TBM2FK4KBEEsMVYjm4WAW2Q8Es2NKdmUB8", //add on 12/01/2024 + "TCvfZC9h6fFXnF7KbHPgY4jgfen93VkfVW", //add on 12/01/2024 + "TGp7SNzjrctsWNwaFFN2PNTh3b1Kgxdtib", //add on 12/01/2024 + "TBpo1Sh7vKCLrfxocZHd8CA5wc2R75kSJM", // add on 27/05/2024 + "TMauqkA78pfysSTn8jD1dvEUkjme2gEEdn", // add on 27/05/2024 + "TKPqvBMU2v23RyjjViKvp16kiHPx7FnrHQ", // add on 27/05/2024 + "TVSdtELybCCa9DPDH15CMAPjeRcENAmDJZ", // add on 27/05/2024 + "TYPUgo9ZtYk34XgBHbCHJCaoYZ5RejhhVD", + "TKurFA1LqaLU6cYa7QKbYqFceT3Xf22pNT", + "TN9DMsWq8CwE9GZV4akjxUzwG93PPceuiV", + "TYAdiDkvjsSPMQt8AvA8jWJrXKcjyKb5rs", + "TTky11V7Q3ng6hkYjLs3R3YkeDB8suQ7dC", + "TJ8kFqncqv3GP15DTcbzufX5HFgFMCK3kC", + "TEk5sAuuk6URqvT5tL7hrUB65NGEgq895X", + "TJ7hhYhVhaxNx6BPyq7yFpqZrQULL3JSdb", + "TWpNmnuq6EFMRnxWQTGGf47gjkkbtYJdbm", + "TKfMrRSwhuLoTHcziSeNEAdSjaTe2677md", + "TQQ29P8gw2Tp8XeYKC8vasQmJ7rvHGFhiG", + "TUktrKwLLGGjks6DoN1zGta8muskbd9tnk", + "TFfNrnZzHVMQ7DsHLvcTyvZheqabG4KW4W", + "TKCFasXqJw3ezQiF1qYWYd78Edfb2NvpBV", + ], }, bitcoin: { - owners: [ - '1FWQiwK27EnGXb6BiBMRLJvunJQZZPMcGd', - '1GDn5X4R5vjdSvFPrq1MJubXFkMHVcFJZv', - '3GbdoiTnQrJYatcr2nhq7MYASSCWEKmN6L', - '3HcSp9sR23w6MxeRrLqqyDzLqThtSMaypQ', - '3MdofQ2ouxom9MzC9kKazGUShoL5R3cVLG', - '3Jxc4zsvEruEVAFpvwj818TfZXq5y2DLyF', //add on 12/01/2024 - '3KUwtHc5UhWQ76z6WrZRQHHVTZMuUWiZcU', // add on 27/05/2024 - '3H6JnFoz5jcoATKQ83BuQ3cUUCHswqfgtG', // add on 27/05/2024 - '3AZHcgLnJL5C5xKo33mspyHpQX7x4H5bBw', // add on 27/05/2024 - '3DSST4myyyRbiGzgCBE1RVHY7GRjDCh4n9', // add on 27/05/2024 - '3Nu84pbqfcfaFztQ74qc9ni2PH5HGM1bzS', // add on 27/05/2024 - '34hatYbZ27CLLoZWhuJHzBgoTCwXEv8GwT', // add on 27/05/2024 - ] + owners: bitcoinAddressBook.bitget, }, arbitrum: { owners: [ - '0x0639556F03714A74a5fEEaF5736a4A64fF70D206', - '0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689', - '0x5bdf85216ec1e38d6458c870992a69e38e03f7ef', //add on 12/01/2024 - ] + "0x0639556F03714A74a5fEEaF5736a4A64fF70D206", + "0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689", + "0x5bdf85216ec1e38d6458c870992a69e38e03f7ef", //add on 12/01/2024 + "0x14b5f559c27bc00c39f668a88471498d68d18768", + "0x81fb786799ebacc67abc0abaf5589aa0d7773fa0", + "0xf2c1a45ec2013c686c9568a4f250158c425e4373", + "0xe7b3b0a59b026ec1fef16561daf93672a61bafec", + "0x0c4681e6c0235179ec3d4f4fc4df3d14fdd96017", + "0x1ab4973a48dc892cd9971ece8e01dcc7688f8f23", + ], }, optimism: { owners: [ - '0x0639556F03714A74a5fEEaF5736a4A64fF70D206', - '0x5bdf85216ec1e38d6458c870992a69e38e03f7ef', - '0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689' - ] + "0x0639556F03714A74a5fEEaF5736a4A64fF70D206", + "0x5bdf85216ec1e38d6458c870992a69e38e03f7ef", + "0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689", + "0x14b5f559c27bc00c39f668a88471498d68d18768", + "0xe7b3b0a59b026ec1fef16561daf93672a61bafec", + "0x1ab4973a48dc892cd9971ece8e01dcc7688f8f23", + ], }, era: { - owners: [ - '0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689' - ] + owners: ["0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689"], }, - fantom :{ - owners: ['0x5bdf85216ec1e38d6458c870992a69e38e03f7ef'] + fantom: { + owners: ["0x5bdf85216ec1e38d6458c870992a69e38e03f7ef"], }, cronos: { - owners: ['0x0639556F03714A74a5fEEaF5736a4A64fF70D206'] + owners: ["0x0639556F03714A74a5fEEaF5736a4A64fF70D206"], }, avax: { owners: [ - '0x0639556F03714A74a5fEEaF5736a4A64fF70D206', - '0x5bdf85216ec1e38d6458c870992a69e38e03f7ef' - ] + "0x0639556F03714A74a5fEEaF5736a4A64fF70D206", + "0x5bdf85216ec1e38d6458c870992a69e38e03f7ef", + "0xe7b3b0a59b026ec1fef16561daf93672a61bafec", + "0x1ab4973a48dc892cd9971ece8e01dcc7688f8f23", + ], }, polygon: { owners: [ - '0x0639556F03714A74a5fEEaF5736a4A64fF70D206', - '0x5bdf85216ec1e38d6458c870992a69e38e03f7ef', - '0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689' - ] + "0x0639556F03714A74a5fEEaF5736a4A64fF70D206", + "0x5bdf85216ec1e38d6458c870992a69e38e03f7ef", + "0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689", + "0x14b5f559c27bc00c39f668a88471498d68d18768", + "0xe7b3b0a59b026ec1fef16561daf93672a61bafec", + "0x1ab4973a48dc892cd9971ece8e01dcc7688f8f23", + "0x9b0cb31f3e9232196aeaa7cac03ea95c5a4f0e35", + ], }, ripple: { owners: [ - 'r3AEihLNr81VYUf5PdfH5wLPqtJJyJs6yY', - 'rGDreBvnHrX1get7na3J4oowN19ny4GzFn' - ] + "r3AEihLNr81VYUf5PdfH5wLPqtJJyJs6yY", + "rGDreBvnHrX1get7na3J4oowN19ny4GzFn", + ], }, solana: { - owners: ['A77HErqtfN1hLLpvZ9pCtu66FEtM8BveoaKbbMoZ4RiR'] + owners: [ + "A77HErqtfN1hLLpvZ9pCtu66FEtM8BveoaKbbMoZ4RiR", + "3bLkLrRvkwHMrqyoCaDSCn6bZnpfJCVsHxcmznUwB1p5", + "42zAGwv37eZFwwcExfCAV9oSw2kNQX3aBxsbM6zvQECM", + "YiZeibU6zzEHyKiSTjygXUPkMktKj9a3DCAcWmZ4XjF", + "AvLGED7RBzYv4AuvkgFSCFMqyB2WjUff7TVKVEv5MjMs", + "48Zo7g9SReCWmNtCvr2es4H9CLCRQHrSND2Wzi61sCsQ", + "57WSBnNTC2MaqpY6NWLdNjhrELced4jSGV2hLSpjzct9", + "DP1FqoBnE23QNNz4LpT9FCQvETdJN4nph5c11NiinrGg", + "AyhsmFptkM251V1AoH2gf8d4QUnxUkkmaDqFfFwBwGni", + ], }, metis: { - owners: ['0x5bdf85216ec1e38d6458c870992a69e38e03f7ef'] + owners: ["0x5bdf85216ec1e38d6458c870992a69e38e03f7ef"], }, kava: { - owners: ['0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689'] + owners: ["0x97b9d2102a9a65a26e1ee82d59e42d1b73b68689"], + }, + starknet: { + owners: [ + "0x0299b9008e2d3fa88de6d06781fc9f32f601b2626cb0efa8e8c19f2b17837ed1", + ], + }, + ton: { + owners: [ //only wallets with more than 50k + "UQDJlZqZfh1OQ4PY2ze4bSEBznjc8fGzkE2YiP5XLvDv1JNr", + "EQCnRoi95R9jLVrPONxTWEMMCuIlHBsYZjYZW5JwtoecbRl6", + // "EQC5Jj1PfKD8PmwxdBDi47mtbLahHV0Qkrs39lVl2A4nPlPC", + "EQAkKBTk1NuRH9wuy5qJFesfCoZMvZXa2NV9mCet3t3ndwkH", + "EQDN9_DXwJA28GQnLjxCntVwvknvKes6c1tku8F5FQc3MkZo", + // "EQAGQcXOz5QWPXW_faObcN7HfSx8ihstAzoQTV9ckqmrDfcQ", + // "EQCUlDMK5NDVOmpbLAzGVkXfCXpmEJgKWHL4J7oHmuNkPxaH", + // "EQAWLm0Xut7koqsFxI2j3YBvjI1M_tVHXFrgTysXvF4NQWu5", + "EQAGR25YDiUNCr7Fw2WnEYM0g8WB1XuQi-N9Vr2w4zjDEhg5", + // "EQDpwKJP-qaqTyKIkOca6VUL_FOmxX5kO8McJA4YcnrBzlwi", + // "EQAzZQL6-D71tTLTFbpxRQtmHJDoP85k2Lwf0r9kLzVV2VRy", + // "EQCzCMf5tPWW9iUBdYhZclSYcbBccO02Gf1ak5QB7qly5Gsl", + // "EQDi0d8gazctsfO4kOYNGFtnqgyfG2tv9goFCRyMAbQKxMA3", + // "EQB6DclNqfSLlo37h7441Pq3KGKI23oE0wgf7uF3N22QicZ7", + // "EQCHhe9euw_STGkR0Q9DwAlh6XSPpUKXoaxRfjxf52uwvmGB", + // "EQAhO2gEwgghNaSoA9qOOzDP7VGu6a8q0hADNLf0cR07zMQr", + // "EQBXPf6ZSQoEFwPpd-RyQTXFuL6gvqZ4OWEiR0UcqdXEywxy", + // "EQDeJRmlJ95-HUwQKL23TgIrKKbjcOT-w_wn2NlxMI-Zu6i2", + // "EQAPGaGPsc-vwzQB04IyW63UkbS08btCmfD51vvHm3FQFYbg", + // "EQA182-9Kw_8YCugScsCS03ln3WVvp5gZpLU7lbS3xst3GiN", + // "EQDqltnjUhoZxMd022XDb8egHj2IQOlegwXD0rfJL1d8eyOZ", + // "EQDY6SAYmiZ2dc3qWZkqSB1JxPgyluCBNJe5DCeUBXKVvpC8", + // "EQB5AOHMT1UHXa4WBh_LL3HWqPeYMSoCNfDarrUOSSiI-2LE", + // "EQBi8zmTQRJNfGhdpG2RoHqhSWhN05fH5f6YaCCom4dsAnrT", + // "EQBcPW3DG9p9UG-FiOVbq6BiXAxTWRYSgwkeSHK9vAHJauTe", + // "EQAMReXSXKXMgNJsiQbeUYqG_BoETp6V11p2AQ0hBalCPUvU", + // "EQD7T5jBR_4NTYpyQTsbE6UTcSgM31GM-tUQsxzwWAW8XyuS", + // "EQB8Nfcr7iJARqpnwHI_dowkRu9k43b8AMj-p4RJTXosLWWv", + "EQDAflHltpSTd1j0X0ADBxyE9MSmi9sWiiLD1si4nNYYb7Kq", + // "EQBAdstQfrjD8XODZjA6OL3sE64rEjDFSPSjgXdllH4EYbL_", + // "EQCJCWcpv6SSYKI9XpCOM8wazXTay7Y9eJa1DjvqLrBj0DA4", + // "EQBczmMu9joi0XxD36P0UDZqCmCVZ6lXkQ8EnX73Dz8bFxtS", + // "EQDrU5ouMx-D_RBtqKuqPGpGvS-O4B-kUnXW-q7RulrPmAfa", + // "EQCkEpUgZvV1vD4n1Zs3SSdxInEQh1QkxubbrmHonEywvJ5a", + // "EQDHy0OTba2_affHgdhHNtC8DW0CjAYdM6np6HX8yjqFo1hL", + // "EQA5O1iYS2jpYbP2_z0WCbWRmyiaDQ-thu-x_Jkhzu-DsnEc", + // "EQCYL0iLg5WpiX2G8IBeFIGNVCy7LQ_hyf5iZ9A3ezFg5Atl", + // "EQClK4F-Kyfg7-h7CFMedd4NOMQN3Q_GUXd8b1i863SAdeR3", + // "EQC9yQc4ukdiARwzowoBnlQSI_t_WrW4vM3PZAJtlzmxkRGj", + // "EQBCDb94YxZuR4CsuOu4G9N0pm1U6ezgOhHEBiEX2LWD2YJi", + // "EQDKubNbxKBrbng_VL6CiPWG43crC3zogxRi-kSzxxPjw35F", + // "EQBtm4dCmA6ee0TdGB7OM_ugptfPSJQnZ9t8lEn3333sNE0u", + // "EQB9FPf68No-lbXCKDRKdswuMr1tAFdXKb5wb04CAtkTgPu7", + // "EQDRb6dbCI6kvhE5Mdnp60wc7fNEU7bpTyZkvGnmOLMqv5tr", + // "EQBABRMAjj3FdNo6KkeSP3wLrSL1oBPgogH_vojzNnI0ZI9l", + // "EQAhwpa_TxKq4vPppejylixsCucMNrOJUUHOsEk6TP2ExnOS", + // "EQDQPzhpD1ygMNgnPiD6k6d2S0FWMdJasy3Z3eOQTujARKDD", + // "EQA8Q5etDAwMseoEFLPfN8xUL9wQhi3hNzs4eFlXNIuB81Tj", + // "EQA70IHk3sI76igys6-kLC0TLxXo54s0qAwdbSRUOpqgneV3", + "EQDJlZqZfh1OQ4PY2ze4bSEBznjc8fGzkE2YiP5XLvDv1M6u", + "EQAXl6XExQorMSzpkn_28S79OwtY_zEURRGMLS5kMStdeQng", + "EQBggwBbNUqxxHhaqM6Ck-5cnBgukkjyfpyQdPNcFjQggwrJ", + ], }, -} +}; -module.exports = cexExports(config) \ No newline at end of file +module.exports = cexExports(config); diff --git a/projects/bitkub-cex/index.js b/projects/bitkub-cex/index.js new file mode 100644 index 0000000000..96871b4c1d --- /dev/null +++ b/projects/bitkub-cex/index.js @@ -0,0 +1,238 @@ +const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require("../helper/bitcoin-book/index.js"); + +const config = { + bitcoin: { owners: bitcoinAddressBook.bitkub }, + ethereum: { + owners: [ + "0x1579B5f6582C7a04f5fFEec683C13008C4b0A520", + "0xaD0703a267f97e19034FD564d731C4e6d888f9ef", + "0x831e8C86197C3993eb1238b3Ac22E42e3B7f2Fd9", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + "0xE35bb4845149eCC6799C98ceEeF7ff7c85440e6f", + "0x59E0cDA5922eFbA00a57794faF09BF6252d64126", + "0x326d9f47ba49bbaac279172634827483af70a601", + "0x4A3b441962BB481cdffF2650D84EBEC0f119CbB7", + "0x6B130820c449A27b35256A3c99942adbD53AAC18", + "0xFBA420CdAEE2df4e38a622d36616c3547AB6aaB4", + ], + }, + cardano: { + owners: [ + "addr1q8080hxmacdlnhrjllmurq35uj8jnj4ak0egxyl0zx6y9hns6jxls0ngn2qadghy4h7dterk0gzm3y7czmh8zlsfvmesug72j9", + "addr1q9lnc0jsh3f76hmapmsf8m7d6a32gm993gyhjspfvjgpdatl8sl9p0zna40h6rhqj0hum4mz53k2tzsf09qzjeyszm6s6n08gw", + "addr1vx7vlgvuupzvvls99penvatpm2c4j9ljscevzsnn3awk8ys6xynxk", + "addr1q8rgxa3edn03lywl8c9hk6p3c6rpyf9frhqe6a97qtrjktkxsdmrjmxlr7ga70st0d5rr35xzgj2j8wpn46tuqk89vhqaglq5q", + "addr1qyswadm6cz8u2lt8eh752d8434dgtjuvkmp3yv00klcuqm50s7wwjnhjjrt6h206nlzavqmsaqfllzslny5zyhfhemgslhpqe5", + "addr1q9pag8w4fhlfntk53te5ggjcxfv3a47pjs3kp79espx0xa3ry9xxlmzqcs8t8xj28xmw5l34pcdshnm80hjlsl0rlgwst42fps", + "addr1q8w6ydejn4v89cxmvmltzg4g0y4xkg84p3sqf3gmdst032pef9780gqwzm4c5q3m4juvp5q08e37yx9rvhfxahv7kywqn7h8jp", + "addr1q93njnfcfeky7ygfg5wjk3pms74qnxtashr7xmwnzykxpgp4yjdypphupnvrnskz8uj55cuzydmnmmnjvy70hytezjssux9ahu", + "addr1qxdsu34cmfw7er4zmd4702szx7yhc9gayrnyv6lsm89k6mafmzzku8yt4xqu7tqh3qctas87ukfswf0h3ytq9c92razqph7vpw", + "addr1qylmz3tepjdum5alfegjw80xawkqxrqy0lzl9ndhrcmr0dg34hvrr6m7qg538lpd6ppvxe7gp47rm36vyjw9cckuc0qsg26ngm", + "addr1q8j70zld3p2dhpgkxksprpsmzm4qhfhm2l6w9wk44gqs6264x2gg8f3gacy3x74ew8felyagrtq3lztx4cnx90cs09fsp87nrj", + "addr1q94vgjd7zfesgq06vgtrqe9q9g2rjtl6yn35gepwta9eqz25ts95j7frk9yh479d2fqln76xj4gldjflczkqwq003q3s39lprc", + "addr1q9vp536dm7jz05h8qfux247yl4c2cnzrz6kj9p3wh6u98gxuef7ar9t9kpnwpnnksgz8x4tuqtup6jch7yg55kns3p5s4vhaqa", + "addr1qxt89e3xnepa336w0t6td4as2awn0e57nk6f025r26rwug8q8t28pdfqtkt90eeafdf4axmzrh46cg65u47z59tscj3qfpxyxx", + "addr1q9fe0wv28yd6pse9hrwqn8rhcudj42e4z3a5vveqyqww6uys8ta3zga2drsxq42e003wxm7lvxt9skmrnst8f6z7sytqke4up9", + "addr1q8km36sd4wgt6f5e3n557nk454tqwxzg670fxylsztsccq5yy7w9y0uz4hlc3j2veln52xu3ktrrrzkr4p9ays0uhu5q6vukqh", + "addr1qx26c2mdztwk02fyn43692lzqcxscf0ujye06vv3jadhsazwram6xhx09z4yka4q6uexkelc92df9dysnjf5nhajvmnq2e4qwf", + "addr1qxxm602az76en6rjyvurmdpv7sj8jwxxfxv9jvjrttvrxt5l8pzavzkxpxuha8ra90t0h3s2zs5dhv2jmaq3mm6snfkqdmj5vl", + "addr1qxrs00m9qntkxhru8vdmd4xz562rv3ajck36l9yvcs06nwzcx8u53x99sahetdtaascmug9363m5sjjx8aullxgswvesy5td9l", + "addr1q9czs903atc9hmz9vf8sdrqgk33dz9hnwdgpgx98q4fsnj9t3n4wl5p8j9uqg4ewj740uupwjsv4c8p0eckuh3p0tjasl8v77f", + "addr1q9xfm9pxac0vhxym802eagwmtc0aus5w5uhc0tg9rslzzhfcj99akd57ewpta8ww9wf3vp9af3psmyw62vy00tvk3yaq9c3yw6", + "addr1q98xhywsa3xgu79ftrjyrfg6e2wrxfgqvepnudusw58ee6vmw0j8gzw6hmyuefah02purkfvqj6x2pz2wpjr26mr8r7qv6v2qa", + "addr1qxpah9ck505d7dvxvkvh33v5awrxv89vvjcduhfu29fr7dns6jxls0ngn2qadghy4h7dterk0gzm3y7czmh8zlsfvmesxrkkg7", + ], + }, + base: { + owners: [ + "0x7b7B40D0FfC52005AdE856D4F65008BFf7d4D4a6", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + "0x4EBBb4DeEd5dA01B1F882F237BA3a19e83Baaeea", + ], + }, + algorand: { + owners: [ + "CT7HPFSYMKHPJES4GEEA5VE6ML7PF4JUOKNSJNDK7MXYNYLMMTFJ7XDETY", + "Q3GDAVXJLVHL2YNTIP35LMXEIZRGLLANSUGXGG4O2O44RZYYFNAU32OBNU", + "6CBNVPFCWAPEA2C2Y34JP7JDDNZI6YXG5JMPNCSYZOLB24IF3CALRRUSUQ", + "B6PJYYQSVT7F3NNJMGTR7MGS6AA5RLHY5LUGSWJSRXUQQQJZEFZ3QQ2BPE", + ], + }, + bsc: { + owners: [ + "0xC68C8d9d435c1C8a04909A7D8eA588d1031ae1E9", + "0xAdf4c208d546E7F1Ec24cab1CcDA9B47B90B8540", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + "0x2B8A2A03883E790fd8731823fcaC3E7af0a6dab3", + "0xe8FbDA2Ac282a0EBb73d3f4089AD130312eDb8DA", + "0xa2FF973Bf5A7c33cE4591226b03cf0afc5F16D37", + "0xd8A184BBEB7098E45a7bDCe1f88BFb5785Cb22bA", + "0x427E2cb82551D247daA712ebECf5FaC7F1d955Ad", + "0x1ecCd85c9E21f247FadB70F6cFf94B14cb737d03", + "0x3A67638883EfF7856b286ccd373d36476C45407a", + "0x45De26036ebe8a611FD361324872E887B5839564", + "0x85f44C42bAA806047f1d9aAea362333200FC5d10", + "0x8F19c19Fd4B6b3363fd1f214FF7781FBceBdba6d", + "0x165c97f4a371e69A747678bA1893Be023b284f4a", + "0x034bda447330D010554A5a93A22fF45a2505f494", + "0x42b3cd5676FFD76D29A587Fe8aAdE7e35BF7D1B5", + "0xBf36D6540c310996a21537c0193ACA1756884C40", + "0x6Fc29dFF13345574FaD530a8DBCC7Bb4A43Ad045", + "0x56152e13828f78cDCC90A6b016dF0aeC0985e2f3", + "0xc686D5a4A1017BC1B751F25eF882A16AB1A81B63", + "0x074b08B84E7400E9E5446CcE14d446b36B6351B5", + ], + }, + aptos: { + owners: [ + "0x73f6a587b4bc245bf3eeaa31b7ffe490d4c297a4960023b9548c1a4187bbe826", + ], + }, + arbitrum: { + owners: [ + "0x3ad60935c48f59cad57794eea41c60574735b4c9", + "0x799cb7688637824025F2Ae0BE78baA4854EB10f9", + "0x77aB048B5A14385450DfE21a676930E391B0c50C", + "0x0573AdF35a54475CBe10992Ba7C7dC11a80f39Ab", + "0x3040028E91D2a5D1E780c8E1a771A1A243f8921A", + "0xb8a63Da460063aB54aE52c73693Fc554E38E7794", + "0x7836c2eaD68809CEB6168E70558E46eB454209B9", + "0xc49839a2eDd1A2c4B23b080734a72CA9ff8DF666", + "0xCacb823a3D0C5a8490B1d3E60d1f33AB1eEB0387", + "0xFa87f3ae8Bf869d4f6138F47a5682dD9E4458EE3", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + ], + }, + avax: { + owners: [ + "0xCee64C0fD6E455B629ee82404094Bb0FD7a015d3", + "0xf521f4f06253a2c9db5732c6838b82cf472ccb6b", + "0xed450b3a875eaab5366cdc6746b1aa95c1f87009", + "0x16eCE576723AE9640053C2a5e100E21Ae6879915", + "0xaE0B49663C51C8e00795e935186e7C8D425Aa4Fd", + "0x134282ea729a0a129f331d9950d399f22545e8b8", + "0x376AD7FB3842475725D276D77b85883474B9050C", + "0x91013c9c7c2a856B26dF52A8A117Afeb9FC90379", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + ], + }, + litecoin: { + owners: [ + "ltc1qdjslxvcf0sdp7glpm7uyj97dnc8ml32c820jjr", + "MV6PFbiFu9hAzav77zvArKnVbepqzgLai6", + "LX3BfLPmTpNAqemj9QZKu4SLTMrU9M4W4a", + ], + }, + mantle: { + owners: [ + "0x93593B52373775B6387Bb136fb662a1B2B95D28C", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + ], + }, + optimism: { + owners: [ + "0xda4231EF1768176536EEE3ec187315E60572BBD4", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + "0x18f59d6945C3847d837bC7bF2E402C2F91FdBF04", + "0xE24568D364A170B9D768AF5AaB2E9bFfFE628fAA", + "0xB2a4bE10ff7599e748a59EF66DF574EA14FdD28e", + "0x4BB9326ac2721cECc34737FCCE2FeA5fe78Ec88F", + "0x87F05730C7fC9D20EE8f2776b6E12675e344d323", + "0xfE7Ad27596CA67A134Cc227FCCEEe02fD7BaCC46", + "0x4da9F5048B530EC1B0A415d3d4D82f1C0A0F3d77", + "0x34d68b60F2BB5983a85dCE33A9Fbc74135EA05d6", + ], + }, + polygon: { + owners: [ + "0xCa7404EED62a6976Afc335fe08044B04dBB7e97D", + "0x98a81ce4e94249beb329f04b9595e10735ae6ab0", + "0xac72565ccf186f10e6a7a3964492c62be5757e31", + "0x9573A11d939753737E8F09f80f07f6462C093a1c", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + ], + }, + solana: { + owners: [ + "CqLu65KkFvGi3DUrR9o9aUC4LP2yUywFHZn8WoNLNVgy", + "99GQKbo1m2dU2ETGtEB1of9F6QHne5o9HHjAc7MyiVSn", + "FEpW539FYXJLpuKxPEuFZhtBHqv3o3V5qKtQa8wxN6qQ", + "7Z4YASPhNRbebWGx4GuzEWFAETZyRdN1GQTFTnM8t5c2", + "9ZxAqUEP5aYBCHakuVt9ojL15jfy9oMiaeQv5ewk2c7J", + "EwA9sKvmKwTpKr9BqYmsYi2UjKEMm3aPsihmFfT7Q9DM", + ], + }, + tron: { + owners: [ + "TUokA66synv9BN4T2VPSRZivNedcbkhfJF", + "TN6yULseUiJF7WZUruRQqMTUb1VTDBdsqG", + "TRHQmybCizoiMCA3ev4pNTb5PLJmgpSztQ", + "TLpzN1ztwi47kK8Wip2VvmDMFwnMyWnHwj", + ], + }, + ripple: { + owners: [ + "rnrqyM7kS6wmC5demJm9vrfdN2vLgS8LfY", + "rE3Cc3i6163Qzo7oc6avFQAxQE4gyCWhGP", + "rsgwNP2cyRHAcEbuRmboDQ4pmgemMNVZR3", + "rN2AVDJj927YbdAvTXoDtq8uswbQvFU42t", + "rfZCcK6EMCYeAX3y86X281xwgRLcH82SAw", + "rwa1MPnDwpRsgJ4jmZHuBo42xK9YVpp45P", + ], + }, + era: { + owners: [ + "0xe65eE83E7B466CB3836f666BaAeB4ed6d29B5723", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + ], + }, + core: { + owners: [ + "0x1CA1817eD440b26Fb005748f3CE9f8db160A5C0a", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + ], + }, + fantom: { + owners: [ + "0xE9BB729A7eA588c2ad10acaF647124503Dbb08d1", + "0x7A1CF8CE543F4838c964FB14D403Cc6ED0bDbaCC", + "0xDD374d8202D43a18BE95C8B64C41a87a9898889f", + ], + }, + ton: { + owners: [ + "UQC99FRwIlV2iLvDwFDyIfSVFQms5fUKtVZKidKuFTKItH2h", + "UQDByM-88YEJtGq4UTZx3FOgZFZ6URHPYD11wf9AcBrajchg", + ], + }, + doge: { + owners: [ + "A3UdEKpx5HR1hJvKKw7iVbwp6MRn3yZAiK", + "ACkC8PjakegrmPFaL12FVDPCn8HwdKzSCY", + "AAuxfoiADXxMgbZPZ42xE6TCnFnz2FK33e", + "A5XHmCEG2TbaUnCiZnganw29EsDDnUQXjj", + "A59WR7LTBiBbSx3QZbf7SwQ6q3PHnP33wK", + "A4RZ3WfKxyWDPvMkFGM2Uzo8rDd6wwBqK5", + "9tAKQbiRPJxosnuUFGivL2kP3UEEeqdnd1", + "AD7E3QXB5go9AtE2uueMr3Dw767eWi5ruy", + 'DTqm2UCi6AS1nSCo9jZ8AejZ3k1ZcF8qix', + 'A2is3pqH2jz8jcRNV2QEFnLF3FAP5hBEoB', + 'DBrNiTbgpHHeveemLNnKwNDEJwXRGGRb1L', + 'D788kYSZYsVWSoLVejipE1Q4cN8Spom5eU', + 'DNvZftCnAsfrzzfe6R3dF6Sugz7W4Qgs6b', + 'DPYV66VirzChkotHXPryAhcfvyQmeArV2y', + 'DHBERwF4LVLVwQzDtfPz9zEtKPnWW9NSDH', + 'DTWmAfdTkrtqv7GmN2vE74VTkXkgQUFRSn', + 'DDm2XmWXhq3fxHd9fUaqnbmxanaFuKSG1s', + 'DHt3teN3iNSG7rJ8GaGz5EeHYFieCf8Qin', + 'D5GmmrSZ1xDut5Nj1s4C4ncA1v3EGfbk15', + 'DNpbFixXn611Qd9SZDBDjS4NhFPAXG8t1X', + 'D7pEtDnFU3ZgTykZt54SXvGeF1YSt2PVbe', + 'DCWvgKHcs1KUDqYe55rTX8m6uaJ67gaAp5', + 'DBdkivVhGhmbBRSsbt2s55MtZ38ngs86nS', + ], + }, +}; + +module.exports = cexExports(config); diff --git a/projects/bitlayer-btc/index.js b/projects/bitlayer-btc/index.js new file mode 100644 index 0000000000..c282ab582a --- /dev/null +++ b/projects/bitlayer-btc/index.js @@ -0,0 +1,18 @@ +const { sumTokensExport } = require("../helper/sumTokens"); +const { bitlayerBridge } = require("../helper/bitcoin-book"); +const ADDRESSES = require('../helper/coreAssets.json') + +module.exports = { + bitcoin: { + tvl: sumTokensExport({ owners: bitlayerBridge }) + }, + ethereum: { + tvl: sumTokensExport({ + ownerTokens: [ + [[ADDRESSES.ethereum.USDT], "0x92221E8Bc4E1D9a3E5D1cC39A524E90Cd4bdF8b1",], //USDT + [[ADDRESSES.ethereum.USDT], "0x6bc2b644A0D124F1e5dDf5a9BDd922e65a961343",],//usdt + [[ADDRESSES.null],"0x0CA2a8900b8140E1e70dc96F32857732f5F67B31",], //eth + [[ADDRESSES.ethereum.WSTETH],"0x6ac1108461189F1569e1D4dEdc9940a0395d3423",]] //eth + }), + }, +}; diff --git a/projects/bitlend/index.js b/projects/bitlend/index.js index 9446245857..7ea11d2ffd 100644 --- a/projects/bitlend/index.js +++ b/projects/bitlend/index.js @@ -15,7 +15,6 @@ const bTRX = '0xE73fb086C7Aa48b83372b028f0f35B06E77C7511' module.exports = { methodology: 'Total staked tokens in Bitlend protocol.', - start: 14069919, bittorrent: { tvl: sumTokensExport({ chain: CHAIN, diff --git a/projects/bitmake/index.js b/projects/bitmake/index.js index 2a4781423b..eaa310102c 100644 --- a/projects/bitmake/index.js +++ b/projects/bitmake/index.js @@ -1,13 +1,6 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const config = { - bitcoin: { - // wallet provide by a bitmake team - owners: [ - "3F12ncAyx4VkfpvnS7ZxdpggFx4p9RKfVe", - ], - }, -} - +const config = { bitcoin: { owners: bitcoinAddressBook.bitmake } } module.exports = cexExports(config) module.exports.methodology = 'We are only tracking one BTC wallet. We dont have information regarding other wallets' \ No newline at end of file diff --git a/projects/bitmark/index.js b/projects/bitmark/index.js index d6d4c6129d..c2bae74bae 100644 --- a/projects/bitmark/index.js +++ b/projects/bitmark/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') // https://support.bitmart.com/hc/en-us/articles/18473693031451-Enhancing-Transparency-and-Trust-at-BitMart const owners = [ @@ -18,7 +19,10 @@ const config = { owners: ['CgANddXc7FKSsdLSdFv67X8faZqQaRTeLMXkAVANkZD4'] }, bitcoin: { - owners: ['37RJkdkzPXCMYSTq74berJYj9FmNn7wFP5'] + owners: bitcoinAddressBook.bitmark + }, + starknet: { + owners: ['0x04de639e634c071c3ce8b1c69fac0500aab5ddb25a08fd0f757176243e4c0467'] }, } diff --git a/projects/bitmex/index.js b/projects/bitmex/index.js index 01756dad6c..949a8ea55e 100644 --- a/projects/bitmex/index.js +++ b/projects/bitmex/index.js @@ -1,15 +1,13 @@ const { cexExports } = require('../helper/cex') -const bitcoinOwners = require('./bitcoin.json') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { + bitcoin: { owners: bitcoinAddressBook.bitmex }, ethereum: { owners: [ '0xEEA81C4416d71CeF071224611359F6F99A4c4294', // Etherscan Label (seems cold) '0xfb8131c260749c7835a08ccbdb64728de432858e' // Etherscan Label (seems hot) ], - }, - bitcoin: { - owners: bitcoinOwners, } } diff --git a/projects/bitomato/index.js b/projects/bitomato/index.js new file mode 100644 index 0000000000..e23999051a --- /dev/null +++ b/projects/bitomato/index.js @@ -0,0 +1,21 @@ +const { cexExports } = require('../helper/cex'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js'); + +const config = { + bitcoin: { + owners: bitcoinAddressBook.bitomato, + }, + ethereum: { + owners: [ + '0x0b8b4EB21787d5a07AbAF6BC35E15CD5C59Cbb94', // Ethereum address for Bitomato + ], + }, + bsc: { + owners: [ + '0x0b8b4EB21787d5a07AbAF6BC35E15CD5C59Cbb94', // BSC address for Bitomato + ], + }, +}; + +module.exports = cexExports(config); +module.exports.methodology = 'We are tracking part of their cold wallets for Bitomato. The addresses were provided based on public information and verified activity.'; diff --git a/projects/bitparty/index.js b/projects/bitparty/index.js index c5a0a6e70a..5e08782687 100644 --- a/projects/bitparty/index.js +++ b/projects/bitparty/index.js @@ -9,8 +9,8 @@ module.exports = { nullAddress, ADDRESSES.btr.ETH, '0xfe9f969faf8ad72a83b761138bf25de87eff9dd2', - '0x9827431e8b77e87c9894bd50b055d6be56be0030', - '0xfF204e2681A6fA0e2C3FaDe68a1B28fb90E4Fc5F', + '0xf8c374ce88a3be3d374e8888349c7768b607c755', + ADDRESSES.btr.WBTC, '0x07373d112edc4570b46996ad1187bc4ac9fb5ed0', '0x2729868df87d062020e4a4867ff507fb52ee697c', '0x68879ca2af24941fc3b6eb89fdb26a98aa001fc1', diff --git a/projects/bitsmiley-io/index.js b/projects/bitsmiley-io/index.js index 462e12db1b..086d6c57cb 100644 --- a/projects/bitsmiley-io/index.js +++ b/projects/bitsmiley-io/index.js @@ -1,10 +1,11 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { sumTokens2, } = require('../helper/unwrapLPs') async function tvl(api) { return sumTokens2({ owners: [ '0x37fc73b4dda9f7263926590838e32e05e4e051e9', - ], tokens: ['0xff204e2681a6fa0e2c3fade68a1b28fb90e4fc5f', '0xfe9f969faf8ad72a83b761138bf25de87eff9dd2'], api, }) //wbtc and usdt + ], tokens: [ADDRESSES.btr.WBTC, '0xfe9f969faf8ad72a83b761138bf25de87eff9dd2'], api, }) //wbtc and usdt } module.exports = { diff --git a/projects/bitstable-finance/index.js b/projects/bitstable-finance/index.js index 39f2780ef9..596f5d3d42 100644 --- a/projects/bitstable-finance/index.js +++ b/projects/bitstable-finance/index.js @@ -2,32 +2,46 @@ const ADDRESS = require("../helper/coreAssets.json"); const { sumTokensExport } = require("../helper/sumTokens"); const sdk = require('@defillama/sdk') const { sumTokensExport: sumBRC20TokensExport } = require("../helper/chain/brc20"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + + +const BB_STAKE_CONTRACT = '0x8816353DA8A4D45E81C509A54AdbA8E57908958f' +const BB_STAKE_ABI = 'function totalStakedAmount() view returns (uint256)' const owner = "0x103dd1184599c7511a3016E0a383E11F84AE7173"; const tokens = { ethereum: [ADDRESS.ethereum.USDT], bsc: [ADDRESS.ethereum.FDUSD], + bouncebit: [ADDRESS.bouncebit.BBUSD] }; +const bbInBouncebitStaking = async (api) => { + const staked = await api.call({ target: BB_STAKE_CONTRACT, abi: BB_STAKE_ABI }) + api.addCGToken('bouncebit', staked/1e18) +} + module.exports = { methodology: "Staking tokens via BitStable counts as TVL", bitcoin: { tvl: sdk.util.sumChainTvls([ // Native(BTC) - sumTokensExport({ owners: ["bc1p36wvtxursam9cq8zmc9ppvsqf9ulefm7grvlfc4tzc5j83rcggsqh6nxw5"] }), + sumTokensExport({ owner: bitcoinAddressBook.bitstable[0] }), // BRC20 sumBRC20TokensExport({ // Deposit Address - owners: ["bc1p0uw83vg0h32v7kypyvjn9nextku2h7axjdeefy2ewstevnqffaksjzhrdf"], + owner: bitcoinAddressBook.bitstable[1], blacklistedTokens: ["BSSB", "DAII"], }), ]), staking: sumBRC20TokensExport({ // Farm Address - owners: ["bc1pvngqf24g3hhr5s4ptv472prz576uye8qmagy880ydq5gzpd30pdqtua3rd"], + owner: bitcoinAddressBook.bitstable[2], blacklistedTokens: ["DAII"], }), }, + bouncebit: { + staking: bbInBouncebitStaking, + }, }; Object.keys(tokens).map((chain) => { diff --git a/projects/bitunix-cex/index.js b/projects/bitunix-cex/index.js new file mode 100644 index 0000000000..e44bc0f87f --- /dev/null +++ b/projects/bitunix-cex/index.js @@ -0,0 +1,42 @@ +const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const config = { + ethereum: { + owners: [ + "0x76B0aB5067B3be922ef4698390Ca8bd5812A5080" + ], + }, + bitcoin: { + owners: bitcoinAddressBook.bitunixCex, + }, + tron: { + owners: [ + "TJwMqVoy8kAtrC1GLqRuoDqPYCsbaxZzw4", + "TA2EWrSzZHsDBn3d8j4m9f2nbHds2cSNYb", + "TNuHnKVFW3kahz3Xe6EyHJiTm9GBtg2aGD", + "TMiru9N4RffN3e7oT1HGk8cN6WizmL4ijP", + "TDpDGvfxtEdq7EHyHThYtSuL9tAEZSnjv7", + "TPssYpQm3tFzQNvCSVkeTrx4cFft43Ln2J", + "TDzTcjvucTPgZqaVjTct65AyFxP7DnLEjY", + "TE9oPgFeo3qz3152e2GNfKEdEs3UF42jTF", + "TYVAHVXixkL2dnaPfyjZz6J7hF6J4WW3Qx", + "TCxBM3QPZCebzCuXtzzBA7Vet5mCcruHdN", + "TLnMjGrgWTZLadqNRzbQPTzDPWbH6Dc1HA", + "TRcvGsNpzkm8LdhLYmqBWESRrTUv7BPQ8t", + "TWJ6R2EbFC5KdZFwLNj9GDiENn7WyAUjQE", + 'TJqCunxn9xYtnXtP8v5t54W7uR2huUbFvS', + 'THY84dJ4EPsPddwJP2URsqkDzHwVB9uk48', + 'TQTn7XQmZ9p2jToTV2rPbrVLZSftaZjK9y', + 'TLvpkJy9cn695PZLU2fEKYbfVDDpUymZvR', + 'TGmri3M7L5bhMVZdEViUX9tdARpJ4ANdNb', + 'TQTgNHaHLPEcCsvfFciriXLvQDktWNQ7yM', + 'TVaRQRPJh3MT3AfGLVZuaTdJL8nd176tpB', + 'TXP66hCnRzRP4ZNbQcNSWcBV4C5JnHK51F', + 'TP5UzNzk4tL2Jo6twHavUM9s9NjUPSgrvN', + 'TJRkfdgdQTSTmfQQzFy8RR6o73eLCEorSH' + ], + }, +} + +module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/bitusd/index.js b/projects/bitusd/index.js new file mode 100644 index 0000000000..c3341944e4 --- /dev/null +++ b/projects/bitusd/index.js @@ -0,0 +1,10 @@ +const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs') + +module.exports = { + start: '2024-11-30', + sapphire: { + tvl: sumTokensExport({ owner: '0x9be6f065aFC34ca99e82af0f0BfB9a01E3f919eE', tokens: [nullAddress] }, + { owner: '0xa16ed0B92a27E8F7fFf1aB513c607115636cb63f', tokens: [nullAddress] }), + }, +} + diff --git a/projects/bitvenus/index.js b/projects/bitvenus/index.js index b4c04f8215..43cc471a90 100644 --- a/projects/bitvenus/index.js +++ b/projects/bitvenus/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -15,14 +16,7 @@ const config = { ], }, bitcoin: { - owners: [ - // '3FdoFGYYcD1EU7ekrt2x2u2mFrjmxouMJG', - // '358pjjkYRG8exw2BKZnn7Q9s6SCb7wZEWN', - // '3C1ykoWkHBMZwmY8PUUMVxtJJSBkZBCtN8', - 'bc1qrm2a7u9xyeffvulm6e589qvesmt0v0rjxqfkhv', - 'bc1qvht34dma2uy23l9j862nnqr38a42kjr66e6lec' - - ] + owners: bitcoinAddressBook.bitvenus }, bsc: { owners: [ diff --git a/projects/bitzap/index.js b/projects/bitzap/index.js new file mode 100644 index 0000000000..7813e05738 --- /dev/null +++ b/projects/bitzap/index.js @@ -0,0 +1,16 @@ + +const config = { + btr: { factory: '0xe4fb0d76c7ba28dd4d115ff63c0b14d8d7f9838a', }, +} + +Object.keys(config).forEach(chain => { + const { factory, } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const pools = await api.fetchList({ lengthAbi: 'pool_count', itemAbi: 'pool_list', target: factory }) + const tokens = await api.multiCall({ abi: 'function get_coins(address) view returns (address[])', calls: pools, target: factory }) + const ownerTokens = pools.map((p, i) => [tokens[i], p]) + return api.sumTokens({ ownerTokens, blacklistedTokens: pools }) + } + } +}) \ No newline at end of file diff --git a/projects/blacksail/index.js b/projects/blacksail/index.js new file mode 100644 index 0000000000..0e87fe4cd2 --- /dev/null +++ b/projects/blacksail/index.js @@ -0,0 +1,53 @@ +const { getConfig } = require('../helper/cache'); +const { get } = require('../helper/http') +const { getEnv } = require('../helper/env') +const { sumUnknownTokens } = require('../helper/unknownTokens') + +async function fetcher() { + const { data: { yield }} = await get('https://api.blacksail.finance/stats', { + headers: { + 'x-api-key': getEnv('BLACKSAIL_API_KEY'), + 'Content-Type': 'application/json' + } + }); + return Object.values(yield).map((i) => i.strat_address).filter(i => i) +} + +async function tvl(api) { + let strats = await getConfig('blacksail/strats', undefined, { fetcher }) + strats = (await api.multiCall({ abi: 'address:staking_token', calls: strats, permitFailure: true })).map((v, i) => v ? strats[i] : null).filter(i => i) + const bals = (await api.multiCall({ abi: 'uint256:balanceOf', calls: strats})) + const tokens = await api.multiCall({ abi: 'address:staking_token', calls: strats }) + const symbols = await api.multiCall({ abi: 'string:symbol', calls: tokens }) + const ichiVaults = [] + const ichiBals = [] + tokens.forEach((token, i) => { + if (symbols[i] === 'ICHI_Vault_LP') { + ichiVaults.push(token) + ichiBals.push(bals[i]) + } else + api.add(token, bals[i]) + }) + + // resolve ichi vaults + const iSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: ichiVaults }) + const iToken0s = await api.multiCall({ abi: 'address:token0', calls: ichiVaults }) + const iToken1s = await api.multiCall({ abi: 'address:token1', calls: ichiVaults }) + const iTokenBals = await api.multiCall({ abi: 'function getTotalAmounts() view returns (uint256 bal1, uint256 bal2)', calls: ichiVaults }) + + iSupplies.map((_, i) => { + const token0 = iToken0s[i] + const token1 = iToken1s[i] + const ratio = ichiBals[i] / iSupplies[i] + api.add(token0, iTokenBals[i].bal1 * ratio) + api.add(token1, iTokenBals[i].bal2 * ratio) + }) + + return sumUnknownTokens({ api, useDefaultCoreAssets: true, lps: tokens.filter((_, i) => symbols[i].startsWith('v-')), resolveLP: true, allLps: true, }) +} + +module.exports = { + sonic: { + tvl, + } +} \ No newline at end of file diff --git a/projects/blastfutures/index.js b/projects/blastfutures/index.js index 291de17205..08bda7642f 100644 --- a/projects/blastfutures/index.js +++ b/projects/blastfutures/index.js @@ -4,7 +4,8 @@ const { staking } = require('../helper/staking') module.exports = { blast: { - tvl: sumTokensExport({ owner: '0x3Ba925fdeAe6B46d0BB4d424D829982Cb2F7309e', tokens: [ADDRESSES.blast.USDB, ADDRESSES.blast.WETH]}), - staking: staking('0x67dBA61709D78806395acDBa3EF9Df686aF5dc24', '0x236bb48fcF61ce996B2C8C196a9258c176100c7d'), + // tvl: sumTokensExport({ owner: '0x3Ba925fdeAe6B46d0BB4d424D829982Cb2F7309e', tokens: [ADDRESSES.blast.USDB, ADDRESSES.blast.WETH]}), + // staking: staking('0x67dBA61709D78806395acDBa3EF9Df686aF5dc24', '0x236bb48fcF61ce996B2C8C196a9258c176100c7d'), + tvl: () => ({}) // moved to rabbitx }, } diff --git a/projects/blend-pools/api.js b/projects/blend-pools/api.js index fa85d3cb59..bac0cd1ba0 100644 --- a/projects/blend-pools/api.js +++ b/projects/blend-pools/api.js @@ -15,12 +15,12 @@ const network = { async function getReserveDeposits(poolId, reserveId, isBorrowed = false) { const data = await ReserveData.load(network, poolId, reserveId) - const rate = Number(data.bRate) / 1e9 - const supply = Number(data.bSupply) - const borrowed = Number(data.dSupply) - if (isBorrowed) - return borrowed * rate - return (supply - borrowed) * rate + // bRate and dRate have 9 decimals + const supply = Number(data.bSupply) * Number(data.bRate) / 1e9; + const borrowed = Number(data.dSupply) * Number(data.dRate) / 1e9 + if (isBorrowed) + return borrowed + return supply - borrowed } @@ -39,9 +39,9 @@ async function addPoolTVL(poolId, api, isBorrowed = false) { async function tvl(api) { let backstop = await BackstopConfig.load(network, BACKSTOP_ID); - for (const pool of backstop.rewardZone) + for (const pool of backstop.rewardZone){ await addPoolTVL(pool, api); - +} return sumTokens2({ api }) } diff --git a/projects/blex/index.js b/projects/blex/index.js index 69934de5d5..71992f714e 100644 --- a/projects/blex/index.js +++ b/projects/blex/index.js @@ -12,7 +12,7 @@ const contracts = [ const tokens = [ADDRESSES.arbitrum.USDT]; module.exports = { - start: 1691240820, + start: '2023-08-05', arbitrum: { tvl: sumTokensExport({ tokens, owners: contracts }) }, hallmarks: [[1691240820, "Blex Protocol Deployed on Arbitrum"]], }; diff --git a/projects/blofin-cex/index.js b/projects/blofin-cex/index.js new file mode 100644 index 0000000000..cea48485cf --- /dev/null +++ b/projects/blofin-cex/index.js @@ -0,0 +1,50 @@ +const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const config = { + bitcoin: { + owners: bitcoinAddressBook.blofinCex, + }, + bsc: { + owners: ["0x1cA5aa5b1dd8D948bB0971A5fB1762FE172E0040"], + }, + ethereum: { + owners: [ + "0x1cA5aa5b1dd8D948bB0971A5fB1762FE172E0040", + "0xe5e6c3ced4670697b7cB27a53649a3ED321c18ee", + "0xdBdf80D997cFAaAC6150cD0cEC2C127fDaD7A823", + "0x88C984990573d385949deB571ed21eaD63301045", + "0xD775Ad8d9B9130B5D609Dc065BD548E46A6610b6" + ], + }, + solana: { + owners: [ + "94xmX5J92nZLanLvRstmxhgiS8kN8SVfFQ2zPKYB3Ynb", + "E3Gd8Hd1yKdkHTQnbenNVBgV2p1MrrenQnVU4SkJD4zx", + "3oWiTmU5QpTbSuTCVULybWsXc3DVxixdABxJPerLgTai" + ], + }, + optimism: { + owners: ["0x1cA5aa5b1dd8D948bB0971A5fB1762FE172E0040"], + }, + arbitrum: { + owners: ["0x1cA5aa5b1dd8D948bB0971A5fB1762FE172E0040"], + }, + tron: { + owners: [ + "TDFHcjw2PiDLjoqxXedaSSEtA1osqu8J6c", + "TE4uQTkFMcjm7UVYeQCgTHuec1pFP5J4Ds", + "TRzpEdrAwHXPQYWvXHJArpcac2WV3gXMr3", + "TVNRJgNsVMjDPethVVToz9aSvZq9SVgDXv", + "THTGgHWFXwgaZEDdaQmR6iuUEa7NKfCUtH" + ], + }, + polygon: { + owners: ["0x1cA5aa5b1dd8D948bB0971A5fB1762FE172E0040"], + }, + base: { + owners: ["0x1cA5aa5b1dd8D948bB0971A5fB1762FE172E0040"], + }, +}; + +module.exports = cexExports(config); diff --git a/projects/bluebit/index.js b/projects/bluebit/index.js index 2c5690370a..5cbcde9165 100644 --- a/projects/bluebit/index.js +++ b/projects/bluebit/index.js @@ -29,7 +29,6 @@ const tvl = async (timestamp, block, chainBlocks) => { module.exports = { methodology: "The vaults on https://bluebit.fi are included in TVL.", - start: 62936418, aurora: { tvl: tvl, staking: staking(veToken, token), diff --git a/projects/bluefin-amm/index.js b/projects/bluefin-amm/index.js new file mode 100644 index 0000000000..a82891ef0c --- /dev/null +++ b/projects/bluefin-amm/index.js @@ -0,0 +1,23 @@ +const sui = require("../helper/chain/sui"); +const { getConfig } = require('../helper/cache'); + +async function suiTvl(api) { + const pools = (await getConfig('bluefin/amm-sui', 'https://swap.api.sui-prod.bluefin.io/api/v1/pools/info')).map(i => i.address) + const res = await sui.getObjects(pools) + res.forEach((i) => { + const [coinA, coinB] = i.type.split('<')[1].split('>')[0].split(', ') + api.add(coinA, i.fields.coin_a) + api.add(coinB, i.fields.coin_b) + }) +} + + +module.exports = { + hallmarks: [ + [1731974400, "Spot Launch"], + [1733875200, "BLUE Token"] + ], + sui: { + tvl: suiTvl + }, +} diff --git a/projects/bluemeteor/index.js b/projects/bluemeteor/index.js index caec2d3a8f..567eeb03f2 100644 --- a/projects/bluemeteor/index.js +++ b/projects/bluemeteor/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - pulse: { tvl: getUniTVL({ factory: '0x2c68d8942fD4B5eC45a671fA230fb3dEBF224176', useDefaultCoreAssets: true, fetchBalances: true, }), }, + pulse: { tvl: getUniTVL({ factory: '0x2c68d8942fD4B5eC45a671fA230fb3dEBF224176', useDefaultCoreAssets: true, }), }, } \ No newline at end of file diff --git a/projects/blum/index.js b/projects/blum/index.js new file mode 100644 index 0000000000..53d9ebd14c --- /dev/null +++ b/projects/blum/index.js @@ -0,0 +1,16 @@ +const ADDRESSES = require("../helper/coreAssets.json") + +const { sumTokens } = require("../helper/chain/ton") +const { getConfig } = require("../helper/cache") + +async function fetchTvl(api) { + const res = await getConfig('blum', 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=blum') + await sumTokens({ api, tokens: [ADDRESSES.ton.TON], owners: res, onlyWhitelistedTokens: true, }) +} + +module.exports = { + timetravel: false, + ton: { + tvl: fetchTvl + } +} diff --git a/projects/blur-finance/index.js b/projects/blur-finance/index.js index b89430a011..4aaf7040a2 100644 --- a/projects/blur-finance/index.js +++ b/projects/blur-finance/index.js @@ -5,4 +5,5 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2022-08-10')/1e3), 'Rug pull'], ], + deadFrom: Math.floor(new Date('2022-08-10')/1e3) } \ No newline at end of file diff --git a/projects/bnpl-pay/index.js b/projects/bnpl-pay/index.js index 00f78c909d..2576332317 100644 --- a/projects/bnpl-pay/index.js +++ b/projects/bnpl-pay/index.js @@ -1,94 +1,29 @@ -const sdk = require('@defillama/sdk') -const { getParamCalls, getUniqueAddresses } = require('../helper/utils') +const { getUniqueAddresses } = require('../helper/utils') const { sumTokens2 } = require('../helper/unwrapLPs') -const chain = 'ethereum' const BNPL_FACTORY = '0x7edB0c8b428b97eA1Ca44ea9FCdA0835FBD88029' -let nodes = {} -async function getNodes(block) { - if (!nodes[block]) nodes[block] = _getNodes(block) - return nodes[block] -} -async function _getNodes(block) { - const { output: nodeCount } = await sdk.api.abi.call({ - target: BNPL_FACTORY, - abi: abi.bankingNodeCount, - chain, block, - }) +async function tvl(api) { + const nodes = await api.fetchList({ lengthAbi: abi.bankingNodeCount, itemAbi: abi.bankingNodesList, target: BNPL_FACTORY }) - const nodeCalls = getParamCalls(nodeCount) - const { output: res } = await sdk.api.abi.multiCall({ - target: BNPL_FACTORY, - abi: abi.bankingNodesList, - calls: nodeCalls, - chain, block, - }) - - const nodes = res.map(i => i.output.toLowerCase()) - const baseTokenCalls = nodes.map(i => ({ target: i })) - const { output: tokens } = await sdk.api.abi.multiCall({ - abi: abi.baseToken, - calls: baseTokenCalls, - chain, block, - }) - const baseTokenMapping = {} - tokens.forEach(({ input: { target }, output }) => baseTokenMapping[target] = output) - return { nodes, baseTokenMapping } -} - -async function tvl(_, block) { - const { nodes, baseTokenMapping, } = await getNodes(block) const tokens = getUniqueAddresses([ - // ...Object.keys(baseTokenMapping), '0x3Ed3B47Dd13EC9a98b44e6204A523E766B225811', // aave USDT '0xBcca60bB61934080951369a648Fb03DF4F96263C', // aave USDC ]) - return sumTokens2({ chain, block, owners: nodes, tokens, }) + return sumTokens2({ api, owners: nodes, tokens, }) } -async function staking(_, block) { - const { nodes } = await getNodes(block) +async function staking(api) { + const nodes = await api.fetchList({ lengthAbi: abi.bankingNodeCount, itemAbi: abi.bankingNodesList, target: BNPL_FACTORY }) + return sumTokens2({ - chain, block, owners: nodes, tokens: [ + api, owners: nodes, tokens: [ '0x84d821f7fbdd595c4c4a50842913e6b1e07d7a53', // BNPL ] }) } -async function borrowed(_, block) { - const { nodes, baseTokenMapping, } = await getNodes(block) - const balances = {} - const loanCountCalls = nodes.map(i => ({ target: i })) - const { output: loanCounts } = await sdk.api.abi.multiCall({ - abi: abi.getCurrentLoansCount, - calls: loanCountCalls, - chain, block, - }) - const loanToIdCalls = [] - loanCounts.forEach(({ input: { target}, output }) => { - const calls = getParamCalls(output) - calls.forEach(i => i.target = target) - loanToIdCalls.push(...calls) - }) - - const { output: loanIds } = await sdk.api.abi.multiCall({ - abi: abi.currentLoans, - calls: loanToIdCalls, - chain, block, - }) - - const idToLoanCalls = loanIds.map(({ input: { target }, output }) => ({ target, params: output })) - const { output: res } = await sdk.api.abi.multiCall({ - abi: abi.idToLoan, - calls: idToLoanCalls, - chain, block, - }) - - res.forEach(({ output, input: { target } }) => { - sdk.util.sumSingleBalance(balances, baseTokenMapping[target], output.principalRemaining) - }) - return balances +async function borrowed(api) { } const abi = { @@ -101,5 +36,8 @@ const abi = { } module.exports = { + deadFrom: '2023-02-12', ethereum: { tvl, staking, borrowed, }, } + +module.exports.ethereum.borrowed = () => ({}) // bad debt diff --git a/projects/bnsol/index.js b/projects/bnsol/index.js new file mode 100644 index 0000000000..cb7ba4d83b --- /dev/null +++ b/projects/bnsol/index.js @@ -0,0 +1,12 @@ +const { getStakedSol } = require("../helper/solana") + +async function tvl(api) { + await getStakedSol('75NPzpxoh8sXGuSENFMREidq6FMzEx4g2AfcBEB6qjCV', api) +} + +module.exports = { + timetravel: false, + solana: { + tvl + }, +}; \ No newline at end of file diff --git a/projects/bob-fusion/index.js b/projects/bob-fusion/index.js index f663c7552d..6e6d8336a3 100644 --- a/projects/bob-fusion/index.js +++ b/projects/bob-fusion/index.js @@ -16,6 +16,7 @@ const enabledAddresses = [ "0xbdBb63F938c8961AF31eaD3deBa5C96e6A323DD1", // eDLLR "0xbdab72602e9AD40FC6a6852CAf43258113B8F7a5", // eSOV "0xe7c3755482d0dA522678Af05945062d4427e0923", // ALEX + "0x8236a87084f8B84306f72007F36F2618A5634494", // LBTC ] module.exports = { diff --git a/projects/bob-gateway/index.js b/projects/bob-gateway/index.js index bebbc6b72b..e51903ef41 100644 --- a/projects/bob-gateway/index.js +++ b/projects/bob-gateway/index.js @@ -1,29 +1,48 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokens2 } = require("../helper/unwrapLPs"); +const factories = { + v1: "0x1831d29376eb94bba3ca855af7984db923768b27", + v2: "0x37f330e667208633e1da1cf601d01f0ef8484306", + v3: "0xAE6770a207E86FaE3b191564FA55ce7Bfee0Dde9", +}; + +const abis = { + v1: { + allOnramps: "function allOnramps() view returns (address[])", + }, + v2: { + allGateways: "function allGateways() view returns (address[])", + }, + v3: { + allGateways: "function allGateways() view returns (address[])", + }, +}; + module.exports = { bob: { - tvl: (api) => - sumTokens2({ + tvl: async (api) => { + const gateways = (await api.batchCall([ + { abi: abis.v1.allOnramps, target: factories.v1 }, + { abi: abis.v2.allGateways, target: factories.v2 }, + { abi: abis.v3.allGateways, target: factories.v3 } + ])).flat(); + + return sumTokens2({ api, - chain: "bob", tokens: [ ADDRESSES.bob.WBTC, ADDRESSES.bob.TBTC, + ADDRESSES.bob.SolvBTC, + ADDRESSES.bob.SolvBTC_BBN, + ADDRESSES.bob.FBTC, + ADDRESSES.bob.uniBTC, + ADDRESSES.bob.pumpBTC, + "0xA45d4121b3D47719FF57a947A9d961539Ba33204", // LBTC ], - owners: [ - // taken from onramp factory (allOnramps): https://explorer.gobob.xyz/address/0x1831d29376eb94bba3ca855af7984db923768b27?tab=read_contract - "0x587e6E2b280C70ec811a371671D3CBE9D7b9F691", - "0xA1884124a52331Bc2fa66e2b0EFa15856C6830c6", - "0x2e0A1Fa2f61985c475B869559cF2Cf733d4DB282", - "0xCA94d277d04e8e6ce960F7492b2df62e2215d562", - "0x9BBBc8F4e4258cC9Ec79164DDB7ef72954f381E2", - "0x47340424457463Fa77B59FDAdea31cA886a241FD", - // V2 gateways taken from gateway registry (allGateways): https://explorer.gobob.xyz/address/0x37f330e667208633e1da1cf601d01f0ef8484306?tab=read_contract - "0x1578c26085b45A559D6B4D4cCfc1DD9e5c66F7B6", - "0x2a7b7Db980B2228D5FfC47711D09d13F8F90961e", - ], - }), + owners: gateways, + }); + }, } }; diff --git a/projects/bob/index.js b/projects/bob/index.js index 07184113b5..371413167c 100644 --- a/projects/bob/index.js +++ b/projects/bob/index.js @@ -15,6 +15,7 @@ const tokens = [ "0xbdBb63F938c8961AF31eaD3deBa5C96e6A323DD1", // eDLLR "0xbdab72602e9AD40FC6a6852CAf43258113B8F7a5", // eSOV "0xe7c3755482d0dA522678Af05945062d4427e0923", // ALEX + "0x8236a87084f8B84306f72007F36F2618A5634494", // LBTC ]; diff --git a/projects/bodhfinance/index.js b/projects/bodhfinance/index.js index f2f06ea70f..6896d33c98 100644 --- a/projects/bodhfinance/index.js +++ b/projects/bodhfinance/index.js @@ -6,9 +6,12 @@ const bETH = "0xe970c37243F3d0B2AeB041b855Ef6466CB140BcA" const unitroller = "0x97b491744587d05ca33e84bB18B61Df9B3986DcE" const { tvl, borrowed } = compoundExports( - unitroller, "boba", bETH, WETH, ); + unitroller, bETH, ); module.exports = { + deadFrom: '2023-04-17', methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", boba: { tvl, borrowed } } + +module.exports.boba.borrowed = () => ({}) // bad debt diff --git a/projects/bombmoney/index.js b/projects/bombmoney/index.js index fcc813abdf..b6db5ee98a 100644 --- a/projects/bombmoney/index.js +++ b/projects/bombmoney/index.js @@ -1,5 +1,5 @@ const sdk = require("@defillama/sdk"); -const {pool2Exports} = require("../helper/pool2"); +const {pool2} = require("../helper/pool2"); const { staking } = require("../helper/staking"); const token = "0x522348779DCb2911539e76A1042aA922F9C47Ee3"; @@ -16,6 +16,6 @@ module.exports = { bsc: { tvl: async () => ({}), staking: staking(masonry, shares), - pool2: pool2Exports(shareRewardPool, pancakeLPs, "bsc", addr=>`bsc:${addr}`) + pool2: pool2(shareRewardPool, pancakeLPs, "bsc", addr=>`bsc:${addr}`) } } \ No newline at end of file diff --git a/projects/bondle/index.js b/projects/bondle/index.js new file mode 100644 index 0000000000..58f89b808e --- /dev/null +++ b/projects/bondle/index.js @@ -0,0 +1,17 @@ +const { sumTokensExport } = require("../helper/unwrapLPs"); +const coreAssets = require("../helper/coreAssets.json"); + +const routers = [ + "0x9272ddC213739Dad3B499C2C1245ff4A2cDe313A", + "0xc4d1a89d5BCC5A13c59fe2f3820E20B4f5d3095e", + "0x97b962Ab399beBF439a4a303d9754e79d6925EDa" +]; + + +const tokens = [coreAssets.null]; + +module.exports = { + shibarium: { + tvl: sumTokensExport({ owners: routers, tokens }) + }, +}; \ No newline at end of file diff --git a/projects/bonedex/index.js b/projects/bonedex/index.js index 725585ed9d..71b35aad74 100644 --- a/projects/bonedex/index.js +++ b/projects/bonedex/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('shibarium', '0x907599886DeBF90CCB1e9B446b31D52bDD25926D', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('shibarium', '0x907599886DeBF90CCB1e9B446b31D52bDD25926D') \ No newline at end of file diff --git a/projects/bonqdao/index.js b/projects/bonqdao/index.js index 45c4a56248..6a94020d45 100644 --- a/projects/bonqdao/index.js +++ b/projects/bonqdao/index.js @@ -67,8 +67,8 @@ module.exports = { hallmarks: [ [1675252800,"Oracle Hack"] ], + deadFrom: '2023-02-01', methodology: 'Summation of the collateral deposited in BonqDAO Troves (personal lending vaults)', - start: 36884903, polygon: { tvl, staking: stakings([BNQ_STAKING_CONTRACT], BNQ), diff --git a/projects/bonzo/index.js b/projects/bonzo/index.js new file mode 100644 index 0000000000..a0262ffd94 --- /dev/null +++ b/projects/bonzo/index.js @@ -0,0 +1,7 @@ +const { aaveV2Export, methodology } = require("../helper/aave") + +module.exports = { + timetravel: false, + methodology, + hedera: aaveV2Export('0x236897c518996163E7b313aD21D1C9fCC7BA1afc'), +} \ No newline at end of file diff --git a/projects/boomswap/index.js b/projects/boomswap/index.js new file mode 100644 index 0000000000..66b711360d --- /dev/null +++ b/projects/boomswap/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'bsc': '0xB438dee6a8875AFAbB8a82e86ef56C4DEEe5D1b5' +}) \ No newline at end of file diff --git a/projects/boringdao/index.js b/projects/boringdao/index.js index 8a2556e1d4..4259bd6f10 100644 --- a/projects/boringdao/index.js +++ b/projects/boringdao/index.js @@ -2,6 +2,8 @@ const { sumTokensExport } = require("../helper/sumTokens") const contracts = require("./contracts.json"); const sdk = require("@defillama/sdk"); const { staking } = require('../helper/staking') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + function chainTvl(chain) { const owners = Object.values(contracts[chain].contracts) @@ -14,7 +16,7 @@ function chainTvl(chain) { module.exports = { timetravel: false, bitcoin: { - tvl: sumTokensExport({ owner: '33ZibwpiZe4bM5pwpAdQNqqs2RthLkpJer'}) + tvl: sumTokensExport({ owners: bitcoinAddressBook.boringdao }) }, litecoin: { tvl: async (_, block) => { diff --git a/projects/bouncebit-cedefi/index.js b/projects/bouncebit-cedefi/index.js new file mode 100644 index 0000000000..1ec098efda --- /dev/null +++ b/projects/bouncebit-cedefi/index.js @@ -0,0 +1,68 @@ +const { cachedGraphQuery } = require('../helper/cache') + +const config = { + ethereum: { + subgraphUrl: 'https://api.studio.thegraph.com/query/96517/bb-defillama-eth/v0.0.4' + }, + bsc: { + subgraphUrl: 'https://api.studio.thegraph.com/query/96517/bb-defillama-bsc/v0.0.2', + subgraphUrl2: 'https://api.studio.thegraph.com/query/96517/bb-vip-defillama-bsc/v0.0.1' + }, + bouncebit: { + main: { url: 'https://bitswap-subgraph.bouncebit.io/subgraphs/name/bb-defillama-bb' }, + boyya: { url: 'https://bitswap-subgraph.bouncebit.io/subgraphs/name/bb-defillama-boyya-bb' } + } +} + +const query = `{ + tokens { + id + tvl + } +}` + +// stbbtc to bbtc +const TOKEN_MAPPINGS = { + '0x7f150c293c97172c75983bd8ac084c187107ea19': '0xf5e11df1ebcf78b6b6d26e04ff19cd786a1e81dc', // stBBTC -> bbtc +} + +async function fetchTokens(chain, subgraphUrl) { + const prefix = chain === 'bouncebit' ? `bouncebit-cedefi${subgraphUrl.includes('boyya') ? '-boyya' : ''}` : 'bouncebit-cedefi' + return cachedGraphQuery(`${prefix}/${chain}`, subgraphUrl, query) +} + +async function tvl(api) { + const chain = api.chain + + const tokenLists = await Promise.all( + chain === 'bouncebit' + ? [ + fetchTokens(chain, config[chain].main.url), + fetchTokens(chain, config[chain].boyya.url) + ] + : chain === 'bsc' + ? [ + fetchTokens(chain, config[chain].subgraphUrl), + fetchTokens(chain, config[chain].subgraphUrl2) + ] + : [fetchTokens(chain, config[chain].subgraphUrl)] + ) + + const allTokens = tokenLists.flatMap(result => result.tokens) + + allTokens.forEach(token => { + if (token.tvl <= 0) return + const targetToken = TOKEN_MAPPINGS[token.id] || token.id + api.add(targetToken, token.tvl) + }) + + return api.getBalances() +} + +module.exports = { + methodology: "Calculate TVL by querying BounceBit Cedefi subgraph" +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { tvl } +}) \ No newline at end of file diff --git a/projects/bouncebit-premium/index.js b/projects/bouncebit-premium/index.js index fde3876f9d..afee6eefcb 100644 --- a/projects/bouncebit-premium/index.js +++ b/projects/bouncebit-premium/index.js @@ -1,7 +1,8 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { sumTokens, sumTokensExport } = require('../helper/sumTokens'); const BBTC = '0xF5e11df1ebCf78b6b6D26E04FF19cD786a1e81dC' -const BBUSD = '0x77776b40C3d75cb07ce54dEA4b2Fd1D07F865222' +const BBUSD = ADDRESSES.bouncebit.BBUSD // const stBBTC = '0x7F150c293c97172C75983BD8ac084c187107eA19' const stBBTC_STAKE_ABI = diff --git a/projects/bountive/index.js b/projects/bountive/index.js index 134cab6388..b3a4c89b49 100644 --- a/projects/bountive/index.js +++ b/projects/bountive/index.js @@ -1,45 +1,65 @@ const ADDRESSES = require('../helper/coreAssets.json') const { bountiveTokenAbi } = require("./abi"); -const { multiCall } = require('../helper/chain/starknet') +const { multiCall } = require('../helper/chain/starknet'); +const { sumTokens2 } = require('../helper/unwrapLPs'); const bountiveTokens = [ - // BoSTRK: Bountive STRK - "0x05a0fff20829d60a0cdae2da18a32bd3de5c32f8d0109d2a0b59a88a7a77176e", - // BoETH: Bountive ETH - "0x00d91e36ff68918b392c9cfc2e3f575526f69e04b97eb28142856fae3611fcf7", - // BoUSDC: Bountive USDC - "0x04ed6784fa5c11889851c2d13bbd80464e55605a90b5b664f9400df0fd6ef4a5", - // BoUSDT: Bountive USDT - "0x0753dc6f8fee7487fe3f32728c0f1af9df1f7a3d0443ef507eb79a974697be12", - // BoDAI: Bountive DAI - "0x06e32d47c49efb0243da8d456dc413f1dcf50ceea7be28ef520492eccfff2b43", + // BoSTRK: Bountive STRK + "0x018e009bbb035c506234e7a8eca6a7229adfd59a278ba3845285d28b03ed6d53", + // BoETH: Bountive ETH + "0x02fcaebd41710024e25b6dc646a62acb6560125a699a3f695b6adb54a180aaee", + // BoUSDC: Bountive USDC + "0x028a88bf75f1b10dc8552051a56fbdc732084af514f6065f4c67ea6d50204720", + // BoUSDT: Bountive USDT + "0x0243d9a1cffc0b5ebbf549efd1232a96b1ef392fe595e91dd72103d5a8e7d847", + // BoDAI: Bountive DAI + "0x00c359a6eb59a7cd68bfc3d7a44d05b15ba3fbbb4eebc2d59d52d37f123bea00", ] const underlyingsTokens = [ - // STRK - ADDRESSES.starknet.STRK, - // ETH - ADDRESSES.starknet.ETH, - // USDC - ADDRESSES.starknet.USDC, - // USDT - ADDRESSES.starknet.USDT, - // DAI - ADDRESSES.starknet.DAI, + // STRK + ADDRESSES.starknet.STRK, + // ETH + ADDRESSES.starknet.ETH, + // USDC + ADDRESSES.starknet.USDC, + // USDT + ADDRESSES.starknet.USDT, + // DAI + ADDRESSES.starknet.DAI, ] async function tvl(api) { - const supplied = await multiCall({ - calls: bountiveTokens, - abi: bountiveTokenAbi.total_supply, - }); - api.addTokens(underlyingsTokens, supplied) + const supplied = await multiCall({ + calls: bountiveTokens, + abi: bountiveTokenAbi.total_supply, + }); + api.addTokens(underlyingsTokens, supplied) +} + +async function staking(api) { + const bountiveTokens = [ + // BoBROTHER: Bountive BROTHER + "0x067c176764a49143e405fadb3e35b2a18a16cc00527e53fed92267c1be1c53a5", + ] + const underlyingsTokens = [ + // BROTHER + ADDRESSES.starknet.BROTHER, + ] + + const supplied = await multiCall({ + calls: bountiveTokens, + abi: bountiveTokenAbi.total_supply, + }); + api.addTokens(underlyingsTokens, supplied) + return sumTokens2({ api }) } - + module.exports = { - methodology: 'TVL is the total tokens deposited on Bountive', - starknet: { - tvl, - } + doublecounted: true, + methodology: 'TVL is the total tokens deposited on Bountive', + starknet: { + tvl, staking, + } }; \ No newline at end of file diff --git a/projects/bracketX/index.js b/projects/bracketX/index.js index 55ef535ab8..7be4fba694 100644 --- a/projects/bracketX/index.js +++ b/projects/bracketX/index.js @@ -14,7 +14,7 @@ async function tvl(api) { module.exports = { methodology: 'Count the number of WETH tokens locked in the protocol contract.', - start: 1704412800, + start: '2024-01-05', arbitrum: { tvl, } diff --git a/projects/brainiac/index.js b/projects/brainiac/index.js index 5ef9ecfb14..41fb35a1be 100644 --- a/projects/brainiac/index.js +++ b/projects/brainiac/index.js @@ -20,7 +20,7 @@ const BRAINIAC_CKB_LP = '0xaa0f41e50dbfd8247fb397b1fffea1fea9f4e6d4' // params = comptroller , chain , brCKB , CKB module.exports = { - [chain]: compoundExports("0x5c68BDBba7151c486faCB66dc39b891030e46725", chain, "0x352d09567dE5A02415670723D09E006F623fE62e", ADDRESSES.godwoken_v1.pCKB) + [chain]: compoundExports("0x5c68BDBba7151c486faCB66dc39b891030e46725", "0x352d09567dE5A02415670723D09E006F623fE62e", ADDRESSES.godwoken_v1.pCKB) } module.exports[chain].staking = staking({ chain, useDefaultCoreAssets: true, owners: farms, tokens: [BRAINIAC], lps: [BRAINIAC_CKB_LP], }) diff --git a/projects/brbtc/index.js b/projects/brbtc/index.js new file mode 100644 index 0000000000..5333cd9e7d --- /dev/null +++ b/projects/brbtc/index.js @@ -0,0 +1,39 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokens2, } = require('../helper/unwrapLPs') + +const chainConfigs = { + ethereum: { + addr: "0x2eC37d45FCAE65D9787ECf71dc85a444968f6646", + vault: "0x1419b48e5C1f5ce413Cf02D6dcbe1314170E3386", + assets: [ + ADDRESSES.ethereum.WBTC,//WBTC + "0x004E9C3EF86bc1ca1f0bB5C7662861Ee93350568",//uniBTC + "0xC96dE26018A54D51c097160568752c4E3BD6C364",//FBTC + "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf",//cbBTC + "0x2F913C820ed3bEb3a67391a6eFF64E70c4B20b19",//MBTC + ], + }, + bsc: { + addr: "0x733a6c29eDA4a58931AE81b8d91e29f2EAf01df3", + vault: "0x1dF46ec5e86FeC4589b3fA7D60B6Dc7Ef890AD93", + assets: [ + ADDRESSES.bsc.BTCB,//BTCB + "0x6B2a01A5f79dEb4c2f3c0eDa7b01DF456FbD726a",//uniBTC + "0xC96dE26018A54D51c097160568752c4E3BD6C364",//FBTC + ], + } +} +module.exports = { + methodology: 'brBTC standing for Bedrock BTC, is designed specifically for Bitcoin holders seeking to participate in the next generation of DeFi opportunities. It accepts uniBTC and multiple wrapped BTC assets and Bedrock manages those assets on multiple trusted yield source layers such as Babylon, Kernel, Pell, Satlayer and etc.', + doublecounted: true, +} + +async function tvl(api) { + const cfg = chainConfigs[api.chain] ?? {} + if (!cfg) return; + return sumTokens2({ api, owner: cfg.vault, tokens: cfg.assets }) +} + +['ethereum', 'bsc'].forEach(chain => { + module.exports[chain] = { tvl: tvl } +}) \ No newline at end of file diff --git a/projects/bridgehela/index.js b/projects/bridgehela/index.js new file mode 100644 index 0000000000..cf3011562d --- /dev/null +++ b/projects/bridgehela/index.js @@ -0,0 +1,14 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') + +module.exports = { + ethereum: { + tvl: sumTokensExport({ owner:'0x8094816e435b8ca77f2dfe240820c6c6ac784900', tokens: [ADDRESSES.ethereum.USDT,ADDRESSES.ethereum.USDC] }) + }, + bsc: { + tvl: sumTokensExport({ owner:'0x8094816e435b8ca77f2dfe240820c6c6ac784900', tokens: [ADDRESSES.bsc.USDT,ADDRESSES.bsc.USDC] }) + }, + polygon: { + tvl: sumTokensExport({ owner:'0x700d0c48926af78c2c51f08c667f27ce6548386b', tokens: [ADDRESSES.polygon.USDT,ADDRESSES.polygon.USDC] }) + } +} \ No newline at end of file diff --git a/projects/bril-finance/index.js b/projects/bril-finance/index.js index faf565b1f2..52ef361924 100644 --- a/projects/bril-finance/index.js +++ b/projects/bril-finance/index.js @@ -7,7 +7,6 @@ const config = { module.exports = { doublecounted: true, methodology: 'Count tokens managed by Bril automated liquidity management stratagies', - start: 30131926, }; Object.keys(config).forEach(chain => { @@ -25,13 +24,15 @@ Object.keys(config).forEach(chain => { const areStrategiesEnabled = await api.multiCall({ abi: factory_abi.isStrategyEnabled, calls: strategies, target: factory }); const enabledStrategies = strategies.filter((s, index) => areStrategiesEnabled[index]); - const balances = await api.multiCall({ abi: abi.vaultAmounts, calls: enabledStrategies, }); + const balances = await api.multiCall({ abi: abi.vaultAmounts, calls: enabledStrategies, permitFailure: true }); const summaries = await api.multiCall({ abi: abi.vaultSummary, calls: enabledStrategies, permitFailure: true, }); for (let i = 0; i < balances.length; i++) { - if (!summaries[i]) continue; - api.add(summaries[i].baseToken_, balances[i].baseTotal_); - api.add(summaries[i].scarceToken_, balances[i].scarceTotal_); + const balance = balances[i] + const summary = summaries[i] + if (!balance || !summary) continue; + api.add(summary.baseToken_, balance.baseTotal_); + api.add(summary.scarceToken_, balance.scarceTotal_); } } } diff --git a/projects/brinc/index.js b/projects/brinc/index.js index f707a7bd22..48c496bcdb 100644 --- a/projects/brinc/index.js +++ b/projects/brinc/index.js @@ -1,26 +1,16 @@ const ADDRESSES = require('../helper/coreAssets.json') -const {sumTokensAndLPsSharedOwners} = require('../helper/unwrapLPs') +const { sumTokensExport } = require('../helper/unwrapLPs') const treasury = "0xB5de3f06aF62D8428a8BF7b4400Ea42aD2E0bc53" -async function tvl(time, ethBlock, chainBlocks){ - const balances = {}; - const transformAddress = i => `arbitrum:${i}` - await sumTokensAndLPsSharedOwners(balances, [ - [ADDRESSES.optimism.DAI, false], //dai - - ], [treasury], chainBlocks.arbitrum, "arbitrum", transformAddress) - return balances -} - -module.exports={ +module.exports = { hallmarks: [ [1639440000, "Brinc hack due to private key compromise"], [1644019200, "Relaunch on Arbitrum"] ], methodology: `DAI reserves in the bonding curve `, - arbitrum:{ - tvl, + arbitrum: { + tvl: sumTokensExport({ owners: [treasury], tokens: [ADDRESSES.optimism.DAI], }), //staking: stakingPricedLP("0xE5Df6583eE8DAe9F532e65D7D2C30A961c442f8a", "0x5fE5E1d5D86BDD4a7D84B4cAfac1E599c180488f", "ethereum", "0xe4f157c7ca54f435fcc3bb0b4452f98d3a48f303", "dai", true ) } } \ No newline at end of file diff --git a/projects/brine/index.js b/projects/brine/index.js index 89402f9301..e3cd280784 100644 --- a/projects/brine/index.js +++ b/projects/brine/index.js @@ -63,7 +63,7 @@ const scrollTokens = [ ] module.exports = { - start: 1685817000, + start: '2023-06-03', ethereum: { tvl: sumTokensExport({ owners: ethereumContracts, tokens: ethereumTokens, }) }, polygon: { tvl: sumTokensExport({ owners: polygonContracts, tokens: polygonTokens}) }, optimism: { tvl: sumTokensExport({ owners: optimismContracts, tokens: optimismTokens}) }, diff --git a/projects/brokkr/index.js b/projects/brokkr/index.js index 8f7f547997..7b842b3aeb 100644 --- a/projects/brokkr/index.js +++ b/projects/brokkr/index.js @@ -66,7 +66,7 @@ async function addEquityValuationToBalances(address, api) { module.exports = { - start: 1554848955, // 04/09/2019 @ 10:29pm (UTC) + start: '2019-04-10', // 04/09/2019 @ 10:29pm (UTC) doublecounted: true, avax: { tvl, diff --git a/projects/bsquared/index.js b/projects/bsquared/index.js index df8c3fc94d..8ce3f7c70f 100644 --- a/projects/bsquared/index.js +++ b/projects/bsquared/index.js @@ -2,31 +2,7 @@ const sdk = require('@defillama/sdk'); const { sumTokensExport: sumBRC20TokensExport } = require("../helper/chain/brc20"); const { sumTokensExport } = require('../helper/sumTokens'); const ADDRESSES = require('../helper/coreAssets.json') - -const BTCOwners = [ - // pre deposited wallets //Bitcoin Multisig Addresses - "bc1q4fsk5pgnmnu7ngp79xclsw2t0yk46sjqw22ffz", - "bc1qva5m5e7da2zm590z03tdnj42u9q2uye3hgrehwrzgg8j4kxq9seq9rvw0m", //Bitcoin Multisig Addresses - "bc1qjv2lfrv672rqagycs5zdsggmury0cz2vufek46jj86ddqynyp2qsxm3qfs", //Bitcoin Multisig Addresses - //Bitcoin Custodian Addresses - "131fpYjELat58RVzPp2A9Bo8oNuKiP4vxg", - "bc1qr4cpjazz6hhjh44yrshqw4xs4e3eld60wnsq2m", - "14UwPgMLZY6rLZRDxxvmNWQ9rMkg2iraHG", - "bc1quetqhxs809mwgms0rhae4cw98chzqe0er8fryr", - "34ThPcBtz5ayRybbg1MXnQWBGtUzqUDCMa", - "bc1q082azm83lgpln7puvn4egc9dumlaqfqkqmsght", - "bc1qxxgxywxcq0q405849fyrlxa2zu4nxukf4ytg57", - "3LcCJLivWmaomMyhnyt4pqg8iWi2ECU92T", - "bc1qe4xx7eg5c4qjq8838zv05f7uzfmyyyftdpy48t", - "3GPVsXtvbfFNRYbLwJowaL7EXo8hqakfkv", - "bc1q8axfvwqa0fqds5w6vva9g5kej9e4mp4ap3dmff", - "bc1q6crqwsg59s2j4v5gvd94775pjj8l0fmflmv9jd", - "19M7Z1E8Bs4pkXmHJrrJtngmVMUmgFu4K2" -]; - -const BRC20Owners = [ - "bc1q97ctqygjgj0ljxgge4q735ujxvlad8smass7f0axc6x3ggffr8xqwn69hc", //Bitcoin Multisig Addresses -]; +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const ADDRESSES_ETHEREUM_STONE = '0x7122985656e38BDC0302Db86685bb972b145bD3C'; @@ -37,8 +13,8 @@ module.exports = { methodology: "Staking tokens via BSquared Network Buzz counts as TVL", bitcoin: { tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners: BTCOwners }), - sumBRC20TokensExport({ owners: BRC20Owners }), + sumTokensExport({ owners: bitcoinAddressBook.bsquaredBTC }), + sumBRC20TokensExport({ owners: bitcoinAddressBook.bsquaredBRC20 }), ]), }, ethereum: { diff --git a/projects/bsx-exchange/index.js b/projects/bsx-exchange/index.js index ce2bab3c6b..b7cb8e6afd 100644 --- a/projects/bsx-exchange/index.js +++ b/projects/bsx-exchange/index.js @@ -1,3 +1,5 @@ +const { nullAddress } = require("../helper/tokenMapping") + const config = { base: '0x26a54955a5fb9472d3edfeac9b8e4c0ab5779ed3', } @@ -7,7 +9,8 @@ Object.keys(config).forEach(chain => { module.exports[chain] = { tvl: async (api) => { const tokens = await api.call({ abi: 'address[]:getSupportedTokenList', target: exchange }) - return api.sumTokens({ owner: exchange, tokens }) + tokens.push(nullAddress) + return api.sumTokens({ owner: exchange, tokens, blacklistedTokens: ['0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'] }) } } }) diff --git a/projects/btcfi-cdp/index.js b/projects/btcfi-cdp/index.js index 6390a55453..74798ef459 100644 --- a/projects/btcfi-cdp/index.js +++ b/projects/btcfi-cdp/index.js @@ -1,11 +1,22 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport, } = require('../helper/unwrapLPs') +const { sumTokens } = require("../helper/chain/bitcoin"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const chainPools = { bfc: { WBTC: { pool: '0xA84F9F42dF222da491571Fb70cCc11AC84B7F29D', token: ADDRESSES.bfc.WBTC }, - BTCB: { pool: '0xee66D8C40282439F2eE855D8a3666FB73257D349', token: ADDRESSES.bfc.BTCB } + BTCB: { pool: '0xee66D8C40282439F2eE855D8a3666FB73257D349', token: ADDRESSES.bfc.BTCB }, + cbBTC: { pool: '0xED00a5201607aa26CDDcdcf1583845e7435a2F39', token: ADDRESSES.bfc.cbBTC } }, + core: { + WBTC: { pool: '0x872b347cd764d46c127ffefbcaB605FFF3f3a48C', token: "0x7A6888c85eDBA8E38F6C7E0485212da602761C08" }, + BTCB: { pool: '0x872b347cd764d46c127ffefbcaB605FFF3f3a48C', token: "0x5832f53d147b3d6Cd4578B9CBD62425C7ea9d0Bd" } + } +} + +async function bitcoinTvl() { + return sumTokens({ owners: await bitcoinAddressBook.btcfi_cdp() }) } Object.keys(chainPools).forEach(chain => { @@ -14,4 +25,6 @@ Object.keys(chainPools).forEach(chain => { module.exports[chain] = { tvl: sumTokensExport({ tokensAndOwners }) } -}) \ No newline at end of file +}) + +module.exports["bitcoin"] = { tvl: bitcoinTvl } \ No newline at end of file diff --git a/projects/btcst/index.js b/projects/btcst/index.js index 19563fa439..492c6f1b23 100644 --- a/projects/btcst/index.js +++ b/projects/btcst/index.js @@ -1,6 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') const { stakings } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const BTCST = "0x78650B139471520656b9E7aA7A5e9276814a38e9"; @@ -30,29 +29,10 @@ const listOfTokens = [ "0xba2ae424d960c26247dd6c32edc70b295c744c43", ]; -async function bscTvl(chainBlocks) { - const balances = {}; - - const transformAddress = i => `bsc:${i}`; - for (const token of listOfTokens) { - await sumTokensAndLPsSharedOwners( - balances, - [[token, false]], - vaultContracts, - chainBlocks["bsc"], - "bsc", - transformAddress - ); - } - - return balances; -} - module.exports = { - misrepresentedTokens: true, bsc: { staking: stakings(vaultContracts, BTCST), - tvl: bscTvl, + tvl: stakings(vaultContracts, listOfTokens), }, methodology: "Counts liquidty on all the Vaults through their Contracts", }; diff --git a/projects/btse/index.js b/projects/btse/index.js index 08ded778d9..1b1c1a9701 100644 --- a/projects/btse/index.js +++ b/projects/btse/index.js @@ -1,9 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const config = { - bitcoin: { - owners: ['bc1qaxyju6n2x2tednv8e7hgnhnz44vrfcmuhjxpfk'] - }, -} - +const config = { bitcoin: { owners: bitcoinAddressBook.btse } } module.exports = cexExports(config) diff --git a/projects/bubbleswap-v2/index.js b/projects/bubbleswap-v2/index.js index 2ec1923a3e..3bd32bcbc8 100644 --- a/projects/bubbleswap-v2/index.js +++ b/projects/bubbleswap-v2/index.js @@ -3,6 +3,7 @@ module.exports = { hedera: { tvl: () => ({}), }, + deadFrom: '2023-07-01', timetravel: false, methodology: "Data is retrieved from the api at https://api.bubbleswap.io/", hallmarks: [ diff --git a/projects/bucket-farm/index.js b/projects/bucket-farm/index.js new file mode 100644 index 0000000000..0ca121dd40 --- /dev/null +++ b/projects/bucket-farm/index.js @@ -0,0 +1,29 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const sui = require("../helper/chain/sui"); + +const POINT_CENTER_ID = '0xc60fb4131a47aa52ac27fe5b6f9613ffe27832c5f52d27755511039d53908217' + +async function tvl(api) { + const pointCenter = await sui.getObject(POINT_CENTER_ID) + const poolStates = pointCenter.fields.pool_states.fields.contents.map((state)=>{ + const value = state.fields.value.fields + return{ + assetType: "0x" + value.asset_type, + totalStake: value.total_stake + } + }) + + for(const poolState of poolStates){ + let assetType = poolState.assetType + if(assetType == "0x922d15d7f55c13fd790f6e54397470ec592caa2b508df292a2e8553f3d3b274f::msui::MSUI" || assetType == "0x41ff228bfd566f0c707173ee6413962a77e3929588d010250e4e76f0d1cc0ad4::ksui::KSUI" || assetType == "0xd1b72982e40348d069bb1ff701e634c117bb5f741f44dff91e472d3b01461e55::stsui::STSUI" || assetType == "0xfbdd50dd7bc7af482d308f8c5d8c66c23e3b59494ff92f2947b150f20b5f43fd::af_lp::AF_LP") { + assetType = ADDRESSES.sui.SUI + } + api.add(assetType, poolState.totalStake) + } +} + +module.exports = { + sui: { + tvl + } +} \ No newline at end of file diff --git a/projects/bucket-protocol/index.js b/projects/bucket-protocol/index.js index 1c69565b56..b3c0a841e1 100644 --- a/projects/bucket-protocol/index.js +++ b/projects/bucket-protocol/index.js @@ -3,10 +3,21 @@ const sui = require("../helper/chain/sui"); const MAINNET_PROTOCOL_ID = "0x9e3dab13212b27f5434416939db5dec6a319d15b89a84fd074d03ece6350d3df"; +// Token +const SUI = ADDRESSES.sui.SUI; const BUCK = ADDRESSES.sui.BUCK; const USDC = ADDRESSES.sui.USDC; const USDT = ADDRESSES.sui.USDT; - +const USDC_CIRCLE= ADDRESSES.sui.USDC_CIRCLE +const FDUSD= "0xf16e6b723f242ec745dfd7634ad072c42d5c1d9ac9d62a39c381303eaa57693a::fdusd::FDUSD" +const SCALLOP_swUSDC = "0xad4d71551d31092230db1fd482008ea42867dbf27b286e9c70a79d2a6191d58d::scallop_wormhole_usdc::SCALLOP_WORMHOLE_USDC" +const SCALLOP_sUSDC = "0x854950aa624b1df59fe64e630b2ba7c550642e9342267a33061d59fb31582da5::scallop_usdc::SCALLOP_USDC" +const SCALLOP_sUSDT = "0xe6e5a012ec20a49a3d1d57bd2b67140b96cd4d3400b9d79e541f7bdbab661f95::scallop_wormhole_usdt::SCALLOP_WORMHOLE_USDT" +const SCALLOP_sSUI = "0xaafc4f740de0dd0dde642a31148fb94517087052f19afb0f7bed1dc41a50c77b::scallop_sui::SCALLOP_SUI" +const SCALLOP_sSB_ETH = "0xb14f82d8506d139eacef109688d1b71e7236bcce9b2c0ad526abcd6aa5be7de0::scallop_sb_eth::SCALLOP_SB_ETH" +const SCALLOP_sSCA = "0x5ca17430c1d046fae9edeaa8fd76c7b4193a00d764a0ecfa9418d733ad27bc1e::scallop_sca::SCALLOP_SCA" +const SPRING_SUI = "0x83556891f4a0f233ce7b05cfe7f957d4020492a34f5405b2cb9377d060bef4bf::spring_sui::SPRING_SUI" +const SCA_ADDRESS = "0x7016aae72cfc67f2fadf55769c0a7dd54291a583b63051a5ed71081cce836ac6::sca::SCA" const AF_LP_IDs = [ "0xe2569ee20149c2909f0f6527c210bc9d97047fe948d34737de5420fab2db7062", "0x885e09419b395fcf5c8ee5e2b7c77e23b590e58ef3d61260b6b4eb44bbcc8c62", @@ -35,12 +46,17 @@ const KRIYA_POOL_IDs = [ const CETUS_LP_ID = "0xb9d46d57d933fabaf9c81f4fc6f54f9c1570d3ef49785c6b7200cad6fe302909"; +const USDC_CIRCLE_PSM = + "0xd22388010d7bdb9f02f14805a279322a3fa3fbde42896b7fb3d1214af404c455"; + const USDC_PSM = "0x0c2e5fbfeb5caa4c2f7c8645ffe9eca7e3c783536efef859be03146b235f9e04"; const USDT_PSM = "0x607e7d386e29066b964934e0eb1daa084538a79b5707c34f38e190d64e24923e"; +const FDUSD_PSM = "0xb23092f74b7bbea45056d8564a7325be993cc2926b89f384367b9ad309dd92c5" + const BUCKETUS_PSM = "0xba86a0f37377844f38060a9f62b5c5cd3f8ba13901fa6c4ee5777c1cc535306b"; @@ -68,8 +84,13 @@ const scallop_sUSDC_LP_ID = const scallop_sUSDT_LP_ID = "0x6b68b42cbb4efccd9df30466c21fff3c090279992c005c45154bd1a0d87ac725"; +const scallop_sCircleUSDC_LP_ID = + "0xdf91ef19f6038e662e9c89f111ffe19e808cdfb891d080208d15141932f9513b"; + const haSUI_Navi_Pond_ID = "0xef1ff1334c1757d8e841035090d34b17b7aa3d491a3cb611319209169617518e" +const SUI_Navi_Pond_ID = "0xcf887d7201c259496a191348da86b4772a2e2ae3f798ca50d1247194e30b7656"; + async function getStakingLPAmount(id) { const stakingLPObject = await sui.getObject(id); return stakingLPObject.fields.output_volume; @@ -80,6 +101,22 @@ async function getScallopsLPAmount(id) { return stakingLPObject.fields.coin_balance; } +function convertUnderlyingAssets(coin){ + // USDC + if(coin === SCALLOP_swUSDC) return ADDRESSES.sui.USDC + if(coin === SCALLOP_sUSDC) return ADDRESSES.sui.USDC_CIRCLE + // USDT + if(coin === SCALLOP_sUSDT) return ADDRESSES.sui.USDT + // sSUI + if(coin === SCALLOP_sSUI) return ADDRESSES.sui.SUI + // sbETH + if(coin === SCALLOP_sSB_ETH) return ADDRESSES.sui.ETH + // sSCAUSDT_PSM + if(coin === SCALLOP_sSCA) return SCA_ADDRESS + + return coin +} + async function tvl(api) { const protocolFields = await sui.getDynamicFieldObjects({ parent: MAINNET_PROTOCOL_ID, @@ -104,6 +141,12 @@ async function tvl(api) { const cetusLpObj = await sui.getObject(CETUS_LP_ID); const stakedBucketus = cetusLpObj.fields.staked; + const usdcCirclePSMObj = await sui.getObject(USDC_CIRCLE_PSM); + const usdcCirclePSMAmount = usdcCirclePSMObj.fields.pool; + + const fdusdPSMObj = await sui.getObject(FDUSD_PSM); + const fdusdPSMAmount = fdusdPSMObj.fields.pool; + const usdcPSMObj = await sui.getObject(USDC_PSM); const usdcPSMAmount = usdcPSMObj.fields.pool; @@ -128,7 +171,10 @@ async function tvl(api) { for (const bucket of bucketList) { //AF_LP doesn't have price, need to split the tokens if (bucket.type.includes("AF_LP")) continue; - const coin = bucket.type.split("<").pop()?.replace(">", "") ?? ""; + const coin_address = bucket.type.split("<").pop()?.replace(">", "") ?? ""; + + /// Since we're unable to fetch the price of Scallop's sCOIN, we'll regard sCOIN as underlying assets + const coin = convertUnderlyingAssets(coin_address) api.add(coin, bucket.fields.collateral_vault); } @@ -181,8 +227,10 @@ async function tvl(api) { const halfStakedBucketus = Math.floor(stakedBucketus / 2); api.add(USDC, Math.floor(halfStakedBucketus / 1000)); + api.add(USDC_CIRCLE, Math.floor(usdcCirclePSMAmount)); api.add(USDC, Math.floor(usdcPSMAmount)); api.add(USDT, Math.floor(usdtPSMAmount)); + api.add(FDUSD, Math.floor(fdusdPSMAmount)); // 1 Cetable = 0.5 USDC + 0.5 USDT const halfCetableAmount = Math.floor(cetablePSMAmount / 2); @@ -246,11 +294,20 @@ async function tvl(api) { haSuiNaviPondAmount ); + const suiNaviPondAmount = await getStakingLPAmount(SUI_Navi_Pond_ID); + api.add( + SUI, + suiNaviPondAmount + ); + const scallopUSDC_LPAmount = await getScallopsLPAmount(scallop_sUSDC_LP_ID); api.add(USDC, scallopUSDC_LPAmount); const scallopUSDT_LPAmount = await getScallopsLPAmount(scallop_sUSDT_LP_ID); api.add(USDT, scallopUSDT_LPAmount); + + const scallopCircleUSDC_LPAmount = await getScallopsLPAmount(scallop_sCircleUSDC_LP_ID); + api.add(USDC_CIRCLE, scallopCircleUSDC_LPAmount) } module.exports = { diff --git a/projects/bulbaswap-v2/index.js b/projects/bulbaswap-v2/index.js new file mode 100644 index 0000000000..c7df338a40 --- /dev/null +++ b/projects/bulbaswap-v2/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'morph': '0x8D2A8b8F7d200d75Bf5F9E84e01F9272f90EFB8b' +}) \ No newline at end of file diff --git a/projects/bulbaswap-v3/index.js b/projects/bulbaswap-v3/index.js new file mode 100644 index 0000000000..c7ac10b8b7 --- /dev/null +++ b/projects/bulbaswap-v3/index.js @@ -0,0 +1,3 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ morph: { factory: '0xFf8578C2949148A6F19b7958aE86CAAb2779CDDD', fromBlock: 25159, } }) \ No newline at end of file diff --git a/projects/bunicorn/index.js b/projects/bunicorn/index.js index 7ab2ca1e54..737e953316 100644 --- a/projects/bunicorn/index.js +++ b/projects/bunicorn/index.js @@ -18,7 +18,7 @@ module.exports = { allPairsLength: 'uint256:allPoolsLength', allPairs: 'function allPools(uint256) view returns (address)', }, - fetchBalances: true, + fetchBalances: true, // get reserves call fails }).bsc.tvl]), staking, }, diff --git a/projects/burve-protocol/index.js b/projects/burve-protocol/index.js index 53d9ae554d..dae89f7c12 100644 --- a/projects/burve-protocol/index.js +++ b/projects/burve-protocol/index.js @@ -6,7 +6,7 @@ const config = { } module.exports = { - start: 1707300000, + start: '2024-02-07', methodology: "The TVL including total values of assets locked in the tokens which are deployed by BurveProtocol", } diff --git a/projects/buzz-farming/index.js b/projects/buzz-farming/index.js index 0c8950c9e5..146b5e9dd7 100644 --- a/projects/buzz-farming/index.js +++ b/projects/buzz-farming/index.js @@ -10,8 +10,9 @@ const ADDRESSES_BSQUARED_FBTC = '0x5d247f32b792a61f7b4078cf7752a878aff152e2'; const ADDRESSES_BSQUARED_UBTC = ADDRESSES.bsquared.UBTC; const ADDRESSES_BSQUARED_USDA = '0x46fecc5bef70615ee3bfdbd2b278944368b78cf5'; const ADDRESSES_BSQUARED_ETH = ADDRESSES.bsquared.ETH; +const ADDRESSES_BSQUARED_UNIBTC = '0x93919784C523f39CACaa98Ee0a9d96c3F32b593e'; -const tokenList = [ADDRESSES.null, ADDRESSES.bsquared.USDT, ADDRESSES.bsquared.USDC, ADDRESSES.bsquared.WBTC, ADDRESSES_BSQUARED_BSTONE, ADDRESSES_BSQUARED_FDUSD, ADDRESSES_BSQUARED_MATIC, ADDRESSES_BSQUARED_ORDI, ADDRESSES_BSQUARED_SATS, ADDRESSES_BSQUARED_FBTC, ADDRESSES_BSQUARED_UBTC, ADDRESSES_BSQUARED_USDA, ADDRESSES_BSQUARED_ETH,]; +const tokenList = [ADDRESSES.null, ADDRESSES.bsquared.USDT, ADDRESSES.bsquared.USDC, ADDRESSES.bsquared.WBTC, ADDRESSES_BSQUARED_BSTONE, ADDRESSES_BSQUARED_FDUSD, ADDRESSES_BSQUARED_MATIC, ADDRESSES_BSQUARED_ORDI, ADDRESSES_BSQUARED_SATS, ADDRESSES_BSQUARED_FBTC, ADDRESSES_BSQUARED_UBTC, ADDRESSES_BSQUARED_USDA, ADDRESSES_BSQUARED_ETH, ADDRESSES_BSQUARED_UNIBTC]; module.exports = { diff --git a/projects/bwswap/index.js b/projects/bwswap/index.js index c3e0bd3f48..ea2470e9f6 100644 --- a/projects/bwswap/index.js +++ b/projects/bwswap/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('base', '0x67233C258BAeE28b2a7d42ec19fBD0b750a77Cd1', { fetchBalances: true }) \ No newline at end of file +module.exports = uniTvlExport('base', '0x67233C258BAeE28b2a7d42ec19fBD0b750a77Cd1') \ No newline at end of file diff --git a/projects/bybit/index.js b/projects/bybit/index.js index dfbdf54ffa..eb982dcb46 100644 --- a/projects/bybit/index.js +++ b/projects/bybit/index.js @@ -1,75 +1,150 @@ -const { cexExports } = require('../helper/cex') +const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { owners: [ - '0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4', - '0xA7A93fd0a276fc1C0197a5B5623eD117786eeD06', - '0xe1ab8c08294F8ee707D4eFa458eaB8BbEeB09215', - '0xee5B5B923fFcE93A870B3104b7CA09c3db80047A', - '0xf89d7b9c864f589bbF53a82105107622B35EaA40', // multiple chains + "0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4", + "0xA7A93fd0a276fc1C0197a5B5623eD117786eeD06", + "0xe1ab8c08294F8ee707D4eFa458eaB8BbEeB09215", + "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A", + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", // multiple chains + "0x88a1493366d48225fc3cefbdae9ebb23e323ade3", + "0x6Bd869be16359f9E26f0608A50497f6Ef122eE3E", + "0x922fa922da1b0b28d0af5aa274d7326eaa108c3d", + "0xbaed383ede0e5d9d72430661f3285daa77e9439f" ], }, bitcoin: { - owners: [ - 'bc1q2qqqt87kh33s0er58akh7v9cwjgd83z5smh9rp', - 'bc1q9w4g79ndel72lygvwtqzem67z6uqv4yncvqjz3yn8my9swnwflxsutg4cx', - 'bc1qjysjfd9t9aspttpjqzv68k0ydpe7pvyd5vlyn37868473lell5tqkz456m', - '1GrwDkr33gT6LuumniYjKEGjTLhsL5kmqC', - 'bc1qs5vdqkusz4v7qac8ynx0vt9jrekwuupx2fl5udp9jql3sr03z3gsr2mf0f', - // added on the 15th of july 2024. - 'bc1qa2eu6p5rl9255e3xz7fcgm6snn4wl5kdfh7zpt05qp5fad9dmsys0qjg0e' - ] + owners: bitcoinAddressBook.bybit, }, bsc: { owners: [ - '0xee5B5B923fFcE93A870B3104b7CA09c3db80047A', - '0xf89d7b9c864f589bbf53a82105107622b35eaa40', - ] + "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A", + "0xf89d7b9c864f589bbf53a82105107622b35eaa40", + "0x88a1493366d48225fc3cefbdae9ebb23e323ade3" + ], }, tron: { owners: [ - 'TB1WQmj63bHV9Qmuhp39WABzutphMAetSc', - 'TBpr1tQ5kvoKMv85XsCESVavYo4oZZdWpY', - 'TKFvdC4UC1vtCoHZgn8eviK34kormXaqJ7', - 'TQVxjVy2sYt4at45ezD7VG4H6nQZtsua5C', - 'TS9PDCB6vzLYDCPr5Nas2yzekdr7ot6dxn', - 'TU4vEruvZwLLkSfV9bNw12EJTPvNr7Pvaa', - 'TXRRpT4BZ3dB5ShUQew2HXv1iK3Gg4MM9j', - 'TYgFxMvvu2VHFJnxQf8fh1qVAeMfXZJZ3K', - ] + "TB1WQmj63bHV9Qmuhp39WABzutphMAetSc", + "TBpr1tQ5kvoKMv85XsCESVavYo4oZZdWpY", + "TKFvdC4UC1vtCoHZgn8eviK34kormXaqJ7", + "TQVxjVy2sYt4at45ezD7VG4H6nQZtsua5C", + "TS9PDCB6vzLYDCPr5Nas2yzekdr7ot6dxn", + "TU4vEruvZwLLkSfV9bNw12EJTPvNr7Pvaa", + "TXRRpT4BZ3dB5ShUQew2HXv1iK3Gg4MM9j", + "TYgFxMvvu2VHFJnxQf8fh1qVAeMfXZJZ3K", + "TB1cPNTPE2yKRbyd5C3hd9KMXgb8HqW1CM", + "TTH75Z9rfRgzCLNDDYBaR2WjUvuSDRtSMg" + ], }, polygon: { - owners: ['0xf89d7b9c864f589bbf53a82105107622b35eaa40'] + owners: ["0xf89d7b9c864f589bbf53a82105107622b35eaa40", "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A"], }, arbitrum: { - owners: ['0xf89d7b9c864f589bbF53a82105107622B35EaA40'] + owners: ["0xf89d7b9c864f589bbF53a82105107622B35EaA40", "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A"], }, avax: { - owners: ['0xf89d7b9c864f589bbF53a82105107622B35EaA40'] + owners: ["0xf89d7b9c864f589bbF53a82105107622B35EaA40", "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A"], }, ripple: { owners: [ - 'rMvCasZ9cohYrSZRNYPTZfoaaSUQMfgQ8G', - 'rwBHqnCgNRnk3Kyoc6zon6Wt4Wujj3HNGe', - 'raQxZLtqurEXvH5sgijrif7yXMNwvFRkJN' - ] + "rMvCasZ9cohYrSZRNYPTZfoaaSUQMfgQ8G", + "rwBHqnCgNRnk3Kyoc6zon6Wt4Wujj3HNGe", + "raQxZLtqurEXvH5sgijrif7yXMNwvFRkJN", + "raBWjPDjohBGc9dR6ti3DsP9Sn47jirTi3" + ], }, optimism: { - owners: ['0xf89d7b9c864f589bbF53a82105107622B35EaA40'] + owners: ["0xf89d7b9c864f589bbF53a82105107622B35EaA40", "0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4", "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A"], }, era: { - owners: ['0xf89d7b9c864f589bbF53a82105107622B35EaA40'] + owners: ["0xf89d7b9c864f589bbF53a82105107622B35EaA40", "0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4", "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A"], }, solana: { owners: [ - 'AC5RDfQFmDS1deWZos921JfqscXdByf8BKHs5ACWjtW2', - '42brAgAVNzMBP7aaktPvAmBSPEkehnFQejiZc53EpJFd' - ] + "AC5RDfQFmDS1deWZos921JfqscXdByf8BKHs5ACWjtW2", + "42brAgAVNzMBP7aaktPvAmBSPEkehnFQejiZc53EpJFd", + ], }, cardano: { - owners: ['addr1v8mn6dmk7tf9u26kr09a05lmvc9j4k9d940a88ta3hdczqgyt7whl'] - } -} + owners: ["addr1v8mn6dmk7tf9u26kr09a05lmvc9j4k9d940a88ta3hdczqgyt7whl"], + }, + aptos: { + owners: [ + "0x84b1675891d370d5de8f169031f9c3116d7add256ecf50a4bc71e3135ddba6e0", + ], + }, + taiko: { + owners: [ + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + ], + }, + celo: { + owners: [ + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + ], + }, + base: { + owners: [ + "0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4", + "0xbaed383ede0e5d9d72430661f3285daa77e9439f", + "0xee5B5B923fFcE93A870B3104b7CA09c3db80047A", + ], + }, + fantom: { + owners: [ + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + ], + }, + kava: { + owners: [ + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + ], + }, + linea: { + owners: [ + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + ], + }, + litecoin: { + owners: [ + "LKxNtynH2GxLc2oLxUGL6ryckK8JMdP5BR", + "ltc1qp7cnlxmz8wgc93g0m020ckru2s55t25y3wunf6" + ], + }, + manta: { + owners: [ + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + "0xa6a9f45518881a788e29f82a032f9d400177d2b6", + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + "0x588846213a30fd36244e0ae0ebb2374516da836c" + ], + }, + scroll: { + owners: [ + "0xf89d7b9c864f589bbF53a82105107622B35EaA40", + ], + }, + polkadot: { + owners: [ + "11yLs2qzU15AhxnH1d7Koqcf83AwutKkDaGbqsJJ6yDWQjc", + "12nr7GiDrYHzAYT9L8HdeXnMfWcBuYfAXpgfzf3upujeCciz" + ], + }, + eos: { + owners: [ + "coldcrazycat", + "eosdididada3", + "kcwo3rimcnqf" + ], + }, + starknet: { + owners: [ + "0x076601136372fcdbbd914eea797082f7504f828e122288ad45748b0c8b0c9696" + ], + }, +}; -module.exports = cexExports(config) \ No newline at end of file +module.exports = cexExports(config); diff --git a/projects/bybitSOL/index.js b/projects/bybitSOL/index.js new file mode 100644 index 0000000000..d1c4d1c48f --- /dev/null +++ b/projects/bybitSOL/index.js @@ -0,0 +1,13 @@ + +const { getSolBalanceFromStakePool } = require('../helper/solana') + +async function tvl(api) { + await getSolBalanceFromStakePool('2aMLkB5p5gVvCwKkdSo5eZAL1WwhZbxezQr1wxiynRhq', api) +} + +module.exports = { + timetravel: false, + solana: { + tvl + } +} \ No newline at end of file diff --git a/projects/cabinet/index.js b/projects/cabinet/index.js new file mode 100644 index 0000000000..a0df108b04 --- /dev/null +++ b/projects/cabinet/index.js @@ -0,0 +1,42 @@ +const { fetchLocal, mkMeta } = require("../helper/pact"); + +const chainId = "5"; +const network = `https://api.chainweb.com/chainweb/0.0/mainnet01/chain/${chainId}/pact`; +const GAS_PRICE = 0.00000001; +const creationTime = () => Math.round(new Date().getTime() / 1000) - 10; + + +const getReserve = (tokenData) => { + return parseFloat(tokenData.decimal ? tokenData.decimal : tokenData); +}; + + +const getCabinetTvl = async () => { + const data = await fetchLocal( + { + pactCode: `(coin.get-balance "c:86aaCQXT8uRkyXGXu9k-eNn1kXqV_nNmjTYErKpZ6vE")`, + meta: mkMeta("", chainId, GAS_PRICE, 3000, creationTime(), 600) + }, + network + ); + if (data.result.status === "success") { + return getReserve(data.result.data); + } + throw new Error("Failed do fetch TVL"); + +} + +async function tvl() { + const cabinetTvl = await getCabinetTvl(); + return { + kadena: cabinetTvl, + }; +} + +module.exports = { + timetravel: false, + misrepresentedTokens: true, + kadena: { + tvl: tvl, + }, +}; diff --git a/projects/cables/index.js b/projects/cables/index.js new file mode 100644 index 0000000000..748416239d --- /dev/null +++ b/projects/cables/index.js @@ -0,0 +1,19 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') +const config = { + avax: { + owners: [ + '0xfA12DCB2e1FD72bD92E8255Db6A781b2c76adC20', + ], + }, + arbitrum: { + owners: [ + '0xfA12DCB2e1FD72bD92E8255Db6A781b2c76adC20', + ], + } +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: sumTokensExport({ ...config[chain], fetchCoValentTokens: true, }) + } +}) \ No newline at end of file diff --git a/projects/cache-gold/index.js b/projects/cache-gold/index.js index ae5f2404e6..22ce274991 100644 --- a/projects/cache-gold/index.js +++ b/projects/cache-gold/index.js @@ -27,5 +27,5 @@ module.exports = { ethereum: { tvl, }, - start: 1617235200 + start: '2021-04-01' }; diff --git a/projects/cake-defi/index.js b/projects/cake-defi/index.js index 8d2bcba9dd..f6e1b0420c 100644 --- a/projects/cake-defi/index.js +++ b/projects/cake-defi/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -18,7 +19,7 @@ const config = { ] }, bitcoin: { - owners: ['3GcSHxkKY8ADMWRam51T1WYxYSb2vH62VL'] + owners: bitcoinAddressBook.cakeDefi }, litecoin: { owners: ['MLYQxJfnUfVqRwfYXjDJfmLbyA77hqzSXE'] diff --git a/projects/cake-monster/index.js b/projects/cake-monster/index.js index 891e9024d6..63a232986f 100644 --- a/projects/cake-monster/index.js +++ b/projects/cake-monster/index.js @@ -5,7 +5,6 @@ const CM_STAKING_CONTRACT = "0xF7CDDF60CD076d4d64c613489aA00dCCf1E518F6"; module.exports = { methodology: "counts the number of $MONSTA tokens in the Cake Monster Staking contract, excluding the amount reserved for the staking rewards.", - start: 15765654, bsc: { tvl: () => ({}), staking: staking(CM_STAKING_CONTRACT, CM_TOKEN_CONTRACT), diff --git a/projects/camelot-v2/index.js b/projects/camelot-v2/index.js index 86744d174c..cc9f9e5631 100644 --- a/projects/camelot-v2/index.js +++ b/projects/camelot-v2/index.js @@ -1,4 +1,3 @@ - const { uniV3Export } = require('../helper/uniswapV3') const { mergeExports } = require('../helper/utils'); @@ -12,6 +11,9 @@ const export2 = uniV3Export({ sanko: { factory: '0xcF8d0723e69c6215523253a190eB9Bc3f68E0FFa', fromBlock: 51, isAlgebra: true}, arbitrum: { factory: '0xd490f2f6990c0291597fd1247651b4e0dcf684dd', fromBlock: 75633510, isAlgebra: true, }, reya: { factory: '0x10aA510d94E094Bd643677bd2964c3EE085Daffc', fromBlock: 2932166, isAlgebra: true, }, + gravity: { factory: '0x10aA510d94E094Bd643677bd2964c3EE085Daffc', fromBlock: 11988, isAlgebra: true, }, + apechain: { factory: '0x10aA510d94E094Bd643677bd2964c3EE085Daffc', fromBlock: 60224, isAlgebra: true, }, + duckchain: { factory: '0xCf4062Ee235BbeB4C7c0336ada689ed1c17547b6', fromBlock: 1530060, isAlgebra: true, }, }) module.exports = mergeExports([export1, export2 ]) \ No newline at end of file diff --git a/projects/camelot/index.js b/projects/camelot/index.js index 0309b5817c..bf8159e28f 100644 --- a/projects/camelot/index.js +++ b/projects/camelot/index.js @@ -2,7 +2,7 @@ const { getUniTVL } = require("../helper/unknownTokens"); module.exports = { misrepresentedTokens: true, - start: 1669075200, + start: '2022-11-22', arbitrum: { tvl: getUniTVL({ factory: '0x6EcCab422D763aC031210895C81787E87B43A652', useDefaultCoreAssets: true,}), }, @@ -17,5 +17,14 @@ module.exports = { }, reya: { tvl: getUniTVL({factory: '0x7d8c6B58BA2d40FC6E34C25f9A488067Fe0D2dB4', useDefaultCoreAssets: true}) + }, + gravity: { + tvl: getUniTVL({factory: '0x7d8c6B58BA2d40FC6E34C25f9A488067Fe0D2dB4', useDefaultCoreAssets: true}) + }, + apechain: { + tvl: getUniTVL({factory: '0x7d8c6B58BA2d40FC6E34C25f9A488067Fe0D2dB4', useDefaultCoreAssets: true}) + }, + duckchain: { + tvl: getUniTVL({factory: '0x7d8c6B58BA2d40FC6E34C25f9A488067Fe0D2dB4', useDefaultCoreAssets: true}) } }; \ No newline at end of file diff --git a/projects/canto-lending/index.js b/projects/canto-lending/index.js index c7e02a89e3..ccd3c82344 100644 --- a/projects/canto-lending/index.js +++ b/projects/canto-lending/index.js @@ -9,7 +9,7 @@ const addresses = { NoteUSDCLP: '0x9571997a66D63958e1B3De9647C22bD6b9e7228c', CantoETHLP: '0x216400ba362d8FCE640085755e47075109718C8B', Comptroller: '0x5E23dC409Fc2F832f83CEc191E245A191a4bCc5C', - Note: ADDRESSES.canto.NOTE, + Note: '0x4e71a2e537b7f9d9413d3991d37958c0b5e1e503', USDC: ADDRESSES.functionx.WFX, USDT: ADDRESSES.functionx.PUNDIX, ATOM: ADDRESSES.functionx.USDT, @@ -25,8 +25,7 @@ const addresses = { } const chain = 'canto' -const checkForLPTokens = i => /vAMM/.test(i) -const compoundData = compoundExports(addresses.Comptroller, chain, addresses.CCANTO, addresses.WCANTO, undefined, checkForLPTokens, { blacklistedTokens:[ +const compoundData = compoundExports(addresses.Comptroller, addresses.CCANTO, addresses.WCANTO, { blacklistedTokens:[ addresses.Note, addresses.NOTE_WCANTO, addresses.ETH_WCANTO, diff --git a/projects/cantohm/index.js b/projects/cantohm/index.js index ffedffea92..8921ba6596 100644 --- a/projects/cantohm/index.js +++ b/projects/cantohm/index.js @@ -12,7 +12,7 @@ module.exports = { tvl: sumTokensExport({ owner: '0xB8Ce90A08bdAdd3e6e6cD3173c0661FA94Aa81c5', tokens: [ - ADDRESSES.canto.NOTE, + '0x4e71a2e537b7f9d9413d3991d37958c0b5e1e503', ADDRESSES.canto.WCANTO, ...lps, ], diff --git a/projects/capy-finance/index.js b/projects/capy-finance/index.js index 9dedd33d17..08a07e461d 100644 --- a/projects/capy-finance/index.js +++ b/projects/capy-finance/index.js @@ -10,7 +10,6 @@ async function tvl(api) { module.exports = { methodology: 'The TVL of the Capy Finance project in USD.', - start: 1000235, bsquared: { tvl, }, diff --git a/projects/capybara-exchange/config.js b/projects/capybara-exchange/config.js index f5272a6610..9d552c09fc 100644 --- a/projects/capybara-exchange/config.js +++ b/projects/capybara-exchange/config.js @@ -1,8 +1,5 @@ module.exports = { klaytn: { - pools: { - mainPool: "0x540cce8ed7d210f71eeabb9e7ed7698ac745e077", - volatilePool: "0x6389dbfa1427a3b0a89cddc7ea9bbda6e73dece7", - }, + master: "0x3CA30C862769b5de7987D2E2db4c1A72800A1Da1", }, }; diff --git a/projects/capybara-exchange/index.js b/projects/capybara-exchange/index.js index 9810ad1be6..4f34cd275c 100644 --- a/projects/capybara-exchange/index.js +++ b/projects/capybara-exchange/index.js @@ -2,23 +2,20 @@ const config = require("./config"); const { sumTokens2 } = require("../helper/unwrapLPs"); Object.keys(config).forEach((chain) => { - const arg = config[chain]; + const { master } = config[chain]; module.exports[chain] = { tvl: async (api) => { - const pools = Object.values(arg["pools"]); - - let allUnderlying = await api.multiCall({ abi: "address[]:getTokens", calls: pools, }); - - const tokens = []; - const calls = []; - pools.forEach((v, i) => { - allUnderlying[i].forEach((t) => { - tokens.push(t); - calls.push({ target: v, params: t }); - }); + const poolInfos = await api.fetchList({ + // Reference: https://github.com/wombat-exchange/v1-core/blob/5887ec5e1f1cbd067eaee8aee49fcb857fb867c5/contracts/wombat-governance/MasterWombatV3.sol#L587 + lengthAbi: 'poolLength', + itemAbi: "function poolInfo(uint256) external view returns (address asset, uint96, address, uint256, uint104, uint104, uint40)", + target: master, }); - const wTokens = await api.multiCall({ abi: "function addressOfAsset(address) view returns (address)", calls, }); - return sumTokens2({ api, tokensAndOwners2: [tokens, wTokens], }); + // Reference: https://github.com/wombat-exchange/v1-core/blob/5887ec5e1f1cbd067eaee8aee49fcb857fb867c5/contracts/wombat-core/asset/Asset.sol#L4 + const assets = poolInfos.map(i => i.asset); + const uTokens = await api.multiCall({ abi: 'address:underlyingToken', calls: assets }) + + return sumTokens2({ api, tokensAndOwners2: [uTokens, assets], }); }, }; }); diff --git a/projects/capybara-perp/index.js b/projects/capybara-perp/index.js new file mode 100644 index 0000000000..27ea0a80f5 --- /dev/null +++ b/projects/capybara-perp/index.js @@ -0,0 +1,8 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') + +module.exports = { + klaytn: { + tvl: sumTokensExport({ owners: ['0xeB23e0a5065D96FCa71DE240C6b302B9Da14Ac0e', '0x94b231dD60E64ba8bCC72892cE4B4B9A5004730d'], tokens: [ADDRESSES.klaytn.stKaia] }), + } +} diff --git a/projects/carrot/index.js b/projects/carrot/index.js new file mode 100644 index 0000000000..181ce8bb9c --- /dev/null +++ b/projects/carrot/index.js @@ -0,0 +1,50 @@ +const { PublicKey } = require('@solana/web3.js'); +const { Program } = require("@project-serum/anchor"); +const { getConnection, getProvider, getTokenSupplies } = require('../helper/solana') + +async function tvl(api) { + + const connection = getConnection() + const programId = 'CarrotwivhMpDnm27EHmRLeQ683Z1PufuqEmBZvD282s' + const testVaultExclusion = '2AV35oWyAuSN5wmuy26VD5JirjVpXkfkv5ZMCQ2LtpuV' // our test vault should not be included in TVL + + // Use this method to track TVL via the token... + // const CRT_MINT = 'CRTx1JouZhzSU6XytsE42UQraoGqiHgxabocVfARTy2s'; + // await getTokenSupplies(CRT_MINT, {api}) + + // Use this method to track TVL via onchain state of each Vault by adding the balance at each strategy. + const programAccounts = await connection.getProgramAccounts(new PublicKey(programId), { + filters: [{ + memcmp: { + offset: 8, + bytes: 'CarrotLYPhQzYL4fEsTUvEzw5QDaMGSZUENHSkh7qzQa' // carrot keeper + }, + },] + }); + + const provider = getProvider(); + const idl = await Program.fetchIdl(programId, provider) + const program = new Program(idl, programId, provider) + + programAccounts.forEach(({ account, pubkey }, i) => { + if(pubkey.toBase58() !== testVaultExclusion) { + const { assets, strategies } = program.coder.accounts.decode( + "Vault", + account.data + ); + const assetMap = {} + assets.forEach(({assetId, mint }) => assetMap[assetId] = mint.toString()) + + strategies.forEach(i => { + api.add(assetMap[i.assetId], i.balance.toString()) + }) + } + }) +} + +module.exports = { + doublecounted: true, + timetravel: false, + methodology: 'TVL calculated by calling the onchain state of the CRT Vault accounts, and tallying the balance of each strategy.', + solana: { tvl }, +} diff --git a/projects/carrotswap/index.js b/projects/carrotswap/index.js new file mode 100644 index 0000000000..4e1c4cce50 --- /dev/null +++ b/projects/carrotswap/index.js @@ -0,0 +1,5 @@ +const { getUniTVL } = require('../helper/unknownTokens') + +module.exports = { + neox: { tvl: getUniTVL({ factory: '0x753df473702cB31BB81a93966e658e1AA4f10DD8', useDefaultCoreAssets: true })} +} \ No newline at end of file diff --git a/projects/cashcow/index.js b/projects/cashcow/index.js index c59fa600be..b919f5f0b9 100644 --- a/projects/cashcow/index.js +++ b/projects/cashcow/index.js @@ -29,7 +29,6 @@ module.exports = { bsc: { staking: stakingPools, ...compoundExports(comptroller, - "bsc", cBNB, WBNBEquivalent) }, diff --git a/projects/catalist-dex/index.js b/projects/catalist-dex/index.js new file mode 100644 index 0000000000..f04be0c5a4 --- /dev/null +++ b/projects/catalist-dex/index.js @@ -0,0 +1,4 @@ +const { uniV3Export } = require('../helper/uniswapV3') +module.exports = uniV3Export({ + 'ace': { factory: '0xbe2fb231883840b9de5a0f43eb55b71253b0ce7b', fromBlock: 10,} +}) \ No newline at end of file diff --git a/projects/catton/index.js b/projects/catton/index.js new file mode 100644 index 0000000000..a63c82dc54 --- /dev/null +++ b/projects/catton/index.js @@ -0,0 +1,21 @@ +const { call, getJettonBalances, getTonBalance, sumTokens } = require("../helper/chain/ton"); +const { sleep } = require('../helper/utils') +const ADDRESSES = require('../helper/coreAssets.json') + +const TON_POOL_ADDRESS = "EQAze1aSZHY1yUGz1BFndH62k-VYpXYeDiYofCXTRZClF8Qr" +const USD_POOL_ADDRESS = "EQBy7pjr6IBzqW8vuVCZ780evtnkiIF3jZSRRDxeqScfZoU9" +const CTON_ADDRESS = "0:86cf8401d283627a87b58c367b440cad933ab8aa7b383419e8ff7d1a00c945f8" +const CTUSDT_ADDRESS = "0:9fb449ce8fb43d0f682c713c01d9d8357c7cd0d4a49dd64dd585926990174a4e" +const USDT_ADDRESS = "0:b113a994b5024a16719f69139328eb759596c38a25f59028b146fecdc3621dfe" + +async function tvl(api) { + return sumTokens({ owners: [TON_POOL_ADDRESS, USD_POOL_ADDRESS, "UQDFlyZ5zsWyowbZvZjZwIW_Vzm-1uvf8z_PUfvQtHrV14dp"], tokens: [ADDRESSES.null, USDT_ADDRESS], api, onlyWhitelistedTokens: true }) +} + +module.exports = { + methodology: 'Total amount of collateral locked in the Catton Protocol', + timetravel: false, + ton: { + tvl + } +} diff --git a/projects/cauldron/index.js b/projects/cauldron/index.js index da279509ee..ae166a15e0 100644 --- a/projects/cauldron/index.js +++ b/projects/cauldron/index.js @@ -23,7 +23,7 @@ async function tvl({ timestamp }) { module.exports = { methodology: "Scrape the blockchain and filter for spent transaction outputs that match the cauldron contract's redeem script. Check if the transaction has an output with a locking script that matches the redeem script in the input. A match on locking script means the funds are still locked in the DEX contract. Aggregate the value of funds in contract utxos.", - start: 1688198180, + start: '2023-07-01', bitcoincash: { tvl }, hallmarks: [ [1688198180, "First cauldron contract deployed (SOCK)"], diff --git a/projects/cega-v2/index.js b/projects/cega-v2/index.js index 4a8f77f962..9984232255 100644 --- a/projects/cega-v2/index.js +++ b/projects/cega-v2/index.js @@ -27,7 +27,7 @@ module.exports = { ADDRESSES.arbitrum.WBTC, ADDRESSES.arbitrum.DAI, ADDRESSES.arbitrum.USDe, - '0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2', + ADDRESSES.arbitrum.sUSDe, ], owners: ["0x475c4af369b28997b25bd756ef92797ad3f69593"], }), diff --git a/projects/celeron/index.js b/projects/celeron/index.js new file mode 100644 index 0000000000..6685e1a3d2 --- /dev/null +++ b/projects/celeron/index.js @@ -0,0 +1,23 @@ +const FARM_ADDRESS = "0x3384D85EC14163a9d35eeAb44261390aafD70f82"; +const FARM_IONIC_ADDRESS = "0x8D25067901B637D0eF1DF3163D782d89d53F403A"; +const CEL_ADDRESS = "0x8b83ECC4EF8FaEc5c05b7D6EC002B659BE137120"; + +async function tvl(api) { + let pools = await api.call({ abi: abiInfo.poolTvls, target: FARM_IONIC_ADDRESS }); + pools.forEach(i => api.add(i.assets, i.tvl)); +} + +async function staking(api) { + let pools = await api.call({ abi: abiInfo.poolTvls, target: FARM_ADDRESS }); + let target = pools.find((i) => i.assets === CEL_ADDRESS); + api.add(CEL_ADDRESS, target.tvl); +} + +module.exports = { + mode: { tvl, staking, }, +}; + +const abiInfo = { + poolTvls: + "function getPoolTotalTvl() view returns (tuple(uint256 pid, address assets, uint256 tvl)[])", +}; diff --git a/projects/cellana/index.js b/projects/cellana/index.js index 04bc636c58..ff92478766 100644 --- a/projects/cellana/index.js +++ b/projects/cellana/index.js @@ -13,8 +13,7 @@ const extractCoinAddress = (str) => str.slice(str.indexOf("<") + 1, str.lastInde const reserveContrainerFilter = (i) => i.type.includes("0x1::coin::CoinStore") async function getfungibleAssetBalances(api) { - const data = await _getPools('0x4bf51972879e3b95c4781a5cdcb9e1ee24ef483e7d22f2d903626f126df62bd1') - const poolsAddresses = data[0]; + const poolsAddresses = await _getPools('0x4bf51972879e3b95c4781a5cdcb9e1ee24ef483e7d22f2d903626f126df62bd1') for (const pool of poolsAddresses) { const fungibleAssetPoolStore = (await getResources(pool.inner)).find(i => i.type.includes('liquidity_pool::LiquidityPool'))?.data const fungibleAssetAddressToken1 = fungibleAssetPoolStore?.token_store_1?.inner @@ -35,7 +34,7 @@ module.exports = { "Counts the lamports in each coin container in the Cellena contract account.", aptos: { - tvl: async (_, _1, _2, { api }) => { + tvl: async (api) => { const data = await _getResources() const coinContainers = data.filter(reserveContrainerFilter) @@ -49,7 +48,6 @@ module.exports = { }); //get funible asset balance await getfungibleAssetBalances(api) - console.log(api) } } } \ No newline at end of file diff --git a/projects/cells/index.js b/projects/cells/index.js index 6cc7ec3d6d..ec2506fb2a 100644 --- a/projects/cells/index.js +++ b/projects/cells/index.js @@ -4,4 +4,5 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2023-06-11') / 1e3), 'Project rugged'], ], + deadFrom: Math.floor(new Date('2023-06-11') / 1e3) } \ No newline at end of file diff --git a/projects/cemetery/index.js b/projects/cemetery/index.js index 2658153249..b55b1f79ac 100644 --- a/projects/cemetery/index.js +++ b/projects/cemetery/index.js @@ -7,5 +7,6 @@ module.exports = masterchefExports({ }) module.exports.hallmarks = [ [1646524800,"Rug Pull"] -] +], +module.exports.deadFrom='2022-03-06' diff --git a/projects/ceto-swap/index.js b/projects/ceto-swap/index.js index 65de715ab2..bd9840a688 100644 --- a/projects/ceto-swap/index.js +++ b/projects/ceto-swap/index.js @@ -4,6 +4,6 @@ const factory = '0xf50c8e257ccf3e2b58651f78e3c2dc83446d9c47'; module.exports = { manta: { - tvl: getUniTVL({ factory, useDefaultCoreAssets: true, fetchBalances: true }), + tvl: getUniTVL({ factory, useDefaultCoreAssets: true, }), }, }; diff --git a/projects/chain-fusion/index.js b/projects/chain-fusion/index.js new file mode 100644 index 0000000000..80c79de0d0 --- /dev/null +++ b/projects/chain-fusion/index.js @@ -0,0 +1,27 @@ +const { sumTokens2, } = require("../helper/unwrapLPs"); +const { get } = require('../helper/http') + +// This address holds all the locked ETH as well as locked ERC20 tokens +const ethereum_contract = "0xb25eA1D493B49a1DeD42aC5B1208cC618f9A9B80"; + +async function ethereum_tvl(api) { + return sumTokens2({ owner: ethereum_contract, api, fetchCoValentTokens: true }); +} + +async function bitcoin_tvl(ts) { + var end = ts.timestamp + let start = end - 24 * 60 * 60; + const { data } = await get(`https://icrc-api.internetcomputer.org/api/v1/ledgers/mxzaz-hqaaa-aaaar-qaada-cai/total-supply?start=${start}&end=${end}&step=1`); + let [_, bal] = data.pop() + return { + 'coingecko:bitcoin': bal / 1e8 + }; +} + +module.exports = { + methodology: `We count the ETH and ERC20-Tokens on ${ethereum_contract} as the collateral for ckETH and ck-ERC20 tokens and we count BTC as the collateral for ckBTC`, + ethereum: { + tvl: ethereum_tvl, + }, + bitcoin: { tvl: bitcoin_tvl }, +}; diff --git a/projects/chainflip/index.js b/projects/chainflip/index.js index ba8ccc93fe..b015ace57f 100644 --- a/projects/chainflip/index.js +++ b/projects/chainflip/index.js @@ -1,13 +1,70 @@ -const { staking } = require('../helper/staking'); +const { staking } = require('../helper/staking') +const { graphQuery } = require('../helper/http'); +const { sumTokens2 } = require('../helper/unwrapLPs'); const STATE_CHAIN_GATEWAY_CONTRACT = '0x826180541412D574cf1336d22c0C0a287822678A'; const FLIP_TOKEN = '0x6995ab7c4d7f4b03f467cf4c8e920427d9621dbd' -module.exports = { - methodology: 'counts the number of FLIP tokens in the Chainflip State Chain Gateway Contract.', - start: 1700740800, // FLIP went live on 2023-11-23 12:00 UTC - ethereum: { - tvl: () => 0, - staking: staking(FLIP_TOKEN, STATE_CHAIN_GATEWAY_CONTRACT), +const poolsDataQuery = `{ + allPools { + nodes { + baseAsset + baseLiquidityAmount + quoteAsset + quoteLiquidityAmount + } + } + allBoostPools { + nodes { + asset + chain + feeTierPips + availableAmount + unavailableAmount + } } + allDepositBalances { + groupedAggregates(groupBy: ASSET) { + sum { + amount + } + keys + } + } +}` + +const endpoint = 'https://cache-service.chainflip.io/graphql' + +async function tvl(api) { + // Call GraphQL and get tokens, add each to balance + const { + allPools: { nodes }, + allBoostPools: { nodes: bNodes }, + allDepositBalances: { groupedAggregates: uNodes } + } = await graphQuery(endpoint, poolsDataQuery); + + nodes.forEach(i => { + api.add(i.baseAsset, i.baseLiquidityAmount) + api.add(i.quoteAsset, i.quoteLiquidityAmount) + }) + bNodes.forEach(i => { + api.add(i.asset, i.availableAmount) + api.add(i.asset, i.unavailableAmount) + }) + uNodes.forEach(i => { + api.add(i.keys[0], i.sum.amount) + }) + return sumTokens2({ api }) +} + +module.exports = { + methodology: 'The number of FLIP tokens in the Chainflip State Chain Gateway Contract, as well as the total liquidity.', + start: '2023-11-23', // FLIP went live on 2023-11-23 12:00 UTC + ethereum: { + tvl: () => ({}), + staking: staking(FLIP_TOKEN, STATE_CHAIN_GATEWAY_CONTRACT), + }, + chainflip: { + tvl, + } }; diff --git a/projects/chainge.js b/projects/chainge.js index e438c9fd93..9e7bd63b61 100644 --- a/projects/chainge.js +++ b/projects/chainge.js @@ -1,13 +1,28 @@ -const utils = require('./helper/utils'); +const ADDRESSES = require('./helper/coreAssets.json') +const { sumTokensExport } = require('./helper/unwrapLPs') -// fusion -async function fetch() { - let tvl = await utils.fetchURL('https://info.chainge.finance/api/v1/info/getInfoOuterTvl') - - return tvl.data.data.totalTvl +const config = { + rollux: { + chaingeAddress: "0x66ff2f0AC3214758D1e61B16b41e3d5e62CAEcF1", + tokens: [ + ADDRESSES.rollux.USDC, + ADDRESSES.rollux.USDT, + ADDRESSES.rollux.WBTC, + ADDRESSES.rollux.WETH, + ADDRESSES.rollux.WSYS, + ADDRESSES.null, // for native SYS + ] + } } module.exports = { - methodology: "assets in liquidity are counted as TVL", - fetch + methodology: "assets in liquidity are counted as TVL + balances of all tokens (USDC, USDT, WBTC, WETH, WSYS, and native SYS) held in the Chainge treasury address on the Rollux network. These tokens are used to provide liquidity for cross-chain swaps.", + fusion: { tvl: () => ({})} } + +Object.keys(config).forEach(chain => { + const { chaingeAddress, tokens } = config[chain] + module.exports[chain] = { + tvl: sumTokensExport({ owner: chaingeAddress, tokens }) + } +}) diff --git a/projects/chakra/index.js b/projects/chakra/index.js new file mode 100644 index 0000000000..da04fa5299 --- /dev/null +++ b/projects/chakra/index.js @@ -0,0 +1,7 @@ +const { sumTokensExport } = require("../helper/sumTokens"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +module.exports = { + doublecounted: true, + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.chakra }) }, +}; diff --git a/projects/channels/index.js b/projects/channels/index.js index 63f235ca88..c939e79695 100644 --- a/projects/channels/index.js +++ b/projects/channels/index.js @@ -1,5 +1,4 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { compoundExports } = require('../helper/compound'); +const { compoundExports2 } = require('../helper/compound'); const comptroller = { heco: "0x8955aeC67f06875Ee98d69e6fe5BDEA7B60e9770", @@ -12,14 +11,9 @@ const ceth = { heco: "0x397c6D1723360CC1c317CdC9B2E926Ae29626Ff3", } -const native = { - bsc: ADDRESSES.bsc.WBNB, - heco: ADDRESSES.heco.WHT, -} - module.exports = { ...Object.keys(comptroller).reduce((exp, chain) => { - exp[chain] = compoundExports(comptroller[chain], chain, ceth[chain], native[chain], undefined, symbol => ["MLP", "CLP", "SLP"].some(c => symbol.includes(c))) + exp[chain] = compoundExports2({ comptroller: comptroller[chain], cether: ceth[chain]}) return exp }, {}) } diff --git a/projects/chargedefi/index.js b/projects/chargedefi/index.js index 92151453ec..c16ca65560 100644 --- a/projects/chargedefi/index.js +++ b/projects/chargedefi/index.js @@ -1,6 +1,6 @@ const sdk = require("@defillama/sdk"); const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); -const { pool2Exports } = require("../helper/pool2"); +const { pool2 } = require("../helper/pool2"); const { staking } = require("../helper/staking"); const chargeTokenAddress = "0x1C6bc8e962427dEb4106aE06A7fA2d715687395c"; @@ -62,7 +62,7 @@ module.exports = { methodology: 'The TVL of Charge Defi is calculated using the Pancake LP token deposits (Static/BUSD and Charge/BUSD) in the farms, and the Charge & Static-BUSD deposits found in each Boardroom.', bsc: { tvl, - pool2: pool2Exports( + pool2: pool2( chargeBUSDFarmStrategyAddress, [chargeBUSDLpAddress], "bsc" diff --git a/projects/chee-finance/index.js b/projects/chee-finance/index.js index afd6c95ed4..45fb430358 100644 --- a/projects/chee-finance/index.js +++ b/projects/chee-finance/index.js @@ -1,10 +1,10 @@ const ADDRESSES = require('../helper/coreAssets.json') -const {compoundExports } = require('../helper/compound') +const { compoundExports } = require('../helper/compound') -module.exports={ +module.exports = { hallmarks: [ ], - celo:compoundExports("0x9BD4Fd10b531ae07437676dfE3FA6f505032CB64", "celo", "0x9de4171EDc1F69EAD07f7595bD3beD62d9215532", ADDRESSES.celo.CELO), - meter:compoundExports("0xcc0BfaD4e684023B18e0adfEcaEDd800D91dc8B5", "meter", "0xbF5cffE28d3CbA3376Cd02fF12eBECa43Bc3f14A", ADDRESSES.meter.WMTR), - bsc:compoundExports("0x0E00Ae24B84148ee93Ce2Cf4F52dE277C91B0B72", "bsc", "0x9437Ea5b08AC7f9dc553861dfE1AA77EE0F2aE69", ADDRESSES.bsc.WBNB), + celo: compoundExports("0x9BD4Fd10b531ae07437676dfE3FA6f505032CB64", "0x9de4171EDc1F69EAD07f7595bD3beD62d9215532", ADDRESSES.celo.CELO), + meter: compoundExports("0xcc0BfaD4e684023B18e0adfEcaEDd800D91dc8B5", "0xbF5cffE28d3CbA3376Cd02fF12eBECa43Bc3f14A", ADDRESSES.meter.WMTR), + bsc: compoundExports("0x0E00Ae24B84148ee93Ce2Cf4F52dE277C91B0B72", "0x9437Ea5b08AC7f9dc553861dfE1AA77EE0F2aE69", ADDRESSES.bsc.WBNB), } \ No newline at end of file diff --git a/projects/chi-protocol/index.js b/projects/chi-protocol/index.js index 117d14ce92..b2da5f975e 100644 --- a/projects/chi-protocol/index.js +++ b/projects/chi-protocol/index.js @@ -2,14 +2,13 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokens2 } = require('../helper/unwrapLPs'); const { pool2s } = require("../helper/pool2"); -const RESERVE_HOLDER = '0x037528457Cf5b0b9DAb641Fd7F0Ce8Fc9690318d'; -const USC_STAKING = '0x60aBb55c8488698153dB0AF2af362EdB25A505e3'; +const RESERVE_HOLDER = '0xc36303ef9c780292755B5a9593Bfa8c1a7817E2a'; const CHI_STAKING = '0xaB1dCa1C0f948c268652eedC676966002Ae241c6'; const CHI_LOCKING = '0xE3dD17ff009bAC84e32130fcA5f01C908e956603'; const CHI_VESTING = '0x426DBAa2B33cE1B833C13b72503F5128AFef79fC'; const STETH = ADDRESSES.ethereum.STETH; const WETH = ADDRESSES.ethereum.WETH -const USC = '0x38547D918b9645F2D94336B6b61AEB08053E142c'; +const WEETH = ADDRESSES.ethereum.WEETH; const CHI = '0x3b21418081528845a6DF4e970bD2185545b712ba'; const stakingPool2Contracts = [ @@ -25,14 +24,14 @@ async function tvl(api) { const owner = RESERVE_HOLDER; const tokens = [ STETH, - WETH + WETH, + WEETH, ]; return sumTokens2({ owner, tokens, api }) } async function staking(api) { const tokensAndOwners = [ - // [USC, USC_STAKING], [CHI, CHI_STAKING], [CHI, CHI_LOCKING] ]; diff --git a/projects/chiliswap/index.js b/projects/chiliswap/index.js index cde14c6c62..3b5d590688 100644 --- a/projects/chiliswap/index.js +++ b/projects/chiliswap/index.js @@ -4,6 +4,6 @@ module.exports = { misrepresentedTokens: true, methodology: 'TVL accounts for the liquidity on all AMM pools', scroll: { - tvl: getUniTVL({ fetchBalances: true, factory: "0x2627161e60fFa589f8bD3798F0947d572A7EdF68", useDefaultCoreAssets: true }) + tvl: getUniTVL({ factory: "0x2627161e60fFa589f8bD3798F0947d572A7EdF68", useDefaultCoreAssets: true }) } } \ No newline at end of file diff --git a/projects/chilizswap/index.js b/projects/chilizswap/index.js index 2fa4d4c077..8b5da67de5 100644 --- a/projects/chilizswap/index.js +++ b/projects/chilizswap/index.js @@ -7,7 +7,6 @@ module.exports = { tvl: getUniTVL({ factory: "0xcF4A2be8Fe92fEe8e350AD8D876274749Ae0CBb1", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; \ No newline at end of file diff --git a/projects/chimeradex-lend/index.js b/projects/chimeradex-lend/index.js index b2415bc1cd..4eabbb781b 100644 --- a/projects/chimeradex-lend/index.js +++ b/projects/chimeradex-lend/index.js @@ -8,3 +8,6 @@ const config = { Object.keys(config).forEach(chain => { module.exports[chain] = compoundExports2({ comptroller: config[chain]}) }) +module.exports.deadFrom='2023-12-12' +module.exports.scroll.borrowed = () => ({}) // bad debt +module.exports.arbitrum.borrowed = () => ({}) // bad debt diff --git a/projects/chimeradex/index.js b/projects/chimeradex/index.js index 63181160ec..25e9dbec3d 100644 --- a/projects/chimeradex/index.js +++ b/projects/chimeradex/index.js @@ -1,6 +1,5 @@ const { getUniTVL } = require('../helper/unknownTokens'); const tvl = getUniTVL({ - fetchBalances: true, useDefaultCoreAssets: true, factory: '0x661B92cc18a8d73209dBa1394aE56fca2F9DDb4D', }) diff --git a/projects/cian-yl/index.js b/projects/cian-yl/index.js new file mode 100644 index 0000000000..5b216026ed --- /dev/null +++ b/projects/cian-yl/index.js @@ -0,0 +1,23 @@ +// cian yield layer +const config = { + ethereum: [ + "0xB13aa2d0345b0439b064f26B82D8dCf3f508775d", + "0xd87a19fF681AE98BF10d2220D1AE3Fbd374ADE4e", + "0x9fdDAD44eD6b77e6777dC1b16ee4FCcCBaF0A019", + "0x6c77bdE03952BbcB923815d90A73a7eD7EC895D1", + "0xcc7E6dE27DdF225E24E8652F62101Dab4656E20A", + "0xd4Cc9b31e9eF33E392FF2f81AD52BE8523e0993b", + "0x3D086B688D7c0362BE4f9600d626f622792c4a20", + ], + arbitrum: ["0x15cbFF12d53e7BdE3f1618844CaaEf99b2836d2A"], +}; + +module.exports = { + doublecounted: true, +}; + +Object.keys(config).forEach((chain) => { + module.exports[chain] = { + tvl: async (api) => api.erc4626Sum({ calls: config[chain], isOG4626: true, permitFailure: true }) + }; +}); diff --git a/projects/citadelswap/index.js b/projects/citadelswap/index.js index f1d363e607..9005a9908e 100644 --- a/projects/citadelswap/index.js +++ b/projects/citadelswap/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('base', '0xbe720274c24b5ec773559b8c7e28c2503dac7645', { fetchBalances: true, }) +module.exports = uniTvlExport('base', '0xbe720274c24b5ec773559b8c7e28c2503dac7645') diff --git a/projects/ckbtc/index.js b/projects/ckbtc/index.js deleted file mode 100644 index 94bca32767..0000000000 --- a/projects/ckbtc/index.js +++ /dev/null @@ -1,16 +0,0 @@ -const { get } = require('../helper/http') - -async function tvl(ts) { - var end = ts.timestamp - let start = end - 24 * 60 * 60; - const { data } = await get(`https://icrc-api.internetcomputer.org/api/v1/ledgers/mxzaz-hqaaa-aaaar-qaada-cai/total-supply?start=${start}&end=${end}&step=1`); - let [_, bal] = data.pop() - return { - 'coingecko:bitcoin': bal / 1e8 - }; -} - -module.exports = { - methodology: `We count the BTC as the collateral for the ckBTC`, - bitcoin: { tvl: tvl }, -} diff --git a/projects/cketh/index.js b/projects/cketh/index.js deleted file mode 100644 index 0a12acb973..0000000000 --- a/projects/cketh/index.js +++ /dev/null @@ -1,21 +0,0 @@ -const { sumTokens2, nullAddress } = require("../helper/unwrapLPs"); -// const { get } = require('../helper/http') -const ADDRESSES = require('../helper/coreAssets.json') - -const contract = "0xb25eA1D493B49a1DeD42aC5B1208cC618f9A9B80"; - -async function tvl(api) { - // var end = api.timestamp - // let start = end - 24 * 60 * 60; - // const { data } = await get(`https://icrc-api.internetcomputer.org/api/v1/ledgers/xevnm-gaaaa-aaaar-qafnq-cai/total-supply?start=${start}&end=${end}&step=1`); - // let [_, bal] = data.pop() - // api.add(ADDRESSES.ethereum.USDC, bal/1e2) - return sumTokens2({ tokens: [nullAddress, ADDRESSES.ethereum.USDC], owner: contract, api }); -} - -module.exports = { - methodology: `We count the ETH on ${contract} as the collateral for the ckETH`, - ethereum: { - tvl, - }, -}; \ No newline at end of file diff --git a/projects/clearpool/index.js b/projects/clearpool/index.js index 1de97ee2fb..ad8721de64 100644 --- a/projects/clearpool/index.js +++ b/projects/clearpool/index.js @@ -69,6 +69,10 @@ const config = { factory: "0x44fEF0fAB3A96CA34b06d5142350Ef9223F65A7e", fromBlock: 226174706, }, + vaults: { + factory: "0xA8e8AccabCf29e7d8b33D086085D87F9F38a6Ed7", + fromBlock: 226193395 + } }, [CHAIN.MANTLE]: { dynamic: { @@ -78,6 +82,10 @@ const config = { vaults: { factory: "0xF041A2838794266d19f79709F416A2977F896A9B", fromBlock: 59594636 + }, + prime: { + factory: "0x29157e2B6A34Ae1787CDdD05Ad54DD4aa9783A5c", + fromBlock: 68483768 } }, [CHAIN.BASE]: { @@ -185,7 +193,7 @@ Object.keys(config).forEach((chain) => { await Promise.all(promiseArray) - return sumTokens2({ api, tokensAndOwners2: [allTokens, allPools], blacklistedTokens: blacklistedTokens[chain]}) + return sumTokens2({ api, tokensAndOwners2: [allTokens, allPools], blacklistedTokens: blacklistedTokens[chain] }) } const borrowed = async (api) => { @@ -210,7 +218,7 @@ Object.keys(config).forEach((chain) => { api.addTokens(allTokens, balances) if (blacklistedTokens[chain]) { - blacklistedTokens[chain].forEach((token) => api.removeTokenBalance(token)) + blacklistedTokens[chain].forEach((token) => api.removeTokenBalance(token)) } } module.exports[chain] = { tvl, borrowed } diff --git a/projects/cleopatradao.js b/projects/cleopatradao.js index 78420920ca..a4105d1002 100644 --- a/projects/cleopatradao.js +++ b/projects/cleopatradao.js @@ -13,5 +13,5 @@ const treasuryTokens = [ module.exports = { deadFrom: 1648765747, misrepresentedTokens: true, - ...ohmTvl(treasury, treasuryTokens, "avax", stakingContract, cat, undefined, undefined, false) + ...ohmTvl(treasury, treasuryTokens, "avax", stakingContract, cat) } diff --git a/projects/clip-finance/index.js b/projects/clip-finance/index.js index 600bc2054b..7b655bcf6b 100644 --- a/projects/clip-finance/index.js +++ b/projects/clip-finance/index.js @@ -6,6 +6,9 @@ const config = { }, linea: { vaultRegistry: "0x5A9B5E22be45d04c753863A916c4311f07bd4dF0", + clipTokenStaking: "0x8bbc8f21aabC8ecb5a566cE6013842E1F3c8fCC1", + clipToken: "0x4Ea77a86d6E70FfE8Bb947FC86D68a7F086f198a", + wClipToken: "0x54e4a172dbEaC5B239131a44B71C37113A8530F7", }, base: { vaultRegistry: "0x5A9B5E22be45d04c753863A916c4311f07bd4dF0", @@ -21,6 +24,7 @@ const VaultType = { NileCl: 6, ZeroLend: 7, StargateFarming: 8, + UniswapV3: 9, }; const typesDataInterfaces = { @@ -34,7 +38,8 @@ const typesDataInterfaces = { [VaultType.LynexAlgebra]: ["uint256", "address"], // vaultType, algebra pool address [VaultType.NileCl]: ["uint256", "address", "address"], // vaultType, nileCl pool address, stacking contract address [VaultType.ZeroLend]: ["uint256", "address"], // vaultType, ZeroLend strategy address - [VaultType.StargateFarming]: ["uint256", "address"] // vaultType, Stargate strategy address + [VaultType.StargateFarming]: ["uint256", "address"], // vaultType, Stargate strategy address + [VaultType.UniswapV3]: ["uint256", "address"], // vaultType, v3 pool address }; const tvl = async (api) => { @@ -46,7 +51,7 @@ const tvl = async (api) => { const vaults = vaultDatas.map((i) => ({ ...i, vaultType: decoder.decode(typesDataInterfaces.any, i.data) })); // ammVaults - const ammTypes = [VaultType.PancakeV3, VaultType.LynexAlgebra, VaultType.NileCl]; + const ammTypes = [VaultType.PancakeV3, VaultType.LynexAlgebra, VaultType.NileCl, VaultType.UniswapV3]; const ammVaults = vaults.filter((i) => ammTypes.includes(Number(i.vaultType.toString()))).map((i) => i.vault); const ammPools = vaults .filter((i) => ammTypes.includes(Number(i.vaultType.toString()))) @@ -61,20 +66,20 @@ const tvl = async (api) => { api.add(ammToken1s[i], pool.total1); }); - // Aerodrom Vaults - const aerodromVaults = vaults.filter((i) => i.vaultType == VaultType.Aero).map((i) => i.vault); - const tokenAs = await api.multiCall({ abi: "address:tokenA", calls: aerodromVaults }); + // Aerodrome Vaults + const aerodromeVaults = vaults.filter((i) => i.vaultType == VaultType.Aero).map((i) => i.vault); + const tokenAs = await api.multiCall({ abi: "address:tokenA", calls: aerodromeVaults }); - const tokenBs = await api.multiCall({ abi: "address:tokenB", calls: aerodromVaults }); - const farms = await api.multiCall({ abi: "address:farm", calls: aerodromVaults }); + const tokenBs = await api.multiCall({ abi: "address:tokenB", calls: aerodromeVaults }); + const farms = await api.multiCall({ abi: "address:farm", calls: aerodromeVaults }); - const lpTokens = await api.multiCall({ abi: "address:lpToken", calls: aerodromVaults }); + const lpTokens = await api.multiCall({ abi: "address:lpToken", calls: aerodromeVaults }); const liquidities = await api.multiCall({ abi: abis.balanceOf, calls: farms.map((vault, i) => ({ target: vault, - params: aerodromVaults[i], + params: aerodromeVaults[i], })), }); @@ -98,7 +103,7 @@ const tvl = async (api) => { abi: abis.balanceOf, calls: tokenAs.map((tokenA, i) => ({ target: tokenA, - params: aerodromVaults[i], + params: aerodromeVaults[i], })), }); @@ -106,11 +111,11 @@ const tvl = async (api) => { abi: abis.balanceOf, calls: tokenBs.map((tokenB, i) => ({ target: tokenB, - params: aerodromVaults[i], + params: aerodromeVaults[i], })), }); - aerodromVaults.forEach((_, i) => { + aerodromeVaults.forEach((_, i) => { if (lpTotalSupplies > 0) { api.add(tokenAs[i], Math.floor((liquidities[i] * lpBalanceAs[i]) / lpTotalSupplies[i] + tokenABalances[i])); api.add(tokenBs[i], Math.floor((liquidities[i] * lpBalanceBs[i]) / lpTotalSupplies[i] + tokenBBalances[i])); @@ -135,19 +140,30 @@ module.exports = { methodology: "Clip Finance TVL is achieved by summing total values of assets deposited in other protocols through our vaults and vaults balances.", doublecounted: true, - start: 1697627757, // (Oct-18-2023 11:15:57 AM +UTC) deployed on the BSC network + start: '2023-10-18', // (Oct-18-2023 11:15:57 AM +UTC) deployed on the BSC network }; Object.keys(config).forEach((chain) => { + const { clipTokenStaking, clipToken, wClipToken } = config[chain]; + module.exports[chain] = { tvl, }; + + if (clipTokenStaking && clipToken && wClipToken) + module.exports[chain].staking = async (api) => { + const totalStackedWClip = await api.call({ target: clipTokenStaking, abi: abis.getCumulativeStaked, params: wClipToken, }); + + // Add to TVL wCLIP (1 wCLIP = 1 CLIP always) staked in the Clip Token Staking contract + api.add(clipToken, totalStackedWClip); + } }); const abis = { - getTotalAmounts: "function getTotalAmounts() public view returns (uint256 total0, uint256 total1, uint128 liquidity)", + getTotalAmounts: "function getTotalAmounts() external view returns (uint256 total0, uint256 total1, uint128 liquidity)", depositToken: "address:depositToken", totalTokens: "uint256:totalTokens", getVaults: "function getVaults() view returns ((address vault, bytes data)[])", balanceOf: "function balanceOf(address) view returns (uint256)", + getCumulativeStaked: "function getCumulativeStaked(address stakedToken) external view returns (uint256)" }; diff --git a/projects/clipper/index.js b/projects/clipper/index.js index dff254e4ab..1d5ea4ab63 100644 --- a/projects/clipper/index.js +++ b/projects/clipper/index.js @@ -14,6 +14,6 @@ module.exports = { methodology: `Counts the tokens in pool address in different chains` }; -['ethereum', 'polygon', 'moonbeam', 'arbitrum', 'optimism', 'mantle', 'base'].forEach(chain => { +['ethereum', 'polygon', 'moonbeam', 'arbitrum', 'optimism', 'mantle', 'base', 'polygon_zkevm'].forEach(chain => { module.exports[chain] = { tvl } }) diff --git a/projects/clober-liquidity-vault/index.js b/projects/clober-liquidity-vault/index.js new file mode 100644 index 0000000000..7cb0e0bf6a --- /dev/null +++ b/projects/clober-liquidity-vault/index.js @@ -0,0 +1,32 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +const abi = { + openEvent: 'event Open(bytes32 indexed key, uint192 indexed bookIdA, uint192 indexed bookIdB, bytes32 salt, address strategy)', + getBookKey: "function getBookKey(uint192 id) view returns ((address base, uint64 unitSize, address quote, uint24 makerPolicy, address hooks, uint24 takerPolicy))", + getLiquidity: "function getLiquidity(bytes32 key) view returns ((uint256 reserve, uint256 claimable, uint256 cancelable) liquidityA, (uint256 reserve, uint256 claimable, uint256 cancelable) liquidityB)", +} + +const config = { + base: { + rebalancer: '0x6A0b87D6b74F7D5C92722F6a11714DBeDa9F3895', + bookManager: '0x382CCccbD3b142D7DA063bF68cd0c89634767F76', + fromBlock: 21715410, + }, +} + +async function tvl(api) { + const { rebalancer, bookManager, fromBlock } = config[api.chain] + const logs = await getLogs2({ api, factory: rebalancer, eventAbi: abi.openEvent, fromBlock, extraKey: 'open-bookid' }) + const bookIds = logs.map(i => [i.bookIdA, i.bookIdB]).flat() + const res = await api.multiCall({ abi: abi.getBookKey, calls: bookIds, target: bookManager }) + const tokens = res.map(i => [i.base, i.quote]).flat() + return api.sumTokens({ owners: [rebalancer,], tokens }) +} + +module.exports = { + methodology: "TVL includes all assets deposited into the Clober Liquidity Vault contract, specifically allocated for liquidity provision and market-making within the Clober ecosystem", +}; + +Object.keys(config).forEach(chain => { + module.exports[chain] = { tvl } +}) diff --git a/projects/clober-v2/index.js b/projects/clober-v2/index.js index 84fd0a8586..65c6b40aa1 100644 --- a/projects/clober-v2/index.js +++ b/projects/clober-v2/index.js @@ -1,4 +1,6 @@ const { getLogs2 } = require('../helper/cache/getLogs') +const { sumTokens2 } = require('../helper/unwrapLPs') +const { getUniqueAddresses } = require('../helper/utils') const abi = { openEvent: 'event Open(uint192 indexed id, address indexed base, address indexed quote, uint64 unitSize, uint24 makerPolicy, uint24 takerPolicy, address hooks)', @@ -9,11 +11,18 @@ const config = { era: { factory: '0xAaA0e933e1EcC812fc075A81c116Aa0a82A5bbb8', fromBlock: 34448160, }, } +function customCacheFunction({ cache, logs }) { + if (!cache.logs) cache.logs = [] + const tokens = logs.map(({ base, quote }) => [base, quote]).flat() + cache.logs.push(...tokens) + cache.logs = getUniqueAddresses(cache.logs) + return cache +} + async function tvl(api) { const { factory, fromBlock } = config[api.chain] - const logs = await getLogs2({ api, factory, eventAbi: abi.openEvent, fromBlock, }) - const tokens = logs.map(({ base, quote }) => [base, quote]).flat() - return api.sumTokens({ owner: factory, tokens, }) + const tokens = await getLogs2({ api, factory, eventAbi: abi.openEvent, fromBlock, extraKey: 'open-address', customCacheFunction, skipCacheRead: true }) + return sumTokens2({ api, owner: factory, tokens, permitFailure: true }) } module.exports = { diff --git a/projects/clone/index.js b/projects/clone/index.js index 13dabc9eaf..659d9f47b6 100644 --- a/projects/clone/index.js +++ b/projects/clone/index.js @@ -21,10 +21,9 @@ async function tvl() { } module.exports = { + deadFrom: "2024-09-30", + hallmarks: [[1727654400, "Clone Sunset"]], timetravel: false, - solana: { - tvl, - }, - methodology: - 'Return the amount of collateral in the vault.' + solana: { tvl : () => ({})}, + methodology: 'Return the amount of collateral in the vault.' } diff --git a/projects/cmdao-gameswap/index.js b/projects/cmdao-gameswap/index.js index 3e280724b4..315e900272 100644 --- a/projects/cmdao-gameswap/index.js +++ b/projects/cmdao-gameswap/index.js @@ -1,11 +1,18 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require('../helper/unknownTokens'); +const { pool2 } = require("../helper/pool2"); module.exports = { jbc: { - tvl: sumTokensExport({ - owner: '0x280608DD7712a5675041b95d0000B9089903B569', - tokens: [ADDRESSES.jbc.JUSDT], - }), + tvl: sumTokensExport({ + owner: '0x280608DD7712a5675041b95d0000B9089903B569', + tokens: [ADDRESSES.jbc.JUSDT], + }), + }, + optimism: { + pool2: pool2('0x51f97e67b2ff5ed064dc2b27b7a745e0d4c47ee0', ['0xA41F70B283b8f097112ca3Bb63cB2718EE662e49']), + }, + bitkub: { + pool2: pool2('0xe5B764566CB5b26fE7568e59370368ACf9c7c5c3', ['0x5Cced24E580586841f326d5088D288e6Ddd201dA']), } }; diff --git a/projects/coffeefi/index.js b/projects/coffeefi/index.js index 84400df1da..a8da5aeff6 100644 --- a/projects/coffeefi/index.js +++ b/projects/coffeefi/index.js @@ -11,6 +11,6 @@ module.exports = { Object.keys(config).forEach(chain => { module.exports[chain] = { - tvl: getUniTVL({ factory: config[chain], useDefaultCoreAssets: true, hasStablePools: true, fetchBalances: true, }) + tvl: getUniTVL({ factory: config[chain], useDefaultCoreAssets: true, hasStablePools: true, }) } }) \ No newline at end of file diff --git a/projects/coffin-meme/index.js b/projects/coffin-meme/index.js new file mode 100644 index 0000000000..8011665f05 --- /dev/null +++ b/projects/coffin-meme/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require('../helper/coreAssets.json') + +const coffinScAddr = "EQBozwKVDya9IL3Kw4mR5AQph4yo15EuMdyX8nLljeaUxrpM" + +module.exports = { + methodology: 'Counts Coffin.Meme smartcontract TON & jettons balance as TVL.', + ton: { + tvl: sumTokensExport({ owner: coffinScAddr, tokens: [ADDRESSES.null], }), + } +} \ No newline at end of file diff --git a/projects/coincollect/index.js b/projects/coincollect/index.js index 505e00c21f..f750ac0d35 100644 --- a/projects/coincollect/index.js +++ b/projects/coincollect/index.js @@ -7,7 +7,7 @@ module.exports = { methodology: `Uses factory(0x2bc17223A99B6e2857796a5F64A1ED91067b5657) address to count liquidity in pools as TVL.`, misrepresentedTokens: true, polygon: { - tvl: getUniTVL({ factory: '0x2bc17223A99B6e2857796a5F64A1ED91067b5657', useDefaultCoreAssets: true, fetchBalances: true }), + tvl: getUniTVL({ factory: '0x2bc17223A99B6e2857796a5F64A1ED91067b5657', useDefaultCoreAssets: true, }), staking: sumTokensExport({owner: MasterChefContract, tokens: [COLLECT], lps: ['0x0cCc84b6506003487AEC687085e82C2f912E607B'], useDefaultCoreAssets: true, }), } }; diff --git a/projects/coindcx/index.js b/projects/coindcx/index.js index c690caf263..84a9a41485 100644 --- a/projects/coindcx/index.js +++ b/projects/coindcx/index.js @@ -1,5 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -55,32 +56,7 @@ const config = { ] }, bitcoin: { - owners: [ - '12hGEyxk4zMLquxiMiFrkvYSohsXz2D3uZ', - 'bc1qz22hegkllltcydg3pz3an6h352mjmyp7n2vhd9', - '1MzSJodjNmACPKyj9VUv9X55Pby87osLhc', - 'bc1qucl4n347qc6e48w85xdxcv86sm3an8fr250hhm', - '1F6CrpEnHEZh6gQtJ7cf1MtK7Y8GYKoP4i', - 'bc1qn2xm6agnanuyuwfcfw92el7nvt2lpsqr5s5c0w', - '17mxRZ9WeXigSwg3Cm62HxeATnuUphMxGL', - 'bc1qffg4ya27430vv5ymg2lhf4mj7tvtc3ur5qyyq3', - '1JV3umtGC6H6tFUVoFyV5KwbJDscUwrtX7', - 'bc1qhlyrdhfqry06nj902p9dxdftm4pxkhdqeum8y8', - '1KXxS6QnzpB8mSLm5kmXJXqvZF7wVvQDCw', - 'bc1qedxsgzuj8ga644gwlqw4nw7f3xncq4g2rskmzu', - '12T8i8tpeczk5JGf8ppZf1w6SFBRwEa9y4', - 'bc1qpl5kqjkugyncr72a4fhxvm0360ehfdl27e00ja', - '1PRwacjHVksLNTkSYNkiWkRgTm1yDSgLMG', - 'bc1q7c9ylgjsyc0yaxwm84jjh6avfajzfe7dhk6e0e', - '1477uXZ1NfUaaZZdnztQ7h8ftGRpuWQPfA', - 'bc1qygg2x02cfy0e6r7798v4qrcjjkzm8tl5t0xkwf', - 'bc1qljm7vwdgdy6ca97stsyjyl3zdjtkdsdm8vnh8f', - 'bc1qqhwh3tcg5duwq7hdlnlr5n2tg2uq755cwmkjqn', - 'bc1qqe4g7sjxzk90nsgj0mwufwcdtd7kufg7k32xch', - '1avi3SkWKGLis8dGCP9JUnFfVeheP8wkt', - 'bc1qmulc2ju4kykj24xuw0fu73h9h3usa897xhaucz', // - '3Dm2TL1pt1VzeBCq9jgvQG81QPv19PyReh' - ] + owners: bitcoinAddressBook.coindcx }, tron: { owners: [ diff --git a/projects/coinex/index.js b/projects/coinex/index.js index 93d7b69dd2..cf53e8ec92 100644 --- a/projects/coinex/index.js +++ b/projects/coinex/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -15,25 +16,7 @@ const config = { ], }, bitcoin: { - owners: [ - '189myj1KAbiCWfqWhT6Td4noANKBuag3QN', - '1C2Pxf3ghtKyM4mKC3xSLKrN33YcKnKF2a', - '1JZw5HYSoAEfvGGVQ4U2JihZaQkjcXrr2i', - '16M3n9p6CLATDnpsJNTjCn22AaxzErxg5V', - '15cYMF4jcRwpcbjENMdMizCzAmd7Pc51So', - '18JQXgQ4GjZAuYCy1fNAFGHVEAWUui2q9h', - '1LGbUy11yMaNC9s73q7vEad8JTZyczCima', - '1DGXwH2gzBYM6UrVE57DaaQ3hJJm3s32YK', - '152GodsXfK5kYMdH4spzYD3Ttm1u2oNipN', - '18oxoXCq5mah3GjLjGCS3BRTQxxN7738rL', - '1H21g458T25SnAzvFDJiBrcyhfwHiCH5YF', - '14BhR6aE8Fkt2c8E1m2ydx76fBz5kpt62K', - '1Ef59jZsv87uAcwBZdDhNxiSbCceQ6bFTA', - '14ukjw4r3UFC5A8yvG7yt2GdvLUHEWtskS', - '141TDnaiLEW1vE5xd42Dw8HEhDCA2qrZTr', - '1Ew9SPwBHY8GjHd3uBxhtGcvVmyBN7PHcw', - '1LYrQCjUf54vf9G4qwFpJQ9RCyL2DprPqQ', - ] + owners: bitcoinAddressBook.coinex }, tron: { owners: [ @@ -41,6 +24,11 @@ const config = { 'TFp4V3S9JqJyQAMMCewyn4aAaLueJwzS7H', ] }, + starknet: { + owners: [ + '0x00fb108ed29e1b5d82bb61a39a15bbab410543818bf7df9be3c0f5dd0d612cf3' + ] + }, } module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/coinsquare/index.js b/projects/coinsquare/index.js index e38efba56d..88fcfa8e05 100644 --- a/projects/coinsquare/index.js +++ b/projects/coinsquare/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -29,18 +30,7 @@ const config = { ], }, bitcoin: { - owners: [ - '1P7cDFGeWm6ezez6XGXTAjvm8qcsGiMXe7', - 'bc1q0k5rpdwf7wnq3fuk7dfjqd59p3ke7ufqmlkfp4', - 'bc1qdstretw2uvhjen7hvgaya3nsjgr430x9jhqf4a', - 'bc1qez6ezccleuac4dnj5cpexz5mz3j0j3j655j6qn', - 'bc1qg6a9kpmge0fdwtrymjvq3cydfzgpcge7e05e7z', - 'bc1qg8fywv20ztsp0edtf53zpsnxeu5cqxrmdwmtjd', - 'bc1qm5mqpgtt2ufucfdvhu5xcdgs3vzehwu62wsyqy', - 'bc1qmkkejzrq7ayfjpy7w8gmkhd3uwcy7nryr5apch', - 'bc1qsjc50kf72r4q44ac28v3vrukaxjg4w30rh0cmm', - 'bc1qyz9mssutu8xxcgjvsucz38qvxt7hxwtnm5eh8k', - ] + owners: bitcoinAddressBook.coinsquare }, avax: { owners: ['0x14AA1AD09664c33679aE5689d93085B8F7c84bd3'] diff --git a/projects/coinw/index.js b/projects/coinw/index.js index 56de3cda34..408e75fdde 100644 --- a/projects/coinw/index.js +++ b/projects/coinw/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -13,10 +14,7 @@ const config = { ], }, bitcoin: { - owners: [ - '14Z9KSmCo1UjvBiXj2j9er35GmGmaFxsmE', - '1KYBKqRjGbRynSiyoiHndULssXrEeWhvU8', - ] + owners: bitcoinAddressBook.coinw }, tron: { owners: [ diff --git a/projects/colend/index.js b/projects/colend/index.js index 5277668404..e8f8e3d646 100644 --- a/projects/colend/index.js +++ b/projects/colend/index.js @@ -1,7 +1,13 @@ const { aaveExports } = require("../helper/aave"); +const { mergeExports } = require("../helper/utils"); const methodologies = require("../helper/methodologies"); -module.exports = { + +module.exports = mergeExports([{ methodology: methodologies.lendingMarket, +//Main core: aaveExports('core', '0xC3F120f418f9541263eA3F4a5a4120eb3f28EfA1', undefined, ['0x567AF83d912C85c7a66d093e41D92676fA9076E3'], { v3: true, }), -}; +}, { +//LstBTC + core: aaveExports('core', '0x71B2C1Dda32E4c35f02301dC611043F46CC8108f', undefined, ['0x8E43DF2503c69b090D385E36032814c73b746e3d'], { v3: true, }), +}]) diff --git a/projects/collectionxyz/index.js b/projects/collectionxyz/index.js index 17c0ddd6bd..468255ebed 100644 --- a/projects/collectionxyz/index.js +++ b/projects/collectionxyz/index.js @@ -35,7 +35,6 @@ async function getTotalValueLocked(api) { } module.exports = { - start: 16945809, ethereum: { tvl: getTotalValueLocked, }, diff --git a/projects/colony/index.js b/projects/colony/index.js index df42f66861..47b576910f 100644 --- a/projects/colony/index.js +++ b/projects/colony/index.js @@ -29,7 +29,6 @@ function _tvl() { const colonyDexTVL = getUniTVL({ factory: colonyDexFactory, - fetchBalances: true, useDefaultCoreAssets: true }) @@ -47,7 +46,7 @@ module.exports = { "TVL also includes rewards in various tokens distributed in the staking contract, " + "actual fundraised stablecoins in projects (Nests), and liquidity from Colony Dex.", avax: { - start: 1638367059, // CLY Token deployment + start: '2021-12-01', // CLY Token deployment tvl: _tvl(), staking: _staking, // vesting: clyVesting(colonyGovernanceToken, vestingContract), diff --git a/projects/commodo/index.js b/projects/commodo/index.js index 3506493157..c706a1ed9a 100644 --- a/projects/commodo/index.js +++ b/projects/commodo/index.js @@ -43,6 +43,7 @@ async function getData() { module.exports = { + deadFrom: "2024-09-17", timetravel: false, comdex: { tvl: async () => transformBalances('comdex', (await getData()).tvl), diff --git a/projects/commonwealth/index.js b/projects/commonwealth/index.js new file mode 100644 index 0000000000..df1f9ba063 --- /dev/null +++ b/projects/commonwealth/index.js @@ -0,0 +1,26 @@ +const { staking } = require('../helper/staking'); + +const TREASURY = [ + '0xdE70B8BC5215BdF03f839BB8cD0F639D4E3E2881', + '0xA205fD6A798A9Ba8b107A00b8A6a5Af742d6aCb5', + '0x990eCdf73704f9114Ee28710D171132b5Cfdc6f0', + '0xa653879692D4D0e6b6E0847ceDd58eAD2F1CC136' +] + + +const CONTRACTS = [ + '0xf4aa59f5192856f41ae19caab4929ccd3a265e70', // staked + '0x7519461fbd96abb539c770d57f38c2e91f8262aa', + '0xd7e31990883250e53314b15ee555345f04d011e8', + '0x87412c03979cc19c60071f5f98313a7cbe9f6d65', // rewards + +]; + +const WLTH = '0x99b2B1A2aDB02B38222ADcD057783D7e5D1FCC7D'; + +module.exports = { + base: { + tvl: () => ({}), + staking: staking(CONTRACTS, WLTH) + } +}; diff --git a/projects/composable/index.js b/projects/composable/index.js index 46e9157045..a3629501f1 100644 --- a/projects/composable/index.js +++ b/projects/composable/index.js @@ -1,53 +1,39 @@ const ADDRESSES = require('../helper/coreAssets.json') const { chainExports } = require('../helper/exports') -const { sumTokensAndLPsSharedOwners } = require('../helper/unwrapLPs') -const sdk = require('@defillama/sdk') const networks = { - 'ethereum': ['0xef4439f0fae7db0b5ce88c155fc6af50f1b38728', [ - ADDRESSES.ethereum.USDC, //usdc - ADDRESSES.ethereum.WETH, // eth - '0xca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf', // tricrypto - ]], - 'arbitrum': ['0xEba8C2Bf0d1C9413543188fc42D7323690AED051', [ - ADDRESSES.arbitrum.USDC, //usdc - ADDRESSES.arbitrum.WETH //eth - ]], - 'polygon': ['0xcd8e7322dc2659b1ec447e5d52fdd9c67e8c3c01', [ - ADDRESSES.polygon.USDC, //usdc - ADDRESSES.polygon.WETH_1 //eth - ]] + 'ethereum': ['0xef4439f0fae7db0b5ce88c155fc6af50f1b38728', [ + ADDRESSES.ethereum.USDC, //usdc + ADDRESSES.ethereum.WETH, // eth + '0xca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf', // tricrypto + ]], + 'arbitrum': ['0xEba8C2Bf0d1C9413543188fc42D7323690AED051', [ + ADDRESSES.arbitrum.USDC, //usdc + ADDRESSES.arbitrum.WETH //eth + ]], + 'polygon': ['0xcd8e7322dc2659b1ec447e5d52fdd9c67e8c3c01', [ + ADDRESSES.polygon.USDC, //usdc + ADDRESSES.polygon.WETH_1 //eth + ]] } const abi = { - token: "address:token", - totalToken: "uint256:totalToken", + token: "address:token", + totalToken: "uint256:totalToken", } const rugPools = ['0x4a03ea61e543ec7141a3f90128b0c0c9514f8737', '0xf12da8470e2643ccb39a157e8577d9aa586a488f', '0x1941441d31809e9E1828Da0cE6d44175F657E215'] function chainTvl(chain) { - return async (_time, ethBlock, chainBlocks) => { - const balances = {} - const [owner, tokens] = networks[chain] - await sumTokensAndLPsSharedOwners(balances, tokens.map(t => [t, false]), [owner], chainBlocks[chain], chain, addr => `${chain}:${addr}`) - if (chain === "ethereum") { - for (const pool of rugPools) { - const token = await sdk.api.abi.call({ - target: pool, - abi: abi.token, - block: ethBlock - }) - const bal = await sdk.api.abi.call({ - target: pool, - abi: abi.totalToken, - block: ethBlock - }) - sdk.util.sumSingleBalance(balances, token.output, bal.output) - } - } - return balances + return async (api) => { + const [owner, tokens] = networks[chain] + await api.sumTokens({ owner, tokens }) + if (chain === "ethereum") { + const tokens = await api.multiCall({ abi: abi.token, calls: rugPools }) + const balances = await api.multiCall({ abi: abi.totalToken, calls: rugPools }) + api.add(tokens, balances) } + } } module.exports = chainExports(chainTvl, Object.keys(networks)) \ No newline at end of file diff --git a/projects/compound-onchain/index.js b/projects/compound-onchain/index.js index 50130ca42f..bc62fe4e4d 100644 --- a/projects/compound-onchain/index.js +++ b/projects/compound-onchain/index.js @@ -1,143 +1,11 @@ -const ADDRESSES = require('../helper/coreAssets.json') - -const sdk = require('@defillama/sdk'); -const abi = require('./abi.json'); -const BigNumber = require('bignumber.js'); -const { lendingMarket } = require('../helper/methodologies') - -// cache some data -const markets = [ - { - underlying: ADDRESSES.ethereum.BAT, - symbol: 'BAT', - decimals: 18, - cToken: '0x6C8c6b02E7b2BE14d4fA6022Dfd6d75921D90E4E', - }, - { - underlying: ADDRESSES.ethereum.DAI, - symbol: 'DAI', - decimals: 18, - cToken: '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643', - }, - { - underlying: ADDRESSES.ethereum.WETH, - symbol: 'WETH', - decimals: 18, - cToken: '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5', - }, //cETH => WETH - { - underlying: '0x1985365e9f78359a9B6AD760e32412f4a445E862', - symbol: 'REP', - decimals: 18, - cToken: '0x158079Ee67Fce2f58472A96584A73C7Ab9AC95c1', - }, - { - underlying: ADDRESSES.ethereum.USDC, - symbol: 'USDC', - decimals: 6, - cToken: '0x39AA39c021dfbaE8faC545936693aC917d5E7563', - }, - { - underlying: ADDRESSES.ethereum.USDT, - symbol: 'USDT', - decimals: 6, - cToken: '0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9', - }, - { - underlying: ADDRESSES.ethereum.WBTC, - symbol: 'WBTC', - decimals: 8, - cToken: '0xC11b1268C1A384e55C48c2391d8d480264A3A7F4',//cWBTC - legacy - }, - { - underlying: '0xE41d2489571d322189246DaFA5ebDe1F4699F498', - symbol: 'ZRX', - decimals: 18, - cToken: '0xB3319f5D18Bc0D84dD1b4825Dcde5d5f7266d407', - }, - { - underlying: ADDRESSES.ethereum.SAI, - symbol: 'SAI', - decimals: 18, - cToken: '0xF5DCe57282A584D2746FaF1593d3121Fcac444dC', - }, -]; - -// ask comptroller for all markets array -async function getAllCTokens(block) { - return (await sdk.api.abi.call({ - block, - target: '0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b', - params: [], - abi: abi['getAllMarkets'], - })).output; -} - -const CTOKEN_WETH = '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5'.toLowerCase() - -// returns {[underlying]: {cToken, decimals, symbol}} -async function getMarkets(block) { - if (block < 10271924) { - // the allMarkets getter was only added in this block. - return markets; - } else { - const markets = [{ - cToken: CTOKEN_WETH, - underlying: ADDRESSES.ethereum.WETH, //cETH => WETH - }] - - const allCTokens = await getAllCTokens(block) - const calls = allCTokens.filter(i => i.toLowerCase() !== CTOKEN_WETH).map(i => ({ target: i })) - const { output } = await sdk.api.abi.multiCall({ - abi: abi['underlying'], calls, block, - }) - output.forEach(({ input: { target: cToken }, output: underlying}) => markets.push({ cToken, underlying, })) - return markets; - } -} - -async function v2Tvl(balances, block, borrowed) { - let markets = await getMarkets(block); - - // Get V2 tokens locked - let v2Locked = await sdk.api.abi.multiCall({ - block, - calls: markets.map((market) => ({ - target: market.cToken, - })), - abi: borrowed ? abi.totalBorrows : abi['getCash'], - }); - - markets.forEach((market) => { - let getCash = v2Locked.output.find((result) => result.input.target === market.cToken); - balances[market.underlying] = BigNumber(balances[market.underlying] || 0) - .plus(getCash.output) - .toFixed(); - }); - return balances; -} - -async function borrowed(timestamp, block) { - const balances = {}; - await v2Tvl(balances, block, true) - return balances -} - -async function tvl(timestamp, block) { - let balances = {}; - - await v2Tvl(balances, block, false) - return balances; -} +const { lendingMarket } = require('../helper/methodologies'); +const { compoundExports2 } = require('../helper/compound'); module.exports = { hallmarks: [ [1632873600, "Comptroller vulnerability exploit"], [1592226000, "COMP distribution begins"] ], - ethereum: { - tvl, - borrowed - }, + ethereum: compoundExports2({ comptroller: '0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B', cether: '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5' }), methodology: `${lendingMarket}. TVL is calculated by getting the market addresses from comptroller and calling the getCash() on-chain method to get the amount of tokens locked in each of these addresses, then we get the price of each token from coingecko.`, }; diff --git a/projects/compound-v1/index.js b/projects/compound-v1/index.js index f42bbd12eb..dfbe6c48b1 100644 --- a/projects/compound-v1/index.js +++ b/projects/compound-v1/index.js @@ -1,59 +1,21 @@ const v1abi = require('./v1Abi.json'); -const sdk = require('@defillama/sdk'); -const BigNumber = require('bignumber.js'); const v1Contract = '0x3FDA67f7583380E67ef93072294a7fAc882FD7E7' -async function v1Tvl(balances, block, borrowed) { - const marketsLength = await sdk.api.abi.call({ - target: v1Contract, - block, - abi: v1abi.getCollateralMarketsLength - }); - const underlyings = await sdk.api.abi.multiCall({ - calls: Array(Number(marketsLength.output)).fill().map((n, i) => ({ - target: v1Contract, - params: [i] - })), - block, - abi: v1abi.collateralMarkets - }); - const markets = await sdk.api.abi.multiCall({ - calls: underlyings.output.map(m => ({ - target: v1Contract, - params: [m.output] - })), - block, - abi: v1abi.markets - }); - markets.output.forEach(m => { - const token = m.input.params[0] - let amount - if (borrowed) { - amount = m.output.totalBorrows - } else { - amount = BigNumber(m.output.totalSupply).minus(m.output.totalBorrows).toFixed(0) - } - sdk.util.sumSingleBalance(balances, token, amount) - }) +async function tvl(api) { + const tokens = await api.fetchList({ lengthAbi: v1abi.getCollateralMarketsLength, itemAbi: v1abi.collateralMarkets, target: v1Contract }) + return api.sumTokens({ owner: v1Contract, tokens }) } -async function borrowed(timestamp, block) { - const balances = {}; - await v1Tvl(balances, block, true) - return balances -} - -async function tvl(timestamp, block) { - let balances = {}; - - await v1Tvl(balances, block, false) - return balances; +async function borrowed(api) { + const tokens = await api.fetchList({ lengthAbi: v1abi.getCollateralMarketsLength, itemAbi: v1abi.collateralMarkets, target: v1Contract }) + const markets = await api.multiCall({ abi: v1abi.markets, calls: tokens, target: v1Contract }) + const bals = markets.map(m => m.totalBorrows) + api.add(tokens, bals) } module.exports = { - ethereum: { - tvl, - borrowed - }, + ethereum: { + tvl, + borrowed + }, }; - \ No newline at end of file diff --git a/projects/compound-v3/index.js b/projects/compound-v3/index.js index dae13fed8e..5660fc5bb8 100644 --- a/projects/compound-v3/index.js +++ b/projects/compound-v3/index.js @@ -6,6 +6,8 @@ module.exports = compoundV3Exports({ '0xc3d688B66703497DAA19211EEdff47f25384cdc3', // USDC Market '0xa17581a9e3356d9a858b789d68b4d866e593ae94', // ETH Market '0x3Afdc9BCA9213A35503b077a6072F3D0d5AB0840', // USDT Market + '0x3D0bb1ccaB520A66e607822fC55BC921738fAFE3', // wstETH Market + '0x5D409e56D886231aDAf00c8775665AD0f9897b56', // USDS Market ], }, arbitrum: { @@ -13,20 +15,21 @@ module.exports = compoundV3Exports({ '0xA5EDBDD9646f8dFF606d7448e414884C7d905dCA', // USDC.e Market '0x9c4ec768c28520B50860ea7a15bd7213a9fF58bf', // USDC Market '0x6f7D514bbD4aFf3BcD1140B7344b32f063dEe486', // WETH Market - '0x5C58d4479A1E9b2d19EE052143FA73F0ee79A36e', // USDT Market + '0xd98Be00b5D27fc98112BdE293e487f8D4cA57d07', // USDT Market ], }, polygon: { markets: [ '0xF25212E676D1F7F89Cd72fFEe66158f541246445', // USDC.e Market '0xaeB318360f27748Acb200CE616E389A6C9409a07', // USDT Market - ], + ], }, base: { markets: [ '0x9c4ec768c28520B50860ea7a15bd7213a9fF58bf', // USDbC Market '0x46e6b214b524310239732D51387075E0e70970bf', // ETH Market '0xb125E6687d4313864e53df431d5425969c15Eb2F', // USDC Market + '0x784efeB622244d2348d4F2522f8860B96fbEcE89', // AERO Market ], }, scroll: { @@ -38,5 +41,10 @@ module.exports = compoundV3Exports({ '0x995E394b8B2437aC8Ce61Ee0bC610D617962B214', // USDT Market '0xE36A30D249f7761327fd973001A32010b521b6Fd', // ETH Market ], - } + }, + mantle: { + markets: [ + '0x606174f62cd968d8e684c645080fa694c1D7786E', // USDe Market + ], + }, }) diff --git a/projects/compx-cdp/index.js b/projects/compx-cdp/index.js new file mode 100644 index 0000000000..8c2002de74 --- /dev/null +++ b/projects/compx-cdp/index.js @@ -0,0 +1,78 @@ +const { sumTokens } = require("../helper/chain/algorand"); + + +module.exports = { + algorand: { + tvl: getCDPVaultTokens, + staking, + }, +}; + +const stakingPools = [ + // NIKO + 'XZOKYETGUQKIJJG4LSBAFYLDQRKCT6PQUO5CZJQ37VUD2VYMWRHH2LK7MI', + // TinymanPool2.0 xMcRib-ALGO + 'RNL5YCWQDLYX4WXMM43ARQVFVNO4PSGWCLNKORUUVFCXQLR2LIURETDCDI', + // JoeCoin + 'Y3CNVFHCAMWZP57R7S7URX366XRE6VKCHWDN57VMR7WL556OFTDXGAQZ3E', + // xUSD + 'EW6JAJOFRIXWURIIPCOCEXJ6SQ5QW2BQ7REE5CYEL4PSNYHUSIH2G55ZRI', + // cAlgo + 'ZKXS4SAXMCBVOHMWNGZZO7AXMRETLTLYLQRBO2KLSN2SPOGZCU4O3JABSA', + // Compx + 'DRZ2TY3YHPRCMD6MVWCHKFIDF4PCCQ3DOUW42MGMVOPTJVGRKORJBQTZS4', +]; + + +const vaults = [ + // Minting wallet + "XN4OX5OFLZFLDBI4J36EGOIMKGR4NISEVFCQRXDTC4WT35GPBM5EJI7IOA", + + // gAlgo Vault + "ABU4ZY2UAPJWIZPE5FZP6GWVXTIP77YNAF3KBWBNW6KNBZALKRKPZL6HLM", + + // Link Vault + "YVQRJKC7TUD3XB3XCAA7SMY5OG7AHOTU465DI7HIOL4NQZMG52NXLBOMYA", + + // AVAX Vault + "RQ4MNDFSG4CCCWEJMRNGE5ZRNV3F2PHZSDJZ5X266MXA65HMLRFFXNAW5Y", + + // Sol Vault + "ODJPJKPAHL7NPRJC5XF42SWFHB37ECCQEGFJIA4TFWOXGKJQA6M7S5NL2M", + + // goBTC Vault + "UVSJVQXX3KYYWTQVXPRTIA5QXYAM6Y26JI2P2NZP25RSJTVMP3X7ODNC5Q", + + // goETH Vault + "DMVBFMMH3RIKCS3V77DCETWJDA2HW4LPEBURBUD7RQNVK5SKH5QZG6ZF4Q", + + // Silver Vault + "H4437RZ3W2Q7JXIRPDIEFO65QNNTH4SICMNWT4SSEHNQ4UPIMAO63DNZGI", + + // Gold Vault + "MJET3QJDM5MXC5ZREAPW5PUK4HN73VRYMAFGMPWG7VEIRQIHFQPSMA6CUQ", + + // mAlgo Vault + "XXLNQOR5XNJU57W2TQ3WEJTL2RGQ2ABCSAU2CX4NSZZGPHB5WSOTT6BZXA", + + // Chips Vault + "RJQNFSLZWSZ3W6N5TJCS2F6KNEWTXUQDFI7GXDXXCOC5UDIPYYN3W665YE", + + // Coop Vault + "QTFSX7MJLUBP4TLCRNGMEQCOCG6Z2O5A7RAUREW5S5RYIGMGYDLDYYSMAQ", + + // Algo Vault + "HVDIX7FCCJGH3XFJNTEAQZ22CQTD2LUD7NKN7JCY37SGFA2763A4NHUHRQ", + + // Deprecated Algo Vault + "I4O4APZDX7R7GL26JA2G6ENO5KZHIN4ZLRJR4DANXJC6GU7A2SI6VNY6LA" +]; + +async function getCDPVaultTokens() { + // Don't count xUSD + return sumTokens({ owners: vaults, blacklistedTokens: ['760037151'] }); +} + +async function staking() { + return sumTokens({ owners: stakingPools, tinymanLps: [['2525037707', '2518721081'] ]}); +} diff --git a/projects/compx-streaming/index.js b/projects/compx-streaming/index.js new file mode 100644 index 0000000000..9b1a6d45f4 --- /dev/null +++ b/projects/compx-streaming/index.js @@ -0,0 +1,65 @@ +const { lookupTransactionsByID, sumTokens } = require("../helper/chain/algorand"); + +module.exports = { + algorand: { + tvl: getAlgoStreamTVL, + vesting: getASAStreamTVL, + }, +}; + +async function getAlgoStreamTVL() { + const { transactions } = await lookupTransactionsByID({ + 'tx-type': 'pay', + 'address': 'KYYHXY5CANPEOH4WA4ZSISEMD5QYYBP6DOG3HNWJJIJNNKARYF5JYCNSNE', + 'address-role': 'sender', + 'exclude-close-to': 'true', + }); + + const uniqueRecipients = new Set(transactions.map((txn) => txn["inner-txns"][0]["inner-txns"][0]["payment-transaction"]["receiver"])); + + const algoRecipients = Array.from(uniqueRecipients); + return sumTokens({ owners: algoRecipients, }); +} + +async function getASAStreamTVL() { + const asaFeeRecipients = await getASARecipients(); + return sumTokens({ owners: asaFeeRecipients, }); +} + +async function getASARecipients() { + let transactions = []; + let nextToken = null; + + do { + let query = { + 'tx-type': 'axfer', + 'address': 'JBV23ATJIL4MWXIJXZ6L2EJSJZOMP7YENNGUNQZAUTEN7QYSPC5ZHPR6SY', + 'address-role': 'sender', + 'exclude-close-to': 'true', + }; + + if (nextToken) { + query['next'] = nextToken; + } + + const response = await lookupTransactionsByID(query); + + transactions = transactions.concat(response.transactions); + + nextToken = response['next-token']; + + } while (nextToken); + + const uniqueRecipients = new Set(); + + transactions.forEach((txn) => { + const innerTxns = txn["inner-txns"][0]["inner-txns"]; + if (innerTxns && innerTxns.length >= 2) { + uniqueRecipients.add(innerTxns[2]["asset-transfer-transaction"]["receiver"]); + } else if (!innerTxns && txn["inner-txns"][0]["asset-transfer-transaction"]) { + uniqueRecipients.add(txn["inner-txns"][0]["asset-transfer-transaction"]["receiver"]); + } + }); + + return Array.from(uniqueRecipients); +} diff --git a/projects/compx/index.js b/projects/compx/index.js index b36986987b..afbd9e9468 100644 --- a/projects/compx/index.js +++ b/projects/compx/index.js @@ -17,4 +17,4 @@ module.exports = { algorand: { tvl, }, -}; +}; \ No newline at end of file diff --git a/projects/comtech-gold/index.js b/projects/comtech-gold/index.js new file mode 100644 index 0000000000..36ddede975 --- /dev/null +++ b/projects/comtech-gold/index.js @@ -0,0 +1,10 @@ +const CGO = '0x8f9920283470f52128bf11b0c14e798be704fd15' + +const tvl = async (api) => { + const supply = await api.call({ target: CGO, abi: 'erc20:totalSupply' }) + api.add(CGO, supply) +} + +module.exports = { + xdc: { tvl } +} \ No newline at end of file diff --git a/projects/connext/old.js b/projects/connext/old.js index fb8ca75713..4e6e29ae8c 100644 --- a/projects/connext/old.js +++ b/projects/connext/old.js @@ -136,7 +136,7 @@ async function xdai(timestamp, ethBlock, {xdai: block}) { } module.exports = { - start: 1552065900, // 03/08/2019 @ 5:25pm (UTC) + start: '2019-03-08', // 03/08/2019 @ 5:25pm (UTC) ethereum: { tvl: ethereum }, diff --git a/projects/contango-v2/index.js b/projects/contango-v2/index.js index cf64a0e03b..22d51d4189 100644 --- a/projects/contango-v2/index.js +++ b/projects/contango-v2/index.js @@ -1,81 +1,116 @@ -const sdk = require("@defillama/sdk"); -const { blockQuery } = require("../helper/http"); const { cachedGraphQuery } = require("../helper/cache"); +const { sumTokens2 } = require("../helper/unwrapLPs"); const CONTANGO_PROXY = "0x6Cae28b3D09D8f8Fc74ccD496AC986FC84C0C24E"; const CONTANGO_LENS_PROXY = "0xe03835Dfae2644F37049c1feF13E8ceD6b1Bb72a"; +const alchemyGraphUrl = (chain) => `https://subgraph.satsuma-prod.com/773bd6dfe1c6/egills-team/v2-${chain}/api` + +const excludedIds_arb = [ + "0x415242555344540000000000000000000bffffffff0000000000000000000623", + "0x555344435745544800000000000000000bffffffff000000000000000000030a", + "0x574554485553444300000000000000000bffffffff00000000000000000001df", + "0x574554485553444300000000000000000bffffffff00000000000000000001e8", + "0x574554485553444300000000000000000bffffffff0000000000000000000309", + "0x776545544857455448000000000000000bffffffff0000000000000000003099", + "0x777374455448574554480000000000000bffffffff00000000000000000010a7" +]; const config = { arbitrum: { contango: CONTANGO_PROXY, contango_lens: CONTANGO_LENS_PROXY, - grapUrl: sdk.graph.modifyEndpoint('BmHqxUxxLuMoDYgbbXU6YR8VHUTGPBf9ghD7XH6RYyTQ'), + graphUrl: alchemyGraphUrl('arbitrum'), + excludedIds: excludedIds_arb }, optimism: { contango: CONTANGO_PROXY, contango_lens: CONTANGO_LENS_PROXY, - grapUrl: sdk.graph.modifyEndpoint('PT2TcgYqhQmx713U3KVkdbdh7dJevgoDvmMwhDR29d5'), + graphUrl: alchemyGraphUrl('optimism'), }, ethereum: { contango: CONTANGO_PROXY, contango_lens: CONTANGO_LENS_PROXY, - grapUrl: sdk.graph.modifyEndpoint('FSn2gMoBKcDXEHPvshaXLPC1EJN7YsfCP78swEkXcntY'), + graphUrl: alchemyGraphUrl('mainnet'), }, polygon: { contango: CONTANGO_PROXY, contango_lens: CONTANGO_LENS_PROXY, - grapUrl: sdk.graph.modifyEndpoint('5t3rhrAYt79iyjm929hgwyiaPLk9uGxQRMiKEasGgeSP'), + graphUrl: alchemyGraphUrl('polygon'), }, xdai: { contango: CONTANGO_PROXY, contango_lens: CONTANGO_LENS_PROXY, - grapUrl: sdk.graph.modifyEndpoint('9h1rHUKJK9CGqztdaBptbj4Q9e2zL9jABuu9LpRQ1XkC'), + graphUrl: alchemyGraphUrl('gnosis'), }, base: { contango: CONTANGO_PROXY, contango_lens: CONTANGO_LENS_PROXY, - grapUrl: - "https://graph.contango.xyz:18000/subgraphs/name/contango-xyz/v2-base", + graphUrl: alchemyGraphUrl('base'), + }, + avax: { + contango: CONTANGO_PROXY, + contango_lens: CONTANGO_LENS_PROXY, + graphUrl: alchemyGraphUrl('avalanche'), + }, + bsc: { + contango: CONTANGO_PROXY, + contango_lens: CONTANGO_LENS_PROXY, + graphUrl: alchemyGraphUrl('bsc'), + }, + linea: { + contango: CONTANGO_PROXY, + contango_lens: CONTANGO_LENS_PROXY, + graphUrl: alchemyGraphUrl('linea'), + }, + scroll: { + contango: CONTANGO_PROXY, + contango_lens: CONTANGO_LENS_PROXY, + graphUrl: alchemyGraphUrl('scroll'), }, }; module.exports = { + hallmarks: [[1729036800, "Affected by the Radiant hack"]], doublecounted: true, methodology: `Counts the tokens locked in the positions to be used as margin + user's tokens locked in the protocol's vault. Borrowed coins are discounted from the TVL, so only the position margins are counted. The reason behind this is that the protocol only added the user's margin to the underlying money market. Adding the borrowed coins to the TVL can be used as a proxy for the protocol's open interest.`, }; Object.keys(config).forEach((chain) => { - const { contango, contango_lens, grapUrl } = config[chain]; + const { contango, contango_lens, graphUrl, excludedIds = [] } = config[chain]; module.exports[chain] = { tvl: async (api) => { await Promise.all([ - positionsTvl(api, contango_lens, grapUrl, false), - vaultTvl(api, contango, grapUrl), + positionsTvl(api, contango_lens, graphUrl, false, excludedIds), + vaultTvl(api, contango, graphUrl), ]); - return api.getBalances(); + return sumTokens2({ api }) }, - borrowed: async (api) => - positionsTvl(api, contango_lens, grapUrl, true), + borrowed: async (api) => { + + await positionsTvl(api, contango_lens, graphUrl, true, excludedIds) + return sumTokens2({ api }) + } }; }); async function positionsTvl( api, contangoLens, - grapUrl, + graphUrl, borrowed, + excludedIds ) { const cacheKey = `contango-positions-${api.chain}`; - const positions = await cachedGraphQuery(cacheKey, grapUrl, graphQueries.position, { + const positions = await cachedGraphQuery(cacheKey, graphUrl, graphQueries.position, { api, useBlock: true, fetchById: true, safeBlockLimit: 3000, }) - const parts = positions.map(({ id, instrument: { base, quote } }) => [ - id, - [base.id, quote.id], - ]); + + const parts = positions + .filter(({ id }) => !excludedIds.includes(id)) + .map(({ id, instrument: { base, quote } }) => [id, [base.id, quote.id]]); const balances = await api.multiCall({ target: contangoLens, @@ -94,9 +129,9 @@ async function positionsTvl( }); } -async function vaultTvl(api, contango, grapUrl) { +async function vaultTvl(api, contango, graphUrl) { const cacheKey = `contango-vaultAssets-${api.chain}`; - const assets = await cachedGraphQuery(cacheKey, grapUrl, graphQueries.asset, { + const assets = await cachedGraphQuery(cacheKey, graphUrl, graphQueries.asset, { api, useBlock: true, fetchById: true, diff --git a/projects/convergence/index.js b/projects/convergence/index.js index a0c69348d7..ad534ffc33 100644 --- a/projects/convergence/index.js +++ b/projects/convergence/index.js @@ -3,7 +3,7 @@ const MOONBEAM_FACTORY = '0x9504d0d43189d208459e15c7f643aac1abe3735d'; const { getUniTVL } = require('../helper/unknownTokens') module.exports = { - start: 1621220505, //2021-05-17 00:00:00 +UTC + start: '2021-05-17', //2021-05-17 00:00:00 +UTC misrepresentedTokens: true, ethereum: { tvl: getUniTVL({ diff --git a/projects/cookiebase/index.js b/projects/cookiebase/index.js index a864a15c24..a10ad9d8b3 100644 --- a/projects/cookiebase/index.js +++ b/projects/cookiebase/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - base: { tvl: getUniTVL({ factory: '0x05b00D63DbC67874ad44d039213b7DAfB999d184', useDefaultCoreAssets: true, fetchBalances: true, }), }, + base: { tvl: getUniTVL({ factory: '0x05b00D63DbC67874ad44d039213b7DAfB999d184', useDefaultCoreAssets: true, }), }, } \ No newline at end of file diff --git a/projects/core-bridge/index.js b/projects/core-bridge/index.js new file mode 100644 index 0000000000..1b3d41eb85 --- /dev/null +++ b/projects/core-bridge/index.js @@ -0,0 +1,70 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +const owners = ['0x52e75D318cFB31f9A2EdFa2DFee26B161255B233', '0x4D73AdB72bC3DD368966edD0f0b2148401A178E2'] +const owner = '0x29d096cD18C0dA7500295f082da73316d704031A' + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners, + fetchCoValentTokens: true, + permitFailure: true + }), + }, + bsc: { + tvl: (api) => + sumTokens2({ + api, + owners, + fetchCoValentTokens: true, + permitFailure: true + }), + }, + polygon: { + tvl: (api) => + sumTokens2({ + api, + owners, + fetchCoValentTokens: true, + permitFailure: true + }), + }, + optimism: { + tvl: (api) => + sumTokens2({ + api, + owner, + fetchCoValentTokens: true, + permitFailure: true + }), + }, + avax: { + tvl: (api) => + sumTokens2({ + api, + owner, + fetchCoValentTokens: true, + permitFailure: true + }), + }, + arbitrum: { + tvl: (api) => + sumTokens2({ + api, + owner, + fetchCoValentTokens: true, + permitFailure: true + }), + }, + base: { + tvl: (api) => + sumTokens2({ + api, + owner: '0x84FB2086Fed7b3c9b3a4Bc559f60fFaA91507879', + fetchCoValentTokens: true, + permitFailure: true + }), + }, +}; diff --git a/projects/core-powercity-io/index.js b/projects/core-powercity-io/index.js index a2038bde24..fe231a9b4f 100644 --- a/projects/core-powercity-io/index.js +++ b/projects/core-powercity-io/index.js @@ -5,7 +5,7 @@ const WATT_TOKEN = "0xDfdc2836FD2E63Bba9f0eE07901aD465Bff4DE71"; const WATT_PLS_LP = "0x956f097E055Fa16Aad35c339E17ACcbF42782DE6"; module.exports = { - start: 1702377175, + start: '2023-12-12', methodology: "No external tokens/coins staked/locked. Only protocol token WATT and WATT-PLS-LP staked within protocol.", pulse: { tvl: async () => ({}), diff --git a/projects/core/index.js b/projects/core/index.js index 6409055e0e..8fef789e5a 100644 --- a/projects/core/index.js +++ b/projects/core/index.js @@ -82,7 +82,7 @@ async function staking(_, block){ module.exports = { ethereum: { - start: 1601142406, // 2020-09-26 17:46:46 (UTC), + start: '2020-09-26', // 2020-09-26 17:46:46 (UTC), tvl, treasury, staking, diff --git a/projects/corgi/index.js b/projects/corgi/index.js index 7b91d612e4..ca2948a7ed 100644 --- a/projects/corgi/index.js +++ b/projects/corgi/index.js @@ -1,3 +1,4 @@ +const { deadFrom } = require("../mosquitos-finance"); module.exports = { dogechain: { @@ -5,5 +6,6 @@ module.exports = { }, hallmarks: [ [1662859935, "Rug pull"], - ] + ], + deadFrom: 1662859935 } \ No newline at end of file diff --git a/projects/corgiswap.js b/projects/corgiswap.js index 059f6df969..c7a1445a49 100644 --- a/projects/corgiswap.js +++ b/projects/corgiswap.js @@ -10,6 +10,6 @@ module.exports = { methodology: 'TVL accounts for the liquidity on all AMM pools, using the TVL chart on https://corgiswap.info/ as the source. Staking accounts for the CORIS locked in MasterChef (0x60E5Cf9111d046E8F986fC98e37d6703607d5Baf)', bsc: { tvl: getUniTVL({ factory, useDefaultCoreAssets: true, }), - staking: stakingPricedLP(masterChef, corisToken, "bsc", "0x1881bd6aba086da0c5cfed7247f216dea50e38ed", "wbnb", true) + staking: async ()=>({}) // CORIS returning an incorrect staking value locked }, } diff --git a/projects/corn-l2/index.js b/projects/corn-l2/index.js new file mode 100644 index 0000000000..1b170f4851 --- /dev/null +++ b/projects/corn-l2/index.js @@ -0,0 +1,14 @@ +const { sumTokensExport } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + owners: [ + "0x8bc93498b861fd98277c3b51d240e7e56e48f23c", + "0x6d85d1c7f58fd5d05b1b633e8b0ce2e57fca9d80", + ], + fetchCoValentTokens: true, + permitFailure: true + }), + }, +}; diff --git a/projects/coslend/index.js b/projects/coslend/index.js index a75948a2d1..68f8b21fe9 100644 --- a/projects/coslend/index.js +++ b/projects/coslend/index.js @@ -1,10 +1,4 @@ -const { usdCompoundExports } = require("../helper/compound"); +const { compoundExports2 } = require("../helper/compound") module.exports = { - evmos: usdCompoundExports( - "0x5b32B588Af5F99F4e5c4038dDE6BDD991024F650", - "evmos", - undefined, - undefined, - {} - ), -}; + evmos: compoundExports2({ comptroller: "0x5b32B588Af5F99F4e5c4038dDE6BDD991024F650" }), +} diff --git a/projects/coupon-finance/index.js b/projects/coupon-finance/index.js index 203f494340..52c1909fc1 100644 --- a/projects/coupon-finance/index.js +++ b/projects/coupon-finance/index.js @@ -69,7 +69,6 @@ module.exports = { misrepresentedTokens: true, doublecounted: true, methodology: "TVL consists of deposit and collateral in the Coupon Finance contract", - start: 150536505, arbitrum: { tvl, }, diff --git a/projects/cozy/index.js b/projects/cozy/index.js index fd1662199d..431e97eda7 100644 --- a/projects/cozy/index.js +++ b/projects/cozy/index.js @@ -1,14 +1,6 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const {compoundExports} = require('../helper/compound') +const { compoundExports } = require('../helper/compound') -const transform = addr=>{ - if(addr==="0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"){ - return ADDRESSES.ethereum.WETH - } - return addr -} - -module.exports={ - methodology: "Count tokens the same way we count for compound", - ethereum: compoundExports('0x895879b2c1fbb6ccfcd101f2d3f3c76363664f92', "ethereum", undefined, undefined, transform) +module.exports = { + methodology: "Count tokens the same way we count for compound", + ethereum: compoundExports('0x895879b2c1fbb6ccfcd101f2d3f3c76363664f92') } \ No newline at end of file diff --git a/projects/crackandstack/index.js b/projects/crackandstack/index.js index 64377de46e..39d351216e 100644 --- a/projects/crackandstack/index.js +++ b/projects/crackandstack/index.js @@ -1,7 +1,8 @@ + const { sumTokensExport } = require("../helper/unwrapLPs"); -const coreAssets = require("../helper/coreAssets.json"); +const ADDRESSES = require("../helper/coreAssets.json"); -const TAIKO_TOKEN = "0xA9d23408b9bA935c230493c40C73824Df71A0975"; +const CONTRACTS = ["0x2c301eBfB0bb42Af519377578099b63E921515B7", "0xD8F7cd7d919c5266777FB83542F956dD30E80187", "0x12689b6ddE632E69fBAA70d066f86aC9fDd33dd1"]; // Crack & Stack // https://crackandstack.com/ @@ -9,8 +10,8 @@ module.exports = { methodology: `Crack & Stack TVL is the backed value of the Lanterns NFT.`, taiko: { tvl: sumTokensExport({ - owners: ["0x2c301eBfB0bb42Af519377578099b63E921515B7", "0xD8F7cd7d919c5266777FB83542F956dD30E80187"], - tokens: [coreAssets.null, coreAssets.taiko.USDT, coreAssets.taiko.USDC_e, coreAssets.taiko.USDC, TAIKO_TOKEN] + owners: CONTRACTS, + tokens: [ADDRESSES.null, ADDRESSES.taiko.USDT, ADDRESSES.taiko.USDC_e, ADDRESSES.taiko.USDC, ADDRESSES.taiko.TAIKO] }), }, } diff --git a/projects/crafting/index.js b/projects/crafting/index.js index de35652d11..4ee4ec79c8 100644 --- a/projects/crafting/index.js +++ b/projects/crafting/index.js @@ -1,11 +1,9 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const contractStakingETH = "0x9353177049757A21f19a28C3055c03871e6428cf"; -const ETH = ADDRESSES.null; const contractAddresses = [ + contractStakingETH, //Staking Contract wbtc "0xF70A76AfFD4c368eD16a2593C4D9FAee3562a4Ba", //Staking Contract usdt @@ -15,6 +13,7 @@ const contractAddresses = [ ]; const tokens = [ + ADDRESSES.null, ADDRESSES.ethereum.WBTC, ADDRESSES.ethereum.USDT, "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D", @@ -32,44 +31,12 @@ const tokens_aurora = [ ADDRESSES.aurora.NEAR, ]; -async function ethTvl(timestamp, block) { - const balances = {}; - - for (let i = 0; i < tokens.length; i++) { - await sumTokensAndLPsSharedOwners( - balances, - [[tokens[i], false]], - [contractAddresses[i]] - ); - } - - const ethBal = ( - await sdk.api.eth.getBalance({ - target: contractStakingETH, - block - }) - ).output; - - sdk.util.sumSingleBalance(balances, ETH, ethBal); - - return balances; +async function ethTvl(api) { + await api.sumTokens({owners: contractAddresses, tokens: tokens}) } -async function auroraTvl(timestamp, block, chainBlocks) { - const balances = {}; - - for (let i = 0; i < tokens_aurora.length; i++) { - await sumTokensAndLPsSharedOwners( - balances, - [[tokens_aurora[i], false]], - [contractAddresses_aurora[i]], - chainBlocks["aurora"], - "aurora", - (addr) => `aurora:${addr}` - ); - } - - return balances; +async function auroraTvl(api) { + return api.sumTokens({owners: contractAddresses_aurora, tokens: tokens_aurora}) } module.exports = { diff --git a/projects/cream/index.js b/projects/cream/index.js index 3f60a31e7b..b9a135c95b 100644 --- a/projects/cream/index.js +++ b/projects/cream/index.js @@ -4,15 +4,14 @@ const { compoundExports } = require("../helper/compound"); module.exports = { hallmarks: [[1635292800, "Flashloan exploit"]], timetravel: false, // bsc and fantom api's for staked coins can't be queried at historical points - start: 1599552000, // 09/08/2020 @ 8:00am (UTC) - ethereum: compoundExports("0xbdC857eae1D15ad171E11af6FC3e99413Ed57Ec4", "ethereum"), + start: '2020-09-08', // 09/08/2020 @ 8:00am (UTC) + ethereum: compoundExports("0xbdC857eae1D15ad171E11af6FC3e99413Ed57Ec4"), bsc: compoundExports( "0x589DE0F0Ccf905477646599bb3E5C622C84cC0BA", - "bsc", "0x1Ffe17B99b439bE0aFC831239dDECda2A790fF3A", ADDRESSES.bsc.WBNB ), - polygon: compoundExports("0x20ca53e2395fa571798623f1cfbd11fe2c114c24", "polygon"), - arbitrum: compoundExports("0xbadaC56c9aca307079e8B8FC699987AAc89813ee", "arbitrum"), - base: compoundExports("0x94d31f92a7f85b51F0B628467B3E660BA3e8D799", "base"), + polygon: compoundExports("0x20ca53e2395fa571798623f1cfbd11fe2c114c24"), + arbitrum: compoundExports("0xbadaC56c9aca307079e8B8FC699987AAc89813ee"), + base: compoundExports("0x94d31f92a7f85b51F0B628467B3E660BA3e8D799"), }; diff --git a/projects/creamswap/abi.json b/projects/creamswap/abi.json deleted file mode 100644 index 5b5c9fc806..0000000000 --- a/projects/creamswap/abi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "getCurrentTokens": "address[]:getCurrentTokens", - "get_virtual_price": "uint256:get_virtual_price", - "getPricePerFullShare": "uint256:getPricePerFullShare", - "balanceOfUnderlying": "function balanceOfUnderlying(address owner) returns (uint256)", - "underlying": "address:underlying" -} \ No newline at end of file diff --git a/projects/creamswap/index.js b/projects/creamswap/index.js index 7c8d5f64de..b0d6eb9ab5 100644 --- a/projects/creamswap/index.js +++ b/projects/creamswap/index.js @@ -1,190 +1,21 @@ -const ADDRESSES = require('../helper/coreAssets.json') -/*================================================== - Modules - ==================================================*/ - - -const sdk = require('@defillama/sdk'); -const abi = require('./abi.json'); -const BigNumber = require('bignumber.js'); -const { getLogs } = require('../helper/cache/getLogs') - -/*================================================== -Settings -==================================================*/ - -const wETH = ADDRESSES.ethereum.WETH; -const usdt = ADDRESSES.ethereum.USDT; -const yyCrv = '0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c'; -const yETH = '0xe1237aA7f535b0CC33Fd973D66cBf830354D16c7'; -const crYFI = '0xCbaE0A83f4f9926997c8339545fb8eE32eDc6b76'; -const crCREAM = '0x892B14321a4FCba80669aE30Bd0cd99a7ECF6aC0'; -const cryUSD = '0x4EE15f44c6F0d8d1136c83EfD2e8E4AC768954c6'; -const CRETH2 = '0xcBc1065255cBc3aB41a6868c22d1f1C573AB89fd'; - -/*================================================== - TVL - ==================================================*/ - -function isCrToken(address) { - const crTokens = [crYFI, crCREAM, cryUSD]; - return crTokens.includes(address); -} +const { getLogs } = require('../helper/cache/getLogs'); +const { sumTokens2 } = require('../helper/unwrapLPs'); async function tvl(api) { - const block = api.block - let balances = { - [ADDRESSES.null]: '0', // ETH - }; - let poolLogs = (await Promise.all([ - getLogs({ - api, - target: '0xf8062Eedf80D8D2527cE89435f670cb996aB4e54', - topic: 'LOG_NEW_POOL(address,address)', - fromBlock: 10815298, - }), - - block >= 11053389 ? - getLogs({ - api, - target: '0x136d6F80Bb3A853D151686BFED2c9309Aea6dDec', - topic: 'LOG_NEW_POOL(address,address)', - fromBlock: 11053389, - }) : Promise.resolve( []), - - block >= 11099537 ? - getLogs({ - api, - target: '0x0d3303Ffaf107cD732396570Bf07b2dbd79B619f', - topic: 'LOG_NEW_POOL(address,address)', - fromBlock: 11099537, - }) : Promise.resolve([]) - ])).reduce((pools, subPools) => { - pools.push(...subPools); - return pools; - }, []) - - let poolCalls = []; - - let pools = poolLogs.map((poolLog) => { - return `0x${poolLog.topics[2].slice(26)}` - }); + getLogs({ api, target: '0xf8062Eedf80D8D2527cE89435f670cb996aB4e54', topic: 'LOG_NEW_POOL(address,address)', fromBlock: 10815298, }), + getLogs({ api, target: '0x136d6F80Bb3A853D151686BFED2c9309Aea6dDec', topic: 'LOG_NEW_POOL(address,address)', fromBlock: 11053389, }), + getLogs({ api, target: '0x0d3303Ffaf107cD732396570Bf07b2dbd79B619f', topic: 'LOG_NEW_POOL(address,address)', fromBlock: 11099537, }) + ])).flat() - const poolTokenData = (await sdk.api.abi.multiCall({ - calls: pools.map((poolAddress) => ({ target: poolAddress })), - abi: abi.getCurrentTokens, - })).output; + let pools = poolLogs.map((poolLog) => `0x${poolLog.topics[2].slice(26)}`) - poolTokenData.forEach((poolToken) => { - let poolTokens = poolToken.output; - let poolAddress = poolToken.input.target; - - poolTokens.forEach((token) => { - poolCalls.push({ - target: token, - params: poolAddress, - }); - }) - }); - - let poolBalances = (await sdk.api.abi.multiCall({ - block, - calls: poolCalls, - abi: 'erc20:balanceOf' - })).output; - - poolBalances.forEach((balanceOf) => { - let balance = balanceOf.output; - let address = balanceOf.input.target; - - if (BigNumber(balance).toNumber() <= 0) { - return; - } - - balances[address] = BigNumber(balances[address] || 0).plus(balance).toFixed(); - }); - - let underlyingBalanceCalls = []; - let underlyingAddressCalls = []; - poolBalances.filter((poolBalance) => isCrToken(poolBalance.input.target)).forEach(pooBalance => { - underlyingBalanceCalls.push({ - target: pooBalance.input.target, - params: pooBalance.input.params, - }); - underlyingAddressCalls.push({ - target: pooBalance.input.target, - params: [], - }) - }) - - let [underlyingBalances, underlyingAddress, yVaultPrices, yCrvPrice] = await Promise.all([ - sdk.api.abi.multiCall({ - block, - calls: underlyingBalanceCalls, - abi: abi['balanceOfUnderlying'], - permitFailure: true, - }), - sdk.api.abi.multiCall({ - block, - calls: underlyingAddressCalls, - abi: abi['underlying'] - }), - sdk.api.abi.multiCall({ - block, - calls: [{ target: yETH }, { target: yyCrv }], - abi: abi['getPricePerFullShare'], - }), - sdk.api.abi.call({ - block, - target: '0x45F783CCE6B7FF23B2ab2D70e416cdb7D6055f51', - params: [], - abi: abi['get_virtual_price'] - }) - ]); - - underlyingBalances = underlyingBalances.output; - underlyingAddress = underlyingAddress.output; - yVaultPrices = yVaultPrices.output; - yCrvPrice = yCrvPrice.output; - - // convert cTokens into underlying tokens - underlyingBalances.forEach((underlying, i) => { - let balance = underlying.output; - let address = underlyingAddress[i].output; - let cAddress = underlying.input.target; - balances[address] = balance; - delete balances[cAddress]; - }) - - // convert vault tokens into underlying values - poolBalances.forEach((balanceOf, i) => { - let balance = balanceOf.output; - let address = balanceOf.input.target; - - if (BigNumber(balance).toNumber() <= 0) { - return; - } - // assume CRETH2:ETH = 1:1 - if (address === CRETH2) { - balances[wETH] = BigNumber(balances[wETH] || 0).plus(balances[CRETH2]).toFixed(); - delete balances[CRETH2]; - } else if (address === yyCrv) { - const yyCrvCash = BigNumber(balance).multipliedBy(yCrvPrice).div(1e18).div(1e12).multipliedBy(yVaultPrices[1].output).div(1e18).integerValue(); - balances[usdt] = BigNumber(balances[usdt] || 0).plus(yyCrvCash).toFixed(); - delete balances[yyCrv]; - } else { - balances[address] = BigNumber(balances[address] || 0).plus(balance).toFixed(); - } - }); - return balances; + const poolTokenData = await api.multiCall({ calls: pools, abi: "address[]:getCurrentTokens", }) + const ownerTokens = poolTokenData.map((v, i) => [v, pools[i]]) + return sumTokens2({ ownerTokens, api }) } -/*================================================== - Exports - ==================================================*/ - module.exports = { - start: 1599552000, // 09/08/2020 @ 8:00am (UTC) + start: '2020-09-08', // 09/08/2020 @ 8:00am (UTC) ethereum: { tvl } } diff --git a/projects/credbull/index.js b/projects/credbull/index.js index aeeb7c6c6b..dd5fae54c2 100644 --- a/projects/credbull/index.js +++ b/projects/credbull/index.js @@ -1,24 +1,64 @@ const { getConfig } = require('../helper/cache'); +const cblConfigArbitrum = { + cbl: "0xD6b3d81868770083307840F513A3491960b95cb6", + cblStakingV2: "0xc0C1DaA773570C041c47cE12c397AdDFD6B7403F", +}; + +const fundConfigPolygon = { + liquidStoneFund: "0x2eda17eb596858566be933b26fae6fa4ee8ccd6d", + fundNavCalculator: "0xcdf038dd3b66506d2e5378aee185b2f0084b7a33", +}; + +// Credbull DeFi Vaults v1 TVL (6 or 12 month fixed APY) async function tvl(api) { let vaults = await getConfig('credbull', "https://incredbull.io/api/vaults") vaults = vaults[api.chain] const tokens = await api.multiCall({ abi: 'address:asset', calls: vaults }) + return api.sumTokens({ tokensAndOwners2: [tokens, vaults] }) } +// Credbull Fund, including LiquidStone +async function borrowedFund(api) { + const fundNavResults = await api.multiCall({ + abi: 'function calcNav(address _vaultProxy) external returns (address denominationAsset, uint256 nav)', + calls: [fundConfigPolygon.liquidStoneFund], + target: fundConfigPolygon.fundNavCalculator, + excludeFailed: true, + }) + const vaultBalance = await api.call({ abi: 'erc20:balanceOf', target: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', params: fundConfigPolygon.liquidStoneFund }) + api.add('0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', vaultBalance * -1) + + fundNavResults.forEach((i) => { + api.add(i.denominationAsset, i.nav) + }); + api.getBalancesV2().removeNegativeBalances() +} + +async function polygonTvl(api) { + const vaultBalance = await api.call({ abi: 'erc20:balanceOf', target: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', params: fundConfigPolygon.liquidStoneFund }) + api.add('0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', vaultBalance) +} + async function borrowed(api) { let vaults = await getConfig('credbull', "https://incredbull.io/api/vaults") vaults = vaults[api.chain] const tokens = await api.multiCall({ abi: 'address:asset', calls: vaults }) const bals = await api.multiCall({ abi: 'address:totalAssets', calls: vaults }) api.add(tokens, bals) - const tBals = (await api.multiCall({ abi: 'erc20:balanceOf', calls: tokens.map((t,i) => ({ target: t, params: vaults[i] })) })).map(i => i * -1) + const tBals = (await api.multiCall({ abi: 'erc20:balanceOf', calls: tokens.map((t, i) => ({ target: t, params: vaults[i] })) })).map(i => i * -1) api.add(tokens, tBals) } +async function stakedCbl(api) { + const bals = await api.multiCall({ abi: 'address:totalAssets', calls: [cblConfigArbitrum.cblStakingV2,] }) + api.add(cblConfigArbitrum.cbl, bals) +} + module.exports = { methodology: 'TVL consist of the sum of every deposit of all vaults for a given asset.', + arbitrum: { tvl, borrowed, staking: stakedCbl }, btr: { tvl, borrowed, }, - arbitrum: { tvl, borrowed }, + polygon: { borrowed: borrowedFund, tvl: polygonTvl }, }; diff --git a/projects/creditum/abi.json b/projects/creditum/abi.json deleted file mode 100644 index 7c1d075b55..0000000000 --- a/projects/creditum/abi.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "token": "address:token" -} \ No newline at end of file diff --git a/projects/creditum/helper.js b/projects/creditum/helper.js deleted file mode 100644 index 3e70d309c5..0000000000 --- a/projects/creditum/helper.js +++ /dev/null @@ -1,51 +0,0 @@ -const abi = require('./abi.json') -const sdk = require('@defillama/sdk') -const BigNumber = require('bignumber.js'); - -async function handleYearnTokens(balances, tokens, owner, block, chain, transform) { - let balance = ( - await sdk.api.abi.multiCall({ - calls: tokens.map((p) => ({ - target: p, - params: owner, - })), - abi: "erc20:balanceOf", - block, - chain, - }) - ).output; - let pricePerShare = ( - await sdk.api.abi.multiCall({ - calls: tokens.map((p) => ({ - target: p, - })), - abi: "uint256:pricePerShare", - block, - chain, - }) - ).output; - let underlyingTokens = ( - await sdk.api.abi.multiCall({ - calls: tokens.map((p) => ({ - target: p, - })), - abi: abi.token, - block, - chain, - }) - ).output; - for (let i = 0; i < balance.length; i++) { - let addr = transform(underlyingTokens[i].output.toLowerCase()); - const price = pricePerShare[i].output - sdk.util.sumSingleBalance( - balances, - addr, - BigNumber(balance[i].output) - .times(price).div(10**Math.log10(price)) - .toFixed(0) - ); - } - } -module.exports = { - handleYearnTokens -} \ No newline at end of file diff --git a/projects/creditum/index.js b/projects/creditum/index.js index b428aeba56..07d58fc878 100644 --- a/projects/creditum/index.js +++ b/projects/creditum/index.js @@ -1,35 +1,25 @@ const ADDRESSES = require('../helper/coreAssets.json') const { stakingPricedLP } = require("../helper/staking"); -const { sumTokensSharedOwners } = require("../helper/unwrapLPs"); const { pool2 } = require("../helper/pool2"); -const { handleYearnTokens } = require("./helper.js"); const lending = "0x04D2C91A8BDf61b11A526ABea2e2d8d778d4A534" -async function tvl(time, ethBlock, chainBlocks){ - const chain = 'fantom' - const block = chainBlocks[chain] - const balances = {} - const transform = addr=> addr===ADDRESSES.fantom.DAI?[ADDRESSES.ethereum.DAI]:`${chain}:${addr}` - await sumTokensSharedOwners(balances, [ - ADDRESSES.fantom.USDC, - ADDRESSES.fantom.WFTM, - ADDRESSES.fantom.DAI, - "0x321162Cd933E2Be498Cd2267a90534A804051b11", - "0x74b23882a30290451A17c44f4F05243b6b58C76d" - ], [lending], block, chain, transform) - await handleYearnTokens(balances, [ - "0x637ec617c86d24e421328e6caea1d92114892439", - "0xef0210eb96c7eb36af8ed1c20306462764935607", - "0x0dec85e74a92c52b7f708c4b10207d9560cefaf0" - ], lending, block, chain, transform) - return balances +async function tvl(api) { + return api.sumTokens({ + owner: lending, tokens: [ + ADDRESSES.fantom.USDC, + ADDRESSES.fantom.WFTM, + ADDRESSES.fantom.DAI, + "0x321162Cd933E2Be498Cd2267a90534A804051b11", + "0x74b23882a30290451A17c44f4F05243b6b58C76d" + ] + }) } -module.exports={ - fantom:{ - tvl, - staking: stakingPricedLP("0xd9e28749e80D867d5d14217416BFf0e668C10645", "0x77128dfdd0ac859b33f44050c6fa272f34872b5e", "fantom", "0x06F3Cb227781A836feFAEa7E686Bdc857e80eAa7", "wrapped-fantom"), - pool2: pool2("0xe0c43105235c1f18ea15fdb60bb6d54814299938", "0x06f3cb227781a836fefaea7e686bdc857e80eaa7"), - }, +module.exports = { + fantom: { + tvl, + staking: stakingPricedLP("0xd9e28749e80D867d5d14217416BFf0e668C10645", "0x77128dfdd0ac859b33f44050c6fa272f34872b5e", "fantom", "0x06F3Cb227781A836feFAEa7E686Bdc857e80eAa7", "wrapped-fantom"), + pool2: pool2("0xe0c43105235c1f18ea15fdb60bb6d54814299938", "0x06f3cb227781a836fefaea7e686bdc857e80eaa7"), + }, } \ No newline at end of file diff --git a/projects/crescent-dex/index.js b/projects/crescent-dex/index.js index 73f391a629..d1c4431ef6 100644 --- a/projects/crescent-dex/index.js +++ b/projects/crescent-dex/index.js @@ -26,5 +26,7 @@ module.exports = { methodology: "Counts the liquidity on all pools. ", crescent: { tvl - } + }, + deadFrom: '2024-05-01', + hallmarks: [[1713052800, 'Sunset of Crescent Network']] } \ No newline at end of file diff --git a/projects/crolend/index.js b/projects/crolend/index.js index 27fb8cb7c0..096c50e7d1 100644 --- a/projects/crolend/index.js +++ b/projects/crolend/index.js @@ -1,11 +1,10 @@ -const { getCompoundV2Tvl } = require('../helper/compound') - module.exports = { hallmarks: [ [1670004805, "Project rugged"] ], + deadFrom: 1670004805, cronos: { - tvl: getCompoundV2Tvl("0x30dF4C58ADaf1FcF388B7Bf775840DEc086dcB98", "cronos"), + tvl: ()=>({}), borrowed: ()=>({}) } } \ No newline at end of file diff --git a/projects/cronos-zk/index.js b/projects/cronos-zk/index.js new file mode 100644 index 0000000000..a0e11b966b --- /dev/null +++ b/projects/cronos-zk/index.js @@ -0,0 +1,7 @@ +const getTvl = require("../txBridge/util") + +module.exports = { + ethereum: { + tvl: async (api) => getTvl(api, { chainId: 388, }), + }, +} diff --git a/projects/crosscurve/index.js b/projects/crosscurve/index.js new file mode 100644 index 0000000000..bdab2f52e3 --- /dev/null +++ b/projects/crosscurve/index.js @@ -0,0 +1,200 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.ethereum.TUSD, // TUSD + ADDRESSES.ethereum.USDT, // USDT + ADDRESSES.ethereum.USDC, // USDC + ADDRESSES.ethereum.DAI, // DAI + "0x4DEcE678ceceb27446b35C672dC7d61F30bAD69E", // crvUSDC + "0x390f3595bCa2Df7d23783dFd126427CCeb997BF4", // crvUSDT + "0x6c3F90f043a72FA612cbac8115EE7e52BDe6E490", // 3Crv + "0xc4AD29ba4B3c580e6D59105FFf484999997675Ff", // crv3crypto + ADDRESSES.ethereum.WETH, // WETH + "0xb7ecb2aa52aa64a717180e030241bc75cd946726", // tBTC/WBTC + ], + }), + }, + arbitrum: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0x4D15a3A2286D883AF0AA1B3f21367843FAc63E07", // TUSD + ADDRESSES.arbitrum.USDT, // USDT + ADDRESSES.arbitrum.USDC, // usdc.e + ADDRESSES.optimism.DAI, // DAI + "0xec090cf6DD891D2d014beA6edAda6e05E025D93d", // crvUSDC + "0x82670f35306253222F8a165869B28c64739ac62e", // 3c-crvUSD + "0x73aF1150F265419Ef8a5DB41908B700C32D49135", // crvUSDT + "0x7f90122BF0700F9E7e1F688fe926940E8839F353", // 2CRV + ADDRESSES.arbitrum.WETH, // WETH + "0x186cf879186986a20aadfb7ead50e3c20cb26cec", // 2BTC-ng + ], + }), + }, + polygon: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0x2e1AD108fF1D8C782fcBbB89AAd783aC49586756", // TUSD + ADDRESSES.polygon.USDT, // USDT + ADDRESSES.polygon.USDC, // usdc.e + ADDRESSES.polygon.DAI, // DAI + "0x5225010a0ae133b357861782b0b865a48471b2c5", // crvUSDC + "0xe7a24ef0c5e95ffb0f6684b813a78f2a3ad7d171", // aave + "0xa70af99bff6b168327f9d1480e29173e757c7904", // crvUSDT + "0xdad97f7713ae9437fa9249920ec8507e5fbb23d3", // crv3crypto + ADDRESSES.polygon.WBTC, // WBTC + ADDRESSES.polygon.WETH_1, // WETH + ], + }), + }, + bsc: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.bsc.TUSD, // TUSD + ADDRESSES.bsc.USDT, // USDT + ADDRESSES.bsc.USDC, // usdc.e + "0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3", // DAI + "0xc4ec3ab41182e70ca45a764ffc5c45b9a82ccc97", // crvUSDC + "0xA5E0E46462970C9Ee8C2ECadcde254c483748Ec4", // b3pool + "0xae87e5fa20f335ce14aa3b9e0616308d9ac7d4ce", // crvUSDT + ADDRESSES.bsc.BTCB, // BTCB + ADDRESSES.bsc.ETH, // ETH + ], + }), + }, + optimism: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0xcB59a0A753fDB7491d5F3D794316F1adE197B21E", // TUSD + ADDRESSES.optimism.USDT, // USDT + ADDRESSES.optimism.USDC, // usdc.e + ADDRESSES.optimism.DAI, // DAI + "0x03771e24b7c9172d163bf447490b142a15be3485", // crvUSDC + "0x1337bedc9d22ecbe766df105c9623922a27963ec", // 3pool + "0xd1b30ba128573fcd7d141c8a987961b40e047bb6", // crvUSDT + ADDRESSES.optimism.WETH_1, // WETH + "0x1dc5c0f8668a9f54ed922171d578011850ca0341", // 2BTC + ], + }), + }, + avax: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0x1C20E891Bab6b1727d14Da358FAe2984Ed9B59EB", // TUSD + ADDRESSES.avax.USDt, // USDT + ADDRESSES.avax.USDC, // usdc.e + ADDRESSES.avax.DAI, // DAI + "0x1337BedC9D22ecbe766dF105c9623922A27963EC", // av3crv + "0x1daB6560494B04473A0BE3E7D83CF3Fdf3a51828", // crv3crypto + ADDRESSES.avax.BTC_b, // BTC.b + ADDRESSES.avax.WETH_e, // WETH.e + ], + }), + }, + base: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0xf6C5F01C7F3148891ad0e19DF78743D31E390D1f", // 4pool + ADDRESSES.optimism.WETH_1, // WETH + "0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf", // cbBTC + ], + }), + }, + xdai: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0x1337bedc9d22ecbe766df105c9623922a27963ec", // x3CRV + ADDRESSES.xdai.WETH, // WETH + ], + }), + }, + blast: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.blast.WETH, // WETH + ADDRESSES.blast.USDB, // USDB + ], + }), + }, + mantle: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.mantle.WETH, // WETH + ADDRESSES.mantle.USDC, // USDC + ], + }), + }, + linea: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.linea.WETH, // WETH + "0x3aab2285ddcddad8edf438c1bab47e1a9d05a9b4", // WBTC + ADDRESSES.linea.USDC, // USDC.e + ], + }), + }, + taiko: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.taiko.WETH, // WETH + ADDRESSES.taiko.USDC, // USDC + ], + }), + }, + celo: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0x28f209844029755fc563c1bd4fd21f42dc7ce0e4", // Tri-pool + ], + }), + }, + fraxtal: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + "0xcaef324bea3ff5c7a08710081294f3344ffadc54", // FRAX/USDT + "0xfc00000000000000000000000000000000000006", // wfrxETH + ], + }), + }, + kava: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.kava.USDt, // USDt + ], + }), + }, + metis: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.metis.WETH, // WETH + ], + }), + }, + mode: { + tvl: sumTokensExport({ + owner: "0xac8f44ceca92b2a4b30360e5bd3043850a0ffcbe", + tokens: [ + ADDRESSES.optimism.WETH_1, // WETH + ], + }), + }, +}; diff --git a/projects/crouton/index.js b/projects/crouton/index.js new file mode 100644 index 0000000000..66f73f7a0f --- /dev/null +++ b/projects/crouton/index.js @@ -0,0 +1,24 @@ +const { get } = require("../helper/http"); +const ADDRESSES = require("../helper/coreAssets.json"); + +async function tvl(api) { + const pools = await get("https://backend.crouton.finance/pools"); + const tvl = pools.reduce((acc, pool) => { + acc += Number(pool.tvlUsd); + return acc; + }, 0); + api.add(ADDRESSES.ton.USDT, tvl * 1e6); +} + +module.exports = { + misrepresentedTokens: true, + timetravel: false, + methodology: ` +The methodology for calculating TVL includes both the TON balance and tokens' balances +data for each pool. The calculation is performed on the Parraton API side. + `.trim(), + + ton: { + tvl, + }, +}; diff --git a/projects/crypto-com/index.js b/projects/crypto-com/index.js index 0df0171433..377bcf63c4 100644 --- a/projects/crypto-com/index.js +++ b/projects/crypto-com/index.js @@ -1,17 +1,9 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { bitcoin: { - owners: [ - 'bc1qpy4jwethqenp4r7hqls660wy8287vw0my32lmy', - '3LhhDLBVWBZChNQv8Dn4nDKFnCyojG1FqN', - '3QsGsAXQ4rqRNvh5pEW55hf3F9PEyb7rVq', - 'bc1qr4dl5wa7kl8yu792dceg9z5knl2gkn220lk7a9', - 'bc1q4c8n5t00jmj8temxdgcc3t32nkg2wjwz24lywv', - '14m3sd9HCCFJW4LymahJCKMabAxTK4DAqW', - 'bc1qjqy709gqpse60hdsm2d2v0dzzu7yp5dej7fdrpl2x3taccvujq4s0vzsyd', - 'bc1qcdqj2smprre85c78d942wx5tauw5n7uw92r7wr' - ], + owners: bitcoinAddressBook.cryptoCom, }, ethereum: { owners: [ diff --git a/projects/crypto-lottery/index.js b/projects/crypto-lottery/index.js index e7b60e3946..7bb9e73fb7 100644 --- a/projects/crypto-lottery/index.js +++ b/projects/crypto-lottery/index.js @@ -13,6 +13,10 @@ const config = { module.exports = { methodology: "We count of smart contract balance in coins", + deadFrom: "2024-09-11", + hallmarks: [ + [Math.floor(new Date('2024-09-11')/1e3), 'Closed due to lack of interest'], + ], } Object.keys(config).forEach(chain => { diff --git a/projects/cryptoswap/index.js b/projects/cryptoswap/index.js index 637e0be72b..b4f8c6a73a 100644 --- a/projects/cryptoswap/index.js +++ b/projects/cryptoswap/index.js @@ -6,5 +6,5 @@ module.exports = { bsc: { tvl: getUniTVL({ factory: '0x4136A450861f5CFE7E860Ce93e678Ad12158695C', useDefaultCoreAssets: true }), }, - start: 1651494114, // Mon May 02 2022 12:21:54 + start: '2022-05-02', // Mon May 02 2022 12:21:54 }; diff --git a/projects/csix/index.js b/projects/csix/index.js index 66a0fb885a..0b66fcdd4b 100644 --- a/projects/csix/index.js +++ b/projects/csix/index.js @@ -22,6 +22,5 @@ module.exports = { tvl: () => ({}), staking, }, - start: 25647232, methodology: "Counts as TVL the CSIX deposited through Staking Contract", }; diff --git a/projects/cswap/index.js b/projects/cswap/index.js index 7a6a0a544d..23c9b0685c 100644 --- a/projects/cswap/index.js +++ b/projects/cswap/index.js @@ -2,6 +2,8 @@ const { transformDexBalances } = require('../helper/portedTokens') const { get } = require('../helper/http') module.exports = { + deadFrom: '2024-09-17', + hallmarks: [[1726531200,'Sunset of cSwap']], timetravel: false, misrepresentedTokens: true, comdex: { diff --git a/projects/cuanswap/index.js b/projects/cuanswap/index.js index 9ec53b7b1a..519e6e011b 100644 --- a/projects/cuanswap/index.js +++ b/projects/cuanswap/index.js @@ -3,6 +3,6 @@ const { getUniTVL, } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, core: { - tvl: getUniTVL({ factory: '0x23556027Ad3C3e76160AcA51e8098C395a6d815C', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x23556027Ad3C3e76160AcA51e8098C395a6d815C', useDefaultCoreAssets: true, }), }, }; diff --git a/projects/cubfinance/index.js b/projects/cubfinance/index.js index 4d6499ccd1..82be384f66 100644 --- a/projects/cubfinance/index.js +++ b/projects/cubfinance/index.js @@ -1,31 +1,15 @@ const sdk = require('@defillama/sdk'); const abi = require('./abi.json'); const { sumTokens2 } = require('../helper/unwrapLPs') -const { getParamCalls } = require('../helper/utils') const { yieldHelper } = require('../helper/yieldHelper') const cubFarmAddress = '0x227e79c83065edb8b954848c46ca50b96cb33e16'; const cubKingdomFarmAddress = '0x2E72f4B196b9E5B89C29579cC135756a00E6CBBd'; const cub = '0x50d809c74e0b8e49e7b4c65bb3109abe3ff4c1c1' -const chain = 'bsc' - -async function tvl(timestamp, ethBlock, { bsc: block }) { - const toa = [] - const poolLength = (await sdk.api.abi.call({ - target: cubFarmAddress, - abi: abi['poolLength'], - chain, block, - })).output; - const { output: res } = await sdk.api.abi.multiCall({ - target: cubFarmAddress, - abi: abi['poolInfo'], - calls: getParamCalls(poolLength), - chain, block, - }) - - res.forEach(({ output }) => toa.push([output.lpToken, cubFarmAddress])) - return sumTokens2({ chain, block, tokensAndOwners: toa, blacklistedTokens: [cub, '0x5E719AA339a6229692cf4163Eb0D966ACF93Ce28',], resolveLP: true, }) +async function tvl(api) { + const farms = await api.fetchList({ lengthAbi: abi.poolLength, itemAbi: abi.poolInfo, target: cubFarmAddress}) + return sumTokens2({ api, owner: cubFarmAddress, tokens: farms.map(i => i.lpToken), blacklistedTokens: [cub, '0x5E719AA339a6229692cf4163Eb0D966ACF93Ce28',], resolveLP: true, }) } const kingdomTvl = yieldHelper({ diff --git a/projects/cubiswap/index.js b/projects/cubiswap/index.js index 1426bdeb66..51750a173e 100644 --- a/projects/cubiswap/index.js +++ b/projects/cubiswap/index.js @@ -1,7 +1,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const FACTORY = "0xE6c8488a3078f474D0B75E4ac06a369e3Fb39d76" // This factory is on opBNB Mainnet (Chain Id: 204) -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true, permitFailure: true }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, permitFailure: true }) module.exports = { diff --git a/projects/curve/abi.json b/projects/curve/abi.json index 4925ec1182..1e5a53712a 100644 --- a/projects/curve/abi.json +++ b/projects/curve/abi.json @@ -18,6 +18,7 @@ "cryptoFactory": "function get_coins(address _pool) view returns (address[2])", "triCryptoFactory": "function get_coins(address _pool) view returns (address[3])", "CurveStableswapFactoryNG": "function get_coins(address _pool) view returns (address[])", - "CurveL2TricryptoFactory": "function get_coins(address _pool) view returns (address[3])" + "CurveTwocryptoFactoryNG": "function get_coins(address _pool) view returns (address[2])", + "CurveTricryptoFactoryNG": "function get_coins(address _pool) view returns (address[3])" } } \ No newline at end of file diff --git a/projects/curve/contracts.json b/projects/curve/contracts.json index bdbd6ed78e..5473e3bbdd 100644 --- a/projects/curve/contracts.json +++ b/projects/curve/contracts.json @@ -36,7 +36,12 @@ "currency": "KRW" } }, - "CurveStableswapFactoryNG": "0x6A8cbed756804B16E05E741eDaBd5cB544AE21bf" + "blacklist": [ + "0x69000dFD5025E82f48Eb28325A2B88a241182CEd" + ], + "CurveStableswapFactoryNG": "0x6A8cbed756804B16E05E741eDaBd5cB544AE21bf", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0x0c0e5f2fF0ff18a3be9b835635039256dC4B4963" }, "polygon": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -52,7 +57,9 @@ "0xa7fd7d83e2d63f093b71c5f3b84c27cff66a7802", "0xacfbe6979d58b55a681875fc9adad0da4a37a51b" ], - "CurveStableswapFactoryNG": "0x1764ee18e8B3ccA4787249Ceb249356192594585" + "CurveStableswapFactoryNG": "0x1764ee18e8B3ccA4787249Ceb249356192594585", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0xC1b393EfEF38140662b91441C6710Aa704973228" }, "arbitrum": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -62,7 +69,8 @@ "2CRV": "0xbf7e49483881c76487b0989cd7d9a8239b20ca41" }, "CurveStableswapFactoryNG": "0x9AF14D26075f142eb3F292D5065EB3faa646167b", - "CurveL2TricryptoFactory": "0xbc0797015fcfc47d9c1856639cae50d0e69fbee8" + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0xbC0797015fcFc47d9C1856639CaE50D0e69FbEE8" }, "aurora": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -71,7 +79,9 @@ "metapoolBases": { "3CRV": "0xbf7e49483881c76487b0989cd7d9a8239b20ca41" }, - "CurveStableswapFactoryNG": "0x5eeE3091f747E60a045a2E715a4c71e600e31F6E" + "CurveStableswapFactoryNG": "0x5eeE3091f747E60a045a2E715a4c71e600e31F6E", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0xC1b393EfEF38140662b91441C6710Aa704973228" }, "avax": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -80,7 +90,9 @@ "metapoolBases": { "av3CRV": "0xb0d2eb3c2ca3c6916fab8dcbf9d9c165649231ae" }, - "CurveStableswapFactoryNG": "0x1764ee18e8B3ccA4787249Ceb249356192594585" + "CurveStableswapFactoryNG": "0x1764ee18e8B3ccA4787249Ceb249356192594585", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0x3d6cB2F6DcF47CDd9C13E4e3beAe9af041d8796a" }, "fantom": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -99,8 +111,9 @@ "scFUSDT": "0x02224765bc8d54c21bb51b0951c80315e1c263f9", "scMIM": "0x90b7c21be43855afd2515675fc307c084427404f" }, - "yearnTokens": {}, - "CurveStableswapFactoryNG": "0xe61Fb97Ef6eBFBa12B36Ffd7be785c1F5A2DE66b" + "CurveStableswapFactoryNG": "0xe61Fb97Ef6eBFBa12B36Ffd7be785c1F5A2DE66b", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0x9AF14D26075f142eb3F292D5065EB3faa646167b" }, "harmony": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -120,11 +133,12 @@ "base": { "wrapped": "0x4200000000000000000000000000000000000006", "registriesMapping": { - "triCryptoFactory": "0xa5961898870943c68037f6848d2d866ed2016bcb", "stableFactory": "0x3093f9B57A428F3EB6285a589cb35bEA6e78c336", "cryptoFactory": "0x5EF72230578b3e399E6C6F4F6360edF95e83BBfd" }, - "CurveStableswapFactoryNG": "0xd2002373543Ce3527023C75e7518C274A51ce712" + "CurveStableswapFactoryNG": "0xd2002373543Ce3527023C75e7518C274A51ce712", + "CurveTwocryptoFactoryNG": "0xc9Fe0C63Af9A39402e8a5514f9c43Af0322b665F", + "CurveTricryptoFactoryNG": "0xa5961898870943c68037f6848d2d866ed2016bcb" }, "optimism": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -133,7 +147,9 @@ "metapoolBases": { "3CRV": "0x1337bedc9d22ecbe766df105c9623922a27963ec" }, - "CurveStableswapFactoryNG": "0x5eeE3091f747E60a045a2E715a4c71e600e31F6E" + "CurveStableswapFactoryNG": "0x5eeE3091f747E60a045a2E715a4c71e600e31F6E", + "CurveTricryptoFactoryNG": "0xc6C09471Ee39C7E30a067952FcC89c8922f9Ab53", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F" }, "xdai": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -153,7 +169,9 @@ "fraxtal": { "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "metapoolBases": {}, - "CurveStableswapFactoryNG": "0xd2002373543ce3527023c75e7518c274a51ce712" + "CurveStableswapFactoryNG": "0xd2002373543Ce3527023C75e7518C274A51ce712", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0xc9Fe0C63Af9A39402e8a5514f9c43Af0322b665F" }, "kava": { "addressProvider": "0x0000000022D53366457F9d5E68Ec105046FC4383", @@ -165,16 +183,50 @@ "xlayer": { "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "metapoolBases": {}, - "CurveStableswapFactoryNG": "0x5eee3091f747e60a045a2e715a4c71e600e31f6e" + "CurveStableswapFactoryNG": "0x5eee3091f747e60a045a2e715a4c71e600e31f6e", + "CurveTwocryptoFactoryNG": "0x0c59d36b23f809f8b6c7cb4c8c590a0ac103baef", + "CurveTricryptoFactoryNG": "0xd3b17f862956464ae4403ccf829ce69199856e1e" }, "bsc": { "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "metapoolBases": {}, - "CurveStableswapFactoryNG": "0xd7e72f3615aa65b92a4dbdc211e296a35512988b" + "CurveStableswapFactoryNG": "0xd7e72f3615aa65b92a4dbdc211e296a35512988b", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0xc55837710bc500F1E3c7bb9dd1d51F7c5647E657" }, "mantle": { "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "metapoolBases": {}, - "CurveStableswapFactoryNG": "0x5eee3091f747e60a045a2e715a4c71e600e31f6e" + "CurveStableswapFactoryNG": "0x5eee3091f747e60a045a2e715a4c71e600e31f6e", + "CurveTwocryptoFactoryNG": "0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F", + "CurveTricryptoFactoryNG": "0x0C9D8c7e486e822C29488Ff51BFf0167B4650953" + }, + "taiko": { + "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "wrapped": "0xA51894664A773981C6C112C43ce576f315d5b1B6", + "CurveStableswapFactoryNG": "0x06452f9c013fc37169B57Eab8F50A7A48c9198A3", + "CurveTwocryptoFactoryNG": "0xFAbC421e3368D158d802684A217a83c083c94CeB", + "CurveTricryptoFactoryNG": "0x0C9D8c7e486e822C29488Ff51BFf0167B4650953" + }, + "corn": { + "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "wrapped": "0xda5dDd7270381A7C2717aD10D1c0ecB19e3CDFb2", + "CurveStableswapFactoryNG": "0xd7E72f3615aa65b92A4DBdC211E296a35512988B", + "CurveTwocryptoFactoryNG": "0x5Ea9DD3b6f042A34Df818C6c1324BC5A7c61427a", + "CurveTricryptoFactoryNG": "0x7Ca46A636b02D4aBC66883D7FF164bDE506DC66a" + }, + "sonic": { + "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "wrapped": "0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38", + "CurveStableswapFactoryNG": "0x7C2085419BE6a04f4ad88ea91bC9F5C6E6C463D8", + "CurveTwocryptoFactoryNG": "0x1A83348F9cCFD3Fe1A8C0adBa580Ac4e267Fe495", + "CurveTricryptoFactoryNG": "0x635742dCC8313DCf8c904206037d962c042EAfBd" + }, + "ink": { + "gasTokenDummy": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "wrapped": "0x4200000000000000000000000000000000000006", + "CurveStableswapFactoryNG": "0x046207cB759F527b6c10C2D61DBaca45513685CC", + "CurveTwocryptoFactoryNG": "0xd125E7a0cEddF89c6473412d85835450897be6Dc", + "CurveTricryptoFactoryNG": "0x5Ea9DD3b6f042A34Df818C6c1324BC5A7c61427a" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/projects/curve/index.js b/projects/curve/index.js index c53dc8ecc7..1a3488fc5b 100644 --- a/projects/curve/index.js +++ b/projects/curve/index.js @@ -1,5 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensSharedOwners, nullAddress, sumTokens2, } = require("../helper/unwrapLPs"); +const { nullAddress, sumTokens2, } = require("../helper/unwrapLPs"); const { getChainTransform } = require("../helper/portedTokens"); const { getCache } = require("../helper/http"); const { getUniqueAddresses } = require("../helper/utils"); @@ -11,14 +11,14 @@ const contracts = require("./contracts.json"); const { getLogs } = require('../helper/cache/getLogs') const chains = [ - "ethereum", //-200M - "polygon", //-40M - "arbitrum", //G - "aurora", //G - "avax", //-30M - "fantom", //-80M - "optimism", //-6M - "xdai", //G + "ethereum", + "polygon", + "arbitrum", + "aurora", + "avax", + "fantom", + "optimism", + "xdai", "moonbeam", "celo", "kava", @@ -26,8 +26,12 @@ const chains = [ "fraxtal", "xlayer", "bsc", - "mantle" -]; // Object.keys(contracts); + "mantle", + "taiko", + "corn", + "sonic", + "ink" +]; const registryIds = { stableswap: 0, stableFactory: 3, @@ -92,7 +96,7 @@ async function getPools(block, chain) { let { registriesMapping, addressProvider } = contracts[chain] if (!registriesMapping) { registriesMapping = {}; - if(addressProvider){ + if (addressProvider) { (await sdk.api.abi.multiCall({ block, chain, calls: Object.values(registryIds).map(r => ({ params: r })), @@ -106,8 +110,11 @@ async function getPools(block, chain) { if (contracts[chain].CurveStableswapFactoryNG) { registriesMapping.CurveStableswapFactoryNG = contracts[chain].CurveStableswapFactoryNG } - if (contracts[chain].CurveL2TricryptoFactory) { - registriesMapping.CurveL2TricryptoFactory = contracts[chain].CurveL2TricryptoFactory + if (contracts[chain].CurveTricryptoFactoryNG) { + registriesMapping.CurveTricryptoFactoryNG = contracts[chain].CurveTricryptoFactoryNG + } + if (contracts[chain].CurveTwocryptoFactoryNG) { + registriesMapping.CurveTwocryptoFactoryNG = contracts[chain].CurveTwocryptoFactoryNG } const poolList = {} await Promise.all(Object.entries(registriesMapping).map(async ([registry, addr]) => { @@ -165,7 +172,7 @@ async function unwrapPools({ poolList, registry, chain, block }) { const callParams = { target: registryAddress, calls: poolList.map(i => ({ params: i.output })), chain, block, } const { output: coins } = await sdk.api.abi.multiCall({ ...callParams, abi: abi.get_coins[registry] }) let nCoins = {} - if (!['cryptoFactory', 'triCryptoFactory', 'CurveL2TricryptoFactory'].includes(registry)) + if (!['cryptoFactory', 'triCryptoFactory', 'CurveL2TricryptoFactory', 'CurveTricryptoFactoryNG', 'CurveTwocryptoFactoryNG'].includes(registry)) nCoins = (await sdk.api.abi.multiCall({ ...callParams, abi: abi.get_n_coins[registry] })).output let { wrapped = '', metapoolBases = {}, blacklist = [] } = contracts[chain] @@ -257,25 +264,17 @@ module.exports.ethereum["staking"] = staking( ); module.exports.harmony = { - tvl: async (ts, ethB, chainB) => { - if (ts > 1655989200) { + tvl: async (api) => { + if (api.timestamp > 1655989200) { // harmony hack return {}; } - const block = chainB.harmony - const balances = {}; - await sumTokensSharedOwners( - balances, - [ + return api.sumTokens({ + owner: '0xC5cfaDA84E902aD92DD40194f0883ad49639b023', tokens: [ "0xef977d2f931c1978db5f6747666fa1eacb0d0339", "0x3c2b8be99c50593081eaa2a724f0b8285f5aba8f" - ], - ["0xC5cfaDA84E902aD92DD40194f0883ad49639b023"], - block, - "harmony", - addr => `harmony:${addr}` - ); - return balances; + ] + }) } }; diff --git a/projects/cvex/index.js b/projects/cvex/index.js new file mode 100644 index 0000000000..1ed0398786 --- /dev/null +++ b/projects/cvex/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') + +const MAIN_CONTRACT = '0xBe14D34ce8737614331cE1904AA659E26657eE85'; // Main Contract Address (Proxy) + +module.exports = { + methodology: 'counts the USDC balance in the main contract on Arbitrum.', + arbitrum: { + tvl: sumTokensExport({ owner: MAIN_CONTRACT, tokens: [ADDRESSES.arbitrum.USDC_CIRCLE] }), + }, +} \ No newline at end of file diff --git a/projects/cyberblast-v2/index.js b/projects/cyberblast-v2/index.js index 4981fbf840..4697179eda 100644 --- a/projects/cyberblast-v2/index.js +++ b/projects/cyberblast-v2/index.js @@ -7,6 +7,6 @@ module.exports = { misrepresentedTokens: true, methodology: `Uses Uniswap-style factory address to find and price liquidity pairs.`, blast: { - tvl: getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true }), + tvl: getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, }), } }; \ No newline at end of file diff --git a/projects/cybertime/index.js b/projects/cybertime/index.js index 96bc09744d..89599fa158 100644 --- a/projects/cybertime/index.js +++ b/projects/cybertime/index.js @@ -1,7 +1,7 @@ const abi = require("./abi.json"); const { pool2s } = require("../helper/pool2"); -const { addFundsInMasterChef } = require("../helper/masterchef"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { sumTokens2 } = require("../helper/unwrapLPs"); +const { staking } = require("../helper/staking"); const pool2FarmContracts = [ //CTFFarmV1 @@ -53,53 +53,20 @@ const farms = [ "0xCE997537498793d25dAb0F289e161DB26914275A", ]; -const Staking = async (chainBlocks) => { - const balances = {}; - - let transformAddress = i => `bsc:${i}`; - await sumTokensAndLPsSharedOwners( - balances, - [ - [NFTL_V1, false], - [CTF_V1, false], - [NFTL_V2, false], - [CTF_V2, false], - [CTF_V3, false], - ], - farms, - chainBlocks["bsc"], - "bsc", - transformAddress - ); - - return balances; -}; const bscTvl = async (api) => { - const balances = {}; - - let transformAddress = i => `bsc:${i}`; + const blacklistedTokens = [CTF_V3, CTF_V2] + const ownerTokens = [] for (const farm of farms) { - await addFundsInMasterChef( - balances, - farm, - api.bsc, - "bsc", - transformAddress, - abi.poolInfo, - [CTF_V2], - true, - true, - CTF_V3 - ); + const poolInfos = await api.fetchList({ lengthAbi: 'poolLength', itemAbi: abi.poolInfo, target: farm }) + ownerTokens.push([poolInfos.map(pool => pool.lpToken), farm]) } - - return balances; + return sumTokens2({ api, ownerTokens, blacklistedTokens, resolveLP: true, }) }; module.exports = { - bsc: { - staking: Staking, + bsc: { + staking: staking(farms, [NFTL_V1, CTF_V1, NFTL_V2, CTF_V2, CTF_V3,]), pool2: pool2s(pool2FarmContracts, lpPool2), tvl: bscTvl, }, diff --git a/projects/cybro/index.js b/projects/cybro/index.js new file mode 100644 index 0000000000..eed091e92a --- /dev/null +++ b/projects/cybro/index.js @@ -0,0 +1,67 @@ +const vaultsBlast = [ + '0xe922bccf90d74f02a9d4203b377399314e008e41', + '0xdccde9c6800bea86e2e91cf54a870ba3ff6faf9f', + '0x0667ac28015ed7146f19b2d218f81218abf32951', + '0x9c3d4e6f96d2c3ddd8afee3891b955283a920889', + '0xd58826d2c0babf1a60d8b508160b52e9c19aff07', + '0x7458ac85593472ba501ee361449638ed180a7ee7', + '0xdb5e7d5ac4e09206fed80efd7abd9976357e1c03', + '0x567103a40c408b2b8f766016c57a092a180397a1', + '0xc66fc517c8bf1c34ae48529df53dd84469e21daa', + '0x3500e1d4e93c9f45aa8198efda16842cb73fa1bc', + '0xb4e96a45699b4cfc08bb6dd71eb1276bfe4e26e7', + '0x3db2bd838c2bed431dcfa012c3419b7e94d78456', + '0xf56dab7b7b2954aa86a591f164205e6cdd33797e', + '0x83eaed4393328f77d0e402018a369b8b82e501a4', + '0x4f3da57dbfb2b85c96e3556c5f1859ef88f5d6b1', + '0x9cc62ef691e869c05fd2ec41839889d4e74c3a3f', + '0xc9434fbee4ec9e0bad7d067b35d2329e5f1d8915', + '0x18e22f3f9a9652ee3a667d78911bac55bc2249af', + '0x6654cddf2a14a06307af6a8d7731dd4e059962a1', + '0x4caec64454893c7912e6beb1e19b4714dd353748', + '0x24e72c2c7be9b07942f6f8d3cdce995df699514d', +] + +const vaultsArbitrum = [ + '0x320cd9d00961fb45857a043efea77dc6b9db5d95', + '0x6f0acbaac51f3c72ddaa4edc6e20fc388d20adbc', + '0x951c846aa10cc3da45defed784c3802605f71769', +] + +const dexes = [ + '0xe9041d3483a760c7d5f8762ad407ac526fbe144f', + '0xbfb18eda8961ee33e38678caf2bceb2d23aedfea', + '0xe472ccb182a51c589034957cd6291d0b64eaaab2', + '0x370498c028564de4491b8aa2df437fb772a39ec5', + '0xc95317e48451a97602e3ae09c237d1dd8ee83cd0', + '0x66e1bea0a5a934b96e2d7d54eddd6580c485521b', +] + +async function tvlBlast(api) { + const token0s = await api.multiCall({ abi: 'address:token0', calls: dexes}) + const token1s = await api.multiCall({ abi: 'address:token1', calls: dexes}) + const positionData = await api.multiCall({ abi: 'function getPositionAmounts() view returns (uint256 amount0, uint256 amount1)', calls: dexes}) + const ownerTokens = [] + dexes.forEach((dex, idx) => { + const token0 = token0s[idx] + const token1 = token1s[idx] + const { amount0, amount1 } = positionData[idx] + api.add(token0, amount0) + api.add(token1, amount1) + ownerTokens.push([[token0, token1], dex]) + }) + + await api.sumTokens({ ownerTokens }) + return api.erc4626Sum2({ calls: vaultsBlast }); +} + +async function tvlArbitrum(api) { + return api.erc4626Sum2({ calls: vaultsArbitrum }); +} + +module.exports = { + doublecounted: true, + methodology: "We calculate TVL based on the Total Supply of our proxy contracts through which users interact with vault's contracts", + blast: { tvl: tvlBlast }, + arbitrum: { tvl: tvlArbitrum }, +}; diff --git a/projects/cygnus-fi-restake/index.js b/projects/cygnus-fi-restake/index.js new file mode 100644 index 0000000000..af16c2f48b --- /dev/null +++ b/projects/cygnus-fi-restake/index.js @@ -0,0 +1,31 @@ +const { sumTokensExport } = require('../helper/sumTokens'); +const ADDRESSES = require('../helper/coreAssets.json') + +// Cygnus is extending the restaking protocol to more chains. +// Bsquared is one of the first chains we are supporting. + +const CYGNUS_POOL_CONFIG = { + bsquared: { + UBTC: { + depositToken: ADDRESSES.bsquared.UBTC, + vault: '0x7551aEa51588AaCe99B89c3FaC3CFc4108DB8094' + }, + STBTC: { + depositToken: '0xf6718b2701D4a6498eF77D7c152b2137Ab28b8A3', + vault: '0x0Ce45dd53affbb011884EF1866E0738f58AB7969' + }, + UNIBTC: { + depositToken: '0x93919784C523f39CACaa98Ee0a9d96c3F32b593e', + vault: '0xBc323bA4bbf2559417C3Ca47A75e2Ea341Cf8320' + } + } +} + +module.exports = { + methodology: "Calculates assets locked in cygnus restaking vault", +} + +Object.keys(CYGNUS_POOL_CONFIG).forEach(chain => { + const tokensAndOwners = Object.values(CYGNUS_POOL_CONFIG[chain]).map(i => [i.depositToken, i.vault]) + module.exports[chain] = { tvl: sumTokensExport({ tokensAndOwners }) } +}) \ No newline at end of file diff --git a/projects/cygnus-fi-ton/index.js b/projects/cygnus-fi-ton/index.js new file mode 100644 index 0000000000..f795f9a54f --- /dev/null +++ b/projects/cygnus-fi-ton/index.js @@ -0,0 +1,31 @@ +const { call } = require("../helper/chain/ton") +const { get } = require('../helper/http') + +// helper function of getting jetton metadata +async function getJettonMetadata(addr) { + const res = await get(`https://tonapi.io/v2/jettons/${addr}`) + return res +} + +async function tvl(api) { + const CLTON_MINTER_ADDRESS = 'EQDz48al4FfPnapvXYJOfkBOIj3xvNZ0t5vSpQN-Qukqwm7W' + const CLTON_TOKEN_ADDRESS = 'EQCxd6SJQ8KiLkEpN3OoBfUIHqPE3yp0j80UnPysQqcTikNF' + + const cltonMinterResult = await call({ target: CLTON_MINTER_ADDRESS, abi: "get_minter_data", stack: [] }) + // exchange rate from clTON to TON: decimal 9 + + const cltonToTon = cltonMinterResult[4] / 1e9 + const cltonMetadata = await getJettonMetadata(CLTON_TOKEN_ADDRESS) + + // Now the tokens in the withdrawal vault will be correctly destroyed, so the TOTAL SUPPLY can be a true indication of tvl + const cltonTotalSupply = (cltonMetadata['total_supply']) / 1e9 + + const cltonTvl = cltonTotalSupply * cltonToTon + api.addCGToken("the-open-network", cltonTvl) +} + +module.exports = { + ton: { + tvl + } +}; \ No newline at end of file diff --git a/projects/cytonic/index.js b/projects/cytonic/index.js new file mode 100644 index 0000000000..ab4ac254cf --- /dev/null +++ b/projects/cytonic/index.js @@ -0,0 +1,172 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs"); +const { getProvider, sumTokens2, } = require("../helper/solana"); +const { Program } = require("@project-serum/anchor"); +const idl = { + "version": "0.1.0", + "name": "depositor", + "instructions": [], + "accounts": [ + { + "name": "VaultData", + "docs": [ + "Vault is a instance that holds general deposit data for a particular token", + "It is also responsible for freezing and migrating funds", + "When program receives funds, they are send on vault data's account's ATA" + ], + "type": { + "kind": "struct", + "fields": [ + { "name": "owner", "type": "publicKey" }, + { "name": "mint", "type": "publicKey" }, + { "name": "vaultAta", "type": "publicKey" }, + { "name": "withdrawDuration", "type": "u64" }, + { "name": "isFrozen", "type": "bool" }, + { "name": "totalDeposited", "type": "u64" }, + { "name": "bump", "type": "u8" }, + { "name": "allowedForPurchase", "type": "bool" }, + { "name": "purchaseRecepientAta", "type": "publicKey" }, + { "name": "admin", "type": "publicKey" } + ] + } + } + ], + "types": [], + "events": [], + "errors": [] +} + +const BRIDGE_DEPOSITOR_EVM = '0xaEA5Bf79F1E3F2069a99A99928927988EC642e0B'; +const BRIDGE_DEPOSITOR_SOL = 'HYDqq5GfUj4aBuPpSCs4fkmeS7jZHRhrrQ3q72KsJdD4'; + +async function sol_tvl() { + const provider = getProvider() + const program = new Program(idl, BRIDGE_DEPOSITOR_SOL, provider) + const tokenAccounts = (await program.account.vaultData.all()).map((a) => a.account.vaultAta); + return sumTokens2({ tokenAccounts }) +} + + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // ETH + ADDRESSES.ethereum.WBTC, // WBTC + ADDRESSES.ethereum.WETH, // WETH + "0xd31a59c85ae9d8edefec411d448f90841571b89c", // WSOL + ADDRESSES.ethereum.WSTETH, // Lido WSTETH + ADDRESSES.ethereum.EETH, // EETH + '0xd9a442856c234a39a81a089c06451ebaa4306a72', // pufETH + '0xf951e335afb289353dc249e82926178eac7ded78', // swETH + ADDRESSES.ethereum.USDT, // USDT + ADDRESSES.ethereum.USDC, // USDC + ADDRESSES.ethereum.DAI, // DAI + '0xbf5495Efe5DB9ce00f80364C8B423567e58d2110', // ezETH + ADDRESSES.ethereum.USDe, // Ethena USD + ], + }), + }, + bsc: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // BNB + ADDRESSES.bsc.USDC, // USDC + ADDRESSES.bsc.USDT, // USDT + '0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3', // DAI + ], + }), + }, + arbitrum: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // ETH + ADDRESSES.arbitrum.USDC_CIRCLE, // USDC + ADDRESSES.arbitrum.USDT, // USDT + ADDRESSES.arbitrum.DAI, // DAI + ADDRESSES.optimism.ezETH, // ezETH + ], + }), + }, + base: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // ETH + ADDRESSES.base.USDC, // USDC + ], + }), + }, + polygon: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // POL + ADDRESSES.polygon.USDC, // USDC + ADDRESSES.polygon.USDT, // USDT + ADDRESSES.polygon.DAI, // DAI + ], + }), + }, + avax: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // AVA + ADDRESSES.avax.USDC, // USDC + ADDRESSES.avax.USDt, // USDT + ADDRESSES.avax.DAI, // DAI + ], + }), + }, + optimism: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // ETH + ADDRESSES.optimism.USDC_CIRCLE, // USDC + ADDRESSES.optimism.USDT, // USDT + ADDRESSES.optimism.DAI, // DAI + ], + }), + }, + blast: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // ETH + ADDRESSES.blast.USDB, // USDB + ], + }), + }, + manta: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // ETH + ADDRESSES.manta.WETH, // WETH + ADDRESSES.manta.USDC, // USDC + ADDRESSES.manta.USDT, // USDT + "0x1468177dbcb2a772f3d182d2f1358d442b553089", // Manta mBTC + "0xaccbc418a994a27a75644d8d591afc22faba594e", // Manta mETH + "0x649d4524897ce85a864dc2a2d5a11adb3044f44a", // Manta mUSD + ], + }) + }, + bsquared: { + tvl: sumTokensExport({ + owner: BRIDGE_DEPOSITOR_EVM, + tokens: [ + ADDRESSES.null, // BTC + ADDRESSES.bsquared.WBTC, // WBTC + ADDRESSES.bsquared.USDT, // USDT + ], + }) + }, + solana: { + tvl: sol_tvl + } +} \ No newline at end of file diff --git a/projects/cytoswap/index.js b/projects/cytoswap/index.js new file mode 100644 index 0000000000..fd11aef503 --- /dev/null +++ b/projects/cytoswap/index.js @@ -0,0 +1,7 @@ +const { uniV3GraphExport } = require('../helper/uniswapV3') + +module.exports = { + hela: { + tvl: uniV3GraphExport({ graphURL: 'https://subgraph.snapresearch.xyz/subgraphs/name/cytoswap-mainnet', name: 'cytoswap-hela' }), + } +} \ No newline at end of file diff --git a/projects/d2finance/index.js b/projects/d2finance/index.js index 975a89d36b..36496a21f1 100644 --- a/projects/d2finance/index.js +++ b/projects/d2finance/index.js @@ -1,22 +1,53 @@ const { sumERC4626VaultsExport } = require("../helper/erc4626"); -const vaultTvl = sumERC4626VaultsExport({ +const vaultTvlOnArbitrum = sumERC4626VaultsExport({ vaults: [ "0x27D22Eb71f00495Eccc89Bb02c2B68E6988C6A42", "0x183424d5ae5ec9fd486634bc566d0f75ad9c9109", - "0x80c403807b1032d7cb19b6d612ce23f05a213d36", "0x5b49d7fae00de64779ddcd6b067c8eb046bd9a0b", "0x291344FBaaC4fE14632061E4c336Fe3B94c52320", - "0xEd80C858D43a1D043E86Cf1F20384e189cf23BDA", - "0x4ada76cc8755f62508a2df65d7fafa4fd26e76c6", + "0x0F76De33a3679a6065D14780618b54584a3907D4", + "0xD1D64dAeED7504Ef3Eb056aa2D973bD064843A84", "0x1c17a39B156189BF40905425170a3Ff62fb650DA", + "0xB0730AA7d6e880F901B5d71A971096dB56895a0f", + "0x5f44A7DD0a016A5Ec9682df36899A781442CAa43", + "0x0215EdEecdABE3DfC5EC8D59337eC9b26d359088", + "0x36b1939ADf539a4AC94b57DBAd32FaEcd5bcF4d0", + "0x34F0FdD80A51dfd8bA42343c20F89217280d760E", + "0x57f467C9c4639B066F5A4D676Cd8Ed7D87C1791b", "0x7348925D3C63e4E61e9F5308eEec0f06EaA3bB7b", + "0xCFBBea43Fd99126E4c0eF53e2344609D513f72b3", + "0x195a9e0f29f96d4ab2139ee1272380a4aa352890", + '0x75288264FDFEA8ce68e6D852696aB1cE2f3E5004', + '0xaB2743a3A2e06d457368E901F5f927F271fa1374', + '0x91aCd32dA9beA6DA3751dc12Ee0fBe47169349C1', + '0xc027EC28F76d92D4124fCbffCF6b25137a84968C', + '0x999a57ae7694298126a5db2E44F778CA486b14FC', + '0xaC75f0c46723432a2303f2a7c7769535A179Ed56', + '0x907A9f69061736AD82811CccD6ADD9dC4A2352A9', + '0x1176c3760Af6a1dbAa5BBd0Cc6cdA8A2Ed6B785E' ], isOG4626: true, }); +const vaultTvlOnBase = sumERC4626VaultsExport({ + vaults: ['0x6c05A7d2c24B48fC3C615D294fEc2eB068548897'], + isOG4626: true, +}) + +const vaultTvlOnEthereum = sumERC4626VaultsExport({ + vaults: ['0x07Dff4087b43c4A759f4Fc69511c26d51929dAF4'], + isOG4626: true, +}) + module.exports = { arbitrum: { - tvl: vaultTvl, + tvl: vaultTvlOnArbitrum, + }, + base: { + tvl: vaultTvlOnBase, + }, + ethereum: { + tvl: vaultTvlOnEthereum, }, }; diff --git a/projects/d8x/index.js b/projects/d8x/index.js index 474940d709..d59cde674c 100644 --- a/projects/d8x/index.js +++ b/projects/d8x/index.js @@ -2,9 +2,10 @@ const abi = require("./abi-poolInfo.json"); const { sumTokens2 } = require("../helper/unwrapLPs"); const config = { - polygon_zkevm: { factory: "0xaB7794EcD2c8e9Decc6B577864b40eBf9204720f" }, + polygon_zkevm: { factory: "0x900DfC161C34656a9D9c43307F92255C2aa06162" }, xlayer: { factory: "0xb24dB543749277E8625a59C061aE7574C8235475" }, arbitrum: { factory: "0x8f8BccE4c180B699F81499005281fA89440D1e95" }, + base : {factory: "0x7F3A4A9e5BB469F0F4977AA390760aF9EFCCd406"} }; async function tvl(api) { diff --git a/projects/dSOL/index.js b/projects/dSOL/index.js new file mode 100644 index 0000000000..70f6e31dce --- /dev/null +++ b/projects/dSOL/index.js @@ -0,0 +1,13 @@ +const { getSolBalanceFromStakePool } = require('../helper/solana') + +async function tvl(api) { + // dSOL sanctum stake pool : https://solscan.io/account/9mhGNSPArRMHpLDMSmxAvuoizBqtBGqYdT8WGuqgxNdn + await getSolBalanceFromStakePool('9mhGNSPArRMHpLDMSmxAvuoizBqtBGqYdT8WGuqgxNdn', api) +} + +module.exports = { + timetravel: false, + solana: { + tvl + } +} \ No newline at end of file diff --git a/projects/dackieswap-v2/index.js b/projects/dackieswap-v2/index.js index 5d17bd3771..6a262b5d20 100644 --- a/projects/dackieswap-v2/index.js +++ b/projects/dackieswap-v2/index.js @@ -1,11 +1,11 @@ const { getUniTVL } = require("../helper/unknownTokens"); const { stakings } = require("../helper/staking"); -const DACKIE = "0xc2BC7A73613B9bD5F373FE10B55C59a69F4D617B"; +const DACKIE = "0x73326b4d0225c429bed050c11C4422d91470AaF4"; const stakingPools = [ // Lock & flexible pool - "0x4Ad387bcb03B92a6e22A72391Cc37493Fc388B05", + "0xF6C5b5Df9Bcee40cd474CCd6373f99b56dBCF5E5", ]; const config = { xlayer: '0x757cd583004400ee67e5cc3c7a60c6a62e3f6d30', @@ -15,6 +15,8 @@ const config = { inevm: '0x507940c2469e6e3b33032f1d4ff8d123bdde2f5c', mode: '0x757cd583004400ee67e5cc3c7a60c6a62e3f6d30', base: '0x591f122D1df761E616c13d265006fcbf4c6d6551', + linea: '0x9790713770039CeFcf4FAaf076E2846c9B7a4630', + wc: '0x757cD583004400ee67e5cC3c7A60C6a62E3F6d30', } module.exports = { diff --git a/projects/dackieswap/index.js b/projects/dackieswap/index.js index d84e295906..d7b1425e6f 100644 --- a/projects/dackieswap/index.js +++ b/projects/dackieswap/index.js @@ -4,8 +4,10 @@ module.exports = uniV3Export({ base: { factory: "0x3D237AC6D2f425D2E890Cc99198818cc1FA48870", fromBlock: 2031627 }, optimism: { factory: "0xc2BC7A73613B9bD5F373FE10B55C59a69F4D617B", fromBlock: 115172042 }, arbitrum: { factory: "0xaEdc38bD52b0380b2Af4980948925734fD54FbF4", fromBlock: 180722131 }, - blast: { factory: "0xd1575B2e0C82fba9Eddc3de9c9AAF923AFA670cC", fromBlock: 286237 }, + blast: { factory: "0xCFC8BfD74422472277fB5Bc4Ec8851d98Ecb2976", fromBlock: 8239180 }, inevm: { factory: "0xf79A36F6f440392C63AD61252a64d5d3C43F860D", fromBlock: 291933 }, mode: { factory: "0xc6f3966E5D08Ced98aC30f8B65BeAB5882Be54C7", fromBlock: 6102035 }, xlayer: { factory: "0xc6f3966e5d08ced98ac30f8b65beab5882be54c7", fromBlock: 278971 }, + linea: { factory: "0xc6255ec7CDb11C890d02EBfE77825976457B2470", fromBlock: 8488016 }, + wc: { factory: "0xB9010964301326160173da694c0697a2FcE82F39", fromBlock: 4523073 }, }); \ No newline at end of file diff --git a/projects/dalmatiandex/index.js b/projects/dalmatiandex/index.js index ec70804526..9ee62afc08 100644 --- a/projects/dalmatiandex/index.js +++ b/projects/dalmatiandex/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('shibarium', '0x80108b858e04d5a35EF7dA7A67Cf45eeD18abf27', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('shibarium', '0x80108b858e04d5a35EF7dA7A67Cf45eeD18abf27') \ No newline at end of file diff --git a/projects/dam-finance/index.js b/projects/dam-finance/index.js index e0be38c63a..d8fc05afbe 100644 --- a/projects/dam-finance/index.js +++ b/projects/dam-finance/index.js @@ -4,7 +4,6 @@ const ethCollateralJoins = ["0xB1fbcD7415F9177F5EBD3d9700eD5F15B476a5Fe"] module.exports = { methodology: 'Currently counting the USDC that DAM Finance has locked up, but will add more collateral types and multiple chains in the future', - start: 16375673, // LMCV Deployment Block ethereum: { tvl: sumTokensExport({ tokens: [ADDRESSES.ethereum.USDC], diff --git a/projects/damm-finance/index.js b/projects/damm-finance/index.js index 5274ec161d..7814fb9b58 100644 --- a/projects/damm-finance/index.js +++ b/projects/damm-finance/index.js @@ -1,17 +1,15 @@ const ADDRESSES = require('../helper/coreAssets.json') const { compoundExports } = require('../helper/compound') -const WETH = ADDRESSES.ethereum.WETH const bETH = "0xe970c37243F3d0B2AeB041b855Ef6466CB140BcA" const unitroller = "0x4F96AB61520a6636331a48A11eaFBA8FB51f74e4" -const { tvl, borrowed } = compoundExports( - unitroller, "ethereum", bETH, WETH, ); +const { tvl, borrowed } = compoundExports(unitroller, bETH,); module.exports = { - methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", - ethereum: { tvl, borrowed }, - hallmarks:[ - [1664974802, "Liquidity Bonding Start"] - ], + methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", + ethereum: { tvl, borrowed }, + hallmarks: [ + [1664974802, "Liquidity Bonding Start"] + ], } diff --git a/projects/danzo-arena/index.js b/projects/danzo-arena/index.js index b7084cb67d..76cc62fb10 100644 --- a/projects/danzo-arena/index.js +++ b/projects/danzo-arena/index.js @@ -1,7 +1,13 @@ const { sumTokensExport } = require("../helper/chain/cardano"); const scriptAdresses = [ - "addr1vx4caaf06swdn7cdfc7pu3sw235zvuhd02tw2np4uac9mwcp2vt4y", //Danzo Tokens locked inside the address for the DeFi game DANZO ARENA: https://cardanzoada.com/arena/ + "addr1vx4caaf06swdn7cdfc7pu3sw235zvuhd02tw2np4uac9mwcp2vt4y", //Danzo Tokens locked inside the address for the DeFi game DANZO ARENA: https://danzo.gg/arena/ + "addr1q8wu9v2wn8hkzq2g7q3ez8a99thw0gwmlhgpc2crmfk982xr2rqrszevgfwunrxu8ajh7pfhmaf6ppj60nj8rnhqhl4srgnekp", //Danzo Tokens locked inside the address for the DeFi game DANZO Game: https://danzo.gg + "addr1vxherk6ug9235v0mrrmywsr2493sxsydmaylzajs7xavd9q30593r", //Sugar tokens locked inside the address for the DeFi game Sugar Factory: https://sugarcardano.io/factory +"addr1vy3jm4p3s0ufyu4y7zv9jhzzf3uj0j5r9zegkge7gpdt7zgk33jxw", //Cock tokens locked inside the address for the DeFi game Cock Arena: https://cockcardano.io/arena +"addr1vxqnqk9vfxne3p3ecktnshjjjvyzfxc9pgyf9ux76nrukpq4j73z8", +"addr1vxh2lgfhrd65zer39d5a2lyfsmke9628n4fcu92yvq4ufgcuuy7th", +"addr1v8zyytsux8kg0ues0xd40m9yvghjs6s3vr92ndujq3lxqzscq75s0" ]; module.exports = { diff --git a/projects/daolama/borrowed.js b/projects/daolama/borrowed.js index cad75fd016..f18b21a407 100644 --- a/projects/daolama/borrowed.js +++ b/projects/daolama/borrowed.js @@ -1,14 +1,17 @@ -const sdk = require("@defillama/sdk"); -const { transformBalances } = require("../helper/portedTokens"); -const { get } = require('../helper/http'); +const sdk = require('@defillama/sdk'); +const { transformBalances } = require('../helper/portedTokens'); const ADDRESSES = require('../helper/coreAssets.json'); -const { BASE_API_URL } = require("./constants"); -const nullAddress = ADDRESSES.null; +const { call } = require('../helper/chain/ton'); +const { POOL_ADDRESS } = require('./constants'); async function borrowed(api) { const balances = {}; - const result = await get(`${BASE_API_URL}/api/v1/analytics/borrowed`); - sdk.util.sumSingleBalance(balances, nullAddress, result.value, api.chain); + const result = await call({ + target: POOL_ADDRESS, + abi: 'get_pool_data', + }); + const borrowedTon = result[2]; + sdk.util.sumSingleBalance(balances, ADDRESSES.ton.TON, borrowedTon, api.chain); return transformBalances(api.chain, balances); } diff --git a/projects/daolama/constants.js b/projects/daolama/constants.js index 476851f0dd..57a78813b3 100644 --- a/projects/daolama/constants.js +++ b/projects/daolama/constants.js @@ -1,5 +1,3 @@ module.exports = { - BASE_API_URL: 'https://api.daolama.co', - POOL_WALLET_ADDRESS: 'EQAwsDboFl_iGuaflNn5959HOamenkvQEQDwakO55CY2SGB8', POOL_ADDRESS: 'EQCkeTvOSTBwBtP06X2BX7THj_dlX67PhgYRGuKfjWtB9FVb' } diff --git a/projects/daolama/tvl.js b/projects/daolama/tvl.js index 01de78e2cb..ded130ec97 100644 --- a/projects/daolama/tvl.js +++ b/projects/daolama/tvl.js @@ -1,10 +1,10 @@ -const ADDRESSES = require("../helper/coreAssets.json"); -const { POOL_ADDRESS, POOL_WALLET_ADDRESS } = require("./constants"); -const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require('../helper/coreAssets.json'); +const { POOL_ADDRESS } = require('./constants'); +const { sumTokensExport } = require('../helper/chain/ton'); module.exports = { tvl: sumTokensExport({ - owners: [POOL_ADDRESS, POOL_WALLET_ADDRESS], + owners: [POOL_ADDRESS], tokens: [ADDRESSES.ton.TON, ADDRESSES.ton.USDT] }), } diff --git a/projects/darkauto/abi.json b/projects/darkauto/abi.json deleted file mode 100644 index cc4d761525..0000000000 --- a/projects/darkauto/abi.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "poolLength": "uint256:poolLength", - "wantLockedTotal": "uint256:wantLockedTotal", - "poolInfo": "function poolInfo(uint256) view returns (address want, uint256 allocPoint, uint256 lastRewardTime, address strategy, uint256 earlyWithdrawFee, uint256 earlyWithdrawTime)" -} \ No newline at end of file diff --git a/projects/darkauto/index.js b/projects/darkauto/index.js index a8580e1641..e28e2ad790 100644 --- a/projects/darkauto/index.js +++ b/projects/darkauto/index.js @@ -1,21 +1,31 @@ -const vaultUtils = require("./utils") +const { sumUnknownTokens } = require("../helper/unknownTokens") -async function cronosTVL(timestamp, block, chainBlocks){ - const vaultAddress = "0x66D586eae9B30CD730155Cb7fb361e79D372eA2a" - return await vaultUtils.tvl(chainBlocks.cronos, 'cronos', vaultAddress) +module.exports = { + doublecounted: true, + misrepresentedTokens: true, } -async function dogechainTVL(timestamp, block, chainBlocks){ - const vaultAddress = "0xf5e5271432089254288F47d6F2CFcfE066377900" - return await vaultUtils.tvl(chainBlocks.dogechain, 'dogechain', vaultAddress) + +const config = { + cronos: '0x66D586eae9B30CD730155Cb7fb361e79D372eA2a', + dogechain: '0xf5e5271432089254288F47d6F2CFcfE066377900', } -module.exports = { - doublecounted: true, - cronos: { - tvl: cronosTVL, - }, - dogechain: { - tvl: dogechainTVL, +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + const poolInfos = await api.fetchList({ lengthAbi: abi.poolLength, itemAbi: abi.poolInfo, target: config[chain] }) + const lps = poolInfos.map(pool => pool.want) + const strategies = poolInfos.map(pool => pool.strategy) + const bals = await api.multiCall({ abi: abi.wantLockedTotal, calls: strategies }) + api.add(lps, bals) + return sumUnknownTokens({ api, lps, resolveLP: true }) + } } -}; +}) + +const abi = { + "poolLength": "uint256:poolLength", + "wantLockedTotal": "uint256:wantLockedTotal", + "poolInfo": "function poolInfo(uint256) view returns (address want, uint256 allocPoint, uint256 lastRewardTime, address strategy, uint256 earlyWithdrawFee, uint256 earlyWithdrawTime)" +} \ No newline at end of file diff --git a/projects/darkauto/utils.js b/projects/darkauto/utils.js deleted file mode 100644 index 2e318248ba..0000000000 --- a/projects/darkauto/utils.js +++ /dev/null @@ -1,125 +0,0 @@ -const sdk = require("@defillama/sdk"); -const BigNumber = require("bignumber.js"); -const abi = require("./abi.json"); -const { getLPData, getTokenPrices, } = require('../helper/unknownTokens'); - -const farmLPBalance = async ( - chain, - block, - lpToken, - lpLocked, - token0, - token1, -) => { - const balances = ( - await sdk.api.abi.multiCall({ - abi: "erc20:balanceOf", - calls: [ - { - target: token0, - params: [lpToken], - }, - { - target: token1, - params: [lpToken], - } - ], - block, - chain: chain, - }) - ).output; - - const lpTotalSuply = ( - await sdk.api.abi.call({ - target: lpToken, - abi: "erc20:totalSupply", - chain: chain, - block, - }) - ).output; - const token0Locked = (lpLocked * balances[0].output) / lpTotalSuply; - const token1Locked = (lpLocked * balances[1].output) / lpTotalSuply; - - return [ - { token: `${chain}:${token0}`, locked: token0Locked }, - { token: `${chain}:${token1}`, locked: token1Locked }, - ]; -}; - - - -const tvl = async (block, chain, vaultAddress) => { - const balances = {}; - const { output: poolLength } = await sdk.api.abi.call({ - abi: abi["poolLength"], - target: vaultAddress, - chain, - }) - let calls = [] - for (let i = 0; i < poolLength; i++) { - calls.push({ - target: vaultAddress, - params: [i] - }) - } - let poolInfos = - await sdk.api.abi.multiCall({ - abi: abi["poolInfo"], - calls, - block, - chain: chain, - }) - .then(d => d.output).then(d => d.map(poolInfo => poolInfo.output)); - - const lps = poolInfos.map(pool =>{ - return pool.want - }) - - const tokenInfos = await getLPData({block, chain, lps, allLps: false}) - - let wanLockedTotals = - await sdk.api.abi.multiCall({ - abi: abi["wantLockedTotal"], - calls: poolInfos.map(poolInfo => { - return { - target: poolInfo.strategy, - params: [] - } - }), - block, - chain: chain, - }) - .then(d => d.output).then(d => d.map(lock => lock.output)); - - let requests = []; - calls.map((item, idx) => { - const lpAddress = poolInfos[idx].want.toLowerCase(); - if(!tokenInfos[lpAddress]) - return null; - - requests.push(farmLPBalance( - chain, - block, - lpAddress, - wanLockedTotals[idx], - tokenInfos[lpAddress].token0Address, - tokenInfos[lpAddress].token1Address - )); - }); - const data = await Promise.all(requests); - - data.forEach((farm) => { - farm.forEach((item) => { - balances[item.token] = new BigNumber(balances[item.token] || 0) - .plus(item.locked || 0) - .toFixed(0); - }); - }); - - const { updateBalances, prices} = await getTokenPrices({ chain, block, lps, useDefaultCoreAssets: true}) - await updateBalances(balances) - return balances; -}; -module.exports = { - tvl, -}; diff --git a/projects/darkcrypto/farm-utils.js b/projects/darkcrypto/farm-utils.js index 22195222b3..c6e9c73711 100644 --- a/projects/darkcrypto/farm-utils.js +++ b/projects/darkcrypto/farm-utils.js @@ -1,90 +1,38 @@ -const sdk = require('@defillama/sdk'); -const BigNumber = require('bignumber.js'); -const farmCronos = require('./farm-cronos.json'); +const abi = { + getReserves: "function getReserves() view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast)", + poolInfo: "function poolInfo(uint256) view returns (address token, uint256 allocPoint, uint256 lastRewardTime, uint256 accSkyPerShare, bool isStarted)" +} -const farmLPBalance = async ( - chain, - block, - masterChef, - lpToken, - token0, - token1, -) => { - const balances = ( - await sdk.api.abi.multiCall({ - abi: 'erc20:balanceOf', - calls: [ - { - target: token0, - params: [lpToken], - }, - { - target: token1, - params: [lpToken], - }, - { - target: lpToken, - params: [masterChef], - }, - ], - block, - chain: chain, - }) - ).output; - - const lpTotalSuply = ( - await sdk.api.abi.call({ - target: lpToken, - abi: 'erc20:totalSupply', - chain: chain, - block, - }) - ).output; - const token0Locked = (balances[2].output * balances[0].output) / lpTotalSuply; - const token1Locked = (balances[2].output * balances[1].output) / lpTotalSuply; - return [ - { token: `${chain}:${token0}`, locked: token0Locked }, - { token: `${chain}:${token1}`, locked: token1Locked }, - ]; -}; +const pool2Balances = async (api, masterChef) => { + const calls = Array.from({ length: 9 }, (_, i) => ({ target: masterChef, params: [i] })); + const poolsInfos = await api.multiCall({ calls, abi: abi.poolInfo }) + const pools = poolsInfos.map(({ token }) => token) + const [token0s, token1s, balances, reserves, supplies] = await Promise.all([ + api.multiCall({ calls: pools.map((p) => ({ target: p })), abi: 'address:token0', permitFailure: true }), + api.multiCall({ calls: pools.map((p) => ({ target: p })), abi: 'address:token1', permitFailure: true }), + api.multiCall({ calls: pools.map((p) => ({ target: p, params: [masterChef] })), abi: 'erc20:balanceOf', permitFailure:true }), + api.multiCall({ calls: pools.map((p) => ({ target: p })), abi: abi.getReserves, permitFailure:true }), + api.multiCall({ calls: pools.map((p) => ({ target: p })), abi: 'erc20:totalSupply', permitFailure:true }) + ]) -const farmLocked = async (block) => { - const balances = {}; - const tokens = farmCronos.tokens; + pools.forEach((_, i) => { + const token0 = token0s[i] + const token1 = token1s[i] + const balance = balances[i] + const reserve = reserves[i] + const supply = supplies[i] + if (!token0 || !token1 || !balance || !reserve || !supply) return - const allPools = farmCronos.farms - .map((t) => { - return t.pools.map((pool) => { - return Object.assign(pool, { - masterChef: t.masterChef, - }); - }); - }) - .reduce((acc, current) => [...acc, ...current], []); - const promises = allPools.map((item) => { - return farmLPBalance( - 'cronos', - block, - item.masterChef, - item.lpToken, - tokens[item.token0], - tokens[item.token1], - ); - }); + const _balance0 = Math.round(reserve[0] * balance / supply) + const _balance1 = Math.round(reserve[1] * balance / supply) - const data = await Promise.all(promises); - data.forEach((farm) => { - farm.forEach((item) => { - balances[item.token] = new BigNumber(balances[item.token] || 0) - .plus(item.locked || 0) - .toFixed(0); - }); - }); + api.add(token0, _balance0) + api.add(token1, _balance1) + }) +} - return balances; -}; module.exports = { - farmLocked, -}; + pool2Balances +} \ No newline at end of file diff --git a/projects/darkcrypto/index.js b/projects/darkcrypto/index.js index 0ba25a6e1a..895db318fd 100644 --- a/projects/darkcrypto/index.js +++ b/projects/darkcrypto/index.js @@ -1,33 +1,10 @@ const { stakingUnknownPricedLP } = require("../helper/staking"); -const farmUtils = require("./farm-utils"); const vaultUtils = require("./vault-utils") +const { pool2Balances } = require("./farm-utils"); -const sdk = require("@defillama/sdk"); const sky = "0x9D3BBb0e988D9Fb2d55d07Fe471Be2266AD9c81c"; const boardroom = "0x2e7d17ABCb9a2a40ec482B2ac9a9F811c12Bf630"; - - -async function pool2(timestamp, block, chainBlocks) { - // SKY POOL - const farmTvl = await farmUtils.farmLocked(chainBlocks["cronos"]); - let balances = {}; - - //add CRO balance in LP pool - sdk.util.sumSingleBalance( - balances, - "cronos:0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23", - farmTvl["cronos:0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23"] - ); - - //add Dark and Sky balance in LP pool - sdk.util.sumSingleBalance( - balances, - "cronos:0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23", - farmTvl["cronos:0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23"], - ); - - return balances; -} +const masterChef = "0x42B652A523367e7407Fb4BF2fA1F430781e7db8C" async function vault(api){ return vaultUtils.vaultLocked(api) @@ -37,13 +14,12 @@ module.exports = { doublecounted: true, cronos: { tvl:vault, - pool2, + pool2: (api) => pool2Balances(api, masterChef), staking: stakingUnknownPricedLP( boardroom, sky, "cronos", "0xaA0845EE17e4f1D4F3A8c22cB1e8102baCf56a77" ), - }, }; diff --git a/projects/darkness/index.js b/projects/darkness/index.js index ac1f3dce8c..6d7d830dc2 100644 --- a/projects/darkness/index.js +++ b/projects/darkness/index.js @@ -10,7 +10,7 @@ module.exports = { tvl: sumTokensExport({ owner: '0x92631e0e84ff01853ef1bb88fc9c9f7d1e1af1ca', tokens: [ - '0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23', + ADDRESSES.cronos.WCRO_1, '0xf2001b145b43032aaf5ee2884e456ccd805f677d', ADDRESSES.cronos.USDC, '0x6582c738660bf0701f05b04dce3c4e5fcfcda47a', diff --git a/projects/datadex/index.js b/projects/datadex/index.js new file mode 100644 index 0000000000..e62fd4939d --- /dev/null +++ b/projects/datadex/index.js @@ -0,0 +1,4 @@ +const { uniV3Export } = require('../helper/uniswapV3') +module.exports = uniV3Export({ + vana: { factory: '0xc2a0d530e57B1275fbce908031DA636f95EA1E38', fromBlock: 763744, blacklistedTokens: ['0xbd2d7c728b224961fdb25ccf2a67eb3c25f5ec52'] }, +}) \ No newline at end of file diff --git a/projects/ddex/index.js b/projects/ddex/index.js index 7af4ef5151..0b0b97e917 100644 --- a/projects/ddex/index.js +++ b/projects/ddex/index.js @@ -26,7 +26,7 @@ async function tvl(timestamp, block) { } module.exports = { - start: 1566470505, // 2019-08-22T18:41:45+08:00 + start: '2019-08-22', // 2019-08-22T18:41:45+08:00 ethereum: { tvl } } diff --git a/projects/deepbook-sui/index.js b/projects/deepbook-sui/index.js index f09f1fb55a..48e9623c26 100644 --- a/projects/deepbook-sui/index.js +++ b/projects/deepbook-sui/index.js @@ -34,6 +34,7 @@ function findClosestTvl(data, ts) { // Sum all unique values together let totalTvl = Object.values(aggregatedTvl).reduce((acc, current) => acc + current, 0); + if (+totalTvl<0) return 0 return totalTvl; } diff --git a/projects/deepbook-v3/index.js b/projects/deepbook-v3/index.js new file mode 100644 index 0000000000..f133f0ac4a --- /dev/null +++ b/projects/deepbook-v3/index.js @@ -0,0 +1,32 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { get } = require("../helper/http"); + +const coins = { + deepType: "0xdeeb7a4662eec9f2f3def03fb937a663dddaa2e215b8078a284d026b7946c270::deep::DEEP", + suiType: "0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI", + usdcType: ADDRESSES.sui.USDC_CIRCLE, + bethType: ADDRESSES.sui.ETH, + wusdtType: ADDRESSES.sui.USDT, + wusdcType: ADDRESSES.sui.USDC, + nsType: "0x5145494a5f5100e645e4b0aa950fa6b68f614e8c59e17bc5ded3495123a79178::ns::NS", + typusType: "0xf82dc05634970553615eef6112a1ac4fb7bf10272bf6cbe0f80ef44a6c489385::typus::TYPUS", +} + +const endpointUrl = "https://deepbook-indexer.mainnet.mystenlabs.com" +const endpointName = "get_net_deposits" + +const tvl = async (api) => { + const url = `${endpointUrl}/${endpointName}/${Object.values(coins).join(',')}/${api.timestamp}` + const data = await get(url) + Object.keys(data).forEach(coin => { + api.add(coin, data[coin]) + }) +} + +module.exports = { + methodology: "All deposits into all BalanceManagers minutes all withdrawals from all BalanceManagers", + start: '2024-10-14', + sui: { + tvl, + } +} \ No newline at end of file diff --git a/projects/deepp/index.js b/projects/deepp/index.js index 2499155bdc..886c97fc53 100644 --- a/projects/deepp/index.js +++ b/projects/deepp/index.js @@ -3,7 +3,7 @@ const ADDRESSES = require("../helper/coreAssets.json"); module.exports = { methodology: 'Lists the number of owned USDC tokens in the Deepp LP and BetLock contracts.', - start: 1696118400, + start: '2023-10-01', arbitrum: { tvl: sumTokensExport({ owners: Object.values({ diff --git a/projects/defi-money/index.js b/projects/defi-money/index.js index ed6010732e..984d9f3788 100644 --- a/projects/defi-money/index.js +++ b/projects/defi-money/index.js @@ -25,6 +25,17 @@ const config = { "0x07aDF588508b923B8eA0389d27b61b9CB8a197Cb", // FRAX/MONEY ], }, + base: { + controller: "0x1337F001E280420EcCe9E7B934Fa07D67fdb62CD", + MONEY: "0xEbE54BEE7A397919C53850bA68E126b0A6b295ed", + stakeLPs: [ + // "0x9F04112af02CE57C10d946481Ea06373719c1E7E", // MONEY - already included in tvl + "0xe0f7c023763d782970ab45e9232255a64290cd6a", // crvUSD/MONEY + "0xb7698c690752ae034e914a29a0de67339a94982b", // USDC/MONEY + "0x45acdee3c9f7e1c7ad6cc10c9cb9f74eb52d0e70", // USDbC/MONEY + "0xac786337dde86b768ea3cc90afa03250bccfff28", // DAI/MONEY + ], + }, } const tvl = async (api) => { diff --git a/projects/defi-swap/index.js b/projects/defi-swap/index.js index e2b4294eb8..5cd7ba3646 100644 --- a/projects/defi-swap/index.js +++ b/projects/defi-swap/index.js @@ -2,7 +2,7 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - start: 1599523200, // Tuesday, 8 September 2020 00:00:00 + start: '2020-09-08', // Tuesday, 8 September 2020 00:00:00 ethereum: { tvl: getUniTVL({ factory: '0x9DEB29c9a4c7A88a3C0257393b7f3335338D9A9D', useDefaultCoreAssets: true }), }, diff --git a/projects/defichain-dex.js b/projects/defichain-dex.js index 8d2144ce1f..2714258e88 100644 --- a/projects/defichain-dex.js +++ b/projects/defichain-dex.js @@ -11,10 +11,10 @@ async function tvl() { } module.exports = { - methodology: "Liquidity on the DEX, DUSD price is reduced by 30% because of the dex stabilty tax", + methodology: "Liquidity on the DEX, DUSD price is reduced by 30% because of the dex stability tax", timetravel: false, misrepresentedTokens: true, defichain: { tvl } -} \ No newline at end of file +} diff --git a/projects/defiedge/index.js b/projects/defiedge/index.js index b6fa4ce46e..593ca05004 100644 --- a/projects/defiedge/index.js +++ b/projects/defiedge/index.js @@ -20,6 +20,8 @@ async function getTvl(api) { } module.exports = { + hallmarks: [[1730332800, "Definitive Sunset of DefiEdge"]], + deadFrom: '2024-10-31', doublecounted: true, misrepresentedTokens: true, timetravel: false, diff --git a/projects/defifranc/index.js b/projects/defifranc/index.js index c56eb397c3..c89825a674 100644 --- a/projects/defifranc/index.js +++ b/projects/defifranc/index.js @@ -34,7 +34,7 @@ module.exports = { tvl, staking: staking(MON_STAKING_POOL, MON_TOKEN), }, - start: 1664074800, + start: '2022-09-25', methodology: "Total deposits of ETH and wBTC for borrowed DCHF.", }; \ No newline at end of file diff --git a/projects/defiyieldprotocol/index.js b/projects/defiyieldprotocol/index.js index fdffde9b53..ce1adc4572 100644 --- a/projects/defiyieldprotocol/index.js +++ b/projects/defiyieldprotocol/index.js @@ -83,7 +83,7 @@ const lps = { } module.exports = { - start: 1619654324, // Apr-28-2021 23:58:44 PM +UTC + start: '2021-04-29', // Apr-28-2021 23:58:44 PM +UTC ethereum: { tvl: sumTokensExport({ tokens: [ diff --git a/projects/defrost/index.js b/projects/defrost/index.js index 9759ed21a6..c8b24f6e19 100644 --- a/projects/defrost/index.js +++ b/projects/defrost/index.js @@ -60,7 +60,6 @@ async function staking(api) { module.exports = { doublecounted: true, - start: 6965653, avax: { tvl, staking diff --git a/projects/defx/index.js b/projects/defx/index.js new file mode 100644 index 0000000000..98626e678f --- /dev/null +++ b/projects/defx/index.js @@ -0,0 +1,13 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs"); + +module.exports = { + arbitrum: { + tvl: sumTokensExport({ tokensAndOwners: [ + [ + ADDRESSES.arbitrum.USDC_CIRCLE, + '0x091486F9427cf07942fa17Ad7194BE3feaDfa46d' + ] + ]}) + } +} \ No newline at end of file diff --git a/projects/degate/index.js b/projects/degate/index.js index 04e1654b68..9ad22c28c6 100644 --- a/projects/degate/index.js +++ b/projects/degate/index.js @@ -17,6 +17,6 @@ async function tvl(api) { } module.exports = { - start: 1699746983, // Nov-11-2023 11:56:23 PM +UTC + start: '2023-11-12', // Nov-11-2023 11:56:23 PM +UTC ethereum: { tvl } } diff --git a/projects/deltaprime/index.js b/projects/deltaprime/index.js index 626b2577ad..a297a8128d 100644 --- a/projects/deltaprime/index.js +++ b/projects/deltaprime/index.js @@ -18,20 +18,20 @@ const assetToAddressMappingAvalanche = require('./mappings/assetToAddressMapping const assetToAddressMappingArbitrum = require('./mappings/assetToAddressMappingArbitrum.json') // Avalanche -const USDC_POOL_TUP_CONTRACT = '0x2323dAC85C6Ab9bd6a8B5Fb75B0581E31232d12b'; -const USDT_POOL_TUP_CONTRACT = '0xd222e10D7Fe6B7f9608F14A8B5Cf703c74eFBcA1'; -const WAVAX_POOL_TUP_CONTRACT = '0xD26E504fc642B96751fD55D3E68AF295806542f5'; -const BTC_POOL_TUP_CONTRACT = '0x475589b0Ed87591A893Df42EC6076d2499bB63d0'; -const ETH_POOL_TUP_CONTRACT = '0xD7fEB276ba254cD9b34804A986CE9a8C3E359148'; +const USDC_POOL_TUP_CONTRACT = '0x8027e004d80274FB320e9b8f882C92196d779CE8'; +const USDT_POOL_TUP_CONTRACT = '0x1b6D7A6044fB68163D8E249Bce86F3eFbb12368e'; +const WAVAX_POOL_TUP_CONTRACT = '0xaa39f39802F8C44e48d4cc42E088C09EDF4daad4'; +const BTC_POOL_TUP_CONTRACT = '0x70e80001bDbeC5b9e932cEe2FEcC8F123c98F738'; +const ETH_POOL_TUP_CONTRACT = '0x2A84c101F3d45610595050a622684d5412bdf510'; const SMART_LOANS_FACTORY_TUP_AVALANCHE = '0x3Ea9D480295A73fd2aF95b4D96c2afF88b21B03D'; // Arbitrum -const USDC_POOL_TUP_ARBI_CONTRACT = '0x8FE3842e0B7472a57f2A2D56cF6bCe08517A1De0'; -const ETH_POOL_TUP_ARBI_CONTRACT = '0x0BeBEB5679115f143772CfD97359BBcc393d46b3'; -const BTC_POOL_TUP_ARBI_CONTRACT = '0x5CdE36c23f0909960BA4D6E8713257C6191f8C35'; -const ARB_POOL_TUP_ARBI_CONTRACT = '0x2B8C610F3fC6F883817637d15514293565C3d08A'; -const DAI_POOL_TUP_ARBI_CONTRACT = '0xd5E8f691756c3d7b86FD8A89A06497D38D362540'; +const USDC_POOL_TUP_ARBI_CONTRACT = '0x8Ac9Dc27a6174a1CC30873B367A60AcdFAb965cc'; +const ETH_POOL_TUP_ARBI_CONTRACT = '0x788A8324943beb1a7A47B76959E6C1e6B87eD360'; +const BTC_POOL_TUP_ARBI_CONTRACT = '0x0ed7B42B74F039eda928E1AE6F44Eed5EF195Fb5'; +const ARB_POOL_TUP_ARBI_CONTRACT = '0xC629E8889350F1BBBf6eD1955095C2198dDC41c2'; +const DAI_POOL_TUP_ARBI_CONTRACT = '0xFA354E4289db87bEB81034A3ABD6D465328378f1'; const SMART_LOANS_FACTORY_TUP_ARBITRUM = '0xFf5e3dDaefF411a1dC6CcE00014e4Bca39265c20'; @@ -178,8 +178,6 @@ async function addTraderJoeLPs({ api, accounts }) { module.exports = { methodology: 'Counts TVL of DeltaPrime\'s lending pools and individual PrimeAccount contracts\'', - start: - 24753316, avax: { tvl: tvlAvalanche, }, diff --git a/projects/deltatrade.js b/projects/deltatrade.js new file mode 100644 index 0000000000..784017fb2c --- /dev/null +++ b/projects/deltatrade.js @@ -0,0 +1,62 @@ +const { sumTokens } = require('./helper/chain/near') +const { getConfig } = require('./helper/cache') +const { get } = require('./helper/http') + +const { PublicKey } = require('@solana/web3.js'); +const { sumTokens2, ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, } = require('./helper/solana') + +const state = new PublicKey('FRcbUFpGHQppvXAyJrNYLKME1BQfowh4xKZB2vt9j6yn'); +const programId = new PublicKey('CNLGhYQgNwjyDfHZTEjHfk1MPkqwP96qZahWN82UfcLM'); + +const GRID_CONTRACT_ID = 'grid.deltatrade.near'; +const DCA_CONTRACT_ID = 'dca.deltatrade.near'; + +const nearApi = 'https://api.deltatrade.ai'; +const solanaApi = 'https://solapi.deltatrade.ai'; + + +module.exports = { + timetravel: false, + near: { + tvl: nearTVL, + }, + solana: { + tvl: solanaTvl, + } +} + +async function getTokens(chain) { + return getConfig(`deltatrade/${chain}-pairs`, undefined, { + fetcher: async () => { + const url = `${chain === 'solana' ? solanaApi : nearApi}/api/bot/grid/pairs`; + const { data } = await get(url); + const tokenSet = new Set() + data.forEach(pair => { + tokenSet.add(pair.base_token.code) + tokenSet.add(pair.quote_token.code) + }) + const arry = Array.from(tokenSet) + arry.sort() + return arry + } + }) +} + +async function nearTVL(){ + const tokens = await getTokens('near'); + return sumTokens({ tokens, owners: [GRID_CONTRACT_ID, DCA_CONTRACT_ID] }) +} + +function getGlobalBalanceUser(token) { + const [globalBalPda] = PublicKey.findProgramAddressSync([Buffer.from("global_balance_user"), state.toBuffer(), new PublicKey(token).toBuffer()], programId); + + // const globalBalTokenAccount = await Token.getAssociatedTokenAddress(ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, new PublicKey(token), new PublicKey(globalBalPda.toString()), true); + const [tokenAccount] = PublicKey.findProgramAddressSync([new PublicKey(globalBalPda.toString()), TOKEN_PROGRAM_ID, new PublicKey(token)].map(i => i.toBuffer()), ASSOCIATED_TOKEN_PROGRAM_ID) + return tokenAccount.toString(); +} + +async function solanaTvl() { + const tokens = await getTokens('solana'); + const tokenAccounts = tokens.map(getGlobalBalanceUser) + return sumTokens2({ tokenAccounts }) +} diff --git a/projects/demodyfi/index.js b/projects/demodyfi/index.js index 56664c44bd..4d2e07f3ae 100644 --- a/projects/demodyfi/index.js +++ b/projects/demodyfi/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { getUniTVL } = require('../helper/unknownTokens') const { staking } = require('../helper/staking') const { pool2 } = require('../helper/pool2') @@ -5,7 +6,7 @@ const { pool2 } = require('../helper/pool2') module.exports = { misrepresentedTokens: true, ethereum: { - staking: staking('0x024D59Ac0Bb03dEd28B9A16cd50B3d242B43a683', '0x5f6c5C2fB289dB2228d159C69621215e354218d7'), + staking: staking('0x024D59Ac0Bb03dEd28B9A16cd50B3d242B43a683', ADDRESSES.moonbeam.WGLMR), pool2: pool2('0x024D59Ac0Bb03dEd28B9A16cd50B3d242B43a683', '0xD5B1Cd8D245A93E0697707AEe82497388508b132'), }, bsc: { diff --git a/projects/deribit/index.js b/projects/deribit/index.js index eb71c2aab7..1a8d8eb517 100644 --- a/projects/deribit/index.js +++ b/projects/deribit/index.js @@ -1,24 +1,8 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { - bitcoin: { - // from https://insights.deribit.com/exchange-updates/deribit-wallet-holdings/ - owners: [ - "bc1qa3phj5uhnuauk6r62cku6r6fl9rawqx4n6d690", - "bc1qtq5zfllw9fs9w6stnfgalf9v59fgrcxxyawuvm", - "1MDq7zyLw6oKichbFiDDZ3aaK59byc6CT8", - "1932eKraQ3Ad9MeNBHb14WFQbNrLaKeEpT", - "13JJ1nxDeX5fMsDeyGHiLoK8rF2ayGq1cX", - "1MdrdcEzfiJdvs6eVSwUx6bWboPX8if5U3", - "35WHp4Hid61peyH4tuhNunwRj2gtNB41Lo", - "34ZHV8dd6uucEUABUydWpKi6F4qKQntEUf", - //added on the 26/06/2024 - "bc1qzwhw94uldd3c8736lsxrda6t6x56030f8zk8nr", - "bc1qrmuxak470z7zch5f3gz05dc6h4ngwqdq4wx80w", - "bc1qf6lm99tp5p27hsmyskve236nsv32lnfwt4h8wk", - "14HeA1YRUiJGb95HVpVTBuavMUBYGk6y7R", - ], - }, + bitcoin: { owners: bitcoinAddressBook.deribit }, ethereum:{ owners: [ "0x77021d475E36b3ab1921a0e3A8380f069d3263de", @@ -36,7 +20,8 @@ const config = { "0x1baE874af9f81B8F93315b27F080260Da4702D3a", "0x2563328d58AC7eE9e930E89C29Ce96046a291207", "0x866c9a77d8Ab71d2874703e80cb7aD809b301e8e", - "0xCf2027AAB22980820F0767d9f214CDBD2AA2428D" + "0xCf2027AAB22980820F0767d9f214CDBD2AA2428D", + "0xACd41f0dA1A84f5543c84a33864e025cE30C099D", ] }, solana: { @@ -65,4 +50,4 @@ const config = { } module.exports = cexExports(config) -module.exports.methodology = 'This wallets where collect from here https://insights.deribit.com/exchange-updates/deribit-wallet-holdings/' +module.exports.methodology = 'This wallets where collect from here https://insights.deribit.com/exchange-updates/proof-of-reserves-deribit/' diff --git a/projects/derivadex/index.js b/projects/derivadex/index.js index f41ed3fcde..e9a0b3f6db 100644 --- a/projects/derivadex/index.js +++ b/projects/derivadex/index.js @@ -58,6 +58,6 @@ async function tvl(timestamp, block) { ==================================================*/ module.exports = { - start: 1607126400, // 12/5/2020 00:00:00 utc + start: '2020-12-05', // 12/5/2020 00:00:00 utc ethereum: { tvl } }; diff --git a/projects/desyn-basisTrading/index.js b/projects/desyn-basisTrading/index.js new file mode 100644 index 0000000000..f8b91bca80 --- /dev/null +++ b/projects/desyn-basisTrading/index.js @@ -0,0 +1,13 @@ +const { getTvlFunction, chains } = require("../desyn-farm/helper"); + +module.exports = { + doublecounted: true, + methodology: 'Combines on-chain airdrops with stable returns from basis trading on Binance.', +} + +chains.forEach(chain => { + module.exports[chain] = { + // rest api type:: StrategyType3 + tvl: getTvlFunction('StrategyType3', true) + } +}) \ No newline at end of file diff --git a/projects/desyn-farm/helper.js b/projects/desyn-farm/helper.js new file mode 100644 index 0000000000..f6c67a4da3 --- /dev/null +++ b/projects/desyn-farm/helper.js @@ -0,0 +1,61 @@ +const { getConfig } = require('../helper/cache') + +const chains = ["ethereum", "arbitrum", "btr", "mode", "zklink", "core", "ailayer", "linea", "merlin", "scroll", "bsquared"]; + +const abi = { + getBalance: "function getBalance(address) view returns (uint256)" +} + +// The desyn asset arrangement needs to be requested via the rest api form +async function getInfoListPool(strategy_type, chain) { + const data = await getConfig('desyn/' + strategy_type, `https://api.desyn.io/etf/defillama/get_pool_list?strategy_type=${strategy_type}`) + return data.data.config[chain]?.safePools +} + +// This is aSTETH, +// before the design of the semi-closed soETH, +// the contract in order to limit the closure of the time, +// the user can still deposit, +// so he was given a maximum value of the balance, +// which will become negative after adding any number, blocking the user to put in +const leverageStaking = '0x1982b2F5814301d4e9a8b0201555376e62F82428' + + +function getTvlFunction(strategy_type, isDoubleCounted) { + return async (api) => { + const pools = await getInfoListPool(strategy_type, api.chain) + if (!pools?.length) return; + const tokens = await api.multiCall({ abi: 'address[]:getCurrentTokens', calls: pools }) + const calls = [] + const tokensAndOwners = [] + const allTokens = [] + let i = 0 + + for (const pool of pools) { + for (const token of tokens[i]) { + if (!isDoubleCounted) { + tokensAndOwners.push([token, pool]) + } else { + calls.push({ target: pool, params: token }) + allTokens.push(token) + } + } + i++ + } + + if (!isDoubleCounted) return api.sumTokens({ tokensAndOwners }) + + const allBals = await api.multiCall({ abi: abi.getBalance, calls }) + api.add(allTokens, allBals) + + // rest api type:: StrategyType2 + if (strategy_type === 'StrategyType2') + api.removeTokenBalance(leverageStaking) + } +} + + +module.exports = { + getTvlFunction, + chains +} \ No newline at end of file diff --git a/projects/desyn-farm/index.js b/projects/desyn-farm/index.js index 9e773382f8..d296a2322c 100644 --- a/projects/desyn-farm/index.js +++ b/projects/desyn-farm/index.js @@ -1,28 +1,17 @@ -const { getLogs } = require('../helper/cache/getLogs') +const { getTvlFunction, chains } = require("./helper"); module.exports = { - doublecounted: true, - methodology: 'On-chain restaking', + hallmarks: [ + [1719734400, "Launched on Merlin Chain"], + [1718092800, "DeSyn KelpDAO Restaking Fund Launched"], + [1713340800, "Restaking Fund Series Launched"] + ], + methodology: 'Focused on airdrops from DeSyn and new chains.', } -const config = { - merlin: { factory: '0x790b4ee7998A93702f29e56f8b615eF35BE5af43', fromBlock: 11260440}, -} - -Object.keys(config).forEach(chain => { - const {factory, fromBlock, } = config[chain] +chains.forEach(chain => { module.exports[chain] = { - tvl: async (api) => { - const logs = await getLogs({ - api, - target: factory, - eventAbi: 'event LOG_NEW_POOL (address indexed caller, address indexed pool)', - onlyArgs: true, - fromBlock, - }) - const pools = logs.map(i=>i.pool) - const tokens = await api.multiCall({ abi: 'address[]:getCurrentTokens', calls: pools}) - return api.sumTokens({ ownerTokens: tokens.map((tokens, i) => [tokens, pools[i]])}) - } + // rest api type:: StrategyType1 + tvl: getTvlFunction('StrategyType1', false) } }) \ No newline at end of file diff --git a/projects/desyn-farm1/index.js b/projects/desyn-farm1/index.js deleted file mode 100644 index 3ef14151f4..0000000000 --- a/projects/desyn-farm1/index.js +++ /dev/null @@ -1,29 +0,0 @@ -const { getLogs } = require('../helper/cache/getLogs') - -module.exports = { - methodology: 'On-chain restaking', -} - -const config = { - btr: { factory: '0x09eFC8C8F08B810F1F76B0c926D6dCeb37409665', fromBlock: 2393247}, - mode: { factory: '0x09Dfee598d5217da799bEAd56206beC0fDB0D17B', fromBlock: 9912410}, - zklink: { factory: '0xCCA610644f19d7d8f96b90a896B160f54cBE3204', fromBlock: 4734230} -} - -Object.keys(config).forEach(chain => { - const {factory, fromBlock, } = config[chain] - module.exports[chain] = { - tvl: async (api) => { - const logs = await getLogs({ - api, - target: factory, - eventAbi: 'event LOG_NEW_POOL (address indexed caller, address indexed pool)', - onlyArgs: true, - fromBlock, - }) - const pools = logs.map(i=>i.pool) - const tokens = await api.multiCall({ abi: 'address[]:getCurrentTokens', calls: pools}) - return api.sumTokens({ ownerTokens: tokens.map((tokens, i) => [tokens, pools[i]])}) - } - } -}) \ No newline at end of file diff --git a/projects/desyn-yieldAggregator/index.js b/projects/desyn-yieldAggregator/index.js new file mode 100644 index 0000000000..660a093691 --- /dev/null +++ b/projects/desyn-yieldAggregator/index.js @@ -0,0 +1,13 @@ +const { getTvlFunction, chains } = require("../desyn-farm/helper"); + +module.exports = { + doublecounted: true, + methodology: 'Engages with DeFi protocols like Lending, DEX, and Restaking, offering both airdrops and structured yield options.', +} + +chains.forEach(chain => { + module.exports[chain] = { + // rest api type:: StrategyType2 + tvl: getTvlFunction('StrategyType2', true) + } +}) \ No newline at end of file diff --git a/projects/desyn/index.js b/projects/desyn/index.js deleted file mode 100644 index 75f12cba84..0000000000 --- a/projects/desyn/index.js +++ /dev/null @@ -1,38 +0,0 @@ -const { getLogs } = require('../helper/cache/getLogs') - -module.exports = { - doublecounted: true, - hallmarks: [ - [1719734400, "Launched on Merlin Chain"], - [1718092800, "DeSyn KelpDAO Restaking Fund Launched"], - [1713340800, "Restaking Fund Series Launched"], - ], - methodology: 'Liquid restaking strategy', -} - -const config = { - ethereum: { factory: '0x01a38B39BEddCD6bFEedBA14057E053cBF529cD2', fromBlock: 17335174}, - arbitrum: { factory: '0xdE6b117384452b21F5a643E56952593B88110e78', fromBlock: 175985457}, - //merlin chain is tracked under a new listing for farm - // merlin: { factory: '0x790b4ee7998A93702f29e56f8b615eF35BE5af43', fromBlock: 11260440}, - //bitlayer chain is tracked under a new listing for farm - // btr: { factory: '0x09eFC8C8F08B810F1F76B0c926D6dCeb37409665', fromBlock: 2393247}, -} - -Object.keys(config).forEach(chain => { - const {factory, fromBlock, } = config[chain] - module.exports[chain] = { - tvl: async (api) => { - const logs = await getLogs({ - api, - target: factory, - eventAbi: 'event LOG_NEW_POOL (address indexed caller, address indexed pool)', - onlyArgs: true, - fromBlock, - }) - const pools = logs.map(i=>i.pool) - const tokens = await api.multiCall({ abi: 'address[]:getCurrentTokens', calls: pools}) - return api.sumTokens({ ownerTokens: tokens.map((tokens, i) => [tokens, pools[i]])}) - } - } -}) \ No newline at end of file diff --git a/projects/devve/index.js b/projects/devve/index.js new file mode 100644 index 0000000000..5b15135dd9 --- /dev/null +++ b/projects/devve/index.js @@ -0,0 +1,12 @@ +const { staking } = require('../helper/staking'); + +module.exports = { + methodology: "DEVVE can be staked in the protocol", + ethereum: { + tvl: () => ({}), + staking: staking( + "0xa0dab5d6907a9CFFD023e0160210eAB464322b70", + "0x8248270620Aa532E4d64316017bE5E873E37cc09" + ), + }, +}; diff --git a/projects/dexfinance-vault/index.js b/projects/dexfinance-vault/index.js index 6132575bf4..5eaf428385 100644 --- a/projects/dexfinance-vault/index.js +++ b/projects/dexfinance-vault/index.js @@ -33,53 +33,57 @@ const CONFIG = { }; const getVaults = async (api, factory) => { - const vaults = await api.fetchList({ lengthAbi: abi.factory.vaultsLength, itemAbi: abi.factory.vaults, target: factory, }); - const farmsAll = await api.fetchList({ lengthAbi: abi.vault.farmsLength, itemAbi: abi.vault.farms, targets: vaults, groupedByInput: true }) - const items = [] - vaults.map((vault, i) => items.push(farmsAll[i].map((farm) => ({ vault, farm })))) - return items.flat() + const vaults = await api.fetchList({ lengthAbi: abi.factory.vaultsLength, itemAbi: abi.factory.vaults, target: factory, permitFailure:true }); + const farmsAll = await api.fetchList({ lengthAbi: abi.vault.farmsLength, itemAbi: abi.vault.farms, targets: vaults, groupedByInput: true, permitFailure:true }) + + return vaults.map((vault, i) => { + const farms = farmsAll[i] || []; + return farms.map(farm => ({ vault, farm })); + }).flat(); }; const getVaultsConnectors = async (api, factory, vaultFarms) => { - const connectorsCalls = vaultFarms.map(({ farm, vault }) => ({ params: farm.beacon, target: vault, })); + const connectorsCalls = vaultFarms.map(({ farm, vault }) => ({ params: farm.beacon, target: vault })); const calculationConnectorCalls = vaultFarms.map(({ farm }) => farm.beacon); - const connectors = await api.multiCall({ abi: abi.vault.farmConnector, calls: connectorsCalls }) - const calculationConnectors = await api.multiCall({ abi: abi.factory.farmCalculationConnector, calls: calculationConnectorCalls, target: factory }) - - vaultFarms.forEach((item, i) => { - delete item.farm.data - item.connector = connectors[i] - item.calculationConnector = calculationConnectors[i] - }) -} + const connectors = await api.multiCall({ abi: abi.vault.farmConnector, calls: connectorsCalls, permitFailure: true }); + const calculationConnectors = await api.multiCall({ abi: abi.factory.farmCalculationConnector, calls: calculationConnectorCalls, target: factory, permitFailure: true }); + + return vaultFarms + .map((item, i) => { + const connector = connectors[i] + const calculationConnector = calculationConnectors[i] + if (!connector || !calculationConnector) return null; + delete item.farm.data; + return { ...item, connector, calculationConnector }; + }).filter(item => item !== null); +}; const getVaultsDatas = async (api, vaultFarms) => { - const calls = vaultFarms.map(({ connector }) => connector) - const liquidityCalls = vaultFarms.map(({ calculationConnector, connector }) => ({ target: calculationConnector, params: [connector] })) - - const [types, stakingTokens, liquidities] = - await Promise.all([ - api.multiCall({ calls, abi: abi.farm.type }), - api.multiCall({ calls, abi: abi.farm.stakingToken }), - api.multiCall({ calls: liquidityCalls, abi: abi.vault.liquidity }), - ]); - - vaultFarms.forEach((item, i) => { - item.type = types[i] - item.stakingToken = stakingTokens[i] - item.liquidity = liquidities[i] + const v2Farms = []; + const v3Farms = []; + const calls = vaultFarms.map(({ connector }) => connector); + const liquidityCalls = vaultFarms.map(({ calculationConnector, connector }) => ({ target: calculationConnector, params: [connector] })); + const stakingDatasCalls = vaultFarms.map(({ calculationConnector }) => ({ target: calculationConnector })) + + const [stakingTokens, liquidities, datas] = await Promise.all([ + api.multiCall({ calls, abi: abi.farm.stakingToken, permitFailure: true }), + api.multiCall({ calls: liquidityCalls, abi: abi.vault.liquidity }), + api.multiCall({ calls: stakingDatasCalls, abi: abi.farm.stakingTokenData, permitFailure: true }) + ]); + + vaultFarms.forEach(( item, i ) => { + const stakingToken = stakingTokens[i] + const liquidity = liquidities[i] + const data = datas[i] + if (!stakingToken || !liquidity ) return + if (!data) { + v2Farms.push({ ...item, stakingToken, liquidity }) + } else { + v3Farms.push({ ...item, stakingToken, liquidity, data }) + } }) -}; -const groupBy = (array, keyFn) => { - return array.reduce((acc, item) => { - const key = keyFn(item); - if (!acc[key]) { - acc[key] = []; - } - acc[key].push(item); - return acc; - }, {}); + return { v2Farms, v3Farms } }; const lpv2Balances = async (api, farms) => { @@ -100,34 +104,25 @@ async function addERC721Data(api, vaultFarms) { nftPositionMapping[nft].push(positionIds[i]) }) for (const [nftAddress, positionIds] of Object.entries(nftPositionMapping)) - await sumTokens2({ api, uniV3ExtraConfig: { nftAddress, positionIds, } }) + await sumTokens2({ api, uniV3ExtraConfig: { nftAddress, positionIds } }) } const tvl = async (api) => { const { factory, USDEX_PLUS, gDEX } = CONFIG[api.chain]; const vaultFarms = await getVaults(api, factory); - await getVaultsConnectors(api, factory, vaultFarms); - await getVaultsDatas(api, vaultFarms); - const sortedFarms = groupBy(vaultFarms, ({ type }) => `${type}`); + const vaultFarmsWithConnectors = await getVaultsConnectors(api, factory, vaultFarms); + const { v2Farms, v3Farms } = await getVaultsDatas(api, vaultFarmsWithConnectors); - const lpv2Farms = Object.keys(sortedFarms) - .filter((key) => !key.includes("ERC721")) - .flatMap((key) => sortedFarms[key]); - - const lpv3Farms = Object.keys(sortedFarms) - .filter((key) => key.includes("ERC721")) - .flatMap((key) => sortedFarms[key]); - - await Promise.all([ - lpv2Balances(api, lpv2Farms), - addERC721Data(api, lpv3Farms) + await Promise.all([ + lpv2Balances(api, v2Farms), + addERC721Data(api, v3Farms) ]) - + await sumTokens2({ api, resolveLP: true }); if (USDEX_PLUS) api.removeTokenBalance(USDEX_PLUS); if (gDEX) api.removeTokenBalance(gDEX); }; Object.keys(CONFIG).forEach((chain) => { - module.exports[chain] = { tvl, }; + module.exports[chain] = { tvl }; }) \ No newline at end of file diff --git a/projects/dexilla/index.js b/projects/dexilla/index.js index 40d509ca58..4261f539b1 100644 --- a/projects/dexilla/index.js +++ b/projects/dexilla/index.js @@ -51,7 +51,7 @@ const config = { module.exports = { methodology: 'TVL counts the ERC20 tokens on the exchange contracts.', - start: 1685610580, // June 1, 2023 @ 9:09:40 (UTC +0) + start: '2023-06-01', // June 1, 2023 @ 9:09:40 (UTC +0) } Object.keys(config).forEach(chain => { diff --git a/projects/dexodus/index.js b/projects/dexodus/index.js new file mode 100644 index 0000000000..890dabbf6e --- /dev/null +++ b/projects/dexodus/index.js @@ -0,0 +1,9 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs'); + +module.exports = { + methodology: 'Counts the USDC and WETH tokens in the Dexodus liquidity pool on Base.', + base: { + tvl: sumTokensExport({ owner: '0x1A84d7E27e7f0e93Da74b93095e342b6e8dBd50A', tokens: [ADDRESSES.base.USDbC, ADDRESSES.base.WETH] }), + }, +}; diff --git a/projects/dexter/index.js b/projects/dexter/index.js index 35108c2f45..8d1be049b6 100644 --- a/projects/dexter/index.js +++ b/projects/dexter/index.js @@ -29,7 +29,7 @@ module.exports = { timetravel: false, // misrepresentedTokens: true, methodology: `Counts the liquidity on all AMM pools`, - start: 1679788800, // "2023-03-26" UTC + start: '2023-03-26', // "2023-03-26" UTC persistence: { tvl } diff --git a/projects/dextf/index.js b/projects/dextf/index.js index aeeee07852..b168b0d1bd 100644 --- a/projects/dextf/index.js +++ b/projects/dextf/index.js @@ -3,7 +3,7 @@ const tvlV2 = require('./v2'); const sdk = require('@defillama/sdk'); module.exports = { - start: 1595853825, // 27/07/2020 @ 12:43:45am (UTC) + start: '2020-07-27', // 27/07/2020 @ 12:43:45am (UTC) ethereum: { tvl: sdk.util.sumChainTvls([TVLV1, tvlV2]) }, avax: { tvl: tvlV2 }, era: { tvl: tvlV2 } diff --git a/projects/dforce/index.js b/projects/dforce/index.js index 7041ab53d4..801909c400 100644 --- a/projects/dforce/index.js +++ b/projects/dforce/index.js @@ -35,8 +35,10 @@ let allControllers = { ], arbitrum: [ "0x50210A88217d1dD9e7FBc3E4a927Cc55829a38eB", // dForce vault pool: USX/2CRV + "0xcfe6d1b2BE777f20AD6F98f1c12C6436652F2031", // dForce vault pool: iwstETH + "0xB5b3da79789dE012Fd75108138b2315E5645715A", // dForce vault pool: saETH ], - optimism: [], + optimism: ["0xdF0e115aA822443df9200Cc5d0260FA8E1aF06F5"], // dForce vault pool: iwstETH polygon: [], avax: ["0x078ad8d6faeD9DAeE55f5d446C80E0C81230DE6b"], kava: ["0xFBf64A8cAEA1D641affa185f850dbBF90d5c84dC"], @@ -194,7 +196,7 @@ async function staking(timestamp, ethBlock, chainBlocks) { module.exports = { ...generalizedChainExports(chainTvl, ['ethereum', "bsc", "arbitrum", "optimism", "polygon", "avax", "kava", "conflux"]), - start: 1564165044, // Jul-27-2019 02:17:24 AM +UTC + start: '2019-07-26', // Jul-27-2019 02:17:24 AM +UTC hallmarks: [ [Math.floor(new Date('2023-12-19')/1e3), 'Unitus spin-off'], ], diff --git a/projects/diamond-coin/index.js b/projects/diamond-coin/index.js index 0d4c9453ec..b39f71c4b6 100644 --- a/projects/diamond-coin/index.js +++ b/projects/diamond-coin/index.js @@ -1,5 +1,5 @@ const sdk = require("@defillama/sdk"); -const {pool2Exports} = require("../helper/pool2"); +const {pool2} = require("../helper/pool2"); const token = "0xDDa0F0E1081b8d64aB1D64621eb2679F93086705"; const emissionRewardPool = "0xDDa0F0E1081b8d64aB1D64621eb2679F93086705"; @@ -12,6 +12,6 @@ const DiamondLPs = [ module.exports = { fantom: { tvl: async () => ({}), - pool2: pool2Exports(emissionRewardPool, DiamondLPs, "fantom", addr=>`fantom:${addr}`) + pool2: pool2(emissionRewardPool, DiamondLPs, "fantom", addr=>`fantom:${addr}`) } } diff --git a/projects/diamondswap/index.js b/projects/diamondswap/index.js new file mode 100644 index 0000000000..cb6a9fcdaf --- /dev/null +++ b/projects/diamondswap/index.js @@ -0,0 +1,43 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +const { getLogs, getAddress } = require('../helper/cache/getLogs') +const { sumTokens2 } = require('../helper/unwrapLPs') + +module.exports = uniTvlExports({ + odyssey: '0x7d57C45dC107497C5c5c0F544a84691D2b06BC83', + base: '0xdc93aca9bf72ceb35d1f2cd305bd8335b5b88757', + avax: '0x7ab5ac142799b0a3b6f95c27a1f2149ebcf5287d', +}) + + +async function tvl(api) { + const { factories } = config[api.chain] + const ownerTokens = [] + + for (const { factory, fromBlock } of factories) { + const logs = await getLogs({ + api, + target: factory, + topics: ['0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9'], + fromBlock, + }) + const pools = logs.map(i => getAddress(i.data.slice(0, 64 + 2))) + const token0s = await api.multiCall({ abi: 'address:token0', calls: pools }) + const token1s = await api.multiCall({ abi: 'address:token1', calls: pools }) + pools.map((pool, i) => ownerTokens.push([[token0s[i], token1s[i]], pool])) + } + return sumTokens2({ api, ownerTokens }) +} + +const config = { + ethereum: { factories: [{ factory: '0xE1046fcB1057ef82B68f3A6B8eBb0e411Cf334E0', fromBlock: 18024947, },], }, + bsc: { + factories: [{ + factory: '0x81a1417cbec636e631fa62b81f970a5ec23b39ca', fromBlock: + 32062831, + },], + }, +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { tvl } +}) \ No newline at end of file diff --git a/projects/dinari/index.js b/projects/dinari/index.js index 829e3dbfcf..75778cabe4 100644 --- a/projects/dinari/index.js +++ b/projects/dinari/index.js @@ -13,6 +13,10 @@ const config = { kinto: { factory: "0xE4Daa69e99F48AD0C4D4843deF4447253248A906", usdplus: "0x6F086dB0f6A621a915bC90295175065c9e5d9b8c" + }, + base: { + factory: "0xBCE6410A175a1C9B1a25D38d7e1A900F8393BC4D", + usdplus: "0x98C6616F1CC0D3E938A16200830DD55663dd7DD3" } } diff --git a/projects/dinosaur-finance/index.js b/projects/dinosaur-finance/index.js index d468024e94..f0a56d1812 100644 --- a/projects/dinosaur-finance/index.js +++ b/projects/dinosaur-finance/index.js @@ -24,6 +24,7 @@ module.exports = { hallmarks: [ [1675814400, "Rug Pull"] ], + deadFrom: '2023-02-08', arbitrum: { tvl, } diff --git a/projects/dirac-finance/index.js b/projects/dirac-finance/index.js index b1131cc4e1..3b32f4df3d 100644 --- a/projects/dirac-finance/index.js +++ b/projects/dirac-finance/index.js @@ -35,7 +35,6 @@ module.exports = { timetravel: true, misrepresentedTokens: false, methodology: 'counts the number of MINT tokens in the Club Bonding contract.', - start: 11251616, polygon_zkevm: { tvl, } diff --git a/projects/direct-exchange/index.js b/projects/direct-exchange/index.js index f0ee996735..e96546d2ab 100644 --- a/projects/direct-exchange/index.js +++ b/projects/direct-exchange/index.js @@ -2,6 +2,6 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, kava: { - tvl: getUniTVL({ factory: '0xcE08c3d20Ff00a9Cf0D28922768bD606592B5D4C', fetchBalances: true, useDefaultCoreAssets: true, }) + tvl: getUniTVL({ factory: '0xcE08c3d20Ff00a9Cf0D28922768bD606592B5D4C', useDefaultCoreAssets: true, }) }, } diff --git a/projects/djed-alliance/index.js b/projects/djed-alliance/index.js index f1dad7c7d5..6a752dc7c6 100644 --- a/projects/djed-alliance/index.js +++ b/projects/djed-alliance/index.js @@ -9,6 +9,6 @@ module.exports = { methodology: 'The TVL of Djed is the reserve belonging to the deployment. The TVL within a given blockchain is the sum of the TVLs of all known Djed deployments within that blockchain.', cardano: { - tvl: sumTokensExport({ owner: 'addr1zx82ru5f7p8ewhhdvahueg2s4gxs3gxl66fkygdekkjs74sm5kjdmrpmng059yellupyvwgay2v0lz6663swmds7hp0q4vpw0l', tokens: ['lovelace']}), + tvl: sumTokensExport({ owner: 'addr1z8mcpc26j64fmhhd6sv5qj5mk9xqnfxgm6k8zmk7h2rlu4qm5kjdmrpmng059yellupyvwgay2v0lz6663swmds7hp0qhxg9gt', tokens: ['lovelace']}), }, }; diff --git a/projects/dodo/index.js b/projects/dodo/index.js index f2fd2fac38..095da410a3 100644 --- a/projects/dodo/index.js +++ b/projects/dodo/index.js @@ -2,13 +2,13 @@ const { getLogs } = require('../helper/cache/getLogs') const ADDRESSES = require('../helper/coreAssets.json') const config = { - ethereum: { dvmFactory: '0x72d220cE168C4f361dD4deE5D826a01AD8598f6C', dodoBirthFactory: '0x3a97247df274a17c59a3bd12735ea3fcdfb49950', fromBlock: 10613640, dspFactory: '0x6fddb76c93299d985f4d3fc7ac468f9a168577a4', dppFactory: ['0x5336ede8f971339f6c0e304c66ba16f1296a2fbe', '0xb5dc5e183c2acf02ab879a8569ab4edaf147d537', '0x6b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef'] }, - arbitrum: { dvmFactory: '0xDa4c4411c55B0785e501332354A036c04833B72b', fromBlock: 226578, dspFactory: '0xC8fE2440744dcd733246a4dB14093664DEFD5A53', dodoBirthFactory: '0xbcc3401e16c25eaf4d3fed632ce3288503883b1f', dppFactory: ['0xDdB13e6dd168E1a68DC2285Cb212078ae10394A9', '0xa6cf3d163358af376ec5e8b7cc5e102a05fde63d'] }, + ethereum: { dvmFactory: '0x72d220cE168C4f361dD4deE5D826a01AD8598f6C', dodoBirthFactory: '0x3a97247df274a17c59a3bd12735ea3fcdfb49950', fromBlock: 10613640, dspFactory: '0x6fddb76c93299d985f4d3fc7ac468f9a168577a4', dppFactory: ['0x5336ede8f971339f6c0e304c66ba16f1296a2fbe', '0xb5dc5e183c2acf02ab879a8569ab4edaf147d537', '0x6b4fa0bc61eddc928e0df9c7f01e407bfcd3e5ef'], gspFactory: '0x710409D2121B7C8EA4aCAdd6803FDE2D85DF6473' }, + arbitrum: { dvmFactory: '0xDa4c4411c55B0785e501332354A036c04833B72b', fromBlock: 226578, dspFactory: '0xC8fE2440744dcd733246a4dB14093664DEFD5A53', dodoBirthFactory: '0xbcc3401e16c25eaf4d3fed632ce3288503883b1f', dppFactory: ['0xDdB13e6dd168E1a68DC2285Cb212078ae10394A9', '0xa6cf3d163358af376ec5e8b7cc5e102a05fde63d'], gspFactory: '0x46E55A974c5995675b025f7F607C3278B36f0c29' }, bsc: { dvmFactory: ['0x790B4A80Fb1094589A3c0eFC8740aA9b0C1733fB', '0xf50bdc9e90b7a1c138cb7935071b85c417c4cb8e'], fromBlock: 726278, dspFactory: '0x0fb9815938Ad069Bf90E14FE6C596c514BEDe767', dppFactory: ['0xd9CAc3D964327e47399aebd8e1e6dCC4c251DaAE', '0x7737fd30535c69545deeea54ab8dd590ccaebd3c', '0x9b64c81ba54ea51e1f6b7fefb3cff8aa6f1e2a09', '0xafe0a75dffb395eaabd0a7e1bbbd0b11f8609eef'], dodoBirthFactory: '0xca459456a45e300aa7ef447dbb60f87cccb42828', blacklistedTokens: [ '0xcc7fc8666f6e62cb44aa781de841ee6be3bbe54c', '0xdb1e780db819333ea79c9744cc66c89fbf326ce8', - ] + ], gspFactory: '0x78d43a889F42a344Fe98C3fb9455791Dc8178d55' }, polygon: { dppFactory: ['0xd24153244066F0afA9415563bFC7Ba248bfB7a51', '0x95E887aDF9EAa22cC1c6E3Cb7f07adC95b4b25a8'], dvmFactory: '0x79887f65f83bdf15Bcc8736b5e5BcDB48fb8fE13', fromBlock: @@ -24,12 +24,13 @@ const config = { linea: { dvmFactory: '0xc0F9553Df63De5a97Fe64422c8578D0657C360f7', fromBlock: 91468, dspFactory: '0x2933c0374089D7D98BA0C71c5E02E1A0e09deBEE', dppFactory: '0x97bBF5BB1dcfC93A8c67e97E50Bea19DB3416A83' }, scroll: { dvmFactory: '0x5a0C840a7089aa222c4458b3BE0947fe5a5006DE', fromBlock: 83070, dspFactory: '0x7E9c460d0A10bd0605B15F0d0388e307d34a62E6', dppFactory: '0x31AC053c31a77055b2ae2d3899091C0A9c19cE3a' }, manta: { dvmFactory: '0x97bBF5BB1dcfC93A8c67e97E50Bea19DB3416A83', fromBlock: 384137, dspFactory: '0x29C7718e8B606cEF1c44Fe6e43e07aF9D0875DE1', dppFactory: '0xa71415675F68f29259ddD63215E5518d2735bf0a' }, - mantle: { dvmFactory: '0x29C7718e8B606cEF1c44Fe6e43e07aF9D0875DE1', fromBlock: 21054048, dspFactory: '0x7dB214f2D46d94846936a0f8Bd9044c5C5Bd2b93', dppFactory: '0x46AF6b152F2cb02a3cFcc74014C2617BC4F6cD5C' }, + mantle: { dvmFactory: '0x29C7718e8B606cEF1c44Fe6e43e07aF9D0875DE1', fromBlock: 21054048, dspFactory: '0x7dB214f2D46d94846936a0f8Bd9044c5C5Bd2b93', dppFactory: '0x46AF6b152F2cb02a3cFcc74014C2617BC4F6cD5C', gspFactory: '0xE6cecb7460c9E52aA483cb1f0E87d78D7085686F' }, + zircuit: { dvmFactory: '0xA909314363840f7c28b8EC314028e21722dd8Cb6', fromBlock: 1455081, dspFactory: '0xA312D73C1b537168f1C8588bDcaB9278df98Cd32', dppFactory: '0xb770C37F3A9eC6f25b791D9c791aDE09B0fb1AB8' }, // okexchain: { dvmFactory: '0x9aE501385Bc7996A2A4a1FBb00c8d3820611BCB5', fromBlock: 4701083, dspFactory: '0x44D5dF24d5Ef52A791D6436Fa45A8D426f6de34e' }, } Object.keys(config).forEach(chain => { - const { dvmFactory, fromBlock, dspFactory, dppFactory, dodoBirthFactory, blacklistedTokens, } = config[chain] + const { dvmFactory, fromBlock, dspFactory, gspFactory, dppFactory, dodoBirthFactory, blacklistedTokens, } = config[chain] module.exports[chain] = { tvl: async (api) => { const ownerTokens = [] @@ -43,6 +44,7 @@ Object.keys(config).forEach(chain => { } builder(dvmFactory, 'event NewDVM (address baseToken, address quoteToken, address creator, address pool)'); builder(dspFactory, 'event NewDSP(address baseToken, address quoteToken, address creator, address pool)'); + builder(gspFactory, 'event NewGSP(address baseToken, address quoteToken, address creator, address pool)'); builder(dppFactory, 'event NewDPP (address baseToken, address quoteToken, address creator, address pool)'); builder(dodoBirthFactory, 'event DODOBirth (address pool, address baseToken, address quoteToken)'); diff --git a/projects/dogedollar/index.js b/projects/dogedollar/index.js index 2cebc693c7..8b44cd12b1 100644 --- a/projects/dogedollar/index.js +++ b/projects/dogedollar/index.js @@ -4,7 +4,6 @@ const DJED_ADDR = '0xA99ef299CdA10AC4Ec974370778fbd27Cfb5CF61' module.exports = { methodology: 'finds the DOGE balance of the DJED instance backing the stablecoin, aswell as the fallback stablecoin balance', - start: 14576300, dogechain: { tvl: sumTokensExport({ tokensAndOwners: [ diff --git a/projects/doglands-swap/index.js b/projects/doglands-swap/index.js index 3882cc3fe9..95b6d77e68 100644 --- a/projects/doglands-swap/index.js +++ b/projects/doglands-swap/index.js @@ -1,3 +1,4 @@ +const { deadFrom } = require("../mosquitos-finance"); module.exports = { methodology: "Count TVL as liquidity on the dex", @@ -8,4 +9,5 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2023-01-20')/1e3), 'Project rugged'], ], + deadFrom: Math.floor(new Date('2023-01-20')/1e3) } \ No newline at end of file diff --git a/projects/dogswap/index.js b/projects/dogswap/index.js index b7fcd411e6..f286a9b83d 100644 --- a/projects/dogswap/index.js +++ b/projects/dogswap/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('shibarium', '0xA780FcBFF7c5232FDbEF4fc67313bEcFfdf64172', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('shibarium', '0xA780FcBFF7c5232FDbEF4fc67313bEcFfdf64172') \ No newline at end of file diff --git a/projects/dojoswap-ancient8/index.js b/projects/dojoswap-ancient8/index.js new file mode 100644 index 0000000000..f2320073e4 --- /dev/null +++ b/projects/dojoswap-ancient8/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'ancient8': '0x7d6eb409e2540d27Ea6Dc976E1a549a3dBcBfFBC' +}) \ No newline at end of file diff --git a/projects/dojoswap/index.js b/projects/dojoswap/index.js index 0b3632acca..815afadc13 100644 --- a/projects/dojoswap/index.js +++ b/projects/dojoswap/index.js @@ -1,4 +1,3 @@ -const BigNumber = require("bignumber.js"); const { getFactoryTvl } = require("../terraswap/factoryTvl"); const factory = { diff --git a/projects/dolomite/index.js b/projects/dolomite/index.js index 773ad3ad5e..a41e80e3d8 100644 --- a/projects/dolomite/index.js +++ b/projects/dolomite/index.js @@ -34,7 +34,7 @@ async function borrowed(api) { } module.exports = { - start: 1664856000, // 10/4/2022 @ 00:00am (UTC) + start: '2022-10-04', // 10/4/2022 @ 00:00am (UTC) }; const config = { diff --git a/projects/donaswap-v2/index.js b/projects/donaswap-v2/index.js index 4861efb4b7..ddd20b512c 100644 --- a/projects/donaswap-v2/index.js +++ b/projects/donaswap-v2/index.js @@ -1,7 +1,7 @@ const { getUniTVL } = require("../helper/unknownTokens.js"); const V2_FACTORY = "0x8e5dff1c121F661971d02950698f8c5EFc3DfA78"; -const tvl = getUniTVL({ factory: V2_FACTORY, useDefaultCoreAssets: true, fetchBalances: true }); +const tvl = getUniTVL({ factory: V2_FACTORY, useDefaultCoreAssets: true }); const chains = ['arbitrum', 'astar', 'aurora', 'avax', 'base', 'bsc', 'celo', 'cmp', 'conflux', 'core', 'dogechain', 'ethereum', 'fantom', 'flare', 'fuse', 'fusion', 'heco', 'kcc', 'kardia', 'kava', 'linea', 'metis', 'moonbeam', 'moonriver', 'optimism', 'palm', 'polygon', 'polygon_zkevm', 'thundercore'] diff --git a/projects/donkeswap/index.js b/projects/donkeswap/index.js new file mode 100644 index 0000000000..280e58c343 --- /dev/null +++ b/projects/donkeswap/index.js @@ -0,0 +1,10 @@ +const { getUniTVL } = require("../helper/unknownTokens"); + +// node test.js projects/donkswap/index.js +module.exports = { + misrepresentedTokens: true, + methodology: "Factory address (0x4B4746216214f9e972c5D35D3Fe88e6Ec4C28A6B) is used to find the LP pairs. TVL is equal to the liquidity on the AMM.", + sei: { + tvl: getUniTVL({ factory: "0x4B4746216214f9e972c5D35D3Fe88e6Ec4C28A6B", useDefaultCoreAssets: true }) + } +}; diff --git a/projects/dopex-clamm/index.js b/projects/dopex-clamm/index.js index 2c0ee7ac86..97f4c2fe7b 100644 --- a/projects/dopex-clamm/index.js +++ b/projects/dopex-clamm/index.js @@ -1,7 +1,19 @@ -const { gql, request } = require('graphql-request'); +const { gql, request } = require("graphql-request"); + +const SUBGRAPH_ENDPOINTS = { + arbitrum: + "https://api.0xgraph.xyz/api/public/e2146f32-5728-4755-b1d1-84d17708c119/subgraphs/clamm-arbitrum/prod/gn", + sonic: + "https://api.0xgraph.xyz/api/public/e2146f32-5728-4755-b1d1-84d17708c119/subgraphs/clamm-sonic/prod/gn", + base: "https://api.0xgraph.xyz/api/public/e2146f32-5728-4755-b1d1-84d17708c119/subgraphs/clamm-base/prod/gn", + blast: + "https://api.0xgraph.xyz/api/public/e2146f32-5728-4755-b1d1-84d17708c119/subgraphs/clamm-blast/prod/gn", + mantle: + "https://api.0xgraph.xyz/api/public/e2146f32-5728-4755-b1d1-84d17708c119/subgraphs/clamm-mantle/prod/gn", +}; -const endpoint = 'https://api.0xgraph.xyz/subgraphs/name/dopex-v2-clamm-public'; -const abi = "function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)" +const abi = + "function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)"; const query = gql` query strikes($limit: Int!, $skip: Int!) { @@ -13,8 +25,12 @@ const query = gql` orderDirection: desc ) { pool - token0 {id} - token1 {id} + token0 { + id + } + token1 { + id + } tickLower tickUpper totalLiquidity @@ -22,68 +38,91 @@ const query = gql` } `; -async function fetchStrikes(limit, skip, allData = []) { +async function fetchStrikes(endpoint, limit, skip, allData = []) { const variables = { limit, skip }; const { strikes } = await request(endpoint, query, variables); allData.push(...strikes); if (strikes.length === limit) { - return fetchStrikes(limit, skip + limit, allData); + return fetchStrikes(endpoint, limit, skip + limit, allData); } return allData; } function addV3PositionBalances(strike, sqrtPricesMap) { - const tickToPrice = (tick) => 1.0001 ** tick - const token0 = strike.token0.id - const token1 = strike.token1.id - const liquidity = strike.totalLiquidity - const bottomTick = +strike.tickLower - const topTick = +strike.tickUpper - const tick = +sqrtPricesMap[strike.pool.toLowerCase()].tick - const sa = tickToPrice(bottomTick / 2) - const sb = tickToPrice(topTick / 2) - - let amount0 = 0 - let amount1 = 0 + const tickToPrice = (tick) => 1.0001 ** tick; + const token0 = strike.token0.id; + const token1 = strike.token1.id; + const liquidity = strike.totalLiquidity; + const bottomTick = +strike.tickLower; + const topTick = +strike.tickUpper; + const tick = +sqrtPricesMap[strike.pool.toLowerCase()].tick; + const sa = tickToPrice(bottomTick / 2); + const sb = tickToPrice(topTick / 2); + + let amount0 = 0; + let amount1 = 0; if (tick < bottomTick) { - amount0 = liquidity * (sb - sa) / (sa * sb) + amount0 = (liquidity * (sb - sa)) / (sa * sb); } else if (tick < topTick) { - const price = tickToPrice(tick) - const sp = price ** 0.5 + const price = tickToPrice(tick); + const sp = price ** 0.5; - amount0 = liquidity * (sb - sp) / (sp * sb) - amount1 = liquidity * (sp - sa) + amount0 = (liquidity * (sb - sp)) / (sp * sb); + amount1 = liquidity * (sp - sa); } else { - amount1 = liquidity * (sb - sa) + amount1 = liquidity * (sb - sa); } - return { token0, amount0, token1, amount1 } + return { token0, amount0, token1, amount1 }; } -async function tvl(api) { - const limit = 1000; - const allData = await fetchStrikes(limit, 0); - - let pools = allData.map(strike => strike.pool.toLowerCase()) - pools = [...new Set(pools)] - const sqrtPrices = await api.multiCall({ calls: pools, abi }) - const sqrtPricesMap = sqrtPrices.reduce((acc, item, i) => { - return { ...acc, [pools[i]]: item, } - }, {}); - - allData.forEach((strike) => { - const { token0, amount0, token1, amount1 } = addV3PositionBalances(strike, sqrtPricesMap); - api.add(token0, amount0); - api.add(token1, amount1); - }); +function tvlByChain(chain) { + return async function (api) { + const endpoint = SUBGRAPH_ENDPOINTS[chain]; + if (!endpoint) + throw new Error(`No subgraph endpoint configured for chain: ${chain}`); + + const limit = 1000; + const allData = await fetchStrikes(endpoint, limit, 0); + + let pools = allData.map((strike) => strike.pool.toLowerCase()); + pools = [...new Set(pools)]; + const sqrtPrices = await api.multiCall({ calls: pools, abi }); + const sqrtPricesMap = sqrtPrices.reduce((acc, item, i) => { + return { ...acc, [pools[i]]: item }; + }, {}); + + allData.forEach((strike) => { + const { token0, amount0, token1, amount1 } = addV3PositionBalances( + strike, + sqrtPricesMap + ); + api.add(token0, amount0); + api.add(token1, amount1); + }); + }; } module.exports = { - doublecounted: true, // tokens are stored in UNI-V3 pools - arbitrum: { tvl, }, + doublecounted: true, // tokens are stored in UNI-V3 pools + arbitrum: { + tvl: tvlByChain("arbitrum"), + }, + sonic: { + tvl: tvlByChain("sonic"), + }, + base: { + tvl: tvlByChain("base"), + }, + blast: { + tvl: tvlByChain("blast"), + }, + mantle: { + tvl: tvlByChain("mantle"), + }, + methodology: + "TVL is calculated by summing the value of all tokens in Stryke liquidity positions across supported chains", }; - - diff --git a/projects/double2win/config.js b/projects/double2win/config.js deleted file mode 100644 index 262c978956..0000000000 --- a/projects/double2win/config.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = { - arbitrum: { - uniswapV2Vault: { - doubleContract: '0xBf212dEE0aea6531dEb0B02be6E70b527dDF8246', - type: 'v2-vault' - }, - uniswapV2Migration: { - doubleContract: '0x1c6E7CE03ae7a9A252BcE0C9F871654dBB0C7ca5', - type: 'v2-vault' - }, - uniswapV3Vault: { - doubleContract: '0x07116C5ED5cBb49464f64926Ba152B8985fe3AFf', - type: 'v3-vault' - }, - uniswapV3Migration: { - doubleContract: '0x99F980fa0b1939A0A1033092EF2a668df8D8b70D', - type: 'v3-vault' - }, - assetVault: { - doubleContract: '0x7C09A9c30736F17043Fe6D0C0A3D03a7Cf6e78FD', - type: 'asset-vault' - }, - } -}; diff --git a/projects/double2win/index.js b/projects/double2win/index.js index ebb95389ca..c68d0e86d5 100644 --- a/projects/double2win/index.js +++ b/projects/double2win/index.js @@ -1,12 +1,7 @@ -const config = require("./config") -const { sumTokens2 } = require('../helper/unwrapLPs') const { cachedGraphQuery } = require('../helper/cache') +const { sumTokens2 } = require("../helper/unwrapLPs") -const subgraphs = { - "arbitrum": "https://api.studio.thegraph.com/query/16975/double-arbitrum/version/latest", -} - -async function getTokens(chain) { +async function getTokens(chain, subgraph) { const graphQuery = ` { assetTokens(where: {amount_gt: "0"}) { @@ -23,41 +18,38 @@ async function getTokens(chain) { } ` - const { assetTokens, migrations, liquidities } = await cachedGraphQuery(`double2win/${chain}`, subgraphs[chain], graphQuery) + const { assetTokens, migrations, liquidities } = await cachedGraphQuery(`double2win/${chain}`, subgraph, graphQuery) + const tokens = [] - return { assets: assetTokens.map(i => i.tokenAddress), v2Tokens: migrations.concat(liquidities).filter(i => i.ammType === 'UniswapV2').map(i => i.pair) } -} + migrations.forEach(migration => { tokens.push(migration.pair.toLowerCase()) }) + liquidities.forEach(liquidity => { tokens.push(liquidity.pair.toLowerCase()) }) + assetTokens.forEach(assetToken => { tokens.push(assetToken.tokenAddress.toLowerCase()) }) -module.exports = { - doublecounted: true, + return tokens } -Object.keys(config).forEach((chain) => { - const configs = Object.values(config[chain]) - - module.exports[chain] = { - tvl: async (api) => { - const v2Vaults = [] - const v3Vaults = [] - const assetVaults = [] - configs.forEach((config) => { - switch (config.type) { - case 'v2-vault': - v2Vaults.push(config.doubleContract) - break - case 'v3-vault': - v3Vaults.push(config.doubleContract) - break - case 'asset-vault': - assetVaults.push(config.doubleContract) - break - } - }) - const { assets, v2Tokens } = await getTokens(chain) - await sumTokens2({ resolveUniV3: true, api, owners: v3Vaults }) - await sumTokens2({ owners: assetVaults, tokens: assets, api }) - return sumTokens2({ owners: v2Vaults, tokens: v2Tokens, resolveLP: true, api }) - } +async function arbitrumTvl(api) { + const chain = api.chain + const subgraph = "https://api.studio.thegraph.com/query/16975/double-arbitrum/version/latest" + const addresses = { + uniswapV2Vault: '0xBf212dEE0aea6531dEb0B02be6E70b527dDF8246', + uniswapV2Migration: '0x1c6E7CE03ae7a9A252BcE0C9F871654dBB0C7ca5', + uniswapV3Vault: '0x07116C5ED5cBb49464f64926Ba152B8985fe3AFf', + uniswapV3Migration: '0x99F980fa0b1939A0A1033092EF2a668df8D8b70D', + assetVault: '0x7C09A9c30736F17043Fe6D0C0A3D03a7Cf6e78FD', } + + const tokens = await getTokens(chain, subgraph) + + const blacklistedTokens = ['0x13654df31871b5d01e5fba8e6c21a5d0344820f5'] + await sumTokens2({ api, owners: [addresses.uniswapV3Vault, addresses.uniswapV3Migration,], resolveUniV3: true, blacklistedTokens, }) + await sumTokens2({ api, owners: [addresses.uniswapV2Migration, addresses.assetVault, addresses.uniswapV2Vault], tokens, resolveLP: true, blacklistedTokens, }) + +} -}) +module.exports = { + doublecounted: true, + arbitrum: { + tvl: arbitrumTvl, + }, +} diff --git a/projects/doubler/index.js b/projects/doubler/index.js index 98a8ad5628..ce04c5f7fb 100644 --- a/projects/doubler/index.js +++ b/projects/doubler/index.js @@ -1,18 +1,30 @@ const ADDRESSES = require('../helper/coreAssets.json') -const WETH_CONTRACT = ADDRESSES.arbitrum.WETH; -const DOUBLER_CONTRACT = '0x56386f04111057a5D8DF8d719827038B716333F0'; -async function tvl(api) { - const collateralBalance = await api.call({ - abi: 'erc20:balanceOf', - target: WETH_CONTRACT, - params: [DOUBLER_CONTRACT], - }); - api.add(WETH_CONTRACT, collateralBalance) -} +const ARB_DOUBLER_POOL1_CONTRACT = '0x56386f04111057a5D8DF8d719827038B716333F0'; + +const abi = "function getPool() view returns ((bool isNative, uint16 inputFee, uint16 withdrawFee, uint256 id, uint256 lastPrice, uint256 cLastRbTime, uint256 lowerOfInputMaximum, uint256 endPrice, uint256 startTime, uint256 lastDayRate, uint256 endTime, address asset, address cToken, address bToken, address creator))" -module.exports = { +const config = { arbitrum: { - tvl, + pepe: '0x15AD6EDCa40dFAFE1B3BAc5F1c6d65411726F1bF', + pool2: '0xC64a3f7da839F8851cB2A5710b693c92fA461027', + }, + manta: { + weth: '0xc8480647Eeb358df638Ca882362cE528cC666087', + manta: '0x498F4711a706F9ad33b5D68EaA20E56a87d5d926', + }, +} + +Object.keys(config).forEach(chain => { + const pools = Object.values(config[chain]) + module.exports[chain] = { + tvl: async (api) => { + const tokens = await api.multiCall({ abi, calls: pools, }) + if (chain === 'arbitrum') { + tokens.push({ asset: ADDRESSES.arbitrum.WETH }) + pools.push(ARB_DOUBLER_POOL1_CONTRACT) + } + return api.sumTokens({ tokensAndOwners2: [tokens.map(i => i.asset), pools] }) + } } -}; \ No newline at end of file +}) \ No newline at end of file diff --git a/projects/doubleup/index.js b/projects/doubleup/index.js new file mode 100644 index 0000000000..0537218bb3 --- /dev/null +++ b/projects/doubleup/index.js @@ -0,0 +1,40 @@ +const sui = require("../helper/chain/sui"); + +const UNI_HOUSE_OBJ_ID = "0x75c63644536b1a7155d20d62d9f88bf794dc847ea296288ddaf306aa320168ab" + +async function tvl(api) { + const unihouseDynamicFields = await sui.getDynamicFieldObjects({ + parent: UNI_HOUSE_OBJ_ID, + }); + + const unihouseList = unihouseDynamicFields?.filter( + (field) => field?.type.includes("house::House"), + ); + + const unihouseIdList = unihouseList.map((house) => house.fields.id.id); + + for (const id of unihouseIdList) { + const house = await sui.getObject(id); + + const houseType = house?.type; + const coinType = houseType.split("<")[1].split(">")[0]; + + const housePipeDebt = house?.fields?.house_pipe_debt?.fields?.value; + const housePool = house?.fields?.house_pool; + const houseTvl = Number(housePipeDebt) + Number(housePool); + + api.add(coinType, houseTvl); + + const pipeDebt = house?.fields?.pipe_debt?.fields?.value; + const _tvl = Number(pipeDebt) + Number(house?.fields?.pool); + + api.add(coinType, _tvl); + } +} + +module.exports = { + timetravel: false, + sui: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/dough-finance.js b/projects/dough-finance.js new file mode 100644 index 0000000000..c2df644f5e --- /dev/null +++ b/projects/dough-finance.js @@ -0,0 +1,27 @@ +const ADDRESSES = require('./helper/coreAssets.json') +const { sumTokens2 } = require("./helper/unwrapLPs") + +async function getVaults(api) { + const vaults = await api.fetchList({ lengthAbi: 'dsaCounter', itemAbi: 'getDsaByID', target: "0x5390724ca3b0880242c7b1ef08eb9b1abe698c0e" }) + const tokens = [ + "0x98c23e9d8f34fefb1b7bd6a91b7ff122f4e16f5c", + "0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8", + ADDRESSES.ethereum.USDC, // usdc + ADDRESSES.ethereum.WETH, // eth + "0x72e95b8931767c79ba4eee721354d6e99a61d004", // debt usdc + "0xea51d7853eefb32b6ee06b1c12e6dcca88be0ffe", // debt weth + ] + return { vaults, tokens } +} + +module.exports = { + hallmarks: [ + [1720742400, "Protocol Exploit"] + ], + ethereum: { + tvl: async (api) => { + const { vaults, tokens } = await getVaults(api) + return sumTokens2({ api, tokens, owners: vaults }) + }, + } +} diff --git a/projects/drachma/index.js b/projects/drachma/index.js index fb70373e02..7fe6cf8708 100644 --- a/projects/drachma/index.js +++ b/projects/drachma/index.js @@ -6,10 +6,7 @@ const { compoundExports } = require("../helper/compound"); const comptroller = "0xB6ef08Ffbbb0691a3D9E6c41db4b1d2F97D8D49a"; //tvl for drachma farm -const { tvl: drachmaTvl, borrowed: drachmaBorrowed } = compoundExports( - comptroller, - "metis" -); +const { tvl: drachmaTvl, borrowed: drachmaBorrowed } = compoundExports(comptroller,); //tvl for drachma app function tvl(chain) { diff --git a/projects/dragonswap-sei-v3/index.js b/projects/dragonswap-sei-v3/index.js new file mode 100644 index 0000000000..b747f8211f --- /dev/null +++ b/projects/dragonswap-sei-v3/index.js @@ -0,0 +1,21 @@ +const { getConfig } = require('../helper/cache') +const { get } = require('../helper/http') +const { sumTokens2 } = require('../helper/unwrapLPs') + +module.exports = { + sei: { tvl }, +} + +async function tvl(api) { + const pools = await getConfig('dragonswap/uni-v3-pools', undefined, { + fetcher: async () => { + let { pools } = await get(`https://sei-api.dragonswap.app/api/v1/pools`) + pools = pools.filter(i => i.type === 'V3_POOL').map(i => i.pool_address) + return pools + } + }) + const token0s = await api.multiCall({ abi: 'address:token0', calls: pools }) + const token1s = await api.multiCall({ abi: 'address:token1', calls: pools }) + const ownerTokens = pools.map((v, i) => [[token0s[i], token1s[i]], v]) + return sumTokens2({ api, ownerTokens }) +} \ No newline at end of file diff --git a/projects/drop/index.js b/projects/drop/index.js index 7cf5f94515..7373983a81 100644 --- a/projects/drop/index.js +++ b/projects/drop/index.js @@ -3,13 +3,17 @@ const { queryContract } = require('../helper/chain/cosmos') const config = { neutron: [{ coinGeckoId: "cosmos", - contract: "neutron16m3hjh7l04kap086jgwthduma0r5l0wh8kc6kaqk92ge9n5aqvys9q6lxr" + dropContract: "neutron16m3hjh7l04kap086jgwthduma0r5l0wh8kc6kaqk92ge9n5aqvys9q6lxr" + }, + { + coinGeckoId: "celestia", + dropContract: "neutron1fp649j8djj676kfvh0qj8nt90ne86a8f033w9q7p9vkcqk9mmeeqxc9955" }], }; async function tvl(api) { - for (const { coinGeckoId, contract, decimals = 6 } of config[api.chain]) { - const bonded = await queryContract({ contract, chain: api.chain, data: { "total_bonded": {} } }) + for (const { coinGeckoId, dropContract, decimals = 6 } of config[api.chain]) { + const bonded = await queryContract({ contract: dropContract, chain: api.chain, data: { "total_bonded": {} } }) api.addCGToken(coinGeckoId, bonded / 10 ** decimals) } } diff --git a/projects/dtrinity-dlend/index.js b/projects/dtrinity-dlend/index.js new file mode 100644 index 0000000000..ca0cc26075 --- /dev/null +++ b/projects/dtrinity-dlend/index.js @@ -0,0 +1,6 @@ +const { aaveExports, methodology } = require('../helper/aave') + +module.exports = { + fraxtal: aaveExports(null, undefined, undefined, ['0xFB3adf4c845fD6352D24F3F0981eb7954401829c'], { v3: true, blacklistedTokens: ['0x788D96f655735f52c676A133f4dFC53cEC614d4A'] }), + methodology, +} diff --git a/projects/dtrinity/index.js b/projects/dtrinity/index.js new file mode 100644 index 0000000000..f8ebd1ff88 --- /dev/null +++ b/projects/dtrinity/index.js @@ -0,0 +1,26 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const dUSDCollateralVault = "0x624E12dE7a97B8cFc1AD1F050a1c9263b1f4FeBC" + +async function getAMOTvl(api) { + const fraxDUSDCurveLP = '0x9CA648D2f51098941688Db9a0beb1DadC2D1B357' + const fraxDUSDCurveLPBal = await api.call({ abi: 'erc20:balanceOf', target: fraxDUSDCurveLP, params: '0x0B0BD5F8A6f4c72a09748fA915Af12Ca423B7240' }) + const fraxDUSDCurveLPFraxBal = await api.call({ abi: 'erc20:balanceOf', params: fraxDUSDCurveLP, target: ADDRESSES.fraxtal.FRAX }) + const fraxDUSDCurveLPSupply = await api.call({ abi: 'erc20:totalSupply', target: fraxDUSDCurveLP, }) + const fraxBal = fraxDUSDCurveLPFraxBal * fraxDUSDCurveLPBal / fraxDUSDCurveLPSupply + api.add(ADDRESSES.fraxtal.FRAX, fraxBal) +} + +const tvl = async (api) => { + await getAMOTvl(api) + + const tokens = await api.call({ abi: 'address[]:listCollateral', target: dUSDCollateralVault }) + return api.sumTokens({ owner: dUSDCollateralVault, tokens }) +} + +module.exports = { + methodology: 'Includes TVL for dLEND and TVL for dUSD.', + fraxtal: { + tvl, + } +}; \ No newline at end of file diff --git a/projects/dtx-v3/index.js b/projects/dtx-v3/index.js new file mode 100644 index 0000000000..af79fead8a --- /dev/null +++ b/projects/dtx-v3/index.js @@ -0,0 +1,3 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ taiko: { factory: '0xfCA1AEf282A99390B62Ca8416a68F5747716260c', fromBlock: 105000, } }) \ No newline at end of file diff --git a/projects/duckchain-new-era/index.js b/projects/duckchain-new-era/index.js new file mode 100644 index 0000000000..42ab996d33 --- /dev/null +++ b/projects/duckchain-new-era/index.js @@ -0,0 +1,85 @@ +const ADDRESSES = require('../helper/coreAssets.json'); +const { sumTokensExport } = require('../helper/sumTokens'); +const { sumTokens2 } = require('../helper/unwrapLPs'); +const { getConfig } = require('../helper/cache'); + +const defaultOwner = '0x6b0e12Cb3D78a931b74F51D09F3D34E3047c0E49'; // meson + +const config = { + merlin: { + tokens: [ + '0xB880fd278198bd590252621d4CD071b1842E9Bcd', // M-BTC + '0x93919784C523f39CACaa98Ee0a9d96c3F32b593e' // uniBTC + ], + }, +}; + +async function addCoinfg(id, ownerTokens) { + const { result } = await getConfig('meson', 'https://relayer.meson.fi/api/v1/list'); + const { address, tokens } = result.find(c => c.id === id) ?? {}; + if (!address) return; + ownerTokens.push([tokens.map(i => i.addr ?? ADDRESSES.null).filter(i => i), address]); + return ownerTokens; +} + +Object.keys(config).forEach(chain => { + const { id = chain, owner = defaultOwner, tokens } = config[chain]; + module.exports[chain] = { + tvl: async (api) => { + const ownerTokens = []; + if (tokens) ownerTokens.push([tokens, owner]); + await addCoinfg(id, ownerTokens); + return sumTokens2({ api, ownerTokens }); + } + }; +}); + +module.exports = { + methodology: "Summary of Dukchain staking assets", + ton: { + tvl: sumTokensExport({ + tokens: [ + ADDRESSES.null, // 用于追踪原生 TON + "EQCuPm01HldiduQ55xaBF_1kaW_WAUy5DHey8suqzU_MAJOR", + "EQAvlWFDxGF2lXm67y4yzC17wYKD9A0guwPkMs1gOsM__NOT", + "EQCvxJy4eG8hyHBFsZ7eePxrRsUQSFE_jpptRAYBmcG_DOGS", + "EQB4zZusHsbU2vVTPqjhlokIOoiZhEdCMT703CWEzhTOo__X", + "EQAJ8uWd7EBqsmpSWaRdf_I-8R8-XHwh3gsNKhy-UrdrPcUo", + "EQC98_qAmNEptUtPc7W6xdHh_ZHrBUFpw5Ft_IzNU20QAJav", + "EQD-cvR0Nz6XAyRBvbhz-abTrRC6sI5tvHvvpeQraV9UAAD7", + "EQAfF5j3JMIpZlLmACv7Ub7RH7WmiVMuV4ivcgNYHvNnqHTz" + ], + owners: [ + "UQABbkaGs-mjWe6ifQ2h11GOEdGRyAPNrZi41-MK1uX92ulc", // UTONIC Ton生态所有代币 + "EQCVarr_Agtk4A8_Sn5RO2M8QH9j5WQjdoN984P-b6TBZB8Z" // UTONIC 多签 + ], + onlyWhitelistedTokens: false + }) + }, + ethereum: { + tvl: sumTokensExport({ + ownerTokens: [ + [[ADDRESSES.null], "0xb4eE432B0fbb64CC5C4bbA74427436b5347E88A4"] // meson eth + ], + }), + }, + arbitrum: { + tvl: sumTokensExport({ + owners: ["0x5E8c3F0eA1d4004F32dFaE54bca88C78D065d869"], + tokens: [ADDRESSES.arbitrum.WETH, ADDRESSES.arbitrum.USDT, ADDRESSES.arbitrum.USDC_CIRCLE,ADDRESSES.null,] // meson eth usdc and usdt + }), + }, + merlin: { //meson merlin + tvl: async (api) => { + const ownerTokens = []; + const { tokens } = config.merlin; + if (tokens) ownerTokens.push([tokens, defaultOwner]); + //await addCoinfg('merlin', ownerTokens); + return sumTokens2({ api, ownerTokens }); + } + }, +}; + + +// Excluding merlin tvl as it feels inorganic +delete module.exports.merlin \ No newline at end of file diff --git a/projects/duckswap/index.js b/projects/duckswap/index.js new file mode 100644 index 0000000000..46f0c7692e --- /dev/null +++ b/projects/duckswap/index.js @@ -0,0 +1,10 @@ +const { iziswapExport } = require('../helper/iziswap') + +const poolHelpers = { + 'duckchain': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], +} // liquidityManager contracts + + +Object.keys(poolHelpers).forEach(chain => { + module.exports[chain] = { tvl: iziswapExport({ poolHelpers: poolHelpers[chain], }), } +}) \ No newline at end of file diff --git a/projects/dvol/index.js b/projects/dvol/index.js index b0186cea59..14416a4a74 100644 --- a/projects/dvol/index.js +++ b/projects/dvol/index.js @@ -58,7 +58,6 @@ async function borrowed(api) { } module.exports = { - start: 33674950, timetravel: false, bsc: { tvl, borrowed, diff --git a/projects/dyad/index.js b/projects/dyad/index.js index c6f9545a9f..71d6cfa51b 100644 --- a/projects/dyad/index.js +++ b/projects/dyad/index.js @@ -7,6 +7,7 @@ const vaults = [ "0x3D72f7Fc3A9537e1fcC6FBF91AF55CcF2c5C4ed0", "0x3FC5c0e19b6287f25EB271c2E8e7Ba898FE7ab29", "0x5B74DD13D4136443A7831fB7AD139BA123B5071B", + "0xB58d87dD30a67823acC4b9Fa533F464CdEdA737E", ] async function tvl(api) { diff --git a/projects/dydx/index.js b/projects/dydx/index.js index eb26b94f88..166bf6e6b0 100644 --- a/projects/dydx/index.js +++ b/projects/dydx/index.js @@ -40,7 +40,7 @@ const ADDRESSES = require('../helper/coreAssets.json') } module.exports = { - start: 1538179200, // 09/29/2018 @ 12:00am (UTC) + start: '2018-09-29', // 09/29/2018 @ 12:00am (UTC) ethereum: { tvl }, hallmarks:[ [1611630974, "Series B $10M"], diff --git a/projects/dymension-dex.js b/projects/dymension-dex.js new file mode 100644 index 0000000000..d62aa36098 --- /dev/null +++ b/projects/dymension-dex.js @@ -0,0 +1,18 @@ +async function tvl() { + const pools = await fetch("https://fetchnetworkdatarequest-xqbg2swtrq-uc.a.run.app/?networkId=dymension_1100-1&dataType=pools").then(r=>r.json()) + const dym = pools.reduce((sum, pool)=>{ + const dymAssets = pool.poolAssets.find(a=>a.token.denom === "adym").token.amount/1e18 + return sum+dymAssets + }, 0) + + return { + "coingecko:dymension": dym*2 + } +} + +module.exports = { + methodology: 'Liquidity in DEX', + dymension:{ + tvl + } +} diff --git a/projects/dynastyswap-xyz/index.js b/projects/dynastyswap-xyz/index.js index 448503aa1b..067434d2e3 100644 --- a/projects/dynastyswap-xyz/index.js +++ b/projects/dynastyswap-xyz/index.js @@ -3,6 +3,6 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, pulse: { - tvl: getUniTVL({ factory: '0x7abcEc2e35505aF1720431A6c414067717342B1F', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x7abcEc2e35505aF1720431A6c414067717342B1F', useDefaultCoreAssets: true, }), }, }; // node test.js projects/pulsex/index.js \ No newline at end of file diff --git a/projects/dyorswap/index.js b/projects/dyorswap/index.js index 4f8b31d9f7..1626095e85 100644 --- a/projects/dyorswap/index.js +++ b/projects/dyorswap/index.js @@ -8,6 +8,8 @@ const config = { degen: '0x2CcaDb1e437AA9cDc741574bDa154686B1F04C09', xlayer: '0x2ccadb1e437aa9cdc741574bda154686b1f04c09', bob: '0x2CcaDb1e437AA9cDc741574bDa154686B1F04C09', + ink: '0x6c86ab200661512fDBd27Da4Bb87dF15609A2806', + sonic: '0xd8863d794520285185197F97215c8B8AD04E8815', } module.exports = { diff --git a/projects/dyson/index.js b/projects/dyson/index.js index 1bb23112fa..b9b85e6846 100644 --- a/projects/dyson/index.js +++ b/projects/dyson/index.js @@ -12,6 +12,7 @@ module.exports = { Object.keys(config).forEach(chain => { module.exports[chain] = { + // get reserves call fails tvl: getUniTVL({ factory: config[chain], fetchBalances: true, useDefaultCoreAssets: true }) } }) diff --git a/projects/earlyfans/index.js b/projects/earlyfans/index.js index e7801fcb37..ebed47cab7 100644 --- a/projects/earlyfans/index.js +++ b/projects/earlyfans/index.js @@ -2,17 +2,19 @@ const { sumTokens2 } = require("../helper/unwrapLPs"); const ADDRESSES = require('../helper/coreAssets.json') const { staking } = require('../helper/staking') -const contract = "0x4b17a9318238403ddac8E3a790C3b06D18132Bf4"; -const early = "0x7135B32e9903BdB4e19a8b1D22fC2038964B8451"; +const earlyfansV1contract = "0x4b17a9318238403ddac8E3a790C3b06D18132Bf4"; +const earlyTokenContract = "0x7135B32e9903BdB4e19a8b1D22fC2038964B8451"; +const earlyfansV2promisesContract = "0x169BC25B709f05c69daE264487cd84Be526AFb9a"; +const earlyfansV2bribesContract = "0x55BcC767F4ADD89BB7C316C560701A0a331DF746" async function tvl(api) { - return sumTokens2({ tokens: [ADDRESSES.null], owners: [contract], api }); + return sumTokens2({ tokens: [ADDRESSES.null], owners: [earlyfansV1contract, earlyfansV2promisesContract, earlyfansV2bribesContract], api }); } module.exports = { - methodology: `TVL counts the EARLY on ${early} and ETH on ${contract}`, + methodology: `TVL counts the EARLY on ${earlyTokenContract} and ETH on ${earlyfansV1contract}, ${earlyfansV2promisesContract} and ${earlyfansV2bribesContract}.`, blast: { tvl, - staking: staking(contract, early) // early token + staking: staking(earlyfansV1contract, earlyTokenContract) // early token }, }; diff --git a/projects/earn-powercity-io/index.js b/projects/earn-powercity-io/index.js index 39d159f06e..38729ca6d9 100644 --- a/projects/earn-powercity-io/index.js +++ b/projects/earn-powercity-io/index.js @@ -18,7 +18,7 @@ const LP_EARN_PLSX_ADDRESS = "0xed77CbbB80e5a5C3A1FE664419d6F690766b5913"; const lps = [LP_PXDC_PLSX_ADDRESS, LP_EARN_PLSX_ADDRESS] module.exports = { - start: 1708418955, + start: '2024-02-20', methodology: "Total Value Locked includes all Troves, Stability Pool, Staking Pool and LP Farming Pools", pulse: { tvl: getLiquityTvl(TROVE_MANAGER_ADDRESS, { collateralToken: PLSX_ADDRESS }), diff --git a/projects/ebtc/index.js b/projects/ebtc/index.js index 37a7cf00df..9495901a6a 100644 --- a/projects/ebtc/index.js +++ b/projects/ebtc/index.js @@ -13,7 +13,7 @@ async function tvl(api) { timetravel: true, misrepresentedTokens: false, methodology: 'Adds the total amount of collateral in the active pool and the collateral surplus pool of the eBTC protocol.', - start: 1710492719, + start: '2024-03-15', ethereum: { tvl, } diff --git a/projects/echelon/index.js b/projects/echelon/index.js index fd13d9e715..aabcafabef 100644 --- a/projects/echelon/index.js +++ b/projects/echelon/index.js @@ -1,24 +1,52 @@ const sdk = require("@defillama/sdk"); const { getResource, } = require("../helper/chain/aptos"); const { transformBalances } = require("../helper/portedTokens"); +const { get } = require("../helper/http"); -const contractAddress = "0xc6bc659f1649553c1a3fa05d9727433dc03843baac29473c817d06d39e7621ba"; +const mainLendingContract = "0xc6bc659f1649553c1a3fa05d9727433dc03843baac29473c817d06d39e7621ba"; +const isolatedLendingContract = "0x5d22fc881144fb4bbaa40b2abf954348082e133fdcd01f7531574df421bde71d"; +const coinAssetType = '300'; +// main pool async function getMarketAddresses() { - const lending = await getResource(contractAddress, `${contractAddress}::lending::Lending`); + const lending = await getResource(mainLendingContract, `${mainLendingContract}::lending::Lending`); return lending.market_objects.map(obj => obj.inner); } async function getMarket(marketAddress) { - const market = await getResource(marketAddress, `${contractAddress}::lending::Market`); - const coinInfo = await getResource(marketAddress, `${contractAddress}::lending::CoinInfo`); - return { cash: market.total_cash, liability: market.total_liability, fee: market.total_reserve, coin: coinInfo.type_name }; + const market = await getResource(marketAddress, `${mainLendingContract}::lending::Market`) + var coinInfo = null; + if (market.asset_type === coinAssetType) { + coinInfo = (await getResource(marketAddress, `${mainLendingContract}::lending::CoinInfo`)).type_name + } else { + coinInfo = (await getResource(marketAddress, `${mainLendingContract}::lending::FungibleAssetInfo`)).metadata.inner; + } + + + return { cash: market.total_cash, liability: market.total_liability, fee: market.total_reserve, coin: coinInfo }; +} + +// isolated pairs + +async function getIsolatedPairAddresses() { + const isolatedLending = await getResource(isolatedLendingContract, `${isolatedLendingContract}::isolated_lending::IsolatedLending`); + return isolatedLending.pair_objects.map(obj => obj.inner); +} + +async function getPair(pairAddress) { + const [pair, coinInfo] = await Promise.all([ + getResource(pairAddress, `${isolatedLendingContract}::isolated_lending::Pair`), + getResource(pairAddress, `${isolatedLendingContract}::isolated_lending::CoinInfo`) + ]) + const { total_collateral_amount, total_supply_amount, total_borrow_amount } = pair; + const { collateral_type_name, liability_type_name } = coinInfo; + return { collateral_token: collateral_type_name, asset_token: liability_type_name, total_collateral_amount, total_supply_amount, total_borrow_amount } } module.exports = { timetravel: false, methodology: - "Aggregates TVL for all markets in Echelon.", + "Aggregate TVL of both the Echelon main pool and its isolated pairs", aptos: { tvl: async () => { const balances = {}; @@ -28,7 +56,16 @@ module.exports = { markets.forEach(({ cash, coin }) => { sdk.util.sumSingleBalance(balances, coin, cash); }); - +/* + const isolatedPairAddresses = await getIsolatedPairAddresses(); + const pairs = await Promise.all(isolatedPairAddresses.map(pairAddress => getPair(pairAddress))); + pairs.forEach(({ collateral_token, total_collateral_amount, asset_token, total_supply_amount, total_borrow_amount }) => { + // isolated pair collateral tvl + sdk.util.sumSingleBalance(balances, collateral_token, total_collateral_amount); + // isolated pair asset tvl (supply - borrow) + sdk.util.sumSingleBalance(balances, asset_token, Number(total_supply_amount) - Number(total_borrow_amount)); + }); */ + return transformBalances("aptos", balances); }, borrowed: async () => { @@ -40,7 +77,13 @@ module.exports = { sdk.util.sumSingleBalance(balances, coin, liability); }); + /* const isolatedPairAddresses = await getIsolatedPairAddresses(); + const pairs = await Promise.all(isolatedPairAddresses.map(pairAddress => getPair(pairAddress))); + pairs.forEach(({ asset_token, total_borrow_amount }) => { + sdk.util.sumSingleBalance(balances, asset_token, total_borrow_amount); + }); */ + return transformBalances("aptos", balances); } }, -}; \ No newline at end of file +}; diff --git a/projects/echo-lending/index.js b/projects/echo-lending/index.js new file mode 100644 index 0000000000..4fef0c6646 --- /dev/null +++ b/projects/echo-lending/index.js @@ -0,0 +1,47 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const sdk = require("@defillama/sdk"); +const { transformBalances } = require("../helper/portedTokens"); +const { function_view } = require("../helper/chain/aptos"); + +let _data + +const mapping = { + 'APT': ADDRESSES.aptos.APT, +} + +async function getData() { + if (!_data) + _data = _getData() + + return _data + + + async function _getData() { + const resources = await function_view({ functionStr: "0xeab7ea4d635b6b6add79d5045c4a45d8148d88287b1cfa1c3b6a4b56f46839ed::pool_data_provider::get_all_reserves_tokens", }) + const [uTokens, tokens] = await function_view({ functionStr: "0xeab7ea4d635b6b6add79d5045c4a45d8148d88287b1cfa1c3b6a4b56f46839ed::underlying_token_factory::get_coin_asset_pairs", }) + const mapping = {} + tokens.forEach((token, i) => mapping[token] = uTokens[i]) + + for (const item of resources) { + const token = item.token_address + item.uToken = mapping[token] + item.reserve = await function_view({ functionStr: "0xeab7ea4d635b6b6add79d5045c4a45d8148d88287b1cfa1c3b6a4b56f46839ed::pool_data_provider::get_reserve_data", args: [token] }) + item.debt = item.reserve[3] + item.balance = +item.reserve[2] - +item.debt + } + return resources.filter(i => i.uToken); + } +} + +module.exports = { + aptos: { + tvl: async (api) => { + const data = await getData() + api.add(data.map(i => i.uToken), data.map(i => i.balance)) + }, + borrowed: async (api) => { + const data = await getData() + api.add(data.map(i => i.uToken), data.map(i => i.debt)) + }, + }, +}; diff --git a/projects/echo-lsd/index.js b/projects/echo-lsd/index.js new file mode 100644 index 0000000000..fb5940957a --- /dev/null +++ b/projects/echo-lsd/index.js @@ -0,0 +1,14 @@ +const { function_view } = require("../helper/chain/aptos"); + +async function getTVL() { + const totalTVL = await function_view({ functionStr: "0xa0281660ff6ca6c1b68b55fcb9b213c2276f90ad007ad27fd003cf2f3478e96e::lsdmanage::total_staked_apt", }) + return { + aptos: +totalTVL / 1e8 + } +} + +module.exports = { + aptos: { + tvl: getTVL + }, +}; diff --git a/projects/echodex/index.js b/projects/echodex/index.js index 47eec9b7c3..0d6c339510 100644 --- a/projects/echodex/index.js +++ b/projects/echodex/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - linea: { tvl: getUniTVL({ factory: '0x6D1063F2187442Cc9adbFAD2f55A96B846FCB399', useDefaultCoreAssets: true, fetchBalances: true }), }, + linea: { tvl: getUniTVL({ factory: '0x6D1063F2187442Cc9adbFAD2f55A96B846FCB399', useDefaultCoreAssets: true, }), }, } diff --git a/projects/echswap/index.js b/projects/echswap/index.js index 751dcffd94..61e7a731d4 100644 --- a/projects/echswap/index.js +++ b/projects/echswap/index.js @@ -1,10 +1,12 @@ const { getUniTVL } = require('../helper/unknownTokens') +const { deadFrom } = require('../mosquitos-finance') module.exports = { misrepresentedTokens: true, hallmarks: [ [1671062400, "Rug Pull"] ], + deadFrom: 1671062400, echelon: { tvl: () => ({}), } diff --git a/projects/eclipse-bridge/index.js b/projects/eclipse-bridge/index.js new file mode 100644 index 0000000000..d0a0e7e01d --- /dev/null +++ b/projects/eclipse-bridge/index.js @@ -0,0 +1,13 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owner: '0xd7e4b67e735733ac98a88f13d087d8aac670e644', + fetchCoValentTokens: true, + permitFailure: true + }), + }, +}; diff --git a/projects/eclipse/index.js b/projects/eclipse/index.js new file mode 100644 index 0000000000..dc53a7cf91 --- /dev/null +++ b/projects/eclipse/index.js @@ -0,0 +1,68 @@ +const { queryContract } = require('../helper/chain/cosmos') + +const tokens = { + "ASTRO": "factory/neutron1ffus553eet978k024lmssw0czsxwr97mggyv85lpcsdkft8v9ufsz3sa07/astro", + "ECLIP": "factory/neutron10sr06r3qkhn7xzpw3339wuj77hu06mzna6uht0/eclip" +} + +async function singleSideStaking(api){ + const astroStakingBalance = await queryContract({ + contract: "neutron1qk5nn9360pyu2tta7r4hvmuxwhxj5res79knt0sntmjcnwsycqyqy2ft9n", + chain: 'neutron', + data: { + total_staking: {} + } + }); + + api.add(tokens["ASTRO"], (astroStakingBalance)) +} + +async function lpStaking(api){ + const astroStakingBalance = await queryContract({ + contract: "neutron1d5p2lwh92040wfkrccdv5pamxtq7rsdzprfefd9v9vrh2c4lgheqvv6uyu", + chain: 'neutron', + data: { + total_staking: {} + } + }); + + const totalDeposit = await queryContract({ + contract: "neutron1zlf3hutsa4qnmue53lz2tfxrutp8y2e3rj4nkghg3rupgl4mqy8s5jgxsn", + chain: 'neutron', + data: { + total_deposit: {} + } + }); + + const totalShares = await queryContract({ + contract: "neutron1zlf3hutsa4qnmue53lz2tfxrutp8y2e3rj4nkghg3rupgl4mqy8s5jgxsn", + chain: 'neutron', + data: { + total_shares: {} + } + }); + + const conversionRate = Number(totalDeposit) / Number(totalShares); + + api.add(tokens["ASTRO"], (2 * conversionRate * astroStakingBalance)) +} + +async function eclipStaking(api){ + const eclipStakingBalance = await queryContract({ + contract: "neutron19q93n64nyet24ynvw04qjqmejffkmyxakdvl08sf3n3yeyr92lrs2makhx", + chain: 'neutron', + data: { + query_state: {} + } + }); + + api.add(tokens["ECLIP"], ((Number(eclipStakingBalance.stake_state.total_bond_amount) ))); +} + +module.exports = { + neutron: { + tvl: singleSideStaking, + pool2: lpStaking, + staking: eclipStaking, + }, +} \ No newline at end of file diff --git a/projects/ecodefi/index.js b/projects/ecodefi/index.js index 90170d5814..35c73ee57e 100644 --- a/projects/ecodefi/index.js +++ b/projects/ecodefi/index.js @@ -2,10 +2,12 @@ const { staking } = require('../helper/staking') const { compoundExports2 } = require('../helper/compound') module.exports = { + deadFrom: '2022-08-02', methodology: 'counts the number of Total value locked in ESG protocol.', bsc: { ...compoundExports2({ comptroller: '0xfd1f241ba25b8966a14865cb22a4ea3d24c92451'}), staking: staking('0x55839fe60742c7789DaBcA85Fd693f1cAbaeDd69', '0x0985205D53D575CB07Dd4Fba216034dc614eab55'), }, - start: 15307794, // Feb-16-2022 01:49:31 PM +UTC } + +module.exports.bsc.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/eddyfinance-stableswap/index.js b/projects/eddyfinance-stableswap/index.js new file mode 100644 index 0000000000..a6d880d409 --- /dev/null +++ b/projects/eddyfinance-stableswap/index.js @@ -0,0 +1,37 @@ +const { getUniTVL } = require('../helper/unknownTokens') +const sdk = require('@defillama/sdk'); +const { sumTokens2 } = require('../helper/unwrapLPs'); + +const getReserves = 'function getReserves() view returns (uint112 _reserve0, uint112 _reserve1)'; + +const stablePools = [ + '0x448028804461e8e5a8877c228F3adFd58c3Da6B6', // 4 asset pool + '0x01a9cd602c6c3f05ea9a3a55184c2181bd43e4b8', // 2 asset pool accumulated finance + '0xee1629de70afaf3ae3592a9d6d859949750aa697', // 2 asset pool zearn + '0x89cb3fA2A7910A268e9f7F619108aFADBD7587c4' // 2 asset UltiVerse pool +] + +async function stableSwapTvl(api) { + const params = [0, 1, 2, 3] + const calls = [] + stablePools.forEach(pool => { + params.forEach(param => + calls.push({ target: pool, params: param })) + }) + const tokens = await api.multiCall({ abi: 'function coins(uint256) view returns (address)', calls, permitFailure: true }) + const tokensAndOwners = [] + tokens.forEach((token, i) => { + if (!token) return; + tokensAndOwners.push([token, calls[i].target]) + }) + + return sumTokens2({ api, tokensAndOwners, blacklistedTokens: stablePools }) +} + + + +module.exports = { + misrepresentedTokens: true, + methodology: "Sum of tvl of the StableSwap pools", + zeta: { tvl: stableSwapTvl }, +}; \ No newline at end of file diff --git a/projects/eddyfinance/index.js b/projects/eddyfinance/index.js index 6b155c1b7f..48885f559f 100644 --- a/projects/eddyfinance/index.js +++ b/projects/eddyfinance/index.js @@ -1,8 +1,38 @@ const { getUniTVL } = require('../helper/unknownTokens') -const getReserves = 'function getReserves() view returns (uint112 _reserve0, uint112 _reserve1)' +const sdk = require('@defillama/sdk'); +const { sumTokens2 } = require('../helper/unwrapLPs'); -const zetaTVL = getUniTVL({ factory: '0x9fd96203f7b22bCF72d9DCb40ff98302376cE09c', abis: { getReserves } }) +const getReserves = 'function getReserves() view returns (uint112 _reserve0, uint112 _reserve1)'; +/* +const stablePools = [ + '0x448028804461e8e5a8877c228F3adFd58c3Da6B6', // 4 asset pool + '0x01a9cd602c6c3f05ea9a3a55184c2181bd43e4b8', // 2 asset pool accumulated finance + '0xee1629de70afaf3ae3592a9d6d859949750aa697', // 2 asset pool zearn + '0x89cb3fA2A7910A268e9f7F619108aFADBD7587c4' // 2 asset UltiVerse pool +] + +async function stableSwapTvl(api) { + const params = [0, 1, 2, 3] + const calls = [] + stablePools.forEach(pool => { + params.forEach(param => + calls.push({ target: pool, params: param })) + }) + const tokens = await api.multiCall({ abi: 'function coins(uint256) view returns (address)', calls, permitFailure: true }) + const tokensAndOwners = [] + tokens.forEach((token, i) => { + if (!token) return; + tokensAndOwners.push([token, calls[i].target]) + }) + + return sumTokens2({ api, tokensAndOwners, blacklistedTokens: stablePools }) +} +*/ // separate into eddyfinance-stableswap adapter + +const uniTvl = getUniTVL({ factory: '0x9fd96203f7b22bCF72d9DCb40ff98302376cE09c', abis: { getReserves } }) module.exports = { - zeta: { tvl: zetaTVL }, + misrepresentedTokens: true, + methodology: "Sum of tvl of UniV2 pools", + zeta: { tvl: uniTvl }, }; \ No newline at end of file diff --git a/projects/eigenlayer/index.js b/projects/eigenlayer/index.js index a0d3c71249..6f34f2bb37 100644 --- a/projects/eigenlayer/index.js +++ b/projects/eigenlayer/index.js @@ -1,10 +1,14 @@ -const { sumTokens2, nullAddress } = require('../helper/unwrapLPs') -const { getLogs } = require('../helper/cache/getLogs') -const { startAlliumQuery, retrieveAlliumResults } = require('../helper/allium') -const { getCache, setCache, } = require('../helper/cache') +const { sumTokens2, nullAddress } = require("../helper/unwrapLPs"); +const { getLogs2 } = require("../helper/cache/getLogs"); +const { startAlliumQuery, retrieveAlliumResults } = require("../helper/allium"); +const { getCache, setCache } = require("../helper/cache"); + +const EIGEN = '0xec53bF9167f50cDEB3Ae105f56099aaaB9061F83' +const eigenStrategy = '0xaCB55C530Acdb2849e6d4f36992Cd8c9D50ED8F7' +const bEIGEN = '0x83e9115d334d248ce39a6f36144aeab5b3456e75' async function getEigenPods(timestamp) { - const queryId = await getCache('eigenlayer', 'eigenpods-query') + const queryId = await getCache("eigenlayer", "eigenpods-query"); const offset = 3; const newQuery = await startAlliumQuery(` select @@ -26,50 +30,52 @@ async function getEigenPods(timestamp) { from beacon.validator.balances where status in ('active_ongoing', 'pending_queued', 'pending_initialized', 'withdrawal_possible') - and slot_timestamp = '${new Date(timestamp * 1e3 - offset * 24 * 3600e3).toISOString().split('T')[0]}T23:59:59' - ) beacon where pods.params['eigenPod'] = beacon.WITHDRAWAL_ADDRESS`) - await setCache('eigenlayer', 'eigenpods-query', newQuery) - const eigenPods = await retrieveAlliumResults(queryId) - const sum = eigenPods[0]?.["sum"] + and slot_timestamp = '${ + new Date(timestamp * 1e3 - offset * 24 * 3600e3).toISOString().split("T")[0] + }T23:59:59' + ) beacon where pods.params['eigenPod'] = beacon.WITHDRAWAL_ADDRESS`); + await setCache("eigenlayer", "eigenpods-query", newQuery); + const eigenPods = await retrieveAlliumResults(queryId); + const sum = eigenPods[0]?.["sum"]; if (!sum) { - throw new Error("Empty eigenpods") + throw new Error("Empty eigenpods"); } - return sum + return sum; } -async function tvl({timestamp}, _b, _cb, { api, }) { - /* - const podLogs = await getLogs({ - api, - target: '0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338', - topics: ['0x21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a'], - eventAbi: "event PodDeployed (address indexed eigenPod, address indexed podOwner)", - onlyArgs: true, - fromBlock: 17445564, - }) - const pods = podLogs.map(log => log.eigenPod) - const restakedStatus = await api.multiCall({ abi: 'bool:hasRestaked', calls: pods }) - restakedStatus.filter(i => i).forEach(() => api.add(nullAddress, 32 * 1e18)) - */ +const fetchLogs = async (api, eventAbi) => getLogs2({ + api, + target: "0x858646372cc42e1a627fce94aa7a7033e7cf075a", + eventAbi, + fromBlock: 17445564, + skipCacheRead: true +}); +const tvl = async ({ timestamp }, _b, _cb, { api }) => { api.add(nullAddress, await getEigenPods(timestamp) * 1e18) - const logs = await getLogs({ - api, - target: '0x858646372CC42E1A627fcE94aa7A7033e7CF075A', - topic: 'StrategyAddedToDepositWhitelist(address)', - eventAbi: "event StrategyAddedToDepositWhitelist(address strategy)", - onlyArgs: true, - fromBlock: 17445564, - }) - const strategies = logs.map(log => log.strategy) - const tokens = await api.multiCall({ abi: 'address:underlyingToken', calls: strategies }) - return sumTokens2({ api, tokensAndOwners2: [tokens, strategies] }) + + const [addeds, removeds] = await Promise.all([ + fetchLogs(api, "event StrategyAddedToDepositWhitelist(address strategy)"), + fetchLogs(api, "event StrategyRemovedFromDepositWhitelist(address strategy)"), + ]); + + const activeStrategies = addeds + .map(item => item[0]) + .filter(strategy => !removeds.some(removed => removed[0] === strategy)); + + const rawUnderlyingTokens = await api.multiCall({ abi: 'address:underlyingToken', calls: activeStrategies }) + const underlyingTokens = rawUnderlyingTokens.filter((t) => t.toLowerCase() !== bEIGEN) // filter out bEIGEN + return sumTokens2({ api, tokensAndOwners2: [underlyingTokens, activeStrategies] }) + +}; + +const staking = async (api) => { + const balance = await api.call({ target: bEIGEN, params: [eigenStrategy], abi: 'erc20:balanceOf' }) + api.add(EIGEN, balance) } // https://github.com/Layr-Labs/eigenlayer-contracts/blob/master/script/output/M1_deployment_mainnet_2023_6_9.json module.exports = { timetravel: false, - ethereum: { - tvl, - }, -} + ethereum: { tvl, staking }, +}; \ No newline at end of file diff --git a/projects/eigenpie/config.js b/projects/eigenpie/config.js index 544eaf2619..5a18b6fbaf 100644 --- a/projects/eigenpie/config.js +++ b/projects/eigenpie/config.js @@ -1,6 +1,14 @@ +const ADDRESSES = require('../helper/coreAssets.json') module.exports = { - ethereum: { - eigenConfig: "0x20b70E4A1883b81429533FeD944d7957121c7CAB", - eigenStaking: "0x24db6717dB1C75B9Db6eA47164D8730B63875dB7", - } - }; \ No newline at end of file + ethereum: { + eigenConfig: "0x20b70E4A1883b81429533FeD944d7957121c7CAB", + eigenStaking: "0x24db6717dB1C75B9Db6eA47164D8730B63875dB7", + }, + zircuit:{ + msteth: "0x1C1Fb35334290b5ff1bF7B4c09130885b10Fc0f4", + egeth: "0x4bcc7c793534246BC18acD3737aA4897FF23B458", + wsteth: "0xf0e673Bc224A8Ca3ff67a61605814666b1234833", + weth: ADDRESSES.optimism.WETH_1, + } + +}; \ No newline at end of file diff --git a/projects/eigenpie/index.js b/projects/eigenpie/index.js index a19b6d398d..52a16d36f1 100644 --- a/projects/eigenpie/index.js +++ b/projects/eigenpie/index.js @@ -1,20 +1,50 @@ -const config = require("./config"); const ADDRESSES = require('../helper/coreAssets.json') +const config = require("./config"); +const sdk = require('@defillama/sdk') + +async function getZircuitSupplies(api) { + const { msteth, egeth } = config[api.chain]; + const mlrttokens = [msteth, egeth]; + const tokenSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: mlrttokens, }); + return { + zircuitMstethSupply: tokenSupplies[0], + zircuitEgethSupply: tokenSupplies[1], + }; +} async function tvl(api) { - const { eigenConfig, eigenStaking } = config[api.chain]; + const { eigenConfig } = config[api.chain]; - let tokens = await api.call({ abi: 'address[]:getSupportedAssetList', target: eigenConfig, }); - const mlrttokens = await api.multiCall({ abi: 'function mLRTReceiptByAsset(address) view returns (address)', calls: tokens, target: eigenConfig }) - const tokenSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: mlrttokens}) - tokens = tokens.map(token => token.toLowerCase() === '0xeFEfeFEfeFeFEFEFEfefeFeFefEfEfEfeFEFEFEf'.toLowerCase() ? ADDRESSES.null : token) - api.add(tokens, tokenSupplies) + const zircuitApi = new sdk.ChainApi({ chain: 'zircuit', timestamp: api.timestamp }); + await zircuitApi.getBlock() + const zircuitSupplies = await getZircuitSupplies(zircuitApi); + api.add(ADDRESSES.ethereum.STETH, zircuitSupplies.zircuitMstethSupply * -1); // Adjust for msteth + api.add('0xeFEfeFEfeFeFEFEFEfefeFeFefEfEfEfeFEFEFEf', zircuitSupplies.zircuitEgethSupply * -1); // Adjust for egeth + + // Fetch token list and their supplies + let tokens = await api.call({ abi: 'address[]:getSupportedAssetList', target: eigenConfig }); + const mlrttokens = await api.multiCall({ abi: 'function mLRTReceiptByAsset(address) view returns (address)', calls: tokens, target: eigenConfig }); + const tokenSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: mlrttokens }); + api.add(tokens, tokenSupplies); } -Object.keys(config).forEach((chain) => { - module.exports[chain] = { - tvl, - }; -}); +async function tvl_zircuit(api) { + const { msteth, egeth, wsteth, weth } = config[api.chain]; + const mlrttokens = [msteth, egeth]; + const tokens = [wsteth, weth]; + + // Now add zircuit-specific supplies + const tokenSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: mlrttokens }); + api.add(tokens, tokenSupplies); +} + +module.exports = { + ethereum: { + tvl: tvl, + }, + zircuit: { + tvl: tvl_zircuit, + }, +}; -module.exports.doublecounted = true \ No newline at end of file +module.exports.doublecounted = true; diff --git a/projects/elara/index.js b/projects/elara/index.js new file mode 100644 index 0000000000..59f6e25980 --- /dev/null +++ b/projects/elara/index.js @@ -0,0 +1,6 @@ +const { methodology, compoundExports2 } = require("../helper/compound"); + +module.exports = { + zircuit: compoundExports2({ comptroller: '0x695aCEf58D1a10Cf13CBb4bbB2dfB7eDDd89B296' }), + methodology, +} \ No newline at end of file diff --git a/projects/electrikfinance/index.js b/projects/electrikfinance/index.js index fbe4d16121..1f5271627e 100644 --- a/projects/electrikfinance/index.js +++ b/projects/electrikfinance/index.js @@ -1,23 +1,7 @@ -const { sumUnknownTokens } = require("../helper/unknownTokens"); -const { getConfig } = require('../helper/cache') - -const chain = "klaytn"; -const tokenAPI = "address:want" - module.exports = { - [chain]: { - tvl: async (api) => { - let { result: { pools } } = await getConfig('elektrik-finance', 'https://api.electrik.finance/api/status/pools'); - pools = Object.values(pools) - const vaults = []; - const tokens = []; - for (var i = 0; i < pools.length; i++) { - vaults.push(pools[i].earnedTokenAddress); - tokens.push(pools[i].tokenAddress); - } - const bals = await api.multiCall({ abi: 'uint256:balance', calls: vaults }) - api.addTokens(tokens, bals) - return sumUnknownTokens({ api, useDefaultCoreAssets: true, resolveLP: true, lps: tokens }) - } + klaytn: { + tvl: () => ({}) } -} \ No newline at end of file +} + +module.exports.deadFrom = '2023-01-01' diff --git a/projects/electroswap-v2/index.js b/projects/electroswap-v2/index.js new file mode 100644 index 0000000000..35fbf2c4a3 --- /dev/null +++ b/projects/electroswap-v2/index.js @@ -0,0 +1,7 @@ +const { getUniTVL } = require('../helper/unknownTokens') + +module.exports={ + etn: { + tvl: getUniTVL({ factory: '0x203D550ed6fA9dAB8A4190720CF9F65138abd15B', useDefaultCoreAssets: false }), + } +} \ No newline at end of file diff --git a/projects/electroswap-v3/index.js b/projects/electroswap-v3/index.js new file mode 100644 index 0000000000..b580d9c6e9 --- /dev/null +++ b/projects/electroswap-v3/index.js @@ -0,0 +1,8 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +module.exports = uniV3Export({ + etn: { + factory: "0xbF6Bcbe2be545135391777F3B4698be92E2EB8cA", + fromBlock: 1242016, + }, +}); diff --git a/projects/elexium/index.js b/projects/elexium/index.js new file mode 100644 index 0000000000..25363aa8de --- /dev/null +++ b/projects/elexium/index.js @@ -0,0 +1,65 @@ +const alephium = require("../helper/chain/alephium"); + +const elexiumTokenId = "cad22f7c98f13fe249c25199c61190a9fb4341f8af9b1c17fcff4cd4b2c3d200"; +const alephId = '0000000000000000000000000000000000000000000000000000000000000000' +const veAddress = "23XEjbtTNN2FtcJryavvfMf6VwgVK22uiw5T6N85kjFzX"; +const pairFactoryAddress = "22oTtDJEMjNc9QAdmcZarnEzgkAooJp9gZy7RYBisniR5"; + +async function getAllPools() { + const results = await alephium.contractMultiCall([ + { group: 0, address: pairFactoryAddress, methodIndex: 0 }, + ]); + + const pairsCount = Number(results[0].returns[0].value); + + const poolIds = []; + + for (let i = 0; i < pairsCount; i++) { + const results = await alephium.contractMultiCall([ + { + group: 0, + address: pairFactoryAddress, + methodIndex: 2, + args: [{ value: i, type: "U256" }], + }, + ]); + + const poolId = results[0].returns[0].value; + + poolIds.push(poolId); + } + + return poolIds; +} + +async function addPoolTokens(poolId, api) { + const poolAddress = alephium.addressFromContractId(poolId); + + const tokenBalance = (await alephium.getTokensBalance(poolAddress)).filter( + (t) => t.tokenId !== poolId, + ); + + tokenBalance.forEach(i => api.add(i.tokenId, i.balance)); + + const alphBalance = (await alephium.getAlphBalance(poolAddress)).balance; + api.add(alephId, alphBalance); +} + +async function poolsTvl(api) { + const allPools = await getAllPools() + + for (const pool of allPools) + await addPoolTokens(pool, api); +} + +async function veTVL(api) { + const tokenBalance = (await alephium.getTokensBalance(veAddress)).find((t) => t.tokenId === elexiumTokenId,) ?? { balance: 0 }; + api.add(elexiumTokenId, tokenBalance.balance); +} + +module.exports = { + timetravel: false, + methodology: + "Total value of tokens provided as liquidity on alephium and total amount of locked $EX in voting escrow", + alephium: { tvl: poolsTvl, staking: veTVL }, +}; diff --git a/projects/elfi/index.js b/projects/elfi/index.js new file mode 100644 index 0000000000..f599360653 --- /dev/null +++ b/projects/elfi/index.js @@ -0,0 +1,30 @@ + +const ADDRESSES = require('../helper/coreAssets.json') +const { getLogs2 } = require('../helper/cache/getLogs') + +const tradeVault = '0x8772bB60EA1BBA8a7729a90ff1907855FD55ba83' +const lpVault = '0xbC268D619b406bdfCA1B4AC30d50Ba30AB38E96f' +const portfolioVault = '0x9099824Be9aB2b691ce0E478853Cb15Fb81FF677' + +const elfUSD = '0x70B8117b3177a7CE42BEe021E89625f27E45b98C' + +module.exports = { + arbitrum: { + tvl, + }, +}; + +async function tvl(api) { + const logs = await getLogs2({ + api, + factory: '0x153c613D572c050104086c7113d00B76Fbaa5d55', + eventAbi: 'event MarketCreated (bytes32 code, string stakeTokenName, address indexToken, address baseToken, address stakeToken)', + fromBlock: 233088372, + }) + + const ownerTokens = logs.map(log => [[log.baseToken, log.indexToken], log.stakeToken]) + ownerTokens.push([[ADDRESSES.arbitrum.USDC_CIRCLE], elfUSD]) + const tokens = ownerTokens.map(([tokens]) => tokens).flat() + await api.sumTokens({ tokens, owners: [lpVault, portfolioVault, tradeVault] }) + return api.sumTokens({ ownerTokens}) +} \ No newline at end of file diff --git a/projects/elixir/index.js b/projects/elixir/index.js new file mode 100644 index 0000000000..88e31f9f75 --- /dev/null +++ b/projects/elixir/index.js @@ -0,0 +1,59 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokensExport } = require("../helper/unwrapLPs"); +const MANAGER_ABI = { + getPoolToken: "function getPoolToken(uint256 id, address token) view returns (address _address, uint256 amount, uint256, bool)", + getPoolToken_2: "function pools(uint256 id) view returns (address router, uint8 poolType, address token, uint256 orderlyDepositFee, uint256 orderlyWithdrawalFee, uint256 activeAmount, uint256 hardcap)" +} + +const DEUSD_LP_STAKING = "0xC7963974280261736868f962e3959Ee1E1B99712"; +const COMMITS_CONTRACT = "0x4265f5D6c0cF127d733EeFA16D66d0df4b650D53"; +const COMMITS_VAULT = "0x4B4EEC1DDC9420a5cc35a25F5899dC5993f9e586"; +const COMMITS_VAULT_2 = "0x704377f719651C3eE6902Ff3C9D5522e5054d429"; +const deUSD = "0x15700b564ca08d9439c58ca5053166e8317aa138"; + +const LP_TOKENS = [ + "0xb478Bf40dD622086E0d0889eeBbAdCb63806ADde", // DEUSD/DAI Curve LP + "0x88DFb9370fE350aA51ADE31C32549d4d3A24fAf2", // DEUSD/FRAX Curve LP + "0x5F6c431AC417f0f430B84A666a563FAbe681Da94", // DEUSD/USDC Curve LP + "0x7C4e143B23D72E6938E06291f705B5ae3D5c7c7C", // DEUSD/USDT Curve LP +]; + +const VERTEX_MANAGER = '0x052Ab3fd33cADF9D9f227254252da3f996431f75' +const ORDERLY_MANAGER = '0x79865208f5dc18a476f49e6dbfd7d79785cb8cd8' + +const orderlyIntegration = async (api, manager, poolIds) => { + const pools = await api.multiCall({ abi: MANAGER_ABI.getPoolToken_2, calls: poolIds, target: manager }); + pools.forEach(i => api.add(i.token, i.activeAmount)); +} + +const integration = async (api, manager, poolIds, tokens) => { + if (manager === ORDERLY_MANAGER) + return orderlyIntegration(api, manager, poolIds) + const calls = poolIds.map(id => tokens.map(token => ({ params: [id, token] }))).flat(); + const pools = await api.multiCall({ abi: MANAGER_ABI.getPoolToken, calls, target: manager }); + pools.forEach((v, i) => api.add(calls[i].params[1], v.amount)); +} + +module.exports = { + ethereum: { + tvl: async (api) => { + const deusdSupply = await api.call({ target: deUSD, abi: "erc20:totalSupply" }) + api.add(deUSD, deusdSupply); + await api.sumTokens({ owners: [COMMITS_CONTRACT, COMMITS_VAULT, COMMITS_VAULT_2], tokens: [ADDRESSES.ethereum.STETH, ADDRESSES.null] }) + }, + pool2: sumTokensExport({ owner: DEUSD_LP_STAKING, tokens: LP_TOKENS }) + }, + arbitrum: { + tvl: async (api) => { + await integration(api, VERTEX_MANAGER, [1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 31, 34, 36, 38, 40, 41, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62], [ + ADDRESSES.arbitrum.USDC_CIRCLE, + ADDRESSES.arbitrum.USDT, + ADDRESSES.arbitrum.ARB, + '0x95146881b86B3ee99e63705eC87AfE29Fcc044D9', + ADDRESSES.arbitrum.WBTC, + ADDRESSES.arbitrum.WETH, + ]) + await integration(api, ORDERLY_MANAGER, Array.from({ length: 10 }, (_, i) => i + 1)) + } + } +}; diff --git a/projects/elma/index.js b/projects/elma/index.js new file mode 100644 index 0000000000..4f1ce27e1d --- /dev/null +++ b/projects/elma/index.js @@ -0,0 +1,24 @@ +module.exports = { + methodology: "Principal Tokens (PT) are always 1:1 mintable & redeemable with Underlying Tokens (UT). TVL is Total Market Cap of all PT, where 1 PT = 1 UT.", +} + +const config = { + fantom: { markets: [ + '0x0a558d43bccbc7586547fc74e3a0e70467215b3c', + '0x35402cDc3BCFFb904116bDC720Afc75c2921De08', + '0xB6633c351a3aF289ed6bbF4A78c682FA16656B1E', + '0xFaa22e721924fa57d042F6E2c793997aA9287B27', + ]} +} + +Object.keys(config).forEach(chain => { + const {markets,} = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const tokens = await api.multiCall({ abi: 'address:BASE', calls: markets}) + const wTokens = await api.multiCall({ abi: 'address:WRAP', calls: markets}) + const supplies = await api.multiCall({ abi: 'erc20:totalSupply', calls: wTokens}) + api.add(tokens, supplies) + } + } +}) \ No newline at end of file diff --git a/projects/elys-dex/index.js b/projects/elys-dex/index.js new file mode 100644 index 0000000000..e8ede9cab0 --- /dev/null +++ b/projects/elys-dex/index.js @@ -0,0 +1,22 @@ +const { get } = require('../helper/http') +const { sumTokens2 } = require('../helper/unwrapLPs') + +async function tvl(api) { + let key = '' + const pools = [] + do { + const { pagination: { next_key }, pool } = await get('https://api.elys.network/elys-network/elys/amm/pool?pagination.count_total=true&pagination.per_page=1000&pagination.key=' + key) + key = next_key + pools.push(...pool) + } while (key) + pools.forEach(pool => { + pool.pool_assets.forEach(({ token: { denom, amount } }) => api.add(denom, amount)) + }) + + return sumTokens2({ api }) +} + + +module.exports = { + elys: { tvl, } +} \ No newline at end of file diff --git a/projects/emojicoin/index.js b/projects/emojicoin/index.js new file mode 100644 index 0000000000..4d7c572da1 --- /dev/null +++ b/projects/emojicoin/index.js @@ -0,0 +1,42 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { function_view, timestampToVersion } = require("../helper/chain/aptos"); + +// This function will get all markets and the associated TVL in APT +async function getAllMarkets(ledgerVersion) { + // If called with a ledger version too early, an error will be thrown by function_view. + // If that is the case, return 0 as it means the package wasn't deployed yet and the + // TVL is then 0. + try { + const registry = await function_view({ + functionStr: "0xface729284ae5729100b3a9ad7f7cc025ea09739cd6e7252aff0beb53619cafe::emojicoin_dot_fun::registry_view", + args: [], + type_arguments: [], + ledgerVersion, + }) + return registry.total_quote_locked.value; + } catch { + return 0; + } +} + +// Date at which the contract was deployed. +const DEPLOYED_AT_DATE = '2024-11-20'; + +// Block close to the start date but before it. +const DEPLOYED_AT_BLOCK = 254000000; + +async function tvl(api) { + const version = await timestampToVersion(new Date(api.timestamp * 1000), DEPLOYED_AT_BLOCK); + const tvl_amount = await getAllMarkets(version); + api.add(ADDRESSES.aptos.APT, tvl_amount); +} + +module.exports = { + timetravel: true, + methodology: + "Aggregates TVL in all pools in Emojicoin.fun", + aptos: { + tvl, + }, + start: DEPLOYED_AT_DATE, +}; diff --git a/projects/empyrean/index.js b/projects/empyrean/index.js index fd1a0dd0ca..7946f41140 100644 --- a/projects/empyrean/index.js +++ b/projects/empyrean/index.js @@ -1,40 +1,13 @@ -const ADDRESSES = require('../helper/coreAssets.json') const { staking } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const empyreanStaking = "0xD080CBc2885c64510923Ac6F5c8896011f86a6aF"; const EMPYR = "0xE9F226a228Eb58d408FdB94c3ED5A18AF6968fE1"; -const treasuryAddress = "0x4606f4e6D43d501b86Fc583f44ae27097A1F9EA7"; -const USDC = ADDRESSES.aurora.USDC_e; -const EMPYR_USDC_TLP = "0x6e46c69FE35eF5BB78D7f35d92645C74245a6567"; - -/*** Bonds TVL Portion (Treasury) *** - * Treasury TVL consists of USDC and Trisolaris TLP balances - ***/ -async function auroraTvl(timestamp, chainBlocks) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [USDC, false], - [EMPYR_USDC_TLP, true], - ], - [treasuryAddress], - chainBlocks["aurora"], - "aurora", - (addr) => `aurora:${addr}` - ); - - return balances; -} - module.exports = { misrepresentedTokens: true, aurora: { staking: staking(empyreanStaking, EMPYR), - tvl: auroraTvl, + tvl: () => ({}), }, methodology: "Counts USDC and TLP (EMPYR-USDC) on the treasury", diff --git a/projects/emumeme/index.js b/projects/emumeme/index.js new file mode 100644 index 0000000000..9f1efb3dd1 --- /dev/null +++ b/projects/emumeme/index.js @@ -0,0 +1,3 @@ +const { masterchefExports } = require('../helper/unknownTokens') + +module.exports = masterchefExports({ chain: 'bsc', masterchef: '0x99e1F72d10ad66906e18b02501e3395B8C4470FF', nativeToken: '0x0dfbB60c53d9226E8D70AA94eac614D8294D7Fa2', useDefaultCoreAssets: true, }) \ No newline at end of file diff --git a/projects/endur/erc4626abi.js b/projects/endur/erc4626abi.js new file mode 100644 index 0000000000..1edd29b850 --- /dev/null +++ b/projects/endur/erc4626abi.js @@ -0,0 +1,48 @@ +const ERC4626Abi = [ + { + "name": "asset", + "type": "function", + "inputs": [], + "outputs": [ + { + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "state_mutability": "view" + }, + { + "name": "balanceOf", + "type": "function", + "inputs": [ + { + "name": "account", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view", + "customInput": 'address', + }, + { + "name": "total_assets", + "type": "function", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view" + } +] + +const ERC4626AbiMap = {} +ERC4626Abi.forEach(i => ERC4626AbiMap[i.name] = i) + +module.exports = { + ERC4626AbiMap +} \ No newline at end of file diff --git a/projects/endur/index.js b/projects/endur/index.js new file mode 100644 index 0000000000..f2b3879df4 --- /dev/null +++ b/projects/endur/index.js @@ -0,0 +1,33 @@ +/** + * Endur is a liquid staking solution for STRK + */ + +const {multiCall} = require("../helper/chain/starknet"); +const ADDRESSES = require('../helper/coreAssets.json'); +const { ERC4626AbiMap } = require('./erc4626abi') + +const LSTDATA = [{ //data of an LST contract; currently only xSTRK + address: "0x28d709c875c0ceac3dce7065bec5328186dc89fe254527084d1689910954b0a", // address of xSTRK vault contract + token: ADDRESSES.starknet.STRK +}] + +// returns the tvl of the all LST tokens in terms of their native token +async function tvl(api) { + const totalAssets = await multiCall({ + calls: LSTDATA.map(c => c.address), + abi: ERC4626AbiMap.total_assets + }); + // the balance of the tokens will be xTOKEN + // considering all 1 TOKEN = 1xTOKEN + // eg for now we only have xSTRK i.e 1 STRK = 1 xSTRK + + api.addTokens(LSTDATA.map(c => c.token), totalAssets); +} + +module.exports = { + doublecounted: true, + methodology: "The TVL is the total staked STRK managed by Endur's LST", + starknet: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/energondex/index.js b/projects/energondex/index.js index c296374609..e5e45cec6e 100644 --- a/projects/energondex/index.js +++ b/projects/energondex/index.js @@ -1,7 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') const { getUniTVL, staking } = require('../helper/unknownTokens') const sdk = require('@defillama/sdk') -const uniTvl = getUniTVL({ factory: '0xBfAe4f07C099798F23f5aC6773532fB637B68Ad7', useDefaultCoreAssets: true, fetchBalances: true, }) +const uniTvl = getUniTVL({ factory: '0xBfAe4f07C099798F23f5aC6773532fB637B68Ad7', useDefaultCoreAssets: true, }) const masterchef = '0x9A40F8374cf840cb1d76DD085E250D86641FB6a3' const egd = '0xF8F85beB4121fDAa9229141e5D5e4B782d8819D8' const weth = ADDRESSES.base.WETH diff --git a/projects/enosys-bridge/index.js b/projects/enosys-bridge/index.js index 57c5807cfe..069f878851 100644 --- a/projects/enosys-bridge/index.js +++ b/projects/enosys-bridge/index.js @@ -2,7 +2,7 @@ const { sumTokensExport } = require('../helper/unwrapLPs') const ADDRESSES = require('../helper/coreAssets.json') module.exports = { - xdc: { tvl: sumTokensExport({ owner: '0xd5308a4bb2d7121a26d0bd11257245f0efda2bc4', tokens: [ADDRESSES.xdc.WXDC], logCalls: true }) }, + xdc: { tvl: sumTokensExport({ owner: '0xcB71dC7b30205eB7Ce27B2cB36b24ba331ecD42a', tokens: [ADDRESSES.xdc.WXDC], logCalls: true }) }, ethereum: { tvl: sumTokensExport({ tokensAndOwners: [ [ADDRESSES.ethereum.USDT,'0x8936761f2903ed1af2b269e6fa3a79ebb0162c51'], diff --git a/projects/enosys-dex-v3/index.js b/projects/enosys-dex-v3/index.js new file mode 100644 index 0000000000..2cb8d3c469 --- /dev/null +++ b/projects/enosys-dex-v3/index.js @@ -0,0 +1,6 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +module.exports = uniV3Export({ + songbird: { factory: "0x416F1CcBc55033Ae0133DA96F9096Fe8c2c17E7d", fromBlock: 69857654 }, + flare: { factory: "0x17AA157AC8C54034381b840Cb8f6bf7Fc355f0de", fromBlock: 29925441 }, +}); \ No newline at end of file diff --git a/projects/ensuro/index.js b/projects/ensuro/index.js index 231b15184a..b2fe237f1c 100644 --- a/projects/ensuro/index.js +++ b/projects/ensuro/index.js @@ -4,8 +4,8 @@ const { sumTokens2 } = require('../helper/unwrapLPs') const addressBook = { polygon: { usdc: ADDRESSES.polygon.USDC, - aave_v3_usdc: "0x625E7708f30cA75bfd92586e17077590C60eb4cD", // aPolUSDC - aave_v2_usdc: "0x1a13F4Ca1d028320A707D99520AbFefca3998b7F", // amUSDC + aave_v3_usdc: "0x625E7708f30cA75bfd92586e17077590C60eb4cD", // aPolUSDC - AAVE USDC (Bridged) + aave_v3_native_usdc: "0xA4D94019934D8333Ef880ABFFbF2FDd611C762BD", // aPolUSDCn - AAVE USDC (Native) compound_v3_usdc: "0xF25212E676D1F7F89Cd72fFEe66158f541246445", // Compound USDC mountain_usdm: ADDRESSES.ethereum.USDM, // Mountain USDM reserves: [ @@ -24,6 +24,10 @@ const addressBook = { {name: "eToken Junior Bliss", address: "0x71d390C243706b713B5D2b077E942223f7A55d00"}, {name: "eToken Junior InsureHero", address: "0x15F76F59A29C7c12b4a67751CA525bf9167C1AaB"}, {name: "eToken Junior Clerity", address: "0x1c7F0c8ba10Db7f2e1c7B5B0A024b66b6baceb45"}, + {name: "eToken Junior FortuneCredit", address: "0xb1Dff6ce862273adcA2B9eFD96A8976764Ac7414"}, + {name: "eToken Junior Azzegura", address: "0x45435f79103472eD62fB9C92F04c50b188b22B99"}, + {name: "eToken Junior Covest", address: "0x92624870dC092C36943682375Df8246BF126D410"}, + {name: "eToken Junior Poncho", address: "0x0AA6623Be5b293fDde18aE0095163785a0b0E4E3"}, // PremiumsAccounts {name: "PremiumsAccount Koala", address: "0xCCf5C404d32eB6E777088AB13837a1b8dCBA9328"}, {name: "PremiumsAccount Innov Zone", address: "0x4f43B8F252887F814ED689346fdb5Bd266394520"}, @@ -37,15 +41,24 @@ const addressBook = { {name: "PremiumsAccount Bliss", address: "0x11b490292799a0edFE37797592F77151C4483442"}, {name: "PremiumsAccount InsureHero", address: "0x41B5a105C850014eC594879E8511994F25092460"}, {name: "PremiumsAccount Clerity", address: "0xD26d5015C57C197AE5e7BC866B49837d22364eAB"}, + {name: "PremiumsAccount FortuneCredit", address: "0xaF48bd33916836F5A3dD8C9095692d240A6A2567"}, + {name: "PremiumsAccount Azzegura", address: "0x6CB730dF6B3DB5BAac5FD96F50b04005c1B3A5F7"}, + {name: "PremiumsAccount Covest", address: "0x1D71E3901dB121F05A4a06F92440108055386355"}, + {name: "PremiumsAccount Poncho", address: "0xa490D80A80c8E547D040CE3aBBDCC8CcAD584e4c"}, + // Main CFLs + {name: "CFL Koala", address: "0xf6b7a278afFbc905b407E01893B287D516016ce0"}, + {name: "CFL Spot", address: "0x48Ff8B1493c6A3545Aea3F0812f1303E2f958bF4"}, + {name: "CFL Bliss", address: "0x936DAC0eeA5e4E90B8384B96d1aA6284Ce106f71"}, // MultiStrategy Vault - Vault that aggregates assets of several reserves {name: "MultiStrategy Vault", address: "0x1EE585dcea25cbDa16BE8cfeFa381A1F32acA418"}, + {name: "MultiStrategy Vault V2", address: "0x14F6DFEE761455247C6bf2b2b052a1F6245dD6FB"}, ], } }; async function tvl(api) { const addresses = addressBook[api.chain]; - const ownerTokens = addresses.reserves.map(i => [[addresses.usdc, addresses.aave_v3_usdc, addresses.compound_v3_usdc, addresses.mountain_usdm], i.address]) + const ownerTokens = addresses.reserves.map(i => [[addresses.usdc, addresses.aave_v3_usdc, addresses.aave_v3_native_usdc, addresses.compound_v3_usdc, addresses.mountain_usdm], i.address]) return sumTokens2({ api, ownerTokens, }); } @@ -55,7 +68,7 @@ module.exports = { polygon: { tvl }, - start: 1643673600, + start: '2022-02-01', hallmarks: [ [1669852800, "Ensuro V2 Launch"] ] diff --git a/projects/enterdao/index.js b/projects/enterdao/index.js index 0be631aa3c..0e41471565 100644 --- a/projects/enterdao/index.js +++ b/projects/enterdao/index.js @@ -1,9 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { sumTokensExport } = require("../helper/unwrapLPs"); const StakingContract = "0x3F148612315AaE2514AC630D6FAf0D94B8Cd8E33"; -const USDC_ENTR_SUSHI_LP = "0x83b546e10917432a722444672504f0d459472171"; const yieldFarms = [ ADDRESSES.ethereum.SUSHI, //SUSHI "0xbb0e17ef65f82ab018d8edd776e8dd940327b28b", //AXS @@ -15,26 +13,11 @@ const yieldFarms = [ "0x83b546e10917432a722444672504f0d459472171", //SUSHI-LP ]; -const ethTvl = async () => { - const balances = {}; - - for (const yieldFarm of yieldFarms) { - await sumTokensAndLPsSharedOwners( - balances, - yieldFarm == USDC_ENTR_SUSHI_LP - ? [[yieldFarm, true]] - : [[yieldFarm, false]], - [StakingContract] - ); - } - - return balances; -}; module.exports = { misrepresentedTokens: true, ethereum: { - tvl: ethTvl, + tvl: sumTokensExport({ owner: StakingContract, tokens: yieldFarms, resolveLP: true, }), }, methodology: "We count as TVL all the Yield Farms through Staking Contract", }; diff --git a/projects/entities/el-salvador.js b/projects/entities/el-salvador.js index 37e69daa82..1bdb7b30d4 100644 --- a/projects/entities/el-salvador.js +++ b/projects/entities/el-salvador.js @@ -1,5 +1,6 @@ const { sumTokensExport } = require('../helper/sumTokens') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { - bitcoin: { tvl: sumTokensExport({owner: '32ixEdVJWo3kmvJGMTZq5jAQVZZeuwnqzo'}) } + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.elSalvador }) } } \ No newline at end of file diff --git a/projects/entities/fbi-dprk.js b/projects/entities/fbi-dprk.js index cab5e93773..93f0017ec8 100644 --- a/projects/entities/fbi-dprk.js +++ b/projects/entities/fbi-dprk.js @@ -1,16 +1,5 @@ const { treasuryExports } = require("../helper/treasury") +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const config = { - bitcoin: { - owners: [ //source https://www.fbi.gov/news/press-releases/fbi-identifies-cryptocurrency-funds-stolen-by-dprk - "3LU8wRu4ZnXP4UM8Yo6kkTiGHM9BubgyiG", - "39idqitN9tYNmq3wYanwg3MitFB5TZCjWu", - "3AAUBbKJorvNhEUFhKnep9YTwmZECxE4Nk", - "3PjNaSeP8GzLjGeu51JR19Q2Lu8W2Te9oc", - "3NbdrezMzAVVfXv5MTQJn4hWqKhYCTCJoB", - "34VXKa5upLWVYMXmgid6bFM4BaQXHxSUoL" - ], - }, -} - +const config = { bitcoin: { owners: bitcoinAddressBook.fbiDprk } } module.exports = treasuryExports(config) \ No newline at end of file diff --git a/projects/entities/mt-gox.js b/projects/entities/mt-gox.js index df5b55172c..9d4a8a9937 100644 --- a/projects/entities/mt-gox.js +++ b/projects/entities/mt-gox.js @@ -1,14 +1,5 @@ const { treasuryExports } = require("../helper/treasury") +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const config = { - bitcoin: { - owners: [ - "bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6", //https://www.reddit.com/r/CryptoCurrency/comments/li1fw7/btc_silkroad_stash_seized_nov_2020_by_the_feds/ - 'bc1qmxjefnuy06v345v6vhwpwt05dztztmx4g3y7wp', - 'bc1qf2yvj48mzkj7uf8lc2a9sa7w983qe256l5c8fs', - 'bc1qe7nk2nlnjewghgw4sgm0r89zkjzsurda7z4rdg' - ], - }, -} - +const config = { bitcoin: { owners: bitcoinAddressBook.mtGoxEntities } } module.exports = treasuryExports(config) \ No newline at end of file diff --git a/projects/entities/silkroad-fbifunds.js b/projects/entities/silkroad-fbifunds.js index df5b55172c..0c9c2e09c8 100644 --- a/projects/entities/silkroad-fbifunds.js +++ b/projects/entities/silkroad-fbifunds.js @@ -1,14 +1,5 @@ const { treasuryExports } = require("../helper/treasury") +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const config = { - bitcoin: { - owners: [ - "bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6", //https://www.reddit.com/r/CryptoCurrency/comments/li1fw7/btc_silkroad_stash_seized_nov_2020_by_the_feds/ - 'bc1qmxjefnuy06v345v6vhwpwt05dztztmx4g3y7wp', - 'bc1qf2yvj48mzkj7uf8lc2a9sa7w983qe256l5c8fs', - 'bc1qe7nk2nlnjewghgw4sgm0r89zkjzsurda7z4rdg' - ], - }, -} - +const config = { bitcoin: { owners: bitcoinAddressBook.silkroadFBIEntities } } module.exports = treasuryExports(config) \ No newline at end of file diff --git a/projects/enzo/index.js b/projects/enzo/index.js index e4fd5e32ba..e454bcb795 100644 --- a/projects/enzo/index.js +++ b/projects/enzo/index.js @@ -1,5 +1,6 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { compoundExports2 } = require("../helper/compound"); module.exports = { - btr: compoundExports2({ cether: '0xe277Aed3fF3Eb9824EdC52Fe7703DF0c5ED8B313', comptroller: '0xe688a4a94AD1D32CD52A01306fc0a9552749F322', cetheEquivalent: '0xfF204e2681A6fA0e2C3FaDe68a1B28fb90E4Fc5F' }) + btr: compoundExports2({ cether: '0xe277Aed3fF3Eb9824EdC52Fe7703DF0c5ED8B313', comptroller: '0xe688a4a94AD1D32CD52A01306fc0a9552749F322', cetheEquivalent: ADDRESSES.btr.WBTC }) }; \ No newline at end of file diff --git a/projects/enzyme/index.js b/projects/enzyme/index.js index 121fe8240f..8bd0e86783 100644 --- a/projects/enzyme/index.js +++ b/projects/enzyme/index.js @@ -5,6 +5,7 @@ const { sumTokens2 } = require('../helper/unwrapLPs') const config = { polygon: { endpoint: sdk.graph.modifyEndpoint('GCAHDyqvZBLMwqdb9U7AqWAN4t4TSwR3aXMHDoUUFuRV') }, ethereum: { endpoint: sdk.graph.modifyEndpoint('9DLBBLep5UyU16kUQRvxBCMqko4q9XzuE4XsMMpARhKK') }, + arbitrum: { endpoint: sdk.graph.modifyEndpoint('8UJ5Bkf2eazZhXsAshhzQ2Keibcb8NFHBvXis9pb2C2Y') }, } const query = `query get_accounts($lastId: String!) { vaults( @@ -16,6 +17,12 @@ const query = `query get_accounts($lastId: String!) { async function tvl(api) { const { endpoint } = config[api.chain] const vaults = await cachedGraphQuery('enzyme/' + api.chain, endpoint, query, { fetchById: true, }) + const externalPositions = (await api.multiCall({ calls: vaults.map(i => i.id), abi: 'address[]:getActiveExternalPositions', excludeFailed: true, })).flat() + const managedAssets = await api.multiCall({ abi: 'function getManagedAssets() external returns (address[] memory assets, uint256[] memory amounts)', calls: externalPositions, excludeFailed: true, }) + const debtAssets = await api.multiCall({ abi: 'function getDebtAssets() external returns (address[] memory assets, uint256[] memory amounts)', calls: externalPositions, excludeFailed: true, }) + managedAssets.forEach(i => api.add(i.assets, i.amounts)) + debtAssets.forEach(i => api.add(i.assets, i.amounts.map(i => -1 * i))) + return sumTokens2({ api, ownerTokens: vaults.map(i => { return [i.trackedAssets.map(i => i.id), i.id] @@ -30,4 +37,4 @@ module.exports = { Object.keys(config).forEach(chain => { module.exports[chain] = { tvl } -}) \ No newline at end of file +}) diff --git a/projects/eos-evm/index.js b/projects/eos-evm/index.js new file mode 100644 index 0000000000..11e821a152 --- /dev/null +++ b/projects/eos-evm/index.js @@ -0,0 +1,12 @@ +const { get_account_tvl } = require("../helper/chain/eos"); + +async function eos() { + return await get_account_tvl("eosio.evm", [["eosio.token", "EOS", "eos"]]); +} + +module.exports = { + methodology: `EOS EVM TVL is achieved by querying token balances from [eosio.evm] system account.`, + eos: { + tvl: eos + }, +} diff --git a/projects/epoch-island/index.js b/projects/epoch-island/index.js index d0a381f149..c4608e2ff3 100644 --- a/projects/epoch-island/index.js +++ b/projects/epoch-island/index.js @@ -11,7 +11,7 @@ const config = { } module.exports = { - start: 1700179200, + start: '2023-11-17', hallmarks: [ [1700179200, "vEPOCH Launch"], [1704240000, "ITO Launch"] diff --git a/projects/equalizer-cl/index.js b/projects/equalizer-cl/index.js new file mode 100644 index 0000000000..982eac7c96 --- /dev/null +++ b/projects/equalizer-cl/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + sonic: { factory: '0x7Ca1dCCFB4f49564b8f13E18a67747fd428F1C40', fromBlock: 548413, }, +}) \ No newline at end of file diff --git a/projects/equilibria/index.js b/projects/equilibria/index.js index b848170a21..9441ff0d0e 100644 --- a/projects/equilibria/index.js +++ b/projects/equilibria/index.js @@ -1,108 +1,113 @@ -const sdk = require("@defillama/sdk"); -const { sumTokensExport } = require("../helper/unwrapLPs"); - -const contracts = { +const config = { ethereum: { - boosterAddress: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", - staker: "0x64627901dAdb46eD7f275fD4FC87d086cfF1e6E3", - eqbAddress: "0xfE80D611c6403f70e5B1b9B722D2B3510B740B2B", - eqbRewardsAddress: "0xd8967B2B15b3CDF96039b7407813B4037f73ec27", - pendleAddress: "0x808507121b80c02388fad14726482e061b8da827", + pendleBooster: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", + pendleProxy: "0x64627901dAdb46eD7f275fD4FC87d086cfF1e6E3", + eqb: "0xfE80D611c6403f70e5B1b9B722D2B3510B740B2B", + vlEqb: "0xd8967B2B15b3CDF96039b7407813B4037f73ec27", + pendle: "0x808507121b80c02388fad14726482e061b8da827", + ePendle: "0x22Fc5A29bd3d6CCe19a06f844019fd506fCe4455", + ePendleReward: "0x357F55b46821A6C6e476CC32EBB2674cD125e849", }, arbitrum: { - boosterAddress: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", - staker: "0x64627901dAdb46eD7f275fD4FC87d086cfF1e6E3", - eqbRewardsAddress: "0x70f61901658aAFB7aE57dA0C30695cE4417e72b9", - pendleAddress: "0x0c880f6761F1af8d9Aa9C466984b80DAb9a8c9e8", + pendleBooster: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", + pendleProxy: "0x64627901dAdb46eD7f275fD4FC87d086cfF1e6E3", + eqb: "0xBfbCFe8873fE28Dfa25f1099282b088D52bbAD9C", + vlEqb: "0x70f61901658aAFB7aE57dA0C30695cE4417e72b9", + pendle: "0x0c880f6761F1af8d9Aa9C466984b80DAb9a8c9e8", + ePendle: "0x3EaBE18eAE267D1B57f917aBa085bb5906114600", + ePendleReward: "0x9739d1E515C5291faA26D92a5D02761b6BbB4D6F", }, bsc: { - boosterAddress: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", - staker: "0x64627901dAdb46eD7f275fD4FC87d086cfF1e6E3", - eqbRewardsAddress: "0x0140dE476f49B6B42f7b73612b6dc317aB91D3BC", - pendleAddress: "0xb3Ed0A426155B79B898849803E3B36552f7ED507", + pendleBooster: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", + pendleProxy: "0x64627901dAdb46eD7f275fD4FC87d086cfF1e6E3", + eqb: "0x374Ca32fd7934c5d43240E1e73fa9B2283468609", + vlEqb: "0x0140dE476f49B6B42f7b73612b6dc317aB91D3BC", + pendle: "0xb3Ed0A426155B79B898849803E3B36552f7ED507", + ePendle: "0x898CA9B3ef8b6a30dA5fc7202f70E7992b3602B3", + ePendleReward: "0xE2dB20ce7D845f99338BbA4bdFF00e733801Dde7", }, optimism: { - boosterAddress: "0x18C61629E6CBAdB85c29ba7993f251b3EbE2B356", - staker: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", - eqbRewardsAddress: "0x22Fc5A29bd3d6CCe19a06f844019fd506fCe4455", - pendleAddress: "0xBC7B1Ff1c6989f006a1185318eD4E7b5796e66E1", + pendleBooster: "0x18C61629E6CBAdB85c29ba7993f251b3EbE2B356", + pendleProxy: "0x4D32C8Ff2fACC771eC7Efc70d6A8468bC30C26bF", + eqb: "0xaf3A6f67Af1624d3878A8d30b09FAe7915DcA2a0", + vlEqb: "0x22Fc5A29bd3d6CCe19a06f844019fd506fCe4455", + pendle: "0xBC7B1Ff1c6989f006a1185318eD4E7b5796e66E1", + ePendle: "0x86a20111fEae36f3511A30c0640d2099b3A818C5", + ePendleReward: "0x898CA9B3ef8b6a30dA5fc7202f70E7992b3602B3", + }, + mantle: { + pendleBooster: "0x920873E5b302A619C54c908aDFB77a1C4256A3B8", + pendleProxy: "0x479603DE0a8B6D2f4D4eaA1058Eea0d7Ac9E218d", + eqb: "0x3e7eF8f50246f725885102E8238CBba33F276747", + vlEqb: "0x71e0ce200a10f0bBFB9F924fE466ACf0B7401EbF", + pendle: "0xd27B18915e7acc8FD6Ac75DB6766a80f8D2f5729", + ePendle: "0x6EE066b813cd8C2586D86F79eD0025e81801b923", + ePendleReward: "0x741620136cf08a782c1Df1Fc9E3cAA760Cc4Fecc", + }, + base: { + pendleBooster: "0x2583A2538272f31e9A15dD12A432B8C96Ab4821d", + pendleProxy: "0x920873E5b302A619C54c908aDFB77a1C4256A3B8", + eqb: "0x010cd9b9be7E416E07793dc6Ce2F45868A80a50a", + vlEqb: "0x70f61901658aAFB7aE57dA0C30695cE4417e72b9", + pendle: "0xA99F6e6785Da0F5d6fB42495Fe424BCE029Eeb3E", + ePendle: "0x741620136cf08a782c1Df1Fc9E3cAA760Cc4Fecc", + ePendleReward: "0xB2D167EB1Fff17EbD727B0a21e7f5F50424264c8", } }; -async function tvl(chain, block) { - const balances = {}; +const abi = { + "poolLength": "uint256:poolLength", + "poolInfo": "function poolInfo(uint256) view returns (address market, address token, address rewardPool, bool shutdown)" +}; + +const { staking } = require('../helper/staking') - if (chain === "ethereum") { - const pendleLocked = await sdk.api2.abi.call({ +async function tvl(api) { + const { pendleBooster, vlEqb, pendleProxy, pendle } = config[api.chain]; + + if (api.chain === "ethereum") { + const pendleLocked = await api.call({ target: "0x4f30A9D41B80ecC5B94306AB4364951AE3170210", - params: contracts[chain].staker, + params: pendleProxy, abi: "erc20:balanceOf", - block, }); - sdk.util.sumSingleBalance( - balances, - contracts[chain].pendleAddress, + api.add( + pendle, pendleLocked ); } - const poolLength = await sdk.api2.abi.call({ - chain, - block, - target: contracts[chain].boosterAddress, - abi: "function poolLength() view returns (uint256)", + const poolInfos = await api.fetchList({ + lengthAbi: abi.poolLength, + itemAbi: abi.poolInfo, + target: pendleBooster, }); - - const poolInfos = await Promise.all( - Array.from(Array(Number(poolLength)).keys()).map((params) => - sdk.api2.abi.call({ - chain, - block, - target: contracts[chain].boosterAddress, - params, - abi: "function poolInfo(uint256) view returns (address market, address token, address rewardPool, bool shutdown)", - }) - ) - ); // multicall fails here - - const { output: gaugeBalances } = await sdk.api.abi.multiCall({ - abi: "erc20:balanceOf", - calls: Array.from(new Set(poolInfos.map((p) => p.market))).map((i) => ({ - target: i, - params: contracts[chain].staker, - })), - chain, - block, - }); - - gaugeBalances.forEach(({ output, input }, i) => - sdk.util.sumSingleBalance( - balances, - chain + - ":" + - poolInfos.find( - (p) => p.market.toLowerCase() === input.target.toLowerCase() - ).market, - output - ) - ); - - return balances; + const poolTokens = poolInfos.map(pool => pool.market); + const blacklistedTokens = []; + if (vlEqb) blacklistedTokens.push(vlEqb); + return api.sumTokens({ tokens: poolTokens, owner: pendleProxy, blacklistedTokens }); } -const chains = ["ethereum", "arbitrum", 'bsc', 'optimism']; - -module.exports = { - doublecounted: true, -}; +Object.keys(config).forEach((chain) => { + const { eqb, vlEqb, ePendle, ePendleReward } = config[chain]; -chains.forEach((chain) => { module.exports[chain] = { - tvl: async (_, _b, { [chain]: block }) => tvl(chain, block), + tvl, }; -}); -module.exports.ethereum.staking = sumTokensExport({ - owner: contracts.ethereum.eqbRewardsAddress, - tokens: [contracts.ethereum.eqbAddress], + const stakingContracts = []; + const stakingTokens= []; + if (eqb && vlEqb) { + stakingContracts.push(vlEqb); + stakingTokens.push(eqb); + } + + if (ePendle && ePendleReward) { + stakingContracts.push(ePendleReward); + stakingTokens.push(ePendle); + } + + if (stakingContracts.length) module.exports[chain].staking = staking(stakingContracts, stakingTokens); }); + +module.exports.doublecounted = true; diff --git a/projects/equilibrium/api.js b/projects/equilibrium/api.js index 45f1595d10..8b45d48911 100644 --- a/projects/equilibrium/api.js +++ b/projects/equilibrium/api.js @@ -1,94 +1,6 @@ -const { ApiPromise, WsProvider } = require("@polkadot/api"); -const BN = require("bn.js"); - -const capitalize = (str) => str.slice(0, 1).toUpperCase() + str.slice(1); - -const currencyFromU64 = (u64) => { - const bytes = []; - let num = typeof u64 === "number" ? new BN(u64) : u64; - do { - bytes.unshift(num.modn(256)); - num = num.divn(256); - } while (num.gtn(0)); - return capitalize(Buffer.from(bytes).toString("utf8")); -}; - -const u64FromCurrency = (currency) => { - const buf = Buffer.from(currency.toLowerCase()); - const size = buf.length; - return buf.reduce((val, digit, i) => val + Math.pow(256, size - 1 - i) * digit, 0); -}; - -const ASSETS = { - // Do not incluede Eq token in product TVL - "Eq": "", - "Aca": "Acala", - "Bnb": "binancecoin", - "Bnc": "bifrost-native-coin", - "Cru": "crust-network", - "Dot": "polkadot", - "Eqd": "", - "Lit": "Litentry ", - "Pha": "Phala", - "Astr": "Astar", - "Busd": "binance-usd", - "Glmr": "Moonbeam", - "Ibtc": "Bitcoin", - "Intr": "Interlay", - "Lpt0": "", - "Lpt1": "", - "Para": "parallel-finance", - "Usdt": "tether", - "Xdot": "polkadot", - "Cd613": "polkadot", - "Cd714": "polkadot", - "Cd815": "polkadot", - "Eqdot": "polkadot", - "Mxeth": "ethereum", - "Xdot2": "polkadot", - "Xdot3": "polkadot", - "Mxusdc": "usd-coin", - "Mxwbtc": "wrapped-bitcoin", -}; - -const PRECISION = 1_000_000_000n; async function tvl() { - const provider = new WsProvider("wss://node.pol.equilibrium.io/"); - const api = await ApiPromise.create({ provider }); - - const assets = (await api.query.eqAssets.assets()).unwrap(); - - const queries = assets.map(({ id }) => { - return [api.query.eqAggregates.totalUserGroups, ["Balances", { 0: id }]]; - }); - - const balances = await api.queryMulti(queries); - - const eqDotPrice = (await api.query.oracle.pricePoints(u64FromCurrency("eqdot"))).unwrap().price.toNumber() - / (await api.query.oracle.pricePoints(u64FromCurrency("dot"))).unwrap().price.toNumber(); - - const accuracy = 10000; - - const result = assets.reduce((acc, { id }, i) => { - const symbol = currencyFromU64(id) - const coiungekoAsset = ASSETS[symbol]; - if (coiungekoAsset) - { - let amount = Number(balances[i].collateral.toBigInt() * BigInt(accuracy) / PRECISION) / accuracy; - - // eqDot staking token - if (symbol == "Eqdot") - { - amount *= eqDotPrice; - } - acc[coiungekoAsset] = (acc[coiungekoAsset] ?? 0) + amount; - } - return acc; - }, {}); - - return result; -} + throw new Error("Equilibrium chain is deprecated");} module.exports = { equilibrium: {tvl}, diff --git a/projects/equilibrium/index.js b/projects/equilibrium/index.js index 52f805a089..c1484bea19 100644 --- a/projects/equilibrium/index.js +++ b/projects/equilibrium/index.js @@ -1,6 +1,8 @@ const { getExports } = require('../helper/heroku-api') module.exports = { + hallmarks: [[1714550400, 'Sunset of Equilibrium Network']], + deadFrom: "2024-09-01", timetravel: false, ...getExports("equilibrium", ['equilibrium']) } \ No newline at end of file diff --git a/projects/erasure/index.js b/projects/erasure/index.js index d2d19e7871..f249af17c5 100644 --- a/projects/erasure/index.js +++ b/projects/erasure/index.js @@ -121,6 +121,6 @@ const ADDRESSES = require('../helper/coreAssets.json') ==================================================*/ module.exports = { - start: 1566518400, // 08/23/2019 @ 12:00am (UTC) + start: '2019-08-23', // 08/23/2019 @ 12:00am (UTC) ethereum: { tvl } }; diff --git a/projects/eris-protocol/index.js b/projects/eris-protocol/index.js index 2d68297c92..1f60b22d8e 100644 --- a/projects/eris-protocol/index.js +++ b/projects/eris-protocol/index.js @@ -172,6 +172,10 @@ const config = { coinGeckoId: "chihuahua-token", hub: "chihuahua1nktfhalzvtx82kyn4dh6l8htcl0prfpnu380a39zj52nzu3j467qqg23ry", }, + nibiru: { + coinGeckoId: "nibiru", + hub: "nibi1udqqx30cw8nwjxtl4l28ym9hhrp933zlq8dqxfjzcdhvl8y24zcqpzmh8m", + }, }; let assetDecimals = { @@ -399,7 +403,7 @@ async function productsTvl(chain) { module.exports = { timetravel: false, - methodology: "Liquid Staking and Arbitrage Protocol", + methodology: "Liquid Staking and Arbitrage Protocol", terra2: { tvl: () => productsTvl("terra2") }, terra: { tvl: () => productsTvl("terra") }, kujira: { tvl: () => productsTvl("kujira") }, @@ -411,4 +415,5 @@ module.exports = { chihuahua: { tvl: () => productsTvl("chihuahua") }, archway: { tvl: () => productsTvl("archway") }, sei: { tvl: () => productsTvl("sei") }, + nibiru: { tvl: () => productsTvl("nibiru") }, }; diff --git a/projects/esper-finance/index.js b/projects/esper-finance/index.js index e7bf0db602..d9cb3a3505 100644 --- a/projects/esper-finance/index.js +++ b/projects/esper-finance/index.js @@ -2,8 +2,7 @@ const { getUniTVL } = require("../helper/unknownTokens"); module.exports = { misrepresentedTokens: true, - start: 4781359, mantle: { - tvl: getUniTVL({ factory: '0x69C4515C926ac3db7A547044145495240961a7B5', useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x69C4515C926ac3db7A547044145495240961a7B5', useDefaultCoreAssets: true, }), }, }; diff --git a/projects/estate-protocol/index.js b/projects/estate-protocol/index.js new file mode 100644 index 0000000000..58bca11547 --- /dev/null +++ b/projects/estate-protocol/index.js @@ -0,0 +1,20 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { get } = require('../helper/http') + +const EVM_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/; + +async function tvl(api) { + const tokens = (await get('https://estateprotocol.com/api/public/property/list')).filter(t => t.propertyAddress && EVM_ADDRESS_REGEX.test(t.propertyAddress) && t.token_price) + const tokenSupplies = await api.multiCall({ calls: tokens.map((token) => ({ target: token.propertyAddress })), abi: 'erc20:totalSupply' }) + + tokenSupplies.forEach((supply, i) => { + const token = tokens[i] + const price = parseFloat(token.token_price) + api.add(ADDRESSES.arbitrum.USDC_CIRCLE, supply * price * Math.pow(10, 6-18)) + }) +} + +module.exports = { + methodology: `TVL for Estate Protocol consists of the accumulation of all properties prices, each being tokenSupply * tokenPrice where tokenPrice is given by the API`, + arbitrum: { tvl } +} diff --git a/projects/ethena-usdtb/index.js b/projects/ethena-usdtb/index.js new file mode 100644 index 0000000000..700a3d514a --- /dev/null +++ b/projects/ethena-usdtb/index.js @@ -0,0 +1,10 @@ +const USDtb = "0xc139190f447e929f090edeb554d95abb8b18ac1c" + +module.exports = { + ethereum: { + tvl: async (api) => { + const supply = await api.call({ abi: 'erc20:totalSupply', target: USDtb }) + api.add(USDtb, supply) + }, + } +} diff --git a/projects/etherfi-liquid/index.js b/projects/etherfi-liquid/index.js index 2ffb2b3b8d..bc6001deb4 100644 --- a/projects/etherfi-liquid/index.js +++ b/projects/etherfi-liquid/index.js @@ -1,12 +1,18 @@ const ADDRESSES = require('../helper/coreAssets.json') const sdk = require('@defillama/sdk') +const liquidVaults = [ + "0xf0bb20865277aBd641a307eCe5Ee04E79073416C", + "0x08c6F91e2B681FaF5e17227F2a44C307b3C1364C" +] + +const liquidAccountants = [ + "0x0d05D94a5F1E76C18fbeB7A13d17C8a314088198", + "0xc315D6e14DDCDC7407784e2Caf815d131Bc1D3E7" +] + async function tvl(api) { const optimismApi = new sdk.ChainApi({ chain: 'optimism', timestamp: api.timestamp }) - const balETH = await api.call({ - abi: "uint256:totalSupply", - target: '0xf0bb20865277aBd641a307eCe5Ee04E79073416C', - }); await optimismApi.getBlock() const wethBal = await optimismApi.call({ target: '0xAB7590CeE3Ef1A863E9A5877fBB82D9bE11504da', @@ -18,17 +24,31 @@ async function tvl(api) { abi: 'function categoryLastUpdated(string _category) view returns (uint256)', params: ['liquid-weth'] }); - if (api.timestamp - updatedTimestamp > 12 * 60 * 60 || updatedTimestamp > api.timestamp) { + + //eth vault + const balETH = await api.call({ + abi: "uint256:totalSupply", + target: liquidVaults[0], + }); + const ethQuote = await api.call({ + target: liquidAccountants[0], + abi: 'function getRate() view returns (uint256)' + }); + if (api.timestamp - updatedTimestamp > 12 * 60 * 60) { throw new Error('Data is outdated') } - console.log(updatedTimestamp, api.timestamp) - api.add(ADDRESSES.ethereum.EETH, BigInt(balETH) - BigInt(wethBal)); + api.add(ADDRESSES.ethereum.EETH, BigInt(balETH) * BigInt(ethQuote) / BigInt(1e18) - BigInt(wethBal)); api.add(ADDRESSES.ethereum.WETH, wethBal) + //usdc vault const balUSD = await api.call({ abi: "uint256:totalSupply", - target: '0x08c6f91e2b681faf5e17227f2a44c307b3c1364c', + target: liquidVaults[1], + }); + const usdQuote = await api.call({ + target: liquidAccountants[1], + abi: 'function getRate() view returns (uint256)' }); - api.add(ADDRESSES.ethereum.USDC, balUSD); + api.add(ADDRESSES.ethereum.USDC, balUSD * usdQuote / 1e6); } module.exports = { diff --git a/projects/etherfi-lrt/index.js b/projects/etherfi-lrt/index.js index cb839dd703..78604fcdee 100644 --- a/projects/etherfi-lrt/index.js +++ b/projects/etherfi-lrt/index.js @@ -1,15 +1,41 @@ -const { sumTokensExport } = require('../helper/unwrapLPs'); +const ADDRESSES = require('../helper/coreAssets.json') + const vaults = [ '0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88', '0x7223442cad8e9cA474fC40109ab981608F8c4273', '0x657e8C867D8B37dCC18fA4Caead9C45EB088C642', + '0x352180974C71f84a934953Cf49C4E538a6F9c997', + '0xeDa663610638E6557c27e2f4e973D3393e844E70', +] + +const vaultAccountant = [ + '0xbe16605B22a7faCEf247363312121670DFe5afBE', + '0x126af21dc55C300B7D0bBfC4F3898F558aE8156b', + '0x1b293DC39F94157fA0D1D36d7e0090C8B8B8c13F', + '0xBae19b38Bf727Be64AF0B578c34985c3D612e2Ba', + '0x1D4F0F05e50312d3E7B65659Ef7d06aa74651e0C', ] +async function vaultsTvl(api) { + const supplies = await api.multiCall({ calls: vaults, abi: 'uint256:totalSupply' }) + const quotes = await api.multiCall({ calls: vaultAccountant, abi: 'uint256:getRate' }) + const bases = await api.multiCall({ calls: vaultAccountant, abi: 'address:base' }) + for (let i = 0; i < vaults.length; i++) { + const bvSupply = supplies[i] + let base = bases[i] + const quote = quotes[i] + if (base.toLowerCase() === ADDRESSES.ethereum.WETH.toLowerCase()) + base = ADDRESSES.ethereum.EETH + + const denominator = Math.pow(10, (String(quote).length - 1)) + api.add(base, bvSupply * quote / denominator) + } +} + module.exports = { doublecounted: true, + misrepresentedTokens: true, ethereum: { - tvl: sumTokensExport({ owners: vaults, fetchCoValentTokens: true, tokenConfig: { - onlyWhitelisted: false, - }}), + tvl: vaultsTvl, }, } \ No newline at end of file diff --git a/projects/ethervista/index.js b/projects/ethervista/index.js new file mode 100644 index 0000000000..8f340e3d67 --- /dev/null +++ b/projects/ethervista/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'ethereum': '0x9a27cb5ae0B2cEe0bb71f9A85C0D60f3920757B4' +}) \ No newline at end of file diff --git a/projects/ethichub/index.js b/projects/ethichub/index.js index 6791c5d367..793e0ca935 100644 --- a/projects/ethichub/index.js +++ b/projects/ethichub/index.js @@ -15,7 +15,7 @@ const STAKED_ETHIX_CELO = '0xCb16E29d0B667BaD7266E5d0Cd59b711b6273C6B'; module.exports = { methodology: 'Count of the tokens in pools, reserves...', - start: 1608640693, + start: '2020-12-22', ethereum: { tvl: () => ({}), pool2: pool2(STAKED_UETHIX_MAINNET, ETHIX_WETH_UNIV2), diff --git a/projects/ethosx/index.js b/projects/ethosx/index.js index adbad62cd4..d9817ab60d 100644 --- a/projects/ethosx/index.js +++ b/projects/ethosx/index.js @@ -27,7 +27,7 @@ const USDC_BSC_ADDRESS = ADDRESSES.bsc.USDC; module.exports = { methodology: "TVL counts the USDC held in the controller contracts.", - start: 1715693000, + start: '2024-05-14', arbitrum: { tvl: sumTokensExport({ owners: [ diff --git a/projects/euler-v2/index.js b/projects/euler-v2/index.js new file mode 100644 index 0000000000..b68875c0ab --- /dev/null +++ b/projects/euler-v2/index.js @@ -0,0 +1,31 @@ +const { sumTokens2 } = require("../helper/unwrapLPs") + +module.exports = { + methodology: `TVL is supply balance minus borrows the euler contract.`, +} + +const config = { + ethereum: { factory: '0x29a56a1b8214D9Cf7c5561811750D5cBDb45CC8e', } +} + +Object.keys(config).forEach(chain => { + const { factory, } = config[chain] + + async function getVaults(api) { + const vaults = await api.fetchList({ lengthAbi: 'getProxyListLength', itemAbi: 'proxyList', target: factory }) + const tokens = await api.multiCall({ abi: 'address:asset', calls: vaults }) + return { vaults, tokens } + } + + module.exports[chain] = { + tvl: async (api) => { + const { vaults, tokens } = await getVaults(api) + return sumTokens2({ api, tokensAndOwners2: [tokens, vaults], permitFailure: true }) + }, + borrowed: async (api) => { + const { vaults, tokens } = await getVaults(api) + const borrows = await api.multiCall({ abi: 'uint256:totalBorrows', calls: vaults }) + api.add(tokens, borrows) + }, + } +}) diff --git a/projects/euphoria/index.js b/projects/euphoria/index.js index 77a2cc1358..32bf250bf1 100644 --- a/projects/euphoria/index.js +++ b/projects/euphoria/index.js @@ -1,6 +1,5 @@ const { staking } = require('../helper/staking'); -const { sumTokensAndLPsSharedOwners } = require('../helper/unwrapLPs'); -const { getChainTransform } = require('../helper/portedTokens'); +const { sumTokensExport } = require('../helper/unwrapLPs'); const wagmiAddresses = { staking: '0x95066025af40F7f7832f61422802cD1e13C23753', @@ -22,33 +21,17 @@ const wagmiReserves = { }, }; -async function tvl(time, ethBlock, {harmony: block}) { - const balances = {}; - const transform = await getChainTransform('harmony'); - - await sumTokensAndLPsSharedOwners( - balances, - [ - [wagmiReserves.single.dai, false], - [wagmiReserves.lp.wagmiDai, true], - [wagmiReserves.single.ust, false], - [wagmiReserves.lp.wagmiUst, true], - [wagmiReserves.single.usdc, false], - [wagmiReserves.single.busd, false], - [wagmiReserves.lp.wagmiOne, true], - ], - [wagmiAddresses.treasury], - block, - 'harmony', - transform - ); - - return balances; -} - module.exports = { harmony: { - tvl, + tvl: sumTokensExport({owners: [wagmiAddresses.treasury], tokens: [ + wagmiReserves.single.dai, + wagmiReserves.lp.wagmiDai, + wagmiReserves.single.ust, + wagmiReserves.lp.wagmiUst, + wagmiReserves.single.usdc, + wagmiReserves.single.busd, + wagmiReserves.lp.wagmiOne, + ], resolveLP: true,}), staking: staking(wagmiAddresses.staking, wagmiAddresses.wagmi), }, methodology: diff --git a/projects/evaa/index.js b/projects/evaa/index.js index 1913a9c214..045a507bbd 100644 --- a/projects/evaa/index.js +++ b/projects/evaa/index.js @@ -1,11 +1,13 @@ const { sumTokensExport } = require("../helper/chain/ton"); const ADDRESSES = require("../helper/coreAssets.json"); -const evaaScAddr = "EQC8rUZqR_pWV1BylWUlPNBzyiTYVoBEmQkMIQDZXICfnuRr" +const evaaMainPool = "EQC8rUZqR_pWV1BylWUlPNBzyiTYVoBEmQkMIQDZXICfnuRr" +const evaaLpPool = "EQBIlZX2URWkXCSg3QF2MJZU-wC5XkBoLww-hdWk2G37Jc6N" +const evaaAltsPool = "EQANURVS3fhBO9bivig34iyJQi97FhMbpivo1aUEAS2GYSu-"; module.exports = { methodology: 'Counts EVAA smartcontract balance as TVL.', ton: { - tvl: sumTokensExport({ owner: evaaScAddr, tokens: [ADDRESSES.null]}), + tvl: sumTokensExport({ owners: [evaaMainPool, evaaLpPool, evaaAltsPool], tokens: [ADDRESSES.null]}), } } diff --git a/projects/everdex/index.js b/projects/everdex/index.js index cf025fc2d0..07bbb757ff 100644 --- a/projects/everdex/index.js +++ b/projects/everdex/index.js @@ -26,7 +26,7 @@ const uniTVL = getUniTVL({ factory: '0x19f21b0AB98EC10d734E314356Ad562ae349177d' module.exports = { misrepresentedTokens: true, - start: 1674864000, + start: '2023-01-28', bfc: { tvl: sdk.util.sumChainTvls([tvl, uniTVL]) }, diff --git a/projects/evmoswap/index.js b/projects/evmoswap/index.js index 9977c6b241..6b6d3fb9d8 100644 --- a/projects/evmoswap/index.js +++ b/projects/evmoswap/index.js @@ -1,14 +1,10 @@ const ADDRESSES = require('../helper/coreAssets.json') const sdk = require('@defillama/sdk'); -const { getChainTransform} = require("../helper/portedTokens") const { getUniTVL } = require('../helper/unknownTokens') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const madDAI = ADDRESSES.evmos.DAI const madUSDC = ADDRESSES.evmos.USDC const madUSDT = ADDRESSES.evmos.USDT -const madWETH = ADDRESSES.evmos.WETH -const madWBTC = ADDRESSES.evmos.WBTC //////////////////////////// UNI AMM //////////////////////////////////// const evmoswapTvl = getUniTVL({ factory: '0xF24E36e53628C3086493B9EfA785ab9DD85232EB', useDefaultCoreAssets: true }) @@ -18,25 +14,10 @@ const poolAddressesEvmos = [ "0xf0a5b0fa1531C94754241911A2E6D94506336321", // 3pool ]; -async function stableAMMTvl(timestamp, chainBlocks) { - const balances = {}; - const transformAddress = await getChainTransform("evmos"); - await sumTokensAndLPsSharedOwners( - balances, - [ - [madDAI, false], - [madUSDC, false], - [madUSDT, false], - ], - poolAddressesEvmos, - chainBlocks["evmos"], - "evmos", - transformAddress - ); - return balances; +async function stableAMMTvl(api) { + return api.sumTokens({owners: poolAddressesEvmos, tokens: [madDAI, madUSDC, madUSDT]}) } - module.exports = { misrepresentedTokens: true, methodology: @@ -44,4 +25,4 @@ module.exports = { evmos: { tvl: sdk.util.sumChainTvls([evmoswapTvl, stableAMMTvl]), }, -}; // node test.js projects/evmoswap/index.js +} diff --git a/projects/evolve/index.js b/projects/evolve/index.js index e2e4dc67df..d1f936ffa9 100644 --- a/projects/evolve/index.js +++ b/projects/evolve/index.js @@ -6,6 +6,10 @@ const config = { }, }; -module.exports = {} +module.exports = { + deadFrom: '2023-02-27', +} tarotHelper(module.exports, config, { tarotSymbol: 'vEvolve'}) + +module.exports.cronos.borrowed = () => ({}) // bad debt diff --git a/projects/exmo/index.js b/projects/exmo/index.js new file mode 100644 index 0000000000..f830a3aced --- /dev/null +++ b/projects/exmo/index.js @@ -0,0 +1,21 @@ +const { cexExports } = require('../helper/cex') + +const config = { + ethereum: { + owners: [ + '0x7029B8aaE2399a9f4B82d4516D6D16A35A52ff2e', + ], + }, + doge: { + owners: [ + 'DC1GBAsLTJMvShigDk4UR3oVnkmiH4xaoE', + ] + }, + ripple: { + owners: [ + 'rDfvwaonnG198FJKiugQDn96kVW4Ej6bUX', + ] + }, +} + +module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/exsat-credit-staking/index.js b/projects/exsat-credit-staking/index.js new file mode 100644 index 0000000000..ba7b48d24c --- /dev/null +++ b/projects/exsat-credit-staking/index.js @@ -0,0 +1,13 @@ +const { sumTokens } = require("../helper/chain/bitcoin"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js'); + +async function tvl() { + return sumTokens({ owners: await bitcoinAddressBook.exsatCreditStaking() }) +} + +module.exports = { + doublecounted: true, + methodology: 'TVL is based on Bitcoin addresses in the exSat credit staking contract, summing their associated Bitcoin balances.', + start: '2024-10-23', + bitcoin: { tvl }, +}; diff --git a/projects/exsat/index.js b/projects/exsat/index.js new file mode 100644 index 0000000000..0edca69310 --- /dev/null +++ b/projects/exsat/index.js @@ -0,0 +1,11 @@ +const { sumTokens } = require("../helper/chain/bitcoin"); +const bitcoinBook = require('../helper/bitcoin-book'); + +async function tvl(api) { + return sumTokens({ owners: await bitcoinBook.exsatBridge() }); +} + +module.exports = { + methodology: 'TVL for the exSat Bridge represents the total balance in custody BTC addresses, reflecting BTC assets bridged to the exSat network.', + bitcoin: { tvl }, +}; diff --git a/projects/extra-xlend/index.js b/projects/extra-xlend/index.js new file mode 100644 index 0000000000..033f5d7c16 --- /dev/null +++ b/projects/extra-xlend/index.js @@ -0,0 +1,11 @@ +const { aaveExports } = require("../helper/aave"); + +const config = { + optimism: { + dataProvider: '0xCC61E9470B5f0CE21a3F6255c73032B47AaeA9C0', + }, +} + +Object.keys(config).forEach((chain) => { + module.exports[chain] = aaveExports(chain, undefined, undefined, [config[chain].dataProvider], { v3: true }); +}); \ No newline at end of file diff --git a/projects/ezkalibur/index.js b/projects/ezkalibur/index.js index 2b61648181..90704dea8b 100644 --- a/projects/ezkalibur/index.js +++ b/projects/ezkalibur/index.js @@ -7,9 +7,9 @@ const SWORD_WETH_LP = '0xc8b6b3a4d2d8428ef3a940eac1e32a7ddadcb0f1' module.exports = { misrepresentedTokens: true, - start: 1686309181, + start: '2023-06-09', era: { - tvl: getUniTVL({ factory: '0x15C664A62086c06D43E75BB3fddED93008B8cE63', useDefaultCoreAssets: true,fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x15C664A62086c06D43E75BB3fddED93008B8cE63', useDefaultCoreAssets: true, }), staking: stakingPricedLP(xSWORD,SWORD_TOKEN,'era',SWORD_WETH_LP,'weth') }, }; \ No newline at end of file diff --git a/projects/fMoney/index.js b/projects/fMoney/index.js index 62d674259f..9cf60bbb67 100644 --- a/projects/fMoney/index.js +++ b/projects/fMoney/index.js @@ -1,24 +1,30 @@ - const { compoundExports2 } = require('../helper/compound') -const { sumBalancerLps } = require('../helper/unwrapLPs') - -const addresses = { - beetsVault: "0x8166994d9ebBe5829EC86Bd81258149B87faCfd3", - fuBUX: "0xcf211d1022f0B1aEC7CbAdCa1472fc20E6dFe3c6", - fBUX80lzUSDC20: "0x2ddcd6916ee7ccc6300cb0fe2919a341be0ee8bb" -} - -async function staking(api) { - return sumBalancerLps({}, [[addresses.fBUX80lzUSDC20, addresses.beetsVault]], 0, 0, undefined, api) -} +const { unwrapBalancerToken } = require('../helper/unwrapLPs') const config = { - fantom: '0xB911d8064c0AA338241f349eD802Ad4bae6ec034', + fantom: { + unitroller: '0xB911d8064c0AA338241f349eD802Ad4bae6ec034', + stakingPool: '0x9426d9077620efaae688d3c3b398fa814406ce4a', + owner: '0x6B0B150A7a37b1E592F553E2b7D71d6D1439dc57' + }, + sonic: { + unitroller: '0xd41e9fa6EC7A33f0A6AAE5E9420c9D60eC1727e4', + stakingPool: '0x3ec8254006658e11f9ab5eaf92d64f8528d09057', + owner: '0x44ece28720dbe441bbf1363e17b0cd71839090c8' + } } +async function staking(api) { + await unwrapBalancerToken({ + api, + balancerToken: config[api.chain].stakingPool, + owner: config[api.chain].owner, + isV2: true + }) + return api.getBalances() +} Object.keys(config).forEach(chain => { - module.exports[chain] = compoundExports2({ comptroller: config[chain] }) -}); - -module.exports.fantom.staking = staking \ No newline at end of file + module.exports[chain] = compoundExports2({ comptroller: config[chain].unitroller }) + module.exports[chain].staking = staking +}) \ No newline at end of file diff --git a/projects/fantOHM/index.js b/projects/fantOHM/index.js index 4ef7e40e40..390b2b42fd 100644 --- a/projects/fantOHM/index.js +++ b/projects/fantOHM/index.js @@ -1,8 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk"); const {staking} = require("../helper/staking"); -const {sumTokensAndLPsSharedOwners} = require("../helper/unwrapLPs"); -const index = require('./index.json') +const { sumTokens2} = require("../helper/unwrapLPs"); const MasterChefBeets = require('./MasterChefBeets.json') const BalancerVaultBeets = require('./BalancerVaultBeets.json') const BalancerWeightedPoolBeets = require('./BalancerWeightedPoolBeets.json') @@ -14,70 +13,33 @@ const fantomTreasuryContract = "0xA3b52d5A6d2f8932a5cD921e09DA840092349D71"; const moonriverFhm = "0xfa1FBb8Ef55A4855E5688C0eE13aC3f202486286"; const moonriverStaking = "0xF5C7D63C5Fc0aD4b7Cef7d8904239860725Ebc87"; const moonriverTreasuryContract = "0x5E983ff70DE345de15DbDCf0529640F14446cDfa"; -const ethTreasuryContract = "0x9042E869BedCD2BB3EEa241aC0032cadAE8DF006"; // addreses of gnosis safe's according to: https://fantohm.com/#security const fantomGnosisContract = "0x34F93b12cA2e13C6E64f45cFA36EABADD0bA30fC"; -const moonriverGnosisContract = "0xE3CD5475f18a97D3563307B4e1A6467470237927"; const ethGnosisContract = "0x66a98CfCd5A0dCB4E578089E1D89134A3124F0b1"; const bscGnosisContract = "0x3538Acb37Cf5a92eBE7091714975b2f8dDd5c6C1"; const fantohmDaoDeployerWallet = "0x3381e86306145b062cEd14790b01AC5384D23D82"; -const ethTradfi3mContract = "0xCD8A46dC7EE4488b441Ae1CD3b5BCa48d5389C12"; -const ethTradfi6mContract = "0xD9fDd86ecc03e34DAf9c645C40DF670406836816"; -const ftmTradfi3mContract = "0xEFbe7fe9E8b407a3F0C0451E7669E70cDD0C4C77"; -const ftmTradfi6mContract = "0xB1c77436BC180009709Be00C9e852246476321A3"; const masterChefContract = "0x4897EB3257A5391d80B2f73FB0748CCd4150b586"; -// -// Moonriver TVL should consist of - treasury value and investments on gnosis safe -// -const movr_transforms = { - "0x748134b5f553f2bcbd78c6826de99a70274bdeb3": "ethereum:" + ADDRESSES.ethereum.USDC, // USDC - "0xe936caa7f6d9f5c9e907111fcaf7c351c184cda7": "ethereum:" + ADDRESSES.ethereum.USDT, // USDT - "0xfa1fbb8ef55a4855e5688c0ee13ac3f202486286": "fantom:0xfa1FBb8Ef55A4855E5688C0eE13aC3f202486286", // FHM -} - -async function moonriverTvl(timestamp, block, chainBlocks) { - let balances = {}; - block = chainBlocks.moonriver - // treasury value - await sumTokensAndLPsSharedOwners(balances, [ - ["0x748134b5f553f2bcbd78c6826de99a70274bdeb3", false], // USDC.m - ["0xE936CAA7f6d9F5C9e907111FCAf7c351c184CDA7", false], // USDT.m - ["0x0b6116bb2926d996cdeba9e1a79e44324b0401c9", true], // HB LP - ], [moonriverTreasuryContract], block, "moonriver", - addr => (movr_transforms[addr.toLowerCase()] ? movr_transforms[addr.toLowerCase()] : `moonriver:${addr}`)); - - // investments - await Promise.all([ - balanceOf(moonriverGnosisContract, "0x98878B06940aE243284CA214f92Bb71a2b032B8A", "moonriver:0x98878B06940aE243284CA214f92Bb71a2b032B8A", balances, chainBlocks.moonriver, "moonriver"), // wMOVR - ]); - - return balances; -} - -// -// Fantom TVL should consist of - treasury value and investments on gnosis safe -// -const fantom_transforms = { - [ADDRESSES.fantom.DAI]: ADDRESSES.ethereum.DAI, // DAI - [ADDRESSES.fantom.USDC]: ADDRESSES.ethereum.USDC, // USDC +async function moonriverTvl(api) { + return sumTokens2({api, owner: moonriverTreasuryContract, tokens: [ + "0x748134b5f553f2bcbd78c6826de99a70274bdeb3", + "0xE936CAA7f6d9F5C9e907111FCAf7c351c184CDA7", + "0x0b6116bb2926d996cdeba9e1a79e44324b0401c9", + ], resolveLP: true }) } -async function fantomTvl(timestamp, _, {fantom: block}) { - let balances = {}; - - // treasury value - await sumTokensAndLPsSharedOwners(balances, [ - [ADDRESSES.fantom.DAI, false], // DAI - [ADDRESSES.fantom.WFTM, false], // wFTM - // ["0x6fc9383486c163fa48becdec79d6058f984f62ca", false], // USDB - [ADDRESSES.fantom.USDC, false], // USDC - ["0xd77fc9c4074b56ecf80009744391942fbfddd88b", true], // DAI/FHM - ], [fantomTreasuryContract], block, "fantom", - addr => (fantom_transforms[addr.toLowerCase()] ? fantom_transforms[addr.toLowerCase()] : `fantom:${addr}`)) +async function fantomTvl(api) { + let balances = api.getBalances() + const block = api.block + await sumTokens2({ api, owner: fantomTreasuryContract, tokens: [ + ADDRESSES.fantom.DAI, + ADDRESSES.fantom.WFTM, + ADDRESSES.fantom.USDC, + "0xd77fc9c4074b56ecf80009744391942fbfddd88b", + ], resolveLP: true }) // treasury values await Promise.all([ diff --git a/projects/farmix/index.js b/projects/farmix/index.js new file mode 100644 index 0000000000..4fa1c6baec --- /dev/null +++ b/projects/farmix/index.js @@ -0,0 +1,58 @@ +const { sleep } = require('../helper/utils') +const { call } = require('../helper/chain/ton'); +const plimit = require("p-limit"); +const ADDRESSES = require('../helper/coreAssets.json'); + +const _rateLimited = plimit(1) +const rateLimited = fn => (...args) => _rateLimited(() => fn(...args)) +const getPoolJettonsRateLimited = rateLimited(getPoolCurrentJettons); + + +const POOLS = [ + 'EQC-jlX83DYZgSWRW5q_XuHLWWFQPp2xGmc8BCoeWckKpeHs', // native TON + 'EQD6gQSWCayHh0FvUnTXlpfizIWiq7UeE4gYvXGYtEhIYJ8q', // USDT + 'EQCE_6TevKEpj8OTz3rZt1D5bR6fENQbSN2bbW0jzxbWGGIo', // NOT + 'EQDuM7dM6mw0vAMurdY0hTNREenlZR1yCurqqo99q3o42nCi', // stTON + 'EQC2HxXptnU7vstREZOHyheGTafnFNSlVus5Iwd8Ik89Q7dD' // tsTON +] + +const UNDERLYING_JETTONS = [ + ADDRESSES.ton.TON, + ADDRESSES.ton.USDT, + ADDRESSES.ton.NOT, + ADDRESSES.ton.TON, + ADDRESSES.ton.TON, +] + + +async function getPoolCurrentJettons(api, poolAddr, underlyingJettonAddr, isBorrowed) { + const result = await call({ + target: poolAddr, + abi: 'get_expected_state', + params: [['num', 0]] + }); + await sleep(1000 * (2 * Math.random() + 3)); + const jettonCurrentAmount = isBorrowed ? result[6] : result[5]; + api.add(underlyingJettonAddr, jettonCurrentAmount); +} + +async function tvl(api) { + await Promise.all(POOLS.map(async (poolAddr, i) => { + return getPoolJettonsRateLimited(api, poolAddr, UNDERLYING_JETTONS[i]); + })) +} + +async function borrowed(api) { + await Promise.all(POOLS.map(async (poolAddr, i) => { + return getPoolJettonsRateLimited(api, poolAddr, UNDERLYING_JETTONS[i], true); + })) +} + +module.exports = { + methodology: 'TVL is counted only as current available pool liquidity. Borrowed jettons not included in the tvl', + timetravel: false, + ton: { + tvl, + borrowed, + } +} \ No newline at end of file diff --git a/projects/fastex/index.js b/projects/fastex/index.js index f86b57f052..34c9d1bfb2 100644 --- a/projects/fastex/index.js +++ b/projects/fastex/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -8,9 +9,7 @@ const config = { ], }, bitcoin: { - owners: [ - 'bc1qs7yen7ljpvyw7vn58ql6zfaddqf4rcjalsgmt5' - ] + owners: bitcoinAddressBook.fastex }, tron: { owners: [ diff --git a/projects/fbtc/index.js b/projects/fbtc/index.js index 217c5c55e5..2a2bb3173e 100644 --- a/projects/fbtc/index.js +++ b/projects/fbtc/index.js @@ -1,33 +1,11 @@ const { sumTokens } = require('../helper/chain/bitcoin') -const sdk = require('@defillama/sdk') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const staticAddresses = [ - 'bc1qr5nz7n8ulcdz0w3s6fska80fawxhvqlh273qypm3rkjequ9wpmhs65ppw7', - 'bc1qhu98nf6ddz6ja73rn72encdr8ezsyhexwpdzap0vcs7lg2wpmrnq5ygfsl', - 'bc1qg6asmzjr7nr5f5upg3xqyrdxl2tq8ef58hha7t0s82mzzx6zjxesyccp4h', - 'bc1qxe3md4lehg8gmrlx3e8xqju5mytt266l4hcy8khl6tm5mahghmeqtxlgqq', - 'bc1qy48h0kuv0r3e330wjfs6r74sk49pkzumnm907t5mhqjxml22r3ss2ucuxc', - '32DgQPVHSV6FSxLnw68nggvchp3ZNKquxA', - // https://docs.fbtc.com/security/bitcoin-reserve-address - 'bc1q7jgulg69frc8zuzy0ng8d5208kae7t0twyfjwm', - 'bc1q6c3c0t3zvnphce37ufr4yz9veaqvew2wg0shwr', - '3HjNJWcn2ayFLikzmKRaFtcbLufYChQo3T', - '374vhN24WryvNWUUZR2uDAnL4oNP5EW4qR', -] -const abi = { - getQualifiedUserInfo: "function getQualifiedUserInfo(address _user) view returns ((bool locked, string depositAddress, string withdrawalAddress) info)", -} async function tvl() { - const api = new sdk.ChainApi({ chain: 'ethereum' }) - const users = await api.call({ abi: 'address[]:getQualifiedUsers', target: '0xbee335BB44e75C4794a0b9B54E8027b111395943' }) - const userInfos = await api.multiCall({ abi: abi.getQualifiedUserInfo, target: '0xbee335BB44e75C4794a0b9B54E8027b111395943', calls: users }) - userInfos.forEach(i => staticAddresses.push(i.depositAddress)) - return sumTokens({ owners: staticAddresses }) + return sumTokens({ owners: await bitcoinAddressBook.fbtc() }) } module.exports = { timetravel: false, - bitcoin: { - tvl, - } + bitcoin: { tvl } } diff --git a/projects/fedex/index.js b/projects/fedex/index.js index b32d4f1ec2..f66baf6dcb 100644 --- a/projects/fedex/index.js +++ b/projects/fedex/index.js @@ -6,7 +6,6 @@ module.exports = { tvl: getUniTVL({ factory: "0xfb3AD00B272449AF3ea44e5C6ADbdfaB1655A046", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/fei/index.js b/projects/fei/index.js index 1c8b547d12..7eb9e75f94 100644 --- a/projects/fei/index.js +++ b/projects/fei/index.js @@ -1,11 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { sumTokensAndLPsSharedOwners } = require('../helper/unwrapLPs') +const { nullAddress, sumTokens2 } = require('../helper/unwrapLPs'); -const weth = ADDRESSES.ethereum.WETH - -async function tvl(timestamp, block) { - const balances = {} +async function tvl(api) { const owners = [ '0xBFfB152b9392e38CdDc275D818a3Db7FE364596b', // GenesisGroup.sol [OLD] '0xa08A721dFB595753FFf335636674D76C455B275C', // EthReserveStabilizer.sol [OLD] @@ -46,30 +42,24 @@ async function tvl(timestamp, block) { // Holders of DPI in Fuse pool 19 '0x3dD3d945C4253bAc5B4Cc326a001B7d3f9C4DD66', // DpiFusePcvDeposit.sol ] - await sumTokensAndLPsSharedOwners(balances, [ - ['0x94b0a3d511b6ecdb17ebf877278ab030acb0a878', true], // FEI-ETH Uni V2 LP (NOTE: this counts both FEI and ETH, but only the FEI doesn't count as PCV) - [ADDRESSES.ethereum.STETH, false], // stETH - ['0x030ba81f1c18d280636f32af80b9aad02cf0854e', false], // aWETH - ['0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5', false], // cETH - ['0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643', false], // cDAI - ['0x0954906da0Bf32d5479e25f46056d22f08464cab', false], // INDEX - ['0xc9BC48c72154ef3e5425641a3c747242112a46AF', false], // aRAI - ['0x752F119bD4Ee2342CE35E2351648d21962c7CAfE', false], // RAI in Fuse pool 9 - ['0x8775aE5e83BC5D926b6277579c2B0d40c7D9b528', true], // FEI-DPI Sushi LP (NOTE: this counts both the FEI and the DPI, but only the FEI doesn't count as PCV) - ['0xF06f65a6b7D2c401FcB8B3273d036D21Fe2a5963', false], // DPI in Fuse pool 19 - ], owners, block) - const directETH = await sdk.api.eth.getBalances({ - targets: owners, - block - }) - directETH.output.forEach(eth => { - sdk.util.sumSingleBalance(balances, weth, eth.balance) - }) - return balances + const tokens = [ + '0x94b0a3d511b6ecdb17ebf877278ab030acb0a878', // FEI-ETH Uni V2 LP (NOTE: this counts both FEI and ETH, but only the FEI doesn't count as PCV) + ADDRESSES.ethereum.STETH, // stETH + '0x030ba81f1c18d280636f32af80b9aad02cf0854e', // aWETH + '0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5', // cETH + '0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643', // cDAI + '0x0954906da0Bf32d5479e25f46056d22f08464cab', // INDEX + '0xc9BC48c72154ef3e5425641a3c747242112a46AF', // aRAI + '0x752F119bD4Ee2342CE35E2351648d21962c7CAfE', // RAI in Fuse pool 9 + '0x8775aE5e83BC5D926b6277579c2B0d40c7D9b528', // FEI-DPI Sushi LP (NOTE: this counts both the FEI and the DPI, but only the FEI doesn't count as PCV) + '0xF06f65a6b7D2c401FcB8B3273d036D21Fe2a5963', // DPI in Fuse pool 19 + nullAddress + ] + return sumTokens2({ api, owners, tokens, }) } module.exports = { - ethereum: { tvl }, + ethereum: { tvl }, }; module.exports.hallmarks = [ [1651325520, "Exploit $80M FEI"], diff --git a/projects/fenrirfinance/index.js b/projects/fenrirfinance/index.js index c4b9cbd318..fe038d5f56 100644 --- a/projects/fenrirfinance/index.js +++ b/projects/fenrirfinance/index.js @@ -1,11 +1,3 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const {fullCoumpoundExports} = require('../helper/compound'); +const { compoundExports2 } = require('../helper/compound'); -const replace = { - [ADDRESSES.bsc.BETH]: ADDRESSES.ethereum.WETH, // beth->weth - "0xfb6115445bff7b52feb98650c87f44907e58f802": ADDRESSES.ethereum.AAVE, // aave -} - -module.exports = fullCoumpoundExports("0x56b4B49f31517be8DacC2ED471BCc20508A0e29D", "bsc", "0x444ADC2D487090A660ebFdDd934d0E962410d8Cc", ADDRESSES.bsc.WBNB, addr=>{ - return replace[addr.toLowerCase()] || `bsc:${addr}` -}) +module.exports.bsc = compoundExports2({ comptroller: '0x56b4B49f31517be8DacC2ED471BCc20508A0e29D' }) diff --git a/projects/ferdyflip/index.js b/projects/ferdyflip/index.js index e6242ae519..4cd1250d46 100644 --- a/projects/ferdyflip/index.js +++ b/projects/ferdyflip/index.js @@ -16,7 +16,7 @@ const config = { Object.keys(config).forEach((chain) => { module.exports[chain] = { - start: 1675962000, //Fri Feb 10 2023 + start: '2023-02-09', //Fri Feb 10 2023 tvl: sumTokensExport(config[chain]), }; }); diff --git a/projects/ferro/index.js b/projects/ferro/index.js index 007b21fc25..2b99bf4c3d 100644 --- a/projects/ferro/index.js +++ b/projects/ferro/index.js @@ -25,7 +25,7 @@ const tokens = { SWAP_LCRO_WCRO_ADDRESSES, ], // WCRO - "0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23": [ + [ADDRESSES.cronos.WCRO_1]: [ SWAP_LCRO_WCRO_ADDRESSES, ], // LATOM-ATOM @@ -41,7 +41,7 @@ async function tvl(api) { module.exports = { methodology: 'sum of ferro stablecoin pool contracts balance', - start: 1651218360, + start: '2022-04-29', cronos: { tvl, } diff --git a/projects/fiatdao/index.js b/projects/fiatdao/index.js index 8c9c9e7e6f..d50accceba 100644 --- a/projects/fiatdao/index.js +++ b/projects/fiatdao/index.js @@ -1,9 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk") -const { default: BigNumber } = require("bignumber.js") const abi = require('./abi.json') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs") +const { sumTokens2, } = require("../helper/unwrapLPs") const { getConfig } = require('../helper/cache') @@ -14,76 +12,42 @@ const YFI = ADDRESSES.ethereum.YFI const MKR = ADDRESSES.ethereum.MKR const BOND = "0x0391D2021f89DC339F60Fff84546EA23E337750f" const UMA = "0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828" -const GOHM = "0x0ab87046fbb341d058f17cbc4c1133f25a20a52f" const WSOHM = "0xca76543cf381ebbb277be79574059e32108e3e65" const WSOHM_FDT_SLP = "0x2e30e758b3950dd9afed2e21f5ab82156fbdbbba" const FDT_GOHM = "0x75b02b9889536B617d57D08c1Ccb929c523945C1" -const LUSD = ADDRESSES.ethereum.LUSD -const LUSD3CRV = '0xEd279fDD11cA84bEef15AF5D39BB4d4bEE23F0cA' - -function resolveUnderlier(underlier) { - if (underlier == LUSD3CRV) return LUSD - return underlier -} - -// Launch Ceremony -async function launchCeremonyTVL(timestamp, block) { - const balances = {} - - await sumTokensAndLPsSharedOwners( - balances, - [ - [WSOHM, false], - [RGT, false], - [YFI, false], - [MKR, false], - [BOND, false], - [UMA, false], - [WSOHM_FDT_SLP, true], - [FDT_GOHM, true], - ], - [STAKING_CONTRACT, STAKING_NFT], - block, - "ethereum", - (addr) => { - if (addr.toLowerCase() === WSOHM.toLowerCase()) return GOHM - return addr - } - ) - - return balances -} - // Protocol TVL -async function tvl(timestamp, block) { - if (block && block < 14928955 ) return {}; - const balances = {}; +async function tvl(api) { + + // Launch Ceremony + await sumTokens2({ api, owners: [STAKING_CONTRACT, STAKING_NFT], tokens: [RGT, YFI, MKR, BOND, UMA, WSOHM_FDT_SLP, FDT_GOHM,], resolveLP: true }) + const wsOHMBal = await api.call({ abi: 'erc20:balanceOf', target: WSOHM, params: STAKING_CONTRACT }) + api.add('0x0ab87046fbb341d058f17cbc4c1133f25a20a52f', wsOHMBal) const metadata = (await getConfig('fiatdao', 'https://raw.githubusercontent.com/fiatdao/changelog/main/metadata/metadata-mainnet.json')) const allVaults = Object.keys(metadata) - const { output: tokensAll } = await sdk.api.abi.multiCall({ abi: abi.token, calls: allVaults.map(i => ({ target: i })), block, }) + const tokensAll = await api.multiCall({ abi: abi.token, calls: allVaults, }) const tokens = [] const vaults = [] - tokensAll.forEach(({ output, input: { target } }) => { + tokensAll.forEach((output, i) => { if (output !== ADDRESSES.null) { - vaults.push(target) + vaults.push(allVaults[i]) tokens.push(output) } }) - const vaultCalls = vaults.map(i => ({ target: i })) - const { output: tokenScales } = await sdk.api.abi.multiCall({ abi: abi.tokenScale, calls: vaultCalls, block, }) - const { output: underliers } = await sdk.api.abi.multiCall({ abi: abi.underlierToken, calls: vaultCalls, block, }) - const { output: underlierScales } = await sdk.api.abi.multiCall({ abi: abi.underlierScale, calls: vaultCalls, block, }) + const tokenScales = await api.multiCall({ abi: abi.tokenScale, calls: vaults, }) + const underliers = await api.multiCall({ abi: abi.underlierToken, calls: vaults, }) + const underlierScales = await api.multiCall({ abi: abi.underlierScale, calls: vaults, }) const erc20Metadata = [] const erc1155Metadata = [] - underliers.forEach(({ output: token, input: { target: vault } }, i) => { - const underlier = resolveUnderlier(token) - const scale = BigNumber(underlierScales[i].output / (tokenScales[i].output * 1e18)) + underliers.forEach((token, i) => { + const underlier = token + const vault = vaults[i] + const scale = underlierScales[i] / (tokenScales[i] * 1e18) metadata[vault].tokenIds.forEach(id => { if (id === '0') { erc20Metadata.push({ vault, scale, underlier, tokenCall: { target: tokens[i], params: vault }, priceCall: { target: vault, params: [0, false, false] } }) @@ -93,27 +57,29 @@ async function tvl(timestamp, block) { }) }) - const { output: erc20Balances } = await sdk.api.abi.multiCall({ abi: 'erc20:balanceOf', calls: erc20Metadata.map(i => i.tokenCall), block, }) - const { output: erc20Prices } = await sdk.api.abi.multiCall({ abi: abi.fairPrice, calls: erc20Metadata.map(i => i.priceCall), block, }) - const { output: erc1155Balances } = await sdk.api.abi.multiCall({ abi: abi.balanceOf, calls: erc1155Metadata.map(i => i.tokenCall), block, }) - const { output: erc1155Prices } = await sdk.api.abi.multiCall({ abi: abi.fairPrice, calls: erc1155Metadata.map(i => i.priceCall), block, }) + const erc20Balances = await api.multiCall({ abi: 'erc20:balanceOf', calls: erc20Metadata.map(i => i.tokenCall), }) + const erc20Prices = await api.multiCall({ abi: abi.fairPrice, calls: erc20Metadata.map(i => i.priceCall), }) + const erc1155Balances = await api.multiCall({ abi: abi.balanceOf, calls: erc1155Metadata.map(i => i.tokenCall), permitFailure: true}) + const erc1155Prices = await api.multiCall({ abi: abi.fairPrice, calls: erc1155Metadata.map(i => i.priceCall), permitFailure: true }) - erc20Balances.forEach(({ output, }, i) => { - sdk.util.sumSingleBalance(balances, erc20Metadata[i].underlier, erc20Metadata[i].scale.times(output).times(erc20Prices[i].output).toFixed(0)) + erc20Balances.forEach((output, i) => { + api.add(erc20Metadata[i].underlier, erc20Metadata[i].scale * output * erc20Prices[i]) }) - erc1155Balances.forEach(({ output, }, i) => { - sdk.util.sumSingleBalance(balances, erc1155Metadata[i].underlier, erc1155Metadata[i].scale.times(output).times(erc1155Prices[i].output).toFixed(0)) + erc1155Balances.forEach((output, i) => { + if (!output || !erc1155Prices[i]) { + return; + } + api.add(erc1155Metadata[i].underlier, erc1155Metadata[i].scale * output * erc1155Prices[i]) }) - return balances } module.exports = { misrepresentedTokens: true, methodology: 'TVL includes fair value of collateral backing outstanding $FIAT and the initial FDT Jubilee event', - ethereum: { tvl: sdk.util.sumChainTvls([tvl, launchCeremonyTVL]) }, - hallmarks:[ + ethereum: { tvl }, + hallmarks: [ [1635959960, "FDT Jubilee starts"], [1639380013, "FDT Jubilee ends"], [1649604096, "Protocol Launch"] diff --git a/projects/filament/index.js b/projects/filament/index.js new file mode 100644 index 0000000000..d188e10297 --- /dev/null +++ b/projects/filament/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/unwrapLPs"); + +const USDC_CONTRACT = '0x3894085Ef7Ff0f0aeDf52E2A2704928d1Ec074F1'; +const FILAMENT_VAULT_CONTRACT = '0xbeB6A6273c073815eBe288d2dF4e5E8bc027DA11'; +const FILAMENT_DEPOSIT_CONTRACT = '0x894DE0011C0d69BCa2e19c21CD246C17A8A4252e'; + +module.exports = { + sei: { + tvl: sumTokensExport({ owners: [FILAMENT_VAULT_CONTRACT, FILAMENT_DEPOSIT_CONTRACT], tokens: [USDC_CONTRACT] }), + }, +} diff --git a/projects/filda/abi.json b/projects/filda/abi.json deleted file mode 100644 index 5181f2371d..0000000000 --- a/projects/filda/abi.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "markets": "function markets(address) view returns (bool isSupported, uint256 blockNumber, address interestRateModel, uint256 totalSupply, uint256 supplyRateMantissa, uint256 supplyIndex, uint256 totalBorrows, uint256 borrowRateMantissa, uint256 borrowIndex)", - "totalBorrows": "uint256:totalBorrows", - "borrowRatePerBlock": "uint256:borrowRatePerBlock", - "supplyRatePerBlock": "uint256:supplyRatePerBlock", - "underlying": "address:underlying", - "getCash": "uint256:getCash", - "getAllMarkets": "address[]:getAllMarkets" -} \ No newline at end of file diff --git a/projects/filda/index.js b/projects/filda/index.js index ce4e00009b..d23a4c8960 100644 --- a/projects/filda/index.js +++ b/projects/filda/index.js @@ -1,145 +1,15 @@ -const ADDRESSES = require('../helper/coreAssets.json') +const { compoundExports2 } = require('../helper/compound'); -const sdk = require('@defillama/sdk'); -const abi = require('./abi.json'); -const { unwrapUniswapLPs } = require('../helper/unwrapLPs') -const { compoundExportsWithDifferentBase, compoundExports, usdCompoundExports } = require('../helper/compound'); - -const comptroller = "0xb74633f2022452f377403B638167b0A135DB096d" - -// ask comptroller for all markets array -async function getAllCTokens(block) { - return (await sdk.api.abi.call({ - block, - chain: 'heco', - target: comptroller, - params: [], - abi: abi['getAllMarkets'], - })).output; -} - -async function getUnderlying(block, cToken) { - if (cToken === '0x824151251B38056d54A15E56B73c54ba44811aF8') { - return '0x6f259637dcd74c767781e37bc6133cd6a68aa161';//cHT => HT - } else { - const token = (await sdk.api.abi.call({ - block, - chain: 'heco', - target: cToken, - abi: abi['underlying'], - })).output; - return token - } -} - -function transformAddress(token) { - if (token === '0x6f259637dcd74c767781e37bc6133cd6a68aa161') { - return token - } else if (token === ADDRESSES.heco.DAI_HECO) { - return ADDRESSES.ethereum.DAI;//DAI => DAI - } else if (token === ADDRESSES.heco.USDC_HECO) { - return ADDRESSES.ethereum.USDC;//USDC => USDC - } else if (token === ADDRESSES.heco.TUSD) { - return ADDRESSES.ethereum.TUSD //TUSD - } else { - return 'heco:' + token - } -} - -// returns {[underlying]: {cToken, decimals, symbol}} -async function getMarkets(block) { - let allCTokens = await getAllCTokens(block); - const markets = [] - await ( - Promise.all(allCTokens.map(async (cToken) => { - let underlying = await getUnderlying(block, cToken); - markets.push({ underlying, cToken }) - })) - ); - - return markets; -} - -const replacements = { - "0xc2CB6B5357CcCE1B99Cd22232942D9A225Ea4eb1": { - coingecko: "bitcoin-cash-sv", - decimals: 1e18 - }, - //"heco:0x581EdD7eAb23896513360D7EE8DfE07A5Cad2aBd": "tether", - "0x6514a5Ebff7944099591Ae3e8A5c0979C83B2571": { - coingecko: "neo", - decimals: 1e8 - }, - "0x45e97daD828AD735af1dF0473fc2735F0Fd5330c": { - coingecko: "tezos", - decimals: 1e18, - } -} -function lending(borrowed) { - return async (timestamp, ethBlock, {heco: block}) => { - let balances = {}; - let markets = await getMarkets(block); - - let v2Locked = await sdk.api.abi.multiCall({ - block, - calls: markets.map((market) => ({ - target: market.cToken, - })), - chain: 'heco', - abi: borrowed ? abi.totalBorrows : abi['getCash'], - }); - - const symbols = await sdk.api.abi.multiCall({ - block, - calls: markets.map((market) => ({ - target: market.cToken, - })), - chain: 'heco', - abi: "erc20:symbol", - }); - - const lps = [] - markets.forEach((market, idx) => { - let getCash = v2Locked.output.find((result) => result.input.target === market.cToken); - const symbol = symbols.output.find((result) => result.input.target === market.cToken); - if (getCash.output === null) { - throw new Error("getCash failed") - } - if (symbol.output.endsWith("LP")) { - lps.push({ - token: market.underlying, - balance: getCash.output - }) - } else { - const replacement = replacements[market.underlying] - if (replacement === undefined) { - sdk.util.sumSingleBalance(balances, transformAddress(market.underlying), getCash.output) - } else { - sdk.util.sumSingleBalance(balances, replacement.coingecko, Number(getCash.output) / replacement.decimals) - } - } - }); - - await unwrapUniswapLPs(balances, lps, block, "heco", transformAddress) - return balances; - } -} - -// DANGER!! Oracles are not priced against USD but against other base tokens, such as IOTX module.exports = { - timetravel: true, // Impossible because getBlock will rug tho - heco: { - tvl: lending(false), - borrowed: lending(true) - }, - iotex: compoundExportsWithDifferentBase("0x55E5F6E48FD4715e1c05b9dAfa5CfD0B387425Ee", "iotex", "iotex"), - bsc: compoundExports("0xF0700A310Cb14615a67EEc1A8dAd5791859f65f1", "bsc"), - rei: compoundExportsWithDifferentBase("0xEc1e6e331e990a0D8e40AC51f773e9c998ec7BC3", "rei", "rei-network"), - polygon: compoundExports("0xfBE0f3A3d1405257Bd69691406Eafa73f5095723", "polygon"), - arbitrum: compoundExports("0xF67EF5E77B350A81DcbA5430Bc8bE876eDa8D591", "arbitrum"), - elastos: compoundExportsWithDifferentBase("0xE52792E024697A6be770e5d6F1C455550265B2CD", "elastos", "elastos"), - kava: compoundExportsWithDifferentBase("0xD2CBE89a36df2546eebc71766264e0F306d38196", "kava", "kava"), - bittorrent: compoundExportsWithDifferentBase("0xE52792E024697A6be770e5d6F1C455550265B2CD", "bittorrent", "bittorrent"), + heco: compoundExports2({ comptroller: '0xb74633f2022452f377403B638167b0A135DB096d', cether: '0x824151251b38056d54a15e56b73c54ba44811af8'}), + iotex: compoundExports2({ comptroller: '0x55E5F6E48FD4715e1c05b9dAfa5CfD0B387425Ee',}), + bsc: compoundExports2({ comptroller: '0xF0700A310Cb14615a67EEc1A8dAd5791859f65f1',}), + rei: compoundExports2({ comptroller: '0xEc1e6e331e990a0D8e40AC51f773e9c998ec7BC3',}), + polygon: compoundExports2({ comptroller: '0xfBE0f3A3d1405257Bd69691406Eafa73f5095723',}), + arbitrum: compoundExports2({ comptroller: '0xF67EF5E77B350A81DcbA5430Bc8bE876eDa8D591',}), + elastos: compoundExports2({ comptroller: '0xE52792E024697A6be770e5d6F1C455550265B2CD',}), + kava: compoundExports2({ comptroller: '0xD2CBE89a36df2546eebc71766264e0F306d38196',}), + bittorrent: compoundExports2({ comptroller: '0xE52792E024697A6be770e5d6F1C455550265B2CD',}), hallmarks: [ [Math.floor(new Date('2023-04-24')/1e3), 'Protocol was hacked'], ], diff --git a/projects/fire/index.js b/projects/fire/index.js index 9c32a5a1f6..9021e42e27 100644 --- a/projects/fire/index.js +++ b/projects/fire/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -8,12 +9,7 @@ const config = { ], }, bitcoin: { - owners: [ - 'bc1q36c0rp4ydl6uvvguhw9nr7njm49addzkgftqev', - 'bc1q3z0khuld6nd7esv46nxj9ketteqw9qz86peyeh', - 'bc1q4hz59t7v0uxujuyrhp9679uppur7ke9u3vshvd', - 'bc1qdlrh7ycyqxe62vk5m70y353vmep9ullxx5j9ar', - ] + owners: bitcoinAddressBook.fire }, ripple: { owners: [ diff --git a/projects/firefly/index.js b/projects/firefly/index.js index 144e22c91f..5e6b5086cc 100644 --- a/projects/firefly/index.js +++ b/projects/firefly/index.js @@ -1,5 +1,6 @@ const { uniV3Export } = require("../helper/uniswapV3") + module.exports = uniV3Export({ manta: { factory: "0x8666EF9DC0cA5336147f1B11f2C4fC2ecA809B95", fromBlock: 1776716, }, -}) +}) \ No newline at end of file diff --git a/projects/fisclend/index.js b/projects/fisclend/index.js new file mode 100644 index 0000000000..d5c622f229 --- /dev/null +++ b/projects/fisclend/index.js @@ -0,0 +1,13 @@ +const { compoundExports2 } = require('../helper/compound') + +module.exports = { + hallmarks: [ + [1735862400, "Rug Pull"] + ], + deadFrom: 1735862400, + apechain: compoundExports2({comptroller: '0xd11443B079D62700061F7311fC48C40B30BCEA91', cether: '0xB1974B31b60C7134978e5574F5f1fC8A16535b5D'}), + wc: compoundExports2({comptroller: '0xE3de48DCF4968B419BB55421D6B5bF2c049DaFB2', cether: '0xCD04992D1D8d42BB432AD794103c3B498016Da88'}), + sonic: compoundExports2({comptroller: '0x65E8768B86350875DDE19A791f06FfB7a4ADA71b', cether: '0x0B19823EF1F4a6B1f7c52336F428F1a92e9f645E'}), +} + +Object.keys(module.exports).forEach(key => module.exports[key].borrowed = () => ({})) \ No newline at end of file diff --git a/projects/fiva/index.js b/projects/fiva/index.js new file mode 100644 index 0000000000..0cbafa144a --- /dev/null +++ b/projects/fiva/index.js @@ -0,0 +1,12 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require("../helper/coreAssets.json"); + +const tsTON6mSyMinter = "EQAxGi9Al7hamLAORroxGkvfap6knGyzI50ThkP3CLPLTtOZ" + + +module.exports = { + methodology: 'Counts FIVA smartcontract balance as TVL.', + ton: { + tvl: sumTokensExport({ owners: [tsTON6mSyMinter], tokens: [ADDRESSES.null]}), + } +} diff --git a/projects/fixes-coins/index.js b/projects/fixes-coins/index.js index 4cf80a4fc2..7a6b5611b7 100644 --- a/projects/fixes-coins/index.js +++ b/projects/fixes-coins/index.js @@ -1,83 +1,21 @@ // Fixes Inscription Protocol - 𝔉rc20 Treasury Pool: https://fixes.world/ -const { post } = require("../helper/http"); +const { callCadence } = require("../helper/chain/flow"); let queryTVLCode = ` -import LiquidStaking from 0xd6f80565193ad727 -import stFlowToken from 0xd6f80565193ad727 -// Fixes Imports -import FRC20AccountsPool from 0xd2abb5dbf5e08666 -import FixesFungibleTokenInterface from 0xd2abb5dbf5e08666 -import FixesTokenLockDrops from 0xd2abb5dbf5e08666 -import FixesTradablePool from 0xd2abb5dbf5e08666 -import FRC20Indexer from 0xd2abb5dbf5e08666 +import FixesTVL from 0xd2abb5dbf5e08666 access(all) fun main(): UFix64 { - // singleton resource and constants - let acctsPool = FRC20AccountsPool.borrowAccountsPool() - let frc20Indexer = FRC20Indexer.getIndexer() - let stFlowTokenKey = "@".concat(Type<@stFlowToken.Vault>().identifier) - - // dictionary of addresses - let addrsDict = acctsPool.getAddresses(type: FRC20AccountsPool.ChildAccountType.FungibleToken) - // dictionary of tickers and total locked token balances - let tickerTotal: {String: UFix64} = {} - // This is the soft burned LP value which is fully locked in the BlackHole Vault - var flowLockedInBondingCurve = 0.0 - addrsDict.forEachKey(fun (key: String): Bool { - if let addr = addrsDict[key] { - // sum up all locked token balances in LockDrops Pool - if let dropsPool = FixesTokenLockDrops.borrowDropsPool(addr) { - let lockedTokenSymbol = dropsPool.getLockingTokenTicker() - tickerTotal[lockedTokenSymbol] = (tickerTotal[lockedTokenSymbol] ?? 0.0) + dropsPool.getTotalLockedTokenBalance() - } - // sum up all burned LP value in Tradable Pool - if let tradablePool = FixesTradablePool.borrowTradablePool(addr) { - flowLockedInBondingCurve = flowLockedInBondingCurve + tradablePool.getFlowBalanceInPool() - } - } - return true - }) - // sum up all locked token balances in LockDrops Pool - var totalLockingTokenTVL = 0.0 - tickerTotal.forEachKey(fun (key: String): Bool { - let lockedAmount = tickerTotal[key]! - if key == "" { - // this is locked FLOW - totalLockingTokenTVL = totalLockingTokenTVL + lockedAmount - } else if key == "fixes" { - // this is locked FIXES - let price = frc20Indexer.getBenchmarkValue(tick: "fixes") - totalLockingTokenTVL = totalLockingTokenTVL + lockedAmount * price - } else if key == stFlowTokenKey { - // this is locked stFlow - totalLockingTokenTVL = totalLockingTokenTVL + LiquidStaking.calcFlowFromStFlow(stFlowAmount: lockedAmount) - } - return true - }) - return totalLockingTokenTVL + flowLockedInBondingCurve + return FixesTVL.getAllLockedCoinFlowValue() } `; -const queryCodeBase64 = Buffer.from(queryTVLCode, "utf-8").toString("base64"); - async function tvl() { try { - const response = await post( - "https://rest-mainnet.onflow.org/v1/scripts", - { script: queryCodeBase64 }, - { - headers: { "content-type": "application/json" }, - } - ); - let resEncoded = response; - let resString = Buffer.from(resEncoded, "base64").toString("utf-8"); - let resJson = JSON.parse(resString); - let flowTokenTVL = Number(resJson.value); - + const flowTokenTVL = await callCadence(queryTVLCode, true); return { flow: flowTokenTVL }; } catch (error) { - throw new Error("Couln't query scripts of Fixes coins", error); + throw new Error("Couln't query scripts of Fixes coins. Error: " + error.message); } } diff --git a/projects/fixes-frc20-staking/index.js b/projects/fixes-frc20-staking/index.js index da5d742b81..c3c371fb1d 100644 --- a/projects/fixes-frc20-staking/index.js +++ b/projects/fixes-frc20-staking/index.js @@ -1,85 +1,23 @@ // Fixes Inscription Protocol - Staking Pool: https://fixes.world/ -const { post } = require("../helper/http"); +const { callCadence } = require("../helper/chain/flow"); let queryTVLCode = ` -import FRC20Staking from 0xd2abb5dbf5e08666 -import FRC20AccountsPool from 0xd2abb5dbf5e08666 -import FRC20Marketplace from 0xd2abb5dbf5e08666 -import FRC20Storefront from 0xd2abb5dbf5e08666 -import FRC20Indexer from 0xd2abb5dbf5e08666 +import FixesTVL from 0xd2abb5dbf5e08666 access(all) fun main(): UFix64 { - let acctsPool = FRC20AccountsPool.borrowAccountsPool() - let stakingTokens = acctsPool.getFRC20Addresses(type: FRC20AccountsPool.ChildAccountType.Staking) - - var totalTVL = 0.0 - let ticks = stakingTokens.keys - - for tick in ticks { - let stakingAddr = stakingTokens[tick]! - let stakingPool = FRC20Staking.borrowPool(stakingAddr) - if stakingPool == nil { - continue - } - - let indexer = FRC20Indexer.getIndexer() - // calculate floor price - let benchmarkPrice = indexer.getBenchmarkValue(tick: tick) - var floorPrice = benchmarkPrice - - if let marketAddr = acctsPool.getFRC20MarketAddress(tick: tick) { - if let market = FRC20Marketplace.borrowMarket(marketAddr) { - let buyPriceRanks = market.getPriceRanks(type: FRC20Storefront.ListingType.FixedPriceBuyNow) - if buyPriceRanks.length > 0 { - var i = 0 - let floorPriceRank = buyPriceRanks[i] - let listIds = market.getListedIds(type: FRC20Storefront.ListingType.FixedPriceBuyNow, rank: floorPriceRank) - if listIds.length > 0 { - if let listing = market.getListedItem( - type: FRC20Storefront.ListingType.FixedPriceBuyNow, - rank: floorPriceRank, - id: listIds[0] - ) { - if let details = listing.getDetails() { - floorPrice = details.pricePerToken() - } - } - } - } - } - } // end if - - var details = stakingPool!.getDetails() - let validStaked = details.totalStaked - details.totalUnstakingLocked - - totalTVL = totalTVL + (validStaked * (floorPrice - benchmarkPrice)) - } - return totalTVL + return FixesTVL.getAllStakedFlowValue() } `; -const queryCodeBase64 = Buffer.from(queryTVLCode, "utf-8").toString("base64"); - async function tvl() { try { - const response = await post( - "https://rest-mainnet.onflow.org/v1/scripts", - { script: queryCodeBase64 }, - { - headers: { "content-type": "application/json" }, - } - ); - let resEncoded = response; - let resString = Buffer.from(resEncoded, "base64").toString("utf-8"); - let resJson = JSON.parse(resString); - let flowTokenTVL = Number(resJson.value); - + const flowTokenTVL = await callCadence(queryTVLCode, true); return { flow: flowTokenTVL }; } catch (error) { + console.error(error.message); throw new Error( - "Couln't query scripts of fixes 𝔉rc20 treasury pool", - error + "Couln't query scripts of fixes 𝔉rc20 treasury pool. Error: " + error.message ); } } diff --git a/projects/fixes-frc20/index.js b/projects/fixes-frc20/index.js index 588f1d23d8..626d810951 100644 --- a/projects/fixes-frc20/index.js +++ b/projects/fixes-frc20/index.js @@ -1,56 +1,22 @@ // Fixes Inscription Protocol - 𝔉rc20 Treasury Pool: https://fixes.world/ -const { post } = require("../helper/http"); +const { callCadence } = require("../helper/chain/flow"); let queryTVLCode = ` -import FRC20Indexer from 0xd2abb5dbf5e08666 -import FGameLottery from 0xd2abb5dbf5e08666 -import FGameLotteryRegistry from 0xd2abb5dbf5e08666 -import FGameLotteryFactory from 0xd2abb5dbf5e08666 +import FixesTVL from 0xd2abb5dbf5e08666 access(all) fun main(): UFix64 { - let indexer = FRC20Indexer.getIndexer() - let tokens = indexer.getTokens() - var totalBalance = 0.0 - // all treasury pool balance - for tick in tokens { - let balance = indexer.getPoolBalance(tick: tick) - totalBalance = totalBalance + balance - } - // FLOW lottery jackpot balance - let registry = FGameLotteryRegistry.borrowRegistry() - let flowLotteryPoolName = FGameLotteryFactory.getFIXESMintingLotteryPoolName() - if let poolAddr = registry.getLotteryPoolAddress(flowLotteryPoolName) { - if let poolRef = FGameLottery.borrowLotteryPool(poolAddr) { - let jackpotBalance = poolRef.getJackpotPoolBalance() - totalBalance = totalBalance + jackpotBalance - } - } - return totalBalance + return FixesTVL.getAllTreasuryFlowValue() } `; -const queryCodeBase64 = Buffer.from(queryTVLCode, "utf-8").toString("base64"); - async function tvl() { try { - const response = await post( - "https://rest-mainnet.onflow.org/v1/scripts", - { script: queryCodeBase64 }, - { - headers: { "content-type": "application/json" }, - } - ); - let resEncoded = response; - let resString = Buffer.from(resEncoded, "base64").toString("utf-8"); - let resJson = JSON.parse(resString); - let flowTokenTVL = Number(resJson.value); - + const flowTokenTVL = await callCadence(queryTVLCode, true); return { flow: flowTokenTVL }; } catch (error) { throw new Error( - "Couln't query scripts of fixes 𝔉rc20 treasury pool", - error + "Couln't query scripts of fixes 𝔉rc20 treasury pool. Error: " + error.message ); } } diff --git a/projects/flashpulse/index.js b/projects/flashpulse/index.js index 3b4834e09e..46da0dcaec 100644 --- a/projects/flashpulse/index.js +++ b/projects/flashpulse/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - pulse: { tvl: getUniTVL({ factory: '0xD2871d0d39A9cb0cB0505309A5C1F521df25a987', useDefaultCoreAssets: true, fetchBalances: true, }), }, + pulse: { tvl: getUniTVL({ factory: '0xD2871d0d39A9cb0cB0505309A5C1F521df25a987', useDefaultCoreAssets: true, }), }, } \ No newline at end of file diff --git a/projects/flashstake/index.js b/projects/flashstake/index.js index f8b07fc387..a66ebba28a 100644 --- a/projects/flashstake/index.js +++ b/projects/flashstake/index.js @@ -18,7 +18,7 @@ async function getData() { module.exports = { doublecounted: true, - start: 1659312000, + start: '2022-08-01', hallmarks: [ [1659312000, "Protocol Launch"], [1666641600, "Optimism Launch"], diff --git a/projects/flex-powercity-io/index.js b/projects/flex-powercity-io/index.js index 6e6c7f8899..abca4499e3 100644 --- a/projects/flex-powercity-io/index.js +++ b/projects/flex-powercity-io/index.js @@ -18,7 +18,7 @@ const LP_FLEX_HEX_ADDRESS = "0x476d63aB94B4E86614Df0C3D5A27E9e22631D062"; const lps = [LP_HEXDC_HEX_ADDRESS, LP_FLEX_HEX_ADDRESS] module.exports = { - start: 1714534195, + start: '2024-05-01', methodology: "Total Value Locked includes all Troves, Stability Pool, Staking Pool and LP Farming Pools", pulse: { tvl: getLiquityTvl(TROVE_MANAGER_ADDRESS, { collateralToken: HEX_ADDRESS }), diff --git a/projects/flexdao/index.js b/projects/flexdao/index.js index 9e5f479df6..5ffabacb97 100644 --- a/projects/flexdao/index.js +++ b/projects/flexdao/index.js @@ -11,7 +11,6 @@ const decimals = 18 module.exports = { methodology: 'Counting all FLEX tokens staked in the DAO', - start: 2153800, [chain]: { tvl: ()=>({}), staking: staking(veFLEX, FLEX, chain, coingeckoId, decimals) diff --git a/projects/flipster/index.js b/projects/flipster/index.js index e980af38f1..3c9e1e14cb 100644 --- a/projects/flipster/index.js +++ b/projects/flipster/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -12,9 +13,7 @@ const config = { ] }, bitcoin: { - owners: [ - '31iAUikiV7yKEYBzbA1iHPcanHNsLBFe8C' - ] + owners: bitcoinAddressBook.flipster }, arbitrum: { owners: [ diff --git a/projects/float-capital/index.js b/projects/float-capital/index.js index 35632c7c60..18520aec8b 100644 --- a/projects/float-capital/index.js +++ b/projects/float-capital/index.js @@ -1,7 +1,4 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokens, unwrapCreamTokens } = require("../helper/unwrapLPs"); -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); +const { sumTokens2 } = require("../helper/unwrapLPs"); const vaults = [ "0xce5da4bebBA980BeC39da5b118750A47a23D4B85", @@ -19,68 +16,16 @@ const avaults = [ "0x47a21F14794b6229cc2a1ddfe4498C9e48f1C16c", ]; const avDAI = "0x47afa96cdc9fab46904a55a6ad4bf6660b53c38a"; -const DAI = ADDRESSES.avax.DAI; -const transforms = { - "0x47afa96cdc9fab46904a55a6ad4bf6660b53c38a": - ADDRESSES.ethereum.DAI, // avDAI - [ADDRESSES.avax.DAI]: - ADDRESSES.ethereum.DAI, // DAI -}; -async function polyTvl(time, ethBlock, chainBlocks) { - const balances = {}; - await sumTokens( - balances, - vaults.map((v) => [amDAI, v]), - chainBlocks.polygon, - "polygon", - (addr) => `polygon:${addr}` - ); - return balances; +async function polyTvl(api) { + return sumTokens2({ api, owners: vaults, token: amDAI}) } -const qiDAI = "avax:0x835866d37afb8cb8f8334dccdaf66cf01832ff5d" - -async function avaxTvl(time, ethBlock, chainBlocks) { - const balances = {}; - await sumTokens( - balances, - avaults.map((v) => [avDAI, v]), - chainBlocks.avax, - "avax", - (addr) => { - return transforms[addr.toLowerCase()] ?? `avax:${addr}`; - } - ); - const [{ output: jDAIRate }, { output: jDAIBalance }] = await Promise.all([ - sdk.api.abi.call({ - chain: 'avax', - target: '0xc988c170d0E38197DC634A45bF00169C7Aa7CA19', - block: chainBlocks.avax, - abi: abi.exchangeRateStored - }), - sdk.api.erc20.balanceOf({ - target: "0xc988c170d0E38197DC634A45bF00169C7Aa7CA19", - owner: "0xcD62196CC117EA7fd9525ADe37e44d01209e8EBB", - block: chainBlocks.avax, - chain: 'avax' - }) - ]) - sdk.util.sumSingleBalance(balances, `avax:${DAI}`, jDAIRate * jDAIBalance / 10 ** 18) - await unwrapCreamTokens( - balances, - [[ - "0x835866d37afb8cb8f8334dccdaf66cf01832ff5d", - "0xEb2A90ED68017Ac1B068077C5D1537f4C544036C" - ]], - chainBlocks.avax, - "avax", - (addr) => { - return transforms[addr.toLowerCase()] ?? `avax:${addr}`; - } - ); - return balances; +async function avaxTvl(api) { + await sumTokens2({ api, owners: avaults, token: avDAI}) + await sumTokens2({ api, owner: '0xcD62196CC117EA7fd9525ADe37e44d01209e8EBB', token: '0xc988c170d0E38197DC634A45bF00169C7Aa7CA19'}) + return sumTokens2({ api, owner: '0xEb2A90ED68017Ac1B068077C5D1537f4C544036C', token: '0x835866d37afb8cb8f8334dccdaf66cf01832ff5d'}) } module.exports = { diff --git a/projects/florence-finance/index.js b/projects/florence-finance/index.js index 5858527103..c191bf482b 100644 --- a/projects/florence-finance/index.js +++ b/projects/florence-finance/index.js @@ -5,6 +5,9 @@ const ETH_EURS = "0xdb25f211ab05b1c97d595516f45794528a807ad8"; const ARB_FLR = "0x9b6226dd0191a77d032f56a6d383044ee99944c3"; const ARB_AGEUR = "0xfa5ed56a203466cbbc2430a43c66b9d8723528e7"; +const BASE_FLR = "0x4ee4bea687D5cE6245198db136D32aeC02806A83"; +const BASE_EURC = "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42"; + async function getTotalSupply(token, { api }) { const totalSupply = await api.call({ abi: "function totalSupply() external view returns (uint256)", @@ -30,9 +33,15 @@ async function getBorrowedOnArbitrum(api) { api.add(ARB_AGEUR, borrowed); //Decimals of FLR and agEUR are both 18. No conversion needed. } +async function getBorrowedOnBase(api) { + const borrowed = await getTotalSupply(BASE_FLR, { api }); //FLR on Base are not multi-chain so there is no need to subtract anything yet. + api.add(BASE_EURC, borrowed / 1e12); //12 decimals (FLR) -> 2 decimals (EURC) +} + module.exports = { methodology: "The Florin token (FLR) is minted whenever a new loan is funded and burned when a loan matures and is repaid. Since the Florin token is 1:1 redeemable for EUR the borrowed amount is denominated in the protocols treasuries EUR stablecoin of the respective chain. Consequently the total supply of Florin equals the amount borrowed through the protocol. To avoid double counting, the amount of FLR held in the bridge contract is subtracted from the total supply. ", - ethereum: { start: 16077400, borrowed: getBorrowedOnEthereum, tvl: () => ({}) }, - arbitrum: { start: 126183369, borrowed: getBorrowedOnArbitrum, tvl: () => ({}) }, + ethereum: { borrowed: getBorrowedOnEthereum, tvl: () => ({}) }, + arbitrum: { borrowed: getBorrowedOnArbitrum, tvl: () => ({}) }, + base: { borrowed: getBorrowedOnBase, tvl: () => ({}) }, }; \ No newline at end of file diff --git a/projects/fluid-protocol/index.js b/projects/fluid-protocol/index.js new file mode 100644 index 0000000000..d9537addb7 --- /dev/null +++ b/projects/fluid-protocol/index.js @@ -0,0 +1,12 @@ +const { sumTokens } = require("../helper/chain/fuel") + +async function tvl(api) { + const contractId = '0xb18340bfe68c0b3a4fbd3a3ae2c014be94c16569b7f360cf53efe1b7023e545e' + + return sumTokens({ api, owner: contractId }) +} + +module.exports = { + fuel: { tvl }, + timetravel: false, +} diff --git a/projects/fluid/index.js b/projects/fluid/index.js index 1765f6eadb..6bbdee01b3 100644 --- a/projects/fluid/index.js +++ b/projects/fluid/index.js @@ -18,6 +18,7 @@ const config = { }, weETH: "0xcd5fe23c85820f7b72d0926fc9b05b43e359b7ee", zircuit: "0xF047ab4c75cebf0eB9ed34Ae2c186f3611aEAfa6", + weETHs: "0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88", }, arbitrum: { liquidityResolver: (block) => "0x46859d33E662d4bF18eEED88f74C36256E606e44", @@ -48,6 +49,15 @@ async function tvl(api) { params: [config.ethereum.weETH, config.liquidity], }) ); + // add WeETHs deployed to Zircuit + api.add( + config.ethereum.weETHs, + await api.call({ + target: config.ethereum.zircuit, + abi: "function balance(address, address) public view returns (uint256 balance)", + params: [config.ethereum.weETHs, config.liquidity], + }) + ); } return api.sumTokens({ diff --git a/projects/fluidity-money/index.js b/projects/fluidity-money/index.js index 530a1a9920..8acb56eb3c 100644 --- a/projects/fluidity-money/index.js +++ b/projects/fluidity-money/index.js @@ -1,5 +1,5 @@ const { sumTokens2 } = require("../helper/unwrapLPs"); -const { getTokenSupply } = require("../helper/solana") +const { getTokenSupplies } = require("../helper/solana") const ATOKENS_ETHEREUM = ['0x028171bCA77440897B824Ca71D1c56caC55b68A3', '0x101cc05f4A51C0319f570d5E146a8C625198e636', '0xd4937682df3C8aEF4FE912A96A74121C0829E664']; const APOOL_ETHEREUM = ['0xFC66c25dbDb0606e7F9cA1d2754Eb0A0f8306dA9', '0x5E88f6dc0aa126FA28A137B24d0B4d7231352a0B', '0xB7a2930e66D84Da74CdcFE4f97FaE9fC8f1114e8']; const ATOKENS_ARBITRUM = ['0x6ab707Aca953eDAeFBc4fD23bA73294241490620', '0x625E7708f30cA75bfd92586e17077590C60eb4cD', '0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE', '0x724dc807b04555b71ed48a6896b6f41593b8c637']; @@ -19,8 +19,8 @@ async function tvl_arb(api) { async function tvl_sol(api) { const fUSDC = 'Ez2zVjw85tZan1ycnJ5PywNNxR6Gm4jbXQtZKyQNu3Lv' - const supply = await getTokenSupply(fUSDC) - api.add(fUSDC, supply * 1e6) + const res = await getTokenSupplies([fUSDC]) + api.add(fUSDC, res[fUSDC]) } module.exports = { diff --git a/projects/fluidtokens/index.js b/projects/fluidtokens/index.js index 9f5649485c..e17151a6f1 100644 --- a/projects/fluidtokens/index.js +++ b/projects/fluidtokens/index.js @@ -59,7 +59,8 @@ async function tvl() { const boosted=parseInt(boosted_tvl.bs_available_volume)+parseInt(boosted_tvl.bs_active_volume); return { - cardano: (SC_offers_tvl+repay_tvl+pools_tvl+boosted) / 1e6, + // cardano: (SC_offers_tvl+repay_tvl+pools_tvl+boosted) / 1e6, + cardano: (SC_offers_tvl+pools_tvl+boosted) / 1e6, }; } diff --git a/projects/flux/index.js b/projects/flux/index.js index 742dba09dc..c6662fd03a 100644 --- a/projects/flux/index.js +++ b/projects/flux/index.js @@ -15,6 +15,7 @@ const getFluxTVLDetail = 'function getFluxTVLDetail() view returns (uint256 tota module.exports = { misrepresentedTokens: true, + deadFrom: '2022-12-07', }; Object.keys(config).forEach(chain => { @@ -31,7 +32,9 @@ Object.keys(config).forEach(chain => { tether: (totalSupply - totalBorrow) / 1e18 } }, - borrowed: async (_, _b, {[chain]: block}) => { + borrowed: () => ({}), // bad debt + + /*async (_, _b, {[chain]: block}) => { const { reportContract } = config[chain] const { output: { totalBorrow, } } = await sdk.api.abi.call({ target: reportContract, @@ -42,7 +45,7 @@ Object.keys(config).forEach(chain => { return { tether: totalBorrow / 1e18 } - }, + },*/ staking: async (_, _b, {[chain]: block}) => { const { reportContract } = config[chain] const { output: { totalStaked, } } = await sdk.api.abi.call({ @@ -56,4 +59,5 @@ Object.keys(config).forEach(chain => { } }, } -}) \ No newline at end of file +}) + diff --git a/projects/fluxfinance/index.js b/projects/fluxfinance/index.js index d8c8cfbc06..e63ad31fea 100644 --- a/projects/fluxfinance/index.js +++ b/projects/fluxfinance/index.js @@ -5,5 +5,5 @@ const comptroller = "0x95Af143a021DF745bc78e845b54591C53a8B3A51"; module.exports = { methodology: `${lendingMarket}. TVL is calculated by getting the market addresses from comptroller and calling the getCash() on-chain method to get the amount of tokens locked in each of these addresses, then we get the price of each token from coingecko.`, - ethereum: compoundExports(comptroller, "ethereum"), + ethereum: compoundExports(comptroller), }; diff --git a/projects/fluxusbase/index.js b/projects/fluxusbase/index.js new file mode 100644 index 0000000000..510b0046d5 --- /dev/null +++ b/projects/fluxusbase/index.js @@ -0,0 +1,11 @@ +const { uniTvlExport } = require('../helper/calculateUniTvl.js') + +module.exports = { + misrepresentedTokens: true, + base: { + tvl: uniTvlExport("0x27c2d144b106B26Be3d0dEB6c14c5CFA2e9a507C", undefined, undefined, { + allPairsLength: 'uint256:allPairsLength', + allPairs: 'function allPairs(uint256) view returns (address)', + }, { useDefaultCoreAssets: true, hasStablePairs: true, }), + }, +} \ No newline at end of file diff --git a/projects/fodl/index.js b/projects/fodl/index.js index 7065b1bf11..49b7a76d45 100644 --- a/projects/fodl/index.js +++ b/projects/fodl/index.js @@ -2,53 +2,68 @@ const abi = require('./abi.json') const { sumTokensExport } = require('../helper/unwrapLPs'); const { sliceIntoChunks } = require('../helper/utils'); -// taken from https://app.fodl.finance/config.json -const config = { +module.exports = { ethereum: { - position_nft: '0x70febba7d45cfe6d99847ba4ccc393373b1ea8aa', - lens_contract: '0x080155C42b0854C3A718B610cC5183e963851Afb', - pool2: [ - ['0xa5c475167f03b1556c054e0da78192cd2779087f', '0xf958a023d5b1e28c32373547bdde001cad17e9b4'], - ['0xce7e98d4da6ebda6af474ea618c6b175729cd366', '0xa7453338ccc29e4541e6c6b0546a99cc6b9eb09a'], - ], - staking: [ - ['0x4c2e59d098df7b6cbae0848d66de2f8a4889b9c3', '0x7e05540A61b531793742fde0514e6c136b5fbAfE'], - ], + tvl: () => ({}), }, polygon: { - position_nft: '0x7243c51c24b302b01094785f3c826f9311525613', - lens_contract: '0xbfE6971Fc6F195bcacB72beE3427f5b4d8C3dc07', - pool2: [ - ['0x2fc4dfcee8c331d54341f5668a6d9bcdd86f8e2f', '0xea7336c408ec8012e6b97368198512597e49c88a'], - ], + tvl: () => ({}), }, bsc: { - position_nft: '0x4c2e59d098df7b6cbae0848d66de2f8a4889b9c3', - lens_contract: '0x6032035731c9F0b2E53Da63ca15444375E946559', - }, + tvl: () => ({}), + } } -module.exports = { - methodology: "FODL leverages users positions on Aave and Compound. The fodl lens contract is used to get the positions metadata, especially supplyAmount and supplyTokenAddress, which counts as the TVL of the position of the user. Pool2 TVL are the tokens locked in the SUSHI pools", -}; - -Object.keys(config).forEach(chain => { - const { position_nft, lens_contract, pool2, staking, } = config[chain] - module.exports[chain] = { - tvl: async (_, _b, { [chain]: block }, { api }) => { - const allPositions = await api.fetchList({ lengthAbi: 'erc20:totalSupply', itemAbi: abi.tokenByIndex, target: position_nft, }) - for (const positions of sliceIntoChunks(allPositions, 50)) { - const data = await api.multiCall({ abi: abi.getPositionsMetadata, calls: sliceIntoChunks(positions, 10).map(i => ({ params: [i] })), target: lens_contract, }) - data.forEach(j => { - j.forEach(i => api.add(i.supplyTokenAddress, i.supplyAmount)) - }) - } - } - } +module.exports.deadFrom = '2023-01-01' + +// taken from https://app.fodl.finance/config.json +// const config = { +// ethereum: { +// position_nft: '0x70febba7d45cfe6d99847ba4ccc393373b1ea8aa', +// lens_contract: '0x080155C42b0854C3A718B610cC5183e963851Afb', +// pool2: [ +// ['0xa5c475167f03b1556c054e0da78192cd2779087f', '0xf958a023d5b1e28c32373547bdde001cad17e9b4'], +// ['0xce7e98d4da6ebda6af474ea618c6b175729cd366', '0xa7453338ccc29e4541e6c6b0546a99cc6b9eb09a'], +// ], +// staking: [ +// ['0x4c2e59d098df7b6cbae0848d66de2f8a4889b9c3', '0x7e05540A61b531793742fde0514e6c136b5fbAfE'], +// ], +// }, +// polygon: { +// position_nft: '0x7243c51c24b302b01094785f3c826f9311525613', +// lens_contract: '0xbfE6971Fc6F195bcacB72beE3427f5b4d8C3dc07', +// pool2: [ +// ['0x2fc4dfcee8c331d54341f5668a6d9bcdd86f8e2f', '0xea7336c408ec8012e6b97368198512597e49c88a'], +// ], +// }, +// bsc: { +// position_nft: '0x4c2e59d098df7b6cbae0848d66de2f8a4889b9c3', +// lens_contract: '0x6032035731c9F0b2E53Da63ca15444375E946559', +// }, +// } + +// module.exports = { +// methodology: "FODL leverages users positions on Aave and Compound. The fodl lens contract is used to get the positions metadata, especially supplyAmount and supplyTokenAddress, which counts as the TVL of the position of the user. Pool2 TVL are the tokens locked in the SUSHI pools", +// }; + +// Object.keys(config).forEach(chain => { +// const { position_nft, lens_contract, pool2, staking, } = config[chain] +// module.exports[chain] = { +// tvl: async (_, _b, { [chain]: block }, { api }) => { +// const allPositions = await api.fetchList({ lengthAbi: 'erc20:totalSupply', itemAbi: abi.tokenByIndex, target: position_nft, }) +// for (const positions of sliceIntoChunks(allPositions, 50)) { +// const data = await api.multiCall({ abi: abi.getPositionsMetadata, calls: sliceIntoChunks(positions, 10).map(i => ({ params: [i] })), target: lens_contract, }) +// data.forEach(j => { +// j.forEach(i => api.add(i.supplyTokenAddress, i.supplyAmount)) +// }) +// } +// } +// } + +// if (pool2) +// module.exports[chain].pool2 = sumTokensExport({ tokensAndOwners: pool2, chain, }) - if (pool2) - module.exports[chain].pool2 = sumTokensExport({ tokensAndOwners: pool2, chain, }) +// if (staking) +// module.exports[chain].staking = sumTokensExport({ tokensAndOwners: staking, chain, }) +// }) - if (staking) - module.exports[chain].staking = sumTokensExport({ tokensAndOwners: staking, chain, }) -}) diff --git a/projects/folks-galgo/index.js b/projects/folks-galgo/index.js index 56702c1ba1..42804a463d 100644 --- a/projects/folks-galgo/index.js +++ b/projects/folks-galgo/index.js @@ -15,3 +15,16 @@ module.exports = { }, }, }; + +module.exports.hallmarks = [ + [1664553600, "Algorand Governance Recommitment"], //5 + [1672502400, "Algo Gov"], //6 + [1680278400, "Algo Gov"], //7 + [1688140800, "Algo Gov"], //8 + [1696089600, "Algo Gov"], //9 + [1704038400, "Algo Gov"], //10 + [1711900800, "Algo Gov"], //11 + [1719763200, "Algo Gov"], //12 + [1727712000, "Algo Gov"], //13 + [1735660800, "Algo Gov"], //14 +] \ No newline at end of file diff --git a/projects/folks-xchain/constants.js b/projects/folks-xchain/constants.js new file mode 100644 index 0000000000..583eaf367d --- /dev/null +++ b/projects/folks-xchain/constants.js @@ -0,0 +1,107 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const HubPoolAbi = { + getDepositData: "function getDepositData() view returns (uint16 optimalUtilisationRatio, uint256 totalAmount, uint256 interestRate, uint256 interestIndex)", + getVariableBorrowData: "function getVariableBorrowData() view returns (uint32 vr0, uint32 vr1, uint32 vr2, uint256 totalAmount, uint256 interestRate, uint256 interestIndex)", + getStableBorrowData: "function getStableBorrowData() view returns (uint32 sr0, uint32 sr1, uint32 sr2, uint32 sr3, uint16 optimalStableToTotalDebtRatio, uint16 rebalanceUpUtilisationRatio, uint16 rebalanceUpDepositInterestRate, uint16 rebalanceDownDelta, uint256 totalAmount, uint256 interestRate, uint256 averageInterestRate)" +} +const HubPools = { + 'avax': [ + { // USDC + poolAddress: "0x88f15e36308ED060d8543DA8E2a5dA0810Efded2", + tokenAddress: ADDRESSES.avax.USDC, + }, + { // AVAX + poolAddress: "0x0259617bE41aDA4D97deD60dAf848Caa6db3F228", + tokenAddress: ADDRESSES.null, + chainPoolAddress: '0xe69e068539Ee627bAb1Ce878843a6C76484CBd2c', + }, + { // sAVAX + poolAddress: "0x7033105d1a527d342bE618ab1F222BB310C8d70b", + tokenAddress: ADDRESSES.avax.SAVAX, + chainPoolAddress: '0x23a96D92C80E8b926dA40E574d615d9e806A87F6', + }, + { // wETH_ava + poolAddress: "0x795CcF6f7601edb41E4b3123c778C56F0F19389A", + tokenAddress: ADDRESSES.avax.WETH_e, + chainPoolAddress: '0x0e563B9fe6D9EF642bDbA20D53ac5137EB0d78DC', + }, + { // BTCb_ava + poolAddress: "0x1C51AA1516e1156d98075F2F64e259906051ABa9", + tokenAddress: ADDRESSES.avax.BTC_b, + chainPoolAddress: '0xef7a6EBEDe2ad558DB8c36Df65365b209E5d57dC', + }, + { // SolvBTC + poolAddress: "0x307bCEC89624660Ed06C97033EDb7eF49Ab0EB2D", + tokenAddress: '0xbc78D84Ba0c46dFe32cf2895a19939c86b81a777', + }, + { // JOE + poolAddress: "0x5e5a2007a8D613C4C98F425097166095C875e6eE", + tokenAddress: '0x6e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd', + }, + ], + 'ethereum': [ + // excluding USDC cause bridged + // excluding SolvBTC cause bridged + { // ETH_eth + poolAddress: "0xB6DF8914C084242A19A4C7fb15368be244Da3c75", + tokenAddress: ADDRESSES.null, + chainPoolAddress: '0xe3B0e4Db870aA58A24f87d895c62D3dc5CD05883', + }, + { // wBTC_eth + poolAddress: "0x9936812835476504D6Cf495F4F0C718Ec19B3Aff", + chainPoolAddress: "0xb39c03297E87032fF69f4D42A6698e4c4A934449", + tokenAddress: ADDRESSES.ethereum.WBTC, + }, + ], + 'base': [ + // excluding USDC cause bridged + // excluding SolvBTC cause bridged + { // ETH_base + poolAddress: "0x51958ed7B96F57142CE63BB223bbd9ce23DA7125", + tokenAddress: ADDRESSES.null, + chainPoolAddress: '0xe3B0e4Db870aA58A24f87d895c62D3dc5CD05883', + }, + { // cbBTC_base + poolAddress: "0x9eD81F0b5b0E9b6dE00F374fFc7f270902576EF7", + tokenAddress: "0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf", + chainPoolAddress: '0x50d5Bb3Cf57D2fB003b602A6fD10F90baa8567EA', + }, + ], + 'bsc': [ + // excluding SolvBTC cause bridged + { // BNB + poolAddress: "0x89970d3662614a5A4C9857Fcc9D9C3FA03824fe3", + tokenAddress: ADDRESSES.null, + chainPoolAddress: '0x5f2F4771B7dc7e2F7E9c1308B154E1e8957ecAB0', + }, + { // ETHB_bsc + poolAddress: "0x18031B374a571F9e060de41De58Abb5957cD5258", + tokenAddress: ADDRESSES.bsc.ETH, + chainPoolAddress: '0x4Db12F554623E4B0b3F5bAcF1c8490D4493380A5', + }, + { // BTCB_bsc + poolAddress: "0xC2FD40D9Ec4Ae7e71068652209EB75258809e131", + tokenAddress: ADDRESSES.bsc.BTCB, + chainPoolAddress: '0x12Db9758c4D9902334C523b94e436258EB54156f', + }, + ], + 'arbitrum': [ + // excluding USDC cause bridged + // excluding SolvBTC cause bridged + { // ETH_arb + poolAddress: "0x44E0d0809AF8Ee37BFb1A4e75D5EF5B96F6346A3", + tokenAddress: ADDRESSES.null, + chainPoolAddress: '0x37d761883a01e9F0B0d7fe59EEC8c21D94393CDD', + }, + { // ARB + poolAddress: "0x1177A3c2CccDb9c50D52Fc2D30a13b2c3C40BCF4", + tokenAddress: ADDRESSES.arbitrum.ARB, + chainPoolAddress: '0x1b2a8d56967d00700DD5C94E27B1a116a1deF8Df', + }, + ] +} + +module.exports = { + HubPoolAbi, + HubPools, +}; diff --git a/projects/folks-xchain/index.js b/projects/folks-xchain/index.js new file mode 100644 index 0000000000..9e78218194 --- /dev/null +++ b/projects/folks-xchain/index.js @@ -0,0 +1,35 @@ +const sdk = require('@defillama/sdk') +const { HubPools, HubPoolAbi, } = require("./constants"); + +async function tvl(api) { + const tokensAndOwners = HubPools[api.chain].map(pool => [pool.tokenAddress, pool.chainPoolAddress ?? pool.poolAddress]) + return api.sumTokens({ tokensAndOwners }) +} + +async function borrowed(api) { + const HubPoolsChain = HubPools[api.chain] + let chainApi = api + if (api.chain !== 'avax') { + chainApi = new sdk.ChainApi({ chain: 'avax', timestamp: api.timestamp }) + await chainApi.getBlock() + } + const targets = HubPoolsChain.map(pool => pool.poolAddress) + + const [varBorrowsData, stableBorrowsData] = await Promise.all([ + await chainApi.multiCall({ calls: targets, abi: HubPoolAbi.getVariableBorrowData, }), + await chainApi.multiCall({ calls: targets, abi: HubPoolAbi.getStableBorrowData, }) + ]); + + HubPoolsChain.forEach((pool, idx) => { + api.add(pool.tokenAddress, Number(varBorrowsData[idx][3]) + Number(stableBorrowsData[idx][8])) + }) + return api.getBalances() +} + +module.exports = { + methodology: "The Folks Finance xChain states are saved in the Hub chain contracts i.e. Avalanche; TVL counts deposited total amount values for each pool, borrowed counts variable and stable borrowed total amount values for each pool", +} + +Object.keys(HubPools).forEach(chain => { + module.exports[chain] = { tvl, borrowed, } +}) \ No newline at end of file diff --git a/projects/fomogame/index.js b/projects/fomogame/index.js new file mode 100644 index 0000000000..2f60bd52df --- /dev/null +++ b/projects/fomogame/index.js @@ -0,0 +1,12 @@ +const { sumTokensExport } = require("../helper/unwrapLPs"); +const coreAssets = require("../helper/coreAssets.json"); +const Fomo3D = [ + "0xba8be5277A06D2635553b331eAa0BCB6f4bDB809" +]; + +module.exports = { + methodology: "TVL includes a Fomo3D farm contracts", + matchain: { + tvl: sumTokensExport({ owners: Fomo3D, tokens: [coreAssets.null] }), + }, +}; diff --git a/projects/forge-game/index.js b/projects/forge-game/index.js new file mode 100644 index 0000000000..836208b84c --- /dev/null +++ b/projects/forge-game/index.js @@ -0,0 +1,10 @@ +const { sumTokensExport } = require('../helper/chain/ton'); +const ADDRESSES = require('../helper/coreAssets.json') + +module.exports = { + methodology: 'Counts the pre-market wallet size as the TVL.', + timetravel: false, + ton: { + tvl: sumTokensExport({ owner: 'UQAGNpAAIaDrvGWdUCB7ycc_S5tLO0S6PPK0UkrrQb27AWKM', tokens: [ADDRESSES.null]}), + } +} \ No newline at end of file diff --git a/projects/forgesx/index.js b/projects/forgesx/index.js index 952f6a7c8d..137edbb990 100644 --- a/projects/forgesx/index.js +++ b/projects/forgesx/index.js @@ -5,7 +5,7 @@ const USDC_TOKEN = ADDRESSES.arbitrum.USDC module.exports = { methodology: 'counts the number of USDC tokens deposited as collateral in the Forge.sol contract.', - start: 1680643295, + start: '2023-04-04', arbitrum: { tvl: sumTokensExport({ owner: FORGE_SOL, tokens: [USDC_TOKEN]}), } diff --git a/projects/forlend/index.js b/projects/forlend/index.js index 987c129486..9d64a9f4cd 100644 --- a/projects/forlend/index.js +++ b/projects/forlend/index.js @@ -1,5 +1,5 @@ const { compoundExports2 } = require('../helper/compound') module.exports = { - findora: compoundExports2({ comptroller: '0x3b056De20d662B09f73bDb28Ea6fa7b7aC82259C', cether: '0xbd4eeda5062605f3c3b86039c5f2c5880f9ecd95'}), + findora: compoundExports2({ comptroller: '0x3b056De20d662B09f73bDb28Ea6fa7b7aC82259C', }), } diff --git a/projects/fortress-lending/index.js b/projects/fortress-lending/index.js index a3b0cc4754..9e1ff2321b 100644 --- a/projects/fortress-lending/index.js +++ b/projects/fortress-lending/index.js @@ -1,12 +1,14 @@ -const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk"); const { compoundExports } = require("../helper/compound"); -const {tvl:lendingTvl, borrowed} = compoundExports("0x67340bd16ee5649a37015138b3393eb5ad17c195", "bsc", "0xE24146585E882B6b59ca9bFaaaFfED201E4E5491", ADDRESSES.bsc.WBNB) +const {tvl:lendingTvl, borrowed} = compoundExports("0x67340bd16ee5649a37015138b3393eb5ad17c195", "0xE24146585E882B6b59ca9bFaaaFfED201E4E5491") module.exports = { + deadFrom: '2023-02-16', bsc: { tvl: sdk.util.sumChainTvls([lendingTvl]), borrowed }, -}; \ No newline at end of file +}; + +module.exports.bsc.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/fortunafi/index.js b/projects/fortunafi/index.js index fa3ecdece1..907b59b8a9 100644 --- a/projects/fortunafi/index.js +++ b/projects/fortunafi/index.js @@ -16,7 +16,16 @@ const config = { ifBill: '0x45bafad5a6a531Bc18Cf6CE5B02C58eA4D20589b', }, ethereum: { + fBill: '0x108Ec61bd5A91F5596F824832524C6b6002E3F03', + ifBill: '0x4B57e1E3fd684d3bb82A0652c77FD7412dF6a2A5', fCOIN: '0x2378aC4EEAAe44695E1e3d0fcAEEd6ba8b0F5108', + ifCOIN: '0xA6d0f5bb034312f9a4fC565e916B84c264160994', + fHOOD: '0x62C5e58001f91E65C420c4dc4c2F2FAA2264f846', + ifHOOD: '0x7fC6B348368c34013aaC4a7888883b886226E95e', + fSPQQQ: '0x3010E93c37092991E9C1Cc7f7Eeed44148836657', + ifSPQQQ: '0x6D34113F41d5C3b327b6417fC17Ea449C71eA6f4', + fHV1: '0xD71412e045825d52b38355F8ade1230DD2E393e4', + ifHV1: '0xE7638CB7ad2384D635d2C49AeBE76cfbcceC50ed' }, } diff --git a/projects/four-meme/index.js b/projects/four-meme/index.js new file mode 100644 index 0000000000..aade92ebd3 --- /dev/null +++ b/projects/four-meme/index.js @@ -0,0 +1,16 @@ +const ADDRESSES = require('../helper/coreAssets.json'); +const { sumTokensExport } = require("../helper/unwrapLPs"); + +const config = { + bsc: { + owners: Object.values({ + tokenManager: "0xEC4549caDcE5DA21Df6E6422d448034B5233bFbC", + tokenManager2: "0x5c952063c7fc8610FFDB798152D69F0B9550762b", + }), + tokens: [ADDRESSES.null, ADDRESSES.bsc.USDT,], + }, +}; + +Object.keys(config).forEach(chain => { + module.exports[chain] = { tvl: sumTokensExport(config[chain]) } +}) \ No newline at end of file diff --git a/projects/fourdex/index.js b/projects/fourdex/index.js index b4e580a8d3..6972d08087 100644 --- a/projects/fourdex/index.js +++ b/projects/fourdex/index.js @@ -5,7 +5,6 @@ module.exports = { tvl: getUniTVL({ factory: "0x0f93649C2BA0F64fA939eCe899f1afD0b15C7Bd2", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/fragmetric/index.js b/projects/fragmetric/index.js new file mode 100644 index 0000000000..2e340930a6 --- /dev/null +++ b/projects/fragmetric/index.js @@ -0,0 +1,26 @@ +const { sumTokens2 } = require("../helper/solana"); + +async function tvl() { + return sumTokens2({ + tokenAccounts: [ + "4b3xtGBwmP9FQyQ85HDmyEtQrLdoVzz6NBwBjaRBzJuS", + "BXUyJdESgoyssvATKa3omD7zHtdeztpWnG13mDUQ6fcM", + "B2vjfDaLsaJ32ESoFsVf7NPS2hd5f4QisiPLiXBrS1BK", + "7rtyMjMKPrmKfciayvxaZdKiY9D7Rx9o3JtW3QvsUnsc", + "HSKvv9UFCn4c6Jq3j8iiJfFgXFjRE6dr6QhWX2KD8gGU", + "3KdpoeWuwaXLuukf56p8e1FtDKjY8pCmtZdmZejUctwP", + "9grKYUmguSLVC9RHW1xKcLpiAphJrmcDkTVTCg9ebpFz", + "EbMiibdEBswBKxATPtYEiaRcx7uzJvyWvexVzUJ6iyje", + ], + solOwners: [ + "3H22A3T3CMyoGzAURZ4szV5Hmt64Dooo5g9Ns8h1kYy7", + ] + }) +} + +module.exports = { + timetravel: false, + doublecounted: true, + solana: { tvl }, + methodology: 'TVL is calculated by summing all restaked assets.', +}; diff --git a/projects/frankencoin/index.js b/projects/frankencoin/index.js index 15e6c3633c..09560c0f09 100644 --- a/projects/frankencoin/index.js +++ b/projects/frankencoin/index.js @@ -1,19 +1,26 @@ -const { sumTokens2 } = require('../helper/unwrapLPs') +const { sumTokens2 } = require('../helper/unwrapLPs'); const { cachedGraphQuery } = require('../helper/cache') -const MintingHub = "0x7bbe8F18040aF0032f4C2435E7a76db6F1E346DF"; -const Collaterals = ["0xb4272071ecadd69d933adcd19ca99fe80664fc08"]; // XCHF +// @dev: mapping of XCHF to its Bridge +const XCHFBridge = ["0xb4272071ecadd69d933adcd19ca99fe80664fc08", "0x7bbe8F18040aF0032f4C2435E7a76db6F1E346DF"]; async function tvl(api) { - const tokensAndOwners = Collaterals.map(i => [i, MintingHub]) - const { positions } = await cachedGraphQuery('frankencoin', 'https://api.thegraph.com/subgraphs/name/frankencoin-zchf/frankencoin-subgraph', '{ positions { position collateral } }') - positions.forEach(i => tokensAndOwners.push([i.collateral, i.position])) - return sumTokens2({ api, tokensAndOwners, }) + const tokensAndOwners = [XCHFBridge]; + + // @dev: query of positions from minting hubs via frankencoin graph (ponder) + const { positionV1s } = await cachedGraphQuery('frankencoinV1', 'https://ponder.frankencoin.com', '{ positionV1s { items { position collateral } } }'); + const { positionV2s } = await cachedGraphQuery('frankencoinV2', 'https://ponder.frankencoin.com', '{ positionV2s { items { position collateral } } }'); + + // @dev: mapping of positions from minting hubs + positionV1s?.items?.forEach(i => tokensAndOwners.push([i.collateral, i.position])); + positionV2s?.items?.forEach(i => tokensAndOwners.push([i.collateral, i.position])); + + return sumTokens2({ api, tokensAndOwners, }); } module.exports = { ethereum: { tvl, }, - start: 1698487043, + start: '2023-10-28', }; diff --git a/projects/franklinTempleton-finance/index.js b/projects/franklinTempleton-finance/index.js index bbbaf4b883..e5c621f002 100644 --- a/projects/franklinTempleton-finance/index.js +++ b/projects/franklinTempleton-finance/index.js @@ -1,28 +1,29 @@ -const { toUSDTBalances } = require('../helper/balances'); +const { getAssetSupply } = require("../helper/chain/stellar") -const BENJI_STELLAR = {ticker: "BENJI", address: 'GBHNGLLIE3KWGKCHIKMHJ5HVZHYIK7WTBE4QF5PLAKL4CJGSEU7HZIW5'} -const BENJI_POLYGON = '0x408a634b8a8f0de729b48574a3a7ec3fe820b00a' +const BENJI = { + stellar: '', + arbitrum: '0xb9e4765bce2609bc1949592059b17ea72fee6c6a', + polygon: '0x408a634b8a8f0de729b48574a3a7ec3fe820b00a', + avax: '0xe08b4c1005603427420e64252a8b120cace4d122', + base: '0x60cfc2b186a4cf647486e42c42b11cc6d571d1e4', + ethereum: '0x3ddc84940ab509c11b20b76b466933f40b750dc9' +} const stellarTvl = async (api) => { - const stellarApi = `https://api.stellar.expert/explorer/public/asset/${BENJI_STELLAR.ticker}-${BENJI_STELLAR.address}` - const response = await fetch(stellarApi) - const {supply, toml_info} = await response.json() - const adjustedSupply = toUSDTBalances((supply / Math.pow(10, toml_info.decimals))) - const [[tokenAddress, tokenBalance]] = Object.entries(adjustedSupply); - return api.add(tokenAddress, tokenBalance, { skipChain: true }) + api.addUSDValue(await getAssetSupply('BENJI-GBHNGLLIE3KWGKCHIKMHJ5HVZHYIK7WTBE4QF5PLAKL4CJGSEU7HZIW5')) } -const polygonTvl = async (api) => { +const evmTVL = async (api) => { const [decimals, totalSupply] = await Promise.all([ - api.call({target: BENJI_POLYGON, abi:'erc20:decimals'}), - api.call({target: BENJI_POLYGON, abi:'erc20:totalSupply'}) + api.call({ target: BENJI[api.chain], abi: 'erc20:decimals' }), + api.call({ target: BENJI[api.chain], abi: 'erc20:totalSupply' }) ]) - const adjustedSupply = toUSDTBalances((totalSupply / Math.pow(10, decimals))) - const [[tokenAddress, tokenBalance]] = Object.entries(adjustedSupply); - api.add(tokenAddress, tokenBalance, {skipChain: true} ) -} -module.exports = { - stellar: {tvl: stellarTvl}, - polygon: {tvl: polygonTvl}, + api.addUSDValue((totalSupply / Math.pow(10, decimals))) } + +Object.keys(BENJI).forEach((chain) => { + module.exports[chain] = { tvl: chain === 'stellar' ? stellarTvl : evmTVL }; +}); + +module.exports.misrepresentedTokens = true; \ No newline at end of file diff --git a/projects/frax-ETH/index.js b/projects/frax-ETH/index.js index c8d9d99ba5..af96654e63 100644 --- a/projects/frax-ETH/index.js +++ b/projects/frax-ETH/index.js @@ -1,10 +1,120 @@ +const { get } = require("../helper/http"); +const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk") -const token = '0x5E8422345238F34275888049021821E8E08CAa1f' + +const abi = { + coins: "function coins(uint256 arg0) view returns (address)", + get_balances: "function get_balances() view returns (uint256[2])", + lockedLiquidityOf: "function lockedLiquidityOf(address account) view returns (uint256)", + redemptionQueueAccounting: "function redemptionQueueAccounting() view returns (uint128 etherLiabilities, uint128 unclaimedFees)", + get_balances2: "function get_balances() view returns (uint256[])", +} + +/** + * Config Ethereum + */ + +const frxETH = "0x5E8422345238F34275888049021821E8E08CAa1f" +const treasury = "0x8306300ffd616049FD7e4b0354a64Da835c1A81C"; +const minter = "0xbAFA44EFE7901E04E39Dad13167D089C559c1138"; +const redeemer = "0x82bA8da44Cd5261762e629dd5c605b17715727bd" +const st_frxETH = "0x4d9f9D15101EEC665F77210cB999639f760F831E"; +const frxeth_ng = '0x9c3B46C0Ceb5B9e304FCd6D88Fc50f7DD24B31Bc' +const stakingProxyConvex_1 = '0x32a2849100ed63878ba8ee6e924EB052A57ecB44' +const stakingProxyConvex_2 = '0x74da8EB74DD94Dbd3B501eb16D8CB2C5222dBDa9' +const stakingConvex_1 = "0x68921998fbc43B360D3cF14a03aF4273CB0cFA44" +const stakingConvex_2 = "0xB4fdD7444E1d86b2035c97124C46b1528802DA35" + +const url = "https://api.frax.finance/v2/frxeth/validators" + +/** + * Config Fraxtal + */ + +const wfrxETH = "0xFC00000000000000000000000000000000000006" +const treasury_2 = "0x0ae0548Ef97d3eC699cF375e2467E24B2f35847c" +const ezwfrxETH = "0x6e9b6660b94fa74A8087D7ee14Dc28698249D242" + +const unwrapperCRV = async (api, lps, treasury) => { + const [supplies, token0s, token1s, poolBalances, balanceOfs] = await Promise.all([ + api.multiCall({ calls: lps.map((lp) => ({ target: lp.pool })), abi: "erc20:totalSupply" }), + api.multiCall({ calls: lps.map((lp) => ({ target: lp.pool, params: [0] })), abi: abi.coins }), + api.multiCall({ calls: lps.map((lp) => ({ target: lp.pool, params: [1] })), abi: abi.coins }), + api.multiCall({ calls: lps.map((lp) => ({ target: lp.pool })), abi: abi.get_balances }), + api.multiCall({ calls: lps.map((lp) => ({ target: lp.pool, params: [treasury], skip: lp.balance !== undefined })), abi: "erc20:balanceOf" }), + ]) + + lps.forEach((lp, i) => { + const supply = supplies[i] + const token0 = token0s[i] + const token1 = token1s[i] + const poolBalance = poolBalances[i] + const balanceOf = lp.balance !== undefined ? lp.balance : balanceOfs[i]; + api.add(token0, balanceOf * poolBalance[0] / supply, { skipChain: true }) + api.add(token1, balanceOf * poolBalance[1] / supply, { skipChain: true }) + }) +}; + +const unwrapperCRVCVX = async (api, lps, treasury) => { + const balanceOfs = await api.multiCall({ calls: lps.map((lp) => ({ target: lp.staker, params: [lp.user] })) , abi: abi.lockedLiquidityOf }) + return unwrapperCRV(api, lps.map((lp, i) => ({...lp, balance: balanceOfs[i]})), treasury) +} + +const treasuryAssets = async (api, treasury) => { + await Promise.all([ + unwrapperCRV(api, [{ pool: st_frxETH }, { pool: frxeth_ng }], treasury), + unwrapperCRVCVX(api, [ + { user: stakingProxyConvex_1, staker: stakingConvex_1, pool: st_frxETH }, + { user: stakingProxyConvex_2, staker: stakingConvex_2, pool: frxeth_ng } + ], treasury) + ]) + + api.add(frxETH, await api.call({ target: frxETH, params: [treasury], abi: 'erc20:balanceOf' })) + api.add(ADDRESSES.ethereum.WETH, (await sdk.api.eth.getBalance({ target: treasury })).output) +} + +const redeemerAssets = async (api, redeemer) => { + const unclaimed = await api.call({ target: redeemer, abi: abi.redemptionQueueAccounting }) + api.add(ADDRESSES.ethereum.WETH, unclaimed.unclaimedFees) + api.add(ADDRESSES.ethereum.WETH, (await sdk.api.eth.getBalance({ target: redeemer })).output) +} + +const validatorsAssets = async (api) => { + const { validators } = await get(url) + const balances = validators.map((r) => r.balanceDec * Math.pow(10, 18)) + const totalBalance = balances.reduce((acc, balance) => acc + balance, 0); + api.add(ADDRESSES.ethereum.WETH, totalBalance) +} + + +const ethTvl = async (api) => { + await Promise.all([ + treasuryAssets(api, treasury), // frxETH Treasury + redeemerAssets(api, redeemer), // frxETH redeemer + validatorsAssets(api) // validators + ]) + + api.add(ADDRESSES.ethereum.WETH, (await sdk.api.eth.getBalance({ target: minter })).output) // frxETH Minter + api.removeTokenBalance(frxETH) +}; + +const fraxtalTvl = async (api) => { + const [supply, token0, token1, poolBalance, balanceOf] = await Promise.all([ + api.call({ target: ezwfrxETH, abi: "erc20:totalSupply" }), + api.call({ target: ezwfrxETH, params: [0], abi: abi.coins }), + api.call({ target: ezwfrxETH, params: [1], abi: abi.coins }), + api.call({ target: ezwfrxETH, abi: abi.get_balances2 }), + api.call({ target: ezwfrxETH, params: [treasury_2], abi: "erc20:balanceOf" }), + ]) + + api.add(token0 === wfrxETH ? frxETH : token0, balanceOf * poolBalance[0] / supply, { skipChain: true }) + api.add(token1 === wfrxETH ? frxETH : token1, balanceOf * poolBalance[1] / supply, { skipChain: true }) + api.add(frxETH, (await sdk.api.eth.getBalance({ target: treasury })).output, { skipChain: true }) + api.removeTokenBalance(frxETH) +} module.exports = { - ethereum: { - tvl: async (_, block) => ({ - ethereum: (await sdk.api.erc20.totalSupply({ target: token, block})).output/1e18 - }) - } -} \ No newline at end of file + methodology: "TVL represents all the on-chain assets backing frxETH", + ethereum: { tvl: ethTvl }, + fraxtal: { tvl: fraxtalTvl } +}; diff --git a/projects/freestyle/index.js b/projects/freestyle/index.js index 4aadb02a6e..7ac9f3fbfc 100644 --- a/projects/freestyle/index.js +++ b/projects/freestyle/index.js @@ -4,8 +4,8 @@ const { request, } = require("graphql-request"); const freestyleConfig = { base: { token: ADDRESSES.base.USDC, - start: 1700006400, - graphUrl: "https://api.studio.thegraph.com/query/62454/analytics_base_8_2/version/latest", + start: '2023-11-15', + graphUrl: "https://api-v2.morphex.trade/subgraph/3KhmYXgsM3CM1bbUCX8ejhcxQCtWwpUGhP7p9aDKZ94Z", accountSource: '0x6D63921D8203044f6AbaD8F346d3AEa9A2719dDD' }, } diff --git a/projects/frigg-eco/index.js b/projects/frigg-eco/index.js index 956fd66e04..56ff97f3df 100644 --- a/projects/frigg-eco/index.js +++ b/projects/frigg-eco/index.js @@ -36,7 +36,6 @@ async function tvl(_, block) { module.exports = { misrepresentedTokens: true, methodology: 'Gets the value of all tokens managed through frigg.eco universe', - start: 15575809, ethereum: { tvl }, diff --git a/projects/fringe-v2/index.js b/projects/fringe-v2/index.js index c87bc5636a..374fb2e88f 100644 --- a/projects/fringe-v2/index.js +++ b/projects/fringe-v2/index.js @@ -5,5 +5,6 @@ getExports({ optimism: "0x088F23ac0c07A3Ce008FB88c4bacFF06FECC6158", polygon: "0x286475366f736fcEeB0480d7233ef169AE614Fe4", ethereum: "0x70467416507B75543C18093096BA4612a9261DB8", - era: "0x8f1d37769a56340542Fb399Cb1cA49d46Aa9fec8" + era: "0x8f1d37769a56340542Fb399Cb1cA49d46Aa9fec8", + base: "0x36a327E6db347fC7431509C02122A829Dc559BFE" }, module.exports) \ No newline at end of file diff --git a/projects/froggy-protocol/index.js b/projects/froggy-protocol/index.js index c902b2be3c..378ef0e03c 100644 --- a/projects/froggy-protocol/index.js +++ b/projects/froggy-protocol/index.js @@ -23,4 +23,5 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2023-06-15')/1e3), 'Rug Pull ?'], ], + deadFrom: Math.floor(new Date('2023-06-15')/1e3) } \ No newline at end of file diff --git a/projects/fuel/index.js b/projects/fuel/index.js new file mode 100644 index 0000000000..617fa74d2d --- /dev/null +++ b/projects/fuel/index.js @@ -0,0 +1,15 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + "0xAEB0c00D0125A8a788956ade4f4F12Ead9f65DDf", + "0xa4cA04d02bfdC3A2DF56B9b6994520E69dF43F67", + ], + fetchCoValentTokens: true, + }), + }, +}; diff --git a/projects/fujidao-v2/index.js b/projects/fujidao-v2/index.js index 1e1f2c241a..dd832d0c0d 100644 --- a/projects/fujidao-v2/index.js +++ b/projects/fujidao-v2/index.js @@ -81,24 +81,25 @@ Object.keys(config).forEach(chain => { const assets = bassets.concat(yassets) const debtAssets = blogs.map(log => log.debtAsset) - - const bals = await api.multiCall({ abi: 'uint256:totalAssets', calls: vaults }) - const debtBals = await api.multiCall({ abi: 'uint256:totalDebt', calls: bvaults, permitFailure: true, }) - bals.forEach((bal, i) => { - api.add(assets[i], bal) - }) + const [bals, debtBals] = await Promise.all([ + api.multiCall({ abi: 'uint256:totalAssets', calls: vaults, permitFailure: true }), + api.multiCall({ abi: 'uint256:totalDebt', calls: bvaults, permitFailure: true, }) + ]) - debtAssets.forEach((bal, i) => { - if (!debtBals[i]) { - return; - // if (+bal === 0) return; - // throw new Error(`No debt balance for ${bvaults[i]}`) - } - api.add(debtAssets[i], debtBals[i] * -1) + vaults.map((_, i) => { + const asset = assets[i] + const bal = bals[i] + if (!bal) return + api.add(asset, bal) }) - return api.getBalances() + bvaults.map((_, i) => { + const debtAsset = debtAssets[i] + const debtBal = debtBals[i] + if (!debtBal) return + api.add(debtAsset, debtBal * -1) + }) }, borrowed: async (api) => { let logs = []; @@ -119,17 +120,18 @@ Object.keys(config).forEach(chain => { } const vaults = logs.map(log => log.vault) const debtAssets = logs.map(log => log.debtAsset) - const bals = await api.multiCall({ abi: 'uint256:totalAssets', calls: vaults }) - const debtBals = (await api.multiCall({ abi: 'uint256:totalDebt', calls: vaults, permitFailure: true, })) - bals.forEach((bal, i) => { - if (!debtBals[i]) { - return; - // if (+bal === 0) return; - // throw new Error(`No debt balance for ${vaults[i]}`) - } - api.add(debtAssets[i], debtBals[i]) - }) - return api.getBalances() + + const [bals, debtBals] = await Promise.all([ + api.multiCall({ abi: 'uint256:totalAssets', calls: vaults, permitFailure: true }), + api.multiCall({ abi: 'uint256:totalDebt', calls: vaults, permitFailure: true }) + ]) + + vaults.forEach((_, i) => { + const debtBal = debtBals[i] + const debtAsset = debtAssets[i] + if (!debtBal) return + api.add(debtAsset, debtBal) + }) } } }) \ No newline at end of file diff --git a/projects/fulcrom/index.js b/projects/fulcrom/index.js index b31fd2f487..9f53c9cc65 100644 --- a/projects/fulcrom/index.js +++ b/projects/fulcrom/index.js @@ -2,6 +2,7 @@ const { sumTokens2 } = require('../helper/unwrapLPs') const CRO_VAULT_ADDR = '0x8C7Ef34aa54210c76D6d5E475f43e0c11f876098'; const ZKSYNC_VAULT_ADDR = '0x7d5b0215EF203D0660BC37d5D09d964fd6b55a1E'; +const CRO_ZKEVM_VAULT_ADDR = '0xdDDf221d5293619572616574Ff46a2760f162075'; function fulExports({ vault, }) { return async (api) => { @@ -27,4 +28,7 @@ module.exports = { era: { tvl: fulExports({ vault: ZKSYNC_VAULT_ADDR, }), }, + cronos_zkevm: { + tvl: fulExports({ vault: CRO_ZKEVM_VAULT_ADDR, }), + }, } diff --git a/projects/fundex/index.js b/projects/fundex/index.js index c8a1a94223..ad99f429ed 100644 --- a/projects/fundex/index.js +++ b/projects/fundex/index.js @@ -9,7 +9,8 @@ const config = { module.exports = { hallmarks: [ [1680134400, "Rugpull"] - ] + ], + deadFrom: '2023-03-30' }; Object.keys(config).forEach(chain => { module.exports[chain] = {tvl} }) diff --git a/projects/furucombo/index.js b/projects/furucombo/index.js index a3263e5d93..e411dd4ce6 100644 --- a/projects/furucombo/index.js +++ b/projects/furucombo/index.js @@ -1,22 +1,23 @@ const { getLogs } = require('../helper/cache/getLogs') -const config = { - polygon: { factory: '0xFD1353baBf86387FcB6D009C7b74c1aB2178B304', fromBlock: 29080112 }, + +const factory = '0xFD1353baBf86387FcB6D009C7b74c1aB2178B304' +const fromBlock = '29080112' + +const tvl = async (api) => { + const logs = await getLogs({ + api, + target: factory, + eventAbi: 'event FundCreated (address indexed newFund, address comptroller, address shareToken, address vault)', + onlyArgs: true, + fromBlock, + }) + + const tokens = await api.multiCall({ abi: 'address[]:getAssetList', calls: logs.map(l => l.newFund) }) + const ownerTokens = tokens.map((t, i) => [t, logs[i].vault]) + return api.sumTokens({ ownerTokens }) } -Object.keys(config).forEach(chain => { - const { factory, fromBlock} = config[chain] - module.exports[chain] = { - tvl: async (api) => { - const logs = await getLogs({ - api, - target: factory, - eventAbi: 'event FundCreated (address indexed newFund, address comptroller, address shareToken, address vault)', - onlyArgs: true, - fromBlock, - }) - const tokens = await api.multiCall({ abi: 'address[]:getAssetList', calls: logs.map(l => l.newFund) }) - const ownerTokens = tokens.map((t, i) => [t, logs[i].vault]) - return api.sumTokens({ ownerTokens }) - } - } -}) \ No newline at end of file +module.exports = { + deadFrom: '2024-12-09', + polygon : { tvl : () => ({}) } +} diff --git a/projects/fusefi-lending/index.js b/projects/fusefi-lending/index.js index dacc669eb4..a3e80b5e52 100644 --- a/projects/fusefi-lending/index.js +++ b/projects/fusefi-lending/index.js @@ -1,24 +1,10 @@ -const { usdCompoundExports } = require('../helper/compound'); +const { compoundExports2 } = require('../helper/compound'); -const unitroller_fuse = "0x26a562B713648d7F3D1E1031DCc0860A4F3Fa340" - -const abis = { - oracle: "address:getRegistry", - underlyingPrice: "function getPriceForUnderling(address cToken) view returns (uint256)", -} - -const olalending = usdCompoundExports(unitroller_fuse, "fuse", "0x025B0ff0920298e087308F3b2de0CF6399685909", abis) module.exports = { - fuse:{ - tvl: olalending.tvl, - borrowed: async function(api){ - if(api.timestamp >= 1648684800){ - return {} - } - return olalending.borrowed(api) - } - }, + fuse: compoundExports2({ comptroller: '0x26a562B713648d7F3D1E1031DCc0860A4F3Fa340'}), hallmarks: [ [1648684800, "Ola Finance exploit"] ] -} \ No newline at end of file +} + +module.exports.fuse.borrowed = () => ({}) \ No newline at end of file diff --git a/projects/future-swap/index.js b/projects/future-swap/index.js index 389f72125f..ba2738761a 100644 --- a/projects/future-swap/index.js +++ b/projects/future-swap/index.js @@ -24,7 +24,7 @@ async function farmStakings(api) { module.exports = { findora: { - start: 1677029212, // 2023-02-22 01:26:52 UTC + start: '2023-02-22', // 2023-02-22 01:26:52 UTC methodology: `Sum of liqudities backed USDF; and tokens values staked in the FutureSwap Farm.`, tvl: sumTokensExport({ owner: FutureSwapContracts.USDF, diff --git a/projects/futureswap/index.js b/projects/futureswap/index.js index d4cf03ead5..f1c1727848 100644 --- a/projects/futureswap/index.js +++ b/projects/futureswap/index.js @@ -47,7 +47,7 @@ async function avax(timestamp, _, { avax: block }) { } module.exports = { - start: 1609459200, // unix timestamp (utc 0) specifying when the project began, or where live data begins + start: '2021-01-01', // unix timestamp (utc 0) specifying when the project began, or where live data begins ethereum: { tvl }, arbitrum: { tvl: arbitrum }, avax: { tvl: avax }, diff --git a/projects/fwx-dex/index.js b/projects/fwx-dex/index.js index 5a1bd24e4a..42496072ef 100644 --- a/projects/fwx-dex/index.js +++ b/projects/fwx-dex/index.js @@ -1,37 +1,17 @@ -const { getLogs } = require('../helper/cache/getLogs') -const { transformDexBalances } = require('../helper/portedTokens') - -const config = { - avax: { factory: '0x2131Bdb0E0B451BC1C5A53F2cBC80B16D43634Fa', fromBlock: 46372045 }, -} +const { getUniTVL } = require('../helper/unknownTokens'); module.exports = { misrepresentedTokens: true, -}; - -Object.keys(config).forEach(chain => { - module.exports[chain] = { tvl } -}) - - -async function tvl(api) { - const { factory, fromBlock } = config[api.chain] - const logs = await getLogs({ - api, - target: factory, - topics: ['0x0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9'], - eventAbi: 'event PairCreated(address indexed token0, address indexed token1, address pair, uint256 )', - onlyArgs: true, - fromBlock, - }) - const tok0Bals = await api.multiCall({ abi: 'erc20:balanceOf', calls: logs.map(i => ({ target: i.token0, params: i.pair })) }) - const tok1Bals = await api.multiCall({ abi: 'erc20:balanceOf', calls: logs.map(i => ({ target: i.token1, params: i.pair })) }) - return transformDexBalances({ - chain: api.chain, data: logs.map((log, i) => ({ - token0: log.token0, - token0Bal: tok0Bals[i], - token1: log.token1, - token1Bal: tok1Bals[i], - })) - }) -} \ No newline at end of file + avax: { + tvl: getUniTVL({ + factory: '0x2131Bdb0E0B451BC1C5A53F2cBC80B16D43634Fa', + useDefaultCoreAssets: true, + }) + }, + base: { + tvl: getUniTVL({ + factory: '0x3512DA8F30D9AE6528e8e0787663C14Fe263Fbea', + useDefaultCoreAssets: true, + }) + } +}; \ No newline at end of file diff --git a/projects/fwx/index.js b/projects/fwx/index.js index 20fe4a4eaa..c5a59d4659 100644 --- a/projects/fwx/index.js +++ b/projects/fwx/index.js @@ -1,37 +1,54 @@ -const { getLogs2 } = require('../helper/cache/getLogs') const { getConfig } = require('../helper/cache') -const xliplessDex = "0x82E90fB94fd9a5C19Bf38648DD2C9639Bde67c74" - module.exports = { avax: { tvl, }, + base: { + tvl, + } +} + +const dexes = { + avax: [ + "0x82E90fB94fd9a5C19Bf38648DD2C9639Bde67c74", // xliplessDex + ], + base: [ + "0xaf5a41Ad65752B3CFA9c7F90a516a1f7b3ccCdeD" // perp + ] } async function tvl(api) { - const { assets } = await getConfig('fwx/'+api.chain, "https://app.fwx.finance/api/v2/assets?chain_id=43114") + + const { assets } = await getConfig('fwx/' + api.chain, "https://app.fwx.finance/api/v2/assets?chain_id=" + api.chainId) let tokensAndOwners = []; for (let i = 0; i < assets.length; i++) { const asset = assets[i] - tokensAndOwners.push( - [asset.token_address, asset.pool_address], - [asset.token_address, asset.core_address], - [asset.token_address, xliplessDex], - ); + const tokenAddr = asset.token_address + const poolAddr = asset.pool_address + const coreAddr = asset.core_address + const dexAddrs = dexes[api.chain] + + if (poolAddr != "") { + tokensAndOwners.push( + [tokenAddr, poolAddr], + ); + } + + if (coreAddr != "") { + tokensAndOwners.push( + [tokenAddr, coreAddr], + ); + } + + for (let i = 0; i < dexAddrs.length; i++) { + const dexAddr = dexAddrs[i] + tokensAndOwners.push( + [tokenAddr, dexAddr], + ); + } } - const FACTORY_SUB_MODULE_PROXY = '0x54b048eB204B7CbBb469901fdb5BbfB80d0F0CD1' - const logs = await getLogs2({ - api, - factory: FACTORY_SUB_MODULE_PROXY, - eventAbi: "event CreateMarket(address indexed creator, address core, address collateralPool, address collateralToken, address underlyingPool, address underlyingToken, bytes32 pairbytes)", - fromBlock: 46125548, - }) - logs.forEach(i => { - tokensAndOwners.push([i.collateralToken, i.collateralPool]) - tokensAndOwners.push([i.underlyingToken, i.underlyingPool]) - }) return api.sumTokens({ tokensAndOwners }) } diff --git a/projects/fx-Protocol/index.js b/projects/fx-Protocol/index.js index a4f998796b..a3943238dc 100644 --- a/projects/fx-Protocol/index.js +++ b/projects/fx-Protocol/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const treasuries = [ "0x0e5CAA5c889Bdf053c9A76395f62267E653AFbb0", "0xED803540037B0ae069c93420F89Cd653B6e3Df1f", @@ -7,6 +8,21 @@ const treasuries = [ "0x63Fe55B3fe3f74B42840788cFbe6229869590f83", "0xdFac83173A96b06C5D6176638124d028269cfCd2" ]; +const baseTokenRate = [ + // '', + '0x81A777c4aB65229d1Bf64DaE4c831bDf628Ccc7f', + '0x7ceD6167b5A08111dC8d0D2f9F7E482c4Da62506', + '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee', + '0xE3fF08070aB3aD7eeE7a1cab35105F27DF8EfF10', + // '', + '0x6Eb03222179F83126735D7E9FdE94571D716D399' +] +const cvxAddress = ADDRESSES.ethereum.CVX; +const aCVX = "0xb0903Ab70a7467eE5756074b31ac88aEBb8fB777"; +const uniBTC = "0x004E9C3EF86bc1ca1f0bB5C7662861Ee93350568"; +const uniBTC_Genesis_Gauge = "0x1D20671A21112E85b03B00F94Fd760DE0Bef37Ba" +const fxUSD_stabilityPool = "0x65C9A641afCEB9C0E6034e558A319488FA0FA3be" +const fxUSD_stabilityPool_Gauge = "0xEd92dDe3214c24Ae04F5f96927E3bE8f8DbC3289" module.exports = { doublecounted: true, @@ -15,9 +31,41 @@ module.exports = { }, }; +async function getACVXInfo(api) { + const totalAssets = await api.api.call( + { + target: aCVX, + abi: 'uint256:totalAssets', + }) + const totalSupply = await api.api.call( + { + target: aCVX, + abi: 'uint256:totalSupply', + }) + return totalAssets / totalSupply +} + +async function getBaseTokenRate(api) { + const rates = await api.multiCall({ abi: 'uint256:getRate', calls: baseTokenRate }) + rates.splice(0, 0, 1e18); + rates.splice(5, 0, 1e18); + return rates +} + async function tvl(api) { + const aCvxRate = await getACVXInfo(api) + const rates = await getBaseTokenRate(api) const tokens = await api.multiCall({ abi: 'address:baseToken', calls: treasuries }) const bals = await api.multiCall({ abi: 'uint256:totalBaseToken', calls: treasuries }) const decimals = await api.multiCall({ abi: 'erc20:decimals', calls: tokens }) - bals.forEach((bal, i) => api.add(tokens[i], bal / 10 ** (18 - decimals[i]))) + bals.forEach((bal, i) => { + if (tokens[i].toLowerCase() === aCVX.toLowerCase()) { + api.add(cvxAddress, bal / (rates[i] / 1e18) * aCvxRate / 10 ** (18 - decimals[i])) + } else { + api.add(tokens[i], bal / (rates[i] / 1e18) / 10 ** (18 - decimals[i])) + } + }) + + const tokensAndOwners = [[uniBTC, uniBTC_Genesis_Gauge], [ADDRESSES.ethereum.USDC, fxUSD_stabilityPool]] + return api.sumTokens({ tokensAndOwners }) } \ No newline at end of file diff --git a/projects/fxdao/api.js b/projects/fxdao/api.js new file mode 100644 index 0000000000..8843008c09 --- /dev/null +++ b/projects/fxdao/api.js @@ -0,0 +1,28 @@ +const { SorobanRpc, Networks, Address, xdr, Asset, scValToNative } = require('@stellar/stellar-sdk'); + +const VAULTS_CONTRACT_ID = "CCUN4RXU5VNDHSF4S4RKV4ZJYMX2YWKOH6L4AKEKVNVDQ7HY5QIAO4UB"; +const rpcUrl = 'https://soroban-rpc.creit.tech/'; +const server = new SorobanRpc.Server(rpcUrl); + +async function tvl(api) { + const response = await server.getContractData( + Asset.native().contractId(Networks.PUBLIC), + xdr.ScVal.scvVec([ + xdr.ScVal.scvSymbol('Balance'), + new Address(VAULTS_CONTRACT_ID).toScVal(), + ]), + SorobanRpc.Durability.Persistent + ); + const balance = scValToNative(response.val.value().val()).amount; + const parsedBalance = Number(balance) / 1e7; + api.addCGToken('stellar', parsedBalance); + return api.getBalances() +} + +module.exports = { + timetravel: false, + methodology: `Takes the total amount of XLMs locked in the Vaults contract, the XLMs are the collateral of the issued assets by the protocol.`, + stellar: { + tvl, + }, +}; diff --git a/projects/fxdao/index.js b/projects/fxdao/index.js new file mode 100644 index 0000000000..d90f5cb24e --- /dev/null +++ b/projects/fxdao/index.js @@ -0,0 +1,7 @@ +const { getExports } = require('../helper/heroku-api') + +module.exports = { + timetravel: false, + methodology: `Takes the total amount of XLMs locked in the Vaults contract, the XLMs are the collateral of the issued assets by the protocol.`, + ...getExports("fxdao", ['stellar']) +}; diff --git a/projects/g8keep/index.js b/projects/g8keep/index.js new file mode 100644 index 0000000000..c41239e858 --- /dev/null +++ b/projects/g8keep/index.js @@ -0,0 +1,20 @@ +const { getLogs2 } = require('../helper/cache/getLogs') +const { sumUnknownTokens } = require('../helper/unknownTokens') + +const config = { + base: { factory: '0x3C0B43867Cd04fEdfD6a95497e5ea7e3aFF8cCaE', fromBlock: 21977940 }, +} + +Object.keys(config).forEach(chain => { + const { factory, fromBlock } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: 'event TokenDeployed (address indexed token, address indexed pair, address indexed deployer, string symbol)', fromBlock, }) + const tokens = logs.map(log => log.pair) + return sumUnknownTokens({api, owner: factory, tokens, useDefaultCoreAssets: true, lps: tokens}) + } + } +}) + +module.exports.doublecounted = true +module.exports.misrepresentedTokens = true \ No newline at end of file diff --git a/projects/gainsNetwork.js b/projects/gainsNetwork.js index 7e99fc19df..e8e99abbf5 100644 --- a/projects/gainsNetwork.js +++ b/projects/gainsNetwork.js @@ -1,40 +1,66 @@ const ADDRESSES = require('./helper/coreAssets.json') const { pool2 } = require("./helper/pool2"); const { staking } = require("./helper/staking"); -const { sumTokens2 } = require("./helper/unwrapLPs"); +const { sumTokens2, nullAddress } = require("./helper/unwrapLPs"); const tokens = { polygon: { DAI: ADDRESSES.polygon.DAI, - dQUICK: "0xf28164a485b0b2c90639e47b0f377b4a438a16b1", + USDC: ADDRESSES.polygon.USDC_CIRCLE, + WETH: ADDRESSES.polygon.WETH_1 }, arbitrum: { - DAI: ADDRESSES.optimism.DAI, + DAI: ADDRESSES.arbitrum.DAI, + USDC: ADDRESSES.arbitrum.USDC_CIRCLE, + WETH: ADDRESSES.arbitrum.WETH + }, + base: { + USDC: ADDRESSES.base.USDC, }, }; async function polyTvl(api) { const tokensAndOwners = [ - [tokens.polygon.dQUICK, "0x151757c2E830C467B28Fe6C09c3174b6c76aA0c5"], - [tokens.polygon.dQUICK, "0x203F5c9567d533038d2da70Cbc20e6E8B3f309F9"], - [tokens.polygon.DAI, "0xaee4d11a16B2bc65EDD6416Fb626EB404a6D65BD"], - [tokens.polygon.DAI, "0xd7052EC0Fe1fe25b20B7D65F6f3d490fCE58804f"], - [tokens.polygon.DAI, "0x91993f2101cc758D0dEB7279d41e880F7dEFe827"], - [tokens.polygon.DAI, "0xaee4d11a16B2bc65EDD6416Fb626EB404a6D65BD"], + [tokens.polygon.DAI, "0x91993f2101cc758D0dEB7279d41e880F7dEFe827"], // gDAI + [tokens.polygon.USDC, "0x29019Fe2e72E8d4D2118E8D0318BeF389ffe2C81"], // gUSDC + [tokens.polygon.WETH, "0x1544E1fF1a6f6Bdbfb901622C12bb352a43464Fb"], // gETH + [tokens.polygon.DAI, "0x209A9A01980377916851af2cA075C2b170452018"], // Diamond + [tokens.polygon.WETH, "0x209A9A01980377916851af2cA075C2b170452018"], // Diamond + [tokens.polygon.USDC, "0x209A9A01980377916851af2cA075C2b170452018"], // Diamond ]; return sumTokens2({ api, tokensAndOwners }); } async function arbiTvl(api) { const tokensAndOwners = [ - [tokens.arbitrum.DAI, "0xd85E038593d7A098614721EaE955EC2022B9B91B"], - [tokens.arbitrum.DAI, "0xcFa6ebD475d89dB04cAd5A756fff1cb2BC5bE33c"], + [tokens.arbitrum.DAI, "0xd85E038593d7A098614721EaE955EC2022B9B91B"], // gDAI + [tokens.arbitrum.USDC, "0xd3443ee1e91aF28e5FB858Fbd0D72A63bA8046E0"], // gUSDC + [tokens.arbitrum.WETH, "0x5977A9682D7AF81D347CFc338c61692163a2784C"], // gETH + [tokens.arbitrum.DAI, "0xFF162c694eAA571f685030649814282eA457f169"], // Diamond + [tokens.arbitrum.USDC, "0xFF162c694eAA571f685030649814282eA457f169"], // Diamond + [tokens.arbitrum.WETH, "0xFF162c694eAA571f685030649814282eA457f169"], // Diamond + ]; + return sumTokens2({ api, tokensAndOwners }); +} +async function baseTvl(api) { + const tokensAndOwners = [ + [tokens.base.USDC, "0xad20523A7dC37bAbc1CC74897E4977232b3D02e5"], // gUSDC + [tokens.base.USDC, "0x6cD5aC19a07518A8092eEFfDA4f1174C72704eeb"], // Diamond ]; return sumTokens2({ api, tokensAndOwners }); } + +async function apeTvl(api) { + // `0x00000000000f7e000644657dC9417b185962645a` is gTrade's own version of wAPE + // All trading and depositing happens in native tokens and held in custom non-rebasing wAPE + return sumTokens2({ owner: '0x00000000000f7e000644657dC9417b185962645a', tokens: [nullAddress], api}); +} // node test.js projects/gainsNetwork.js module.exports = { hallmarks: [ - [1672531200,"Launch on Arbitrum"] + [1672531200,"Launch on Arbitrum"], + [1705553229,"Launched gETH and gUSDC"], + [1727650801,"Launch on Base"], + [1732233600,"Launch on ApeChain"], ], polygon: { tvl: polyTvl, @@ -49,4 +75,12 @@ module.exports = { tvl: arbiTvl, staking: staking(['0x6b8d3c08072a020ac065c467ce922e3a36d3f9d6', '0x7edDE7e5900633F698EaB0Dbc97DE640fC5dC015'], '0x18c11fd286c5ec11c3b683caa813b77f5163a122'), }, + base: { + tvl: baseTvl, + staking: staking(['0x28efAa11199DAF45AA8fBf95f920e5bc090DCbF3'], '0xFB1Aaba03c31EA98A3eEC7591808AcB1947ee7Ac'), + }, + apechain: { + tvl: apeTvl, + staking: staking(['0x6dCD75474F9BDE2793cb3Da00b8959fb27BFa9d5'], '0xe31C676d8235437597581b44c1c4f8A30e90b38a'), + }, }; diff --git a/projects/galador-io/index.js b/projects/galador-io/index.js index 8d3f6eb064..6e98786ece 100644 --- a/projects/galador-io/index.js +++ b/projects/galador-io/index.js @@ -3,6 +3,6 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, mantle: { - tvl: getUniTVL({ factory: '0x6F602b6F11F174c627813262fA713F334ca20aA6', fetchBalances: true, useDefaultCoreAssets: true }), + tvl: getUniTVL({ factory: '0x6F602b6F11F174c627813262fA713F334ca20aA6', useDefaultCoreAssets: true }), }, }; \ No newline at end of file diff --git a/projects/gamblefi/index.js b/projects/gamblefi/index.js index 9e6513d038..753272d607 100644 --- a/projects/gamblefi/index.js +++ b/projects/gamblefi/index.js @@ -1,50 +1,20 @@ -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const ADDRESSES = require('../helper/coreAssets.json') const { staking } = require("../helper/staking"); -const sdk = require("@defillama/sdk"); const betifystaking = "0x335CAC92af7015BE7802170B62Ebc4C74900484d"; const betify = "0xD465b6B4937D768075414D413e981Af0b49349Cc"; const treasury = "0x596a6DFf0CF36fABf75EDeB6aA2992C950Ff14bA"; const dao = "0xEe376093ccDB3D81f226C2290868219687226845"; -const wBETSLIP = "0x3e7dfdd82965515e9b6398d91b991f5d4c830ef6"; const revenueShare = "0x40822C8E1389dE62980691bF0AFBd5B8D1D56cB7"; -async function tvl(timestamp, ethBlock, chainBlocks) { - const balances = {}; - const transform = (addr) => - addr.toLowerCase() === "0xF2001B145b43032AAF5Ee2884e456CCd805F677D" - ? "0xF2001B145b43032AAF5Ee2884e456CCd805F677D" - : `cronos:${addr}`; - - await sumTokensAndLPsSharedOwners( - balances, - [ - // [usdc, false] - ["0xf2001b145b43032aaf5ee2884e456ccd805f677d", false], // DAI - ["0x76f0adfff61fd9a542a36a98b96909ec7d3a8c53", true], // BETIFY-DAI - ["0xe2c5275d86D2fB860F19a2CbBED9967d39AA73e8", true], // BETIFY-MMF - ["0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23", false], // WCRO - ["0x3e7dfdd82965515e9b6398d91b991f5d4c830ef6", false], // wBETSLIP - ], - [treasury, dao, revenueShare], - chainBlocks.metis, - "cronos", - transform - ); - - const wbetslipAddress = transform(wBETSLIP); - - const betslip = await sdk.api.abi.call({ - target: wBETSLIP, - abi: 'function wBTSToBTS(uint256 _amount) view returns (uint256)', - chain: "cronos", - block: chainBlocks.cronos, - params: [sdk.util.convertToBigInt(balances[wbetslipAddress])], - }); - balances[transform(betify)] = betslip.output; - delete balances[wbetslipAddress]; - - return balances; +async function tvl(api) { + return api.sumTokens({ owners: [treasury, dao, revenueShare], tokens: [ + "0xf2001b145b43032aaf5ee2884e456ccd805f677d", + "0x76f0adfff61fd9a542a36a98b96909ec7d3a8c53", + "0xe2c5275d86D2fB860F19a2CbBED9967d39AA73e8", + ADDRESSES.cronos.WCRO_1, + "0x3e7dfdd82965515e9b6398d91b991f5d4c830ef6", + ] }) } module.exports = { cronos: { diff --git a/projects/gammaswap/index.js b/projects/gammaswap/index.js index 189b291cc6..2b3d893e3e 100644 --- a/projects/gammaswap/index.js +++ b/projects/gammaswap/index.js @@ -1,5 +1,6 @@ const { getLogs } = require('../helper/cache/getLogs') const { sumTokens2 } = require('../helper/unwrapLPs') +const { staking } = require('../helper/staking') const config = { arbitrum: { @@ -28,4 +29,6 @@ Object.keys(config).forEach(chain => { return sumTokens2({ ownerTokens, api, resolveLP: true, }) } } -}) \ No newline at end of file +}) + +module.exports.arbitrum.staking = staking("0x9b4D784E1cCaf038AEa4BFa837262704caF78B66", "0xb08d8becab1bf76a9ce3d2d5fa946f65ec1d3e83") \ No newline at end of file diff --git a/projects/garden/index.js b/projects/garden/index.js index a5244db1cc..5b1453b395 100644 --- a/projects/garden/index.js +++ b/projects/garden/index.js @@ -1,28 +1,27 @@ const ADDRESSES = require("../helper/coreAssets.json"); const { sumTokensExport } = require("../helper/sumTokens"); const sdk = require("@defillama/sdk"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const SEED_TOKEN_ADDRESS = "0x86f65121804D2Cdbef79F9f072D4e0c2eEbABC08"; // SEED TOKEN (Garden's Governance Token) Address const STAKING_CONTRACT_ADDRESS = "0xe2239938Ce088148b3Ab398b2b77Eedfcd9d1AfC"; - -const BTC_LIQUIDITY_ADDRESS = "bc1qhww67feqfdf6xasjat88x5stqa6vzx0c6fgtnj"; -const WBTC_LIQUIDITY_ADDRESS = "0x9DD9C2D208B07Bf9A4eF9CA311F36d7185749635"; +const WBTC_LIQUIDITY_ADDRESSES = ["0x9DD9C2D208B07Bf9A4eF9CA311F36d7185749635","0xEF440AC3D77F906F9F0E1C15B35BCF300B4C427C"]; module.exports = { bitcoin: { tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners: [BTC_LIQUIDITY_ADDRESS] }), + sumTokensExport({ owners: bitcoinAddressBook.garden }), ]), }, ethereum: { tvl: sumTokensExport({ - owners: [WBTC_LIQUIDITY_ADDRESS], + owners: WBTC_LIQUIDITY_ADDRESSES, tokens: [ADDRESSES.ethereum.WBTC], }), }, arbitrum: { tvl: sumTokensExport({ - owners: [WBTC_LIQUIDITY_ADDRESS], + owners: WBTC_LIQUIDITY_ADDRESSES, tokens: [ADDRESSES.arbitrum.WBTC], }), staking: sumTokensExport({ diff --git a/projects/gasp-xyz/index.js b/projects/gasp-xyz/index.js new file mode 100644 index 0000000000..68a7c6e430 --- /dev/null +++ b/projects/gasp-xyz/index.js @@ -0,0 +1,15 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') + +// taken from https://gasp-stash-prod-dot-direct-pixel-353917.oa.r.appspot.com/affirmed-network/list +const config = { + ethereum: '0x79d968d9017B96f202aD4673A2c1BBbdc905A4ca', + arbitrum: '0x3aDdEb54ddd43Eb40235eC32DfA7928F28A44bb5', + base: '0x308e483afDD225D6cb7bF4d44B8e4a03DFD9c0De', +} + +Object.keys(config).forEach(chain => { + const owner = config[chain] + module.exports[chain] = { + tvl: sumTokensExport({ owner, fetchCoValentTokens: true }) + } +}) \ No newline at end of file diff --git a/projects/gaspump/index.js b/projects/gaspump/index.js new file mode 100644 index 0000000000..364e279233 --- /dev/null +++ b/projects/gaspump/index.js @@ -0,0 +1,21 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { fetchURL } = require('../helper/utils'); + +async function fetchTvl(api) { + const response = await fetchURL("https://api.gas111.com/api/v1/internal/tokens/balances-list") + for (const pool of response.data) { + api.add(ADDRESSES.ton.TON, pool.bonding_curve_balance) + } +} + + +module.exports = { + methodology: ` + Each token launched via gaspump has a bonding curve. The TVL is the sum of all bonding curve balances. + It is slightly different from the address balance, which is composed from curve balance + fees accumulated. + `.trim(), + timetravel: false, + ton: { + tvl: fetchTvl + } +} diff --git a/projects/gate-io/index.js b/projects/gate-io/index.js index 7c7a175956..4ead38599b 100644 --- a/projects/gate-io/index.js +++ b/projects/gate-io/index.js @@ -1,114 +1,1660 @@ -const { cexExports } = require('../helper/cex') +const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require("../helper/bitcoin-book/index.js"); + const config = { - ethereum: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0x234ee9e35f8e9749a002fc42970d570db716453b', - //'0x925206b8a707096Ed26ae47C84747fE0bb734F59', //this should never be here, its the WBT token wallet - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - ], - }, - avax: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - ] - }, - arbitrum: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - ] - }, - polygon: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - ] - }, - fantom: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - ] - }, - bsc: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - ] - }, - optimism: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - ] - }, - era: { - owners: [ - '0x0d0707963952f2fba59dd06f2b425ace40b492fe', - '0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c', - '0x234ee9e35f8e9749a002fc42970d570db716453b', - // '0x925206b8a707096Ed26ae47C84747fE0bb734F59', - '0xD793281182A0e3E023116004778F45c29fc14F19', - '0xc882b111a75c0c657fc507c04fbfcd2cc984f071', - '0x85FAa6C1F2450b9caEA300838981C2e6E120C35c', - '0xeb01f8cdae433e7b55023ff0b2da44c4c712dce2', + "ethereum": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x234ee9e35f8e9749a002fc42970d570db716453b", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x246a2ecd9626f9eda55fffbff5216ed417a904f5", + "0x840760aed6bbd878c46c5850d3af0a61afcd09c8", + "0x35b31ae2604dd81d9456205025ea02418dba8242", + "0xd87C8e083AECc5405B0107c90D8E0C7F70996B84", + "0x60618B3c6E3164c4a72d352Bde263A5D15f9F7eE", + "0xa4992ccf2a74132936b87cbf28b5d52304ba3be7", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1f92332145465f3e536b7be301dde8d420478387", + "0x2bea9375c50f41f828c4e8eb0da3194449b5f062", + "0x54c82d26624e85000d1387ee7c9580c3c6d7b5b7", + "0x0fc73ffb9a0ded685234428e103d26b3762df460", + "0x7750fe679d47a9e00575ad46043297a234e83fa2", + "0xa2df23519a6059dbc6f027f6cf8e59bdaecaf56f", + "0x4bbe1961bd0a6cd1fe3cd8947be15bd8ae2ee562", + "0xd793281182a0e3e023116004778f45c29fc14f19", + "0x354e0184a6a6e634ccb07388e2617e05e427563c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "avax": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + ] + }, + "arbitrum": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "polygon": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xa4992ccf2a74132936b87cbf28b5d52304ba3be7", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x54c82d26624e85000d1387ee7c9580c3c6d7b5b7", + "0x1f92332145465f3e536b7be301dde8d420478387", + "0x7750fe679d47a9e00575ad46043297a234e83fa2", + "0x0fc73ffb9a0ded685234428e103d26b3762df460", + "0xa2df23519a6059dbc6f027f6cf8e59bdaecaf56f", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "fantom": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xa4992ccf2a74132936b87cbf28b5d52304ba3be7", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "bsc": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xa4992ccf2a74132936b87cbf28b5d52304ba3be7", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "optimism": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "era": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x234ee9e35f8e9749a002fc42970d570db716453b", + "0xD793281182A0e3E023116004778F45c29fc14F19", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x85FAa6C1F2450b9caEA300838981C2e6E120C35c", + "0xeb01f8cdae433e7b55023ff0b2da44c4c712dce2", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" ] }, bitcoin: { - owners: [ - '14kmvhQrWrNEHbrSKBySj4qHGjemDtS3SF', - '162bzZT2hJfv5Gm3ZmWfWfHJjCtMD6rHhw', - '1EkkGXR7dTbZbrKFKoe6YEP4gj4GzMeKvw', - '1G47mSr3oANXMafVrR8UC4pzV7FEAzo3r9', - '1HpED69tpKSaEaWpY3Udt1DtcVcuCUoh2Y', - '3HroDXv8hmzKRtaSfBffRgedKpru8fgy6M', + owners: bitcoinAddressBook.gateIo, + }, + "tron": { + "owners": [ + "TBA6CypYJizwA9XdC7Ubgc5F1bxrQ7SqPt", + "TCYpJ6MMzd9ytoUvD82HnS58iV75QimPh6", + "TDHkXgDHEiK5WhaKTccJenZKRyUMTxoREx", + "TN1K2zNVA399AHbp51yyPPfjaD9JNLfQpo", + "TUt2HuZFZvXAMmF9uh7BqujvMXsZ4F1pif", + "TCr9697xxWMbZznvpJh8uVQzAQR9cLXZm9", + "TDyR4wBeodpigiKmnwyBQC8UfsCH1T25XF", + "THhVZfr2Q4J3spWK84Je4ALiFyrnnSq6nN", + "TZJNuEg5VaYLR9kdQfjj7WE6jh4vt9JMp2" + ] + }, + "cardano": { + "owners": [ + "DdzFFzCqrhseMuShaXzLDGDBa8jGEjdEjNc83jouqdqBQzk5R52MedutUq3QGdMPiauR5SjbttqdBjDA5g6rf3H6LjpvK3dFsf8yZ6qo", + "DdzFFzCqrhtBatWqyFge4w6M6VLgNUwRHiXTAg3xfQCUdTcjJxSrPHVZJBsQprUEc5pRhgMWQaGciTssoZVwrSKmG1fneZ1AeCtLgs5Y", + "addr1qyzppj9mh28q9d7x070j7aphnn6dx5lsh203zukzs7q68jqf08fcmxg8h9tvx8m529hjjnm9g3pt8vlkh95em7nup32sm78295", + "addr1q9lqxlvk2dk8sffhr56gc4c4lckpv56l4r7wwh474caywurve9ssnt966vmezsfsppfm5sxgu5sqxacp8t7kpjzp9yxqn24ckj" + ] + }, + "solana": { + "owners": [ + "u6PJ8DtQuPFnfmwHbGFULQ4u4EgjDiyYKjVEsynXq2w", + "HiRpdAZifEsZGdzQ5Xo5wcnaH3D2Jj9SoNsUzcYNK78J", + "CLNEVwuSAiGsvPtE74yLhda4beNfd8qfZXVKkUcAJZDL", + "CVMV7614DjSjY114GwHhG1HNFXofceziDpuGz7VjDD5K", + "G9XFfWz6adb9wFDKN2v7HfmJDgAc2hirrTwBmca4w26C", + "E2tbmDk29G6jHdrgwHC6kXGFfDsyrXUyWjD3e3ZB4oNp", + "EnYo9PZuYwhJNi2hnk5AgsJaoNegscFF5CJkSPx1f7td", + "HMbkbJVNitT3t4EtaDJeUtwfTFGYcjU6vhE7h7dqxDzJ" + ] + }, + "ripple": { + "owners": [ + "rHcFoo6a9qT5NHiVn1THQRhsEGcxtYCV4d", + "rLzxZuZuAHM7k3FzfmhGkXVwScM4QSxoY7", + "rNnWmrc1EtNRe5SEQEs9pFibcjhpvAiVKF", + "rNu9U5sSouNoFunHp9e9trsLV6pvsSf54z", + "rhnS6iYGnrmh8NEgEKq3sBgF4FMLD9dHGf" + ] + }, + "starknet": { + "owners": [ + "0x00e91830f84747f37692127b20d4e4f9b96482b1007592fee1d7c0136ee60e6d", + "0x016dd5370bfa06e862508e8b81b8f676327b55404231bfb5b34c1df10ddd8963" + ] + }, + "algorand": { + "owners": [ + "BVMEUTF37WNEQ6GYCZISRFHGLEMOKT5OCPPTTJXVED6JBSXKF6YJJRZRI4", + "7BL55CRKRASIQI263JQ5H5A4JJQFSHL7RWXMCKM6YDZAIJVEZQ76SXF2S4", + // "YGR5VO4VWBTWPWZKXBPNBPUGCM5BLP7DVAH2AF6LXAZBM5QKQGAXY5IXII" // getting account not found error + ] + }, + "base": { + "owners": [ + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0xa4992ccf2a74132936b87cbf28b5d52304ba3be7", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x1f92332145465f3e536b7be301dde8d420478387", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "litecoin": { + "owners": [ + "LaH52f9sspcacPMf2Z7mU5tkhKcWJxvAgA", + "LYyhXjiwi7qcrf1QVwdPpFSptwRZ8L8PuW", + "Lc3BUJTitygdVPCyiBTwA2HephzBKnHPaH", + "LNyjBuigbWcHYQYbVKxk15u3Ux23QvEnS9", + "LQFZFmkrmxuyL5TCjuVxngM4wRFdM2a9EW", + "MQ4wXRL6etqkEPrLm4f1FKu2eXTM7EMgXo", + "LZZH8R24wpRVN9g2qM9Rh2BmfcTvThDtpE" + ] + }, + "manta": { + "owners": [ + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "mantle": { + "owners": [ + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "polkadot": { + "owners": [ + "1JVrK16XZm9vyZjHoYVPjtZ35LvTQ4oyufMoUFTFpAUhath", + "16ccyj8JqnP8d2DSaifgek6kSSBAu5cGtd4mu2uXTg4H6mSU", + "14ooXLY2gmiUTVym9SnKxNwEgcoikXzMEav2kiLjr7pPPHPR", + "1665ypcQXKmqXtjE9yuWsZqK5MQmBQokFjPGLq5SvoKAWBjQ", + "123tA7zfH9XdqHX5v9W4mB4VfmrjE95yJvdvMbpWv5V851rX", + "15NtvAi8CGHrbaUBvXdki8GXc5YfHM9yTv6HGmaYDetLH2ob", + "15dZTKqG6YZiQNiisMZP1DT4J6J9bmEEC4Bkz24nMC1ccRe2" + ] + }, + "scroll": { + "owners": [ + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "sei": { + "owners": [ + "sei1xunyznpjmj9jv5e2zwngp2qrzmulr2gg45sg0h", + "sei155svs6sgxe55rnvs6ghprtqu0mh69kehwl7mxz", + "sei1jm068whkhkxk48gx80ppm2m0nwy677prmjk402", + "sei1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9vsqw3v" + ] + }, + "stacks": { + "owners": [ + "SP33XEHK2SXXH625VG6W6665WBBPX1ENQVKNEYCYY", + "SP15R31KXD5C0N9ESSG7B28M3DP6ZQE2GSED759B3", + "SP3RWVFCERVDYEE1F9630H13P0Q0GEAGDC9MW9BJ0" + ] + }, + "taiko": { + "owners": [ + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "acala": { + "owners": [ + "21B6SER8NUWRVZcNM8LjAkYoVvms1EN1sKCfxJgTtN7MWpWm", + "26VDZeYLgh8QBcG5e3TvRkkzuHc7SuuUn2c63sLY6E19vDaU", + "24gQ7Fx4XgTk262QCmaZjPbV9UEfJNHZ7zTLuYmkUfmGCMwH", + "25FVW68A3B38AAWpyrRzV8vn4vybqBTBMKdbRc1YrCqD64b7" + ] + }, + "aelf": { + "owners": [ + "2ZwykiMYYMPx7NUodb4Z9VRzYqLrrxEpPcVuNKwT3kSQaSerQW", + "21Te3eubq6Yc7kv2FzVUvBLiyQnTZVe7nXodvexsKSZYBeoYuR", + "MTCNynuhCFJsFAwExEsXWe6tnydfnyv7WqA1SxVfsE9DT3YiG" + ] + }, + "aeternity": { + "owners": [ + "ak_6sssiKcg7AywyJkfSdHz52RbDUq5cZe4V4hcvghXnrPz4H4Qg", + "ak_2tNbVhpU6Bo3xGBJYATnqc62uXjR8yBv9e63TeYCpa6ASgEz94", + "ak_2UHGyGVYKx8L7EgPw88x3Dm2CK9WerYSTVWDf6RLuNEUxKu6q8" + ] + }, + "agoric": { + "owners": [ + "agoric155svs6sgxe55rnvs6ghprtqu0mh69keh3wdjs4", + "agoric1jm068whkhkxk48gx80ppm2m0nwy677pryr9uea", + "agoric1xunyznpjmj9jv5e2zwngp2qrzmulr2gg29rpeq", + "agoric1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9npn88m" + ] + }, + "ailayer": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "airdao": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "alephium": { + "owners": [ + "17R6Ptkz9i1LhiKyMhnitUMkgFygGeeQUFZvRx6GgV8Fc", + "13fKFYVSosvQZKhPP8izubADEn6q9a4np3uqw3YWjA6Hk", + "133kTjVSJA9VDrybSVCWahbQ5BQ5WevtLmHoGKp83dGPT" + ] + }, + "apechain": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "aptos": { + "owners": [ + "0x0cf869189c785beaaad2f5c636ced4805aeae9cbf49070dc93aed2f16b99012a", + // address not found + // "0x8b88f330e9ee14c6571d6707c48858bdd126d715c5df145eee58f4f4f6217898", + // "0x107ffec1dd5c5faa26dbff442253ae9fc2cb026e3e9b55a6613c10cc90904a40" + ] + }, + "arbitrum_nova": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0xa4992ccf2a74132936b87cbf28b5d52304ba3be7", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "archway": { + "owners": [ + "archway155svs6sgxe55rnvs6ghprtqu0mh69kehkcnf25", + "archway1jm068whkhkxk48gx80ppm2m0nwy677prr4m8ru", + "archway1xunyznpjmj9jv5e2zwngp2qrzmulr2ggdna6rp", + "archway1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn95hdua6" + ] + }, + "astar": { + "owners": [ + "WEo9Gi7T28niGb3pTwcHFDgGW4PjKDQvcS1stTxa68v73nQ", + "bYvGgqKmEkmQKEm7P4oYFRsfrteAzksqKqRyT82mx2iWSZt", + "Zk6pJF3cE67Eo15g7BSqtGMv3XC2T8xBHggq8ZFAPnpnpnY", + "aKCD8R97ifVNsVWTC2sbdbeqWG8ZGJaQcrwMBo3XvrmgR4N" + ] + }, + "aura": { + "owners": [ + "aura155svs6sgxe55rnvs6ghprtqu0mh69kehc9c0z6", + "aura1jm068whkhkxk48gx80ppm2m0nwy677prdgsptj", + "aura1xunyznpjmj9jv5e2zwngp2qrzmulr2ggrwkut0", + "aura1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn962x645" + ] + }, + "aurora": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "band": { + "owners": [ + "band155svs6sgxe55rnvs6ghprtqu0mh69keh6u00ct", + "band1jm068whkhkxk48gx80ppm2m0nwy677pr038p3r", + "band1xunyznpjmj9jv5e2zwngp2qrzmulr2ggphpu37", + "band1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9cn3609" + ] + }, + "beam": { + "owners": [ + "11d33ef5b07f977a51dc3aad64c49abf56c759c0059a468926b82a133a15b39d7bc" + ] + }, + "bifrost": { + "owners": [ + "c2TQGFWqK1WsKzWizpdf9V6uzCgnVqw7Yz9Va7G2wjQPHTY", + "hLaXgNj9XdVZNeE1uwpv9hJKM2wEBPQ2GPZb8mLEodCnpB2", + "fXm5HnSzWxqPrQYae4UDnXnZXfV5dmUNEEpSpCYdFPK4z69", + "g6rU7xYW1YDXvtyMiutyXs5UzQRcSw6bZR4xsSLznTFxfxW" + ] + }, + "binance": { + "owners": [ + "bnb155svs6sgxe55rnvs6ghprtqu0mh69kehphsppd", + "bnb1jm068whkhkxk48gx80ppm2m0nwy677pr56c0g9", + "bnb1nj68zufj3axulhletk4qut5ztn30fah9nhscg0", + "bnb1hv30rmjgu0wvtyyrzvm6njs8u2dc5l6aydw3gh", + "bnb1r4vvasqg7tsh9u4kl68ywskg3rq8juf6f640jz", + "bnb1agsyvgg2m45p5pef5xaetemhwcp3v84qgprhzq", + "bnb1hpcfdtv84srdq7n9a7mhnnmd3jwuda97dqzftu", + "bnb19yhugy8qzps8rur4mnp6tnz8w6nh7qrqz05yj0", + "bnb1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9rcw5kr" + ] + }, + "bitchain": { + "owners": [ + "1G47mSr3oANXMafVrR8UC4pzV7FEAzo3r9", + "18AV9vQZYm6yvG1W5JadaHSHR2b2xzujLf", + "1EkkGXR7dTbZbrKFKoe6YEP4gj4GzMeKvw", + "1HpED69tpKSaEaWpY3Udt1DtcVcuCUoh2Y", + "14kmvhQrWrNEHbrSKBySj4qHGjemDtS3SF", + "162bzZT2hJfv5Gm3ZmWfWfHJjCtMD6rHhw", + "3HroDXv8hmzKRtaSfBffRgedKpru8fgy6M", + "1FLKsCiEsABS7LysfDA8R181TQ6eLjoxPv" + ] + }, + "bitcoincash": { + "owners": [ + "1G47mSr3oANXMafVrR8UC4pzV7FEAzo3r9", + "18AV9vQZYm6yvG1W5JadaHSHR2b2xzujLf", + "1EkkGXR7dTbZbrKFKoe6YEP4gj4GzMeKvw", + "1HpED69tpKSaEaWpY3Udt1DtcVcuCUoh2Y", + "14kmvhQrWrNEHbrSKBySj4qHGjemDtS3SF", + "162bzZT2hJfv5Gm3ZmWfWfHJjCtMD6rHhw", + "3HroDXv8hmzKRtaSfBffRgedKpru8fgy6M", + "1FLKsCiEsABS7LysfDA8R181TQ6eLjoxPv" + ] + }, + "bitgert": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "bitkub": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "bittensor": { + "owners": [ + "5CNChyk2fnVgVSZDLAVVFb4QBTMGm6WfuQvseBG6hj8xWzKP", + "5HgKqPsEz17fBVCvd5cgWbGbapBXCn48p8LHjjvAub2kvVyd", + "5FsWP1GxpzT11xyFBojKpE75pzp54ESDA6BYbRMPJ2nsCZE5", + "5GSbmqT4LV2PA3TfxtakZySNkTZ1b3bqPRMo7UbBfZrp6d8k" + ] + }, + "bittorrent": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "blast": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "boba": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "bone": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "bouncebit": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "bsquared": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "btr": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "callisto": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "canto": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "celestia": { + "owners": [ + "celestia155svs6sgxe55rnvs6ghprtqu0mh69kehje7a6w", + "celestia1jm068whkhkxk48gx80ppm2m0nwy677pr85knnx", + "celestia1xunyznpjmj9jv5e2zwngp2qrzmulr2ggfjswnm", + "celestia1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9skqgdq" + ] + }, + "celo": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "chainx": { + "owners": [ + "5PwXDxpqSNF8oZN99EFY1PbFURdrsTmiHJ38sYYhdSKw5fjn", + "5VFeMNx3kas7Vc1rS9NjGPoSsnU7K9KBC1SYy7CmqJDjV5iE", + "5U1vHpXs74mqUAGbmxLoKmyE3RqbhQrsmJU4LqsnbH3nezDb" + ] + }, + "chz": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "clv": { + "owners": [ + "jHCPYN1HbjjwkKZnLYHYDS5onRwjVHSgTmkU7mDcxQFQ1C3BR", + "jHHhfVRQp3xZj1cS3qCfQh61yqJZjj8DvgTsXrnH2c7HobQWB", + "jHFtr32pXtwu4r6CNPvn3zirU5VCHaac12RiniTiEzZ3useUz", + "jHGTwRrzdQSUSzAgoB1dUkUBkzwwE7PmdFku3EWx3N67rmDRT" + ] + }, + "cmp": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "concordium": { + "owners": [ + "3rzzW6gBVMWXajrh3QLE8aFtmGQbdVFvCmKrcxsYBQxnfywfrR" + ] + }, + "conflux": { + "owners": [ + "cfx:aasusb60hfktf87fx1jg8m4cnnhebrew92f4swayt0", + "cfx:aase06fdw4cdrsrazhhzebshu9z2ds4zvu8j9zv3ad", + "cfx:aat80d5bu6rp5redv18g4yec8bv8ssheee8c9zur0a" + ] + }, + "core": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "cosmos": { + "owners": [ + "cosmos155svs6sgxe55rnvs6ghprtqu0mh69kehrn0dqr", + "cosmos1jm068whkhkxk48gx80ppm2m0nwy677prk78rft", + "cosmos1hpcfdtv84srdq7n9a7mhnnmd3jwuda970ya92j", + "cosmos19yhugy8qzps8rur4mnp6tnz8w6nh7qrqqttgnp", + "cosmos1xunyznpjmj9jv5e2zwngp2qrzmulr2ggccp7fk", + "cosmos1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9pu3chd", + "cosmos10v2gu0vvdeuv8pexnl98lmyva4cq8jkaa4845c" + ] + }, + "cronos": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0xa4992ccf2a74132936b87cbf28b5d52304ba3be7", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "cube": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "dash": { + "owners": [ + "XqjxbhVwksb7WXG5iJSh3bWnKSpvEYjG1P", + "XpSb6n51bAp9knuqBgxKPm4rX4dy3rjSjY", + "XsW53Lonn2fAPX7QPvnrjXugSqCbDcmBpj", + "XeSckx4kUZapSYT2B5HfabX575ETHqUX8i", + "XfiSpp6vf1tWEDMdReptNBy6ZYU3Gbozpo", + "7iaS3jCJWm5xRf7PvoLAm4eHFNhH3FETUG", + "Xq2AhTN8psQ2GHaTX6UMGXooHjgLGjFNkp" + ] + }, + "defichain": { + "owners": [ + "8W8yVQDEaQiJ5PB4Hy8CvKj9pBtD3zqkhb", + "8UqbzUnJQhwLKepomMdqGVHE1ohFpnzjSr", + "8VRBbA5ReQXCq9VS6m9s9G2AnUjd74nwQn" + ] + }, + "doge": { + "owners": [ + "DLCDJhnh6aGotar6b182jpzbNEyXb3C361", + "DJtqonMkvsVr8rVr4Pdf5zYfZrnaLSdnwi", + "DKRg7bL5s1NbWp1VMKhP1gbw6mqydnoX2u", + "DMxKkM6Y7jLrmahRGdUCRmPVVdMCZh7QKy", + "D8tsTxMVpGGWpc333my1Gpzt9sP4YQjoDx", + "DAAhXpPfziaCcGweJMWE4RSucLcee7NcqL", + "A8c3xNz2mqsDLFwv5KL5fpH12QEwDaoTXo", + "DKURQTetAa5ieMAUPo9gxmHcLXpwes8kH1" + ] + }, + "dydx": { + "owners": [ + "dydx155svs6sgxe55rnvs6ghprtqu0mh69keh22pfq5", + "dydx1jm068whkhkxk48gx80ppm2m0nwy677prl8f8fu", + "dydx1xunyznpjmj9jv5e2zwngp2qrzmulr2gg3p06fp", + "dydx1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9g9luh6", + "dydx10v2gu0vvdeuv8pexnl98lmyva4cq8jka5vf350" + ] + }, + "dymension": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "edg": { + "owners": [ + "hp7fFnvDbtF2PPydXhf33kXZULyqgUTJVYH7FkZVoKtfhoD", + "o8Enfv8XpWDiS3gvSprJ3xixqBEHN1vDCwhCpQdhfDh5EPb", + "mKRLHKrNoqZYup1VAwVbgoDD1on8pPzZAnx4Vqr66yoMFSJ", + "mtWj7VwtJQwgzJSGFnvMS8W8UYifdZcnVyCaZ5eTe3kF4Jj" + ] + }, + "elastos": { + "owners": [ + "EKk4HeHnLvMpxFiSbjVizcrCB1nVt39Bwe", + "EWwQTNN6ehrVLBh4imEYtQr61txBE2ARUk", + "Eb1wiohh195bcZrsPowoMdNRmaaJk4wbai", + "EftXuMPJRVxKjFKQ2Z3oiayi5hL4v56u5R", + "EdGT5d52SZhYASQpMdCydpnv1iiS4j2YoA" + ] + }, + "elrond": { + "owners": [ + "erd1p4vy5n9mlkdys7xczegj398xtyvw2nawz00nnfh4yr7fpjh297cqtsu7lw", + "erd1lptaaz323qjgsg67mfsa8aquffs9j8tl3khvz2v7creqgf4yeslsf2u99c", + "erd1cx3a4wu4kpnk0ke2hp0dp05xzvapt0lr4q86q97thqepvas2sxqsnh0533" + ] + }, + "elys": { + "owners": [ + "elys155svs6sgxe55rnvs6ghprtqu0mh69kehrnk2dp", + "elys1jm068whkhkxk48gx80ppm2m0nwy677prk77yyf", + "elys1xunyznpjmj9jv5e2zwngp2qrzmulr2ggcccey5", + "elys1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9pugl60" + ] + }, + "energyweb": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "enuls": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "eos": { + "owners": [ + "gateiowallet", + "ha2tanbqg4ge", + "eos32signhw1" + ] + }, + "eos_evm": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "equilibrium": { + "owners": [ + "cg3QZnNBPvXUiaAJzXqR1Ria2egcLXgmmRu9wGa2nQk5aV7FP", + "cg8igunJcEk6hGCxhpkYCginE43SayNKELcZMN8grcbyNtcg9", + "cg6usTPiL5jS36gj2PUeqzMciJE58pphJgaQcDp8513jVAtc8", + "cg7UxrDtRbE1REmDTAZWGk6x1Dgp5MdrvuuarjsMsNaoS4eUp" + ] + }, + "ergo": { + "owners": [ + "9iKFBBrryPhBYVGDKHuZQW7SuLfuTdUJtTPzecbQ5pQQzD4VykC", + "9gQYrh6yubA4z55u4TtsacKnaEteBEdnY4W2r5BLcFZXcQoQDcq", + "9f5WpnpDCAWHXk4HYARp7NKBJV58QSkCKAC2vucsaVBjPgKsght" + ] + }, + "ethereumclassic": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x246a2ecd9626f9eda55fffbff5216ed417a904f5", + "0x840760aed6bbd878c46c5850d3af0a61afcd09c8", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0x4bbe1961bd0a6cd1fe3cd8947be15bd8ae2ee562", + "0xd793281182a0e3e023116004778f45c29fc14f19", + "0x35b31ae2604dd81d9456205025ea02418dba8242", + "0x354e0184a6a6e634ccb07388e2617e05e427563c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "ethf": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x54c82d26624e85000d1387ee7c9580c3c6d7b5b7", + "0x7750fe679d47a9e00575ad46043297a234e83fa2", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xd793281182a0e3e023116004778f45c29fc14f19", + "0x354e0184a6a6e634ccb07388e2617e05e427563c" + ] + }, + "etlk": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "etn": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "evmos": { + "owners": [ + "evmos1p5rs093e2te0hfva6phjksj6eeqtfyh7ma0cjz", + "evmos1r39hpgukssmtng9feafqt3u8awqmk4vv7vvwtl", + "evmos1ezptzyd8tsxx2l79qlqyl07d9nycfur36wpmyf", + "evmos1ll4s7cv8rtxmfqudl3k4pqhsv0nn3eppwgmrq9" + ] + }, + "filecoin": { + "owners": [ + "f1d7mq36vf6osdhcd32i6k3wyb223mdjlxnafnala", + "f1z7izlq5yv2wkrt6ks4fnzscesnd6kntt6vovqai", + "f1pbcpx47wwpb5za2stdz3skfcplmk6zxi7hwv3sy" + ] + }, + "findora": { + "owners": [ + "fra1p4vy5n9mlkdys7xczegj398xtyvw2nawz00nnfh4yr7fpjh297cqsxfv7v", + "fra1lptaaz323qjgsg67mfsa8aquffs9j8tl3khvz2v7creqgf4yeslsjufhy6", + "fra1cx3a4wu4kpnk0ke2hp0dp05xzvapt0lr4q86q97thqepvas2sxqsgp6xsn" + ] + }, + "flare": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "flow": { + "owners": [ + "0xb65cb9286d8eab6c", + "0x4f45575f29f5dffb", + "0xa008dc1bf48aa10d" + ] + }, + "ftn": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "fuel": { + "owners": [ + "0x778c29331c90bc9d986dd790c6ed7225e1b9d0857952d4be81e91f0dfbc57a2e", + "0x188f36048cd9353bdd3809e349d20deab4cacad709d7cce64f2a417e55d27ec5", + "0xdd8861e6d56cfde6c3a017e246e0ff26d29ff30d08eef4e927d221a6a0b765c1" + ] + }, + "fuse": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "fusion": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "gochain": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" ] }, - tron: { - owners: [ - 'TBA6CypYJizwA9XdC7Ubgc5F1bxrQ7SqPt', - 'TCYpJ6MMzd9ytoUvD82HnS58iV75QimPh6', - 'TFptbWaARrWTX5Yvy3gNG5Lm8BmhPx82Bt', + "harmony": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x246a2ecd9626f9eda55fffbff5216ed417a904f5", + "0x840760aed6bbd878c46c5850d3af0a61afcd09c8", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" ] }, - cardano:{ - owners: [ - 'DdzFFzCqrhseMuShaXzLDGDBa8jGEjdEjNc83jouqdqBQzk5R52MedutUq3QGdMPiauR5SjbttqdBjDA5g6rf3H6LjpvK3dFsf8yZ6qo', - 'DdzFFzCqrhtBatWqyFge4w6M6VLgNUwRHiXTAg3xfQCUdTcjJxSrPHVZJBsQprUEc5pRhgMWQaGciTssoZVwrSKmG1fneZ1AeCtLgs5Y', + "heco": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" ] }, - solana:{ - owners: [ - 'CLNEVwuSAiGsvPtE74yLhda4beNfd8qfZXVKkUcAJZDL', - 'HiRpdAZifEsZGdzQ5Xo5wcnaH3D2Jj9SoNsUzcYNK78J', - 'u6PJ8DtQuPFnfmwHbGFULQ4u4EgjDiyYKjVEsynXq2w' + "heiko": { + "owners": [ + "hJFVeb7Z8zaQSPwjw8x6rRySFtxzk4KJrUCGs1pk71CQGyqd1", + "hJLomiXgMJo2R5zPeRsE3gyeTJKpzVzrKNugH7PQBD4J5NwfD", + "hJKa3eyGAfGw94YePmgC7kMpETyCUtGQ1xChnV85By388Z6px" ] }, - ripple: { - owners: [ - 'rHcFoo6a9qT5NHiVn1THQRhsEGcxtYCV4d', - 'rLzxZuZuAHM7k3FzfmhGkXVwScM4QSxoY7', - 'rNnWmrc1EtNRe5SEQEs9pFibcjhpvAiVKF', - 'rNu9U5sSouNoFunHp9e9trsLV6pvsSf54z', + "hpb": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" ] - } -} + }, + "hydra": { + "owners": [ + "HMaF9nmaCNua4vExqCTDb5iTfHYxdL6K8q", + "HLGsesLe2g8cKBtiJaxqwFGXruN1QGJji2", + "HLrTFYdmGNiUpgZLdzUsp21UdaQNh7E8Tb" + ] + }, + "hyperliquid": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "icon": { + "owners": [ + "hx548ad28ef8d6caed7f27f6001fb7a654ad8cca40", + "hx5130e85046609cda7c6f579c09946bcf6c86d81b", + "hx46a0528308c53c8d3e40f17b08f2c3fcfafb94d6", + "hxce12bc670be0e35dbb6ffb8935648d87fbd74154", + "hxffd3f84a64d2673b8b7564dd5307d16624553a3e" + ] + }, + "icp": { + "owners": [ + "8fe706db7b08f957a15199e07761039a7718937aabcc0fe48bc380a4daf9afb0", + "8f079b740ca593e6741e8a552f06352d0e6c844f6fd75533e3bd575ec76cb147", + "6463450788218283a2959d7cf4e1bfbaf422753e5c4596b593ed9d3f4cf20497" + ] + }, + "injective": { + "owners": [ + "inj155svs6sgxe55rnvs6ghprtqu0mh69kehf6cfjm", + "inj1s52g6m4h96lxyug2hejrqs6ffu26cuf5ym5mgq", + "inj1jm068whkhkxk48gx80ppm2m0nwy677pruhs8mn", + "inj1xunyznpjmj9jv5e2zwngp2qrzmulr2ggj3k6mw", + "inj1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9t4xu94", + "inj10v2gu0vvdeuv8pexnl98lmyva4cq8jkahus3xq" + ] + }, + "interlay": { + "owners": [ + "wd7oNzH5QHFCkwjRmAKXdkjyhcRmJ5QX1CTLB4M2FZSkcUFEd", + "wdD7W7hCcbTpjdn5UTEeq1kBu1nbYX64U7Ajb9ugKmJeQsYz5", + "wdBJgfJcLSTA5UFqo1xmUKP2PFyE6NYSYT8ar1b7Y9kQX9o1v", + "wdBsn48nRwwjTcLLDo3cu58MgBRy2uMcAgTm6XeMLXHUU3aH7" + ] + }, + "iotex": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x246a2ecd9626f9eda55fffbff5216ed417a904f5", + "0x840760aed6bbd878c46c5850d3af0a61afcd09c8", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "islm": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "kadena": { + "owners": [ + "k:0d584a4cbbfd9a4878d816512894e65918e54fae13df39a6f520fc90caea2fb0", + "k:f857de8a2a882488235eda61d3f41c4a60591d7f8daec1299ec0f20426a4cc3f", + "k:c1a3dabb95b06767db2ab85ed0be86133a15bfe3a80fa017cbb83216760a8181" + ] + }, + "kardia": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "karura": { + "owners": [ + "obmvFLKbtkyBSoSY4agQx1xCxVGts6yVS6QiwPrxevNxE7f", + "tuu3fTXv7NwsVT9pyhsfxE9cKKXLYeSQ9VppW3wAWpBMM7B", + "s75bGsFm6iHhyDUPhpWyb4drVx5C12Wk7M5gBV9YxaHdova", + "sgAz73MGbHfr3huAnfwjLPvmxh1ipC8ySXLCEiwvVeEXeBn" + ] + }, + "kava": { + "owners": [ + "kava155svs6sgxe55rnvs6ghprtqu0mh69kehlxmsky", + "kava1jm068whkhkxk48gx80ppm2m0nwy677pr2tn7lv", + "kava1hpcfdtv84srdq7n9a7mhnnmd3jwuda97n3fcu4", + "kava19yhugy8qzps8rur4mnp6tnz8w6nh7qrqu7l49x", + "kava1xunyznpjmj9jv5e2zwngp2qrzmulr2ggyd4rl3", + "kava1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9af99p2" + ] + }, + "kintsugi": { + "owners": [ + "a3aWepSsLfy67vUAAaKCiSnCj7G72feeTCgfKCBLivBWWTdFW", + "a3fpmwrzYzBi6cWossEKuhnQvWcwH7LBv7Q4jHjzo83QJs1ys", + "a3e1xVUQGqB3SSzaCRxSZ1RFQkoZpxnZzTMuz9RS1WVAR9BBL", + "a3eb3tJaNLfcpb54dD3HymAahgGJmVbjcgh6EfUfot2EN2oJB" + ] + }, + "klaytn": { + "owners": [ + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "kroma": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "kusuma": { + "owners": [ + "CspNJ5uJ9WcF6Nf6sJY9YRQL3dWZmKrMnmd2qY4BXMTGEgi", + "JBwViD7cN8aw92NPnRjQYdbjQTm1SsKGWB38QC8PPFFfLuc", + "DdCg75U3jH69QL1jDG7WybLxk9KLWM1gokBay77qng6dbhT", + "GP83KcqTMTvmcngxWYNiBU5yb6JruFPcU2Hz5dLmq1MwqGs", + "GxDS9nvxr3JuhH7jbPoTvoNu3qFPiR1qoCYW8s99N5JqhT5", + "GS988ESnKUHMYixhAZJLJjQkpBEGRN3AdEJbY7CXxauxoQo", + "J5VsgNemdBg2bfvHresAtBZdxE67WrS656Caup3MgsBE2y7", + "ErJ8h2WUY35Eb1cDMTCZgnht2kT2gKdKeNnw21tDDmRxSXL", + "HfQVohDHuXHr1Y9y3fZdNNANKhMHn4ndcVXaCN3rWW94hN7" + ] + }, + "linea": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "lisk": { + "owners": [ + "lskqov47at3sqaaf9bg38kymku92rcdax7refhpk3", + "lsko9dq4zcp7yu5fvr2owm672sxdpc5swapv3dbyk", + "lskwqe5qassrz55474rux63537nwasf53va79hczs" + ] + }, + "lukso": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "manta_atlantic": { + "owners": [ + "dfWrWfp3dJ7FNXyLCEW8gvmknvAyi9FTa5gFZeGUD7GaSbUXa", + "dfcAdoEAqcKsME1yuXRFtBmxzKXoxaw12zPeyjq8HK8UEzgZ6", + "dfaMpLqaZTKCh4VkE69NXVQoUZiSWSPP7LMWEbWZVhaEMH5hW", + "dfavujfkexon5CaEesEDxFA8mVBBSyCYjZggV7ZoJ57JJAbVb" + ] + }, + "matchain": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "merlin": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "meter": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "metis": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "mode": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "moonbeam": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "moonriver": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "naka": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "near": { + "owners": [ + "0d584a4cbbfd9a4878d816512894e65918e54fae13df39a6f520fc90caea2fb0", + "f857de8a2a882488235eda61d3f41c4a60591d7f8daec1299ec0f20426a4cc3f", + "c1a3dabb95b06767db2ab85ed0be86133a15bfe3a80fa017cbb83216760a8181" + ] + }, + "neo": { + "owners": [ + "AJN2SZJuF7j4mvKaMYAY9N8KsyD4j1fNdf", + "AVZNcHPDYuDj9rJCUZuN3A8DirNk8QPBEr", + "AZdusiiouLSqSEU19cccWNeZUXzsZEk2UB", + "AeWW4GQRKhKZYuvXnMicsLFqnekdpSofk6", + "AbtREY69Lm4mz71x7Rsnna53ig8zzXRrXK" + ] + }, + "neo3": { + "owners": [ + "NTWC7Hh5VYMQ5K8YJbyCLbmJ4RhfQ1Ej64", + "NY8VmiQ8if23Cr7Fe6xwXZ4a59JTVXHDCN", + "NcSZPD4ToU3v1C8NPK13hibCnZcPEqHD1a" + ] + }, + "neon_evm": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "neutron": { + "owners": [ + "neutron155svs6sgxe55rnvs6ghprtqu0mh69keh8vx06y", + "neutron1jm068whkhkxk48gx80ppm2m0nwy677prjpwpnv", + "neutron1xunyznpjmj9jv5e2zwngp2qrzmulr2ggu8gun3", + "neutron1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn99rc6d2" + ] + }, + "nibiru": { + "owners": [ + "nibi155svs6sgxe55rnvs6ghprtqu0mh69keh5kt5fs", + "nibi1jm068whkhkxk48gx80ppm2m0nwy677prpmr6qc", + "nibi1xunyznpjmj9jv5e2zwngp2qrzmulr2gg0a98q9", + "nibi1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9ke4p77" + ] + }, + "nuls": { + "owners": [ + "NULSd6Hge2GxNKwYRxxvnQynMK2gKt5YAVANR", + "NULSd6Hgd9SJyzE6cmFmPQQ6VcpcQPLvbM4K2", + "NULSd6HgdY5zjfxhHhQMyGnJmxZREDxr8Zhh1" + ] + }, + "oas": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "oasis": { + "owners": [ + "oasis1qppfyeugxmxdx5m4gpasg4xqg296zcdndy0k2zsg", + "oasis1qqz86qv538ff9y4exy6g3j724mq68wj7pu55rgwt", + "oasis1qp8f5gh8zgad5t47hc40ayw37ptcszrtsq6eh5de" + ] + }, + "okexchain": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "ontology": { + "owners": [ + "AJN2SZJuF7j4mvKaMYAY9N8KsyD4j1fNdf", + "AVZNcHPDYuDj9rJCUZuN3A8DirNk8QPBEr", + "AWGrHN1DUAo6Ao3yTHu4tUHZonPNAy9ZmU", + "AM1te97HdmaereEMgtLg7YvfUP624Ra4iF", + "ASPPqj8yCcCV2sWHQZwsYfWZS2FMfd3PF7", + "AZdusiiouLSqSEU19cccWNeZUXzsZEk2UB", + "AeWW4GQRKhKZYuvXnMicsLFqnekdpSofk6", + "AbtREY69Lm4mz71x7Rsnna53ig8zzXRrXK" + ] + }, + "op_bnb": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "orai": { + "owners": [ + "orai155svs6sgxe55rnvs6ghprtqu0mh69kehsqewps", + "orai1jm068whkhkxk48gx80ppm2m0nwy677pr9d3qgc", + "orai1xunyznpjmj9jv5e2zwngp2qrzmulr2ggtthag9", + "orai1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9j08mk7" + ] + }, + "osmosis": { + "owners": [ + "osmo155svs6sgxe55rnvs6ghprtqu0mh69kehtguak3", + "osmo1jm068whkhkxk48gx80ppm2m0nwy677pr795nle", + "osmo1xunyznpjmj9jv5e2zwngp2qrzmulr2ggsrjwly", + "osmo1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9f8zgpl" + ] + }, + "parallel": { + "owners": [ + "DVhKTLv9mkh42BZRKJTmWRjlT64T3zmm9SD8kMrqL7A", + "-FfeiiqIJIgjXtph0_QcSmBZHX-NrsEpnsDyBCakzD8", + "waPau5WwZ2fbKrhe0L6GEzoVv-OoD6AXy7gyFnYKgYE" + ] + }, + "persistence": { + "owners": [ + "persistence155svs6sgxe55rnvs6ghprtqu0mh69kehdlf7w8", + "persistence1jm068whkhkxk48gx80ppm2m0nwy677prcjps80", + "persistence1xunyznpjmj9jv5e2zwngp2qrzmulr2ggk58d8j", + "persistence1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn90shtef" + ] + }, + "pokt": { + "owners": [ + "ab04976668dd739f34df43e912d20dc487ac85d2", + "63755480647460bf0a5865caa76361d106bddf24", + "bd6cbae77b9016b4b932805485a1c7be77e5a059" + ] + }, + "polkadex": { + "owners": [ + "esm4teFDTrvy4VJ8msKTQmAywumeinGjzsrFzmTEB5FBiiekE", + "esrP1mfLgB9b3BLnVAEac2BC9K8UyDxHTnZfQs1tFH75X81FT", + "espaCKGkQ28vP1pYoixhFKp2dZK7X5QfY8XWfihKTfYqdQFGd", + "esq9Hi6vVXdVm9u3EW3Yg5ZMvUmrTcDqAMrgvEkZG35uaJ6tp" + ] + }, + "polygon_zkevm": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "proton": { + "owners": [ + "gatedeposit", + "gateiocold" + ] + }, + "radixdlt": { + "owners": [ + "account_rdx16y5vw2latcyn7h2leujsc0th2junpgxnafx0aqrher4yw7pmnmfyx8", + "account_rdx16xkm9wvwcwq0q8ly6hm6m86s90zcqxeexhnzn8l9jkgtk3t8z7j2yz", + "account_rdx169r653rp86kepz28wrzlxzy6ll2use5jmew5rz9h24uyj9cjqtl38n" + ] + }, + "reef": { + "owners": [ + "5CNChyk2fnVgVSZDLAVVFb4QBTMGm6WfuQvseBG6hj8xWzKP", + "5HgKqPsEz17fBVCvd5cgWbGbapBXCn48p8LHjjvAub2kvVyd", + "5FsWP1GxpzT11xyFBojKpE75pzp54ESDA6BYbRMPJ2nsCZE5", + "5GSbmqT4LV2PA3TfxtakZySNkTZ1b3bqPRMo7UbBfZrp6d8k" + ] + }, + "rei": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "rollux": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "ronin": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "rsk": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "rvn": { + "owners": [ + "RQLJqxjLPzB6Rb2hKb7bHbACFNhpq11zhv", + "RP2wM3JQEHQ8frgSnydDdkiGSzWscgUihs", + "RS6RHc3BR9F9Jat21DTkyXZ6Nm5VrLUKxt", + "RD2y1DJ97gAoMcDdnMxZpbAV317MvAuu8A", + "REJo55LKJ8UV9H8F2wVncBcWVULwtsoiKn", + "RPcWwibXTyz1BMM58P9FWXTDDfZExE78SG" + ] + }, + "secret": { + "owners": [ + "secret155svs6sgxe55rnvs6ghprtqu0mh69kehpkmyal", + "secret1jm068whkhkxk48gx80ppm2m0nwy677pr5mn25h", + "secret1xunyznpjmj9jv5e2zwngp2qrzmulr2gg6a4h52", + "secret1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9re9323" + ] + }, + "shibarium": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "shiden": { + "owners": [ + "WEo9Gi7T28niGb3pTwcHFDgGW4PjKDQvcS1stTxa68v73nQ", + "bYvGgqKmEkmQKEm7P4oYFRsfrteAzksqKqRyT82mx2iWSZt", + "Zk6pJF3cE67Eo15g7BSqtGMv3XC2T8xBHggq8ZFAPnpnpnY", + "aKCD8R97ifVNsVWTC2sbdbeqWG8ZGJaQcrwMBo3XvrmgR4N" + ] + }, + "songbird": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "sora": { + "owners": [ + "cnRnnKrqCX9TEZvCgVuiXbPbE1jmA3R55W6cLeKC43U8nVoma", + "cnX6uTGxQqN5DFxrPnpqirPoRR6bQV6cYQp1kjsr8FL2au8KM", + "cnVJ5ztN8gMQZ6SciMYxNA2dufHDxLYzckms1bZHLdmnhBbm7", + "cnVsBPiYEBqywEX798donumyCajxtsNAEz73G7cX91Jre5TfS" + ] + }, + "stafi": { + "owners": [ + "313h29qADPFh49f1QT8xwmD3xnCoZ4fDkijz797UWv4EKqmx", + "36Mp9ZxNXbsfkCJihNGACmRFN933zkCgfS9QChmYimx2jPEb", + "34YzhBN6NbD1ag53G6NoWQFjcKfbrCam1Pzf4PCm7Di91dtJ", + "358661YBt5nPikZU3BEEG9b2XnQYP1kPEjAuaSSZUkn5uMJq" + ] + }, + "starcoin": { + "owners": [ + "0x5aeae9cbf49070dc93aed2f16b99012a", + "0xd126d715c5df145eee58f4f4f6217898", + "0xc2cb026e3e9b55a6613c10cc90904a40" + ] + }, + "stellar": { + "owners": [ + "GBC6NRTTQLRCABQHIR5J4R4YDJWFWRAO4ZRQIM2SVI5GSIZ2HZ42RINW", + "GBJ746LVE2LFZ5OA2QEQUE35QHHI3OXZ75RH4USXY2GBFAKCBKQG3HKU", + "GCLP5OZ4SFU4X2MD4BGZKC7FFJY3NGM3Y6TVULOWLUNNWHEFNUJGAW5Y", + "GCE2HXJTGSI66KBPEVQYFU7N4KWAGRIG4TJPZTPWRGVSH2MZCC4EAY63", + "GBOL3FQURYYBAPWMAGMY5IS3ZFQRYOLBANZTVGGFL5MAN545QB5NAEUT" + ] + }, + "sui": { + "owners": [ + "0x62f36b79d7ea8ae189491854edd9318b29c75346792177b230a95f333ffa53ad", + "0x7ce04f66dca33c786c7375f73c4f7459e16b8a80cbbdd055e3782b3e176fa3d3", + "0x019b848f4511b354c314a4e5c1a40dbc247fe5d29c6bcb3495badb01751d549a" + ] + }, + "syscoin": { + "owners": [ + "ScM7oHdCXXZistSxPr7YjxyZ8tUf3HG8c2", + "Sb3kJNCGMpnm8A6hsEdB68XdLWHhkXietE", + "SSKc2QEBRfs7baYW7CVk4ZRsNz7n28P2j3", + "SbdKu3VPbXNddemLCe9CxuGa7BL538hBCx" + ] + }, + "tara": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "telos": { + "owners": [ + "gateioiotlos" + ] + }, + "tenet": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "terra": { + "owners": [ + "terra155svs6sgxe55rnvs6ghprtqu0mh69keh9h4dzr", + "terra1f62zqvvm6y2vlp6rhn94k9spsuqmh727twq8e4", + "terra1jm068whkhkxk48gx80ppm2m0nwy677prs6artt", + "terra1xunyznpjmj9jv5e2zwngp2qrzmulr2gg7um7tk", + "terra1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn98ctc4d" + ] + }, + "tezos": { + "owners": [ + "tz1hjem5Rpf4KAVbwMLJet75TDb8HjAKnTYk", + "KT18yTsDxUbVrenxZsbFSx6Ai72hRHod9pHV", + "tz1RRVLD5LEu8iaoTMGc5L1NiyiEGuSUtAwX", + "KT1PuUGWvCypTrNu7yweWCzpX6zyuy6nq6Wu", + "tz1fw6VKhBZ8N7HAvCwvXSkTvQ7YcUk3w9AK" + ] + }, + "theta": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x246a2ecd9626f9eda55fffbff5216ed417a904f5", + "0x840760aed6bbd878c46c5850d3af0a61afcd09c8", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "thorchain": { + "owners": [ + "thor155svs6sgxe55rnvs6ghprtqu0mh69keh95kk4u", + "thor1jm068whkhkxk48gx80ppm2m0nwy677prse7cu5", + "thor1xunyznpjmj9jv5e2zwngp2qrzmulr2gg7lc9uf", + "thor1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn98mgrzj" + ] + }, + "thundercore": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "tomochain": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x246a2ecd9626f9eda55fffbff5216ed417a904f5", + "0x840760aed6bbd878c46c5850d3af0a61afcd09c8", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "ton": { + "owners": [ + "0:3addd84bf73267312a477049fd9b8db761bf39c585c150f8e6f9451347af2b6c", + "0:09c592c5b17a555c1ace781f38303e5a115978f57cf22773b280d14028e7dd92", + "0:16ea6a34f0d704b6fac9b7592e003f6f28ae5d1a8a6ba9d1650e4dd30ab8eada" + ] + }, + "umee": { + "owners": [ + "umee155svs6sgxe55rnvs6ghprtqu0mh69keh39jjy3", + "umee1jm068whkhkxk48gx80ppm2m0nwy677pryg6ude", + "umee1xunyznpjmj9jv5e2zwngp2qrzmulr2gg2wupdy", + "umee1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9n2v8nl" + ] + }, + "vana": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "vechain": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0x246a2ecd9626f9eda55fffbff5216ed417a904f5", + "0x840760aed6bbd878c46c5850d3af0a61afcd09c8", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "velas": { + "owners": [ + "u6PJ8DtQuPFnfmwHbGFULQ4u4EgjDiyYKjVEsynXq2w", + "HiRpdAZifEsZGdzQ5Xo5wcnaH3D2Jj9SoNsUzcYNK78J", + "E2tbmDk29G6jHdrgwHC6kXGFfDsyrXUyWjD3e3ZB4oNp" + ] + }, + "venom": { + "owners": [ + "0:9f4fb4d07e97542c2200672b2819c1c3987c48a353c655858ba525c7e51bbfc7", + "0:595972816072851da891322300897c5e71255d2f2dbd1ca721568b6ac1e761db", + "0:c6c2f45369f7a281ed9771fcb2dc62863a2625e963074159af527169e470de29" + ] + }, + "vinu": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "vite": { + "owners": [ + "vite_f262f48ec1097880c83aa079dfb0baef5e68c4ff6c0b807b0a" + ] + }, + "waves": { + "owners": [ + "3P7LZSuVDv5pQS7NSCE1LyGCbQihzk1fQ2r", + "3PJL6FBmbQrYpvtWjRJEETAF7ngZ1cB4Hcj", + "3PMb9uuJm5VB9VUzNLhZGScEK8m7zGwDED3" + ] + }, + "wax": { + "owners": [ + "gateioiowaxp" + ] + }, + "wemix": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "xdc": { + "owners": [ + "0x0D0707963952f2fBA59dD06f2b425ace40b492Fe", + "0x1C4b70a3968436B9A0a9cf5205c787eb81Bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "xlayer": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "xpla": { + "owners": [ + "xpla155svs6sgxe55rnvs6ghprtqu0mh69keha5h3ts", + "xpla1jm068whkhkxk48gx80ppm2m0nwy677prgellzc", + "xpla1xunyznpjmj9jv5e2zwngp2qrzmulr2ggxlezz9", + "xpla1n5ukn9q2r5vrgt6su0e6cvm5lyxe2cn9lmfyu7" + ] + }, + "zeta": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421", + "0xcf6f5ec73942314c3ec864202b40dcbb1f9477a0" + ] + }, + "zilliqa": { + "owners": [ + "zil1e9k0rdjgh0khx06veut6ghwkggue6snmrlyg4w", + "zil1melkmjzv6v784dlk30rhx2ck4zccqpprsdd3jt", + "zil12zn46cppzsg0thgn7e66ugjd3c25hcl0acjaud", + "zil1jcmadzrm6w49gegqw94esdkyhfq75y4fxl9wrv", + "zil12acrew80f00m4v3cs4hw9yawx7m74fwdwtmdj5" + ] + }, + "zircuit": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "zkfair": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x6596da8b65995d5feacff8c2936f0b7a2051b0d0", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xc882b111a75c0c657fc507c04fbfcd2cc984f071", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, + "zklink": { + "owners": [ + "0x0d0707963952f2fba59dd06f2b425ace40b492fe", + "0x85faa6c1f2450b9caea300838981c2e6e120c35c", + "0x1c4b70a3968436b9a0a9cf5205c787eb81bb558c", + "0xffeb0f61871acdb4838dfc6d5082f063e738e421" + ] + }, +}; + +const unsupportedChains = ['aeternity', 'beam', 'binance', 'bitchain', 'bitcoincash', 'bittensor', 'bone', 'callisto', 'chainx', 'clv', 'concordium', 'conflux', 'cmp', 'dash', 'cube', 'defichain', 'edg', 'elastos', 'elys', 'equilibrium', 'evmos', 'filecoin', 'findora', 'flow', 'fusion', 'heiko', 'hydra', 'hyperliquid', 'icon', 'icp', 'interlay', 'kadena', 'karura', 'kava', 'kintsugi', 'kusuma', 'manta_atlantic', 'lisk', 'neo', 'neo3', 'near', 'nibiru', 'nuls', 'ontology', 'oasis', 'parallel', 'pokt', 'polkadex', 'proton', 'reef', 'rvn', 'shiden', 'sora', 'stafi', 'starcoin', 'syscoin', 'stellar', 'telos', 'thorchain', 'velas', 'venom', 'vite', 'waves', 'wax', 'zilliqa', ] + +unsupportedChains.forEach(chain => delete config[chain]); -module.exports = cexExports(config) +module.exports = cexExports(config); diff --git a/projects/gearbox/index.js b/projects/gearbox/index.js index 44405b03bf..e9cecaeaf5 100644 --- a/projects/gearbox/index.js +++ b/projects/gearbox/index.js @@ -3,7 +3,7 @@ ** ** ** This file has been generated from source code in https://github.com/Gearbox-protocol/defillama repo - ** Binary release: https://github.com/Gearbox-protocol/defillama/releases/tag/v1.4.1 + ** Binary release: https://github.com/Gearbox-protocol/defillama/releases/tag/v1.4.3 ** ** ** @@ -484,7 +484,7 @@ var adapter_default = { optimism: { tvl, }, - methodology: `Retrieves the tokens in each Gearbox pool (WETH/DAI/WBTC/USDC/wstETH) & value of all Credit Accounts (V1/V2/V3) denominated in the underlying token.`, + methodology: `Retrieves the tokens in each Gearbox pool & value of all Credit Accounts (V1/V2/V3) denominated in the underlying token.`, misrepresentedTokens: true, }; diff --git a/projects/geist/index.js b/projects/geist/index.js index b787ec300a..85b8b5e8c1 100644 --- a/projects/geist/index.js +++ b/projects/geist/index.js @@ -23,6 +23,7 @@ function lending(borrowed) { } module.exports = { + deadFrom: '2023-10-18', methodology: methodologies.lendingMarket, fantom: { tvl: lending(false), @@ -34,3 +35,5 @@ module.exports = { [1665090175, "BSC Bridge hacker deposits coins"] ], }; + +module.exports.fantom.borrowed = () => ({}) // bad debt diff --git a/projects/genesis-lrt/index.js b/projects/genesis-lrt/index.js index 9f7799cc39..b7ab940d5b 100644 --- a/projects/genesis-lrt/index.js +++ b/projects/genesis-lrt/index.js @@ -7,7 +7,7 @@ async function tvl(api) { module.exports = { hallmarks: [ - [1714953600,"Genesis Merges with InceptionLRT"] + [1714953600, "Genesis Merges with InceptionLRT"] ], doublecounted: true, ethereum: { tvl: tvl, } diff --git a/projects/geode/index.js b/projects/geode/index.js index 714ef1db55..397660fc19 100644 --- a/projects/geode/index.js +++ b/projects/geode/index.js @@ -84,7 +84,6 @@ async function avax(timestamp, ethBlock, chainBlocks) { } module.exports = { - start: 16328353, methodology: "All Staking Derivatives are included to the TVL with relative underlying price. Also counted the Avax within the Dynamic Withdrawal Pools.", doublecounted: true, diff --git a/projects/ggpVault/index.js b/projects/ggpVault/index.js index 2fe134cd3a..e5f37a28ee 100644 --- a/projects/ggpVault/index.js +++ b/projects/ggpVault/index.js @@ -1,16 +1,7 @@ -const GGPVAULT_CONTRACT = "0xdF34022e8a280fc79499cA560439Bb6f9797EbD8"; -const GGP = "0x69260B9483F9871ca57f81A90D91E2F96c2Cd11d"; - -async function tvl(api) { - const bal = await api.call({ - abi: "uint256:totalAssets", - target: GGPVAULT_CONTRACT, - }); - api.add(GGP, bal); -} +const { sumERC4626VaultsExport } = require('../helper/erc4626') module.exports = { avax: { - tvl, + tvl: sumERC4626VaultsExport({ vaults: ['0xdF34022e8a280fc79499cA560439Bb6f9797EbD8', '0x36213ca1483869c5616be738Bf8da7C9B34Ace8d'], isOG4626: true }) }, }; diff --git a/projects/ghost-ex/index.js b/projects/ghost-ex/index.js index 6185e9a65b..40a6fac188 100644 --- a/projects/ghost-ex/index.js +++ b/projects/ghost-ex/index.js @@ -6,7 +6,6 @@ module.exports = { tvl: getUniTVL({ factory: "0xbf246e99a848d9bf592c216118973204162d9650", useDefaultCoreAssets: true, - fetchBalances: true, }), }, } diff --git a/projects/glif/index.js b/projects/glif/index.js index 92a87f4ea4..2bf96f94b9 100644 --- a/projects/glif/index.js +++ b/projects/glif/index.js @@ -20,7 +20,7 @@ module.exports = { }, }, timetravel: true, - start: 1677628800, // 2023-03-01 + start: '2023-03-01', // 2023-03-01 hallmarks: [ // timestamp, event [1680206490, "Early deposits open"], // 2023-03-30 diff --git a/projects/glorifinance/index.js b/projects/glorifinance/index.js index b01f0c7f74..497c061622 100644 --- a/projects/glorifinance/index.js +++ b/projects/glorifinance/index.js @@ -24,3 +24,5 @@ module.exports = mergeExports([ arbi_helper, { arbitrum: lend, } ]) +module.exports.deadFrom='2024-04-30', +module.exports.arbitrum.borrowed = () => ({}) // bad debt diff --git a/projects/gluon-gold/index.js b/projects/gluon-gold/index.js index 04e44f05a7..2dea38f0f5 100644 --- a/projects/gluon-gold/index.js +++ b/projects/gluon-gold/index.js @@ -5,9 +5,9 @@ module.exports = { ergo: { tvl: sumTokensExport({ owners: [ - 'E81MR2gGkYE1vDkdcGYns4wYehfJLdX6hpwHMGrhwKEirNBZ6JRUKopeU1i7jT4NkgdM8GpL8bhFCyXFJuSaj8tiWSs28rq6Go3H5regcwr67yWiAy97RmXh94ierf8YuELivuMfwkEZd4X81RrfFJ2GDKzxmSdqUP6D4mXqepnxWcCvqGgk7DR1tKKuBJNroWaDSuDwrKASw68KuGspCbd1pgHs2iWzxirT4NTXq2rfPqmSJ7cqUQnd1mamB583H2ZC4esNzjqyMcvsQi6QFePSg8bwYbCTs4e8Nz42bZoUNQktFpteqwhcA5NRwXN7vDVQBGgHXr8KY3fDKmhoQiwTbrZLB5qzJ1UpCoAd4h88CERG7VbH4z5nyJC5c3j1SuEE5dSXPNtYR6yiGhNq2TCHNb24f5eZcBpBUQ6qviecoDtxPb78qnR2gBn4HcHGBWBZxfXJ3ZC7NPtNWreWWPuGMF5QF7EgswjALFHNDzRdkJpbsbrdaVbFNq9vC6Adug2P5NXnBjsr7wYTQrB4neWFNLS4vWQqgTYu3Cuap1V7mc13u7tK6X3s1wod6psy6cTWak1SEYtUcjwwvjHhQqn8R2D9G81jiH7efpCt9JdgCYoamioDfLaTFx7S2Su55bjLaD8JLsUyNL1LkDcmcUfhtiTAkM1mUDGswAHk6wDtoVUEuR59T94LUv9SFddZ2p1vJYi32AUAEZu66UiGkGeBDnNSq38mgiwta1X6SsNtv1mgZjkLx45Vun538ekYwWZ51EcvRgMScogtZ5xBDk1RRPn3HkXQLWGKr4yEFSwjuDNy8d4LbWUJ8n4prMvxQ8G5h7rUj9dJ5kz7YzKZRNF5VBmCAacYocgUUnEwQbVbkvFDDt7FQAQnNmY7tyjDQEJaeAviWp2Gtoewh7ShDDLgX69gB9XcAjuYn9Tbfvm6FLnfNE9qusqL76GnaPeJRf6LNR6JczQVBGhS4NUy6sBSSfq4oWFYbShUGTe3zLG9JFMcdAKZR7NwyHyKBM5Zj5w5kXroL1xLPahxBz6hiQmz9xcJGGWNQsNR2Acirx3PmQ1V23sSqjhLmDMRVYquStc8o86JUH7KzBjm12nAfdq4pN6LAfKdCvLwdQQn9MQxmcquog9EiQccdURgF9NJK1CwWgcgrfXLtSkm5JwbTPgQjd5HFR9y26DtLJr36RWZHrbv9zvv9GawT3J2jWQEk9Ue41zMRp9jjMP57S4JdWdVvPuxYSJf2e7y4diN9w3XxQYZv21Eq91DduD9dWE7aYbdJiXu2DpM8VRdTpC9K3xXhzSkczHWKpftYZyNQq8KQsQBPHLc5pQFfi7Fqr4YCPk4ZFmRSiY6MsnkJc2rtzYAi9BKh9wAGZteAE8oWqphhiTBbEwHUiZdXAKe1BSPrQFsrc2Q6oizcgwm4rjmESMv3PGoQCpCAuvQL1kd9TULwsng7vRyMsUUh2KvCFSHrpqaDEpXEXH5rjFRzzwL2FBU6VATpeDj2BBS5NcxwrDqCcbEBerq3QYHSkQr1dd3MeATt5HzaGyA8xLvfohHdgZ4rWGT9zQf7rCk2xPeh1G8KRqSEDE4SUtBZxZbxF34dPxJDr4xqzjG2FKPtptkmXrBWNV3DVxPn5V8WL8bCo6HraLdUcmDJN7kn8dYSEgFhr4nwtCt4yKdsVtmAHEMhaMmGVRd92kiE5Xtc2ey3ZsHuWHRQX1T5Dw8xCCJngGcas3eMMr2J2N8cYFJkqCzuNPn8JZM9wqQBNay7ygsSR8Jj2ffo6veKRZSkcLzpCLWrxYj7LhMRxLkxLGY64GmWXL1aoyjQar3mFph6ZYmYUD3G934YTRKkUpV56VsNmSVxrNFbRCEotZ2s5Xzn5UJDU3NtaqDE4WqckKK7AXXB7DTLKfwT39RxjFep7xep6HThP7TfhL15KwB1RhgYF8cmExFwWoiMKsGkF9P3Jy6PZBVa4pWEXGCF8pUfprjKUffUm8wa8c4UQXNKSGd19y9sscamFqa5iEsxmDFXti6bqcGmG58ggneM8k9P91QBzoMy1JZFxv955n9CQV27wWJmaWRErjrpbtgJQmVx1fhQDCmQJvTHduSYmZBjYRi7TrYkjfBc1pheMgH6uzxJ6LJ92T7B1kPqvMTwiDareuW7mcR9rNwUNorWZMvH8uACNd1sqoERGtfVLkNTirmWJ6nfnqw1WPPgiCQ5nBcixusHy26btdvEVmjDjx9iNb3RPJKCiDbQLBq1yZEbyTCu8T9yRXvCexFqz4DPN5NmjFFPvPtgmvpds1DEdGVVTfwAY4THxLTVyD4z87FEk5gGzn1Csod1ZDNctHpYpPpfk9CVgzXwp3z2D75KJvNu9jUVvMyVBS53WdnELYwcEsWdappt9y2fmefQmYuAww3ekvFGDA4KnxfpCCixHMcrSZX6khifCuqn6prTDFDAT7ssCt7QJKB7KpGreh9tE7SHqSAAkPUuiJNHqn6xPHVKFGmrV5fjy1zNMGLdpebEL5f37jXzPGCpmRXJ9ZCz3REznoZNNg1o4UJoACKuvcfbcg91CMZS6ZvhNp6WXYMNSZqgCcGpkTSS5Dvy5hHTy71bJhSoQPvusCP8v5C5ammcpiDSHeKoKyUJy5JghCnAiAYqZoN9MMATR64YmBqmzFxVqHdE9WqYYwkt7EerA2szprVoh5UwWfUFMkyCiAUUxmYdPodLpYaVZwBcMv5SiZuWEnX51H1oowEVj7qhr3SGRapBpYZmiLDdVSKtqru11XfQJfbCiG4uYk3U9ZsvzcZv5oXTmKCB4XEKFv7bK8w3wbpmgBCYJMZZ5JrTE8iZKKgL3TmiM9q2v1ggxtVq932axuw4ncELjL6oJ4Bo7Uck2zogD11KvhTGuSHwBk84cUpqCMSsauFiVSaZ47uYXKdAXNZKF3JRvzNjGePgDRnPMMruyztbNfNgRM3fz39s6NYRVGMth6MS5jbw1PYkYhp4nv66bjPpU7tGXuy6JhsT3iAZ52nKzNN88pPKJVMhi9mtA5hQtmTNfzQGZtC7EfVz5yd7TKXgPhUaCYD4KQSKASvi66nwkee1NUDPPA6kYU12ppV6PCzXg3Q6AX5mWPQv8eAg5PxUVCvAvRpuvZNUZWRCbJxgQEgNRfCYbsdT27z4MFttDw54bPDNZfWcNBP7Q6FRq5iJ6EcaXGof3sWPvjKXQ3G3VGBBJ4JhkzAFMcv274tnCMvfE6xQt4DDHFsWjTHbR4Mp8UZ49gDnUWqtMPH1KVXFQKJdDBUTmDrBSM3u33Ed3dKefqzeqWvhLvXVnfdSrUJhqa3bFsKzwMyeGjxdyuide5rZRff4JsT5Hb8erq4qUwckcWErv6L4kgJZc6MWREswrQn4KbrDHNUU1RxXzCKnhQfYMsKQT11XKB2uwHnF4b1CTkTJhafQSxiHFGA4KTP1qpftK3HtJaDRnw7wGoJqVoptAgBC6hmbWd1SdqDHC2e5dQUvXDciqkAv8vwWMxK6UWXzPkv4MMf11Dnmh1PFtbnZ26sJmoPwp4gWmWsidqtGvKRYdFiadMSAWfkpTQnWmQV5tBU51SbFMihDhSYHc835fVvEHZWzZUj2FhqSazJaoCgPiaQN38zeJ4SE2rZ8vhXy4m2UXuB1ZjsvHVqLJvmbgC33CqEMicoT4P4vjuhHUsVuwspcWYkW87ZaCj5qMfqxt4ZnygnGssjsQfXK6GMtNeR4iDJK9qHncBbJ5ye5Lih2tyU1JFB2FcZYB7dQSHGpUS6bMFktFNgPhCZ5CGjgCiKQAYBe4jx6TJDinLjWQ9P', + 'U2Jtp6oeBTnbGS7ed2PvkudukZYRBBSfi557aCmzQtYxoQzbYeTw82vRjtVCke3FQ7iK8PjEFwjBjFDH8ZAXhqjCZ33kZDrRS92kUJPGe1zZsSeJcMz6y4QVsVrhpnmgxmmCKo9ut2bQa96ExLUBojZznoW56qGbKut9U58QeowdtgMuHPxnUF4Srgucn3kUvd2aWVydGjNdRFzDVCArz9iqBNejbcfcJNSqyzJX88KBTTQwYKcxkNtkBF5ZzUMiAZVmymzmAnHUob8HRzVhD19sTEdKF3TEaiPhyWVUKgtUApXuAwwygxH8FCfrknESQFWXQdeniVs3aHPxeqPRyaeqAhkUjBRSSsZqjXYaXfoCbVN7mkQyYNMPcQ9qptQY1yBZBEh2EFZHbWuYBeCYFGb1R64HPinTkyEPAT76xhUCrqPCcejzLNAfHffZj3G7nB83jPewAi8Jzf9ApT73R8FnzEwJeWWznKYKViyB357W28NNGThwZDgJu7VxxnJf1X2HYfE6yywCfidhUwwstcBUT1yFDXHxSzF84eWwufTKCoA36ZRgjct3FvvM2A4pnQCzDjwLGVFPapHJK15JVgGFXCmYNxtAnhhEZTfSJXemVuBQ9HceB88WRPJzQ8bvvUdDWJzAxdseLVseZec1nzufW6uj1MS7F9ri2hCfzwxJmGA42ycWcaqdmCFSmuJAQtbnAbEaYKaWXi1Rw3ksiuiWPfWCyGmdKTXALA8wb5LrJz5oRgxQ9mmcWmg38nRMMqepHmhSEEFVjFQTP6GdQ7sq2Smke3g26yEzTJrySEbBxDUey2gytnuhLhff3e2dWpDeUbpgHsBw3TWMriYKZrUNDFBTr6ii6efPrjiPphZx1RsMuUYhKucbTviPq4q71nm15wpySA1rC2M4vuNRMwMmMLfepAFPh4nH63mNixDnTJrcdETBDhZr8Km62cpj3BGWHtbcMYyk7NmshwvpD3Eym6PCDLrdLAjCDN6MtSCAHvfRQS4Sm49aCmHt7r17kAfNt8GccWDUErhhtNymRUff8wya5Grrrfzx7Ynp54HuDJ9EcR6aaE6buNzfqxrnuaLGedcBwWkaoAMrKoLDAmyPcYskEcNMrENLk3JRdSdRpXERVjAQs6hCZV65mVYVgnYx9YgcvatKnMNGu3sHgQUBdxgHHfzDNqdxhrwfuUZ38xPGv8soo7yvz8ahhnEddLhvwdm9x73SM6Cb1CXupy1gNz8dgkDP6TVshDPGbtcAqCXpsdUL9ZzzWQPUv67dzMEAcHaz7deo8wgrhGc6qtG2Vfg3bnAWk5JtUV5bV9v4zRdLKrvEiqCCxXgoztAh9DhgeMFr5RAGWwmUBJbrn5jMBK6ijj9MEoRdfcymDJtpbbU1uTUkjSAw2gnpAeXLsmbgL4wTZWBhqBRGWyEk6Xw4oKFwV4KKVvfYEXiDg9vSQqF2xbxeGh5w5s6KvqyWKjn9EWMHeRWX5xhrwsAUMXKDAn2eX4e74zNovGprUTDF6tpQYeeqrhxgqnLJ4PgnTkeJT7XxJANZCnqbdt2jnWiKsKUyv6WMHiZeuGFzFxjg8Kvj1DVrmtM347tE9xufxteMECTXiRHHDM1r9VXsdZuRBsHsdmY9i5K2uHCLwXproCHu4TyP3NS7PXjY6Rz1Ltk1PEuqabUc1Gr59vs6MB3dqxKZjRKVu7aSRCxamFaUhSuCdy8raqpaX7tCHmD8zTPTLEQgzZnNq9bFePiuNfGXCZMVrw1wcnjrs39uh1kL1j7nYAAGRE79b4rnAJwRxZdpL7X9Jr7MuQrsVSjwFhFpvUfoZ1yY7hj6uKxPvZwQMVVrmqfFxEJNrCfgUabNZQLvRA6UuZbsg9BGLYtkfNJjLEpRJWiwJqKhnYC28DKmq4a7s29UN1wyePnKHNwAxDv7dzhdhZJa1XS7p4PgKKKzu24mDSKrHC1qnfcgTHQDbebNyveX8UEB2wwRgXLxoHsGmbWgTnnoW1P2x5m1nQomtU82W544iB1i48qc28wXLjdDk3x3P11VZVphRupHUa7y7F5KiG6UsnA87tHs6UB4K6C3dp59YvSdUCNW9khhHkT8mg4VVpLSvihwy8B2FBBTsXDaSnhNAmgx2SyHGXLTfZAdfhw8CSZRHxgeGif5upYSTxzfbH1QRUm6g4CwGScfyKM9D5nXKewfXrb6VZPJpDPXUxQnMaQ8wM1AgUMw3sX7TJJmYmfeWrnR8uhaLY7RFh3gAWfGCRr6SLMoKyez32DKH7gTGsj1ymM39JRuDKugMt5TW1LhhYuiAGX8zH5GnyPqMSNfVZiJYsh1ZPqF3AVkmTgd7VGR8ZBGyFUcrrw98kDMsQ3vBpYgCAwBGRvoA8cs4hvCF3udSRoqiPVXyDG8sS49GV74Jr4VHV7TTTBBdY8V6WPhL9cxHbzoMGYDFE9DN86b5jPK8Avu7Tjw9gKYUaUWmFbvr7xS1oG5fWHSmQ9uXeBzfi2kGBZDCiqcpBymBqzphePVFkvRHhAQiERMwF5LSZwo67joCHiPDNLV1uFG4wXCR5RxVpdjE2jxd8qCqJSub691AWWVDdRBK2i9zXByh5QAQtUTFPRuNHTyTcpA7Yaz1usgGSfQFPe2meQjjwkYy6Gnz53ynboPmP83v2BSwFZFNnubA55nVJPdqfJDUY4bRspJYMASWUzDECQKipgxeFjUtnZVAhNaDj7iCmPZ6WGFBgF4pULYqY1AoP33hcooQ8rdRDdJ7iidRowYVNMgb8QHC7XgHYFRrUDPBDQ6aefp58rYHv2BJrVdz3z1Jn8dAsyhx2eW6kf9URqB5ygAwTWSiogSfsQxye4eSF9o7pA5eDLQRsgN41Qm6M1ZfVkEktYLb7WSKxLesggCgPng8S7CKqp98WYf2h3FyTPukDSkc84SSfxFg6DQKRkdKhcGYd7aNBgNG3H4AkFgBe62Cjtor2QDJCYmTDnfb92adShmDdGvqZw2Tsj8XEw1TfCSH2ZqMUYNbGbATc2ZQK5daXHXwviqo4DjrEURWXUiepNifVHLt8W1WvAYLfKJHwPa3aBq9qQX7ik51KrLmLAdXhFofrmoAAuN6E9rULFUsTcp7xMHEKyAL7WjfwRGgortnMyhhtVfVqHAtiZmvGuppFHjYw7zFg6Shy6GhTPinzcPLwuiYSCLxU4SzvoANLvhMDRDgHuph8C3BVB3UjunEazhu1ctvTnoRLwqAQELDBsgW6bwQo7kLj2Lfrc88WUnDyxjsDphRsbJAaSWTAcNA3aYhKYjrxS5uhMa9C77NYRKPJPuQGw5MtiSjSojXtyfcWuyJAyvs9Cvra41FqiMhqtummsMbhUMZttfe5nGQcvnDUZZorR9TJXphpQn4GaGbRskU1g6HMdfCtAvhBbyccMjfk8LAJm7XPhsh1fGKC2Y8xKfRxhbystVmjzZ9Zt7XQdafhDKfHt21d7mw4pLPzEZoNNtgHwK3BKZv3b7AS2hsrBu6ct8cPnCcm4Y2iVNrpcZ6x7TLMupJRoyYwrPw9d3XNcDWMDMrqHEsM5d54hee1mQZk7Pyo6mEk4J6DNFh3u7GjfPtZwz9t6L7hUex93nqbvVcF5uTHpX8iw2kZdYgp9bH2HbNrMnL1Myx9XCLybzadAmRhGGRKVz9QtpoUGrNWcfYR5SAdvAUiKmudnakqzUe2F1Y45G1HbkQjbWfFHtDqTXcWoVdL3rzNzekZybbGjobSUoJyCwTEh3cSZJditQAQhQ9P93YW6MkpFQ2FtmS8SWZKy2PxMMec7i2ugCU5zBKPkNrugSgZr2TWejUE74Vr4MHvs5U7pS6b7obrVLkEuDWGCdnR4BDcvBFVPTNKPUUUXBw291nqEMoAWTxWYYSZhwkY6p9ftcx2y1Kq7P2RPiDZg1HYciuDdfGFNgmTYv', ], tokens: [ADDRESSES.null], }) } -} \ No newline at end of file +} diff --git a/projects/gmsvaults/index.js b/projects/gmsvaults/index.js new file mode 100644 index 0000000000..3208fe7ed4 --- /dev/null +++ b/projects/gmsvaults/index.js @@ -0,0 +1,14 @@ +const { staking } = require("../helper/staking"); + +const base_vault = "0xe1515D3A8c503a0fc68015844a9fc742D1c80927"; +const base_staking = "0x3D893CC2C70242907cAac245D04C565056174EF7"; +const base_GMS = "0x13dE6E0290C19893949650fe6fdf9CDfFAFa6040"; + +module.exports = { + doublecounted: true, + methodology: 'staked gms + vault balance', + base: { + staking: staking(base_staking, base_GMS), + tvl: staking(base_vault, '0x2D5875ab0eFB999c1f49C798acb9eFbd1cfBF63c'), + }, +}; \ No newline at end of file diff --git a/projects/gnosis/index.js b/projects/gnosis/index.js index d4faac58b0..3067b2421b 100644 --- a/projects/gnosis/index.js +++ b/projects/gnosis/index.js @@ -4,7 +4,7 @@ const { sumTokensExport } = require('../helper/unwrapLPs') const sdk = require('@defillama/sdk') module.exports = { - start: 1579811423, // Thu, 23 Jan 2020 20:30:23 GMT + start: '2020-01-23', // Thu, 23 Jan 2020 20:30:23 GMT ethereum: { tvl: sdk.util.sumChainTvls([ '0xc59b0e4de5f1248c1140964e0ff287b192407e0c', '0x6f400810b62df8e13fded51be75ff5393eaa841f', diff --git a/projects/goat-protocol/index.js b/projects/goat-protocol/index.js index c8aa49e7ae..c56d280878 100644 --- a/projects/goat-protocol/index.js +++ b/projects/goat-protocol/index.js @@ -1,24 +1,28 @@ -const { yieldHelper } = require("../helper/unknownTokens"); const { getConfig } = require('../helper/cache'); const { staking } = require('../helper/staking') -const chain = "arbitrum"; -const tokenAPI = "address:want"; const GOA_TOKEN_CONTRACT = '0x8c6Bd546fB8B53fE371654a0E54D7a5bD484b319'; const REWARD_POOL_CONTRACT = '0xAD9CE8580a1Cd887038405275cB02443E8fb88aC'; +const config = { + arbitrum: {} +} + module.exports = { - timetravel: false, - doublecounted: true, - [chain]: { - tvl: async (_, _b, { [chain]: block }) => { - const pools = await getConfig('goat-protocol', 'https://raw.githubusercontent.com/goatfi/goat-address-book/main/vault-registry/arbitrum.json'); - const vaults = []; - for(var i = 0; i < pools.length; i++) - if(pools[i].platformId != 'goatfi') - vaults.push(pools[i].earnedTokenAddress); - return yieldHelper({ vaults, chain, block, tokenAPI, useDefaultCoreAssets: true, }) - }, - staking: staking(REWARD_POOL_CONTRACT, GOA_TOKEN_CONTRACT) + doublecounted: true, + hallmarks: [ + [1732186800, "Multistrategies Launch"] + ], +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + const multistrategies = await getConfig('goat-protocol', `https://api.goat.fi/multistrategies`); + const calls = multistrategies.filter(multistrategy => multistrategy.chain === api.chain).map(multistrategy => multistrategy.address); + return api.erc4626Sum({ calls, isOG4626: true, }) + } } -} \ No newline at end of file +}) + +module.exports.arbitrum.staking = staking(REWARD_POOL_CONTRACT, GOA_TOKEN_CONTRACT) \ No newline at end of file diff --git a/projects/goat-tech/index.js b/projects/goat-tech/index.js index 0b27dcca11..c9486bebe8 100644 --- a/projects/goat-tech/index.js +++ b/projects/goat-tech/index.js @@ -11,7 +11,6 @@ const configs = { module.exports = { methodology: "Total staking", - start: 210487219, arbitrum: { tvl: sumTokensExport({ tokensAndOwners: [ diff --git a/projects/goblin-dex/index.js b/projects/goblin-dex/index.js new file mode 100644 index 0000000000..2fa08a931f --- /dev/null +++ b/projects/goblin-dex/index.js @@ -0,0 +1,12 @@ +const { uniV3Export } = require('../helper/uniswapV3') +const { staking } = require('../helper/staking') + +module.exports = uniV3Export({ + smartbch: { factory: '0x08153648C209644a68ED4DC0aC06795F6563D17b', fromBlock: 14169895 }, + base: { factory: '0xE82Fa4d4Ff25bad8B07c4d1ebd50e83180DD5eB8', fromBlock: 21481309 }, + bsc: { factory: '0x30D9e1f894FBc7d2227Dd2a017F955d5586b1e14', fromBlock: 42363117 }, +}) + +module.exports.smartbch.staking = staking('0xfA3D02c971F6D97076b8405500c2210476C6A5E8','0x56381cb87c8990971f3e9d948939e1a95ea113a3') +module.exports.bsc.staking = staking('0xb4d117f9c404652030f3d12f6de58172317a2eda','0x701aca29ae0f5d24555f1e8a6cf007541291d110') +module.exports.base.staking = staking('0x866932399DEBdc1694Da094027137Ebb85D97206','0xcdba3e4c5c505f37cfbbb7accf20d57e793568e3') diff --git a/projects/gogocoin/index.js b/projects/gogocoin/index.js index 107bd1de9e..db9d4cb22f 100644 --- a/projects/gogocoin/index.js +++ b/projects/gogocoin/index.js @@ -49,7 +49,7 @@ async function pool2X(...args) { } module.exports = { - start: 1638388550, + start: '2021-12-01', polygon: { staking: stakingX, pool2: pool2X, diff --git a/projects/goku-money/index.js b/projects/goku-money/index.js index b79f9955f8..c19bd78b98 100644 --- a/projects/goku-money/index.js +++ b/projects/goku-money/index.js @@ -48,7 +48,7 @@ function getCollateralOwnersAndToken() { module.exports = { - start: 1698768000, // 01 Nov 2023 + start: '2023-10-31', // 01 Nov 2023 methodology: "Total locked collateral assets (in ERC-20 form) in ActivePool and DefaultPool, plus total staked GAI in StabilityPool", manta: { tvl: sumTokensExport({ diff --git a/projects/goldbank/index.js b/projects/goldbank/index.js index bc8ad24489..12bfafede8 100644 --- a/projects/goldbank/index.js +++ b/projects/goldbank/index.js @@ -5,9 +5,12 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2023-06-11') / 1e3), 'Project rugged'], ], + deadFrom: '2023-06-11', methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", arbitrum: { - ...compoundExports(unitroller, "arbitrum"), + ...compoundExports(unitroller), }, -}; \ No newline at end of file +}; + +module.exports.arbitrum.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/goldlink/index.js b/projects/goldlink/index.js index d698d4a491..84a749b7bf 100755 --- a/projects/goldlink/index.js +++ b/projects/goldlink/index.js @@ -2,9 +2,12 @@ const { sumERC4626VaultsExport } = require('../helper/erc4626') module.exports = { methodology: 'Delta neutral farming in GMX Vault', - start: 1716638498, + start: '2024-05-25', doublecounted: true, arbitrum: { tvl: sumERC4626VaultsExport({ vaults: ['0xd8dd54df1a7d2ea022b983756d8a481eea2a382a',], isOG4626: true, }), }, + avax: { + tvl: sumERC4626VaultsExport({ vaults: ['0xbE6eB54D1e96CC59338BE9A281d840AcE82df095',], isOG4626: true, }), + } } \ No newline at end of file diff --git a/projects/goldsand/index.js b/projects/goldsand/index.js new file mode 100644 index 0000000000..eaa498d555 --- /dev/null +++ b/projects/goldsand/index.js @@ -0,0 +1,55 @@ +const { getLogs2 } = require("../helper/cache/getLogs"); +const { nullAddress } = require("../helper/tokenMapping"); + +function customCacheFunction({ cache, logs }) { + if (!cache.logs) cache.logs = [] + let sum = cache.logs[0] ?? 0 + sum = logs.reduce((acc, curr) => acc + Number(curr.amount), sum) + cache.logs = [sum] + return cache +} + +module.exports = { + methodology: 'TVL is the sum of deposits minus the sum of withdrawals. Since there is no liquid staking token (yet) and deposited ETH greater than 32 is automatically staked in the beacon chain, the contract balance itself is not the TVL.', + hallmarks: [ + [1732231247, "Privately staked funds deposited to contract."], + ], + timetravel: false, + ethereum: { + tvl: async (api) => { + // Get Funded events + const [fundedLogs] = await getLogs2({ + api, + target: "0x6659423929E1a00119fc3F79C8e4F443cc6fd36f", + extraKey: 'Funded', + eventAbi: "event Funded (address indexed funder, uint256 indexed amount)", + fromBlock: 20966151, + customCacheFunction, + }) + + // Get FundedOnBehalf events + const [fundedOnBehalfLogs] = await getLogs2({ + api, + target: '0x6659423929E1a00119fc3F79C8e4F443cc6fd36f', + extraKey: 'FundedOnBehalf', + eventAbi: 'event FundedOnBehalf(address funder, address funderAccountAddress, uint256 amount)', + fromBlock: 20966151, + customCacheFunction, + }) + + // Get ETHWithdrawnForUser events + const [withdrawnForUserLogs] = await getLogs2({ + api, + target: '0x6659423929E1a00119fc3F79C8e4F443cc6fd36f', + extraKey: 'ETHWithdrawnForUser', + eventAbi: 'event ETHWithdrawnForUser(address recipient, address requestedBy, uint256 amount)', + fromBlock: 20966151, + customCacheFunction, + }) + api.addGasToken((fundedLogs + fundedOnBehalfLogs - withdrawnForUserLogs).toString()) + + // The withdrawl vault holds validator rewards until withdrawn. + return api.sumTokens({ owner: '0x22B35d437b3999F5C357C176adEeC1b8b0F35C13', tokens: [nullAddress] }) + }, + }, +} diff --git a/projects/goldstation-dex-v3/index.js b/projects/goldstation-dex-v3/index.js new file mode 100644 index 0000000000..849813e57b --- /dev/null +++ b/projects/goldstation-dex-v3/index.js @@ -0,0 +1,6 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + + +module.exports = uniV3Export({ + avax: { factory: "0xF72f4652785a5186EDF7b93a9cfd246FeFc0ef5c", fromBlock: 52760680, }, +}) diff --git a/projects/goldstation-dex/index.js b/projects/goldstation-dex/index.js new file mode 100644 index 0000000000..5b00a45bf4 --- /dev/null +++ b/projects/goldstation-dex/index.js @@ -0,0 +1,11 @@ +const { getUniTVL } = require('../helper/unknownTokens') +const { sumTokensExport } = require('../helper/unwrapLPs'); + +module.exports = { + klaytn: { + tvl: getUniTVL({ factory: '0x347E5ce6764DF9DF85487BEA523D3e242762aE88', useDefaultCoreAssets: false }), + staking: sumTokensExport({ tokensAndOwners: [ + ['0x4836cc1f355bb2a61c210eaa0cd3f729160cd95e', '0x4d55B04AC52b2CA41ad04337FF13CbAefbdC8954'], + ]}) + }, +} diff --git a/projects/goldstation-rwa/index.js b/projects/goldstation-rwa/index.js new file mode 100644 index 0000000000..c909ffcc89 --- /dev/null +++ b/projects/goldstation-rwa/index.js @@ -0,0 +1,22 @@ +const KAIA_GPC = '0x27397bfbefd58a437f2636f80a8e70cfc363d4ff'; +const AVALANCHE_GPC = '0x1b27D7A06DeEa4d5CB4fd60c164153C90f64281D'; + +async function kaiaGpcTotalSupply(api) { + const supply = await api.call({ abi: 'erc20:totalSupply', target: KAIA_GPC }) + api.add(KAIA_GPC, supply) +} + +async function avalancheTotalSupply(api) { + const supply = await api.call({ abi: 'erc20:totalSupply', target: AVALANCHE_GPC }) + api.add(AVALANCHE_GPC, supply) +} + +module.exports = { + klaytn: { + tvl:kaiaGpcTotalSupply, + }, + avax: { + tvl: avalancheTotalSupply, + } +} + diff --git a/projects/goldstation-staking/index.js b/projects/goldstation-staking/index.js new file mode 100644 index 0000000000..8a2dba4ab1 --- /dev/null +++ b/projects/goldstation-staking/index.js @@ -0,0 +1,11 @@ +const klayStakingContract = '0x6569B14043c03537B5B125F5Ac5De3605a47dC76'; + +async function tvl(api) { + const totalStaked = await api.call({ target: klayStakingContract, abi: "uint256:totalStaked", }); + api.addGasToken(totalStaked); +} + +module.exports = { + klaytn: { tvl } +} + diff --git a/projects/gondi-v3/index.js b/projects/gondi-v3/index.js new file mode 100644 index 0000000000..38ebb7ee33 --- /dev/null +++ b/projects/gondi-v3/index.js @@ -0,0 +1,12 @@ +const { sumTokensExport, } = require('../helper/unwrapLPs'); + +// https://docs.gondi.xyz/protocol-contracts +const multiSourceLoan = "0xf65b99ce6dc5f6c556172bcc0ff27d3665a7d9a8"; +const userVault = "0x823de2c44369e94cac3da789ad4b6493e27e4bfe"; + +module.exports = { + methodology: `Counts the floor value of all deposited NFTs with Chainlink price feeds.`, + ethereum: { + tvl: sumTokensExport({ owners: [multiSourceLoan, userVault], resolveNFTs: true, }), + } +} diff --git a/projects/goober/index.js b/projects/goober/index.js index 1305312929..50942a954e 100644 --- a/projects/goober/index.js +++ b/projects/goober/index.js @@ -1,7 +1,7 @@ const abis = require("./abis"); module.exports = { - start: 1668410449, + start: '2022-11-14', methodology: "Counts GOO balance of the vault then sums it with the total multiplier reserve based on the vaults pricing of a multiplier in GOO", } diff --git a/projects/goose-farm/index.js b/projects/goose-farm/index.js new file mode 100644 index 0000000000..3da68cd42f --- /dev/null +++ b/projects/goose-farm/index.js @@ -0,0 +1,25 @@ +const chainList = [ + {symbol: 'bsc', address: '0x0874f961178879cdbde3500544c49f864f232899', decimals: 18,}, + {symbol: 'ethereum', address: '0xe8a01d8dac4af19ec7a22cf87f3d141ce6e7e9fb', decimals: 6}, + {symbol: 'arbitrum', address: '0x0874F961178879cDbDe3500544C49F864F232899', decimals: 6}, + {symbol: 'op_bnb', address: '0x857aB0b4F236F7DD7E5AC5F96C0bbEbF230c2D3B', decimals: 18}, +] + +const getTvl = async (api, chain) => { + const lpToken= await api.call({ abi: 'address:lpToken', target: chain.address}) + const token= await api.call({ abi: 'address:token', target: chain.address}) + const supply= await api.call({ abi: 'uint256:totalSupply', target: lpToken}) + const price= await api.call({ abi: 'uint256:price', target: lpToken}) + api.addTokens(token, supply * price/Math.pow(10, chain.decimals)); +} + +const tvlFunctions = chainList.reduce((acc, chain) => { + acc[chain.symbol] = { + tvl: async (api) => getTvl(api, chain) + } + return acc; +}, {}); + +module.exports = { + ...tvlFunctions, +}; \ No newline at end of file diff --git a/projects/grace/index.js b/projects/grace/index.js index 49c598bd59..5e1b6cdf1f 100644 --- a/projects/grace/index.js +++ b/projects/grace/index.js @@ -20,7 +20,6 @@ async function borrowed(api) { module.exports = { methodology: 'Fetches the list of pools and collaterals from the Core and sums up their balances', - start: 14684731, base: { tvl, borrowed }, diff --git a/projects/gracy-staking/index.js b/projects/gracy-staking/index.js index f0b6c571a8..cc8003751c 100644 --- a/projects/gracy-staking/index.js +++ b/projects/gracy-staking/index.js @@ -6,16 +6,13 @@ const STAKING_CONTRACT_SEASON_2 = "0xa0EE760C52b10d2A21E563526248CA389D9C47E6"; const STAKING_CONTRACT_SEASON_3 = "0xAb6aD663b42c7031b52737cbcBF9f70cb88fD9FC"; const STAKING_CONTRACT_SEASON_4 = "0x4f1043ABb51648E817b8e62EcABc157F91E61c52"; const STAKING_CONTRACT_SEASON_5 = "0x6e05d3a61f5026EEa67d0a82843d5E82eb3E2608"; +const STAKING_CONTRACT_SEASON_6 = "0xE5ff1432DC7BE35CC73216A8cc468608398AD433"; +const STAKING_CONTRACT_SEASON_7 = "0x908c41C339DAAaC0be4440ba2CFbA4fFb0093a4A"; module.exports = { - ethereum: { - tvl: () => ({}), - staking: stakings([ - STAKING_CONTRACT_SEASON_1, - STAKING_CONTRACT_SEASON_2, - STAKING_CONTRACT_SEASON_3, - STAKING_CONTRACT_SEASON_4, - STAKING_CONTRACT_SEASON_5, - ], GRACY_TOKEN), - }, + ethereum: { + tvl: () => ({}), + staking: stakings([STAKING_CONTRACT_SEASON_1, STAKING_CONTRACT_SEASON_2, STAKING_CONTRACT_SEASON_3, STAKING_CONTRACT_SEASON_4, STAKING_CONTRACT_SEASON_5, STAKING_CONTRACT_SEASON_6, STAKING_CONTRACT_SEASON_7, + ], GRACY_TOKEN), + }, }; diff --git a/projects/grafun/index.js b/projects/grafun/index.js new file mode 100644 index 0000000000..fcbeaadee9 --- /dev/null +++ b/projects/grafun/index.js @@ -0,0 +1,10 @@ +const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs') +module.exports = { + methodology: "TVL is calculated by aggregating the market value of BNB tokens held within the Token Sale Factory smart contract.", + bsc: { + tvl: sumTokensExport({ owner: '0x8341b19a2A602eAE0f22633b6da12E1B016E6451', token: nullAddress }) + }, + ethereum: { + tvl: sumTokensExport({ owner: '0xb8540a7d74Cc4912443e8c4B2064B640FC763c4f', token: nullAddress }) + } +}; diff --git a/projects/grape-finance/index.js b/projects/grape-finance/index.js index 3e8edd9420..6a2164ea14 100644 --- a/projects/grape-finance/index.js +++ b/projects/grape-finance/index.js @@ -1,4 +1,4 @@ -const { pool2Exports } = require("../helper/pool2"); +const { pool2 } = require("../helper/pool2"); const { staking } = require("../helper/staking"); const grape = "0x5541D83EFaD1f281571B343977648B75d95cdAC2"; @@ -15,7 +15,7 @@ const LPTokens = [ module.exports = { avax:{ tvl: async () => ({}), - pool2: pool2Exports(rewardpool, LPTokens, "avax"), + pool2: pool2(rewardpool, LPTokens, "avax"), staking: staking(boardroom, wine) } } \ No newline at end of file diff --git a/projects/graphene/index.js b/projects/graphene/index.js index f65523875b..80359a8a1d 100644 --- a/projects/graphene/index.js +++ b/projects/graphene/index.js @@ -1,7 +1,6 @@ -const { getLogs } = require("../helper/cache/getLogs"); const { sumTokens2 } = require("../helper/unwrapLPs"); -const config = { +const CONFIG = { base: { fromBlock: 5314581, controller: "0xfbF069Dbbf453C1ab23042083CFa980B3a672BbA", @@ -14,24 +13,22 @@ const config = { fromBlock: 18438182, controller: "0x7900f766F06e361FDDB4FdeBac5b138c4EEd8d4A", }, + iotaevm: { + fromBlock: 1936296, + controller: "0x0E4d23092A4a12caAd0E22e0892EcEC7C09DC51c", + }, }; -Object.keys(config).forEach((chain) => { - const { controller, fromBlock } = config[chain]; - module.exports[chain] = { - tvl: async (api) => { - const logs = await getLogs({ - api, - target: controller, - topic: "PairCreated(uint128,address,address)", - eventAbi: - "event PairCreated(uint128 indexed pairId, address indexed token0, address indexed token1)", - onlyArgs: true, - fromBlock, - }); - const tokens = logs.map((i) => [i.token0, i.token1]).flat(); +const abi = { + pairs: "function pairs() view returns (address[2][])" +} + +const tvl = async (api) => { + const { controller } = CONFIG[api.chain] + const tokens = (await api.call({ target: controller, abi: abi.pairs })).flat() + return sumTokens2({ api, owner: controller, tokens }) +} - return sumTokens2({ api, owner: controller, tokens }); - }, - }; -}); +Object.keys(CONFIG).forEach((chain) => { + module.exports[chain] = { tvl } +}) \ No newline at end of file diff --git a/projects/grappa-finance/index.js b/projects/grappa-finance/index.js index 756cf41fd3..622c471c1f 100644 --- a/projects/grappa-finance/index.js +++ b/projects/grappa-finance/index.js @@ -2,7 +2,7 @@ const ethereumTvl = require('./grappa-ethereum'); module.exports = { ethereum: { - start: 1675468800, + start: '2023-02-04', tvl: ethereumTvl, }, hallmarks: [ diff --git a/projects/grave/index.js b/projects/grave/index.js index 559c5d3f71..dda9c9f03a 100644 --- a/projects/grave/index.js +++ b/projects/grave/index.js @@ -1,7 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const { stakingPricedLP } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); -const { pool2Exports } = require("../helper/pool2"); +const { pool2 } = require("../helper/pool2"); const GRAVE = "0x3700a92dd231F0CaC37D31dBcF4c0f5cCb1db6Ca" const GSHARE = "0xffe04bf98c7111360bf7a6c56b343915543cd941" @@ -13,26 +12,13 @@ const graveAvaxLp = "0x10e882acfae3cf63e96741fabc41c19025e7be2a" const gShareAvaxLp = "0xae427ad7a54f5490ef76b3bde3663b0e45c7a102" -async function atvl(timestamp, block, chainBlocks) { - const balances = {}; - const transform = addr => 'avax:'+addr; - await sumTokensAndLPsSharedOwners( - balances, - [ - [ADDRESSES.avax.WAVAX, false], - [ADDRESSES.avax.USDC_e, false], - [ADDRESSES.avax.JOE, false], - ["0x070092b3A985f9E5424351D68730c9A318ad96eb", false], - - ], - [GenMasterchef], - chainBlocks.avax, - "avax", - transform, - ); - - - return balances; +async function atvl(api) { + return api.sumTokens({ owner: GenMasterchef, tokens: [ + ADDRESSES.avax.WAVAX, + ADDRESSES.avax.USDC_e, + ADDRESSES.avax.JOE, + "0x070092b3A985f9E5424351D68730c9A318ad96eb", + ]}) } const pool2LPs = [ @@ -43,7 +29,7 @@ const pool2LPs = [ module.exports = { avax:{ tvl: atvl, - pool2: pool2Exports(GShareRewardPool,pool2LPs,"avax"), + pool2: pool2(GShareRewardPool,pool2LPs,"avax"), staking: stakingPricedLP(ASYLUM, GSHARE, "avax", gShareAvaxLp, "wrapped-avax") } }; \ No newline at end of file diff --git a/projects/gravita-protocol/index.js b/projects/gravita-protocol/index.js index e8ad230f81..d142e717cf 100644 --- a/projects/gravita-protocol/index.js +++ b/projects/gravita-protocol/index.js @@ -1,4 +1,5 @@ const { sumTokens2 } = require("../helper/unwrapLPs"); +const { sumERC4626Vaults } = require("../helper/erc4626"); const ADMIN_ADDRESSES = { arbitrum: "0x4928c8F8c20A1E3C295DddBe05095A9aBBdB3d14", @@ -10,24 +11,26 @@ const ADMIN_ADDRESSES = { mantle: "0x4F39F12064D83F6Dd7A2BDb0D53aF8be560356A6", }; +const erc4626Vaults = { + ethereum: [ + "0xBB22d59B73D7a6F3A8a83A214BECc67Eb3b511fE", // WETH Vault - constellation + "0x1DB1Afd9552eeB28e2e36597082440598B7F1320", // RPL Vault - constellation + ] +} + async function tvl(api) { const adminContract = ADMIN_ADDRESSES[api.chain]; - const collAddresses = await api.call({ - abi: "address[]:getValidCollateral", - target: adminContract, - }); - const activePool = await api.call({ - abi: "address:activePool", - target: adminContract, - }); - const balances = await sumTokens2({ api, tokens: collAddresses, owner: activePool }); - return balances + const vaults = erc4626Vaults[api.chain] ?? [] + const collAddresses = await api.call({ abi: "address[]:getValidCollateral", target: adminContract, }); + const activePool = await api.call({ abi: "address:activePool", target: adminContract, }); + await sumTokens2({ api, tokens: collAddresses, owner: activePool, }); + await sumERC4626Vaults({ api, calls: vaults, isOG4626: true,}); } module.exports = { methodology: "Adds up the total value locked as collateral on the Gravita platform", - start: 1684256400, // Tuesday, May 15, 2023 17:00 GMT + start: '2023-05-16', // Tuesday, May 15, 2023 17:00 GMT }; Object.keys(ADMIN_ADDRESSES).forEach((chain) => { diff --git a/projects/gravity-bridge/index.js b/projects/gravity-bridge/index.js index 4e62bc8123..f983b4b967 100644 --- a/projects/gravity-bridge/index.js +++ b/projects/gravity-bridge/index.js @@ -58,7 +58,6 @@ const GRAVITY_BRIDGE_CONTRACT = "0xa4108aa1ec4967f8b52220a4f7e94a8201f2d906"; module.exports = { methodology: 'Counts the tokens locked in the Gravity Bridge contract on Ethereum chain.', - start: 13798211, ethereum: { tvl: sumTokensExport({ owner: GRAVITY_BRIDGE_CONTRACT, tokens: erc20Contracts, }), }, diff --git a/projects/groprotocol/index.js b/projects/groprotocol/index.js index 28613b9bb5..28baac7d24 100644 --- a/projects/groprotocol/index.js +++ b/projects/groprotocol/index.js @@ -115,7 +115,7 @@ module.exports = { avax: { tvl: avaxTvl, }, - start: 1622204347, // 28-05-2021 12:19:07 (UTC) + start: '2021-05-28', // 28-05-2021 12:19:07 (UTC) methodology: "Assets held within the GRO Protocol - either within the PWRD or Vault (GVT) products, or staked in the Gro Protocol pools. Avax TVL is the sum of tokens locked in Gro Labs.", }; diff --git a/projects/grvt-io/index.js b/projects/grvt-io/index.js new file mode 100644 index 0000000000..8f0e6562d9 --- /dev/null +++ b/projects/grvt-io/index.js @@ -0,0 +1,7 @@ +const getTvl = require("../txBridge/util") + +module.exports = { + ethereum: { + tvl: async (api) => getTvl(api, { chainId: 325, }), + }, +} diff --git a/projects/gud-tech/index.js b/projects/gud-tech/index.js new file mode 100644 index 0000000000..450d69d2e8 --- /dev/null +++ b/projects/gud-tech/index.js @@ -0,0 +1,17 @@ +const { getLogs2 } = require('../helper/cache/getLogs'); +const { sumTokens2 } = require('../helper/unwrapLPs'); + +const config = { + zircuit: { factory: '0xF9D8fC35C11cF6acd3D04CA1C3F7F4Fa65e20dCf', fromBlock: 6586739, missing: ['0xfd418e42783382e86ae91e445406600ba144d162']}, +} + +Object.keys(config).forEach(chain => { + const { factory, fromBlock, missing = [] } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: 'event TokenStakabilityChanged(address token, bool enabled)', fromBlock, }) + const tokens = logs.map(i => i.token).concat(missing) + return sumTokens2({ api, owner: factory, tokens, permitFailure: true, }) + } + } +}) \ No newline at end of file diff --git a/projects/gudchain/index.js b/projects/gudchain/index.js index 05acdf3551..54195b8651 100644 --- a/projects/gudchain/index.js +++ b/projects/gudchain/index.js @@ -7,7 +7,6 @@ module.exports = { ethereum: { tvl: sumTokensExport({ owner: launchBridge, - start: 20203960, tokens: [ ADDRESSES.null, ADDRESSES.ethereum.STETH, diff --git a/projects/gullnetwork/index.js b/projects/gullnetwork/index.js index b48859486b..5bb2792497 100644 --- a/projects/gullnetwork/index.js +++ b/projects/gullnetwork/index.js @@ -25,7 +25,7 @@ const tvl = async (api) => { } module.exports = { - start: 1710844331, // May-17-2024 12:45:31 PM +UTC + start: '2024-03-19', // May-17-2024 12:45:31 PM +UTC methodology: 'GullNetwork TVL including total values of assets staked in our staking vaults, and assets in the liquidity pool.', } diff --git a/projects/hackenai/index.js b/projects/hackenai/index.js new file mode 100644 index 0000000000..86e2b6fde4 --- /dev/null +++ b/projects/hackenai/index.js @@ -0,0 +1,16 @@ +const { getConfig } = require('../helper/cache') + +const HAI_base = '0x73e2a6320314883ff8cc08b53f1460a5f4c47f2c'.toLowerCase() + +const staking = async (api) => { + const pools = await getConfig('hackenAI', 'https://api.atomica.org/srm-production-v2/v2/pool/list') + const owners = pools.filter(pool => pool.chainId === api.chainId && pool.capitalToken?.address.toLowerCase() === HAI_base).map(pool => pool.id) + return api.sumTokens({ owners, token: HAI_base }) +} + +module.exports = { + base: { + tvl: () => ({}), staking, + }, + methodology: 'We count the HAI staked in the Flash Pools contracts' +} \ No newline at end of file diff --git a/projects/hades-money/index.js b/projects/hades-money/index.js index 991b828d2a..f1389c2562 100644 --- a/projects/hades-money/index.js +++ b/projects/hades-money/index.js @@ -1,5 +1,5 @@ const { staking } = require("../helper/staking"); -const { pool2Exports } = require("../helper/pool2"); +const { pool2 } = require("../helper/pool2"); const hades = "0x88C37E0bc6a237e96bc4A82774A38BBc30efF3Cf"; const hellshare = "0xEfB15eF34f85632fd1D4C17FC130CcEe3D3D48aE"; @@ -15,6 +15,6 @@ module.exports = { metis: { tvl: async () => ({}), staking: staking(masonry, hellshare), - pool2: pool2Exports(hellsharerewardpool, pool2LPs, "metis") + pool2: pool2(hellsharerewardpool, pool2LPs, "metis") } } \ No newline at end of file diff --git a/projects/haedal-amm/index.js b/projects/haedal-amm/index.js new file mode 100644 index 0000000000..570a986902 --- /dev/null +++ b/projects/haedal-amm/index.js @@ -0,0 +1,19 @@ +const sui = require('../helper/chain/sui') + +async function suiTVL(api) { + const poolObjectID = '0x3b822ea230e2f63860b05d4166ddce7133c0d04838d8f93ce02a88098fe0c609' + const {fields:{pools:{fields: {contents:listPool}}}} = await sui.getObject(poolObjectID) + for( const pool of listPool){ + const {fields:{value: pool_id}} = pool + const {type,fields:{coins:{fields:{base_coin, quote_coin}}}} = await sui.getObject(pool_id) + const [coinA, coinB] = type.replace('>', '').split('<')[1].split(', ') + api.add(coinA, base_coin) + api.add(coinB, quote_coin) + } +} + +module.exports = { + sui: { + tvl: suiTVL, + } +} \ No newline at end of file diff --git a/projects/hai/index.js b/projects/hai/index.js index 2aec692174..9a2ba44a3c 100644 --- a/projects/hai/index.js +++ b/projects/hai/index.js @@ -4,7 +4,7 @@ const config = { } module.exports = { - start: 1709780769, // globalDebtCeiling raised > 0 + start: '2024-03-07', // globalDebtCeiling raised > 0 }; Object.keys(config).forEach(chain => { diff --git a/projects/halotrade-v3/index.js b/projects/halotrade-v3/index.js new file mode 100644 index 0000000000..7987242427 --- /dev/null +++ b/projects/halotrade-v3/index.js @@ -0,0 +1,29 @@ +const { getConfig } = require('../helper/cache') +const { get } = require('../helper/http') +const { sumTokens2 } = require('../helper/unwrapLPs') + +module.exports = { + aura: { tvl }, +} + +async function tvl(api) { + const pools = await getConfig('halo-trade/uni-v3-pools', undefined, { + fetcher: async () => { + let page = 0 + let size = 100 + let hasMore = true + const pools = [] + do { + const { data: { res: { results } } } = await get(`https://api.halotrade.zone/api/v1/evm/univ3/halo-pool/poolList?page=${page}&pageSize=${size}`) + page++ + hasMore = results.length === size + pools.push(...results.map(i => i.poolContractAddr)) + } while (hasMore) + return pools + } + }) + const token0s = await api.multiCall({ abi: 'address:token0', calls: pools }) + const token1s = await api.multiCall({ abi: 'address:token1', calls: pools }) + const ownerTokens = pools.map((v, i) => [[token0s[i], token1s[i]], v]) + return sumTokens2({ api, ownerTokens }) +} \ No newline at end of file diff --git a/projects/harbor-protocol.js b/projects/harbor-protocol.js index 5894faf048..7f365981c0 100644 --- a/projects/harbor-protocol.js +++ b/projects/harbor-protocol.js @@ -10,5 +10,7 @@ async function tvl({ chain }) { } module.exports = { + deadFrom: "2024-09-17", + hallmarks: [[1692403200, "Exploit on Harbor Protocol"]], comdex: { tvl } } \ No newline at end of file diff --git a/projects/harmonix/index.js b/projects/harmonix/index.js index f0a7bb5b75..74ab9da984 100644 --- a/projects/harmonix/index.js +++ b/projects/harmonix/index.js @@ -1,11 +1,11 @@ module.exports = { misrepresentedTokens: true, - start: 1709251200, // Friday, March 1, 2024 12:00:00 AM + start: '2024-03-01', // Friday, March 1, 2024 12:00:00 AM methodology: "Aggregates total value of each Harmonix vault" } const config = { - arbitrum: "0x7274463BF93E0058481042Cbd6e0cc73042E6285", + arbitrum: "0x3363A85c31cf13a96802e2935724232767420135", ethereum: "0xC7C8Cdd1E9817Fc98AD1b05cD3633c6471A9473b", base: "0x45dC73fB760f2382Cfd11e28C0Dd0a3A8d3E4C31", } @@ -18,4 +18,4 @@ Object.keys(config).forEach(chain => { api.addCGToken("tether", bal/1e6) } } -}) \ No newline at end of file +}) diff --git a/projects/harmony-swap/index.js b/projects/harmony-swap/index.js new file mode 100644 index 0000000000..93d1e4e2ec --- /dev/null +++ b/projects/harmony-swap/index.js @@ -0,0 +1,5 @@ +const { uniV3Export, uniV3GraphExport } = require("../helper/uniswapV3"); + +module.exports = { + harmony: { tvl: uniV3GraphExport({ graphURL: 'GVkp9F6TzzC5hY4g18Ukzb6gGcYDfQrpMpcj867jsenJ', name: 'harmony-swap' }) } +} \ No newline at end of file diff --git a/projects/hashai/index.js b/projects/hashai/index.js new file mode 100644 index 0000000000..1243184b65 --- /dev/null +++ b/projects/hashai/index.js @@ -0,0 +1,20 @@ +const { staking } = require('../helper/staking'); +const { sumTokensExport } = require("../helper/unwrapLPs"); +const coreAssets = require("../helper/coreAssets.json"); + +const contracts = [ + '0xd2fe354cfebaa06f2140f13b66d0b3e1fc3ceec0', + '0x27cc372757ca955ebf93bd577cd95c4e12f5c14b', +]; + +const hashai = '0x292fcDD1B104DE5A00250fEBbA9bC6A5092A0076'; + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + owners: contracts, + token: coreAssets.null + }), + staking: staking(contracts, hashai), + }, +}; diff --git a/projects/hashkey-exchange/index.js b/projects/hashkey-exchange/index.js index 2786278e13..3057fb06a9 100644 --- a/projects/hashkey-exchange/index.js +++ b/projects/hashkey-exchange/index.js @@ -1,4 +1,5 @@ const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { avax: { @@ -8,12 +9,7 @@ const config = { ], }, bitcoin: { - owners: [ - "bc1qqe394jlqq86muq23d4vrnhzzvcv8jnepgt8lx7", - "1NfJSiqBw4fb74KgVQrPsk5W5aqitAD1Xv", - // "bc1qlrawqecuwgpzzwh04pkhtfsqsk33kald22ds3c", // bosera funds https://www.bosera.com/english/index.html - "18oxobhCNKnHjb7nEFDmPdXbCZthFWezrm", - ], + owners: bitcoinAddressBook.hashkeyExchange }, ethereum: { owners: [ diff --git a/projects/hashkey/index.js b/projects/hashkey/index.js index 5694e7c5e0..e47181151c 100644 --- a/projects/hashkey/index.js +++ b/projects/hashkey/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -8,10 +9,7 @@ const config = { ], }, bitcoin: { - owners: [ - "bc1qyvppkaa74d9jvtz664a6uxmj09hf0eyg3uhx4h", - "1DywJMqHHMWuP7xyfkRqJZCEe7GdEKFRcp" - ], + owners: bitcoinAddressBook.hashkey, }, litecoin: { owners: [ diff --git a/projects/hashnote/index.js b/projects/hashnote/index.js index 61cacff407..9930d8a14c 100644 --- a/projects/hashnote/index.js +++ b/projects/hashnote/index.js @@ -1,29 +1,40 @@ -const ADDRESSES = require('../helper/coreAssets.json') +const { call } = require('../helper/chain/near') +const { get } = require("../helper/http"); +const USYC = '0x136471a34f6ef19fE571EFFC1CA711fdb8E49f2b' -const contracts = { - canto:{ - token: '0xfb8255f0de21acebf490f1df6f0bdd48cc1df03b', - oracle: '0x1d18c02bc80b1921255e71cf2939c03258d75470' - }, - ethereum:{ - token: '0x136471a34f6ef19fE571EFFC1CA711fdb8E49f2b', - oracle: '0x4c48bcb2160F8e0aDbf9D4F3B034f1e36d1f8b3e' - } +const CONFIG = { + canto: '0xfb8255f0de21acebf490f1df6f0bdd48cc1df03b', + ethereum: USYC, + near: 'usyc.near', + noble: 'uusyc' } -const tvl = async (api) => { - const totalSupply = await api.call({ target: contracts[api.chain].token, abi: 'uint256:totalSupply'}); - const rate = await api.call({ target: contracts[api.chain].oracle, abi: 'function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)'}); +const evmTvl = async (api, token) => { + const supply = await api.call({ target: token, abi: 'erc20:totalSupply' }) + api.add(USYC, supply, { skipChain: true }) +} - return { - [ADDRESSES.ethereum.USDC]: (totalSupply * rate.answer)/1e8 - }; +const nonEvmTvl = async (api, token) => { + const supply = await call(token, 'ft_total_supply', {}); + api.add(USYC, supply, { skipChain: true }); } -module.exports = { - canto: { - tvl - }, - ethereum:{tvl} -}; +const nobleTvl = async (api, token) => { + const res = await get(`https://rest.cosmos.directory/noble/cosmos/bank/v1beta1/supply/by_denom?denom=${token}`); + api.add(USYC, parseInt(res.amount.amount), { skipChain: true }); +} + +Object.entries(CONFIG).forEach(([chain, address]) => { + module.exports[chain] = { + tvl: async (api) => { + if (chain === 'near') { + return nonEvmTvl(api, address); + } else if (chain === 'noble') { + return nobleTvl(api, address); + } else { + return evmTvl(api, address); + } + } + }; +}); \ No newline at end of file diff --git a/projects/headstarter/index.js b/projects/headstarter/index.js new file mode 100644 index 0000000000..f842294468 --- /dev/null +++ b/projects/headstarter/index.js @@ -0,0 +1,71 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokens2 } = require("../helper/unwrapLPs"); + +const STAKING_CONTRACT = "0x000000000000000000000000000000000070eac5"; +const HST = ADDRESSES.hedera.HST; + +const ENTITIES = [ + { + token: "0x000000000000000000000000000000000048fda4", + contracts: [ + "0x00000000000000000000000000000000004e3387", + "0x00000000000000000000000000000000004e3395", + "0x00000000000000000000000000000000004d6daa", + "0x0000000000000000000000000000000000575c04", + ], + }, + { + token: ADDRESSES.hedera.STEAM, + contracts: [ + "0x00000000000000000000000000000000005737f0", + "0x00000000000000000000000000000000005737e1", + "0x0000000000000000000000000000000000571a8d", + "0x0000000000000000000000000000000000571a8a", + "0x000000000000000000000000000000000056d9ea", + "0x0000000000000000000000000000000000575c04", + ], + }, + { + token: ADDRESSES.hedera.HLQT, + contracts: [ + "0x00000000000000000000000000000000005cb45b", + "0x00000000000000000000000000000000005cb45f", + "0x0000000000000000000000000000000000575c04", + ], + }, +]; + +const HST_ENTITIES = [ + { + token: HST, + contracts: [ + STAKING_CONTRACT, + "0x00000000000000000000000000000000000f5ad1", + "0x00000000000000000000000000000000000fc16c", + "0x0000000000000000000000000000000000101201", + "0x0000000000000000000000000000000000575c04", + ], + }, +]; + +const getTokensAndOwners = (entities) => { + return entities.map(({ token, contracts}) => contracts.map(i => [token, i])).flat(); +}; + +const tvl = async (api) => { + const tokensAndOwners = getTokensAndOwners(ENTITIES); + return sumTokens2({api, tokensAndOwners }); +}; + +const staking = async (api) => { + const tokensAndOwners = getTokensAndOwners(HST_ENTITIES); + return sumTokens2({api, tokensAndOwners }); +}; + +module.exports = { + methodology: "We count the HST tokens locked in the HeadStarter contracts.", + hedera: { + tvl, + staking, + }, +}; diff --git a/projects/hectagon/index.js b/projects/hectagon/index.js index e4c49b25df..5f616dac6c 100644 --- a/projects/hectagon/index.js +++ b/projects/hectagon/index.js @@ -12,7 +12,6 @@ const HECTA_BUSD_ADDRESS = "0xc7cee4cea7c76e11e9f5e5e5cbc5e3b798a1c4d0"; module.exports = { methodology: "Total Value Lock in Hectagon protocol is calculated by sum of: Treasury locked value", - start: 20195418, bsc: { tvl: (_, _b, {[chain]: block}) => sumTokens2({ chain, block, owner: TREASURY_ADDRESS, tokens: [HECTA_BUSD_ADDRESS, BUSD_ADDRESS,]}), staking: staking(gHECTA, HECTA_ADDRESS, chain), diff --git a/projects/hedgefarm/index.js b/projects/hedgefarm/index.js index b207d74b5f..badd044ae1 100644 --- a/projects/hedgefarm/index.js +++ b/projects/hedgefarm/index.js @@ -27,7 +27,6 @@ async function tvl(api) { module.exports = { methodology: 'Gets the total balance in the Alpha #1 contract from IOU total supply and price per share and in the Smart Farmooor (Alpha #2) from the total balance.', - start: 21220270, avax: { tvl, } diff --git a/projects/hedgehog-markets/index.js b/projects/hedgehog-markets/index.js new file mode 100644 index 0000000000..a700868ce5 --- /dev/null +++ b/projects/hedgehog-markets/index.js @@ -0,0 +1,146 @@ +const { PublicKey } = require("@solana/web3.js"); +const { getProvider, sumTokens2, getConnection, decodeAccount } = require("../helper/solana"); +const { Program } = require("@project-serum/anchor"); + +async function tvl(api) { + const provider = getProvider(); + const connection = getConnection(); + + const tokenAccounts = []; + const owners = []; + + await getClassicMarketTokenAccounts(); + await addP2PDepositTokenAccounts(); + await addP2PLuloBalances(); + await addParlay(); + await addParimutuel(); + + const balances = api.getBalances(); + + await sumTokens2({ owners, balances }); + + return sumTokens2({ tokenAccounts, balances }); + + async function getClassicMarketTokenAccounts() { + const classicMarketProgramId = "D8vMVKonxkbBtAXAxBwPPWyTfon8337ARJmHvwtsF98G"; + const idl = await Program.fetchIdl(classicMarketProgramId, provider); + + const program = new Program(idl, classicMarketProgramId, provider); + const markets = await program.account.market.all(); + const collateralAccounts = markets.map(({ account }) => account.marketCollateral); + tokenAccounts.push(...collateralAccounts); + } + + + async function addP2PDepositTokenAccounts() { + const programId = new PublicKey("P2PototC41acvjMc9cvAoRjFjtaRD5Keo9PvNJfRwf3"); + + const result = await connection.getProgramAccounts(programId, { + encoding: "base64", + // We only care about the market addresses. + dataSlice: { offset: 0, length: 0 }, + filters: [ + // Market accounts have a discriminator of 3 at offset 0. + { memcmp: { offset: 0, bytes: "4" } }, + ], + }); + + for (const { pubkey } of result) { + // Market deposit account. + const [deposit] = PublicKey.findProgramAddressSync( + [Buffer.from("deposit"), pubkey.toBuffer()], + programId, + ); + + tokenAccounts.push(deposit); + } + } + + async function addParlay() { + const programId = new PublicKey("PLYaNRbQs9GWyVQdcLrzPvvZu7NH4W2sneyHcEimLr7"); + const poolOwner = "8Y46GkrbUqXnbs6kPD6SWr44NjcKPEWYzvpAn8UB5duR"; + owners.push(poolOwner); + + const accounts = await connection.getProgramAccounts(programId, { + // We only care about: + // - mint address (69..101) + // - entry count (101..105) + // - entry cost (105..113) + dataSlice: { offset: 69, length: 44 }, + filters: [ + // Market accounts have a discriminator of 3 at offset 0. + { memcmp: { offset: 0, bytes: "4" } }, + // Open markets have a state of 0 at offset 149. + { memcmp: { offset: 149, bytes: "1" } }, + ], + }); + + accounts.forEach(({ account }) => { + const data = decodeAccount("hhParlay", account); + + api.add(data.mint.toString(), Number(data.entryCount) * Number(data.entryCost)); + }); + } + + async function addP2PLuloBalances() { + // https://github.com/Hedgehog-Markets/hedgehog-program-library/blob/master/p2p/idl.json + const programId = new PublicKey("P2PzLraW8YF87BxqZTZ5kgrfvzcrKGPnqUBNhqmcV9B"); + const poolOwner = "J9EH18EWSo8s69gouHGNy5zFHkhcHRbb9zBZXwSG4cHy"; + owners.push(poolOwner); + + const accounts = await connection.getProgramAccounts(programId, { + // We only care about: + // - mint address (73..105) + // - yes amount (113..121) + // - no amount (121..129) + dataSlice: { offset: 69, length: 56 }, + filters: [ + // Market accounts have a discriminator of 3 at offset 0. + { memcmp: { offset: 0, bytes: "4" } }, + // Open markets have a state of 0 at offset 129. + { memcmp: { offset: 129, bytes: "1" } }, + ], + }); + + accounts.forEach(({ account: { data } }) => { + const mint = new PublicKey(data.slice(0, 32)).toString(); + const yesAmount = Number(data.readUInt8(40)); + const noAmount = Number(data.readUInt8(48)); + api.add(mint, yesAmount + noAmount); + }); + } + + async function addParimutuel() { + const programId = new PublicKey("PARrVs6F5egaNuz8g6pKJyU4ze3eX5xGZCFb3GLiVvu"); + const poolOwner = "3SAUPiGiATqv8TBgvzSJqpLxLGF6LbJamvimueJQT7WT"; + owners.push(poolOwner); + + const accounts = await connection.getProgramAccounts(programId, { + filters: [ + // Market accounts have a discriminator of 3 at offset 0. + { memcmp: { offset: 0, bytes: "4" } }, + // Open markets have a state of 0 at offset 149. + { memcmp: { offset: 149, bytes: "1" } }, + ], + }); + + accounts.forEach(({ account: { data } }) => { + const token = new PublicKey(data.slice(69, 69 + 32)).toString(); + // Amounts is a u64 array with u8 length prefix at offset 131. + const amountsLen = data.readUint8(131); + + let amounts = []; + for (let i = 0; i < amountsLen; i++) { + amounts.push(data.readBigUint64LE(132 + i * 8).toString()); + } + + api.add(token, amounts); + }); + } +} + +module.exports = { + timetravel: false, + solana: { tvl }, + methodology: "TVL consists of deposits made into Hedgehog Markets.", +}; diff --git a/projects/helio-money/index.js b/projects/helio-money/index.js index a780961f14..5bcaae15a4 100644 --- a/projects/helio-money/index.js +++ b/projects/helio-money/index.js @@ -1,66 +1,131 @@ const ADDRESSES = require("../helper/coreAssets.json"); +const { staking } = require("../helper/staking"); const { sumTokensExport } = require("../helper/unknownTokens"); +const lisLPs = [ + "0xe8f4644637f127aFf11F9492F41269eB5e8b8dD2", // Lista LP Stable-LP + "0xFf5ed1E64aCA62c822B178FFa5C36B40c112Eb00", // Lista LP aSnBNB-WBNB + "0x4b2D67Bf25245783Fc4C33a48962775437F9159c", // Lista LP aUSDT-LISTA + "0xC23d348f9cC86dDB059ec798e87E7F76FBC077C1", // Lista LP aHAY-USDT + "0xF6aB5cfdB46357f37b0190b793fB199D62Dcf504", // Lista LP UV-17-THE + "0x1Cf9c6D475CdcA67942d41B0a34BD9cB9D336C4d", // Lista LP sAMM-HAY/FRAX + "0x9eb77a54a33069a319d91f493e6b1c9066fb38f7" // Lista LP pancake lisUSD/USDT + + ]; + + +const abi = { + lpToken: "address:lpToken", + totalSupply: "uint256:totalSupply", +}; + +const pool2 = async (api) => { + const [lisLpTokens, lisLpBalances] = await Promise.all([ + api.multiCall({calls: lisLPs.map((lis) => ({ target: lis })), abi: abi.lpToken }), + api.multiCall({calls: lisLPs.map((lis) => ({ target: lis })), abi: abi.totalSupply }), + ]); + + + lisLPs.forEach((_lp, i) => { + + api.add(lisLpTokens[i], lisLpBalances[i]) + }) + + + +} + module.exports = { - methodology: "The TVL is calculated by summing the values of tokens held in the specified vault addresses", - hallmarks: [ - [1669939200, "aBNBc exploit"], - //[1670544000,"aBNBc to AnkrBNB swap & HAY buyback"] - ], - bsc: { - tvl: sumTokensExport({ - tokensAndOwners: [ - // BNB - [ADDRESSES.null, "0x986b40C2618fF295a49AC442c5ec40febB26CC54"], - - //slisBNB - [ - "0xB0b84D294e0C75A6abe60171b70edEb2EFd14A1B", - "0x6F28FeC449dbd2056b76ac666350Af8773E03873", - ], - - // slisBNB - [ - "0xB0b84D294e0C75A6abe60171b70edEb2EFd14A1B", - "0x91e49983598685DD5ACAc90CEb4061A772f6E5Ae", - ], - - // eth - [ADDRESSES.bsc.ETH, "0xA230805C28121cc97B348f8209c79BEBEa3839C0"], - - // eth => wBETH - [ - "0xa2E3356610840701BDf5611a53974510Ae27E2e1", - "0xf45C3b619Ee86F653805E007fE211B7e930E0b3B", - ], - - // wbeth - [ - "0xa2E3356610840701BDf5611a53974510Ae27E2e1", - "0xA230805C28121cc97B348f8209c79BEBEa3839C0", - ], - - // BTCB - [ - ADDRESSES.bsc.BTCB, - "0xad9eAAe95617c39019aCC42301a1dCa4ea5b6f65", - ], - // ezETH - [ - ADDRESSES.blast.ezETH, - "0xd7E33948e2a43e7C1ec2F19937bf5bf8BbF9BaE8", - ], - // weETH - [ - ADDRESSES.blast.weETH, - "0x2367f2Da6fd39De6944218CC9EC706BCdc9a6918", - ], - // STONE - [ - ADDRESSES.scroll.STONE, - "0x876cd9a380Ee7712129b52f8293F6f06056c3104", - ], - ], - }), - }, + methodology: "The TVL is calculated by summing the values of tokens held in the specified vault addresses", + hallmarks: [ + [1669939200, "aBNBc exploit"], + //[1670544000,"aBNBc to AnkrBNB swap & HAY buyback"] + ], + bsc: { + tvl: sumTokensExport({ + tokensAndOwners: [ + // BNB + [ADDRESSES.null, "0x986b40C2618fF295a49AC442c5ec40febB26CC54"], + + //slisBNB + [ + "0xB0b84D294e0C75A6abe60171b70edEb2EFd14A1B", + "0x6F28FeC449dbd2056b76ac666350Af8773E03873", + ], + + // slisBNB + [ + "0xB0b84D294e0C75A6abe60171b70edEb2EFd14A1B", + "0x91e49983598685DD5ACAc90CEb4061A772f6E5Ae", + ], + + // eth + [ADDRESSES.bsc.ETH, "0xA230805C28121cc97B348f8209c79BEBEa3839C0"], + + // eth => wBETH + [ + "0xa2E3356610840701BDf5611a53974510Ae27E2e1", + "0xf45C3b619Ee86F653805E007fE211B7e930E0b3B", + ], + + // wbeth + [ + "0xa2E3356610840701BDf5611a53974510Ae27E2e1", + "0xA230805C28121cc97B348f8209c79BEBEa3839C0", + ], + + // BTCB + [ADDRESSES.bsc.BTCB, "0xad9eAAe95617c39019aCC42301a1dCa4ea5b6f65"], + // ezETH + [ADDRESSES.blast.ezETH, "0xd7E33948e2a43e7C1ec2F19937bf5bf8BbF9BaE8"], + // weETH + [ADDRESSES.blast.weETH, "0x2367f2Da6fd39De6944218CC9EC706BCdc9a6918"], + // STONE + [ADDRESSES.scroll.STONE, "0x876cd9a380Ee7712129b52f8293F6f06056c3104"], + // solvBTC + [ + "0x4aae823a6a0b376De6A78e74eCC5b079d38cBCf7", + "0xA94AA72e033b39AD7CD448f38Bc1eda5B52f7079", + ], + // BBTC + [ + "0xF5e11df1ebCf78b6b6D26E04FF19cD786a1e81dC", + "0x157c9a692ee99C39272856055957083a928cE299", + ], + // wstETH + [ + "0x26c5e01524d2E6280A48F2c50fF6De7e52E9611C", + "0xf8Ca8D2B59A97125751af1069d4a5C4F7eB7A677", + ], + //solvBTC.BBNB + ["0x1346b618dC92810EC74163e4c27004c921D446a5","0x03DB750d6212C6a0BCa9258E8cB7cf46dfD63067"], + + // USDT +[ADDRESSES.bsc.USDT, "0xAd406CcF75f9E6216fA4349635B0cD77D0059b1f"], + + //FDUSD + [ADDRESSES.ethereum.FDUSD,"0x2202a491752Fee0E616F06A89E2eF416E2Fcd7e9"], + + // sUSDX + [ + "0x7788A3538C5fc7F9c7C8A74EAC4c898fC8d87d92", + "0x98b167359566c1ea05335D52794C7Eb6f8E6739a", + ], + + // vUSDT, PSM - LSR + // [ADDRESSES.bsc.USDT, "0x5763DDeB60c82684F3D0098aEa5076C0Da972ec7"], + ["0xfd5840cd36d94d7229439859c0112a4185bc0255","0xf76D9cFD08dF91491680313B1A5b44307129CDa9"], + + // pumpBTC + [ + "0xf9C4FF105803A77eCB5DAE300871Ad76c2794fa4", + "0xEA44dDC58eC6b4902E19A353c554B6A4F32b9e6E", + ], + ], + }), + pool2, + staking: staking('0xd0C380D31DB43CD291E2bbE2Da2fD6dc877b87b3','0xFceB31A79F71AC9CBDCF853519c1b12D379EdC46') + }, }; + +// execute with `node test.js projects/helio-money` \ No newline at end of file diff --git a/projects/helper/balancer.js b/projects/helper/balancer.js index 8ab6be241d..a38a0d75b3 100644 --- a/projects/helper/balancer.js +++ b/projects/helper/balancer.js @@ -1,5 +1,6 @@ const { sumTokens2 } = require('./unwrapLPs'); -const { getLogs } = require('./cache/getLogs') +const { getLogs } = require('./cache/getLogs'); +const { cachedGraphQuery } = require('./cache'); function onChainTvl(vault, fromBlock, { blacklistedTokens = [], preLogTokens = [], onlyUseExistingCache, permitFailure } = {}) { return async (api) => { @@ -33,6 +34,29 @@ function onChainTvl(vault, fromBlock, { blacklistedTokens = [], preLogTokens = [ } } +function v3Tvl(vault, fromBlock, { blacklistedTokens = [], preLogTokens = [], onlyUseExistingCache, permitFailure } = {}) { + return async (api) => { + const regsistedEvents = "event PoolRegistered(address indexed pool, address indexed factory, (address token, uint8 tokenType, address rateProvider, bool paysYieldFees)[] tokenConfig, uint256 swapFeePercentage, uint32 pauseWindowEndTime, (address pauseManager, address swapFeeManager, address poolCreator) roleAccounts, (bool enableHookAdjustedAmounts, bool shouldCallBeforeInitialize, bool shouldCallAfterInitialize, bool shouldCallComputeDynamicSwapFee, bool shouldCallBeforeSwap, bool shouldCallAfterSwap, bool shouldCallBeforeAddLiquidity, bool shouldCallAfterAddLiquidity, bool shouldCallBeforeRemoveLiquidity, bool shouldCallAfterRemoveLiquidity, address hooksContract) hooksConfig, (bool disableUnbalancedLiquidity, bool enableAddLiquidityCustom, bool enableRemoveLiquidityCustom, bool enableDonation) liquidityManagement)" + + const logs = await getLogs({ + api, + target: vault, + fromBlock, + eventAbi: regsistedEvents, + onlyArgs: true, + extraKey: 'PoolRegistered', + topics: ['0xbc1561eeab9f40962e2fb827a7ff9c7cdb47a9d7c84caeefa4ed90e043842dad'], + onlyUseExistingCache, + }) + + const pools = logs.map(i => i.pool) + const tokens = logs.map(i => i.tokenConfig.map(i => i.token)).flat() + + blacklistedTokens = [...blacklistedTokens, ...pools].map(i => i.toLowerCase()) + return api.sumTokens({ owner: vault, tokens }) + } +} + function v1Tvl(bPoolFactory, fromBlock, { blacklistedTokens = [] } = {}) { return async (api) => { let poolLogs = await getLogs({ @@ -51,7 +75,23 @@ function v1Tvl(bPoolFactory, fromBlock, { blacklistedTokens = [] } = {}) { } } +function balV2GraphExport({ vault, blacklistedTokens = [], graphURL, name, permitFailure, }) { + return async (api) => { + if (!graphURL) { + throw new Error('graphURL is required') + } + if (!name) { + throw new Error('name is required (it is used as id for caching)') + } + const query = `{ tokens(first: 1000) { address } }` + const tokens = (await cachedGraphQuery(name, graphURL, query)).tokens.map(t => t.address) + return sumTokens2({ api, owner: vault, tokens, blacklistedTokens, permitFailure }) + } +} + module.exports = { onChainTvl, v1Tvl, + balV2GraphExport, + v3Tvl, }; diff --git a/projects/helper/bitcoin-book/21Co.js b/projects/helper/bitcoin-book/21Co.js new file mode 100644 index 0000000000..f5c4e25efb --- /dev/null +++ b/projects/helper/bitcoin-book/21Co.js @@ -0,0 +1,4 @@ +module.exports = [ + '1HTGi4tfXSEtcXD4pk6S3vBs3s64hWY1pW', + '12WZhMFFLHQ4rCMSkeBfbJXRk7aGWyBh1M' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/ainn-layer2.js b/projects/helper/bitcoin-book/ainn-layer2.js new file mode 100644 index 0000000000..adcec5f7ec --- /dev/null +++ b/projects/helper/bitcoin-book/ainn-layer2.js @@ -0,0 +1,20 @@ +module.exports = [ + "bc1q6dtp7ayaj5k2zv0z5ayhkdsvmtvdqgyaa9zs53", + "3H8cmLndtkBs7kiHByhHAddTzy8taUwYPt", + "bc1pepsapf26n8y2f4uftlmhy60ksghx6rqlxdcj4uacfqrkcg6pmncs52rzuu", + "bc1qu4ru2sph5jatscx5xuf0ttka36yvuql7hl5h4c", + "1JA46eiDpfx589wawn5RvtEXgwc518QfhZ", + "bc1qaajdlp5yrj5f77wq2ndtfqnmsamvvxhpy95662zkzykn9qhvdgys580hcs", + "368vZZKUWDFZRLWMFNRJzHo1HnibNeAJir", + "33hE9Wq65kjbiLsGD1NYwwNatP6hbsZv5H", + "32GU8Jux7SbsEbaAaLUnEQmc6JemLF6BUb", + "3CP5WJ2JSLCew7SETWUe5FxpBGrekMBiwk", + "39Fvw2Ho1fEkyDsos5sNTN5iMJZKzTL526", + "3Kptt4TZZRcjuGH8ikoQ8mV1TVxq45dnuS", + "3G4sMXWAAVTvTXTksr8u9zuu7W8RKsicEz", + "335DRGzLLG2tu4H4PnFBHYAwcj5pvV8zei", + "bc1qqg3cdyadq25zn99sdprr4lgpsxg2za998eygy8", + "bc1qw4vp94e9egkaxc04qsu5z9aq5pqpku2p6pzer8", + "bc1q3q7afjarz7l6v49538qs2prffhtawf38ss85k8", + "bc1q3smt9ut40eld6tgn42sdlp9yrx98s90unqw3pl" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/allo.js b/projects/helper/bitcoin-book/allo.js new file mode 100644 index 0000000000..b8d3311f0b --- /dev/null +++ b/projects/helper/bitcoin-book/allo.js @@ -0,0 +1,9 @@ +module.exports = [ + "bc1pn87rjuhzl3sr9tffhgx3nrrq7rhyxg7y58dl0uk5kyhmkfj26ssqz76lfc", + "bc1pu64y7m8hdekc5h4xtdl8ru9g3ct5n6mghmaqs8qtqecznccvy38s8tvdv4", + "bc1pjgn7m39vu02el3xpk2rtgt5kww8g5tkhmc55zevjld4n6cc9tuyq6akrq0", + "bc1pn29hejmt2mrslsa0ttfknp268qrpsmc7wqmw4ddxqytctzjl50ws2yrpmt", + "bc1pkpddzz2px40f803qug3l28c7d99qvvjkccgzj7tc80xx29pkd2vq3lqrg3", + "bc1p23su0d2sxwg95c7ny0p5vn4vf83jmvhyzacw3srjv84hmvynkacqe52r9d", + "bc1pn6rqr5z8yu5z9qphs0ccmcnt2c8ye04e3f2590rdxsd2mga0harq9k4207" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/arkham-exchange.js b/projects/helper/bitcoin-book/arkham-exchange.js new file mode 100644 index 0000000000..334cc7e191 --- /dev/null +++ b/projects/helper/bitcoin-book/arkham-exchange.js @@ -0,0 +1,3 @@ +module.exports = [ + 'bc1qlnkyrrupehgw5evu43erlgkhhagv0uj3yyhacvc65n3ud6qeas0sa958ps' +] diff --git a/projects/helper/bitcoin-book/avalanche-btc.js b/projects/helper/bitcoin-book/avalanche-btc.js new file mode 100644 index 0000000000..ac1edf073e --- /dev/null +++ b/projects/helper/bitcoin-book/avalanche-btc.js @@ -0,0 +1,3 @@ +module.exports = [ + 'bc1q2f0tczgrukdxjrhhadpft2fehzpcrwrz549u90', // https://prnt.sc/unrBvLvw3z1t +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/avalon-cedefi.js b/projects/helper/bitcoin-book/avalon-cedefi.js new file mode 100644 index 0000000000..9451bd241a --- /dev/null +++ b/projects/helper/bitcoin-book/avalon-cedefi.js @@ -0,0 +1,8 @@ +module.exports = [ + '32DgQPVHSV6FSxLnw68nggvchp3ZNKquxA', + 'bc1qr5nz7n8ulcdz0w3s6fska80fawxhvqlh273qypm3rkjequ9wpmhs65ppw7', + 'bc1qhu98nf6ddz6ja73rn72encdr8ezsyhexwpdzap0vcs7lg2wpmrnq5ygfsl', + 'bc1qg6asmzjr7nr5f5upg3xqyrdxl2tq8ef58hha7t0s82mzzx6zjxesyccp4h', + 'bc1qxe3md4lehg8gmrlx3e8xqju5mytt266l4hcy8khl6tm5mahghmeqtxlgqq', + 'bc1qy48h0kuv0r3e330wjfs6r74sk49pkzumnm907t5mhqjxml22r3ss2ucuxc', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bevm.js b/projects/helper/bitcoin-book/bevm.js new file mode 100644 index 0000000000..35666effef --- /dev/null +++ b/projects/helper/bitcoin-book/bevm.js @@ -0,0 +1,4 @@ +module.exports = [ + "bc1p43kqxnf7yxcz5gacmqu98cr2r5gndtauzrwpypdzmsgp7n3lssgs5wruvy", + "bc1p2s98z85m7dwc7agceh58j54le0nedmqwxvuuj4ex4mwpsv52pjxqkczev9", +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/biconomy-cex.js b/projects/helper/bitcoin-book/biconomy-cex.js new file mode 100644 index 0000000000..ac3d3c548c --- /dev/null +++ b/projects/helper/bitcoin-book/biconomy-cex.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1qx70fn2550vhjetc748wmg4lzv5gy7t56ns92v8" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bigone.js b/projects/helper/bitcoin-book/bigone.js new file mode 100644 index 0000000000..1c05303a86 --- /dev/null +++ b/projects/helper/bitcoin-book/bigone.js @@ -0,0 +1,4 @@ +module.exports = [ + 'bc1qu02z43yduyjx6saeea4l54qqulvz568qnzgaes', + '1L5D4Eq2RkEKuN717Gc817MH1Sxs5WwMQh' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/binance-btc.js b/projects/helper/bitcoin-book/binance-btc.js new file mode 100644 index 0000000000..ee46fb4aa6 --- /dev/null +++ b/projects/helper/bitcoin-book/binance-btc.js @@ -0,0 +1,3 @@ +module.exports = [ + '3LYJfcfHPXYJreMsASk2jkn69LWEYKzexb' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/binance.js b/projects/helper/bitcoin-book/binance.js new file mode 100644 index 0000000000..d5ea8de294 --- /dev/null +++ b/projects/helper/bitcoin-book/binance.js @@ -0,0 +1,40 @@ +module.exports = [ + '1PJiGp2yDLvUgqeBsuZVCBADArNsk6XEiw', + '1Pzaqw98PeRfyHypfqyEgg5yycJRsENrE7', + '32bhzEniykYRFADVaRM5PYswsjC23cxtes', + '34GUzCVLbdkMQ2UdVTaA4nxPwoovVS7y2J', + '34HpHYiyQwg69gFmCq2BGHjF1DZnZnBeBP', + '34xp4vRoCGJym3xR7yCVPFHoCNxv4Twseo', + '36zSLdRv1jyewjaC12fqK5fptn7PqewunL', + '38DN2uFMZPiHLHJigfv4kWC9JWJrNnhLcn', + '38Xnrq8MZiKmYmwobbYdZQ5nnCbX1qvQfE', + '395vnFScKQ1ay695C6v7gf89UzoFpx3WuJ', + '39884E3j6KZj82FK4vcCrkUvWYL5MQaS3v', + '3AQ8bAh88TQU7JV1H3ovXrwsuV6s3zYZuN', + '3AeUiDpPPUrUBS377584sFCpx8KLfpX9Ry', + '3CySuFKbBS29M7rE5iJakZRNqb3msMeFoN', + '3E97AjYaCq9QYnfFMtBCYiCEsN956Rvpj2', + '3FHNBLobJnbCTFTVakh5TXmEneyf5PT61B', + '3HdGoUTbcztBnS7UzY4vSPYhwr424CiWAA', + '3JFJPpH8Chwo7CDbyYQ4XcfgcjEP1FGRMJ', + '3JJmF63ifcamPLiAmLgG96RA599yNtY3EQ', + '3JqPhvKkAPcFB3oLELBT7z2tQdjpnxuDi9', + '3Jy7A2rThtU9xm4o8gR3a9pvQuxXnRNuNF', + '3LQUu4v9z6KNch71j7kbj8GPeAGUo1FW6a', + '3LcgLHzTvjLKBixBvkKGiadtiw2GBSKKqH', + '3LtrsjtyLsHoG8WQMe2RFw3de4pLTQZNcY', + '3M219KR5vEneNb47ewrPfWyb5jQ2DjxRP6', + '3Me9QACjioepv2L2oKTC9QQ87NH6vFe1Zj', + '3NPL82eaehTFh4r3StpHqVQBTnZJFaGsyy', + '3NXCvmLGz9SxYi6TnjbBQfQMcwiZ1iQETa', + '3NjHh71XgjikBoTNYdWgXiNeZcLaKNThgb', + '3Qxak1CZhLyZ7GVckKphLURdLBCjMfz9bA', + 'bc1qdtmav38lca8yu3rrcknnqx5242cckgxqws7m72', + 'bc1q32lyrhp9zpww22phqjwwmelta0c8a5q990ghs6', + 'bc1q78ufzeu8w8fwvxuphrdlg446xhyptf28fkatu5', + 'bc1q7t9fxfaakmtk8pj7tdxjvwsng6y9x76czuaf5h', + 'bc1qm34lsc65zpw79lxes69zkqmk6ee3ewf0j77s3h', + // added on the 27/08/2024 + '3PXBET2GrTwCamkeDzKCx8DeGDyrbuGKoc', + '3QK5vQ9hucSg8ZC8Vizq83qEWeHFLAWMud', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bing-cex.js b/projects/helper/bitcoin-book/bing-cex.js new file mode 100644 index 0000000000..853a2aafcb --- /dev/null +++ b/projects/helper/bitcoin-book/bing-cex.js @@ -0,0 +1,4 @@ +module.exports = [ + 'bc1qr8e6kmev99jxnk7hpyhex434t59ke5tpvmnyd3', + 'bc1qzzn5tszxn3ha87xfke540k8pr4favsk9cusakq' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bitfinex.js b/projects/helper/bitcoin-book/bitfinex.js new file mode 100644 index 0000000000..34cc9d09cb --- /dev/null +++ b/projects/helper/bitcoin-book/bitfinex.js @@ -0,0 +1,5 @@ +module.exports = [ + '1Kr6QSydW9bFQG1mXiPNNu6WpJGmUa9i1g', // BTC hot wallet + '3JZq4atUahhuA9rLhXLMhhTo133J9rF97j', // BTC cold wallet + 'bc1qgdjqv0av3q56jvd82tkdjpy7gdp9ut8tlqmgrpmv24sq90ecnvqqjwvw97', // BTC cold wallet +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bitget.js b/projects/helper/bitcoin-book/bitget.js new file mode 100644 index 0000000000..2a34841573 --- /dev/null +++ b/projects/helper/bitcoin-book/bitget.js @@ -0,0 +1,18 @@ +module.exports = [ + '1FWQiwK27EnGXb6BiBMRLJvunJQZZPMcGd', + '1GDn5X4R5vjdSvFPrq1MJubXFkMHVcFJZv', + '3GbdoiTnQrJYatcr2nhq7MYASSCWEKmN6L', + '3HcSp9sR23w6MxeRrLqqyDzLqThtSMaypQ', + '3MdofQ2ouxom9MzC9kKazGUShoL5R3cVLG', + '3Jxc4zsvEruEVAFpvwj818TfZXq5y2DLyF', //add on 12/01/2024 + '3KUwtHc5UhWQ76z6WrZRQHHVTZMuUWiZcU', // add on 27/05/2024 + '3H6JnFoz5jcoATKQ83BuQ3cUUCHswqfgtG', // add on 27/05/2024 + '3AZHcgLnJL5C5xKo33mspyHpQX7x4H5bBw', // add on 27/05/2024 + '3DSST4myyyRbiGzgCBE1RVHY7GRjDCh4n9', // add on 27/05/2024 + '3Nu84pbqfcfaFztQ74qc9ni2PH5HGM1bzS', // add on 27/05/2024 + '34hatYbZ27CLLoZWhuJHzBgoTCwXEv8GwT', // add on 27/05/2024 + '3Gm1h16ov9cH4o4mChapGUai61K1bAXL3c', + '1PX5L73e5325fdrSwDHNTuq8RMM9JKR34q', + '1PPyiSbdQeo83ezje6Yv8L3UWpDcx4NtSB', + '1NZc5p5YQ21tGjVrurzczq56SVq2tiH6dt' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bitkub-cex.js b/projects/helper/bitcoin-book/bitkub-cex.js new file mode 100644 index 0000000000..860ee4efe5 --- /dev/null +++ b/projects/helper/bitcoin-book/bitkub-cex.js @@ -0,0 +1,37 @@ +module.exports = [ + "15ZAumgvBkRBpBkvuB699FszE8KW7sUqof", + "3JgjA1xMGhjfwuS2RK7zomuesTbCt4bLyE", + "3Q4Yt1QPe3hfyHok78PCowKd5rJG1hUvjH", + "36u1EMxV4NGMwEoS6WLSHHqww7kM2AGfVR", + "bc1qnh70mytjrnykrlufhz4tsgc3dfphrgsefwm0zx", + "1VHhZ3vZ2rhrT8a5QCt5Sd23Y5APBk9QU", + "bc1qlsg4ph439lemctx2vx6ydpc5sx8d2trv8ry25u", + "1iqw8qwMDcwkkw7AiEXqsxwQQ4qgmRpoP", + "bc1qxj30n45488xf7jc8lrx0val5d36ty7dql495j8", + "12ken5PwHeA6YnD3272S1beaSdGN46cEBh", + "bc1q85sqvgccu9d26mfw8j50y6evmyund0d7sg7rc89csyu3uh0c7f6s5g30nw", + "3AavzRkkbhtQjFJ3CLwA3FPoazxsFZM5go", + "bc1que2ellarxvz4f9pa88f6etejvj9mtsmlse22k8nzygnht6h4tlvqtpk9lf", + "33PkD3DjT6YYao2NbAS7bqFRy6nCTdGXBf", + "18DDXRwzkWvjg87P4fk9CB5k3AC25kxBsU", + "bc1qx8mpvyhk098tnvxe67nj6tc5tf89vurxe6zluf", + "bc1q6tzshzl2f70xmrppxt565prggw897l2nx83ddpts8uqr0m3f2u4q0md0ul", + "32tgDscLHVDZ8xXjnC3QF85qYqat7SXRVN", + "bc1qmclnshk905yfhdfdnzvvzvcpdtxp88dk0mh4vw406dvcq8wjf99qazjm7n", + "bc1q5czmcet3mmkrqy3kmjl90w7dsh284gz9w2pyuzk4lhdzgf0y668sdwcyes", + "bc1q0yqgck69v4d0qf6zzrz49s8ndg9svwdjxua90afe93hkfaud3y4sqeae3c", + "bc1ql55wwe27lgus6yhjkjnuc3dapyzd0vl9349qew3kv4ngl3ne2gvq04td8x", + "3KVbHg9kPNnxrpTJ1CZkfqFsKQM5MWTTyM", + "bc1qc4q0xpeyc6fn77y4nk9hvgg5ulu8akgrswkdpa677vttl4mrrj6sv7qznw", + "bc1q8k3gnwzmplcdhhph2lxg94d8f3ny9fzdwu9ng8qfzplz4q06pg3sysqd3s", + "bc1qgyuw6rmhx6zykg3hnexgzuvkjy0lkwqjmx8m3vwrwql6v7qarpaqsxefkt", + "bc1q3923w0z09hw0kj5nnreu53ckx8jwm09kjd7uz2uqrggrhne54l0su7tml6", + "bc1ql2p9u59z2latfrf50uf33s2zh4xyp088pe4phf5p2ha0mtanxkrsl0xtae", + "bc1qzvuccq7d7z48y5990ecvxwnkwfwvdwxwjx7lg2", + "bc1q809j4zgpppx906gyk5mx7n499u7dsx3q7hmaydx4ze8pjxed0jyq32ehqj", + "bc1q8j67stj9mfse4rxmmjcy2tg44qkayqjkwwyx2yk05va5eradtftqqj4pex", + "bc1q275ytzvet94dc8szxh3pqhrnmcyn9mdsyhx93me3mxfpapwjqu4q9tl9fn", + "bc1qgdy96rwdv4x8t0plptv7756x4hlxgmra6g9nl38k2yk4k6dd766q9kc9lf", + "bc1qjpt89yyna4w9pu0l2zyv7zl0fzv7ghx6u7u2mchmg6wtyq8vdsmqdjdlu2", + "bc1q3uemzcassz2jxswh37wd0jw2l38v7yuq60cj46ftgmkpcs38xh0svv4gq9" +]; diff --git a/projects/helper/bitcoin-book/bitlayer-bridge.js b/projects/helper/bitcoin-book/bitlayer-bridge.js new file mode 100644 index 0000000000..0cafb07909 --- /dev/null +++ b/projects/helper/bitcoin-book/bitlayer-bridge.js @@ -0,0 +1,12 @@ +module.exports = [ + "132Cka5Vdw9FcFX3eb28xikKAMvhuMJGwi", + "bc1p87c2auxxj372evzhd5f5huddtrladtkn3z4p94ew32qvwcsgujestjj45r", + "bc1puqn6dw6etk6yg8zruvf2s94cmhxkfncsaumwhtfhu5qy3e6m94sq37eq66", + "bc1pvnh3zy48ml3nhzhqrtc7endhj9rrtrv5puy2775p3jwka8y99aqsz78uu2", + "bc1pxpp82hc4t4flkyqtjdnzr3q72qh9st78gfge50vzlrjtp9c6yn4s5zq5vk", + "bc1p7agkadaau66jtva9n8k5pg3lsctuyqur8a2l5y9hzwqkh5nlmd0skuhws3", + "bc1q6are922g2ltnmdll0mesrmdzn5w2xguu7czred", + "bc1qcpw6j7j72peplt0j34cd8uu5a886t6kkm57zgn", + "bc1qx4xrfsu4ddzu5uglepdef6t4yrtsn9cwqx3csp", + "1BKFipgZT2EwiPxKXhiYib82C5tXkTS9GU", +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bitmake.js b/projects/helper/bitcoin-book/bitmake.js new file mode 100644 index 0000000000..9e7ad5a81f --- /dev/null +++ b/projects/helper/bitcoin-book/bitmake.js @@ -0,0 +1,4 @@ +module.exports = [ + // wallet provide by a bitmake team + "3F12ncAyx4VkfpvnS7ZxdpggFx4p9RKfVe" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bitmark.js b/projects/helper/bitcoin-book/bitmark.js new file mode 100644 index 0000000000..fe27815ffb --- /dev/null +++ b/projects/helper/bitcoin-book/bitmark.js @@ -0,0 +1,3 @@ +module.exports = [ + "37RJkdkzPXCMYSTq74berJYj9FmNn7wFP5" +] \ No newline at end of file diff --git a/projects/bitmex/bitcoin.json b/projects/helper/bitcoin-book/bitmex.js similarity index 99% rename from projects/bitmex/bitcoin.json rename to projects/helper/bitcoin-book/bitmex.js index 08beb08319..373032a01e 100644 --- a/projects/bitmex/bitcoin.json +++ b/projects/helper/bitcoin-book/bitmex.js @@ -1,4 +1,4 @@ -[ +module.exports = [ "3BMEXqGpG4FxBA1KWhRFufXfSTRgzfDBhJ", "3BMEXxSMT2b2kvsnC4Q35d2kKJZ4u9bSLh", "3BMEXfK7c3STqJjYmy2VQTGtzD3QAXNz3T", diff --git a/projects/helper/bitcoin-book/bitstable-finance.js b/projects/helper/bitcoin-book/bitstable-finance.js new file mode 100644 index 0000000000..4f62f4b7d6 --- /dev/null +++ b/projects/helper/bitcoin-book/bitstable-finance.js @@ -0,0 +1,5 @@ +module.exports = [ + "bc1p36wvtxursam9cq8zmc9ppvsqf9ulefm7grvlfc4tzc5j83rcggsqh6nxw5", // Native(BTC) + "bc1p0uw83vg0h32v7kypyvjn9nextku2h7axjdeefy2ewstevnqffaksjzhrdf", // BRC20 deposit + "bc1pvngqf24g3hhr5s4ptv472prz576uye8qmagy880ydq5gzpd30pdqtua3rd" // BRC20 farm +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bitunix-cex.js b/projects/helper/bitcoin-book/bitunix-cex.js new file mode 100644 index 0000000000..f0daa7428e --- /dev/null +++ b/projects/helper/bitcoin-book/bitunix-cex.js @@ -0,0 +1,5 @@ +module.exports = [ + "bc1qxh9ruwejxz7ztzxejafd74tyxg4sgfeqxun42f", + "bc1qhjfnumgcsqsx6grxa7mfl7rr5g3u8xl4gtt7tr", + "bc1qkvrddql6hh00apslzsxnysl75hhnm5fpqdah37" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bitvenus.js b/projects/helper/bitcoin-book/bitvenus.js new file mode 100644 index 0000000000..60563624c6 --- /dev/null +++ b/projects/helper/bitcoin-book/bitvenus.js @@ -0,0 +1,7 @@ +module.exports = [ + // '3FdoFGYYcD1EU7ekrt2x2u2mFrjmxouMJG', + // '358pjjkYRG8exw2BKZnn7Q9s6SCb7wZEWN', + // '3C1ykoWkHBMZwmY8PUUMVxtJJSBkZBCtN8', + 'bc1qrm2a7u9xyeffvulm6e589qvesmt0v0rjxqfkhv', + 'bc1qvht34dma2uy23l9j862nnqr38a42kjr66e6lec' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/blofin-cex.js b/projects/helper/bitcoin-book/blofin-cex.js new file mode 100644 index 0000000000..a81fceca59 --- /dev/null +++ b/projects/helper/bitcoin-book/blofin-cex.js @@ -0,0 +1,5 @@ +module.exports = [ + "1PM8huQVFSirUT7eAwNm3rBBYTsDRzCaf3", + "1Jw4meLNYAaDcNxJwQdMTRVw74hGPcuV8W", + "bc1q6377fdmkvkhgzpw8drgu76jxulsl5wmmgwtrxu" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/boringdao.js b/projects/helper/bitcoin-book/boringdao.js new file mode 100644 index 0000000000..0cd7f4217c --- /dev/null +++ b/projects/helper/bitcoin-book/boringdao.js @@ -0,0 +1,3 @@ +module.exports = [ + '33ZibwpiZe4bM5pwpAdQNqqs2RthLkpJer' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bsquaredBRC20.js b/projects/helper/bitcoin-book/bsquaredBRC20.js new file mode 100644 index 0000000000..1398765ff1 --- /dev/null +++ b/projects/helper/bitcoin-book/bsquaredBRC20.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1q97ctqygjgj0ljxgge4q735ujxvlad8smass7f0axc6x3ggffr8xqwn69hc" // Bitcoin Multisig Addresses +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bsquaredBTC.js b/projects/helper/bitcoin-book/bsquaredBTC.js new file mode 100644 index 0000000000..6d334b2b18 --- /dev/null +++ b/projects/helper/bitcoin-book/bsquaredBTC.js @@ -0,0 +1,20 @@ +module.exports = [ + "bc1q4fsk5pgnmnu7ngp79xclsw2t0yk46sjqw22ffz", // pre deposited wallets //Bitcoin Multisig Addresses + "bc1qva5m5e7da2zm590z03tdnj42u9q2uye3hgrehwrzgg8j4kxq9seq9rvw0m", // Bitcoin Multisig Addresses + "bc1qjv2lfrv672rqagycs5zdsggmury0cz2vufek46jj86ddqynyp2qsxm3qfs", // Bitcoin Multisig Addresses + + // Bitcoin Custodian Addresses + "131fpYjELat58RVzPp2A9Bo8oNuKiP4vxg", + "bc1qr4cpjazz6hhjh44yrshqw4xs4e3eld60wnsq2m", + "14UwPgMLZY6rLZRDxxvmNWQ9rMkg2iraHG", + "bc1quetqhxs809mwgms0rhae4cw98chzqe0er8fryr", + "34ThPcBtz5ayRybbg1MXnQWBGtUzqUDCMa", + "bc1q082azm83lgpln7puvn4egc9dumlaqfqkqmsght", + "bc1qxxgxywxcq0q405849fyrlxa2zu4nxukf4ytg57", + "3LcCJLivWmaomMyhnyt4pqg8iWi2ECU92T", + "bc1qe4xx7eg5c4qjq8838zv05f7uzfmyyyftdpy48t", + "3GPVsXtvbfFNRYbLwJowaL7EXo8hqakfkv", + "bc1q8axfvwqa0fqds5w6vva9g5kej9e4mp4ap3dmff", + "bc1q6crqwsg59s2j4v5gvd94775pjj8l0fmflmv9jd", + "19M7Z1E8Bs4pkXmHJrrJtngmVMUmgFu4K2" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/btse.js b/projects/helper/bitcoin-book/btse.js new file mode 100644 index 0000000000..f827da29cc --- /dev/null +++ b/projects/helper/bitcoin-book/btse.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1qaxyju6n2x2tednv8e7hgnhnz44vrfcmuhjxpfk" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/bybit.js b/projects/helper/bitcoin-book/bybit.js new file mode 100644 index 0000000000..cecc36f59f --- /dev/null +++ b/projects/helper/bitcoin-book/bybit.js @@ -0,0 +1,10 @@ +module.exports = [ + "bc1q2qqqt87kh33s0er58akh7v9cwjgd83z5smh9rp", + "bc1q9w4g79ndel72lygvwtqzem67z6uqv4yncvqjz3yn8my9swnwflxsutg4cx", + "bc1qjysjfd9t9aspttpjqzv68k0ydpe7pvyd5vlyn37868473lell5tqkz456m", + "1GrwDkr33gT6LuumniYjKEGjTLhsL5kmqC", + "bc1qs5vdqkusz4v7qac8ynx0vt9jrekwuupx2fl5udp9jql3sr03z3gsr2mf0f", + // added on the 15th of july 2024. + "bc1qa2eu6p5rl9255e3xz7fcgm6snn4wl5kdfh7zpt05qp5fad9dmsys0qjg0e", + "16jVbMCcqq1deKrMB3esL2HPso7kvqUsec" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/cake-defi.js b/projects/helper/bitcoin-book/cake-defi.js new file mode 100644 index 0000000000..624456f392 --- /dev/null +++ b/projects/helper/bitcoin-book/cake-defi.js @@ -0,0 +1,3 @@ +module.exports = [ + "3GcSHxkKY8ADMWRam51T1WYxYSb2vH62VL" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/chakra.js b/projects/helper/bitcoin-book/chakra.js new file mode 100644 index 0000000000..cb266e59e8 --- /dev/null +++ b/projects/helper/bitcoin-book/chakra.js @@ -0,0 +1,2227 @@ +module.exports = [ + 'bc1pxl0qkdw4a3k9pmuj4nmq4ukx0vjl08trglj8t7cu47yel5zq2sdsyg2wmx', + 'bc1pnftjkef9uzqzzxh67370jd9hwyceq29z77flla46nuxml3ca9k2qt8mdk2', + 'bc1pp9jsp9gd42z0209jenkp60lh5ejgfxgjwxp3tfexcfqu5pcfzw8qsen4x2', + 'bc1pj8mqr8rkufs4lahnplfqsvpwly8d0uy7cfamx8e69xwwnklk2jqqcaradk', + 'bc1przagcuq9w7g82ct60vfkgkugn7pfc99m8254ejl84pajhvd6q0qsn20mcv', + 'bc1p4zq63urdn0kwazluez8ahur6pfrgyztwn2vpjyy8350j8fc9zj7qssxqz3', + 'bc1pj2ft77hjanus5sp5upv20hdv35yajnh8txzct7n2ydg3pd3a6rdqpcn4ug', + 'bc1pp7rtha88ja0fmy200vzml26gztjm96sy0cu8fr5ncquy7g8dv4zqpkl2w9', + 'bc1p7pg8yvkc2qz8d05734lhcm629khel40p3l0x44tuuj0dwgcazzqq30pegg', + 'bc1p7tvenf74kyrnwfn5rhrgky5f8m5dk2hs78m47yxejtn7xjslk80ssxxar3', + 'bc1pqa00um7l0vxe6a082vx6vqtv2zj7e5pmagtr9z7aumgpyha0yces56vyq6', + 'bc1p8ql5x9s4jfcysqrfdy4dz37v27n33rzk84hs2qyvsr4wc0qhg9qshmu6ds', + 'bc1pvyupae6aahseapcpwzudx9ztmcve8ajqeveumvzypjssemzuvczsespanu', + 'bc1pd5w73c9w2cfaktxfytd5lysnk5dasrp6snndrkgzkwah03mmy8ussg5w4f', + 'bc1pa5tnchz4hud3nez59u074l955syk09r6s2s7u6udl9hlc0tydjjqp8gvdf', + 'bc1p9lhx0a6ush7c8f3zvneyvu9cs4a5uhpeah9tu7tpn8qd0r040zsq8dq5x2', + 'bc1psa5w6puzv9tvqssqelu028khjwzqgtmd5hnjxdxssrce2ktjzs4qu3jcpv', + 'bc1pnyzmddgj8u7v9uxhjc0hd0nn2086s34aeq6m8tanljlh6saxcvfqtxmr3k', + 'bc1p6yc3sezasphs2ttp0eafypvj8ltq09lpjq508k2jwlxl244zdavq6l0k3x', + 'bc1pv8kpr3y93j4j9nvl6te2qvlqfce8zaw242tx4crzz45cq6m279jsdwhess', + 'bc1ptp4rkf58rcv0984qt8vlprkf9hfda7x6gde5gwgm3nmpejl6c4dsg9jkgx', + 'bc1pqhrhrl76qfyamanpptk76wd068wm2dakw843cvy4zll6wd9q9t5qremauq', + 'bc1pgfvr4mdcs6p2packv4demptah7ljjkgew2q0mykknhrdgn3s8lyq4vu3vv', + 'bc1pevu8e9dw86tcst69j3y0nmxfjk4ravjln2xf8yca9q99w4z9jgqsxux8ju', + 'bc1pqm4nnug236ux3057qjwpw9hapjzg2enhh0dqpujn5hdssthtwdpszj7u3z', + 'bc1pk238q3jm4ghsq4lafyvcy5mze0ufsm5d42haqekp0gak5cflsv9qnx0puc', + 'bc1ptag678du7exrv34pc4d47y98tzegse7n3njmv4k9grpjcxjckd7stn0ka3', + 'bc1pu0h93g6cvsua7ggmccqg2z0nm2ycrjwnuyndp37synyxvncmh0zqlk0sz5', + 'bc1pe8zfmgxtcf7ktv8n6276zr0ysr3w4lm9cauq7eu4vfgyem6mnxesxcuse5', + 'bc1pyuzcl3alwq3dmkvqk7fnzvn6zwu62rjs6vzqe7pzpm88fgpxhg9qmzqeuw', + 'bc1q4nard6ndnh57xev095hqnrfh5lxxycwuewcwcc', + 'bc1qak5ch78tcpfmztcldgr5tlgnd4t59p6cuqjcnf', + 'bc1qn8gnv8y7u92tnqyzdnmtdvzyzszahn7js97jjj', + 'bc1q397395pz4ktvucdq7uj3jv424sx7ygm94kvfr6', + 'bc1pa7hk6q3sp66euxtvdvfe6xjskjsll7mpp3alm920xnr6jhy08dfscc6nrj', + 'bc1p7a4hwvvy44wt0mltkv4fmhuz5lt587ruqeyhvt5wp320304lhmdskkzh9u', + 'bc1pj2h9dgwn6lkgnhh4pckaj7a44mh6rnjcvnfpv76jlqh9hmltt8qq87qrsw', + 'bc1psqjef0lqvp7dvl3nr4dntk7m9yng4mp22yvkgqsl7utr7z4u9cwqffs44e', + 'bc1pnpv6gj9ufmq62jepc9uqey6yfzuzuksegkrt8ftnmh3fk42jdsksm7s0hq', + 'bc1p874e3rk8xs62pzsrpzxy986yf50k82ytcrdnrsvltdprcj3yp9rsz498je', + 'bc1pjthg04x7wvvq56znwkvfdw79vplprczp5dctpsnqx08jmurk7nuqtjx8an', + 'bc1p4pfgf8v540ay4297jwa07mnel85utw6slnjy94ax7h4j8t4zurys9hstqw', + 'bc1p2rd4z0avhftxxrwqgczwyr4jlr2exypdp9cnjup3wamwcm609zssv8znqg', + 'bc1pl3aff7d04ukpeeef2662rjf444ncf4g0u2mnepljddzz2jzw5yxsrjjyvc', + 'bc1pne6mtsu2f83yg9pdttpne095tnf3ekvrlx3wlajwn98tdv8xu79qmxmvpf', + 'bc1pzgwkmkkh0qdw6t67pasp49ydhmxekg385trdt529le32srk8zrdqrejtne', + 'bc1puhrvwrfjryfjq86lcx099d4lcdamml6snyqkqh7hfpn2rzdzc6fqzrkejj', + 'bc1phqgr25tert9u42glk22tgfqflw3vjfp5g54a8cu67japy0re96fsxd4er7', + 'bc1p77e4h9f3scelzut6tnq7lht85lqddcz4g0fu2zgrrr5yk4z4qlsq5f0a6v', + 'bc1pdxt4pr6y5cmzg6yd2e2fw9kwkguea33a9drqevdcz3mhmmjq08ls355all', + 'bc1pl0k0lggxhsnza2rm35enjy57f4tnqdcun7yuluw5p5vchlwdgt0sm3juyt', + 'bc1pmc8yrng60gmpa5uzm5d6hefwkeqgk2yr73mskuq8a6tu985cmt8sapm45p', + 'bc1pv869cl4sm6f0z5cdmfx4ndunzf3x2matgxhm9hmjuv2ntm4cpl2sa3qqvp', + 'bc1pd9e7njc90mdv7jxffq9kjs4mzqhpcl497p4qf48uuw0qc4jx5vgqlql5l0', + 'bc1pwam7788m42tqku5xg6nkntety4fe72turs2h3m8sh7dct3jeqlhq3pf0wf', + 'bc1pwzqwvzsw7260sxxu0pmqwjv2z0dgv6urqv3ya5rgequqlf8ltxusk7jntv', + 'bc1pp4ktfjves5e323pkrd4d50lcrl558u7afdfe6awtmeucvcyrv6dquugft7', + 'bc1p6rp4yszvcd5c2ntkzt6xejr2zv45y0n92j6kfm3u66vdzhg6gu2sq8g3ax', + 'bc1pacacjt6js4n65qwwms0x0u6u8htwdxe3tmwfvpehypzp08js88rsl48zve', + 'bc1p4xuceqfytlqrt2clsm6v2pe6uuvxsy5xu320mhtld8xa3jvj9x2shj8agr', + 'bc1pvur07pveccdu6a5rqh7u0dv2pg2aa8zktlelwslg6krm32a0h7hq28075u', + 'bc1pdstx9stfytpu52cj4el3ex6hl22n8yrlc803kxcs5ztrqf479wzqaqzzx2', + 'bc1p75xmu0gc3j0wxx8ve2r6004q9m5jskmu8tszdh28d2v0n8ldewzqhjrtnr', + 'bc1p63dm73sfg8qx7eadmqpj92pjfgg8fpfz6vjnr34sd8lrhqtwx8es68nrrz', + 'bc1pt46ngxcvhx96pr2pr2efxdjrez92jzgfqyml7sj69d6cl87q709slmkj3g', + 'bc1py48jd2xlxz2xk9a0tga4f03velnd6xffg5tnkldlkku4ud356r3q0fpjk8', + 'bc1pny0uj4f2hn2hgfz86jhvzj0nr98sz5senrcfgf4g3mugy3r3zl5sywhkgy', + 'bc1pgemhw9xx493wl9h2eqwgvr732ewe9dk9zfq3exzkaua0hj33a5rsu928nx', + 'bc1px5s3v0rpsuh2msuj6eft24jhkqkyxj0jpzw4vs52ude46nf6q7qsrkxavv', + 'bc1pfchlhr0rl5ruhtjst99ft9vdsjhuegz3j3hvqk3e3lnmwwzk32eq6tj2mw', + 'bc1pu9h2vwp4a5jta9r760msfta73mrep7d8gc75xwawjxx8nhvmluuqywg58k', + 'bc1p64w0hxsppgpmewk80fy5c7p9f652v3plxjf8kpkan5nl0tykeyzqerqjkk', + 'bc1ps0enq83ssc5xflgddh7w7usyapn80r9r62c8zhezx5gcwkd95g6sq5zff3', + 'bc1pz7f9mfhym4qts7uj8yucpcwu34xz44v5khemanl89g3c0r3sa6jqkvczrx', + 'bc1pnfn5x283red2kfthg42682wrmsm8lcgznfszhz52hmele906ejsqu2m6cx', + 'bc1p2duk8yuuxy70kclyupm968mll5ep5drmfa0umtmz3aymq5gu6avqgt9rcm', + 'bc1pqfhjgytf39urds4z5ptp2a5upmtlz0lux05wq480rvcvx9k94kts9qmedv', + 'bc1pl6zy43j8me89c9jqygsahu4sq89yge9ve2kz0asumwnkmk4373ws0h3tt7', + 'bc1pvaazyyuwk04fq6skxnkyh3crxfeepzzctuznzmtzyjp6x3klq6lsfa8ma4', + 'bc1p3g8n3aj52225dym3jmypg8u4cf3x3s49c5rzjvj6ygtl82v42qaq76qqa6', + 'bc1pgs95cjhpq5uedepr6ghvhx9upwdmrq3c67xt2drhkv2etjjlqnsqvxsu69', + 'bc1p8r84f5a6vvtl0gedshjzp4rv5mx88ra3etqch9du65fmqwglu0zst80e44', + 'bc1p348nh5crmn6zj66a9k4cjmrlrkszj4vaq33sgr6jzhtpyh2qcezspgep7h', + 'bc1pdhc4g25eysun4st2rhhfsusnk4ekhxp85xr2x4uq859tyxnap94sua2k4h', + 'bc1phzxznmd5yqp7x07kkes6q7sjcalnyd9pjddrfhywwv23ca7994jquww9fx', + 'bc1p7ekf7lt6f3alzzh8gkyjrv0xthp8r9gz28qa4wpam4lv432wn8nquwpuan', + 'bc1p7laa0uystmcyaekgmfy2767ndj6s4y86szdm6m8fta7nv4plywmsx5ln58', + 'bc1pa0xe6ahttju3kfr63fq4vmg67xy9sdw2enwsvmmjk8aem70mc5esh7k8et', + 'bc1pv98t2u3tx493ly278hdrkh4spdxe6a8hk9ev94ku5kf062eh7rwswdqm5g', + 'bc1pyzw7rk30ttw3yc36azwmmyfekyw8vpx7cj09has5xy76sv8gzleqdatxdg', + 'bc1pyjcncf6jsz5xcqmw6jhdvay025gygle6r6arhpu7dkpqufh9c9wqyvprju', + 'bc1pu5wre7gar0d8tgslaeu5epj62yvx667wuaun2n589nx55xzf42csg34qsq', + 'bc1plpjxvkkhj9qfuqnrjtnyvwxfm9j4rdq4jtwhu34anm8etzkyfc2s94vzw3', + 'bc1p0tnltsu0qz29xluwntvvcr29aw230tdhqygwg5mru8qqhdvw580sqlznpx', + 'bc1pdcgcjztkqgnrhnm9xqdv87qtqhtr7vxdvpmpux8xzefeypqw39vs9a5z9j', + 'bc1pkkn0trywnslz5datc3lz087rgzd8z9644svwykpl2983lzkw9xyqspd2d5', + 'bc1pl30rp47rlxrfrtlplzz94kt7g2cr9lhjcygwfjp3tqqt0td7arwq5e25wg', + 'bc1pp05cfg3xdueaqvrl3kdcw3p83e7jy8tm8l0taxzhssmrv9tjlhqq5qkjm8', + 'bc1p3puq5p5yuz0jpy6equy7rwd2t28wzau8s5s7cwqm9n4w4nhd0tqqn6jjtj', + 'bc1p57j2tjs0ypujgjkdufur6xecmcvdte8k8tn9y6sxu0retxrn7hqqj6ncdf', + 'bc1pqhewzz5mgu4c90lkekp40ncnxtn9eleuvyk92u4l7djq69nwqyuqluwzcj', + 'bc1prx9e9mcwgp4zy9vwcp8dypgmgmese5rjhjeg9y5kxty3ez3lmk8s409uc3', + 'bc1ps0266nkjsz8wu97c927hntcmavzt6xfjve4uzehql9vh7un6cr4q6r06jh', + 'bc1p5337zpuhtpeccnq2ky7lgwzz4m8uwrvs785l4afflj2722x0e5hq5sjdn5', + 'bc1pjnv5znssndchjz3qst7ln0lvsqpyw3eml5pczavd465de9uktzgsvvftwr', + 'bc1pmq3y9hctw5w0j4382kh92j5yckjpuy66vy2u8q8vq425rk03x6qqpzdvh4', + 'bc1prx5de0k5hzgn85yq9mumv9pxnygey55v5fj3qd0234av38d0ek3sjk5k4m', + 'bc1pz63qe35d25ve7nztqdfy4x764zv9dfa33qqym3050p6yh6mk7xfsyk036w', + 'bc1pt4e9zqn3ulhztv5zv2xdsuen64mgn0krry27m7l5t6jsqaj33puq76yswh', + 'bc1pmf6sk2vlrjxrk0mm45q8dg78600czek4g38py9mt53gqt7dduvaqaacks5', + 'bc1pfh7yx8ks4e40rzsg6c5qdkax56ar9mpc7jflxkj8qgkgf6qnqtys32qylh', + 'bc1pzjsy40ch0yrh88ugdxnxd3za79qjkl077vdp4tazpjalsulzqy0qfx4t9n', + 'bc1pmqe4pz8em9djs55rtwupm63ksphlea7fpresr7vhwdgfwq9dln9spl07c7', + 'bc1pq6wxqycalncq6uskj47s5azx7sjl9q5gegfzyyunhu6qn66gppwslu3jwk', + 'bc1p4mv3p55y55jsqtx68dg7swu676mg4vk0zxatvddekyqjdf99lh6qw746z4', + 'bc1psuv33g5ae2alnyxngp36ucaf99q858d8kqwjl2zx2gz2dfh4gtaqz4r0an', + 'bc1pmavfsx7wthpr534paphewspktgkzjvg8986atg5lwsj0h5yjvw8qvlmckh', + 'bc1p5y9m4fhrwh2aruaf92vqamp296p376n7zd50hfll0glmf58detdsh47n7n', + 'bc1pudw3zmahe2qk43gquwja24dw5jj08sem2pjqtwqwddzrfhkw2djqhrjfkp', + 'bc1pdps6wc5aesqp496lpum78tvk03v7a0sx6jutj3raev7hc2gd4rtqyl8mr8', + 'bc1pa38cglkzzskdch4ax6z6vl5da90ca0lv5zt6lfqasljec60hh7mqvade8n', + 'bc1ps9xkycj4yv0fmsnql02zhf45ymkfays3p795ljpydp50qrwdl83s930nzq', + 'bc1psgt2v7r78zcuyhnr4n5p77zrnvf8eej3knkqg5dm62nzx4rxwftqyajluu', + 'bc1pxyhz7uky9jc62uahcyw932hx4cayk7vmy40axhctypqhee7xqtssx2tn0s', + 'bc1pqx2yk4kjp4vavadptf0vuk0qy9l6xejwkhsjcgmp4d6jpz9xq48s8murmc', + 'bc1p4jjzjylj5j9z0kznpgf8n37grrax9q7hch9zweclm54zjtk3t4jq9lmjty', + 'bc1pj7f85h0905m4k4s9k3u3pnderhh3kqqscmzpxsss4prm2v2x7upquezlk7', + 'bc1ppgqr4p8x9j0falssfppv3t9lc6e3zm464vs3sps7hqqguplxsh8qa2uww8', + 'bc1pne6n0a62cefy82wrwlkg3nasl6p0edtteh2vtpyjs8epe9tfqtjqfy5tdt', + 'bc1pzgc3djs00crekqlpm5nrfefydhkwx9k7n7dd8ldk4y09jcdush9svt3gt3', + 'bc1ph02t9cy6xdqtq3y8eeu33mfqkcdnhd7x72mwmxfwlhg2v4rn6a2qnsprrg', + 'bc1pm6ygunqn5frxs4rfcars6fhyx3ekh2aetucvsdp6sq9ktary2veq63lyrh', + 'bc1p4pzz9755vuty5u0w82d9k398h08dlm97nr67vp4pj0c2vr7kvzcs7lvt6h', + 'bc1p6p9wsa4xgxffem4pecnsv9xqdnkwfglq9nmz23a55dcvjahpylasn4x405', + 'bc1p7uc7yqew82fzlhfrx06pcfntavza7n8kr0mk4dl0y8vc2vjngzfqacu2jn', + 'bc1pkze8ew0fmr55ldwerc0nf8u78h5fryg0c8ft7k9eh8vwtt604f3sd2d9ls', + 'bc1p7csnymmm29h45r25lw28vjq6nvdu9245fyzlm9ls8kdxz65p7n0q5h7lzs', + 'bc1pkfjen0lj4t4tp0ff4x3vsj03yxye98c5zk60ju559rmcned8nw3q4vtqeh', + 'bc1pmdfv4u5m53ad66ewz4jm6dphgvf9x0sdaxqeygdszwht67r6yc2qtyuz94', + 'bc1p8u9nu5tqdwj2agler7yfxyjvwawpg99qq57yxgkl6uzalr4mtems47te9z', + 'bc1pysf2ulajuh668agfglzc7hxl4hgng6suk5u27cgadvvf2hx7ckuq0ka3d7', + 'bc1p50jtsv2jjnsf62sepmksa43pc07feg8v8ez5q62yskdkly3ukqtqvktt8c', + 'bc1prd5ltcsu4rhmwe3wawpeudtzpt5f7xcnp8yla3fxt5g2l5sz7f7sr8p9t5', + 'bc1p3r59km6mg760jgcpzftz3ckve6w8g5qv0nnte3ajw0j6epxhhhhqzqkmym', + 'bc1p5qp8dsa3mg7q2jxudmez6q83ceu86nduwrddfy0slu6ze3dcrq4qfhp0yv', + 'bc1p83ggjdaaj6dc8davgc8kykdj43l6dppa255eskc0k9k7uczaegts3hvtns', + 'bc1pgrt28ph0vky6yhrjqcv74kckfkd753qms26lncdvvlkn4xudzgts9d0kqp', + 'bc1pthefst3f4fqnx6ux6klspat7cz43srganhmcsv6jkmua3gjx0jzsvfye0g', + 'bc1pe5yl3ps0q2k53t8td8fsc2d9f8jy47qa0tsk3fnpfp3ws8r92flsz276we', + 'bc1pxxmf0hm674e8k4ck0ej4thf2v4t2879qdkh28x8ncrgkxgxjhzxss3mdnf', + 'bc1pmnvhxwmghhcl5ucn4y4706eenn4t8sls80wul6r8lpamvz7nmgas7a7yjl', + 'bc1pfxzh6826f7m58fv2cw88eh3h4247rst6wmadrguaqu6cz3ahkelqgtvwc8', + 'bc1pfdcwmlwd6uf0v2xqu9mv6ngn643xvjnvl6x98upc2q62u234mr3qeqm8dq', + 'bc1pqs8u7mggrmu9w674wwm0vutvvj6fn6ptajwes03n7enshfq44s8sd0thfq', + 'bc1pqykt8748q4tkhggyqf0qgj63nupfxf0cu0c39gv7gyfu4sxkz5xqfpxlm0', + 'bc1px76g80nknyqd7jtt5028l02r0wa3dcn6m4za9hqsmjv20l3enqwqjw3wpy', + 'bc1pn9ch7e7rnsdea82jkmtdw7yn65wqarvgd46cvu5kzpxprmkvsq2qkfrtja', + 'bc1p5zq0ds0zz0yjpn39u4klj7na99wqc6v2ks6xe3c29c4r5d47yx8svn6djm', + 'bc1pefv4crs72muveu2zepwtjvh0nt7kz8f8lgatfvmvd0uskcng76zsmjqnyl', + 'bc1p5fu4x8yavvnqnk8a7tladh00f950l4y3xssgh6fj9qmdgh56aulsvee6eu', + 'bc1pfshdwlsaxa8eawtjjwr7wgpy3m0ta3y5m467mhtwkpv0afw3cvhq5alnj9', + 'bc1pkujnjxlyt5amwt0mru4nkhc8zgdf9evlyrqxtuc7qjwhrysqvy6q6khlw5', + 'bc1p73cyqn7ktdgukgap6h0w9dt4su0npquv2er8t6mwswty2040u9nsfa650f', + 'bc1punshkj7yqdmega5uw4tktun0nqnhzalu4g3l598u4gz0xxfuv2vsqr5ua2', + 'bc1pgn6ge3wnp345rmlkyzpakw48gvm66skywrmdhfg36mp5agpjrfksf45crf', + 'bc1pxa8pjexjhkn9hxf7s3n94m5jkdpazl228x62marwnwpc4r984avqfxhaet', + 'bc1ppwleazev9hquk5dy3ald46st8qjcy5v5x9a2gwm26tmdy5jheyvs66j0n5', + 'bc1p2pmrvmqqjzqwfq756cwnkj26244zqqysce3200syku4jasv7zcks6seq03', + 'bc1pw9htynya2wwgnaw04un9aceq8vlk84dnx7ajgpudy4mkl63fvllsyyxej3', + 'bc1p4npude5v5s6ru2dm670j8rt6g0f94vve8ug3nfa7yd2qrdqhqtwsxgkuan', + 'bc1p2du775tr8e9qg8jv983nj4vr86k43vmt4zehlr9dswe52xreulpsyjnyup', + 'bc1pgrdzruuv3ncnx5g66w6sxrztf8lkz3ns9k3kl5cdvpqj9vq0mjkq62ala2', + 'bc1pzzrraenqjjx9xkpjjq7plcek83dr3ys4fhvhx00488dy7snndursf2lwg0', + 'bc1pckplra3ysgdax8uc3ctw7whqj6y9jsn82ssrg538vl49v7zp384qpc8h0j', + 'bc1pn65nupzatpdqz5prfew5u5zkjplrr4dlr9666f5da9whju6027nqpeyy7y', + 'bc1pmenfjywpsp3n83zv2sq4402m4cad27rq3zcawrylv7jpsgxt8f0q52cvak', + 'bc1pl9f5vdkhutd9ksv3aehq84s7c626l33ukmsndlhjlcv7naejczqs3vamlz', + 'bc1p6veqam82ks6t8lnh9rmwh8c6p6qhfc6rnhd0809nq4j6n887payqy3x2da', + 'bc1py37ux5zjt5g8q3h7qx0vs6rw9gxtdj5se3m76szs8wwqf33hxels7hclld', + 'bc1pqh5fzeaghuas5y79z6cg2kg6sqj25ty8az93m65a8pmtcskmlcss47zfun', + 'bc1pxgw4nmrqarqg6cfk87zzxdvrcq3g35en8dve8sdsjtcpkpsar0rs2yf0qg', + 'bc1p8fudewhlw54rzhgw27nltk8y3xl2kq3m7xxjtp2js4xy6dv7p3vsmhzdaw', + 'bc1pxn9whp33rs4x46yv8rux8049ehc6e0ks7ganntjc4n6u4q7k7uasv9avn3', + 'bc1p26f6f3k4dlzarvelzypuvxfvn90le0svry05l878ztf8rukup0yq793tzt', + 'bc1p0nahvgu0e46mtg40eddverknurtjnrufxduzmm2emek8nmksstpqdyelw3', + 'bc1pe05ahukeuq9kg9evg9fvs34kquku4dmetack79k8l8srlm2r9x6sm0caz2', + 'bc1pkpk5fzr9enyc8zyasl3g3y7fyz5asrqg56ycsfpgw0w3x7p954xsdqfs4p', + 'bc1p942zmt4gmc0j6uaemy90zn0cxfr27zs8s8u2ln3ctu7sdcrvplesv0kqpw', + 'bc1pr8e0qy7ms9vu8k3g9ldqsudhmqedsdmd74yxgphgs29gf0nges7q26f5mg', + // cap 3 + 'bc1px73yykg3wfm74umz2f49gu9akk3g32l4776kj6m0k053944qlt9ss60p58', + 'bc1pmr7lkv52g7aq62r8czqjcvs53vz825zk20yzfaw4azruseugeggqxwr98p', + 'bc1p5qht37v7zxnm4hshsykmy7yxf0kqq36w2xhc9mz9fhnm59xgd3mq55fxem', + 'bc1pajxeut9kg9vwza8e4p5l2kywj8txzczxhlwkk9f6n2geg396mszsxyu4x2', + 'bc1p9yjpkzs8ftn98rvx2e4plhhw49hm36au9fvxg79jl6h923c23fzsjqd4xf', + 'bc1pa7fnwuakgr7svtne9j2ju4zd4pph7jnak9f84kvqlwan5spkqpgsve74t0', + 'bc1pssdvma8yfzajxl3uc7xd2hhd58888le05m38qwqnl2err03h79ms86lplc', + 'bc1pg5lt2pe2lkhd8r0pssazs86gjqr4jz23wwtq7c8cymrdz9ldgytqye30xl', + 'bc1prveqyfgrz9ku8lsuu2gezcmu8n4c0kamndyfxuam37wemy0ph0ustwvx7a', + 'bc1p8ly5j2us85f9h0urdms4an4tl3ldyw8wr7sadusn8qumxyuyxwzqk6a3pu', + 'bc1p6cesp3del2f4pxw5tan86twfrxeca52xms6xjz2hzw9drvx608ps2tagpe', + 'bc1p670s3pttdfvthuvw8g78x6ra3ye7yr8cm2fuqk4tlzqxqlqrwh8s8s4kgl', + 'bc1ptvg47kdvkdmx9arltpvduerkedjttg96slkut7nazqd0xpr2muhqy4qs9f', + 'bc1pckn0393my49e5875dgctj50jve6c9cxj7ssqfsr7znwckk5nfwyqfuecvy', + 'bc1p26gn2fsp8cg8nawjzp9u40lw8gk7r09ymdhkd5xyny0yp993aa6qn38256', + 'bc1ppy4xjkf56nzfkzm67gcvu9e3l93fg4kle7ykcfth5urjwmr8ez5q2puhev', + 'bc1pt64j94uwr44j84fedtg6sh0ydyvnsjzysapqc8hk9vku4mvfr4uqh0znyy', + 'bc1pxljm8tmuwq7hsfguj023myhcraqf5eut34z2e0qu5q4l8rhaw5cskzcup2', + 'bc1p60l2uz38ckkh2g04xatgx4zd0xrel8awy20rvvy5a6u469dkutzqtyft56', + 'bc1p7hp9ratwwj724j6lw6tq63dsaexp2pv2wtkhd8v46hvwx7cd63sqdkmuxr', + 'bc1ptjeug9wp9pgm30sjcjxrl44rznu50ra08xzrp7n4mpzak4u0u4dst3rkud', + 'bc1pnecr5rkk86efqv929whw3hnhqpkz3rgeh20y9ekzmg60ppqfmyws0prhua', + 'bc1pewl25pneve9sesad3grzd30d2j7rtxf5utxvcax5fkr67js7z2eq4faan3', + 'bc1ph8740mu7fsgvkuhmm43kwkrl26qwucxs6ptwgp9zzd5585ccv33qanz782', + 'bc1ptdx07yx2p5dnnmuxvkse5rxda9vh3kpv2zjfv4ywn8g3x3sgfepqm3acfj', + 'bc1p4wzzn7nqeafs6u67sern3lysuj9n90wlxrl4fc4w4mn4sz7xrzhstsaps0', + 'bc1p4chh7mhjetqtgkjfl2m8rcrh86rr520cyelprucfl3vlw2ds5wdsqj0zrp', + 'bc1pcv7clklkf5jzl6jv6r8z2ztklnf2nduggev6gumuyt3qasd6s4sqz7guuw', + 'bc1pmj0hev54qug28wluzvwrns0d9h4lj55e4qwyfrxxh3qyfh2fgthsf6n84d', + 'bc1pdz3tf8nnq3w8lxn6jlf9fnl5y7y4wy0y4d5j0jd5wwgsphc94ansqd7pnh', + 'bc1plcy9vqlep89ghsk809s3al3pmgx3gg90fu8g4vln35rpnsywezrqxltt9h', + 'bc1pm8hn8qa0yae9rm82dkp2kjrze39c03tjmyw5stnmc2k02uvu9vlqt9krvs', + 'bc1puty73g57p8rc7e3qzrfsaxpurv6tj8j0sqkaphkvus32ax8qh8qqrvv6zy', + 'bc1p4snlw30exhvtrxfdxmv6plwgzh0rf96660hr6srl6hvh94k5tyrsdy3c36', + 'bc1pkh4dkrz0x6s7f9rwjghmncptltyvw2p5n3dw9sz9txnu7wuyjy0szyeh43', + 'bc1palsgkgrzny8c6qrl5qgucgnzftsxezvl93vf8pv3p4458makayqswwkvlp', + 'bc1psksdj93ppus0ngt3xk8pkuwsg8kd9ej88vahe9ql6gh98hsmn7gsp064sj', + 'bc1pccsl8u3gpzjqg3rxcg75y65tjvzwa9dr0u2l2dt6wjhnw08r8q7qqw6z7q', + 'bc1prytnvamkfr8fsxe9vsux02d74eyhfqexlhchp4mpthntsrjec8uqjszpp0', + 'bc1pfxxulwq7wlr53tmzt0xe24entxvuc6p0wd5fclpynzm43ky4e7xqccduk3', + 'bc1ptw9zyw0zmhxxrnf3usn93tupvmu0qnxft8czfxnfwmtq0nd92fhsv8yewq', + 'bc1p2xn69z9sx2ae6pex85999hhchfw7k0gs4232vfn0ucgcfvtm8kvqdtnk5e', + 'bc1p8mxvay4xz67jyqzf36er86q54mt6g65dacnnuq9zscc2z7f03lpscfhvtr', + 'bc1plg9u96y3wu7h27zfnf2u6knzj272rxaarf8q6mhsgld3t5qdtlhsua6wyg', + 'bc1pca8suwpv0xr650phcmc6f0vuz7m27hrcdchlxxjn5nhmyzanvfpsxjzawn', + 'bc1phzwd2p3l9jtgn7p2n33dxu6h23dxq50fg3rk3ny7m7nhkxdxla3sapeje9', + 'bc1pxnqf50dazkvnjqp5ejf8039cetykcukl4xfhsundgn72eljhfm5qjpmnxv', + 'bc1png995wl5jxa05kq0v2fq3hf87furln0223y7q6g8aqjwrmh4cntqhpfv7g', + 'bc1p72q8nu8y5qan8xh52ykta4tldz30smwk2xngmur8qzqk9wqd55lsmdkgyc', + 'bc1pa4cqq3a0faaqxcprwmc62u270fgjxjwy8x4ly5r35fd4t2yy2t5q0r9uxq', + 'bc1p7lhjnvcxu5wtlxss9kuvjvkj97ej3vd4sc9c85qapgwzmx29n5zq02ue4y', + 'bc1pgvq6u3q37n7rtsuruaedvljs9r3lt73r3ly9ds7manrjgxzv3clqcd9whq', + 'bc1paqeh5pp538v0gprgt2mjd0ahmpusnla58n6j8nzpqqsx2qpjsk6qaeghyx', + 'bc1pchpn9c37vkq48wq9t6kmafq2yxlepxj6czqh0dc6grqtauvm3h2q4q92d6', + 'bc1pn0v9h2m7w22fdxpyvj809dpaj7q8tvzgjakcum768kfayyhuuu5qcw3092', + 'bc1pxgz0gjatzgsj76rl8qeth4qdy57hr79j95jvsa0z389c6xnjg5kq6xeurz', + 'bc1prhn3zw0dqw5cnjnzfrnmqsz8x7wvn7vc6l7uy4q59xcnklqh6h0sm7d0qg', + 'bc1plkvse8j3n42gycg5sa29gm6vp4qttp7fm0uwlpzvh579skl2r2xqqqk9tc', + 'bc1pk54c6jsgnu5kc0ftlyj89f5gvrw8pj5qlgngg4arz8rg58r8pvkqrcyewu', + 'bc1pt5g3c9mlskc7zl5wzmm0jksjkhr6w6k6zxex9tddavjl0jjmuqhsx7amy4', + 'bc1p4nmpnl4hfky803qvlxfdt8e6e548rh52s7tt7tf34kr5cecwj3ns97jcw5', + 'bc1p5ajju86lazv3z2cfpa8xfldcykd47y5crm7auy3fpglt85hnmn3qvlpmnm', + 'bc1pzzdvtlatxaqyrfc244v6vklpwmgqgwg949fk8ye7zq73rjgnsc4qkqv6yz', + 'bc1ptx0dvufjk25hnsyz6y96njjumvyqsy4y4uwaxe6hhres8jq2t8gsq2fg5v', + 'bc1pq6lr6hhqu7ejd2pmctmet2rqjq5gl0kl74eqk3n7umvuqshlc8tq5ck6sg', + 'bc1pa5pqkstnehd62e6z422x8reuhp3sk0xtv4na3tpacqrfky38asdsunmahp', + 'bc1petjzyxhrgpjm4urg0ldrqg2dkn0n74g2gll20ajumuhdxgmnhu9qwjzuue', + 'bc1pedeshmmapux06yu2024kkrwplt20an40cphrve2gxyh9eqd68x6qm0nd95', + 'bc1p7pyjh4lz4xm69cgf0ly93a83hds3jl542xgeye5m6wvg0zgprz8qr2h6mv', + 'bc1pet4lcmmumd7sdp2pvvg9z7gld9glwtv0mnhgqvuelc0wzlahehhslupmff', + 'bc1pnekalfmcfclee4w0h26czt2tk3jhazs7tuwrws6g36twnmg2rppqsl97qv', + 'bc1p5n6zrhj3zk5ncfwafl43dqmrmqwfze2955pnqzr72ps5h6str3zq6xwnts', + 'bc1pqjmedz5lwfwnkk70rspn5c2jps2r4crt9m90yzaydwke56sp6eeq6yk66y', + 'bc1pcjhml2frksl3yvx9qyv37d59pfcejht90hpxkq4p2d6j5ulg24squpxp66', + 'bc1pvmer093r98wxuxu6qu5xxg6wrftlp7fpjvqfw93qhdr5gxe2x88snp69vr', + 'bc1p05jgmz5hrj3a7kh2husedult6dpulfk6ms75743v5npznnh257fqz2lwpl', + 'bc1p05vpee84knuq2kr9a6j7jrftjhqjrl0c4mrgy6szdjtcerrpq76s62lzkc', + 'bc1p4tl57gxjj0w8md54es3e5xy3hullnstyt0fak8v9urcp0fk0zxaqyjqhr9', + 'bc1p5vmf43qfxncmxahmh46zjyau0lzqr5mf3fdx6gh920snhn0ru2zstsn0dk', + 'bc1pnuzga0q3kxr2jdpv2jdjufqwl8y3hgcrucmx85rfaalk6h2lq26s7wwjuc', + 'bc1p6yan8wgxhmmhzf5fqdzk6aycev7d5g4r2tzjsd993gtp5gxhcq8qhfpa0d', + 'bc1p5jak805vytrx3gau3t4hkj7npxv40gyugfw3nrs50wla9weqt76sqq7xdw', + 'bc1p9sqfdrkmgmyraqc99npmz2vv2qwqf63rwm56z622le6346zc63rqd80k9w', + 'bc1pn9zmpv5p9cnaefewuzs0d0rnngmasfuff8qzwqsvz6xx8nagjevsmtvkt9', + 'bc1pxz0q4tp8z4m5dnd4g5pafnym7855qr3qeuaxhxaztp5zp3pmmnts00zqln', + 'bc1ph0fxdlcnvp2nv597w30lexl3vawlv3rarw3c4rkwm4y4z379mgxqfmues2', + 'bc1prec7v3s02sfaxe9kd8s0dlguwd36x8nm8z59pcpm7qak7lf9z7xsw5nl6z', + 'bc1p3p35286qensre04k8dg6n5w2wz9mvjzm4magl2dtz6nnget7ml8s6gc29a', + 'bc1pac6dpcxzx96gppj3cdg605papuw7h5tke97urtaje4zj2lc73awse2llnd', + 'bc1paefgwk58cxfjvneg27nuc6ycw3m88s4nd5f4p9gysjqlyankt6yqlzmtsk', + 'bc1pdveqtq70syzudul95zwqms3gx5v2mhwlejw244gcuatqlawxl25qnnkxll', + 'bc1ppsth59uafqhy6flu59892tsukepymkg32t3ut5g9d4g65q7dru6qugatd4', + 'bc1p2nh43vlzpvef0y4hv6penc4j79ugrxx00l2yjsv5u0nk0n53mdssyk2l5m', + 'bc1p7l8tnrlmem2n6qu5edzlywz9mw7zalc9wn9u57zjc4htv3aujcassls3p9', + 'bc1p4st25l9zft4rw6205gpp073k7xg56pek5ejy6zhjlr8xrwll8adqkqje9n', + 'bc1pd95gg2kk03yx07947daqj5teta8hx4xprq6czguw7jperrgkjkvqny52dx', + 'bc1pmxpt3vtssvzu4y5xecuucnekalhn2tv68sg2ykc87w5ngnje958s3lcx0z', + 'bc1pvf2aw8zw85eug6v5j8jfn038haqt4l3mj5v3rn47q3gparqfvmys00zax6', + 'bc1p932wczq276wqj2rsn2yzqa7c09xa5jkcagpvvqgnrp4qv3c0rpmq9xuvk3', + 'bc1pw5xgeahx6rsjdchqcec30h5zlw0ekwta4zhtx7z6amvksr2altxst5k3f0', + 'bc1ptp0tr34x9892r20dqevqxgk80mvwllmdw0v04g5skdt2zdzqpj0snlrt3r', + 'bc1p8spsn7pszt05358jlm9f6c30275hekh6e8lcwth0ld0874mrl9vs9yyj3a', + 'bc1p093c66cfx4r4nvaxzgmlr0gjt3yrmzwa98v22pvwqnzrdqermvas7vr0xw', + 'bc1prqr72hlrr5g9rgedk6pgee92cvdwyx38nqaleg873en9kvratqaq7qul86', + 'bc1pks2tezhz3fv43equqrwhphxg9pf76ju2rlvat9zs2ml22t6aew7q4vusla', + 'bc1pr6k0kyeczstu3rxu9v6sw2m03a8gmz7ags454ujeplx0pxcsmrqs8ey0jd', + 'bc1p2w5fgqehmn86ffxlsn46sykh8w5rm5n0mcn0vtgvdkn6wjy5z98s9g3whj', + 'bc1peql6jfk0yy34h3uq9qtnmt8fs0mnck0dtx3zd0s2sankuhcv7gyq3eduwx', + 'bc1p0fy8pmwe5e9dyfxakkuf0hmy24tnxtjxtrvvgex3tvayw8nnxlnswjvlwj', + 'bc1pkxq2ku975yrau43tedpzfs9ffud2u5yzwhgvkka2z0vvefd5lfwq762qpx', + 'bc1pk94ryxvftm9kdjadpxsxwv629m392w6u47qmmjt09mshxhq4aw5sernje9', + 'bc1pcs3ce74fd0shdd9aqurrhl6esx76mswe5u2fgz24pc6953yxmj3sm03dul', + 'bc1p75ap32f2qvyex0s8m8cpqrjzfrqam47auufwyr526udvlw0urvasa822lt', + 'bc1pvlf3qmd0xls9r8gscwas93zzaadnc0yg3n3zgjz9xudcx9jp23ns9njf2c', + 'bc1p4cs99050n5u6gw609yxw3gk78xyaqxz9ryu8ght6mqjffy7987psr8rhws', + 'bc1ptcx02cr87p4mqqjs52ntkufk5779tk2jaay7vw6affn8s224c8xsy737da', + 'bc1pklzdssehpkeqr3yh0k27tc0fwjwlqmur754thmm7dnclw72v00es6dd6jx', + 'bc1pk2jpqll5ztcnqppqgyt6gm3l8pe422fqh9ewdgff46uu97eqykzqd766nu', + 'bc1pjfvg0l3x5tl62gq2xgwk63xsh8vq2k2lz8fup7pfv3f3chtuvraqephvzt', + 'bc1p4mlq6a9djjv55xqzaks5c956cznp0a60aqyqe88x5v7vag7hdk9q6wdkyx', + 'bc1partaf65t0yte9eupyumf7cm9nmk9s24t8s8dyk4kztr8fuxldcfsyu36ds', + 'bc1phk6uvrty6azzlldkvj7zws5naujxnr3anxs85md3snjh7uvx0t8qc6sjx8', + 'bc1p6avyxyxm5veyduqzz77cckl3u25xl8c7kwm780vfhlgl3a9qfxsqasx8c0', + 'bc1phlt7dy699flz7rqgvs9daltukxt8u6zyas6trdxj9e2ykkwjuzlse7crpv', + 'bc1pj9ar2uqyel6g6tjrvwpz4xxtn2903et4sue07mqdwyjuyl7hg5dqgq9xem', + 'bc1pv0zlwkhpju45ks83psy2jstph2qj38wgua4mwzpmyge0nrwdwjtq4er55p', + 'bc1pd7v0e037qhhfclqvhnnve08grna4znlxz4l0uk96rem7zs76xjlstjhcp8', + 'bc1pjhl7tvs2g5dwqgga025kxh8xgfyn5gfjkt3fn93g4zfz4euvpunsfylzp8', + 'bc1pwnj50yytwc6lx6xjyud2m76f3xeqqattn4e33m8ndzejqhyrl35sxad479', + 'bc1pmyxlsjecjp5m638ncarcwqg6qqua2y8hrh4acqne5xq56thydqsqg2t6mj', + 'bc1p9dmnpdga98cjvs0j8ghshyyjps23a20lkdepww7j0mrtwa7pyx5snqnx6d', + 'bc1pcswg83nmpdhv6sy49k7gl4uzk2ww7g5dsl7r7ks7hj9h3mxvgnkqu8rg4d', + 'bc1pdfn52ydmf9l83rzpmrna2srf6a9j9t6ylux9gcx8q5kyeuje8nhsngxrrd', + 'bc1pjdpmpdsza98d5zxwvafy8qxgmcju5dht70wxh28737vhtlygqhysr30m4a', + 'bc1p7z5t2hy32lpla9drwggmgvufkccnuwn3smx2xjchkxwh86enfj4qah5mtp', + 'bc1pnel9d6r9rgtqan8pksxp39eud839xz5h3n92aht5n5tcgxvlzzaqkdhsr9', + 'bc1pdzjyvhjvr0c6fl0r8rqmv4pqpu5v972sy9hkuwx470gu2k4m958svvp9p0', + 'bc1psgwupn0nx9fuwxr3yfcsd2juq45l4pthuqysfj69zw2y0ekva4xs9x9k8m', + 'bc1pct7e3u0ulu35qk60e7a6egsz4885wuq8cl3xgkfnu7z4zdvake9sla5jv3', + 'bc1p5568xmr2zds4z0w9wj9x0c07hy4zxq8ftgc233tgq9an34gxzwns4mdpyk', + 'bc1pgnthv3ax3fenuk7dy79wzhwt2e9f62vxle7nfvxwj90z09hvxa8su2cuzl', + 'bc1p3q0ssr4hjzx07s8x5wfucc4ndvwm42d2c29z74yp4dgqk8txxqass9mwze', + 'bc1pvsnjqq3at0kz03mhxdevyajpsp9lghy66flmmxlp3zcdrlshjhmq992h4d', + 'bc1pdjanmezrm7r3xezg90dq38c90gagr40g80q6tj5hfwe7lcya3kqq9k4xmv', + 'bc1pgn8pzk8np5mu3avumj5pkmfa9zx7kz5053xe57n420hws4cgtz6sp3vd6c', + 'bc1pw9enk88z0l0r70slprx2sl0p6hs9y5jhzxlxvwx9gsp6p9dqvp9qhkhevy', + 'bc1pdrgshmrme7vfwt6kazy5wa9vtymyw0gddxqch37aq4vm3axq9xsq40a03x', + 'bc1pm0tv5qzaqkdw26wfewtf48kze20kew0pkzsrcq0vqtstfxd20zysglfcmu', + 'bc1p93d8wg4zuqcqhyfjp2j52q87azuaqwj30h8zg0xuxtc6nwsv59lqkz3xsn', + 'bc1pk5n4k3qk7wpfkmhu9ph9u2vev3eh7k4fgkqs4seqt9gzvtjv2wtsdpqpgf', + 'bc1ptmk2ezsqxj3fwd3cryvf449j94tplr45mpun56uh9fahvnc2ta9qy5j4m4', + 'bc1pmypc043jn6kx7dumj5nsqz6ua8ftlt8lghqs3e3zcwplqxkrz3msrht94u', + 'bc1pxwfpvr5lqkyeul4df5x78ygrzvefp3z5pwjgf9r4ua8w7n9gc3ws90qyy3', + 'bc1pzg3qggtls64cuj69sjxfzfsgajyw2t8s54tpxg56p3zvtweerxrq68qnau', + 'bc1pqhycnukevj67rxct7wdcfuuxn8c700tuvu0pxruspvy5xumvayvq4udfv9', + 'bc1pwg68709ef0tjxkhl9vrj8tg6c4xdxl2sp62tlzazanvr730raylsvyysm8', + 'bc1ppnmrn3tke4tpj7fhhqer9q26wazctefdnyz4jly04mjatxvp3easya89qk', + 'bc1pvuty5mccd5cxx5s28cf40x799w6y0j4586ny83tzwzhc9j7l9lcswkfcrq', + 'bc1p6m76w9grx7ea6d6fas6ee9jkqcmuq8k4qtd4d25llzk67hyp6mkqpfvmzc', + 'bc1pv96wnrc8gyurl2zcavdfw6302rs3vp7me7j0pm0dk2vjhxaux49s8pkqrq', + 'bc1pkr7x7vv8v6nluhafymuuqr9qn2n28ykwtdd58xjx5469pv0f6q4sna0mpn', + 'bc1p50apxaw3g0l5xwv7jcrttjdvgtfywsy5x9rnd9pfhhyveuxak5gq8067nd', + 'bc1pxtfdfmsm488k84mnsahlnr74sag5x4wfp0mhcp0k6z3rcg2h95ns68sdn5', + 'bc1ps7ymmeg5x35ytna9jhsn7743dm7xj0ng49u3ag8ypxcqh6u5kzhscjwxz4', + 'bc1pjqd4gzzas7tarjh0fa8kje7s77w86nsy2dc39wjt7pn3lzwey44sxund5r', + 'bc1pw8z09e6hydz65jgenzzy60rf5ectafu2jks8zmkwzvvx3e4zva2qeusqh2', + 'bc1pyfwwyd8hqz8nmc6a7h9rudgphl9nlj08c7zf0lhu9ugy98v8ke9q8vunaw', + 'bc1p456z2mkn56fhgqml5c7qf75savg3cw8drhu33pferu8e5sr7jwsstwfy99', + 'bc1pcfmgtr3ksgh4g0s9q3lks3ksuedxw4zezdgru8ewfjptlsagxc4syygeq7', + 'bc1pdr637zkxea549qqns9x8t7w20he8uvs9ct6vtpcre3zysnlplass2ymvyd', + 'bc1pcdq2mykq9zfa9kcjej8hylzv478vuzn2dclw58zh6y8d0qmmfqms8knxs7', + 'bc1prt2c9z07ew4s4yv33634n2xhj8p7hdvlr2w37ur39jxlc07en0jsj6t5tu', + 'bc1p6p8cvmq4axs23v23hjk7hf44e484enzq4n5ggw5xqezt4arknk6s8vytx4', + 'bc1pv7hmph2e4yekx76ssnu89rdqkyy2n3zm98n086y9km2cjg46xgys72wfsy', + 'bc1pw6hje92e5faqk09fwdftu0pmqma5yw9w5qwcdfhd7qcc9phuqrasu4q70c', + 'bc1ppkw58em656s9mys5dh3gaz8ftde0cvej99vawxkegrh9vmcy93hqukaf2h', + 'bc1pyt254tvjql9rm56l3auv2z8kp59p7y2gctrr6c7z9ud7gegkhmjss729uz', + 'bc1pkkrjr7lr7q6pntmts3ugn9antr008yvzcky3ljq5r9mhq49t0z4sxur2v7', + 'bc1p7w90pjkd8z9zehljhk6vhlu94ljjr5d7aypzuy7hajun4wyesvvqan764v', + 'bc1pyqmj095km9a7xs2ec7fsfkn9vhrlpf98zdjmgv9p5fpwlwe5tr3sc5hau3', + 'bc1phefwpn4u6qt3ezgz9hwfu8uc5q8a8rcceqh8d0us56u6qwwam9yqzv3uy7', + 'bc1p55cvl9hwzeske4358nv34vu36pknm2y79aqsp0td5slm5g0lnp4qyjfrya', + 'bc1pxmewawekvks063fyccynvc395vf295mlxesz0ezglmct9rrh3dtslxgy3h', + 'bc1pn8d5lp47xs77kghpn9hpsmma0stsgfyyfy69d42rfh8ysvxv3t9qf003hq', + 'bc1pmzg9lhpp0l5gxn2nuffthlex7whrmyyknww667j3f6ynuej4pl4q3ev6uk', + 'bc1pnln4agkc7vsfjr27qq3vkha302hyr7x60w3e0l8ny9cdzxfjgz8qz5zv83', + 'bc1p2uyt30dh8qcpxjmqnskga9z2qeyd2wxkakn95225q2y0f52jdtqs2y6jue', + 'bc1pxmpk8enp99vuv4y8h4tuhgz95wvumslmw6tnndqxatujyaya5kcqmslg2c', + 'bc1pvkdmxtfww74jnu4g5fzjzx3kl9jjzwslk568kzm8lddzu5tft78sacp9d5', + 'bc1pmpzhac06pjnt25ppddpr6kf9mqnwyzd73fjqscv7s7l9rnqulswqu40t3e', + 'bc1p7q0wxwnztndmpnflpk6kclea8vlg6nu8e4qh2yyv7usft5e7c3hqzcrq0z', + 'bc1pv7f2hfppwakhlg8lwepzrk0pvjhmxznss5xza9a6zcamxl4yevnqg50h6x', + 'bc1purcvcd0r6se2yczpujynk2rs7t54qusc05alajgnc9wq6jf2nevqrpacz5', + 'bc1pl66rxulws8t4qrfeguge4lrwgfn03mkv6qm89l49wh49mjsm5n7s0ggpsy', + 'bc1pyqux85p4tlzfk0tmpr4fkjzsu3a2krw48p2d4n2k6zxlwgzjdm7sskg0wq', + 'bc1pzuem09ng928hxqu08yzg6al9pd0v0xj30c0rzlpvrugekv37rzgqrmuhqm', + 'bc1pjlqfr8r84k63kyccuusstgr2dchp2xycx8fqgdsjpmv730cktxeqnqj46v', + 'bc1pyltna3zmna7lxssjwj9er87aeur9h4hwdzuy6xcaqlem9xat43rq62rvjy', + 'bc1pt2jpdt7wf8ewz4xfltu6e47074mvh0l63me6az0wqjsle7g9jtgsyx7xtq', + 'bc1p7cre3w0frf495twarkhxnh8ehd3mmetw5xz4rq7kgeshxx20t3ns977l69', + 'bc1p0ujtq7wzsjr90qauy9lj8n9znas25ljwzwgj6a6gl3a6ganyuwxqrj5ql4', + 'bc1pcjj47zw95agrdmp872ahmlyaz3xladxw7sxpvef4uuww70v8h8es89ry5z', + 'bc1phadrah86el2qcjw8tc5cagfsms734ekn776jupqktxg0v9cx6v3q64lfp4', + 'bc1pqdpqwzayx44w7eaccv77mjne2rq3ranxevrmngue6nqdjmxlgtqsx03p6v', + 'bc1pgwwrtgvfrxlt6clt3c0ee6k33ea4n0wymt5mvkc3thn2dktmuysqvrc00t', + 'bc1p53fw6ph8jnt0hy88jla4y7p6kanm40lmhye5vnpz9pchjzn5euvs56t7a4', + 'bc1ptec6k6l6czn46dztnl9t558433ykp95uvjxqv7xygddm0m9s7sgsj70sp0', + 'bc1prpfv43tscty66hd37wgdpzvzprhw74wnzvwn6aejtf9hpe4rnhvqthgzy2', + 'bc1p9722ffaktwfwuamjn9vk5w4u3p98n0a9m77nyaayk4gplydpjmxqstwwqt', + 'bc1pta6gjwdqj9vnpa7ppuz4trhhw7twkd90sfjwhl2lf4lrjf0wzz0s4txtuj', + 'bc1pkuqcq2v98rdfmyl7zwgqh6h8y476d4epuw8pjdqtxs2zke0znjxq4z6da8', + 'bc1ptrvxjkvy08jw0vx3fnhqgxpk5dmkam00wg95g98grq5hzmtmrxgqp34ccw', + 'bc1pzs8gqdq9qs63nn4wkmq5j60mce4t34k3p3v6vvknauhk4ft0nhtqfmv8fg', + 'bc1p0pdu3k8ws0harv0juhy2jjvtk6jp8sgcr35qk02fkyv3uk0lx66qxt9gzc', + 'bc1pp3vxpr8qx5tvelg9mxplr6xwg8zt2gwyf2q7x7phuucp3gndxyps3utrch', + 'bc1pm5m9xy6elk29zhq6yk5rg3y9p0ez4kcqqqqjq86zqvtwhqks37ssx2wzm9', + 'bc1pl4qz06xdtuxr7eprt5wfe4dy4mwt5c9zency9ztqant5ljhk2djq3226jj', + 'bc1p35844gytp45nqep42mm5v7zppzt8wem6k0a5dxt4sqear3qzu2xs4g47sd', + 'bc1pnxquplar6z4jkavtrjncdvzjxwww7hqtsfle42tjkhsp2gy78r6s7lfdxz', + 'bc1plrqf302svkhtahv0srf9wk49shjauv4j76vtrxn7we7c32pyae6swafaux', + 'bc1pykpcds82th74a29yj0dw3xsje76jgznpj05xe8xw9uu9ef8ed6tq08xlgt', + 'bc1pwj2w5p2tlm3f0s7vx5wsvp0zpdv5cj60hnjppwndtl7j24jan3js8ar04u', + 'bc1pmnqv7rna0tdhfkdprlw5qnfpmkr37mety34ypsqkz4gzdj2ah5rqsf03s8', + 'bc1pdm3x8zc06xh3k0hr9dsv2a7dwjre3jmwme0rufvyeqk8cq6q5grqmrcjuf', + 'bc1pmer9etlmke5vlrzvhxsu0qacud7eccrjjfmz5qcd2qpdqwe39als9xf2pm', + 'bc1pptup5ckan0udmudfjcxqxsgfsu3w0x34zmskwjrldwx59r6f4ezsuf5rmn', + 'bc1pgp5p9253sc84e6cygxkrdaresnqxjs4u5nnxqdxgs7smqehv93csmp8stj', + 'bc1p7ahh239eashzpg8xzzegfmf4j58ayw6hdencaahfp9umev53fwsqs6rz3n', + 'bc1pedqhlupg9mlcudynj2fkv7044tncxxkm64ehd864qw8g8cecqujqwg0f82', + 'bc1p09hvm8fa2akew8af2hlk38hw4x7ks6uwa8x4yactz4wm4vev3yzsjamsy0', + 'bc1pknl08nq9f38nxge252we550x4w0ls5z0ycuwrnx9h9hfses4mg9qtmsx73', + 'bc1pc7c2t63rdk0wmacalukxlgqz7cqqqrqg4dh2knfgrna6llwx8vts76wykr', + 'bc1pxmtc5j3nhpj74vyka7we6ktjmg4pl20eel7r79k2qd9sgw3suw3skw56wy', + 'bc1phkefjd7h57g847waz6uvuuk0mm2uqs949qaz3ut3xpzq80apv4tscf0x6e', + 'bc1pe853kyf7ywpg5zptrzce03quqlp8lfgmzz56v9vy7dy4dpyupy6se2sl42', + 'bc1pv78v5k4vw2fjwnpprcfvk9400mqmj7k9dfmfuadzmzrg3ep89rvskwcqsm', + 'bc1ph95yy0wxg4udcykgfuw8leuz0gcrgc9gx6qehwphttvxd2r4znfqt7gu5r', + 'bc1pfhpspeuvqc0zrcq0u4ev4090uucdf9fn2cskwg0jc2n8cy28x8jqqyd7w7', + 'bc1psva4eghz3tds8fcs97kkcmmq5khnugswevgz5u5rk65zed6qjjgq5rchu3', + 'bc1puggdcecxkv564xl7pr70yhfc593ee0fzpwl73tvaq2punef47h3qaz7qel', + 'bc1p2vdx7qqqxf439sv8jlfhvkpjzh6lp5u0pkl63h53uy3zw4lq39qsrfx00p', + 'bc1pazxgmxnjrgpphq46zl8m4n26aqqhkdaa53glwxyhc737zlufvuzqr6xsev', + 'bc1p7lvcnrxdejfewxnej3aen3spqn5whffghswypyjj46axy4v3p2aqgud5yj', + 'bc1pdxusx39aqur5nzxplp4vq9z3dd3sewxf6ndaxusf53wjlwka3ckqz47wtn', + 'bc1p7mw26yzzt2fkh8qmwsd4ch0qd6mgycfsf9fctpfjkycugdcnempqcsu9mk', + 'bc1pzhjwldh0zdwv4x0emtac8uzrukt336d78uxg05vj86f768helfzq68ugqt', + 'bc1p2tuusv3f4p39svm4kztcnfk49hll5r8mj3t02ur55cwzgrzxq8ps22r78q', + 'bc1pl2nk6k0p3wkzudam5a7kfztkujkwkc3057zs9dqqklgwrfcjusvqyqscg8', + 'bc1ps5gsyfmnh8f5ppt5j3n6y3whnfvu7j0xh30u29l86en5znqct4cs9umus4', + 'bc1pnqtww8cuyh4ul0h2p5jgj9krpdpnkfawl8r7ynr0s2kcqfk6snaswyxu2z', + 'bc1p5chfnk48yzgwh0sg9yu5ndlq9uqwyhndhdac5gsxrwma5vhe4u8q7rgqnw', + 'bc1pslrnaanl8fxuvhkpk4624ft99dtgqq2kw6t4pew4cafjzfsr9y2q0t7ggr', + 'bc1p7ymstluquql4u73cgvwwcm440lqllptuhnye5kqeytvwvc89nwcswmxnya', + 'bc1p006ts6egely05j6rmcplaqcs5203e6lwr3vjsearsr5sq6l48w2se42gyk', + 'bc1ptemfk6p36l62p79t9mqnfp9dtx5e5ycawlwpfl9wf9k09cxc8fgq9hsfk4', + 'bc1pka2aj2ttex06drf3ggr00szlfq0k559v32q8xxvnul92py3ewjzqqzxmkz', + 'bc1p0kf69gwq8slrt50djsklur7dgp2fupnn43gquwnqmq2n5tf94x2scnmnhv', + 'bc1p2h2602h694e93z4ry7dtw5zh67pwyt9ggxcd30dcxjrnhtt7fu2s4andkv', + 'bc1pj6zxnlvec5yevrtqzyf4na32qyvpk2yv794wdqnwmwuunl9lhznsv2mgwp', + 'bc1p023q0jxn3w4fq2e3rvcf04y98g9zlyjzh2xmc87zqm9jk37mamss30dzsu', + 'bc1pwte4mzjau7mkx9cce0y2mnh96jek3td5trrshrq2552z20qkh42smrs2u4', + 'bc1pc3trzh6eeq6g58nz2348z00rwkm46fkyy9zutjp9yyzn6lzl7tms5hwhn0', + 'bc1ppell44x7l9xa44uet445n3h57n5980lv2qkw9z9yhtqmuzpy4lrsdy5vsm', + 'bc1pzc2yqafpr44vfdpgjrajgtp4nrtnunr5tw26xz023e265fpt7kas38h0w9', + 'bc1pzxvfnehv2yx6qy8m2f5g46usyenne5wnnlmg654pytfxcndzxncq46arez', + 'bc1pd2heygclga0c5cxegjqzsm60yl6qc9fs954sup0kzg3c36n7qgaszuuzgv', + 'bc1pnnsn8kytj8cja6h2u6rd0j95ww66ekhudhnktthtr7rglu9rycpq4c6x95', + 'bc1pnltpy437yfpg00g6u89gqn8r9qhdq709cnvgdqn9glmd6pt4z89sr488kd', + 'bc1pfqnwqn8vklzsyakkqsvyhgwcqd7c5rgjt3zljgjznrqdqsjxrl9q4w57rx', + 'bc1pjceax8p2aw7s8wsacwsz89j4qcgtuknq3rfl2pp6r0s6ce8v5e2q8snl8f', + 'bc1pkwmwdm07e5kqw0r3dn3m0u76h6a6ljkcsuypzt0jg9cvxwrx58xqatgcna', + 'bc1pr3gx99gd55zkzpx2y8taxd8yradew032jsqs4364pjv3g5xjd2kss3ae8k', + 'bc1pty3smgaamcsqsw57cjyvrg3j50ztcfcsa7mvc57ncf9cpp9watwqfnrz77', + 'bc1pv6zu6nke5na6zt44pv7e423aqfsddhhwjdhdz70kn9ngsgssfc8strp5wp', + 'bc1pjhqs0za0903p5l5l5ux4d3qpzgcej7lgmj7zufywh0dxgsdnzwlqqqmvg2', + 'bc1pn4mu0rvr7ugaj23qyyxcj9kj4ms6xcq8kz777etpdsu52mrza33qca9f9k', + 'bc1ps35dgqsfdnp92t3sczth54rjdet8r4jd3rm6f2ud8uzfflmd8kvsgc0xl0', + 'bc1ppk84a87jmu772myp0th6ydrq34972hujsdmjv653pmx9fxxfazmsz953n6', + 'bc1pru2aewv0u0g6w87xwf2kmq2sev0rx08zgpypgwraccwt8knv8e6s3vae2h', + 'bc1pgkh7nfe2l5543pk7r2c0cd82yp4qnkxla7sj9eyr6l2ysf7xv99qnq3nc3', + 'bc1ptg5e4af7d6dyswmykj9pfedgcrhv8mpnrlmxn5gw8fepusyn3ehsmxr0a3', + 'bc1pdx8sralug9qjzhpkdeum42dk86zq6vqtyqexetay0gk8dewzu2kq36vefz', + 'bc1pv65ll6h79ye2vc9cxtk0u0dm93v5n3gezsrn3grga3kkhut6e8hqegpvp7', + 'bc1pf3wcczcntfchcr36mp87fx46cltdaa5yg5hnxqx0ln2jnre8rryqkg4t56', + 'bc1pgqt93ptsw9xlgf4xqr4k6wtjfsztam6jsg9ad8mt7l0v3ny7enzq97hcl5', + 'bc1p5mr8cwtjwfyaldxsrpqml4a4jrq2ss6x98yraf2d3hqcu3c7rldq6e05hl', + 'bc1p2w87kftxjtxdfwul2rtjmr66sw9mdhas467pxkah6y3cwynscmvsa79v5m', + 'bc1pj609cy58du63dag06ljdf5z4k9wtpdv95cwxkasf4fwtatj4ymqqtlh5qg', + 'bc1pgmn70wn2n8t2zkgr857mm3zaf7yqjnuv076v53neum6299zkqevsy5ujfr', + 'bc1p84kxy08fqe3nqqcjqxya7zc59wwe8h92uehwj5c6698dugax9ptsw72r3l', + 'bc1pp3ng2vlsh447grrjt0acdvqdj2wcs5uw4x9kyzymq5ua6xtgmpmq7yly6u', + 'bc1pfkx52ptkcj774jendnw6ssdqh86vypy6zmryx4zptglz8gs2wmkseqx6h8', + 'bc1pxntyh9rj2jk22s8329gyzyu4zhcg9j04se467mz2llrgzkhmxfcsnw03qg', + 'bc1py3aw4rzkru6cv9u4xj99gufufauj0ezhsvwcj6rzw6s66tlm7r6s8gy8un', + 'bc1p7qltt278dvgee0rmdmjyfljullgw4ptz3rq7wp2sfcuwkvqujjssswm4zp', + 'bc1pd8n52vc6lf5sdza6p2979pdtu7adnhkgnmvu8ae6ux26l9zekwqs980lra', + 'bc1pmrsu0cevtdwtg2luvkfj6ej4jflxc37umd9265w2mqp5dwtfcsesphdrdd', + 'bc1p5587pmv6c7gtc7vtfycy2cjnu22ppe2yzgdl30mkpn8x4k6xwt5stcgy5c', + 'bc1p0xmse5e4rq0juxw9ahz4ne9v4p80t84lue46a7u4t9lczjympx2qlj87yf', + 'bc1p3hjvwxxwkkh5dwn2sc8zqv9qgl0xre5hj7fvfpfaecl6as2ww86q84294j', + 'bc1pcgqu6yxtw27405p2z8kk9adwsykzz954ujf0flym0j95mwvspphqrdklma', + 'bc1p2e7zf373kkkmgp3t7texdwegfmk2wg9v0827dq87zp0dhdaug4rq9knjay', + 'bc1pa5fp7uz4ysg260vvz74n7yghe4505wgyzedut6z3r4ajhyplfl2qumg3nt', + 'bc1pjkaxgevap4w9p65qzvwjx5kahz0p3mngepzpg9wzdte4a3mt4t5sxe88tf', + 'bc1pnfzv9m40kwmzux4pxljmd54qkxteguy9lkdgywda8j4pfssj4h8sm44v5k', + 'bc1p5rfevzz6jret4gsx9l2u8f3e8w7n35zdw6tdntyewh7wfkvcnensyfr7fj', + 'bc1pm2pkgxq8frdtxz9zng74p73s84plt5wf5udcsf5p3qykgukc9stqwdcczl', + 'bc1pr7uxu6f2rxt0a42yr7vre6lzqt6w07jepk73csmg8sdr75rqpj5smypzw6', + 'bc1ps7qzv9ul8602vp7yfnu9dr6457mg0pkl4d7emdjhg65c6kz56fqs2ej36v', + 'bc1pft3qp9vv8d65f6hy66p5ur5suse357fj4z00us98f6ajuxpy5v2qpsx089', + 'bc1padnp5u5x36tzv8kyw6ckn5wgmd0thuc7mst4w3my734963m0p3wsp93xq4', + 'bc1pvcwmlllxqckewlttez7872xev5pl63ce4rh34gn0elfqaljv868s0v30dc', + 'bc1phvs456kmfctdhv6hygr2hresfgw8ufcmmtd03ye40gzex26tz8zqq3z7tl', + 'bc1p0rh2uu7200x72gu2f5fn65aacxv758wsexjaggsxjygf3aws83gqrndqkc', + 'bc1pdjn7qd4t8p28y3d0j8wcv5akqjyg3wu5q3690k0ppp7pkh4dn7ps8rj7tq', + 'bc1pheny7amc6xsfgl42gqgxqvymypc98tu0gyfag468va93mcv0z4cqlyrrv6', + 'bc1pq4q8p4chxxpcyhnrkjetqn3dvhmwu4g788stgwwa6mfc4a2xsndsj02yu2', + 'bc1p677ldgt8c65lt8l7wl0e6qpz3zfd6j3vgv6xgztydlmduqq6zeuqnga9sh', + 'bc1pa0d6rkmuztq2le7ntd92mlag0z6etpxknq9fspzvw2kprytp43kq6zfnq7', + 'bc1pftxezv5qul52xtamym0dxqxdqwwgv5acqah3qflqh6el2zh92wss96wtrq', + 'bc1pssh09fsw250r8xmew2m6jy0zlfffratfag48p07xchw0vacsv4gsyzf4ed', + 'bc1p0qjzprtgp8tglswh7675u8vjtr6f9rqcazeac9yhxs6qzq50hv9q7pkkay', + 'bc1p649auvxunfqezjudxk7pydrnnne3ttnxllj6wkjjfukp32gxcf6sagqwce', + 'bc1ppzv6ejd9lc8rjvhl4kkz0jfhf595hzg9ly02sgcyj5htt9ukp0uqgxk3a5', + 'bc1pvhypjvsqjygjqdpgz3smw7jjgk46dyahafcpe8qnrlu6eep535ls8a4h8x', + 'bc1pjnyltm96gl89ragzuefm7n9zm6p8z8z0mw5w7gxnpa3038gacq8s2xjc25', + 'bc1p4uvt00mjws7g08rs8f3gk4hx28cztjvwze6p0c4sy5kvs892663sk609z4', + 'bc1pa7tkhwqe0e8766w67uydljgyz9scd3g7xy7xu7uhqy9zw8ufv4kqrdjyk0', + 'bc1ps7ncgkr4g8s7x5u9crur2h4k78uk6n9u0mwqjx4ka8d6djdyckascyvc25', + 'bc1pmy040qeut2fkvy9f3xlkumm7jky3awqhecvg66er5hec90q0l9vqqw6aj0', + 'bc1papcprqhhuf48e5x0s79z6pqpe76hq0yke0j7h99z9cfqw2muatxqxekclu', + 'bc1pf590pl0sja0ln4fsed5sd72f5mdq34lhlh0cjrnwu7saj2m7g6dqxcx87z', + 'bc1pzsqfk6g9e0w5hwhv3m0zak5rxcee28zu9ugz20cp03dtxazv5mzsmqq5w3', + 'bc1p7ga309ntxpv8rwnwz896q6acqwmhkhrxzwxy8kxhdad2puusznjsyfyzmk', + 'bc1pmxqls5gd0kn4p309rt48en4ledl9gcukpudy8cxuu20zkxmk0x7sywpgpj', + 'bc1pa6t73jr5wv9jvl7c89r3dtckqvcqkhtgce4t5gft8v2s4j26k5uqxg047n', + 'bc1pcd28epmqjhlve7lpsgezqxdz7fh4c3mwlr0t9hwvn5xk0vdhdqsqa5f45a', + 'bc1pafyvuf4kxem3u9ezjjt3jqj8j5muzswxhzugfflp6wrgl6mtaa4s7z5584', + 'bc1p4ylw8jvmgtesv8439p3ahhk9x6hduqz92ar9ej6d5ult3gvsndgsgpvjng', + 'bc1pkw085s98j3wsqfsk6ghl9e0ckzxlhahhu37az9j6qrk53755ujrsc90nva', + 'bc1pswxs924q5t24yvvemauja7dvwlduz0nutkq6eu0ug9ptm74kcyys4hrwpe', + 'bc1px8ghvnmj7lg79nw7tler4wxqgl5txfvq7nehpdjt07t7daf0vv0qk30jwu', + 'bc1pjaxy2l8mesfr57myj8q4ajl2s3x9f3rl5e0ktvy94mmynyg39waqqjw9zg', + 'bc1pvglnyqz9vawt74f5jvqx49f84pe37kny8kg78t6dfq9kyl9f5j7sfhywsz', + 'bc1prr8qa2eu5kkahlvrwau02cnjn3h3hptp0p37cj8vrek6682ugxaq3c27dq', + 'bc1p5egps97lezt7e0kdmt99nghdrmt3p2hm5um57yedqd4l9k733pusq9xu0g', + 'bc1p9sjgeztelm32rnk24pfw9yw0zjtrphfwgks2hxg5mlzp5q6djp8q8kvuvr', + 'bc1phzd3v76lgv2dhu89jc03rj4zjuaze38pq0tcy75vk8t2cj8ee55qx8je94', + 'bc1phesu76383cx57eg80z65lr94w8h063aq8yvz5wxeqpvn9vglugesvc5p5j', + 'bc1p8x4ntdgql5s4clsvwh04hhmj7njxdzthtf3xtdhtpgffsvkfhw8q7e0lrp', + 'bc1pr364ek9mh6tzvh4nvhe735ja6php05wkmlelq700n4cukwx75lhsazk2tu', + 'bc1pu0f8s69xv2wqyj82wszt8mzpftqk6hyysfd9dlnkv8zcqj2xeclsj0cy8l', + 'bc1pf9rdna4ug2e44u5x7q4qptm6vjxwn93nmu28xjf368rl6rhlzp5ssnw0d2', + 'bc1ppyrskaf06dxmcw4zedsj349zsfrr9fe7ck9pvdd4cvyv7ntjp9wqwxxjeq', + 'bc1pd4g6wem0tg98fz28v49u3dqzg4k8fhg8e3s7x60p9xzlmljqhklskvhe9q', + 'bc1pgkkdrvudn6v9wsqwz9fevqaq2we2c7qhcj8wcjrwjdrcmvsz03cqcl39c5', + 'bc1p557acdhw8qxajg7q2gmkmaf7yd9lns8wq3r3ywxpnwf66mgkjycqgamhv0', + 'bc1pzul2k7an8q8vzmn3w3jsl4gxw9yqveeenkuwcdjtucs64n8je6ds8aak3t', + 'bc1pkn63h5utrwle45mmllkl8avnnptfh9ef53qkn62022gt63ywvu4qlg65ph', + 'bc1p5ulg5wqcljrlyank5jh6w7x8hmmhdrg9v6l3m5a8gmmwh60g20pq3j307j', + 'bc1p2pvdsaq0zq5rnlm7pnqerg3yw6ajq7nuxal396j90kjh66xzwyhs6ed9u7', + 'bc1p32p4pknra7wz76rgkdxpyacsektkqm4ygfs369wsnalucsyhxe7ql058ul', + 'bc1pfz7cwvcvzpwly7ca35vc30ucxsm2p4ttyjn76anfv6u63y0ha6hqgw04q8', + 'bc1pqjlmmu2afwy9f7xfpl7ytnqvg0ksest8tzq805d82ht0rwckgmgsg2qr0c', + 'bc1px3dpv5vzp6xj5vcyuyqz9r96fnas0acmrl35wwu0u2fygu3fl94skm4dgp', + 'bc1p237ev25rm50jkyps56avcw49u7elp70vec36g2l4gl7mejt38j2sufemfd', + 'bc1py9jr3qjquuq720wqgkvuuczepxdlj0dvurpmzgum8vm3u5ufdhqqla85z9', + 'bc1pe9gecc828v90rf5n7dm4tcv7jtqjq5d0e8xqeea7whxauq2sldussq0zsl', + 'bc1p3enrsfqzsfy2p3yk6eyclmhdnsu3n4ju8dwrtjg9wcmr76wukj0qutfz66', + 'bc1pguz2pad7nn878n3cf58fq0t6n35zaw72ngfwkut8m4uahpsqfa7snxaymh', + 'bc1phngst8thnxvxf4njjpghp3y22386a8n9mlkgnjr3xdwzkyayutgsdfejx4', + 'bc1plkffql6wn2083672g8klwnqccczh7u5fr3h9e8ja5hkz4wg70rcq64cgh4', + 'bc1pwc9cz4zqvl8e08ej3mjhr65stazpln56yc70m76r26p9yaq42nesedrpdm', + 'bc1plnkgg629wa7atrd0h9u9m6q7ql2h82fpuz79akwys82mltma027qcpvhuw', + 'bc1pq4wgrsjdjef8cwlxd63zhexsdc83w03fyg7545uhs6yth2rgmr6q3qxwu8', + 'bc1pttln6sz2ayqexcjafdxyn58nyfatlcp0d0jnmckl8sv2avwfrxnsc5wvjn', + 'bc1pq84e0k0g25zheellpdtssrgmffusz08u34hw8trvcw5jsz3y8r7q4fcl6e', + 'bc1ph3nj7ag4wv485qqerzz72d0qe0xh42rxv6cn8pnmmtn8xk72hyfq8rvku3', + 'bc1pw9y8pn32ys3pxqk8ewgca74q64j0gwhnx3943ewna5v0dtzcmqmqadjxtw', + 'bc1p6fs4zfw3394trqar8qy5f669zdmeyd9nqpkgfwz0g9wh5tznjawsmhhweu', + 'bc1pqw4gnhs980ap3lq6dupucxsx0qhdu94zqxy4m3crtcm7sqrjc4tqjrcuuy', + 'bc1p95kmunznuh823utarhkas08wh9zsqw5ceshz3qtqrprfyn5znrkst744zy', + 'bc1ppernct4gxuyy0zaxkxnprc5x5h33zjylep4ayss47p2f4qrqjd3swutn4p', + 'bc1p2aj30zrmmrevs0zy0wuhfjupwtpasntfauvke63rvxcaptndknfqarenpj', + 'bc1pzfufj5hl3rukn02ztsq4gp7ftz4ndn9uxvvgy62fyvhgvfjeeuwqnhgcth', + 'bc1pngfunc2vyjkgpkgwqkqww6pz85zhv6cw6rlj8sw28v27d8lfg3xqqp5tvh', + 'bc1pz3affd66r2wreg24n5qjhzjff6vd9yyhrkpgsz79lkjpgu3g053sjeuzgj', + 'bc1padm32p3vxdhpek5633wy2t5t5dsylhzg93k8jlqjpapvr54klmssjh56df', + 'bc1ptuth4ehdz5nw8umy64qf83qn9536y0ccjmdny90aeup948lsw4wqx6tdyr', + 'bc1pqf7p9g4n09as897qs6wmpy5c02tm6xkzkpp3jwzf7eq7camy837s4tx4hw', + 'bc1p2h9lspkjg0x9ue5rnfh2qxp8z5mq78wl3034llpdwmr8mz3wa4hspyhc47', + 'bc1p396tp04mq99q89s2v2e0jsk97k5mhlpgm0g9tv4cezk72futn7vq8jqtnw', + 'bc1pk4xqgyzyumlt577gv3n7pamzg9e9xphe4n4lsp8c8lzg3t4rhapqje5nvg', + 'bc1p5tv8f3hd9jcexnrsrtuf9yxmshtqv2jpj4kdma4kcr5qlredcyrqyucmuz', + 'bc1p4tju5509klfx9jgkdqausaj6z9j8twfdg45w0rg7k4snqul8whss67r49t', + 'bc1ph4759dznfnfm9wra5hctvspqvwt6khmv4mhevz2mr7kx420uychsra970m', + 'bc1p9v63tz5adj2g0ppglenangyfjczqjwfrv3256sey8kra4v3cvg6qlpuhrc', + 'bc1per0p84pul3sjwhs5frmq5rh4xtlv6ty9g4jcgfyr5hrgqdfuqy3snfq95f', + 'bc1p780rzaana8jj0cd6uupyhghewat2e6pthrjaxlkfw5uepkgn28kqrdp4kq', + 'bc1p2kjltr4fp845aeepl359mp7vs47j6s9a9xk8ffvfux98p2tnkv3s7drtfs', + 'bc1pnt4avjw59hkq94dpnkrp7qm0mykmhg7v94wccuu6an0znw4xa0gsmlfdxm', + 'bc1pmkln4xl8zj383umglpcv4ua40gugsthycwj2tfjtaftuydstvwtqghk8qa', + 'bc1pd428qspvaqmtffr4au9ddan9yhuj5exsp6jt503g249zccsns4fqymlnm6', + 'bc1pkafkf6s0l4yyx8p3csk9ujuguev9chcj3hx6pznqj5tqxtmw4s7stf0svc', + 'bc1pm6s7mnu00xc8afuxpxx0l0t9vlc328e44lejda53wwuw5pfzy7vqp9caqq', + 'bc1pq2cv5h8efj0q3w6j3lcp7anl0hsaywjjrsansyhmmw08pl8tn38qu73alv', + 'bc1pjryhher7fpq05dq0f9dwngswqmpavnazl35rvkg032evmseeu44q8vrx40', + 'bc1pfeluypk5qwnfyr7evhlltey0yw7zsjz244sdw63teshdthgrmwsq8v2zhk', + 'bc1pgdp667s8lyv46smdnvhj4skux5nkmnx2a242kyxfawagatj2ln4qhuzhsr', + 'bc1pzep05tpvqud2pnpyky6sha6y6r2pnexwwlwxnuetetymnsvtzqsshkhsjs', + 'bc1pyh0ryrvzek2s7wpz6g6f4hh0paahacxmhdgcl5hqqrzmrwa6xk6qnw23nv', + 'bc1p46z6hx65cl0kgexe8322ta3wj7n6d4vz2v3qkr3cl0t7kw2v3j7qyqa6qk', + 'bc1p2ds3vnuy0ytw2u3k5e2scwe7yrnfa28ajctpd2erl7gje09dgxsqs3n864', + 'bc1p00fpem8c4q9kfpezqdrdl573ap28gveh2s4d3d63lvzf9jjq8xcqulml0a', + 'bc1p3n38e98v05tku798y3ekmlqf7q8huhllhzj5manfdf4ksgzrhkzqu34rkv', + 'bc1pedhen8gq2gf3jt7gyn9f8zq2f66jxl9y83achg92zjulvvaqvhnsw2qyv2', + 'bc1pze63tq5pf7tmnre227tn84yeqm2fplc6fhqhalu4vtxadlmq3fkqw02r5u', + 'bc1p7xnqsp85qqcyk6cmnnaq6qfvythl8j8jwh8a326dn5g5jr83wvhsnretgk', + 'bc1pny33wz79myncm6gcxr4wgnkn637xmqejqh9n6d4w4yv85en3u77qqjpd6e', + 'bc1prvluvnph4v36wuye62vejplhpu8nkyjv438d8naw4jztplvzw4dsxuf783', + 'bc1pe2efk6v84njvss25x5hagrsphsdvj0r9uygkxke0yfls345t2j4qvxwkxx', + 'bc1pq8ruxhh9u8exdk0w5z6zz2jtdf94kwpkweenmn6ygzxqg2vljpnqhvf6wg', + 'bc1pvfmx8mur82k9fx7q6hmgsmntukf8qvh0wtd8y750me9a95g8lqsq0ksu5l', + 'bc1pxkrm0j956yu5l5tljamx559jhfaxk7c630tdy9tlnfgevuwp670swy2d7m', + 'bc1pzc0rpmqyclkeqwks7wewq9afnykvupgtfquw4gutj6uday45yjdsc9r4uu', + 'bc1p6p4gvfcrlh44j93mhamduuzvyr7ezyg0fd5p6q3drg6qnnn4adxsnkjmye', + 'bc1p2hme44vjq2e4fxv38u7gv2fvtcgt3ja6y6k9g0usp0lzsjs5jtds7t7taw', + 'bc1pum78ujgtj6884sx2q3ye47nssd9lfznexfu5lxtkeax46tnklq2s8xrkzm', + 'bc1p7frxq4c2g5swzhelcx3xdfdkgxqnaaz5xaqs3q83h4gl40fwlx4q9umlyc', + 'bc1pg39jm8gzjyhmcyyw00lqfs0u83c7grp8zsdsttjwemdjz6mmnm7qud3wyg', + 'bc1pe2nhcmm9pvcqfudep2t9n54wzzhnplnsxp0jxxka789e27p3582s6pfht8', + 'bc1pgae3tyweaa5qd5czshxm2yh3v25q4t3fj030hh2pl64mxs6fwl6q6xt3gx', + 'bc1ps94nyps7tjjt3r2dvpxkxsds7lc6zg50wdpgkxu352pw7svfcy0q0n8ff6', + 'bc1pftvcfatnjs0reqd7ht8q45flzf2tjn22hcgn65hu3x2y5wh0txdslxz9xf', + 'bc1pxn7nht46qk79gu64f72ljkc0nusw8y6790fpecpespe67mv35l2sd0x305', + 'bc1pwtxvjty24zjsmtucuzxl2g8djtyt0u84kkhvmncdara97sxc0gys077yft', + 'bc1p9pt50nc8ujhy9gxysskrvk8j5gky3nyxpycxlr2n6v707dh0fk3ssyxhjh', + 'bc1p989mxkms82ztlwtlwuhrgcglxump3yhltqf4hy6kwg2qeg8ys8vq6klg79', + 'bc1p4cl8f32l5vmz2na30k2hxdx8djg2lcw9elxz2k45s8rws5jj35lslhhnqy', + 'bc1p9mg7dhctae22csxk5j0uy434x7jxueuq87ppcs5npsaa3kcm5a0sete8hr', + 'bc1pklqa0rwwdqce0wa5wn7l3lvslguu8suffv0wjxj6kx4c33n6uqxszgvepr', + 'bc1pxll06yfq3mwl6hz0h6fp6wsfcv4xwytte5zlgjgsvpq0jzz5hmpqlnlk5d', + 'bc1pc8js2p28282gvjw8vwpq0ps7w04pdjvx57mags29udamw73hrqls35dq9l', + 'bc1pph37e27k3ssm737fedlpsra794n5p29q7au98vxc6ntm6al0h40q83anah', + 'bc1ppx4yt0ukn8rpu8synzhzwcrvv9tcn0xc2cuaznvx2k80rk58merq4wq8mj', + 'bc1p2e3yjpjsm50vnv47hn5j4fepvfxcl0ha0ljvdlpzm2ze6sh963qstz3sqq', + 'bc1px3j0yvkh7qy6p5g86fqdu0jmk9cy3lrcvzxf28sp3uhg5a28juds4fvw8n', + 'bc1p6yala2kf77c3urre69ln3n7mdrv2udptty2gfc5yzzfytmcnkhqstm2uh2', + 'bc1pezpglnkd2dg63huk9ahhu4j0asp6z53lqgwwlp5030dqxf5ahvhqzysl9y', + 'bc1pf8ruje87k3rwu8y99qdzuw34yscjdc8n9cte5tnv3au9wy8wwkvqxwau88', + 'bc1p37hyq62wl7vzltpclk8r6qaeypxxgv0qf4jr7fl4l5qnt3unnmjqg7f940', + 'bc1p9q5xkax96hwtcn8le80fx3eyacja8k6xslxg80r7phfhsyvps23qx0cfuk', + 'bc1p2989qq2t4k5zvsnr688d9mma5d2v5xf3jdy2wgd2vahx68qe0m3sxs4xm8', + 'bc1pvjk3rxpjen2z7fn638ngfh0mdv29ud7wdgvptp4njya54dunmesqz3sup2', + 'bc1p8lm2y73lvr7dgtng228xx74hc38st73amygvk6cg238mx7n5x0wsrpd4pn', + 'bc1prf53z94halzgc29cgzpvwy2t3svdrytq4fyjgydk5tn77rayxmms2qq8q8', + 'bc1pkngwflk3kk3yktwz7y63s32pmrjn5ndsynn3nzd2ry0vp39xpppqleyur5', + 'bc1pyhgklu8uejlxn20n6ffkwqgsqp3u5rny7x9tppf2dhdafgeavwgsksn30v', + 'bc1pq6skvxwphwny4xte236wgqgpnzstgclvqxk4k9z4hgt6j9eqxfesdzza5v', + 'bc1p24atc2kptgdk73mgphv22lww2r3m462c0pte94u3ledzvy25s6xs23tlg9', + 'bc1p0tqynxkrku2akram3jp8fyv7kz0d8e26jugc9f3gjyppt36yvwzs8jruaa', + 'bc1pyxnqmfklufkm8mrcurmjvs748pfqz2lvt94ad877u3txyexjfkwsuqu0st', + 'bc1p0h2lygmz5yt6n859hr3lrk27jc2vtrgrrmxjwhk69zrmdchdqt9qwa7qt8', + 'bc1p9yn95mzfvzyes3cehfaxs9ax3wru2whrfp26tufa7yz4rsdpz4tsp9dq9u', + 'bc1pde9hxaf32tds6qqhaxrhpxn53gycchgzhf2gzgzhvvkk7jsr0xaqn3a9j3', + 'bc1p0yqnuv554vvfsvy3k909dprsepzu0jjes7k6dshvsvh0afrpuhfshd2r9r', + 'bc1pag3c8pp3t66jdfdcscx2zvj7gc3chc0l788ldsaw28hx262hexuquv2j28', + 'bc1pe9gn85dpv08ak06y3h0rctwh5tqj5x6xzesm8zfjqq7uuyyrhu9s24hezd', + 'bc1papxmk5kvp4frp5s6tnplc5zpunq476tzav87jxq6xgp6skvspkzs9adpra', + 'bc1ps5v7huguavr6y039fpcgqc3j7qkzdwmuqkucde37fw04ppmer3dq4957cg', + 'bc1pk4kasrnvzqk75e8p974lmuqm0dpg0cc8lx05cpf6yuf5p8yv800sg27e90', + 'bc1pe7zkzmzgv30r7amnc7tr8r9rjzvhgraf39j559evz7nkvqh8ht6qgjfj7j', + 'bc1p8tpj3g3ds3drp5daeg783j2tjpew8pdz98gnpmee6uj6l8ukf40qlpsvua', + 'bc1p2edvuq7493tvjeyrf3s3qyvakxsqfurvl6xzuazh4hnld908k93ssa96zm', + 'bc1p85eweta5rr34xj3kj77hkacgvhksf6k7mv09v76220jzezjr3yxsdl5ugp', + 'bc1pfqw4dze3k9spju3v4yxxv65t7fe09tta4jgfh0t9h02fjq0cxg0qmzrfqu', + 'bc1plafg3vaap0ulvl2r2mtaz97220sxelzd5mn87gsc9vf5m508lq3sz9vx8s', + 'bc1pl8c08aqsx90kzczkvwyu84gke59692ttk4ghh77sp9cpmynlmqhs0j423a', + 'bc1p0v3a8mc0yytwt26zxyjjscvw3apy56tra7hd0vhdrnuggy5pxgaqspf88d', + 'bc1p927pm4zl7t2qqrh77dmyl2vpesx0gm50ll7u26rp0nle4y8g3tcqn4ecuy', + 'bc1pnwu72ud69pleph0mcjqht0ckt57wkzqrn6n4yd3ltkkc9rpujj0qgswzhr', + 'bc1px3w3hyhlaxdlwacmzxlsdmaqymzqamcgwrzsslvr7jv62s9x8cwsf3umca', + 'bc1pavzq4xs02kqndgxhtw5e2h0sge85nqx2djgp92sd68fhsm0n09sq675553', + 'bc1pszzqthpe9zgws95580sp7uxylrdycq9p6ynxuuph8qvgjtuq6hdsqdgyqs', + 'bc1pddcp6s2z04n4dduljl25qrw8w9s7wy0k4zyp4r63uggc95z0jz9qhurtaw', + 'bc1phnsnnk2red4m46r5d8q7rxjj5asas8a24whc6ksm9zryk66czvus77m7v7', + 'bc1p6qlp254a34haw4yfgg9knqmulctamnldn5mv9r9lupc2e27prpeqmcd78u', + 'bc1pet3xftasta80uwvt366fz5py4ranhpq4zjnsrtacw67mtjzcn3kqw3msml', + 'bc1p26j6m2z3588th0u33as6a4gy9undawswga8405hq23ak2y6mz6eqhnrdpg', + 'bc1pk2cl9d5qz4zpw3fxtcpjqdgecg9s7du9gvj8ygfnnawcn3pmrvuqvjd9v7', + 'bc1pe7yh9y8z0u7t3hxds2ege2uhe3lwtz50mj6fuqn0yv97xazyer4qwva8f4', + 'bc1pujnqpa0auf9p0granvy477gu7y4tcwt2scrayzshgnr0lxx5ddes70hgj3', + 'bc1pr0k9wnm78qrhy9zxjxxm7tywv8xc72dqp9jz2gsz0cgtyj20rmkqctwr7g', + 'bc1ptmv4xztjcnlzh9y8fns79784zwjctxqfum8zwygmukd2qywsfvxq3vm9ly', + 'bc1passv8s0jsh5rwfrkmtpq9mxdfxng9vaguz0vf9nx0rg2u3w2xxxqht25d7', + 'bc1pcx4rgvxdv4alt36n6430aqxa4nqq5gjtmlfeqaehs4q65fg5yn0qp4lfg4', + 'bc1p9xp2nz48r5qul435w8ezh5pc2teqhkgunwtlu5wqffjqgde7vvrsjeusec', + 'bc1pf5ajz80htn2xawhz0urw9phz478yrk6fu274gt5gwlg8st03uglqpua3gk', + 'bc1pslhqk09v6l7g9gxlzu7sk7gdjwstf90k9ga80dgpe7cs0lt8ftksghavfs', + 'bc1ppw0pqsnzct3ydrcya0zffap5pzd8arappv5c76yddkg4g9z98flqllc9dp', + 'bc1p57lm9wgtvrqvqpmsl42gd7fuj7a880z905srj87sh4kex8pmmv8qskrn8n', + 'bc1pcfmkzd92jkgn5ccq58rvxgclnhwznul7spl3xyj07242jexv4ggqp7dxu6', + 'bc1pyd5vqy48fc2dkqd9gwpmqh32pvz4rpem99unzvzqghlzj06403eqkgmnrw', + 'bc1pwk34avuw0eezncy3vpx42asffe49466peushvw2ume28p55rfykq8cca5n', + 'bc1pnj9k9lxufc2wand8qmpq93xyclajgpmmtlcdxxrrwwv0dlejj82q2tz708', + 'bc1prkuk46zha0tynl4ye8wunpr4z077wfr79gn7wlf7repuj4k2segqgskxy2', + 'bc1p43elyt4xu6675uqgg90knlqsatl2efwe8rxctdpd7vyu0nmx2wsqy5kn4v', + 'bc1pudep5uxq94f33uuma0kcglyfm9uhzl0v324ajdgvd2p4250ja5hqra6c94', + 'bc1pwwx2gdpnglxz5g55jc43zjv8gw5wj0gl8jmudmzezwlmr5eknfmqxhewqv', + 'bc1pftkxdl9r0p58z2gtr3qrm2zalsy55skfupwlxpnagwcdk8a69k4syl7q0z', + 'bc1pcp9df4pzu9286kulz90dd7rvjqsp7j96n8d99avcv6y6d52tpkgs9dssnw', + 'bc1pa0cmdxw6wpyt74wl70mwx8xvmnguch7vxlt765c9zv9fphrrntsq8l58ze', + 'bc1pkh59u05ayelaau7ed7vhnttd8ne8k490eynxgn6mlzzl8qe74s6sy6hf9j', + 'bc1prtsvk869ppkyezjr5gfh0md5rd4f67uapv8jkyfwfsfzeh9ue47qe4hdxs', + 'bc1psnfhufxkagpzf5wxuf0uph9ewfj3v6e7dst6m69rjuzj6jkge05qu9fgj3', + 'bc1ps8u2rqyz7hmvlwlp4pltut0wx3yfs0nfljsgsetdwe9aw6mwrgqsy98c34', + 'bc1pqll3wtcqghpt4kwdkq2su8xecrt0k2a7khwsvgzh76pwfmpcav9swsculg', + 'bc1p6znqe43w23psy9ph6u3c5qay9f046h67mm3e6fnd09pq9hxvpwlq7p5p2s', + 'bc1pvhsfaq4rfw2lrr56rjr5hm6fkpekurs89lh2xtuetm7fyjx9nm9qzxvnwp', + 'bc1p6ah9jk8f646j9dugguryg9c32asvjdwk72erkfe6avnxkzfkn2jsrsgym9', + 'bc1p873jgpcamw4jm3zulshfw3x6vc5hxpzv6twgrnjf6k97lef2ax7q77qsut', + 'bc1p92yzefhg4zhtgg6ja4xtz9rmjnl0d2v26880y4ca0qu9p2kq7uaq92tync', + 'bc1pnh4uwlmqp56wvrg45ff83dlu09aev70trm9znrkzsc4rnwaprstqh0c8xk', + 'bc1pjtmkcudjaey6pve3qps8htpss6epmlf3xa53xx085gj25plezqrskgejky', + 'bc1pl9kqpnnaswvwhdxyvwpszwlqyhsfvtsnhfqwvmdd0mm8rzw805lqmu2zuc', + 'bc1pp7e5hgwh2vl52zmtsg2szvp0ls6wp6673du2qrmh3fy25u25qw9s400mfg', + 'bc1py80nuvk2m4xns6xg5l0k2wdtg7hath6lghcrupcahr8knlyr6daqljsrqd', + 'bc1pmqepnfttfrjfzrgg8expazwlnhq8z5velc4yfketswy8x70qpvkswkzxvc', + 'bc1pfh24d0aej2sxlck7saq4e446dkd8lnmqlltpp9d5tp5klaqpfzeqjqhyw0', + 'bc1pf8aw2ktm7wqyt0pw3gfv83rvj9gsg4k59ug6zxsqhj24crhsg20sjws8sk', + 'bc1pn7964f7usyktfl9l5nglv4zl99892ecureesftprzetdlcnqxl9sy95lc9', + 'bc1p6zs0wsd622avlh4r63tllma9j9sjc3ggealwjh3axa9gxe0s5snqdgqx7w', + 'bc1p93qdxz7t7na9ttvx4qrfd068znpftq9yp8w2487zp49rym92c9dqz8ppvr', + 'bc1p7drwu6ahwg8lxtfumyry39e2kysam6fk5l44xff6d6h39uh86w6skqtgy5', + 'bc1pm6n64jew63cm9fxvkn65aynw2l27khp0s8s8eqxl647zqje82t6sv0csp0', + 'bc1pcyftl5v96ap8w24x8c5ew7csggafvwufuvwgxn5hax6pvceamdas0gm2k3', + 'bc1p5rxhyx93jjzllkg5694uqhfdmz9ulmzcx9ly0tndq74qdlw6m60sft9ak0', + 'bc1p9yyplz4tsytkv548jxcqphntj7n2dyl9fzlxrcnngmzl6j4txvhs4whjwe', + 'bc1pfnqw4k4ecpe9w4n3rdgp9stuqaln95vf8ymwwema3h77e2p3fhgqf08zcz', + 'bc1pg4p4kxs84y39nlwsmxn3kd97g06wy63zdmngq9kceqpdctn8v3cqc00ddr', + 'bc1pk3cct9032h204zpqu3cywc8mak9pscys9hgkcqywhkw2js0jdw4saydwxv', + 'bc1p5dqqeq8mmdydadn5cmw8cr4vphlj4wfphcew7rhkcdyqrlxx7uzqxrsxf6', + 'bc1pku0da7v2ngkpmsxlhgku4m2gh2kfnp596y2ura0j4mf5a0xfs82qpfqnmy', + 'bc1pn9muhfua9s62rcswgfvnuvlkqn56hhxuu6yxqc40c7ktamr5tp8syc478k', + 'bc1ppg6yaewsrtpecmw3l8ayjhlxdygkflwuqmhl6sdrprrzqmtuafks5rn4wl', + 'bc1pcfe83gn6sdlmlv5tggeq60zw5pe0j0puaxrdsemsw3wtcck9myqqsjvjkx', + 'bc1puuquc4zzusldlmf5sd0ym6hhyh8a6zqufxf8qu2dxsyqlqa7zstssm88dq', + 'bc1p9vgpwl6pssk50vcfcys36f8yq7rllc007pg9xulvmyn5686qghhqhczsqr', + 'bc1pewyp27d8td020sq5f6gcepszsqz69zre3894fymst4rfawudr7fsa2h8au', + 'bc1p2vlx46mxmzeep743p7n6584ywjq8agpy9mvg5z5gsq26ch306wxs84rxkx', + 'bc1p453r94wgvd4qydu5ayqtaxujdqj6xzlfqupm0cwhpv00cs69v3zq76xldm', + 'bc1pvtdjphcexuuhyjwzgdfq73hed6dhd8xwa04rtq9gl7zxtaej6syqlq5320', + 'bc1pmspq2ref5mt3lxlzwgq7e088cwju2y9yj8260t7g8k0y80lzln5qwqke6t', + 'bc1pm8uzu7ffl6hazddrjz2wq6ns8dtzdexngpj4wd2sqlme8t0jvrgqau2x3e', + 'bc1przd2rhcnewnscngzxsxp5yz5p9k88hlknyl29k7vgq2djq49a7ms8q23xh', + 'bc1puelp7em5krt64c54ay7q4r5z0wg5p39uf50y669elykder235fxsxq3yfu', + 'bc1peje8rnywzmca66p577prd93z7uwrz70wuesjxa8m8aqrngp4kxpqf3ef45', + 'bc1pxg6t8qy309y8ehkzp87xlwf76c7ue7u2u9qzw4c7ghsu6t4h26hq248k6h', + 'bc1phu9zk846z64ysn8u9lfkx9pzf6na6nq8uycd03rmjs6434z2ndesyfrvpw', + 'bc1prwc6zc70spq3n3sjqtkx8we58dcg4lcxghwlch6muz0tsjnsd69swry2tz', + 'bc1p6tdu7nkaxhuee8n7zv6j9jtmv56mdd8a6fa57p72f36ltqp0dp3qe6dzwu', + 'bc1pqq5m5nc938xdacw3msdva4hx45vmamgzjfrpz42nyg5lrlsq99nqtsklph', + 'bc1p6uzm2e837zyqwe2awg0dpvsfa4akk0xehcdq70c94xqfaqhe9j4sz3kjk7', + 'bc1pj3xa6mfqv4krrfl0vmyf9zjvhpcsphtauvllv5e0unrnqseke56qz7kt69', + 'bc1pzllsl9d36pff8cq5klfnhn3p2vhl80mhwg5u8cql60dldfj9gr7q7selqz', + 'bc1pr9muzns9lafvyxl5qa2xse5ydgpcvjxxqjd8tewelgaa3v5fufhstsuqer', + 'bc1p0huwn4v8dsp959d3u5te8t6d992cy3uwwkj365els6qn7tudl8lsfqxg7l', + 'bc1p7n5rmt74nz2h870em276w48rcv7t7kgs6lxrajdcv93p6h6pwpuqhxuy85', + 'bc1ptkfcymqjd5ehw2t3trz6etu9rvcn0rryarkx6dwqy3s575x6twjswarwj8', + 'bc1pqnezmvet0l0ef3aan8cf3nampn72ah9qjn9da5a5qw4ljrlxjmpstes3h5', + 'bc1ptrl567f60nswqf7s6mz2vs5swj7c85zzys49xl505elll2rpszzskkmeqv', + 'bc1pu0wufndhwk2xa9vs5hesxj0dqknl37zzpuu766dgp3waxvwspqxs6f9hq0', + 'bc1puswt8zcdmg7zysajyxff4w2wwkzh8wtlcwgamuvhnyawr9lv40zskwxgh5', + 'bc1pl672vsqzvq6n52r8ltqp3yysmlwyh3tqgkpssyef89es3ts2ny9sfavpuj', + 'bc1p53d9ren0ytuh65gpkzn5mdq6fqye33k5daf09t46e7q538payx6s6emfxd', + 'bc1pywezkydczan6evpqsv2p76xy3y0z9hukjp4truf7glcv97gv6zssg02l2s', + 'bc1paf56ayvszfw98qx0e7xc0l8ygzuwt8qwnm0m23gps5efprvxgzjqdt5n6k', + 'bc1pnswdwtwwts3fglgmk45t8lmgvt5780hgjdff488cuukjnrua4tespj6t8w', + 'bc1p9rjdnmppms4j4g720zl65y6459qknqyqnh4whczdv5aauuuxh2jqwtlc9k', + 'bc1pfwf2hfylprwxxeeazauq896pa0cap38xtjcpxl29s9mpmzsg8xcq6h73sx', + 'bc1pd6s7cp4c6zdxzslk4exquyf8xujhuv8rm505fut70kf7z8vrwn4qmnd2eh', + 'bc1pepm4h223es4xs4h6w55f7ydeccm2kerx4mgffvhml8x836lmljusxd4maj', + 'bc1plmnedpm8fs8asevrwl03wx8sstsr9krk7dvvt9qy2ryyrhktudnslcdre9', + 'bc1pg7ntrvvr93shrn7lncnzz8fja38kk7fqq398mcww8dsq8ngyph4sc4gdyh', + 'bc1putp83u3saqptzxlvmfs2ldr2v3k7w5h6cpr0780n6shg0uyef3nqe64lyk', + 'bc1phkpad7qh45qv5fxpt479d5hs575jryq4u8jasqdmndmpnrgs922sh79e9f', + 'bc1pdpunm0rwr50yerfres8hu2hlrk7d3cqnteyuuyrkwhjs7aahv52qfmq3ed', + 'bc1pqnfak3zeqd44dycstxzs9wj2tf9ec9d3v8l5z4ref59gmzms7t7ss6cv5k', + 'bc1p46t72jvwknytr67d444jrjs4322z4z88rfmdt3aesqv0kmxrag9qa3ykmr', + 'bc1prqtx6dz3ujkhrh99vywlhc29m95w3jpyahvkyu3zrfgyhh53q66qsr65va', + 'bc1ppedswh5hn89ehpj2srcr05kcc0yskfwuzk8j5myc3mnt3qw0d7zsgwy8p6', + 'bc1prvcezqavsz8rymmez7mtyremsxwwvs9u2jkdzmnel0mp507tweyspd8luc', + 'bc1plce0nafqhx9apc7llnuu2lrflm5ezzvrxvxyph9g652ewtggm5nse8c04w', + 'bc1p36tjzzcwv3r79h4q559a3778fkddcsju3y87enqj0slx8zuh66vqf4d8jq', + 'bc1p2vh6pwdehq04rtm6e7gv7kckddj2mtqxekpmwajcw5nrxjqt888qnv46ta', + 'bc1p5sjstu4txplzjfqrrhjzfc6gudrdeh0fkpdgc5fvtdnwzemv5qesdrm3vf', + 'bc1pnv7ntcuqedexfa29shkktup82dmgycl6fhtuukm3ysepjfqp4qdqv80n8r', + 'bc1phr5z65p7lvu33rdc9a02mgdx3wnart8lavr60wf7n4s04qf9rwtqcatd7x', + 'bc1pv57tzfsrm0p68788e68d8wz0rahgqzscmw7zzc00u42fne70f65szuaxnt', + 'bc1pr9n3fgm2ar0t5gjpjt6u9dtw2dyvcpn8ax58fwry44yxdqpvscxsn8ejkc', + 'bc1pnqyytpdnfvakmr5nh6emcjnhqnxh9z94674k7z2y8zr05zrw8egqmk9fcm', + 'bc1pe3an2yh72wxva6m9gsf3ds7nm95mqsk4affc7xj9zue7m3zgwgmsfpsqxj', + 'bc1pv8unzcdqkpezavs4wpqwd8asypg9g389s724x0yn0unfhkx9g6psqhryjz', + 'bc1pm73ty6xd95xu96hjxetqmuydh8prk7e4daepg8w6n9t0uhnxez7qyfeye4', + 'bc1p9fyvcd5deqks7d0l6h38wzyglvlyhp6077f8rtzw95ut0g5gaussy2kj6m', + 'bc1p3rl6gauq9srgx9l39zy37vkfluvynfkdp7gtw3h5250h7tjnpfzslkzhwy', + 'bc1pe2dq05emu90krwshwdfnscr9mhtdc0ushxwdw2l9ntaxqzk5qy4slxm6fj', + 'bc1pngq7m0fmf7c54mccgcsxufqh7zszfqksd8ed55eh6mm050wak9lq2azyz4', + 'bc1pxjfk6knsqr75a9st7v6fkmve76jkufqz3hyrwyanauyqmlq5q7qs58p43c', + 'bc1pweqvl0eqzxmy7e3frktx8h9gefha7r733qptuku895lxrxl08kuq2s7jxn', + 'bc1pjtr5g90kh4793ajqq8dd27vrlvpf2j47p3xkaga5ryedcvpx5mwsyl3v79', + 'bc1pkn4rz05m4cfkw3mjhh9z43477868xdjrzz0dxjwkjrq565cdxx7sw2reag', + 'bc1ps3rdaf6g3hnqz347dw8ljk0z4y407tcdkk82e84eqrqdsjkesrlqdel9mw', + 'bc1peg094ja76hqj5d9y93rdgrls7uf29rrus3nrkyqqz4ms9ang638sdj32jh', + 'bc1pkfhwtr4rn6nyl7ct2yxxglq60qr0nusr2zm5t7kp98mu3w2uh3dqzvkjjn', + 'bc1pytd8ayd6fut06azy090e7g35xla9pcd2lkje202cm2p9h6g6sddqmt4ctd', + 'bc1punpttta0euqh529h6jcw9h3aszag7pf89kpf2mzw2t3pfcwa0zjqp66sjq', + 'bc1pk9kgvykk5l8409an8nk477g33gn4wawhwyup4smqf3ht0czedm6sqxyqkn', + 'bc1pu24tqazhmrgsv7w0kzm60v84cn0mvjfumltnvl5n5j7l85yxmmrs8rqa78', + 'bc1p8sduagt8hwnkc3sz8a3ss5vqe75sd7lp3r5ux6ywmlu0c08677jsp8xy5r', + 'bc1prmy5agjlp6glvr8eeh3rgkfzvfse9kcn5jw3lene256ht2dmqmxskxn47c', + 'bc1p9pfde9lpvptkxku9je3e59fle6jh3u03x68lg9tyrl4jkf7ve34qysmppz', + 'bc1pgjcqynw7u7s69y6384vxwl7t6u87xg4z4chm4mumncfr0xh0xp3shcsp0s', + 'bc1pljkmur34sez8y4asrk3w9v357vatvacspakgl2psdhhrg3zhehdsp3k5ge', + 'bc1pwfhvxgzkpcn4r6sl732spfy2ppfm7xds5j3cd7l093zx5n8j4j6scpwzn7', + 'bc1pf56cfl2fugk3rr8gn2v0w5qlhd98szwcrsays45ncgyzjhyyzp6sc3f6xr', + 'bc1pvzxfw0gtln544w5j9upl5usqyqxta2fcet88dd5658zvjgy9yucq6vccla', + 'bc1pkhjh99j6hh703a4d6k7zwdaqsj3kk0llquemq4qguhs5023384aqjyam3v', + 'bc1p3dtgk9yfkj83ru8yxan2mssd6ajn55z89y7a2wqpxwjxlm6yf6jqs2fxka', + 'bc1pwv4avw5n8r968ds7gar2prre6cng53nlzpyvcwp39sz8hz4qpcqqe29aj9', + 'bc1ptw7t4ahzwvun40p89j8vav880ky9trfp4c8pjvfgthqwrt6zem8sefnkce', + 'bc1pgfke95rd8tn7wg9f3nzjlwytschl8mqle26zjwn8lthvary57n2sw9shxt', + 'bc1p89c2yqhsdhgkpw463gvc7at6yxajj52av23exjsgykmhlwt3rpws6jdq50', + 'bc1p8sjqjturwayk6d88at3ypwcegzmjx0wyhwdsrttnrugh7t328pxq3x5gt9', + 'bc1pjpxvl3v0dfkjhhugjds3lnjg0j3g7kdwjjwke725jft3hhe8v8yqm00mnl', + 'bc1pvhde7d0h8h33mnhjj23vfjjr8l4kuu6xk3v2lmzj6532egsysqsqtdaqme', + 'bc1pnhd0pq7a26hsvhav0psdgqkk9we26cf3cdcmka270yxw0a4es54q33wa6e', + 'bc1phpu50k7rh0sdv2ezhuznkjrz6rzm6n4jt5lr9aezccs9uhqn9mfs9falq2', + 'bc1p4jq328ew2e0zptqgq9gza4tcyjg2hknvdxtsft5cxnayg6dsapsqwugnf7', + 'bc1p5l5xl460ezjnd0j9t7fpj9qdpl38hepuprgagt9fp3rj527tn5zq5r2jsv', + 'bc1p6n86rrjqvla82dypv75s29ndugev6mt0j0qwwhgkn9guw3zvvq9qz6phss', + 'bc1pt7pwq3en6na0g9n9d69ple2c0m6534fcwhh7nzd45m7qvztvl5mq6za46x', + 'bc1pg8ddz3lgdyzezlrrc0xv6ur2e5l94ymz3rqhzeq6v7wa7r0haqusgpvzqm', + 'bc1p4aq7du7juypnclpjush9wnr8y432zn4q4n0wx8sfhr6rx0pasacsaf8d6w', + 'bc1p3sggrqwl0d9kknq4lmlllcr3eq62rjp0r3je9acyx9xql07envyqntr8cy', + 'bc1p3may9yjw6lwm80mlfx7g9z8rxgyd09q40k7qnlkwhmzntjjk6lcs6hupym', + 'bc1pexjyhtc4gl5ngafr5pp9xya9q6h8x5kj386jld3vlemy7vjx834qf2lpws', + 'bc1pnlwlh2gd93g8smc3j2paaff3xdpxlqaqrym6ya77mflfkc3xs6dq0j572h', + 'bc1pntgtj3kk8yf9pq5qh30rvmn4zsfcjgzz29ch60pszt35df3jpgms9zyt5g', + 'bc1pwr93d94pfy02q9n6evc0d474fpjyz0se6fewf9le9sk2hzjgxknsvhpx9f', + 'bc1pvzzttfpzmwy7dpr4e5nv6uewrvv727mjhv4pzwv0kprq9xr60dvsv6kys9', + 'bc1pe39kat0zkgy89przhe2ff367v20276jtqal3g2jmyew7rfkzluas6uqs53', + 'bc1pg2f3h2vvs33t7fp2nf2ml9xpyxh98a0fc7mu889tvmwc678wjl8qmevpws', + 'bc1ps5e635jjfcme8ygylusqwfk48zf0552al376apmaqdvm3ekvyfps8zcthj', + 'bc1p9d94cj3s9f9pw7p80au6rqvpsvn7aafjgsz5tcwnlmh5lfca8rrsp2m0m8', + 'bc1p8v7qxmwt5vgz5tp2s9ay9en2sluj76fua4nzdjk2zlz5k3d087jszzvwat', + 'bc1pxqsvu5zzp87cvweqm4ukx38c4lcq6tsk6q02gvhe9d62clgx0znsgc8haj', + 'bc1pj6yhajkas7guvt2we6nmh89sqlnxkdxnhkrpnvk8acc89s6fjvfqz82px6', + 'bc1p0jrejp9fdujzw733vyxt6hs3q6q96yamu07nmvu84rakqutg380q3dlx0z', + 'bc1pa3dc5qjugg3y66fugahr3uydk9m2vv2sf34j9zhsk5e033zftmmsurr38f', + 'bc1pppffv2fgmryyrv3e2qs5x5dj95xaj478e2s95celpxf7twjyt6ksdlsx2v', + 'bc1plculyece6g7d2vvmgpm3d384uxlq65z4jd2sfsrvh7svwatjaxwsuj3gfu', + 'bc1pjmxynyrn2h3zd6t8mjskp5xfayrsnplmnvvutvl2pl8kxj5l25tqc3enkq', + 'bc1p2wcyqn4lcs58k38g6vhkm2rtefx9m9n2m2np76dtf6u83m3hlq6qstl0jz', + 'bc1ptkpw0zuy9207p4zvmwsdk3kyc5eafzl7ld7zna96z5syx9vhvhtqwvhpwa', + 'bc1p2kzdcaxdrvuz2grejk0ylkel387a5anr6xerqjf7e9us86u88kcq5ftk4a', + 'bc1pjtr0l29e2ghxduh0gh9jlj5v6uetp26666pmce299edevprpqjzqafahdp', + 'bc1p6uugyyp79dj5czgttrgq2fhavdtgr309skp0jejs4tnjnlxh8e2sek6pgw', + 'bc1pmarkag47jclzfgee3fes78m77u5mshgwn7h4adnay39k88mg7u4qth9ug6', + 'bc1pmdx3antnsmmlq7r9rufngtzwck94gqqml6st8nv0gmtj24u9dsjsevy8a0', + 'bc1ps89jfj65ephxq22kgnjsm4hufdxrf7eksam4kkku8r0gv2skztjq2ar9y9', + 'bc1pruzxxz84e3t6d2edrh24vd7av372v05t0aa30s36nnvq6p29rzrqeywjwl', + 'bc1p78dgz0mtzwxunvpen7a0ng2ey58z609v3fem5muvg7gdmqguay2qx77n6a', + 'bc1p05xcu6v7v84w235fvlpm2era3cljz3t0knyvzy932y6jv2hjse8sqt2l8h', + 'bc1pk6tj6tffsdw0ke3fllj6u8eafs6pwxd26em963ntewtdgx0mexksy6ds20', + 'bc1pqz2sduvdhqpuhk69g2w2u2uc5knwqza8hkyatfs5fg7nulek9j5svpn7gm', + 'bc1pd6q4dv5nmhcpx7ecnhljmu4h7szrxu9gqhanydjqwk792y8z2a0qj4l0gh', + 'bc1pv839nmpxvh7n4gemxeemhxagh62uuecwx0urvvex5n2d05txdq7sqvdjfk', + 'bc1p6865f9xtpe6ncjh8y9e76a03jj2s95rwy9503jd28tlksqspnruqun75df', + 'bc1p47cg4uhyaz74yhkk0ha0wjhr8xsfrjcm70fvewm4yezuexdaawmsnf4pzx', + 'bc1p29mx6h5p80fg623cknr33y6npnmw73ms6zdg89538hpdq7ng8utswa2lck', + 'bc1pg9jyr4ahpmvw7su4vsdypthglgk8j4c96gp0hrzymek89rytchyqpncx7u', + 'bc1pzzpkkfmjsf75zx0welvfhyru4xxvk5pucs0vrdlueyfc3mcjlq9sqcu9s2', + 'bc1paksx8j45dhtu5lgarsz57xhf0mnytxn9al0yqkjk3r584zdpcqxqqaeh7v', + 'bc1pvrw4x9ln7668c9przpkeg95lzysj9ukcdxa2v7yyz6rnpwjs9vlqhccyfx', + 'bc1p2hg0we6xefcfdt09sfwgxaqm2l2qhwj8wm5rsdrtujcwlzs9mncqtmf767', + 'bc1pus4a8nx4guuq6zvdja6gk2cv90ckjr793h6s27gyhwevsu9rsa4qhkwptw', + 'bc1p6lyxe04l73xwtch6wkwdpu0vgz8f40wle787qrnhyqsuya7t98dqwfp49x', + 'bc1p06xjlrmhlyhwpxwssax8pmxgewh2y44wrvqmyc8r34hxzp9rsu6sk6upa5', + 'bc1pt5ljexu5ucshrwvd7807nwealelhfj8gtjhv0tkh4xjsw3z7wk0szxc562', + 'bc1ptze5c73p8x6nhhsjuhvds6t3a3xm80048u7k4hxx2rn843dmw83s3tvdrj', + 'bc1pj37ufur8e2udymmrt8ee3m80lkm93umclnzyg9qcd9kaztv4r03qmarjd4', + 'bc1pj7edu2kahcy8prf3c935rrm3c748hlls45kk84yxae3khnl0e59q9ns6x0', + 'bc1pzmgvh97jg733aex4753mx0ah7tqqs93flfe70cdpyvg5hpq50slqtr6ght', + 'bc1p4havj4f9qxvxzd70e2wyz7rzlyfr0fnqk6d0yn4ks2yjrs970lsqy6pe70', + 'bc1p0ykpd0n0cyfggp83unsv55ypf27znra2tgtgljl3mzj8glfvsxcs2yql7m', + 'bc1pmqt4ur0y7sdqydr45mzpy2ll5e3xrqf4wrfal842cyw0rf4d747sk8thwn', + 'bc1pkguyvv43m34mgpph865d5mmesyfmzymmxqt9ex4ewyakh554uwgstalzud', + 'bc1pkewdy7ees4e7wkd7w5z98z02w6edf0rlnpmekdp37m3ttt6sqz4qgsj264', + 'bc1pem9ud098dxe8x6ytu8la78jkmdkkyhu3xcmvg8r7d7qkcks4v9xqsdusjx', + 'bc1py642vlh97zlgv8ezuukhfyfam3n4rpnf8gzazw304v4kvkjgx2tqedth2j', + 'bc1p57zkyepmlk4q8fuk5ghruhq6ha48lnnfl9celjetlfg0hyujf7lq9gu92k', + 'bc1pflfd44je7y2jj4dg67lzfvx892mcszxv9h0pp7z0majvkefc49xq9823yf', + 'bc1pdtynt40gzwqqm9cy04ksn80lxthxawhh2a3phsw6sqnzg8j7cmlssd6u5r', + 'bc1p4c2q70mljcwgyus8c0ht7knml84kskudqflug8mzdqcvevk8n69sscj42r', + 'bc1p65hx0xc2f4xp5mzyla050zqguw4p887eymu90z2pj6us4xpyhljqrq3ssf', + 'bc1phts9v7k9gr65nv7x6cznxums3kkrq0mtfx3ctqta3jx3saq9w9csmhe6hw', + 'bc1p9ue3hh9e8ulxvrs6utrfdfk4uq0expgg6kwp9p59fuz7hjdl0lrqvpjupg', + 'bc1pwdvlvlgglkmp08fhathyfdumkpy478a5r8qf6wgydaf943waskpqcnl5e0', + 'bc1pdlxw48hvh0f5axe3xq4h7aw0zc805u20q3lw0tcjmvvpsqrvx9lshplgk0', + 'bc1pc2p0uj2wy9vh5l9x2rg5x8g76dajxlvlm4pqkrs9hqlylrkagsjqyy3e02', + 'bc1p2f43d5xh0mr4d5vudrhyzxuv38k0nd99k34zvvepw2lxrxyftupqr44zly', + 'bc1pmpnvnece09efs5n6evzk0y8lajmuqyctygl6wqwmppujz7rx7xqqcs0l9q', + 'bc1pnk9849p9htufzskdcnn3teclmwntn60x79gvvgjhsgu8vcwghaasvcn87x', + 'bc1puyv3mtu8x5l59ujpxqvt3xr2geuhvtlmfveem2y3rnq8slrmkq0stg64uh', + 'bc1p0wnkhf2yzjk6r24urt3l75n94ead7k08ktudsvuuytx7amt2cz6slyh3r0', + 'bc1pwevlpl92ggut0ml4y0cr07qklk58726q44z64a7xgrrpelj20d9qk7cx4f', + 'bc1pzq2ekzwg49eu6sgkkp65sxhk0javl6586c9zssda0s9f0ea48y8qyyj00z', + 'bc1pdmtwu44chk30lsgj3z6qg4t72h6axsq9rlplppmp9yw06vs56p9q3t4frw', + 'bc1pp86cu4rxw7hlkla6v3289g3vjrcratukf3r8vekxfn74ywhqq0rqr4nkej', + 'bc1ps986ssqzvrj6ysh5rvva5cl8vad37hse2pgptd4a0txhlfu77jms956dlp', + 'bc1pkep6awfz623ufp8dn25jlnsx8283xs3l4rtj3aygzphmdpx0uags0ua4kn', + 'bc1puuyetydr8npfz7wq64u52kewlw37v7qc48sjaqtfhqedeyqn32mq2jcn37', + 'bc1p5f5ccca4qxscr6n6e5ef9cru65j744haegxejhshpcdeh82w759s7n5pq3', + 'bc1p99uf3ssxjkwmt4pmc28fmpf6kvqdnyl8zng5wvayk7gpsdy9h8wq7hwtqe', + 'bc1pp58akfkwn4n4e92ruwgp6s3n5mn6t3k86f8wytm3jz2ma8erqqes7xjltz', + 'bc1p96d78ym97vnmfg08u6r7tfp8uamef6cwy07apmkdf9asjrt9kalsgjs8uf', + 'bc1pqr0hapsrx8a9ua52la8xjjgv5spsuls0w3jqmjf5deaunxctwtfqhy0mx7', + 'bc1pyz9alfcct9ly90qtlz44hnnu7kx84aa7kaa3h6ufcv0n4kel5m8shl9j06', + 'bc1pc3yvcp45ewsftesep3g5z2vfzq7q2p35saqc055s6w36n5l89sas4syqru', + 'bc1pdjckvjuejmq5fv2x7dl9zg03qprxk6sfzz405l9l5f9qxuq5ftsqj2lmqc', + 'bc1ps7jychcgxgf4n7zeu4s6xzc34v5ydtls7cu2q879gy67e037uv7skm6f5w', + 'bc1pvmqms56ljkr5g0hhd22a34pa3552r8eycsk2wlawv0g0ke6zg4pqahga7p', + 'bc1ptrr30cptrntegm7tqfeuh0hcvszfngl5j8sxngw93cusrmk3hdlqkzmtq4', + 'bc1p2hrha5jm5d3f000tuhcf3aleum3m9xw484zyupj264l6gvqy257q2q9wmp', + 'bc1p7ks7gahnff2ze605lkfmat052vyeunv2579ac4xw34kjcxczx0nsh492ra', + 'bc1pekrfdkqp5ng5kht0974fe9sxr26xy03eegk6mft49a6lr4mzp6uqfc7zpu', + 'bc1pjppjxh2upduhx5y23ahufuc3pm8xycxudj30avuy2026883pt8fq5ue9ly', + 'bc1p8kjy8g8plvt9kdwvvx52z0vdpll0vatur70xdgj3ktcpkwjzk7nsc62zrh', + 'bc1psup5tdvss5cjhj8tpatkh8027u5z4yf2x3lgqva6fcreetvgvvkqfhu04v', + 'bc1prcwfjnfs5kytyzha5kkhl7kvjll6mkljuphra3tayxl4rp9kzncqsjthca', + 'bc1pn0t3gnppwvend3zyrpa9z6tfl0k3xtclg3dw863cxw88z64fhf6snftcp6', + 'bc1pe2jqyw0v2xp7fz3p9n7lmv43dczs6r3w2xy5p902k38maa4ketsqalrz0l', + 'bc1pufssugm0q83awnk73d8zspkwdjxew3axs7d5ej7aueuhyt7glwvscq4fls', + 'bc1pu0j6zsglmx60psfh9vcgpkzyf552stv2wwtzy5dsdf589nghmj3sv4u7wh', + 'bc1pr30wpw5qealzj33exwa7ey5p38msypp4tlw5vkhlmufcuqrd0wzsx4ay84', + 'bc1p0and0xyl7f72844aamdaehjx500p9xfu6gxvcxzvwc2dzu4ht44s9gsuar', + 'bc1p4td9y05qtp9rwy5fczfunph7utsmw2zl0waey7gfkyfddky4lles6yppay', + 'bc1pxdhx6vkgp7xjptgz29xj0xd6p7jgtlg04xf8pvsael0wtef4wqes7tegu6', + 'bc1ps2g50urtmkd473xc8mugqpmdlgzpsa224g7mjettzfe86qd6wnqs0zc0q7', + 'bc1pf43pqfuhsvk9k53jhmjgnrjmqevsdzj328etft358wzvyesxv7vqwjjuuj', + 'bc1pyk6y7lqxn94zzxy27rvelqzyfk3zqzacxkj6v6q6h6uxutus2muq9h6qy3', + 'bc1p7ngydy8tx6y8rrvseezja99aygmlpwuwsnshse5m9q4yfc9tx04qrynx3d', + 'bc1prkw6e2f8898lrxthx3pz8gny5x6q3yqgapty9almauswux84hteq04umz0', + 'bc1pj4mzxq84ljgjct4p8gwlwee3ku4a546hgvx7gqtegc8nutjurs0qdukeg9', + 'bc1ph76x8ejy77ep5mrgem6scsa6uk5uhnr2l3maqpqy95gf3s4qvy8qky6tat', + 'bc1pz3cql8sq5c6xdnrjmmca2vza4hsck6w0yqr8a6v29gezklvr3nrs3wnqkt', + 'bc1p2un7jha7f74kl2xysp959mqw46a56czy6pl8lfmfn0hzyavrlcesldqk36', + 'bc1pvlp2j2qpde6sezdap3vjxgdwyf8g542tqjlz2n477m6j0fagw0fsgsyft7', + 'bc1pnurgc90v686mlpqucgj4er8vx5c0wcu32ye8p0n0dsrsyxnysz5q7zsuw7', + 'bc1pfsept3yj6p2gfgf3azxg682kj77xpzj26uegsk0cc0j9fku5ynzq82493p', + 'bc1psu0qgleefylnw70hldsv76nckx0vnu6km8zd3gkqxeaycnkjamqsqet0ly', + 'bc1pt6glq4ppk7kpdgpch879zl7pswfykfc3epyyhfclxwp80skh4e7qvjnzn0', + 'bc1pr0eafs9m6qhg37cw4zey5xkekxqrwnt82aykfsyt7ucj93gndtysrzpae5', + 'bc1pctkw3zjsfswgzesx5lhnhp2zgqxg5tq5tnreggvme6lzdd3leq0qf2fft9', + 'bc1pzu4pmf2fsjz2ye847wqnt0s4rke58dfljewaxyltywm7u84uxt6qnevvcq', + 'bc1prj5jdcxppln79jxa0qxfm9wyv79r8uq3n0lluluusdw3203fp84snutzch', + 'bc1pskh7en4vrwg3acwmynasxcafyrfneqgantw6uhzvqsp8gw0hzy2s68l8lq', + 'bc1p42tyhgt8wx9h36mj87zgqpcqec2ljssjswn23ppuum8fnqk67e7q96k0te', + 'bc1pts9mhymmfg03z77jxszuy05dgd3ewkc2q08233e37393vtpes63skqexyd', + 'bc1pf4azn4r8sys8f47dae9246jhcxk7vgphexuyzhdfssjm0dtgwx9qpyfa0a', + 'bc1p30cwlw3juh28q36ap372gzh5eu7gs6c8fp4clzetm6knate5wrsqdeewrr', + 'bc1pmx8ekj9l42pucm69cmqkweuy2eknqw589prvgh08ytegdsq28udsllrhxc', + 'bc1p4qfnsg6namru0u5ujep876xke0vmlk3fgfp345m9qawtvn6c9llq324kwn', + 'bc1ppzujgd9etgpjnv05ewyvmsagyndz4zv2ycyhump33p7f06kudneqr73se9', + 'bc1pm33wmkzptfvjjlw5lar0wlqwvdvsy2r8f8azhgn0jzpq98eg3juqk77uut', + 'bc1pyd2r09jhdxv4netdph6jqqujr7w4v4n7zgpwx93sy93ukprrea2qscyyqq', + 'bc1p7emt8scx0d35gwtljwmu9smvgp8emr233rhvsk394rhaj2ueqrksuugfu8', + 'bc1petwkycr7dnykm3fjxfh7536cge4z0vta0hw2x78q3w22uf2dwg3s84q6e2', + 'bc1pnvv5sma90uvdu8e8p59e4s8ypz357dgh000t8q0p757dzkq78fkqc729pu', + 'bc1pvt6sgr3elrmwmlrvjjh3lwaxdrvuj7x2vppp9ufky78hjf302fsqmvjm0l', + 'bc1p85jrw6jrehgl63832mmxs03jh0lyg7hfl0024dcxknuwpgseklcq57wmnt', + 'bc1p87976l0zsalgps9ec675fa7fvhmw4fl9pf3ehnafupkqaa06tzvsxvsu3y', + 'bc1pc05kx76dcvhdktdhvnju2vhvrntqd70fp3hypzmf70efpq5mut6q8fk7t9', + 'bc1ptjf5a96e63jhzhcw958curm2n0udfftfjmlp2yf6z5f8nsqeaqss4lh3nk', + 'bc1pvl6c3yn9678a254wldsc9nhvaw2yxv0t5z5vpjrhfk5ygj78pgtsarlc93', + 'bc1pvcpt87rsyuwtd8z8eg3tx7xxmcq9tnyx6jkzw7pd9ar3cej792psameppg', + 'bc1p8mxm808dtxwd6v73lvm8mqc8jk9k2lvr4m50hx3kg43930kmfavs2xl4tc', + 'bc1p2afv7a30scmxan000k03984hwxzf9x6uv7wmkfxhl7q6f8tgyzgq33gytk', + 'bc1pg5k336s542nea9gkyc842e6n4n5gss02n3wmak8c60z3r85zhdyql9xacp', + 'bc1pladlfl0ja762uxuwf9cyvka84kxwtr657pys8hyhpd375w8acdjs5gajta', + 'bc1pv44elx479rcpr3zw3wm329qancwvmj9see6npmgkhp0f5yvrwzvqsx04gv', + 'bc1p50ec64v5wvc7dqtzlmmam08pygwlq6hyaeuvkdwwsveehx7s98cqt5m5h4', + 'bc1ptucezmwjuueug46sx9l4wf7hmuxw4g8xla2294z49lfrnzr70g9qpvzmh5', + 'bc1plkukg2vwu3kvj2gxh8szeewzhhmk30yecq302d2c7wrpsdjkwfwqxnj640', + 'bc1psxtf7cw34jktxdt5g5hydt87fns4p7x3qs8st8qmsnvjgg0gyehqd35km8', + 'bc1p4gwg274fns4g67g5h8lzc5qypvh2quyngjed9lfrjymyet78f9mqpsdh47', + 'bc1p07lkg59wtl5f67yvlycan7nv4gga67pq9gsljdzvasfhs6u02n2qxmgl09', + 'bc1pd939e48v8cgzefx533axv9d7vzadm94yh8f93e99fk7m8cdcg5hsf4vp7d', + 'bc1pr0ssrgstd9y4ars3ks7fadcanc2jy9283d7d6dqcsr8q6jqwjmeq3f9fgd', + 'bc1p7w5edmu8me8uw3h5kzs29c87aj0gyw9snkap46nkcx0ywn5xh90qhenvm7', + 'bc1puv4lhtukkuvkfcmtm38257ecpc39mm42f2h38pge4cykn7s3z9fsua5qzy', + 'bc1p42al7nkseh74cz9yc3qn4mrly3vqv8xlykxtrgak8d2wsak7cnqsu4ypt2', + 'bc1pf76mcfdy9tnu58s5g5ej4v6dmdyrqnjwlvlqca62ymecfnhqh4tqfdr6du', + 'bc1prdhygp2fmv4wlrr8t2tryvpcq7d4wrzy2q83k7jsksf6em26y2xslujrk8', + 'bc1p0r2d67jdfreyqxfgs2ywpedm0kengf3tgcpchft4f6r2csyk9ysq4rjh3q', + 'bc1p2w8s5dftsqylap3k9c7lxyu77jzhatcyduc2xspyah3wztrrgjtqgru0en', + 'bc1py2ker94htjym422lupss0vkc794udnulk2cpth275ax2w2chgpdsuuhs2q', + 'bc1pc6pfp38k92jxa6m2mn2vpc53p5380hfdqsa43gvkz5p53et08s0shwv6y9', + 'bc1p4uc96vts7k4twkyslfgjmsnd7ft4rzuq0hm3je0jhhmdsw0t3qjq0yhmrn', + 'bc1pjpqf2waep8t8ujqjx5ly78y306uxadlj2qafpwnhg4p0huzs4hashfs2xx', + 'bc1p69vqw635a7drd9sufa4yxdf7huk84p59zqj88ues2pzgcgq2t6rqap6daz', + 'bc1pcgu4ks2n7du0pd2tmy447zqadny7khfnahajzd4k4hywgpcu09ksmhjhkx', + 'bc1pnf8vp5wep895u3q76nazqyn9gghgac8cq0ezj7lqw0r7ug6gpsdqzgnkfe', + 'bc1pyw4kww4rcmunz5gkh5f7jh50sh2gd5gw6mmsxkpf3th0vk6us0gq3hcpym', + 'bc1ptent8vdwjvym948n2v0llhlyz8csg5g745gm4hkenua5sp02vc9sdvjvca', + 'bc1pzf4eyah8u7clkjsvq2rhqfwafsh5q52f55gnx0su4tqjhs2m83sq6v69sa', + 'bc1pvnqnguhsp4j3m456s7dh8dqluh5z8ew5hw5h93kdspy5naydkgxs00zekk', + 'bc1ps7yc7vzym3fy8ccsap9w9xcdel482lqpu6k863nk0jvxm5x0fhxqjtj2mp', + 'bc1pqv6vnj2ch3rcg32qq6sxnyq9vkvsgcvu38sqnmjgey5xtg2ycq5she3qc9', + 'bc1p5lt474mj0newptk4vwaayeeh38c7rwjnjg84y68gcy6hspg0nk5qdjvnpx', + 'bc1pw4558lhf4rlkeuugutfjmj05kgn76j7wy8we2ljlwlufkpmrs6lqsceelg', + 'bc1phk7vf46fyk3s98n6lagv6aaj9qnuk2u0y9979j9dp3tmp4nnkvusge73vh', + 'bc1p3papkjspjqln85ndzdmhccx42jfa9gty9q6j9hn2sdsq33sdks0q2lg6tu', + 'bc1pe9hk4tkrjml9pwkcyl62l6apudkggk2f8cqxu5qkzsp2d9kguksqnwnh3q', + 'bc1pnwqefa4z0zz8nyfc7y94qgzkuqwjp2c5wcm8d5th4ygzg32nj62qpzsfue', + 'bc1p5fcnrhl03z7xpvj0stylwgpt8jupkfs3prjk8d3trsgxalm50azsvsvwre', + 'bc1pl33wu8dh4vt6afsr3jr47298dsg5cjjjflfx7fylsl37y9zzaxastamse8', + 'bc1pe02f8skmcccqsmqmqwyakec8chsnl6p0x38yv6n30599687jk3gq72e449', + 'bc1pfelj84j5ted5twcvr79sfva89yxrxmkjemx93tc57xwx29l7khyqym3rdu', + 'bc1p5l627c88c5yu6eyerx7tptqmde5hzxdkmdpszkvqhzq9fgm8tkjs8y6lkz', + 'bc1p7s32twefk8ev5az4qvmh8cy7j50dx4ay56ke07rhy5sscnyvqq7qcze7rs', + 'bc1p73mfhvp3x4dpau7ck8mh5c5p068ayec0hzmgvjvxk9hcjxnfuhxq20hqvd', + 'bc1pz4nhjn5uz2rdzdkzu7zxvggs96xyaurqy859jzxmccvea2gh53js29np20', + 'bc1pl2cgdqwnww4cd3uc0rjvug3vca8m2n6sc6e3fyv3uegxmtd9cfkqtzpwvu', + 'bc1p364y9ydfj25yttc5a74v3r578nxcsk7gjnnmlhhqrtjpgwx0mwkq8u3c2l', + 'bc1prwve8c322evcp35wwh26rdpzkp9yvmdqkyqewmx83zpeps4dfansn8dyus', + 'bc1pfwaqqhs44my3u9xya70fsp4xxr7xnfd2np235tknvqgnvstfmsrq456qmm', + 'bc1ptrpcfx63xl4ulj00xvvhgs60zz70qvqltcx7ht4fjm92a6m4vpmqhwjrx8', + 'bc1pg7j0ppd3waktjh28ez5wts9f6fw6kj465064dg2pt8pyqtme6dqswdy9mu', + 'bc1pt9n0da6hdz2zjghm77226x8n82x54f25a80e9rnq30aw7sgfck8qnhjskd', + 'bc1p7l3flukmg8tk60f3lm0teku3mp3sue5rr3v52ju0x6mcj3qyg7hqscqav0', + 'bc1p6duxwva4gkekpdkrmquvcquqs824k8majkjt900gy7r89jjkym2s06gf83', + 'bc1p7csw4xhlunyxrk5tt4jjd8fwp9rxd09mcnnszevxd59ecmrgrdlqhsx3kh', + 'bc1plkuaadh9z2yqnqez7fd2r0quhyflsjmvl0pf9vrlcpvs6kda7c8qzfelaj', + 'bc1pzda53v0agjj0yyyu8zlanfr6tys7ma043af80zam44h0ph92m00qs66c3w', + 'bc1pt0gkgxtrvjnecxcdhakacyymrwl0gep3u4wmxkfh9g8wn5qgvazsjfzvts', + 'bc1pvekxald2mejnsc55jzy3gm5z6arx5mrujx7smmyqvmm2xevz7haq2ex8c3', + 'bc1pljaudz8n3kjmsur3rh6muggumqvrudrcsyjrc7zdjwcgmr8uvvhqxxel4e', + 'bc1py4kv8ee2urjy3fc58rfgylgqtqeckrugzrkgrjtgx76t3lx38k5swuu4ln', + 'bc1pwynqyun69vfc0k45gght0gtxgart205kc3xzz8q5u89vcmgp3d7qv073wv', + 'bc1pmc5lupjw6s7vg0rpnjksms7uy7ml2jvs82rk4fpl7qea0vene9ksuljxpc', + 'bc1ps0ezg5g4pvn9zknx0v2an8y7qywzv7k3l8n7qcmthfsv9349twpqf25t2z', + 'bc1pknex9pu5758ex0az6fkcl88yfu3k70x8fvhdwc9ak85gqegytlzq48cle9', + 'bc1p2fhf9cmuffu2xmfxr5rc03pdx9ej3e3e6d6ls4npj6wz7a4eqxvqj2qfry', + 'bc1pfkjmp89tyc3gj4lhx4jscl6ep3pdea05njsrckyhw948rkj9xxtqch5ucj', + 'bc1pfhcuemr7uq02keak42nj6nqa7huvlhkzplcfrfhhte3cw3paqtds2luqa7', + 'bc1pue6lh6kvchkw4zgfltk4rkg4f74t7w08defkhlxg0d0ys4q6k72qt469mm', + 'bc1puhcn4kvwn7uhurqxkj3cmnuuykyup7uhwt94pluhdxv339a48hesupqdkw', + 'bc1p6uk22jhary0mwn45372sh9zcql8350tkzp7f6qce8auyt3qszykqszm8nq', + 'bc1pkvqpehea6u26vw8tn6qned6nphe3jtpew92v6lgythgl9eh6qzjsrky5th', + 'bc1p2tlajc9f3tyrpqwtclfcfm3u6cey8es3uaafkhah5m3qwze8dvaqdaenwa', + 'bc1p6ckhtcvf23adp8trnn7kxfp9alteqgrk3qgzczshyfyfy98p6vhsnyaqzl', + 'bc1ppjfnrgkudhcgkyqllmp3repdnervr5qamp59plvp55t47q6zvqvqm53k76', + 'bc1ppa6zr8jlum0dpnl3620sxae4kanctujjfrzr2k79wlrpxfpf0uks96fy86', + 'bc1pduuxmdkp26vpf4mpwswzmls8gvh4avude7rngu386ygh6czgy26sycrf3w', + 'bc1p4l3esssvsknaufzeh2u335jjyqjqzhcqg4hadnq28907rmujxtvs7mlls3', + 'bc1p94s3ksd9lql0lkzzeekc9ukh59f7d9eq58a34u556knuw93syy3qtz86rs', + 'bc1ppc4a5nfee3fmsz8zkrstw9e6qaenakz623y5d23wlmm55mx39cqqeed504', + 'bc1pezlhpxn2umhgyxhvre34urhhajrxfg8rw73fk29pwe2w859vrgqqa2snf3', + 'bc1pmcanlzf4mwy73zlvcjrlasegt92s98xf7mhuk9sjse2puyyv6mcqsqwm35', + 'bc1phq4ww6h89zhpuqt5c43dj6ex8d9sm9zt8a53tkw8ndtjl343jz4qfmt88k', + 'bc1padwcr9a5sxv6ty97k545dxusdgw73ph4nc3u46vr6c2dn59q24sqxsfwez', + 'bc1p5vhyupttqkvh96f38g30wwgkxnrew7wh7c06cxyc3tvjvsuvx3zq2jwecd', + 'bc1pt5lyu4hlutnses2v4ewr8k9a67emcwtaklzwnmhvnmgdyn5z8h0sqwudp6', + 'bc1ppwtqqu2yd4atx4xkxxe2yu406etkq30c4y4zux9awvx7smrdhwlscmd8h2', + 'bc1prlxmrd3rr9gy3qvwvjt79d0qj7haxmcdwwhy3qmzl27r9h3t2hvsc7y72h', + 'bc1pp7x6w5spz8lnxyn5xnmetq83yq7xu8pn0e3xtn2pyz5q9lr7rqzsgy2ptn', + 'bc1pwjwx4j65p0kqjrkllfga0zgef4ph7nxgvz35s9un8avnt7mkjekqnvfclk', + 'bc1px8y5rgvkqgp5ya0kem7vz0mm85388ggdj09ymaj7rap3zrdv7j5s5tazje', + 'bc1p5j2j0utl9qlgkep2ygcjk6u70yqyr8lu5ww5d6ux6ha8072mnk3s4tchnu', + 'bc1p4dt6p5vc9h0y3u26y6zw0md732vwejp76c3y2nq82szxt8eyawrsauxy6q', + 'bc1pqhs3j42l850fknx9kq4fezry0sc4u9unmavy5ct40727e5llsm4stjfusf', + 'bc1p8sz04uprnnw0l587raajnngwvx6f40hmuenvjn0fhpc5gpe6ralsth5dgd', + 'bc1pcv8cljpp3m0j22d0cn0wnx8cf4hr64jhu3yceqjz0q9awr4xpx8s3rn6hy', + 'bc1pgkpmdayzh9xvm93k5c28qld4k6620fr44040q9gpsla3dx4zzlxqx6qyxk', + 'bc1p0zgqeqvs6lxftqqkczhp2fp96hw9eaus3d8auzq3qcldu402m47sdkpyup', + 'bc1pg6yzuyv0hezm44ex47a2fqqv2kfv9v43ttkpt8fg5u4gns9ths7saufpju', + 'bc1p24svszlkwcj7gclrw69t4t3qn7q7uexsh7yy6e7fvnz7fk2p29hq8xhq7r', + 'bc1py77xcqahmxs4alxufrhrrh6swtr79alsslhyev76g2skd8kzm7dqhpjm9n', + 'bc1pld7ujcn0fzf759upcgm3efclku2z6xq5vv54s4rwmj9dmrf075tq5969aa', + 'bc1prmzut3dq5sjf2ee3700y0tac2clv3z3can0pasys2ww5q4z2alus7vzj54', + 'bc1pyp58hmmyyws38gjuykjpkwa2mkxrhdsgfg4fywuwdc23p57cyl3qjp5s9s', + 'bc1pyk6eq7eys50txq08ty447xthhz2xne6ltjkk7sajyynhp3am40jqr9u0kx', + 'bc1pau5hm90x9nennpz6ydd29dnln0rg2mysx7gtyz28qz5qezhfyp3sdp3vz8', + 'bc1p6ejmjdwurfca99nyn9g9fv8wr49wvlvyn5d2ne8r5rcgjaxj2a8sewwfqg', + 'bc1pkygwezl2xscfpfvpym3xtfnc87w2h5q7956m6tp549vmtrt4p9uqcqvd57', + 'bc1pfm7mlhevds6mdaw803ffzxv4mnshu6cuuvjkj7vvrxu9hmenj02st2649u', + 'bc1pjrf0k7clvguj5qqkvaeh5edez02fr4unyxrqqhhe9mr4eh6vwcws6wk22h', + 'bc1psust2x652g0uj6648rnl05sjscgafk9zkkfve7dpwczv4t42vzhs20v4ny', + 'bc1phvrm27ztqyhu3wqgt4wnlqfnefv3vhtahumcvje4xl3eqanzvrfsdhyuvx', + 'bc1p56wdxvr4df3sum3hrpkjmgjph35j4gavjvem4z0u4fyr98zyvejsm73rcg', + 'bc1p3ervngq7ry0rkfyemljx2txelqg094y2xhl79j7rcc90kkzj0a8stqgd2u', + 'bc1pfjfmwr55jlard98qsynvtna6nct62dvq9el5t5lgh2chs64mxf4qectsx6', + 'bc1py7627utpvnz64xagah63d5gat5vh26r5rnn2wy0a7d9wxm8f9heqm5aagw', + 'bc1pdgdckgygwd085u7cvdzzajnxl8dgw4hw9m9snqy8x8qjvlezhqksar9hm3', + 'bc1plj4fqmtd009khqfa8u0xty35u5z82lct669aythdvdrga256pk7q2psrr3', + 'bc1pucl20kk840y5ka4q20lafn6lkf2tw302mul2wz8cez5c803fdjrqz3456f', + 'bc1p6tephfw25nffw3zk8emfsmwa2e7rxmgzuf8fu6ur669u0mu73rdsmxs40p', + 'bc1pd55t2tza2lyuev9zuhxp93kh3h2565kgngdmduq0kcxklmad9jhsr3xp7k', + 'bc1pry0kt6l7wd8j9fgq79yh7yf33nw4mt7xhatetkhgpqjhv6gpck7q3avd70', + 'bc1pyu7cdh4r04ha0z3ua5c24ufxjdy4vu6va0erjdnq2qp8dl082kmqqvga9j', + 'bc1pz3e64sywrht8de64xdc65aeu97jzlasccrnv7q3kca43mewqy8cq9z3w0q', + 'bc1pr33hsda2eq48ulh00tmulhg2ageg5cfg09c3yacc3ywrxpez4zqqczl35f', + 'bc1pgkx5253lsym9a6t6e80l452mwftw704up865rhathaeymutdatqslkmjrd', + 'bc1pmf35g9ue84kk7efzaaqugtz3v4fxx7kwec9hupaskuz5cknatpeqdn87jp', + 'bc1pzt6g9fnrtwwn5xrtth3hez44hw0e9lqgzgmxsv5z3f760sldkfrsvr4plw', + 'bc1p3hjcdv6f0p3g7jwffayd6wgljdhuse5stsq8vgp4309p75addxpq604f66', + 'bc1pkdwcq7rjeyt5wwm807d0x5z6x22drsah9ffcsfeqreevr9y6ugjsp0wtck', + 'bc1pglk2tmk5u64gph3gj792qz2cxhahpn5883nzmlxalxzqw9ke34rs87wh6q', + 'bc1p2pxwed4sqpnwt8gucgg7pmt5dkcvlh5qzxcs4nhf849mnkkfhjhq33mfkc', + 'bc1pfe70sl72ch4cdyagvvxljl566y46alvdfn3vfe5y53scuza799tqf275vs', + 'bc1pf6k73q49ck6q0sssk0auv7humavv380upc670hut5r5fu7lpq8kspwndpa', + 'bc1pxmj6ggtgkmhvahmqvxhfgfqhcnahjnns6ctvh2z8u8we0l0vanpqc658s4', + 'bc1pmky6hd5q282d6hz9wrqyzsfnv0zshd0a3l48nuwyd9emjnqnhvts28jtd7', + 'bc1phuwdle04t0m9auvdxfmxke046ewpcxldndtqmu5tcqnrt8dv2spqyaqx03', + 'bc1pwymyajtn5sktcwckwakpcgqlpdp520sw5d7nla0d56wnqvr7amhq74dkr3', + 'bc1psjpc9crw4pupxqf8st0a5puwe3v20dzl8lrlcrtk0wa44ay95vgsmhyvze', + 'bc1pssl4e20gwm8f3a4lrphkmhfgvlqd3s3xl6xnzmj7vvaexd3p6pms635w23', + 'bc1p8n68wljr0zrfllgpysam2lt0rgx5rsqvhuh5x59mcdwax0pmcp2s3339k9', + 'bc1pumml48pafme8xrn7cla5qr8rjg5jlljnkava4z0vx7sv206qp4kq8vc0pj', + 'bc1pj7uzjpymf055r4ksyu909fkyjv7nz6wca4m4dp6y0gnnj7vzrqgsutyrgv', + 'bc1pc4xrl00t0hxp5m5gvg5dskcwr07xdqakr9sy0ltrep3ul6288mxstyaes9', + 'bc1p3rql4hmhdxqa7z92we3cxrsld5hrwsy9ykhf6hcn8v6ndtvsj5dskg5mhl', + 'bc1pm2nmh5hs5xvxglfrhvpacwmqvswjc8xkv60vn8lxxm5qx2ldvvsq5ench9', + 'bc1p9yyzjcte8z2430e8wuyrd3qalw8xe455rxnqt2dcmthf0q5mjd7s058nlh', + 'bc1p6hla6gtvjx60k0ejkq6z3lpdt4yp5654jxqd2dq4d59g5a2qekzsx0fyf8', + 'bc1pczkz3epvk5hzzg5tf7j0qs8cqugyfrz28rltr23wmcrsen82f9yqkffj6t', + 'bc1pcmqhzzh9je7rv7pev47xd5kjx23ht7dgz8cr3rrlw8amrc8gd72qglhphf', + 'bc1p38wuj9zlqll8ken6t4raftldth64tw4n7vyddmuucvk36us02vns4zvu2m', + 'bc1pgd5ajxe3vsnmc66r7kqc6syfg6qyzgzmmyy0tdjnpustmgvcsqrqm0vn89', + 'bc1przu78pejvx4906kv5fxjzmlszwp4fukxe7rmfrkvfgukncmlcfvsj8u600', + 'bc1pg2c6f75kmaq6j8fuutt6lnvuh6v7dt6h46v0gfg3cgada2u4t65ql4x49s', + 'bc1p2c2sftd9rjw4z8zgtf0vzkxqelmtn5wzj65kc664zu3rjj2rru6q9gsvj8', + 'bc1p2c7exz075js6pqtgukmdn0jlpdx3jfsrcc6mjjqhsccw4y7lkcyq3d9lf5', + 'bc1p4vnasty7wq7ceshhlfxmyt272xsja569a7vvqfqjhy022ytj9f3s8qeumn', + 'bc1pctmn0ceelqwpl8w9xz9hgdz5v84m6apc5sx2rntkcwzt5mffnwps5acsmt', + 'bc1pvnwhgprvurxzc7nmscvjfgnsgm72scjtwufg8yg8uk4ql2pxs2wqxw5ggk', + 'bc1pjd4gyfqxurnrxamnyynvxgt7jl0yd0epz669f3q95sj4sr908jask4cwen', + 'bc1pajzphysva7sqxrajxqdhssrfpv6hjv647qpclyjqkjgn328kr4pspvq3nk', + 'bc1p6v83msec6kh0hj2wl8ws8kh3a043tn2k3z80fc8glvm5k8q9x90qf0zwc8', + 'bc1php9hqkn0c28vpkl57us63dkwhv49e7kaatep3ja3xyfv2vd96hhq4vyr7j', + 'bc1puunkgx9c0yjh7wd80gx8upx79ndge6rv9k0j8he0s9lled5xufgqsg6v8u', + 'bc1p0y6lxuhpkt0ykv4t5k7vlc7wg3w0aa9z96p4w204v04esjesu2es59nfwl', + 'bc1pmpaf9nzpw2kczzu2hchvpaeqjerkzw9kmspppmmzmn0hj8g6suxqrvlusm', + 'bc1pc49cm82f23nypm0p3vn54fylfzuhku6y2d5xglv8vefgmv3w7r5sslhxme', + 'bc1pjq2742n494f5tunuy2ar5ku3unm4n2dzwmzt8cmfyv4f34en05esmhzfna', + 'bc1p3sqsw4wqvrh4ngypc2m6hqqnhl33h58m4afxtgs7ls0v0llu33uqpt3k76', + 'bc1pw24catc5sw5yg8yw0jqhdzyrewkaugstujasu3e9pvg6z5r30aqq9urd27', + 'bc1pe6eta8dj6appj2nkxn7rtztluwslu6l6ll8md62dmjjdy2m6e42qlynmfn', + 'bc1px35l86nf0nu5g5wfzah6393h4p7veuvtyyn6dmqmm3k0duwd0sqqk07k5l', + 'bc1pqp430tn33lmpxfw3fcnmx37nr4y8td2l2ucmvcvrn5algru4nslsddqalk', + 'bc1pj6fttcmeqjl64u6uxt7h5r0f5fc3xjzvdxmhdejjgkd7zay373cqpzgzh2', + 'bc1p84xg5jhf3cntw60g74sxnrefl97fsscgwyvrjhcmex4nstyg5c5q9h5p2k', + 'bc1par4g8zmk09j00em3szmpd3qnv4z855dac8qchr0vjgt06urgpgks9k2r7w', + 'bc1p2sp0a8rvl0g8kwm3tmunwd3x4u8cn0fh4hejwe8523cyymq6ffpskllyxk', + 'bc1pfj64axv7fvrvd4yxr35fsdkfecr4jsn0c460pge8tcyvl6apm52q62vkrs', + 'bc1py6q6nxqeccw3p2upnqdpu2v6cq76hnwa52lcj0smwjd2geljmfzs9cpfwc', + 'bc1p2fzdyclgdzzah7q4ruqe235949atlfx8v4nv3k9k5ydas8klr26s77qqq7', + 'bc1pyrqj3xanwqtqx9k4v5r83nkjtkh45lemdhckzq6t9uw23pm7a95qaxnqtz', + 'bc1pfjysy28kxvnp9xl8vsfm2g6fy0lcq62rxrkt9mjrt4hc96fns6wqpn8me4', + 'bc1plgnh6seqksjr34r344ml6jekgzyhm3htnut70wy7cskxx2f6me2qtj2q98', + 'bc1pz0r3lsqkxmw2aauyalfkqy5l5hvwle5k58g53k9gf08r5qepfrps0r6hua', + 'bc1p7zm54pc7l8d7ycdvs2r0sqw5dfpqfchq54h9dnnr8nuf7pqjsvmse8fxal', + 'bc1p85h2grsr6qad2v8gn8y0pk3gz0c6pffgnwsqtcnrq5n33yhap8hqkmphtu', + 'bc1pcu6tz4xsj633y3klyl8ungavjzkmyeupnfn7rslkfrmvrccfw97qfrlhxn', + 'bc1ppz7cjawqvkeg4ts0emhyfp4awe6jf9pg7vajt5n8c939tth6gyzqsjclgh', + 'bc1ph2407k2dlf4gmsv88vztppefmqnpf3s4alnkq3rta0jk2whxh35qz65rnv', + 'bc1pqgxf0j0shw089yvl22x4p94uqqjtqhx4nuzrq7ewwxvsz3583mtsugupc8', + 'bc1pgc0mvwr5upsdh0uar229qd5gzqr4hjrfkf0mfwee8ekqyrv959zspz7pg7', + 'bc1pvrwp7lfzavhh94s95uakcx6f25mzt0jyyl7y7hse24efcexe0dksgeva89', + 'bc1p74muwr99vxkfkf9f4gjs9rpzxmalyyews89x8r7uu4e87zztnv2qfmr2rm', + 'bc1p8e355e03s2tdjmle92zefjvucgycqtxanrux7wex3rwerpgsp56qzjywp9', + 'bc1pa7ye64k549lrr6tjd5gfp0hw28mztsq6s2rnfl2c92qtz8x2pqhqq9hs8e', + 'bc1pmfchfps744xfj7zgtmdr36lvyq0x9sgde0u6pkw9n4xl5xnt9j7qa2tlc2', + 'bc1paqzrc6f6zqzjesdh0fy9ws3kz3c9783mjl3m0cy0438f79hr55mqwdwhaj', + 'bc1pkvtqg3tt5hl0yfjuzz7kyvkrsq7jn9s69rrjjj25v0tyv98lfstsaxjyuh', + 'bc1p9gnc5zycglrawnvgta0mut5e9sy3d68jlrw7d9nypgna095z23xqlmn4ka', + 'bc1py9j4j7lvkaszkmdllz4au4ure5pnh7tw3z9u5xck72l6s93tkwcqj9h7s7', + 'bc1pj6yp9wzfkcjdtv7q37c3fpngvcd8gfe8qnakgdv4uflywad7vd2sggc0dr', + 'bc1pf75d324cn0zukcn3y7344p6mqktwv0frnrudxq50reet2yyrygnqyx9krn', + 'bc1pflumgdunknpsyvwg4txlyhmraqenj4cscz9a0rlkxsdu4h247w2s8ej7pf', + 'bc1pv9x6ewdgmv0rdt8yhyzwfpddmn36e7hgec66dspjcgpz00zkk7dqhvnh97', + 'bc1p6tft22xxgxap84slunjvpmufzvezyzsnpwqm8z4qj4ylyxxqgx2q8e8u22', + 'bc1pakld2fe2t4qza5g3gk4qew8ywp5hn38tv9ngunp6vhqce976mevskpy6fq', + 'bc1pfujac9pwcjtx9j6nesefatjstgu2jtnave78l7pfd0gaz4cgysusqn0j7m', + 'bc1pj55nhtx9w8vrfy2vns2m6v60js2nwgeq74t8fx8z5mverv4lxvdq52y27m', + 'bc1p0y3up8vzus8xq683arjdy9yylaxj4v6czm6zvy8ccjfc7y8453kssllpf4', + 'bc1p40ndfm2hfx7un9rw2aed8kkwqvmuarmc6amzt05v2cynh4us76tscmdqke', + 'bc1pdxq56ejx89p2nrc4pmdjjgphr6ywr93p054duajeekf080m0e2xsarrv69', + 'bc1pyfmzth0k7nuqt7a4c2rfzmdsyky04ur222585c408nth7ntmu6ws9zs80q', + 'bc1plg3vjhaccqhlpycjvghqeeh0dv86f9zz78az6ruagpyzx9cslw4q06lmxy', + 'bc1p6e02er7mgkhj8hlfngg4hfnnv8xq45afl3ssexk248x50c8jpxlq8fh3jf', + 'bc1pv9hvnyh2nxuvj670pxgclfr7dy5elcypccadf5pqv8wu8dxhjkxqxa2k4l', + 'bc1phsrep06yly5tfpjym3vc785cplg5k0ag3ze29q3w96jsu7jhgf3qw4q4fu', + 'bc1pjwcd9j6t77w0nk43tlm26jlsvdrw3d7env35wxsx2fm6fkcz3rzskvf3hl', + 'bc1pa6whe5k3rsn8pl7s3dsjawdzt7pauyf8wttrlrckrscs2j5pahxswrjzg7', + 'bc1pc4uzw5773lvw5muvanjgm04z0zc9yhffessdd406rr77mutzt05s8z8wkj', + 'bc1pyexnashw7adeky8m2ysy53pgckkskrn0pm5j8fzwsdzyhl5d4j8sqmht3f', + 'bc1p5wlas49cxyspd8cwezueselkmgruqrgruqy6tcxmkdmgyq74gyhqfker4u', + 'bc1pf6vzh54tvnlgwhk8h68783xgcly9jxxwx9xudctms47qujvccehqkqp79j', + 'bc1pf7yh6u7jkccx6le32kjfsfuj6nkmfktm7aqc3sfy5uvxh3l78m2sswzwjm', + 'bc1ppupgqx0x6jy7sh8xwjf4gnzwhp4ham0dp062tade9rhztrwgxk0svytr2v', + 'bc1pcu0qt6rcmhx4qt3ekse94wlv6el3dp8fd5x5pl0n7tfk76erfvss2rxle9', + 'bc1ppyhh5ahv7vekmxz9j39hw3fl3g9at5e02uyzgduvrj53hvfhc0rqjd5v8z', + 'bc1peqyc2aeqsswz8ths0s62q6fwn0xaynuul6my40jzga8v356wd5lsrh6hc4', + 'bc1ppvp5fwkud5desukhr5rpnxl5g7kgje0djrtmpqaedc2lkv9tkxqq90hggl', + 'bc1psp7wwjrnt5cfzwkswz465rhcxddskuext2xr8mfuh4zp65anplxqclhxyv', + 'bc1pyjnvnanez83msl0akl9kyhnf9mryzejhrvrzslfsvwsp7ngd7vfqlrqtl4', + 'bc1pk8h2azau5p445nw764eqstymvh9n6e988hf7m2vpmnkrnu3w5v4sj0rrxm', + 'bc1pkm8rhvv0wmaw8tpmmsm64s9j0nyk04xzqw5upua7kt0eklpzrugsdt3uah', + 'bc1ppgk8xhjr9y5mk0vhtrr8fj4gd2rfpynvjvnml3jwv3j2wsd9c5ws8zprue', + 'bc1p8d8ywtj8n466d83f48fjflyat5spe44jyq332vrjhy4a66ey8jzq5en2x3', + 'bc1pd3xefxhetqngg7tfw4la4swnaewkt8dzvzfljved27mguxs8csuseexpgf', + 'bc1pegktaqlnkte7u3fq22ceyqtc42qrd0h7g5f6tvscdf7hyhn2k2asha58kj', + 'bc1p44q8fp9rcr52y0kxzhdw9j4kn50cc7gpvx8vsxw27sdcvhsv0hfslc4ds6', + 'bc1p85qhame800sd6vzktuhauywpgwcm62km9e7xcssswyxwsnwks44ql2l39c', + 'bc1ph52qg0fv6ncg5jpkh78kft234gfryjdmhuzf07egkuvca9mhq8ds0sumxd', + 'bc1puhmqpyz8fdvnw8v5hwyhmkcdhsqhdpcuwzu5s69zr0vm32l6wjnsu59xpn', + 'bc1pse4pfltw8at2wkm8r5y6q3gdm5y8znnmw9sm3prjl5k88cmpfj2sy4x7ad', + 'bc1p3p5y2lpvegs4449p20prkkk2sj0nvd774pf5cvft5xlg0t9pceusznzgz9', + 'bc1puczkxy5ff444wgkss6ajtt9zv3y4fh7svr2gzv4ca9qk7nlae02sn7yj29', + 'bc1pkmhpc2hl6ylfhld6zlvmc7ap6uyqe3s8x9cyf6aje6j2f87edzlsz0kn5g', + 'bc1p6ys72fyz84wmpax97qytn79acevusza0v7htmceqxc73pr6td6tsg22h9s', + 'bc1pnsl0rsuu4nk5y2c79wkar6exq9enk9cwt6thz8q667wyddt63w6s2k0fee', + 'bc1psec0uuj0hp9l7wch97uan3wygv0pt0xx99s9lsz7004d652dzq6sfjdvdm', + 'bc1phdyz3c0ys9p8kg8wmneg5tnwuv4w8mstwp6k24y00qu0nv027cas7yg2hy', + 'bc1pzrszgu0g90e6mmmj75f2dtsyszq33tqwr03r46v8hv2ndtf7039s8vjzpq', + 'bc1pszr9pdts9jjp2wdjx8nqjvdnyfy4vngsgzrugfkmzyh0u8azt36sqst4y2', + 'bc1p74smhmh8dpgyzmvdhgla4vw9mana0ar56lns27pja8kv6kznsfpsh8z0ru', + 'bc1p8vawcvccs9zjksjhywgm47erqj44kg7lvmha9tzd9zkvlr5jrntqdvtlqt', + 'bc1pknk32dw5cs8xekyc30ntc8tdrgek08t0jhuz8j9tm7jsjm77vvysd4l90n', + 'bc1p446hkww8lf002t4wt56ku0far8xg346v00ly4ch9vmhkhszxjcns3cj06f', + 'bc1pql3n9mfdmp2jhhhdh4dk4gjesgefxddsuwgt9e38x6ptwcxnyc3q7vy8p4', + 'bc1psrrm05tnks24v84ss7juwrwmkky5nat3ued5ndq6gm9tpyuuv2mqq8ysyy', + 'bc1pnwhkhkkre3wtn78wjx6ewwmhvfqftauwvlyexdfmx66xqejdyjhqlhc68n', + 'bc1p9u8hr2zt37wg0z2t7zenpl8tk0gdjjzcx9js2k44kt7v7ny27ukslj4w7s', + 'bc1p3gpg05jhp7t6s4tcamuy79ll23uxhwg7c9k2w5uwdkzppa8kqv9sd4wk6w', + 'bc1pyfm27klqtj09qq3nj37vrrgtq76juggrcu8j7a9jg0t244wcfktsfxwkze', + 'bc1pk48fhxzt5kt2ra7m2e9627qj0lejzfzfs8jz3ynj7sswskx93eeq8yyzwq', + 'bc1pv0mgepm98548vkc08uufqryklce5qq03kq5cpagwfwcjr7vlpsks42jraw', + 'bc1p92r96pdt400spd792f78dptwyckyx93u8rn6kkra2svau5ck2x3sd65kh4', + 'bc1pxm62rdrrxxf8m0t3mepp832ay3lfxzj9letkrm9gvqvdy0k2l3eqwngwa3', + 'bc1px58zapc36nus7ecxjz9kxxudnx9zxvdwgzhagnaywwdqeh3u75kqqll22s', + 'bc1p2cl2nfsycl7j80yw8f0fjnjrpusaypqs4g4s7g80u5vdqqx5q8ksr5re0t', + 'bc1pyjkq737hpk2p5y49esvgjmwhszc7hedear68dmgkgm9vuar7eazq0d3r26', + 'bc1p0dc3tm9u9llf9t2kvhv6fn7sl4znsc5s0wa4c00qlqzw4sgk7kyq7mteag', + 'bc1pxq8xay04ma2nukfa7tqe9xsl7kjl8tdztq8a6al5h6qpsx8v308syj04ld', + 'bc1p4p3mspge0j8hwvslpqwc09r4dkcspk05lxfkvvf2amq2smds79aqvm2f9v', + 'bc1psyqrq2peu7qgrser8zc5euca06dfy3gadfdxt8yfs0xvmzu8cq8syncwl5', + 'bc1p47qejj9thgay75446dh8j4cr0m6gv62ssz35f4wt2frwdepxdt7shge44n', + 'bc1pzkzct3dplhe9nl7n2rdt95sd3ycs2ktxyg8w4qutermc4j36hpwsecczqd', + 'bc1px4vd3f8rf90au2j77ly6xdhzvw9ff9gvfz8zptkxf5me7fl006as6gck7z', + 'bc1p0pxj2r2vpghzs7mhzvje8hsx6uy59cnqqkdr6vcazekn98p59y9sj5raq5', + 'bc1pt62ghm6g5tnee9flmfa3pe6pnnm2h3ec4rkhlmearnpvghg9lz9q3raw7r', + 'bc1p7jae0kg8ckdgwpzedzcs3rvwwcv6fxlh9jn4leevxrjwf6vpwpksrzhvj0', + 'bc1pw0f67mhq78vxz5x6d3gthcvkm4wgs656an5z55yd9ep70dzrquasq73p73', + 'bc1ps7ecm8jvdt78fltltz63ylu53na6qytf6rh80yuqewsdqgrcs3aqgcf5e6', + 'bc1p240gumy96hutd5eawjplh5levxy8vs57vnl2u9dh6j5hu2u2rsqqazvhrn', + 'bc1paft5tacpgen7tfe09jvrtskf9j580h80783ddy0pmpueqnleqs9qmazydg', + 'bc1pgmfqfrz7qjyef8ylf7apwtsf6syzmgehsk894cs8pvsq6g0lu5zs2gnk4e', + 'bc1ptg50red55s0xh5hpdvzxqtvd7yp8uqclrz22ey62z3ej3rmdrp7sn6jhfj', + 'bc1pfqzphjyh2c7h0ugwm4lcae3rd098elm4lqylu0qpvx6z82xphv5qwrld2h', + 'bc1pepgkrfys8sva5lj2gerhhnwaxpg8zpwh4cphsdhyq4lhws9sqj5s04099d', + 'bc1plj4jdnj8t0mdth3uu0fnzsmq53cmema4khy38ga6tv5df2jzrscs4aqwdx', + 'bc1paak2v24qk8ktd2feec2cvx4qvj4d5hdrngyjxn5wwy2uap8t2gnqj8jhhh', + 'bc1pvfdncg0v4lrvlvhxklzpmsj83hg7r3ekahqkqh07dvu56yqv3p9q82d9zq', + 'bc1pw35tl7z8sxju0ynx3v3jha66mdeqhse8xfr43q6l4cfyg5mc9twqplx8fu', + 'bc1pztv8p3rpt469c5807x0ju4y6706a30lh349zp6da3l0vyq52lrfszrx8q4', + 'bc1p24am4ll0uaksgrngkajjydnjsz8cpkm3jlz7dedu7eclf0ffu7hqklzshn', + 'bc1pkzmfw4y6ksdct0kuxl89km5c6693xztf4clk25ea7t2w2d5leh0s2g08qj', + 'bc1pykakedg84hy7wtxnkhk3tr29nz00pltn5m892cm986el5mdm6kss5nayvk', + 'bc1pq0h3zyf57qdvpphc8rngz6axmm09ua658a4dea9hw93w9n8t807swt3t9l', + 'bc1pl0hlelcnvpef74x26fdj7m8hjtng7jngw9zmplr8pepzpmkzv5ws0cq4au', + 'bc1p9sce58skemqgzgp3w335w2pexfp2rmzvyr00t229segnq8eefldsencsxe', + 'bc1p070cpf0chfajtget8g263rpct2v5h9wygsklpktf2gxhjgp6e28sv0z6lx', + 'bc1pxf7493tl0dykzfydcnjdz9cftwynj6465k58qkw8j6jcekavxggs680v3l', + 'bc1p2s2psedudl5s8cdmkkmvrhsgw8v5alp0hrm7ufd5d773xq7m89gq82sta0', + 'bc1pgl7r8ak6puvkv9q9nx8srjekjw7hpptaq5ufaqz2udleje7wvngqqspytf', + 'bc1p0tffp7rs4aasj9lm5j4pdn69kudt33d64yr6mg3l2rhdn0zrzd5shw26sa', + 'bc1puqtm0k6dqk8yykxljrj2mt3cpprqw5px06txha7lquf8w9y6azlqjcz0d7', + 'bc1paaeess9c6qsyyt9fwh4pthcxlf4m35608rdnkmephg69wza0zs9q9u4s78', + 'bc1p7adhm585zayu3q8pa2l5dc5tznu7vu0x9zypu7zlqfrn9z5f8ahqcuhrn4', + 'bc1p2mg0j4lpjpguvzk29p2elgcc9dy0mlnj7qyka86da49xc4t692tsjfga8l', + 'bc1pfyg7afvmxr6puv7jv6ugx9ruewn7p6lj4u4jlsckgumz3m655ensjgj4na', + 'bc1pksvxj9r042unvwvfv08tr3h650jlpx4kjzvjegnsev0f650d5acqxnqv7u', + 'bc1p277wm6r98npv7d7e097fgeh6nzfudcp5x49rvrt5xzj6adjd3jmq8jekjt', + 'bc1pzzv42797e7r7rqafmq5fkg85j5wqurh4aj2qlqj4246c67skmhxsq30sqq', + 'bc1pek74uy46grx8vu07mx97zwffnaquuvdysuar2f24qnas034tyvmscz6779', + 'bc1pq7lwh9zn4gae0xq0hg20z32e2z8gnpcf8yaks8uurgf34vf9d3rsw8h8r7', + 'bc1pxfq782fd2rdss07cx8q4r2ctfaerpeckhphz8va47359r7vvkpwqa26ag0', + 'bc1p09gjlqrt4laal3rqwa3tfc26ja2y2ajeg0xt3unn2yxhlkqflduq3wc8mh', + 'bc1p0wln5yupmlyy6utjnnjgw05fpdmcagql77pm0cduws3cm87eq2dqctvc6e', + 'bc1p8kdv2dyjlx7j9x274tn3dna75xqu3w4ud8d0rjvg3vfmdztu45ks9nup3n', + 'bc1pmnpx9csx3jsuvjjpp7nd2xglvdnmyrx8nzayl55h7u062kzf9xlsyjh4q6', + 'bc1p96a0vpnmrc8l79kuhseczw906j38ulde7uqzc5087n48wzt9ugcqcg0u6s', + 'bc1pp47fdc2y0tehkhgshmceqhvmltspjfcz5qka90lz3ds8x653dcks2y9xmw', + 'bc1pj6fc5l9zwc85g5fpnrqhctmrhvujc8zev0r92g3czlqnv0uvh42swtfvs4', + 'bc1ppyutgft3fz7rjvwk8z6tgfesqnmstxdr78pv62c4np2vkqtgxekqmefkuj', + 'bc1p5p5jzp4aut3clnppfglz38ztr407vun4pzj3llaa2yw4vyms667qgl85ha', + 'bc1p7x65s58gcc2f07xjwutnn7g2c39qq6t7pv8qa3pwfays5nf5jkusgwypaz', + 'bc1pr4av6xujwd4zf99e9dta4x5dc9wwf3j6rvpgc3jkcjy8q6dnzwxswq5guh', + 'bc1pvhkm0cfaaqdmft3epmcsqvwrrttntf78x6m7yyks0zc88xn7hgws26azn6', + 'bc1pq0p5pssvtg4ct07w56f64d4wudpgwar7yl8ly060hqt5sl2w9ncq5zahqk', + 'bc1p8epalgdp7r5xch3v34wd9f9u8ml85ufzflurmsk2trgy6jyx0eeszv3apq', + 'bc1pk6y0az3fqfunfqr7czknlq47mhjax40p3djy5u8xwzzzhnjazulqhj5sgs', + 'bc1pklq63jkc7jcjw35gxaeje7jtvdatkrk0tmwm6sh70q9xvx8ylx7s7jqjv8', + 'bc1pt7lpcnjr8qex02cy4w02cnt6jz3fyxqvtx5rzxfaqkweyg5zfytqq3ddf9', + 'bc1pj0gaaaddrajhtes3kau764unqldvxdewgm7w3yxnn65vdge280cq74meu9', + 'bc1pc9rz4jmmmm3fma7k480swc2gte5sa28glwnk0sfv93e09lmnl4mqfcd5a3', + 'bc1p8uh9vy7a70aj4e8mgdwxcte50uy68lzu83wcdjtl3q3echhmr0sqt8rd9t', + 'bc1pj5kayg4fpklmqfswk40nqel6tr0wrqrjf2390xmtkpzpq8qw5mwszzhn55', + 'bc1pcwvxhwk2r6m9dw85vgp6h6gd0xyj8fd8s57axu4p7eck42w3kvws4r286a', + 'bc1prv4ztm6u7p23fgh8s0c83lu5vuew3vkt5sdg5cxvmdpxdkph5cnq55w759', + 'bc1pe23sk2l2yszsnhu0cvl6r0jujq8690xrvxl9dwh6j786v2ralqxscd439v', + 'bc1pu7tadm30gw83aynm0vr4ta9ngcw8ftvystxvh0q3k3hpz5rnjzhqtpzn56', + 'bc1ptnzrd4ttdttesuqypsya7rcmg3xeuduv2rzel6n4khs4av3t9llsrv733v', + 'bc1pc42p9c8v3cpc0tncjzjfe6s43889hgzsec05jq5jgzfftw9c3xkqtwfhvt', + 'bc1pr3cfvu2txuw66eaepcyjnrfewn4gx2gv7jj7v62j7x583psfr5dq6gv9n3', + 'bc1paked3kwx4nftvj2x27c4pkpam3drdv6hcgj5g3flkacgawn7jyxq0zz8sq', + 'bc1phw0ypg8szvkveqdxdas27vevak8ded46cffcqtc9r08rtm63vhxqtqzhtc', + 'bc1pedv4rajnu96ldzwcdt32pqh9lxfp60hme2n7ync00w9qpyx4t9sqw3ycdp', + 'bc1pvc9m8xk04h3xddnsnk6rrmc0hse7gnsdwlyn8etgsay260m7ewns945fta', + 'bc1pur5v9eeyqpl39mp5wnmazkqrc25kee357frcylj4c2njzp2pflqspwusph', + 'bc1pr7gmp95wcjfc9e6ya9947zpzqpnn849mvztpwvvqn2aw2vk9qylqhkpkgw', + 'bc1pczedkchje8l2pcsm03swkhdvwdeavn39w2xwdg0aqktg099le7kqss5js5', + 'bc1pdz2pe6xw8l9snrnf0tgup6ptc0x8q22q27zlyfvm33tnlpqujp3s9c6mvg', + 'bc1pwp88cxytmp52e628f753n2yqvs8gf27rtfqkz05y0kpj5pfakg2qu5awqz', + 'bc1pke9aacezepmqtqrqsekk7fmyd4gfel28z8vv2r8ksrtc3y5vvw3qlpj5el', + 'bc1puagptary0p8ykuua965z5e9c0xapeqz50zea7k78lgaayvdlhjsq5s88ty', + 'bc1peqr4p2akv0rqucka34fr3293ehv5vk8el6a420mvfl7u99q4gk7scjlhn2', + 'bc1pcvcxdfrw3u57wdur02a9ul58zc5tr0ae5zdfazh4rhjgvzhnvlgqw85gjf', + 'bc1pt98lmv7eahz9343lxw3qs0a6gylj8dz9jutwuz9ucj9zweea8krs229hdm', + 'bc1pfchm264pfxw0nd932qfdr79rgep5ul57agm49v8fjdkdfmzfnk0sdm27ys', + 'bc1pm6kzpdt8lwquy5k0n7n0rzkht363gjkc8j7sew7xcldw86uzc6qqrgmxdy', + 'bc1p0k8rmsyk8sg3jq8jvak7zc7hr2g30477nv6kupl64clz9ky4h8pq60r5jl', + 'bc1ps9su7pghhghrq40hqudavujkp7sfvxqm8dcgwjzxl9gpu7zvf3jqpzfhjm', + 'bc1p0whvh7zep5z59udemrrzdc5w44tq2ht6luaqzy5naa97guw4z8nqswmkjh', + 'bc1plag7yhz0d5gxz9z6rkv58vzk5met0kgd4h8m305fe4shyc68nq9q5s2x6j', + 'bc1phqnua8m82gyc7j6j48wk3uaa6p04lvc29jglhk4ggg6wkhp4uu2s5kftv9', + 'bc1pp2dnxjm7a7lk4pa0epfax9rd4s87xw7hpgdxxjg2y9phwqlnha4sprye7n', + 'bc1p6shet8yenqznynt4meftetqkg9aj7acndgh6ecy8lcw8z8433xysp376qz', + 'bc1p9pt5pekyx2egdvmdgq9ap84qr4syhwryqkqgkax4acqgm3mhgrasprduq5', + 'bc1pwm6794tqxr3lc6348wy4z74ssj00tscnxmvd889kskac4jte95ps5v6nf8', + 'bc1pm7tnkc3c33h0xc3ry63w72hq3yfc39typagczzryu22w9p3ash8srnkvtz', + 'bc1pv0amvarvk0ft44zs8zlqe4rznw6x7gp86u48syqx7mkph4n2ureqxc3x5n', + 'bc1p3n66vj5qata55jlyjcv3rcjrwy2tgmwjd2n5y83alpztcp2uvmqqze79xs', + 'bc1petshrrt2u3gzfe04nfwun8ksu7xsnx648r3ky3jqxq0wwqj2x3hqckuvt6', + 'bc1puaj5d76cd7cw5l6nrvqqt86wgg3yyughyg976yadspwh8aetzf9qf76j4q', + 'bc1pqpj7mc27m4eq7ns95p58zx0c80sy40x05w9twujfef69ur5nue5s78t97m', + 'bc1pm9lp5evmzrr0edehgdpqqzmgr966uaxjf22m35mjj28rdsr0a5dqr2mwe5', + 'bc1psf34cgkrxs29lwc9lyv9a8adfvufemhgg4jqkk34vnglgfd7px6qvvgpqq', + 'bc1ph8cejfdk2j3ldk9aqywnj7xrnx0v24he0sf982nkdez9509awuasdfpdam', + 'bc1pz8hdpx0r2dzjqxkwaenulxjezwz3vmh823ehrzk06g5gll65g3es38f7d6', + 'bc1pgjfcqenfvfaeu94ftcgpnyt4kw5ted9rcqfe6n55mec6nqsfdr4spkf3gt', + 'bc1pzfvwpr8ancxnr868hgjy96lfykm59t7rjkr8xd6gx7l86jwkshdsl2ln2s', + 'bc1pltpr9uwy4f8rm64px473q84a9cghppx0fk4n80mhdxtjmgzgn8kscg7wm8', + 'bc1p3fxjqxexmqdr3sswzwa7t52d4qadexp0ru9czc7s0v8k9kk4spxqx2guea', + 'bc1penavaxm0hfuulxjprtsdmqn2x9wxs4aut53xswvqpga3x7rjw9ps88m3c6', + 'bc1pqt25anhef05urfp8y8qtqr6lk922gecja4era57pf0ujgukwpajq88px3t', + 'bc1pqmedya57zg28c2ae7qd67ua82ul4gd7nayftwuxwjx7euhnhu49qpmwjts', + 'bc1psgvx46lkx86qd20eckvg92ah4ksngntuevhypz02ch85sacwdsuqtffl4z', + 'bc1pj5n8e73n2fp6h5z7r624y85vs8hccfxq2r4fth8jjx3psa4qu6yspnewc3', + 'bc1p5d3vs7hp5ldvzjpqft55vezdhwv8tugunxhunfwt454vpsd8zgjs2ykfup', + 'bc1p78dzevaa8v4w0wzgv4mfw3xjdszlkqhm6pmq578l478dvrn57dvsrl2pme', + 'bc1ptr5et40v70zw5n62xr9xjhtmqwpag8uyr5uc34y4rjmlfhd5e8ys2aed7a', + 'bc1pq00nz60nhzkszfz2zghgsljsaa36ww3ead3fvy2r3j4z33ffc8uqpaeqj9', + 'bc1p6p2dj7dt4kn9x4xqa37ernke0aj508thxf7f4230thhms8ehhukqxleazh', + 'bc1ps6z56yehle0s2nt7anlxpmzkld6ywjpehlrn48xnagaa9e9x4kxqzl0u5k', + 'bc1pqmt0e0q4q3n3v5nlzfn9zp4m5lxkgz96lg0yqqmvd2kf4hztq8uqp4dckn', + 'bc1pnez6m0dywuc5x7ucnlgn63fujcvs3ntel53acxwwa2j6q00cnt5sgkusmy', + 'bc1p3zw7wywh4upj0gd5dzmzy3dmuqv2g7z202hs7m6ve8x5kwqnrrcqe709u9', + 'bc1phfdd403w9e9xq4lx0tsyw55sz5z0mexwtf79d9wmhac8n7vmz5lsq6amyu', + 'bc1px926j4sg5pxpulgl5ptl0e040cxeh75l6n6q75sn7a5nk4r8rnxsuwkegf', + 'bc1pejv8c3uwgk9vyy4cpn62227e9h05wnsagu08pueh4qqp6ughzvzs0qkypq', + 'bc1plten9grmergen9xlxdyxnnafxv6mpxzradlsnumr52k9sdcdwu3sqtx7tj', + 'bc1pq7a5cfr9zghsydzsfflrkgkns9u2zlspzr87222fu63m7utftqdq2eldxa', + 'bc1pqsv08t05sjs505xg3wjs07fem02nm653hlne5ke9k3cggewuzngqsl6p5r', + 'bc1pudll32guxevsayk6g2f5tv9nagujtt7s2xsajudvmkry6mcl4tcqj6ykxx', + 'bc1pp4ja6fmj488wcrqcs63fcsjuf77hpye0gqpyu3hysafdsyezwm9qjmrgpq', + 'bc1pafp3gtjj060ng48xpyr3mv0thlmsz6yf7a6ge839s0gza4xg6rhs3l2asz', + 'bc1p67y67ej0mszgentmvv57lhdl3jykvdcsy28q3qamm0eqwckjssuqml2xdc', + 'bc1pk6v36ajdzpml3pdz27nyg2rvshun220w45xevn7gq8htjdm8dncssc5z87', + 'bc1pcaf9d02r47su0jqrkq57l8wnkxvqfh007ky3jtll87ccfdj2huus2y77z8', + 'bc1pmfhn9hjqf24vzhkmcxd33fjap239r0pghakuwrqcnrg95na0g6kqulg50p', + 'bc1p5nx97kk7t0mvtedtggj4sa6yeqm56q9h0dgng7jqw3ce0tey65ushul93t', + 'bc1pdravsvcylky6te2rcmpjl802uyejjpdem4kxe7tfk6umnvazrmxs8xnnrs', + 'bc1p8kf3nfe498ar9qt52gkqsfpd37pnr7a2uqa0q3zqxvdaqctu4n3sy0v26y', + 'bc1p6tznt3u4lk6apxswxg36mk2d6z6e2xk7384f2kucua5wnu3yjntsnma3aw', + 'bc1prudvtzy9dqmhuaxee0lu8423t7fv6k604gyjsnshlqae4n8h6h5sl726qq', + 'bc1pluh37c8ced3xakg45nnc6842dvurdtakzguuwuxy3gaapnzv2sqsfvwu8r', + 'bc1psgqcygzyga8wpl4p3kyar7jsr7csdjact3pgcgqmy0hz84x3zwvq7a28er', + 'bc1pc57d5l42l0a5ca9c3r6m0jwhxwuqj7vs34k845y6nqrrj89338pskwf65e', + 'bc1pq3x7pkkcsy0v53307q4s35d5zcwrz3h9lrk8m7xcacgthl4x7yuqgffcel', + 'bc1p5glt87k558h4t4hk5d2gnwvem896483qp64cm4rey0jcgu2633qq7dykzp', + 'bc1pzjk0yvkz3lkk4w5ehyl7eqydl57sh0gs49yw7449c72n8mhpf54qv9eag7', + 'bc1pp94958lqm5w6ls76sddj55ak5hdf92yqzkz3qtdzwjsyh3j8extst422gw', + 'bc1pcxz588ac9rjcxdn4l3gve5ha9h7pv9p7srf2hymkkyvllmwdqyssunkdst', + 'bc1ppsgqdknsrley09js7pj6zm02ayjprunecl7l27gcym8684z5q3gq29gvwq', + 'bc1pq4xdjeg5fm6pvhw5jf4tkw4zh7g26v8pmj2ftxh4law92ygmerzqxdhrwz', + 'bc1p540hsfjg3tsrt37xtumjyk88cdqurxkjtz7hw0srhqay6ya9gsgqkuszsm', + 'bc1pejqatygf6xtttfvucvmvdhljnne7kh24fuhp9gc5mrk4nssnv5sqpajwps', + 'bc1p7uvspl6qt47eqyhe2azd6teulyy3ldm7kf65mjqan2wqnmwdquts36jg8p', + 'bc1pktcjahn3jda5t2zvh9knk44mse2gfvj9rxyfamqydz5x22rfnlus3jwz6u', + 'bc1pa9grs6wng9negv2rp0y3p7dnatvcym0mng9vvrjnkzs622nhk9jqak8dqe', + 'bc1phs0shgl8uj9uv0c4yyf80vsj0ptt2sww7daxu2tagpcgu2xfhw0qw54z5p', + 'bc1pecmtald0gq6xl97ddwm9e8xunr3ut0ssp20qptxvt6vy5c7g2tqqtmhzng', + 'bc1pcapsxmlv6j53d0lknkav8l0xdn232y58ym8wfeqszm0frg9at82qxqz4md', + 'bc1pd03w0la40qle3v9mh8qvv8kdd69fd8nvusyufczqr8k4llrenu2qmujxgc', + 'bc1pacnak64enz2u6pnawspxfya3825fee74zmh4aw7wwyy8eakm5rds0fardw', + 'bc1pdyerdal38qutfyxkmxau5rgt2n2q0x9wr7d44hht0vnyusrwjjmq8et98f', + 'bc1pec6uvys8hvf69nfjdezdarflcdzyphej3ypyrd5sc8nsph8tqa2q5w8pkf', + 'bc1plrvxzujel6t9ntpsd6yj8nrk0sc37325uefvzq6eua8xwddadcnsvgu2x0', + 'bc1pncckqrdhcyqdlqtje08svf67mam0f3844yyv5w5c89kcnhlgmj0s9cj577', + 'bc1pmf6qq38jgkptl8s86kaxdk6xsj5q78ur8x8tamnxq754wrau8t7qlrylql', + 'bc1pkqdswf06dt47q63fg3s278fvk0896ylc6ddff07nqgxtpf2mxpqsm7ca3w', + 'bc1paa3rh02rm73fqu5wdwufjnt4chd4tpf5qggyhe3eqxx34p6vwtwspjpn8y', + 'bc1paj7h80raslxp4chugeq35a8akan60au5vecveqmmzssvt4rsv4jqayv4gf', + 'bc1pfhqvqkua50z8s6xzjpe5tja69qh9y8gsucflegq8qrrpwc8g7s2sarw39v', + 'bc1pljk2dm94yrgh25um6vy9hllxsuwv579uujpf9mz7j488ze2338rstshtzf', + 'bc1pdfm0wrmgwvlsv2c4kcsjxctuph2fc00aawt7rq5phv93sucvqrqst7e98r', + 'bc1pdzv4thm3tayud0d9w5x3nlu0n0lad0dld58yekafmpwsnpcqr87sg73gzh', + 'bc1p9x584g4x300pvnqpkgfytkur8dnu3spsc7tl3em2up6cndzj0p6svm4ljm', + 'bc1pecme0f6qprrx2uqur3t063exq65sm4klk4ktz9pzrqdgezewqptsrqzder', + 'bc1pk3cz94tqdutk9qsm5pryzggala44f2htze33n55qgquzfh45u56qhdqrz3', + 'bc1pesc80s5cnsew4nv7pvgsjh990zqq3v6ea3gsm7lrvy2lk8t4rwesceslf3', + 'bc1pn3vfaaykhengvq0j2alw25ka95ue6sxuu36pmagct35lwda6eksqhfege7', + 'bc1p8hs94famh8q926p7k5vj8hxcqw97aq2f90v7lvl6g54x024pl68skdcc22', + 'bc1pgdl5md8zkp8sst7rl4x276sk4xdh9v0sdwq0atah2nmf7ewygd4qyeqg0h', + 'bc1pt54em3fgtlj2l2npyd9j6v9rkse4g4q0kaqhd0nfmcw8tfskrw6q25kxcw', + 'bc1pk2u0x67qa9nwp82yh9jp940mjzsc9uryas9vd37nwxav2v6kgfms2fh9md', + 'bc1pgty3epszkcv4zs0nt5g3wt5ze7da0egtzgyfzyrlq6uwggxrkyxszwrfw0', + 'bc1pxq5y7a943qld5rtsg6ndwe9flzcc6vq6qsqs3sgtegjdmmy5l40s0f84n5', + 'bc1pa7tnvxpe23q0z2c648durejzpz8c55lnwaft3z7f2vlh4h84c9ms9fwygh', + 'bc1ps53h86m8qyepj3syr842l62wrr56mrp67s8m2l3ka2y58u62rvhq59ujc9', + 'bc1p706ktvdghk84dzsf0kc23xhtc6lk893jme8h6kuv6r7mzehpd7fs0uymj4', + 'bc1plrdfqv239jjk9k47qry3693dsz9d3q86fj3mtnsyz02ky7uzq7dsxgcm5m', + 'bc1pt7qkcp9wxjtm4lw4jcpndr0f4jy2hg39pgtu2shf8wy0r936qzfq997lfn', + 'bc1p0xul57mz8qg52mahjutug3qp6tr506gjfjq47rews3v6he0uplhs2eemhj', + 'bc1phvs5qhkev4dj7xvcf6pe8cex44uu8jz856x9rg6l66ty73dqklpq4tgr20', + 'bc1pmhhh5qaglmh9nsqw4as70hducjg4ysf0h7eaye906swehxfk7cls5j9984', + 'bc1p5pdnwglz35hg0sat3dnehfwzhxg02c4kyknh4dagyps3qgx0gypqj9wvyt', + 'bc1pvj200xkay9r9ljy5epqg05r74akkj7ld50ls3sft4mc6jwp2cn5qzdlk0v', + 'bc1peagf9jew5lu5hdtxaevecn7j8wuheqemku3trnwm8rkjuvf3nfmqr97kew', + 'bc1plpjc9hqt8s2m7gv6x58p2razel4h9f73y2pajy6rqqk8ac7lu7xs6t80rf', + 'bc1phqf7cq5eay62zwqnlk258e60hf0tmng8gmvaccnytpqd6dpls95qq5z909', + 'bc1pw6ke44dkqv8x2fecjudtdxxxfpsqv9rl5dgkfeadj87tlkzsyxtqlankw7', + 'bc1p32a6ana5yqyt9lepnr269j6cux8hqlmz5w82txxhxlvyn65mcgnqm0fefm', + 'bc1ppwyr45jmdz9qsuq9sf6ergq0273t9kxz4tc4s5kev9r9p4c70q8qvec3yx', + 'bc1p3cuwsrekzuykkytzchqwum5lw57ks44f6u9lewn8c43mx4sk9pdqnclqlw', + 'bc1p8zvs79ukv88hhsh2hzstmtnad9uzsdarsx4e9h7y4hg5lzcwfkxs2hz550', + 'bc1pt5gy8n2ghp9vfxlde9n8xwa8t3ytfnce4zfnxsntpmctnddt5crsn8kac8', + 'bc1pmhhke8x8cm7clwcdzct8a86jmjaxwhrz0v58mtwdp3gm6sq28tds3ff3yp', + 'bc1p4495eajpm6x467838ychuc7eaxd79mwn7enyxtr6mcwy2te9kq7spgvy8j', + 'bc1pjlcz27hn9dake6rlmz93knus5nw9auzgp2k4wl86x7unaugsg2ms9f3cwl', + 'bc1pkydu5fhex6lk5du7q6xrel877ayhkjegt9ytswt566e5uxp8nvhqystssj', + 'bc1pvd2tjdjlhzdu8mkr6uapqavy4lqt3ms0pync3f2r5kaex9fyq96sswvv7u', + 'bc1ptpfpxw4r84sk43qw788z6yvjq24fjgfyaswzcts0qyvtc3srp0vq920us6', + 'bc1pnf2ad2ccvwjxx5e38q6r0nm9f5jsue6h4hss6xh9hyahvqx0mcls4fj3rg', + 'bc1prexk8rmmf8ul8uhw8xnwgkugdh60r7jjgr7l26ux3jgxkqup5j8sg4pp8d', + 'bc1pxntp4zsclq6969u3ed55glmkgwng9dat9d8axjhk860c7u0lnnxqyuka32', + 'bc1p3vkfjxaca88fknwgdu56xst26lelr3yk45yzv07g079d0a9nhnwsyksg90', + 'bc1p4pajywqctu08pe76uxsks05y8k5au77zarzfdsjps6taekd2tm7s5lx35n', + 'bc1pc0tufqfjq2ewq83053r4wkmjl2rg0rhkcd32jgujxecyvxxwaapsagywqg', + 'bc1pa5mca3rgs69uugphk58zq33tp7nh9p3d27vxq5t0scq3z8d07t2szx8evy', + 'bc1ptnrpwxnnmwyyxntjsv406xapnfx5aqaq0jcjna0ga7wkz0uaqmws4ac6rf', + 'bc1prjvm2gu9qkqjjksadsxqmm6femra8xrlfgnxd4w8k7ndws9rxfhs6eec4a', + 'bc1p908qh63dvzqt8hl3k6agwmhdx98ytthvechyezu0504m3eml6kvsjet36a', + 'bc1p4twhadsnzplk7mlxlycs8c3n7l3t7lg058ktmct3q009dcsupm0su3t4zu', + 'bc1pttcjsl929q685ntv45dzccn9qgfdzfrw5js545hrw5jj988n3mzqtcsw28', + 'bc1ptetq3erkzahfsekvcrjhka4s0c3vj7rxlf48qkjhr42dn5lx7p2q74u89h', + 'bc1p6j6ttwv2wsuun0mhy9tsvjglq5yqw2yy43h97cy6te3xgv4jrzfszh5t85', + 'bc1pnz0m98wv0kzdpcuuygjax7expqdamuc3w5juval5xtldj7gka7uq20tnq2', + 'bc1pcguvzng7yvdnuyntqygrtsce2rkyhxn3tnx7kwcltxnavhryy9cqtshuqf', + 'bc1pdgfzhgdyv2rwz0rzvxy45ctqh6df2rcrvex5kunz8pgae30ktlqskv78qq', + 'bc1p0jchrzwyzpgk8ksjz77gcdhxypmsj35kgvc249mau8gr0k9rpdvqpylxcm', + 'bc1pcg3w97n2yyt94yryqmqpxfdjyw4zpa0gp9z6aflxr77wsszv528s40tdq2', + 'bc1ptvad8yc5g0r543hhrk53aagpveqeavk2afps0ejwdyv48uzs6zns4u2z0k', + 'bc1prtrma3ne35m7wnmlvrpufkjzml7crtlgu8eaznsyk4sech3y90yspye4kx', + 'bc1pcgqmljue5z9pff9jdekytepegrxzlte6cg6svx0zxukld6zr874qn9mylu', + 'bc1pq3usutfaqrf4lgqk5glh2u8kxmdr8ddzeml686edak40ng3d8k2q6kqqeu', + 'bc1pd22qhq9sxt30q2fvkqmj2anduwwyeyleanpmnt9r09dxdv8ruucs0zyz70', + 'bc1pzy6fhztz5tsestc48lmthsl9zvuale58fe6rw9g9lf6lfe2nhwjs5l8jq8', + 'bc1pjkrgp5j9uapns49lfvn3lg6c72evd9n7lgt0gu6u4rcrc4g2jkjqmmcu3h', + 'bc1pwd9vp20jpyw549nct8wlgdtdx0w5wx8wg3qfy8hja5hkledvuceqk9w8qy', + 'bc1pg9lyrnyqthnc4w2x6jytdfrgu853fusgcph92q3chwjna0cenhystqj0cc', + 'bc1pst2upxksqp7lwtqw9htc3zqwwcqx0ze32gy8xzdl3706daxh4ykqaa8k2y', + 'bc1pp99xgqvep4pcpqtmwrcnrsd67ahxupfartfj2zgks4d48upnzwaq5gdgkj', + 'bc1pf4xx969ym8wwk5k3u8hyj254ruya9ty8pp2v0m4ef3e73xj845yq05p6me', + 'bc1pttmyvq60wkz5azqrtr960q42alyfwwxd9usfe6yvjqw5mg0cfqhqnws95k', + 'bc1ptx6euazpp4l82j0fyulve6um57g0sym87dgvcyk53x7qtjd4edxseeksfn', + 'bc1p34luf6anvfmljzuwa4k9xaunm6tleqqlg0qfxcnk0d7hru2vcdjqk0e9u6', + 'bc1p4cl34u59wgc6r4px8ge4fr86jhg27rqjpt6780zhntpje26pwqrsedz839', + 'bc1p473quqh47dlpvdpf66njzc65teaaqdl5klans3z8xqeu5zvzjqfs9vgcva', + 'bc1pvk6rcpnyte7tgd7c80ceksvq6892qex7cv9pdzdktp6dkq4ad2mss3n3c0', + 'bc1ppgasvm4dk2el45jw4cfkz7ldjamyzxemaj39mk9p90sd9x355ucqtlunml', + 'bc1pae60555ygx5q0v9g4e95vhlertg4wzxgwanqgu8tj0sekdqva9msgmar9x', + 'bc1pygmks9ncp7qatc68xdymzqhfapj0cxvacf052yu74j98jhfyqekqs644mt', + 'bc1pkjn6jaum5spegjz73xmrxlyt3f004j4ftt2ew0d6jns2t9sckqaq3f890s', + 'bc1pgxrwzfqlzahh60nm8dzcl69fkwadz6lmc2mtan4txw67gm6f5mzsaems4k', + 'bc1pg2m2c86cfqzryjeee4wf6t2k6smm99548hzd8gswls0lznte6ttserhvyh', + 'bc1p0q566ayukshmmjgkjzr5pmy4zxv5kg4t276akw2l06upvs2kvgfqujrzpl', + 'bc1p6sl34r200vht2endg49ttamrq7sg8lemzlrl9pc378lmh4mn6mvqllk2np', + 'bc1p78awv5ez5fa8x0qv8qys03nfweqjv6y7h6mxmvnn8ufqdy0y2qqsm0zfaw', + 'bc1p05hssmsmgvy7exc6eaxqyz9sfda5tzdf4n50dlm67stzpaws7kcqsk98dl', + 'bc1prhtlmtgvzv9j8dwg3np0t53t424awedaw403mhld7lwn4fjv6c4q9ta2c5', + 'bc1puqewvdjt6j8fr6vydkxwez3y5hggmtvrp3jx40whh9sxc526ck9qr8cn3t', + 'bc1pchlg057nl26dkgnw3ug3c5p49tzsl2t06qxgaveyqvkyhyg6kjvqdlz3zn', + 'bc1p9mnwv7janw79gw6h9k7765stsjyl8eppry9w043v43jzachcwg7q3x4hvl', + 'bc1pg8g7cwd3tduvx3lg6kjmkykugp6fyq9ause3a8ay7h4g2d7sz8vqecc8et', + 'bc1pvxajvafh83862kl0d0w3mzjcwvue4xzz6vyjtxe4t6la0f2ava9s3efct2', + 'bc1p366542yp30n430knxken5nlxzk8kfk9kf3u3evpvlk7wrzsu53zqy4cuy5', + 'bc1ppggpked283slcupygquthtsygj7u7l64ey8406ru7e7xahvv2vwscd8uuu', + 'bc1pnp9vupx2tgdnhku4qgmq5yrkgauah4tz2f04zrst405n6khun8dql34l8p', + 'bc1p7s9lmd55p2ucrcmwlungxae6mvrzqqh2ac0h25zyhlydmdzdh8hsltlwgg', + 'bc1pngrqedlrm4ysp69mh35zdrmpw49n2glmmnczljgp8q0juztvnhxshxn25m', + 'bc1p9q5dl9khz42q5n62n5tuecr3zvwjhgdky7rqmh0rj4wfpj0svkeqlj3tpk', + 'bc1ptllzpsajv3kzn6kxzjvz9xpaem2tw4uc22gygkyw5lllek07cpls0kqr6r', + 'bc1p7e3jj0q0z7kjh2dtd3kd8gqfhj9r2pps8svpjyre8lcq42redamq3pc2d2', + 'bc1pxu7lmm35jut8zcfx59e0hq25mc7v5fypeuau22x8nghulsk0tajql92ms3', + 'bc1ppjhjqswhtt0w46z4l6hjp3ztgqjh52xurjnlhkragy7zemyhzhjscpqzjw', + 'bc1pwj7t9l77j0pecstxnmnv6cxh8ltsh32lwdwqnfzkhqm452rnghgqx8w7na', + 'bc1pkljdq2tlxyh6l9vd5nddm6dyz37mdqmk6j3sx8zjl4t8nv4sw2lspkyvsd', + 'bc1pxkvg6dmn4lx38mkxullahd0rk8qqfvwllr7mmtzav37jjavjkqqs5de29f', + 'bc1pys65ddfjh8eeele67z7em5m66f3eu3ztnedzuksjukrpy753uv9q3h6r25', + 'bc1pqkhm2eu7wsxlahxcgj3qpderyfcv9a9gvx6fwykfx98zqxj8dcpsfghus0', + 'bc1pj0wzzjruzjezkxdupfjjhh4arf4d7spsqj2u8uldpc7gcdxs4lrq3vue5v', + 'bc1p6ugztsykt0nvvsa9v57wnpn4m6a8k0xk5wvvscjsgjkcv83chdesftcqhl', + 'bc1pxwv7k55m54qxpra4c3h6eahd5gukt5chp6k2selnmn0atxxfw7rsukjp37', + 'bc1p4y3fhe33j495m5j9lrakplv7a2f32xh3cx6f57z03qcjed49gmssch0ymm', + 'bc1puy3wdxg7fg5lm3h22jpvf5zlsfae44cpe9n0ydh98rd3lzhqsugspgf6u0', + 'bc1pvs0sp6augclzgxs66ufyfc5cwf754knsd65wpjkcezz364d94j5qw97s35', + 'bc1ppn2rxp5fwh32wkt4hrkswa3jy7yd2mcg74y5lj9fm30u0ahlpvqse8w5l8', + 'bc1pt0kmfd825lsmayvmv5v7evq77gvfpd47uukkfvt0d3hdd97tdc2s79psm9', + 'bc1pfcyqw3hgsgetvsz8kr2jt4vs595t0hj2wphwfmxqchm0aen46dnsgkgcfw', + 'bc1pc6msjansxaf7zvt6s686vgyw3lk9c57uceh3stxsf7uk0ultc4cqjg4lj4', + 'bc1pz0q8d9p0yra6e2078th3c9h2v5t6vg8gque76udqms0nfqcnqqwsrvl9c5', + 'bc1p5qrchfjd5flc94rf8zmu9k0z6p42zxtr0w9fv9tmjqt78nsa0xcsnzc6n7', + 'bc1pnm95rzvnwkr3cky26axqp3za5je705xza223vf0fv6lp8panmrcs844he2', + 'bc1phjp5ef2amhqw6qx4sv455d22ktztyns0gllkvmgrtxk7svg2duksnl6ca3', + 'bc1pz2twlfvclq59n6rg68njnnl94sctl5kzgkcm8ajvrc0jea4s5v7sje6zqp', + 'bc1p3yxhvfvulqespv3nzh85muhky30wzjrv3ft3xrxpav57x6m44pls8ksws9', + 'bc1pqx33h5kgt2zfghxlcyxgq8v3k7lgyuq673qjwp9x7zwre043adks04wymc', + 'bc1p54d3tnp0hew3kx5xm2ff6ran2uheath2n7dv39s39h74xnyewq6smxz9ym', + 'bc1pjmdvcsu6vgrhglyj3hp9562uqxun3jv0fhes95gh9mrm02v0naqsl37sqz', + 'bc1p4ale2hav7lc2t54m8v5rvmncjy64kzvrmwudn629xpasvqf9q6js65qme3', + 'bc1pykutm77t9m0n8lwfjpx602p0p2mglak79hunp2rxtulr9pcrx29sy947x6', + 'bc1p6yqcnpzqrhqtuy5mw0mxm8q4m5yn7798vca377k2n2erk00xt2nsx5wc6l', + 'bc1pl8q4pusq34lqhzmmwwwxl3jxdqe0gfsr40q3tpa0s0pnrxh5zh7qyfmtkp', + 'bc1pxrnwsznlwks2de28c4zltz8geu5evsxrtd9aat809jpu3xcwq2qqdfsjwe', + 'bc1pk6kta4dcw3h5v25qxk99qzkherxxnc8wmwej7kxagcg0q6f4re5qcqnqsp', + 'bc1p8at7f3vsl4w6d2yjszuy669zrgffx2s0r9c72uql7wvthx9z9x6sn3lhmk', + 'bc1p497f6kquk62jsk4td3y9aytcweae39s34uvlq295j3wp3hkwzshqetsdx0', + 'bc1p8wkvjfvwcah7nefg7yna0tg6sapjajs0e75a0awf95a2hjvklraqqpw6wd', + 'bc1p0snlk8z9p5fqpt4nxgvrlu4e7zpefrm7tfnf9el0pep2mu3lhlnsec3ljr', + 'bc1p23yfj82h89w076td8pepdpgs4rx4r93f6ru86wr6npnrp0t998mq6k0e00', + 'bc1pjy3fr708pzu7zem3tsgzlpycpcv2t4qnmay74h7s74uy95dvp6zqgsqd83', + 'bc1p0ql0hve83nk3um5wwrydw9f8tfjm6hs85fd8j5kmvz8lhxdy42jq0zdwrj', + 'bc1p2lxmjk2svvg3vye03w3xm7c4rxp2tp8edx88jftchmj3n52wthwqfdr82j', + 'bc1pc7n7gnjulxlmurd7l553hmcdsddgdujwl6snwdp0j39mlc72m3zqnfmg2k', + 'bc1plmf6puanj8rqxplkxpnqvfk9aygpagl64ds3fsjsxhjtfhut9hkqy6m5h3', + 'bc1ply5g5s8davjh82nmrhuj0hl7l6ysar0gvwcmf8df6cpx7ltxz5aqqdv3a3', + 'bc1pxwvqpfq3r8cky4ct90g4jwfgg3axyvkqmqll8d2ywy69qnssz45qls0c6j', + 'bc1pu4zxp7q4epvgavgrf7tazltcqvcu2udl9e9rjhx9983hukkv7a3qxcrj75', + 'bc1p3qkey4w53phmt4fqxxhjswfldssyrld5fwxu4v4g9wk3t7tuj07qq8m7a3', + 'bc1pfse6r50yushx432yffwekj68lfewus0zugltqemrk2pd5fs0tess2aflyn', + 'bc1ps87hz4dpq5jt586dfwffwrh0vxklrndejy2g2jqjllh609rjjjcq8dp4aa', + 'bc1phrkfqgn6lj0w9lma5ucqtrl2h4whe4g3pgktxq38d03q67hgzcvqv6j6mn', + 'bc1p5xc06jcxlrt3f0vaxd772cxy7qvanwrw4s98xkgykaztr6ac26wsfcvn9q', + 'bc1pkqxlf36anyu24lf4msppyn5ls3kskg7gxxse87qred6cexh0wmasvxdzjc', + 'bc1pavvjcn55swul8u8kguhnc9224vkan5s4w5mwlgjex7pywfdgkywq37pz49', + 'bc1p92ksste8mgnar9vgxlc5yj9c56u4lknfj2swjd39t3k9s6ddfqes5quff7', + 'bc1pn886qw06sgta3l2d0tz0cdnp7j38v9fdn8dj5s2ganct3p8gsrgsr9qgzr', + 'bc1pcl6z6he4u45daky7y5nc20gpu0dr6g9ffzh2z58tca38c9wqgrqsqg627j', + 'bc1pqfvcn8ltkn2lgal663pxl2ztnp936ytd44y2y2mqexzxvql6eyxsxtdun9', + 'bc1ptwsvqhxmuf9fn8djy0afwrrwud64f599q80xzu82t7wpqylw8ftsv995x9', + 'bc1pvn4k7m9nzstskkgcfmc9rpz8s8766frln9f9ajzwkptm8egdk0gq7qx2l0', + 'bc1phspzycwr50mj8gl9lvg5g4d8uqn8m47q4kf8xyeppjs5xhmm2gvsnyar9f', + 'bc1p8f6a34cecnv7gyp4gz5g909rsk8m3lspzyhfasw6gjceru3yfkes7zc6n5', + 'bc1p72kcp2qt5uzkdznya67ltehrlvg3jzzu3rml6kyals6c6uutzgkqcw03jd', + 'bc1phg9f4ska8ht8a62uk3m7m9f7t2j68dz9mg9ta2qcau7hp9kfh5hsjlvkma', + 'bc1p0wenzg80aklzhtmldeayywenje0njactylcfdefyayypuydyffesw5pkx8', + 'bc1psgfld7evtvpmkngdwgrpv2ya2jpa28v6vfwcn6vndyxefa3nk3js0hse0q', + 'bc1pcr3rtuwkp9puef5us3dv9z6kysylsv4e2acgj7avrq5hjuak6lgsa0vudw', + 'bc1p70tnt73egmnz3rgx86j6r39etl563lc6my9j5dtx9thda8cwnezqy903j8', + 'bc1pjjnqu090mmv9mwz2e8mpztk5aexdhq4vvw0njga948zvjzh5n3kqa8uu6r', + 'bc1p8js6enxs6drtm9wuzvxy42aaz8af3ptjwtt9crkgu8avua20rejqj2p8yu', + 'bc1p3zcjcp6zws2hk7ul3dhrruvcv45a0lq5c2m0aceyzqtk28t3lhusqrw2hd', + 'bc1pzajaukauvka6je0jhtfwpvf52gh63r5mr5uz5nrs4cpucr4fmyfqdupdqt', + 'bc1p9qjqr87ehpvdyq77w9m4dssc27lhwx6zslwf7wlvf4syz22jgqgq8aajv3', + 'bc1pw36cs264sg93f3utpvesqwszrxgqepmk7alusc9tcj70pec050ssp40g9f', + 'bc1pdhjcm7nl5xhr07akhgeu3zgrq3xf6k6666lqsct2qnqwt6ktusdse29060', + 'bc1plvu9svza4ss97zn4z83xqfjyuhvw5upqg807uem5g4rcj2k4mzkskkr3x5', + 'bc1p5xujdsd7jer2pw5v6w5lr8w54dgn436mv00jygtafadkvfv8c6sq0ywfkj', + 'bc1pdhupjj9d8gwev6zuggkxug2t9f4hw4wqmfe3sfvwcfd2hmqq58dqf9jql4', + 'bc1pw4q5zw7yfl9t40rtlx8ggk4jklrg9dyc8v4cxv8enlhjda2peg8srtgg4u', + 'bc1psh97u7hv7ntrryra64jkymarrfxy8q9l0h8r8k4k7y8rrl7lcvvqq90nxf', + 'bc1p2eexfdmn4wn0u292u4qlwxu98e6qgkgqqsk529t778mr32gphn0sx8wk3s', + 'bc1pntvd2tzfqsng8wd3ee8ty6ayzp0zn3a6mwr93l2enrcp0w0xswas8vqvks', + 'bc1pd8enuntrw762j678j700emjardwkr7fn89ufn96m44dnassv5u3qnnkjqy', + 'bc1p3tvu2aydvjua8sfr9cckdhtgsvz9q3hufdccc2cfqezva7tmxvhs86erd6', + 'bc1ptcfwh0fnl9crcx43tmljz7r4j2qxl5ref2zl47095a50k89drz6s6n0mcz', + 'bc1pfavl6mc0970sk3zye4zk5crud8fphr2wh0gtjrkl35ppwvrpa8pssry6ph', + 'bc1panrtcpa898ptt2xz03lyu39h5lvmfx3z5l6d3fzw397v5lwuqxysqrwpl2', + 'bc1pxlcxve3m453gjga4gxrmldaqcx9c043dedrhcnhmnsv38qurj7ns9y7zse', + 'bc1pvq68u4rlwtafzpvz8gya0y2ntjuqt9xfussxych3yu8dsmh0n8vq8vd3uc', + 'bc1pjr4e428y2ynjqgxefd40zwtynu74n5mrsk6ujwh9qhcswgfxlnmszqqhhu', + 'bc1pls5kh60ddw9fq7r6t3zggqfxr5ujluqctn5d5w33tvcavgkumafs7whf8a', + 'bc1ppdx6mym6zj34yt24pg04q5npqxk2v2tgv0h0gnvsnt0974ztejhsp6pvau', + 'bc1p6s8ja530p7mfu5aht0xrqqr572udasm35nxjm6fxrty90ap8qulq6fpgsd', + 'bc1pwce3wnjtcgyze55fcnddc3cn9npr7qnxldcmjlv2pp9k86gv24jsm9yl9w', + 'bc1pjqddh40gdnw77cdg0tn02ksfx7duk22r9e8whf2j4vh75hwu0p9smweccc', + 'bc1pcvktr3dusyqpmvvcyy4arnxzdk0yrc78t7678eeq32ac46anda8sdw878f', + 'bc1pkudmeflsua5e457ezppkx8v7257dtt884wj8jx2elu3qglf3wc9szf430w', + 'bc1p3xxn0pmnra7zpyenf77598w9mypewqjcd74xdsztktcwhe6hwh5s9zuhft', + 'bc1pjk95ue34tg0t6fmw9ty3r6uc6u400lqy6rzdmst5nmzw9rcwzxmssqn869', + 'bc1pj5n5ud8h2ksqzv9re3c53rd7zkw48cwz8uvqyrc5lpdkf2qvfhnqa70y2c', + 'bc1pzgkmqhtkxqan5vutwn0rlmfzmucnlcsvaps42squsgq5pxyzzh0sr7rpup', + 'bc1pg2upuhz8pp6l76qk3elu8rm029nmymvhz6ft3zm9napuqr4y4v7sswgzky', + 'bc1p5fhtqqe8rax526c49z73jdhx8tzq3vya2fdqsl3t5wkdyg7nx3tqg9kzlk', + 'bc1p7s9za8qsg6h5apdcjths8teq2etvzt6v2pxggyuntkn9d52xn7nsjrzd0h', + 'bc1p68dmdmcqkdn6m7lw8dryhy3c005jy29p9hfma8lagwwx9zaqpuyqn9a6hr', + 'bc1p2zkhhwhtekn3zd7jklgngjkldm2r7pe496qwel59jj9lpf4pcu3q84cpv2', + 'bc1p6aglvfvs47fkuuwsgt7zjjwrksa3ancs932mmr86zug0u0d73h8sfx7g9v', + 'bc1plukrfeackm0xnj4al32d8tntg6a2fyda3g55ejqzu520afya724qyyuc9a', + 'bc1pa9p6fjxg2ljz2mfet8zktrppg3g6k0j34z6mdfc9av4azwf76rzsezsh0z', + 'bc1pes5ttlq2eaw3uqdg6zyrq6cpqnmc9s58u63jz0qf2cv0tuv9wgcstzrezv', + 'bc1p5lq299c4pm78pz6l8522nv02y94rvsuanr8txucekvp4pnmkmd2q4dqwm9', + 'bc1pu0vruztq3n9g2mdnaql0lr5uzgerz44xsq5dygzqs8c74450hwpqm6udhq', + 'bc1prcs28xynjj080dmyamqnntqj405545vghqkanhvdlcy9nr63n8vsch5unf', + 'bc1p47m0p389ja22rm3ejqwyryz8lzfsuzk9hcntqhr6axkmnj6q0y7sllfr70', + 'bc1psw3pn9v4mvl4a67t42wtecxuqqennkawj22rq95hndlweexs8zhslxqvl8', + 'bc1ptnmkmp4yf2vxdecf5jv254usm0egp6ajz5thnzpc2vrmc8gwxgkswmr7mt', + 'bc1p4uhna3u0mef07j43jj6alnzh7dw8slx6guswlq45c393fh6xweuq2ggjqg', + 'bc1p5txr55rsnx2cdunxr8wdawqrg2g4z6p32nm5kglf8j6jumwgazxs5j2vv2', + 'bc1pnvsnnfp8vcc023wv8w4zw5jefp3mpsud79ydrssmy74c4a30ttqqaqjr33', + 'bc1pq6x8ylspfvfldcgus7897xs6vemvzrg2cn625acjjftp79swgqeqdta2ds', + 'bc1pjz54ga4gjhfrjasyyfh9f8vfjcyuku3p8j4qwphjrn9q32f6wduqn8xqss', + 'bc1pgr9h7p3ckd5y8fjm7gnmhhr30ju7y0m7xwhmqu8xxqwzwe6eleks2zxyqf', + 'bc1p4hnhzq5zkqwssqn0d5tpgrs8dy3s3uv3atd0f0r64wuy2y6tpjnsxn7r0t', + 'bc1pqqh3lnphnqvchr356z8eafu89vjwc7zlrfevyhnhzrqcymjekarqnv6mwt', + 'bc1p2742d6vcjngyxhkaz7ukgknu9s2x33jprzl52cnyvpnnge7z383qgp4u28', + 'bc1p4ql4xe6lpz0pe77834ph0sw89e79cyk2ev3dp2gtrdqnd6p8v7mqn33nut', + 'bc1pnpvpqy5tg0azxclaar98vcf652zgg6hwgf8xessfk9ra64uamuhq0s8sc5', + 'bc1pd4zjn077c44e43pfmz5ez7tx7fyx0v0kxgcv8xqrf8l4t05umctq924z8z', + 'bc1p49ffqe3j4f5jqc3avwnqp8uy45mszvfjg4vcsxclgrmnjnlug0zqh60xfj', + 'bc1puldv6dfe009avgtv2h5zmfws0lu428w9tg0957lv2snp6wxc3u2qkmf08h', + 'bc1p2jhjjnyudnjqdu2fe0tpwyrn6pvw8gn5ezq9gs8c45e93cfewc8q0q00xm', + 'bc1ppjn0jdfpr2g29qc4vu2z69c2vzjr40wnxsp8r60gp5eksnh88pusu0ujtv', + 'bc1p609jddxkn0gj4gdt73xwtulpw8r0nvde3pydlqwyf8fmcp094zxqh8ffa6', + 'bc1pmm8n3gzpz0hayc8l0fyezzltejfhtmtc5sr7a2uqd8t2f8q358jqvuvt3r', + 'bc1ppfyyu427xp2h3xxm4t7z2tqa6rg3fmndnqes6k05vnxmju5n4tps05venj', + 'bc1p6d7zy9f8prmfu04q48d37eeysn30uvl8c6zr9t569uczmd4d4a0spkmuy2', + 'bc1pppydj4zwc4h7unzeagkmr4hypzvp6tfrqs0sf69rk4jn73vwphtq8fa09g', + 'bc1psjysdan7ezddfqaaevv2y4k7w2jl2e2g2dh0ggqxm88sztxh6cpshj3mm3', + 'bc1pxzqmwn7jnrrwlp47mx7e447cxdanl5srcpwydnsvxr67ctvkpklqm7fvpx', + 'bc1pweldke3gcymlun3m7n39e258cpwz8vqthln4md77udvreaz8vzeq4t95xs', + 'bc1p89hu8yxsnuut49wltn06dz3u23d9vsze70dk52erufkzep5au7dqfq90g7', + 'bc1plsg6zz50fz3gs8h0tz5e0cw28qms278xfgwvsay747y5wp2826ts9mxv5p', + 'bc1p46fg0gmv50rsa8vd5jwfyu4274hnj5g96futyqdlu8uf57fd2udqr6plne', + 'bc1pvyejsj64jsyqsn8qrnlrt57cvrtrxv5cg3ha8pavau5kg8hz7gyskm47ax', + 'bc1pr374kkjfmewfhgq20n52qs44t2pdd78anpxdd4m7ydzrn2lxmq6qk8z5rs', + 'bc1pzxkpv09nz2vmlu95d939vfk0uwu34vyda6n5l5qgdcyvud7txcusk9rn0r', + 'bc1pdpxkerlrkdrz70f4mrtlemqtc4w9ww6q7msugaxq4vuez384js2q564vxu', + 'bc1pqlpxyhr2l4s5c32k0dzemfyq5yr8zgh88lrc68a94z3mvuwpfp0q6zepze', + 'bc1pk3venhqklz4n3d6k4958gl6eeug3lq33yjyvpvlwk7ceqewq320s6s5rff', + 'bc1pch9vdt2fp0qe0x5eg7edknjaarg4gymn0hvmy03zujax7stqm9lqwd36u5', + 'bc1p9zje7fy2ny88ewujscvgqtyz3yw288g7ula4jf2pp4896eacemdquqq7rw', + 'bc1pj24uwacvm28pf38rkcg3fjqvq7fu6zrv5zsk7qmducvl3zl9m2ussgt4ut', + 'bc1p4khrgn2lewmpwzdrte8ap4wxa3zwhvhlz2uarshesn0y6d22a7xq70y2sm', + 'bc1p25j6nry73s2hxyf7jwckaanmj0nknnm87au2zgp5xhs6cn7fqgrqxcj4lj', + 'bc1pxxdgfhu90l303gm4ndkjp3td9j66g3qykdzseh87zwck8pnm7hfqaygwsl', + 'bc1phytkzl289v8045m8zknj6c4cqlptnyxxps7mheyjm0ses5y5vtsqg90zzr', + 'bc1p5ah4fv30rv5z0g7u6c00dky07hll3m487hqfkc6vehqrzd7grjeqtjs5n3', + 'bc1p5llygh7h4ax0rm80v5cm8dcsqygsmv2c5xvxux37mtcek9ljk8vqxxxyru', + 'bc1p9nlwjkky68dtjsz7krjujk7pwkpm539zs08kd5979hktjw7cl06sjkh76m', + 'bc1pd4tz0e5sn9s6chpf82z97f68e2q73l753zmk99p83aktmvmh3c8sc5qjhx', + 'bc1p3m3nl20u0vsj2ylxllxv3kjxg4kyhrpn5d83fv529k97qlkr48sqj3t2yn', + 'bc1pt7tsgv8lh9cvpsefsdgmjjx57sjg0qj5ae38txqu9p4kae7p85ds4glr0z', + 'bc1ppw8cf33p3l7sf9yufue4tesax439ukv93rn08ejj0h4gu5zlz3zqs7u5x2', + 'bc1psgpl0rm70jzdcy7zgmy97cyf625ga9g2lafjgkzkxyqf7edg4d6su3ypr0', + 'bc1ppyk94e968tf23k970ar8jp7xdlxmfptl6jg4e75sps09xhq644mq6rl0uw', + 'bc1pzvmnwjsj3yekhh3ay2423j95dt9lnmqfud4l9y8pygr0udc77hjqg66fgm', + 'bc1p7fctjtjnns7lxzve9vrdxq8sv3t784cz07j8nuklpad57vk6vl3qvvz46e', + 'bc1p34ys2mulhwen2ftw37rxg8vk50lnq8sj6fkeqnjgrgkkrhh3h0ks6e7h7h', + 'bc1pcc389qjz5qrqqaxdexphmmfv8r7uu3yu5wgu75ce758np7f8x8fqnzz3ws', + 'bc1pg5c5qcsm5w28xu7xl7j8d2qcufs0jwx667y56y3hth8284nd2grquy5lj9', + 'bc1pvhrwvfazwxxczczear5gvkfxz66qjg4s3v3s008q8akxxhjz4qhqj7w6q0', + 'bc1pc53llf3d2x35jxcjgaj07nwzllrykk7j3we9xxqp8dg2afkwez9q2w75m6', + 'bc1p5llv0663xv4c27qcusumvuzu0dpxh6a3n7lrsz9l3w5tgahrd0ds7l4ec9', + 'bc1pu7rcwyhkn2tpu5rmsg8hqvtm4qjdnu5pjc6rtjs57g62pm70gvkqjz2ev2', + 'bc1p4z4ktct2ascyu6lcpaehqurjj6lfa28h3tt6qf270uzwa52n5t2qrd7xju', + 'bc1p7znnw2xg8udpu5zpdlaztq86z3qtkpyaawcaml3vlngs9mvaf3hqmf95gw', + 'bc1pf4l0e0w5m68ty2a7cwhxjtzk7ylczwtutdkhga0yt7wpwz4psp7qg5f4mp', + 'bc1pcwun6ay5qvd0snq07jx35ectrd8he4vdsmurrckq5qhujx0079fsverkcc', + 'bc1p27rn3sxhzmlagzeghu70978lvklhv3mfs6tj63s7tqurzhunyx6q24qsls', + 'bc1pfhq464klk55dwsd4cx0re2eeuanqdyle6vvvs2pjk9efvyz508ns8evcu0', + 'bc1pgzj63axq0r23r5ncmmmxxumqwnz03sewfp0t6w5qhguwfznmfa8s0rtyve', + 'bc1prshpg4n0lk5n4a0wt8z2r7g7pv687uhtwmekxta0v3ch0hmlxdhsg4cpru', + 'bc1pma9zyn8uxqfprfk363hhw9tk757hu3rt2e0v3dd4mu4sr3slvf8q67mlpg', + 'bc1pksl5yjcw2hv756crmszmcuen89n8y25k8dthc8lqmvqnu7zruaqslp29ym', + 'bc1p7faj7hnzkwwd7nyee38r274h6uh2gsl6na0rw2zq8gdg7sgxsa2q3fu3lv', + 'bc1p0gwqh6gxjwncp5qjel0dfgduhjkml68xn398nwkcpde04s9r2jdqxyx92u', + 'bc1p9ycpumjnj6tg6gd046agx5wm6ljx4yp0pjpvvdp0t5r9gpwwn2psq69nzn', + 'bc1p4g40vgtnf6upydxyp2z3ps0v2s78dtysrw2fgwmlvkxpg5nkxmtsjepau0', + 'bc1p6yrms3fw5fl8y5gu793vrleav9cg05mjlxz5x43pqw2aey62zecqxx3jrj', + 'bc1pn0jc24la557zuc3xywvd47pw5ulj3q58l6asvtgnel67chl7452qsg03gg', + 'bc1pcqe8lfx2qz657dnjzr70jx5tgy242htehagazmknulfclk9ur78qc0f4c9', + 'bc1pmj6l5cvjd2r2wsql4jrc4rex4nmlmu42mxzwzan5lj6njyywmkpq23slvd', + 'bc1p4wfrf99w2xpq9hwnwzlsr0qqf03phr836wxpgau69h6u7r8c962qpfm9xr', + 'bc1puz9pqxcn7tmau5gapx4gwvzfkl5kanj0gd2udvpz259upxg9cfjq8pjgyw', + 'bc1pjy78zsff53d3z03tygn0v3e5ef5utdc0y6y09cuw7n0s7ea3839q990yhg', + 'bc1pjn0zy4cndmxnnj435gj5y2vft05u48dwv2l5s9l829guun60m9rqk6ea24', + 'bc1phddy4hjphxnpxrj9rn8hn9p8v2ple42x7mmwxy0ag820c6q8v3gqddrg60', + 'bc1pwal0l3cvmtj8xrc5ntzhyyf9rwxnlhus7d3j7wp3ryaesd986jtqqa4hgp', + 'bc1pv3a5drhse6zcnmhwmrlwxl2uzekradwu8eetcn8xp8jnkwh73e2s0p89u7', + 'bc1pfcd7as4f0ldj5lv287cpr0hg5yg2q57ccwell35n2de72tnrvtdq8m620m', + 'bc1p6s9ewc2alshmq9s7h6tuvvcvrewxuddx7f22uxxu7k4sewsyj64s6s4ks4', + 'bc1p4j8r6q4xl05u3daplrtndqrstdha9hd2gukzwytry5hu9pgzultq9c4sn9', + 'bc1p3cw2qpyetqad50uwx49lktsr0nut8van7vtyg0587dfa4ez4qf4s3z8cqq', + 'bc1pz4uvma2kg2tghafdp07c9vupn8cpj4mwu6zw89r4vscd59td3mtq0ldwj8', + 'bc1p3hmw2pl08s5ssz0rv4qusvj69uz3znfrfp4acz3ww0vwek27t5ns7dx8g7', + 'bc1pdej6gyesjz0n4xexgz0w9w2r73dqr4rpdxa4fjmfw2984rhnn4xq4vrc6p', + 'bc1plsz4p5cy4yrfy5q3g5vzcuqxsparpvc98evnxmzcqvkj9p7fygys0yhda3', + 'bc1p25tpzctvazx3n0exwh2h6z8tvtrerapxk0kj38jemsr3wjjq0h9q5aq22s', + 'bc1pszald0cjkd7paevl2m0fyy43ktcscnmzawlzzf39fvttvml2xdkqgc6t7s', + 'bc1px2tptt6qa336a2ufxjwy344dnp09l5wp64h22ufsk8h49rvgrtystaxypl', + 'bc1p0ndheztg3ha40w32zukzxtj9ma6uwaykya5v4ukt4suclf0e674q7f82jt', + 'bc1pq6e9tch4xdqflgfhk5zgfz94xzm4mzddp9w9q8leqtvy9vasa7esdyx4yh', + 'bc1pe8t5w4l0p8v9t3hgvk6xj7j0haslq3h3s83mqxyslpygj07t3qxswxr37n', + 'bc1pm7x48ftez2ueg79y505fgy9vqjcxglfghqdpzkn9pe8qkdcr8qaqu9u9fx', + 'bc1pj4s6t56hzrdc0qnz99u3nwuttwwawc9xj78gw4cm6hwzuedgznuqsxtqg3', + 'bc1pdpelj2gehxxmrxqzf980wmwgfffnthw3muvsccpk8ms0en5r274s75agpu', + 'bc1pup46xavg8egvzqecnfkgn6dpxu74jhs6p8mjpkjc0n7t6hlq0hnsrk5hd4', + 'bc1p2nj5qavzru6uta705k37axrghswp42f7kdqhre8nmuuywfdkx85qtwxcuq', + 'bc1pk9ry75u0d99qwhs4ynul30xfmkfgwzq2cddxn5k2qek8uqm02h0sev22mt', + 'bc1pfl08ethnczmxpq0kajpm5ew39smvmna2xsdg3yfuuk77ld4ajcjqrcl3lg', + 'bc1pyq5zp5589e3ttemrpg6q7uf8tcpwuara2pfqgem3j47xtju0mycsmgd6jk', + 'bc1p8tjgq4mh5rh590lxccaxka8l5cr8qnmwwxqqw2fj0t8l0laradkqwzgy6a', + 'bc1pjs84jrng8hn9c4dgtqllurckfg2uku0uuagnttxmw26cv5kll5lq096z8r', + 'bc1pccwade3985pxrr3meykvd9mtx04dlzxedlkzwh8y8ew5q66klvrqg5mnhk', + 'bc1p0j6v6wkkdlldte8nxutndqqnyhmhszd2ljv9qtu950x3pktafk5sg95qgm', + 'bc1p4rwfd4sre5h4s9sz68w8qada7evthd3lkxlz0ae5t58kal22qpwsmy6swq', + 'bc1pcmylug7a54hg2stuy4xcjty6n6g6cetvml9m6v34u7axj28j09hqdzkj5v', + 'bc1pz52wmvmxssy4u5mpfufw4ap7kaac5m9upnenmzjx9mjqff2xy23q3qmf30', + 'bc1pqa7mta6levrdpfpp08qss068g8pwhd7fgfqj5j5zfgs29xkdkvkq69zdfg', + 'bc1pfakttu3pefht0n3va685l3xyl2vg6hxvzzgzmxj8ggrg3hsft9uqxvzml3', + 'bc1pquj0w88vjcgcuyrxclx07jmazrx8kthpjxfxrypc0wv6emakt5eqcf6ytm', + 'bc1p2pf4fmk7ygealkde4npfedc8cm4g2rnhvem0zc4zlrlvxfcjxjdsyj2kgv', + 'bc1phz7k8mfzvrhl2cqzvcnedpn39e4hjlu36g54srxhlza9sh3c93nsgra9g4', + 'bc1puujcaaumksz0zdrgaxahnytfep922kgsl40wj3g4sg7tf7rxv8nq5ay8zm', + 'bc1pzvckzplq68dz0u0v97esxc063640dq8fah42v4hd3wq39ychfpwsv7use7', + 'bc1pfx3938sdvkylz5rjgemvae4jfy2lvtdfnemgfevedp2vtk0q0npqp28efv', + 'bc1ppkryqg6kq73atsnz2pnzungfyr6ayhhfkjgd6fgcnnfv7hqpve9stwsat3', + 'bc1pyq8fxfh5zxgm9dmsekyxgm7mezerrf4rg9mhzjl2vena4dystq5spzy5lj', + 'bc1pcsq4gc5dxmcwarjavj4r8ncnehm5xgkyrtnjupeueauhj6wykrgqj04yq0', + 'bc1p9j64vgmzs75y9tm07mvevwaeves8eyzycpwyfz5txjnw5p7fr5astvvyye', + 'bc1p9u43avj6u0nf3vevy4c0drfve5c2w906dgz9x6w2wx7xak0j6n8ss0t2p0', + 'bc1p9r2sj8rtdykaq6n9m80d05qrw4xpm3d4etckk2t7mjqrwtcslx4qdvhsy3', + 'bc1p27c3vaw302qhsyptk6gtl3m0vljauq4dnq38nhsphq8d3wygn27q6lmdgv', + 'bc1phvsnfqfz4dj5v45u75zxmdhqjchvw4rzk30hxpaamnrldduejdsqfckq79', + 'bc1p4xu93awrd76w5jj9aafu8kzfdx3mzfkags77l3v63yxcn0ne6x6sx8luhz', + 'bc1pkllkf4vzvcgs34d6cfj7fc3zankpeuvx8c02pstccawem3jvv9xse5x3k4', + 'bc1p9n7ffh8637fvtxczf9lyjqylnj6gahchs337zlh5pm7m5h737assneeecu', + 'bc1pnjzrmygvu5px75qdlfxcfh0zkwuza5c0uptwulwjqh2lrgyw2z7snynxrt', + 'bc1paj5g066zfq4rsvzfwqazex95cq2svy49tpnlt95ex0yw5el25pyqkq6wkl', + 'bc1plkkkq8yz5pwl984l46nz9vx03lyvrudwpxheu5c0dt22ktxqsdxs3jww3u', + 'bc1pr63f8msjp5vc3q3dr7ehpxeykg0fq323v08jtvz83c6vsthc520qf559rh', + 'bc1pmzervjhxxkk485j53gq0zrx9gxzjgts5s0cgh2rdm2ulf0a837nqek8hgm', + 'bc1p6reaf4thx3exatmjazqg8e3rr9ren4kgs9nzg4y54pnfvmmp7luscr05f8', + 'bc1pxsa097ef7j4l09a0v7xeepfy4a98n7anh3d6clgy873qz2dvt5msqhyxpz', + 'bc1pg6jn5q4nccdex9nuhmshaqm7rglh7hf8wfcewjunt8tn9zplcx5qu3tqjs', + 'bc1pzatedgjr9mc99wyqd6vl7dvl2r02pjtvhyf0e3fc3mg80q9wqpaqgeseks', + 'bc1pccpkwdyyg9rmzmrkdvk64eh0ua6huw5mlytvjuh98p4r6mnttxzqd6uujn', + 'bc1pa3yec965gsu2pmka2m46zh4sq2mmszzq75z0ypfp92zzusmg5s5qar5k7s', + 'bc1peucveyzk2anseau5epg9hj5rd03t46fkrh5eeyqd4xh3s7kxsydqy5xjqc', + 'bc1p8z8swv0ugyy45kpyr37l9qkzsmkm4llseuqfna9ze880tuzrduzsuvgnaa', + 'bc1phpdwae7rx6tdd8wjjr0enf4yyxc7yjxehm4ujt0g8urckhekddmq3amkps', + 'bc1plhkvppd35r0dk5fkzgd5gct89hp9xd6p8edy7ahf5gnaxy49uj6s2xh5w6', + 'bc1pcu389kpd6zh4v0p52k8p66hh5kac5h23deye7d0lu27rdwwn96kq6gple7', + 'bc1pksf5aunqvuuxrh2cdzypv84xqwd5fc6jwplwlp57tdwumveezz3qzfjzyw', + 'bc1pm79htsspqwg5pkfr4cj0gfkt50qlzk303dzt2ghs7chndey6n60srvtxge', + 'bc1pr4zfxf00tnwukfas7fvdv8llhzlxjyueyhmg2tq2wnhw9qeqm8wqlw65nu', + 'bc1ppx89g77xgqy27f3wkkjyeuw76l54uz4nchnucnsg4r4ak2ytmwgqp8x80e', + 'bc1p93vpfq3kfqzcxk0pwcazgk8032x6c9nw699a3m2wtf88pcvyegnsyctqum', + 'bc1pmqkwjgu3nkqwyeccuclymyyn7ghvud29yjrc554p2g8sw0h5v8kstadu6c', + 'bc1p5uu8re8dr7fy4ntks6em05g2z3ct9g2ay0ccpc5sqquqw6ntzknqsnh9kg', + 'bc1p9qyurwnnmnzxc9swyszl3m4sr272mmfewygq2yae3vxtll3f4k0srjk7ml', + 'bc1p6rjsngceewz96eyn5larww99p52yt7zj9uwym7yz83ljgfrzc4jsuyffn5', + 'bc1pftcm3eqcs0y2z92tn9fnltydkpm22l02cnlhqt9hf9eudurlyf0qukxyxq', + 'bc1pnqn3l40cj659035vgnygvutv04zu6qp8sq50wttgrf3xfum3jwps6fxl7a', + 'bc1pgcat9q6c8z7g4pa3xslsys7pd0vr0hfdtgspujd9e9u5mnur9trstz8qhj', + 'bc1pvcwqr2q077hj8yck3uxjdmysmnpspksjgyw9uky9jr7w2lkzau0skyu6fp', + 'bc1pazpsg5dyycuh9w30pnkpp5j0l4kcxz926nujwt3j7a5trj97u4nqyk2tvp', + 'bc1pe6vjzxpsw6jha0c25medf8zpy2z03xqruele6835nkypgheup5as5u4dzx', + 'bc1ptjp8t699t6tqhtsk25a4vfvm8un9z7frg4a5ex9esgsy0p68q8vsjl3f5d', + 'bc1p09eecy0j6l6yaq0frgdjukhtqr4jkgs6nru4kuk93ndsry9pvkzqz4neck', + 'bc1p0m37e6t7w50wegq4tve6d2v6sj0va027fapqrnacdm3v8n4f467sefsxdz', + 'bc1pzn75wqyp6hn02pnq3e8v8dc2nvywzrmcjcrapwwgvymv27alzg9s0g83t3', + 'bc1pxyxc9t8cz3qf345eu5sdze2revwgu735rqwwh8af36hus5r605pqnyck69', + 'bc1pns9zxqhuklscqfzg66yjw246uhk74nmlqv0mmlakc2lefx7mlf4qn40zlp', + 'bc1p08d40glrlh629rqvwp9wd5t5dzr9evm3847zcnswz9alry9gxlcsuefsls', + 'bc1p96g6jvlkuvjcpc0rgsppj36q7ul9nyqt30sng334ey0jrl22uatqcn6w2w', + 'bc1p9ruwtdk4aveuqlnynth2tdasl9ha3gmed23k3uj4ydygfjlzmy9shavjqp', + 'bc1pelarnmq5u3k3v8u923eqpd0zgn39eekunmurhcrzwehd2a8uhllq6x76xa', + 'bc1ps40qs8gq7lpqgq3t56u32n06dwxchvqdzh99ydx882ccp0uq63gsr9cvy7', + 'bc1p5dt86z4zeut9u8nh9p43vlzgawylw8mnq7fvyrpvg0fqhj4hg4jqmywfrd', + 'bc1pxpk0rsxruj6rk5lpefa5zh7w5ec9e06gh9nge63m264ll0t6tt6sg775f6', + 'bc1pjknyuhf8xj36squ9lgxpqam3s9qgh0krasrrht7v7hdfnvqgvrlq9avaj7', + 'bc1p9w0cyveev8dlmjrjune95nkytwemjc8xxhv6xtvyuv59kzxnacusgep6zc', + 'bc1p6up5u3kvzksnxfes8u0ux35uzr6d4r738lkxmwwpzdvha9ltzyns96mde0', + 'bc1pnr54myjm7pup4lrtudhajempz3c9t3r0v6s0688d3799t5lt6u6su34aan', + 'bc1p0x05x3r0gx7353fwng7mehdmsn2cvq4d82kvw2yrzu9fscnehers20vmsq', + 'bc1p7el2e9akt63c7z5h8x44skppwhdc04ld47cyp6g4sj57z4e52tpq7pg0yl', + 'bc1pvuw7htlmg4emee4y3wkv32sqgprlcajlm7rk96rkqkawssxl3mkqzjyh9j', + 'bc1pnaky3xt6jteuh0q0ew46mdx20xudppcvknh5exgekyyplr72regsnjgew4', + 'bc1p5h23xyn7e90ya2uvtmqpmw3mrcahz0ktl3w57shn3kute7dj534q5xjr0k', + 'bc1p7vgzqvvpnjyhcxt8a89zlpz2nxqzuq25r4dk5je889zyesxuwqlqj399a3', + 'bc1pfcd4yypvh3x6hgmdajmzwxyvydeljky4ueua84dxlcr5uvgc53esagfmyw', + 'bc1p2fyvyvxvgn9uulhnyaczuyhtwglsvhcsw7rsvptz7enzywwjvdsq6qlzzy', + 'bc1pwh40gsptwu590j0al23hwa68y4ptqkmraje00m4el7ngfkgv8wgs09d4xx', + 'bc1p2cldshhxnj0fkwr7rz7tjqyn7rupz8nafwwljrfaam8n8y9tzuas473l2w', + 'bc1pz836d8x4qxs527nfle8rs2yvwme3xw6g72m2wakwegcz7nkceqwqtn8ckp', + 'bc1pdmkvzjcd9k9zxppsyrtpy0hklxfc3cd2wdqfheu7kj749gyhalyszp6t8x', + 'bc1p26l9n68f9za4fzxq0vsy5tz2l3rxvkenpagefd9p6045aykwnrfsfawpd9', + 'bc1pa806c2ewelpyh3er0kln35yty40k6f5lv3qmnlykr9d6js8e5mds3nehg5', + 'bc1p8eg9uc5gupjgp9f8xz5fls6920f74s4qqew9yusyrmesnq76t9equkh95q', + 'bc1plzqu6wf2fr9x8f40jxp2rv7092daew2r707wclxx6y6gxf5v5yqq4ksvkq', + 'bc1pgpr8jqal9avulr5crs7s43h9sruh3r6fmfkjm752v9mnwnxw66gs5fev89', + 'bc1psp5murlkxghvr3vqvvz9nlrve7j35smqrywm5yfj6uunxwxuyy7q6jzyjj', + 'bc1pu43kmh7dchftyak7kxkpe3y6y2l0y7334vapjgvh464yhsmcn3wqma5qyu', + 'bc1phrr75wn2f8f3pm250ufu8f4ma28e5k7tfakqqmt36ymnkx3vgh0sxvlx9q', + 'bc1p4ua3pss96fhdwvthv7hu9j65v90frcmcpss8vecdmwmarn30z5qsawufz9', + 'bc1pjcfhcmn7swgunhgvsypz2wlxalsczcvwtsqn5skmnttf2rg7gd0qsdys2m', + 'bc1p5n2q32gytmaatv0w2m2kns6esmmt4v0ekwxmqyuskl6fjg06l2xq0900eh', + 'bc1pxmcwy8fdwutu9s9z0qhdsa6gua8978yxe05k53w90e2c5ga4n2cs853xye', + 'bc1pf3dnz3zf8m00ec4c2ywkv79jahuxmygjhmgnzl5rak6u7nmw8lwqcfn9x7', + 'bc1pja0z4nedz5f7ap0tayx0j9d08lexu78tmv8t0qcgreqdgqw2pnds93uhhd', + 'bc1p4ew7dshmlcsc0fyr02s7v2netwec9lmsjrn4jha6hjfyjssh7xlqjlcmmg', + 'bc1px3q3kehg7mstq73ynv3fnugxn9k8sxwhz3y7re5jjslh07yf4dpsq7gwmf', + 'bc1p74q6de4agh7u4kgdcf8f2j20k9gn5j0z25sazygk6mk85v4yjffqywx0rl', + 'bc1pmzeaersnk7xr4n8hzdnnzklwzc884yus9sanntjmkhng5sqf24fs74gsst', + 'bc1p32xsn2zgs38w0h2jytzuz92v7g3sdd3yyw48yzp9y0hgxenme44snja7jh', + 'bc1prr6jerhav33unyydnl6rm5glh0xtdmnvh2ljn77wq5a2l6vsldls9u5mmq', + 'bc1pny3fdjmh8xs5gwcsy94ymr7a7lmn0zhe3cheuunanan0vhejh3csa4wn5h', + 'bc1pgpqlfmugn84khdt5qjlcrq3g4dm7k2kjvjnva5k9umejza7tfhpsmt7rf6', + 'bc1pg4j7x5uddfnjjjdh28wpk8wwjfdpfyers4vnfw48je9n8lzl9amq85n0cd', + 'bc1pnpwnqf5qfkw45ef7e9w7g3eprucmq86z8eunte9syxn4g339w9ksctan42', + 'bc1pl02lj3angsh9t9x9jyp5924kq0qnm5xknxeqjkge9h4u6du5w8kqkwpgyx', + 'bc1prsn4qs623gksy2wjs2lx9y8yu3ljlrfr6zhulg4de8fn9w7tj92sq8dnny', + 'bc1p8m8yps35tav9xe27kkgyl9a8cy0js66u94cykegmzq32tfunpscqyuvf5t', + 'bc1p537seqlcpyptknwrdajt7ghlr38k2lhkptugyx35skfvfzaqgk6sxa6j8x', + 'bc1pj078hf3ahntahfswr86ran8p0mpnvj2s4j9lcveytk9pwgjaztcqxz8q5t', + 'bc1p3yadm23zyskf64q7my8pen654teta8fk48xn2xpmtt7w4dr0sdeq548jm5', + 'bc1pkwl0yp67qyj226z93825gfekl8gnz7x2jglq5vpeym0ph2qjlexqdtcqye', + 'bc1pgmtdvweekd5xlzj6n9y3rvgrjspj6s4p2ha46ds0gw9jmzky3ajqthup5n', + 'bc1pdz2n509kpf0d7nge909lfnj2rzhau9263m9sysatun9p7a7lrw4spuvn9p', + 'bc1p9ga2ex8znzq85fl3cx7p6en55de7ugc0pjh806psuw3ne6afqpfs6rg88p', + 'bc1pz62mm3xznzkrpcakn5nq9s8tk4dfhlzu20m932rp233wydrkmgjskzf65x', + 'bc1p4uudaw0jdt9gj8fa4eqvwu9wpmls8crpuc00u6c2ud7j49mt9ycqafyypd', + 'bc1pp076ln9yydjvr4pdvaf008jmsl44dmfp29g2czjen5dnyn0wr55ssqq9yf', + 'bc1pguk3yx3cx5fv6nul8s2mjc86sga5cn8se58kxrtzg3uqm0malensc6y4nq', + 'bc1p86puqm4nf59merxfg7rxndt5lt3tq37c3ec8t8xthtm3mr2wkecs8qun5d', + 'bc1p7j4przr20qj8hke9x42qkurpguz8erjsl6flgntaq3c7n9e2eppselp3ej', + 'bc1p8475au3wf6jl8skmjzfhv7df5q093p6nvfuy83kvcue6falvz3lsgcgfk8', + 'bc1p5ep9g6s9ju6qz6rky0zxnj5jm5layvf0nsrggj8amjgwzxrnnddqjjhaqa', + 'bc1pc63rwjmaxejlf39sls2gwafd0ef83x2rc65km0jcqpqsx2508d4qys9cyp', + 'bc1pyjc9ngmcve2t2ww4vq6ph7fl4hs9vl7xprp6qtursdrahpz0w4xst3j5at', + 'bc1pl5u2gl5vtx846v3z4f73q0afuymdue905lwdl2dnf5q0kf9f6z3ssluxt7', + 'bc1pmkdug7q8wqakgrwnsp55he268n6mddst38n77f0nkd7hpx86vjhshakcqr', + 'bc1pmny9vx2suwr4a4yxj7j0xm5quaxn9zr7y69945p9mnkdzvmfk7dq4tfuak', + 'bc1pmenp2760ha6nmxna76cjwer8cm8erkc9t609fj54hqx9cqa5flpqs78r94', + 'bc1p523rq06nttp9rrjcn2zrs9lyptrr2gm0ll0rpmmr4exysfn6j7vqpteyxg', + 'bc1pfej5ggyee5xu0x8pgwsqxlkn22aw9y8jvep3l2s0ju202snq7zksfv0xye', + 'bc1pffrjhgh4f3ssuwaajzrd75prscz49kl9702fvfl5yznz9tj2czysc9xfm3', + 'bc1plefcr87theqzzdhgdspc7rdcj0gwy7w544weewudwu92rhl7txhq52tsn2', + 'bc1pal3r95n6czwfdv7we7qyle0s43cds69hsmtvwcwg95hw6ux4ca0sdpx76y', + 'bc1psnmjhhmp0l4rvjt3yreaf293evq5ca2736ddmrl8r4efjyxc2d0q0sf9pw', + 'bc1pgp2snnt82y5kcuucskmu637skt88hcmwfuw7jukwurfzu00xfmzq7aduzl', + 'bc1plp5gxlklk664xdh9d3su69df6mtm4nkrq5xfydp9ka8w6z94c23qa6yg50', + 'bc1p34m0akh5lapch5v07mcr2szs6nkwp0u7l64pj44are9aqm7yqfqs9ynvgt', + 'bc1pgr0gpnp9kn3277qqx5f9psnl8sd0yufp04rzzv67nwdth9ncghes0x0mgj', + 'bc1pkr3x67094sarvwcy9l05shjczxskk45gq7eveurxpds3hqm08uqqawenjn', + 'bc1p0sas0ly6gulcxu6z0uznyllreqwsan635qvx4d6xdggdw34lc65q7tdzf3', + 'bc1pmy9mj0ghgqdal0qhy4z6m7wwp8varfz623j3wsf37kfzpvmsxussyr6n00', + 'bc1phmamzsjftuz7u5hv7vncfs3dcfgh8e8xd3lqss8yhum8g8m4rqyq52vcaq', + 'bc1pjtqughcwtcv6j0hg25gv34xk5pn40makmqlrr46yxaqrsl4lvceswj6ykc', + 'bc1pd7zpaxy4h6r8cchmwczdu5tq9pun09l8kmn45y5ys0r6hccmrcwqc8v4gf', + 'bc1ptkgv70vdn9uymn8qqv0e9s437lm6l0rq0fqj5t6ec6qn5tqutzfsz8uq7a', + 'bc1ppjrc8j72384pwjdm3fk8kdhmyd8vjgan0682vl2ua8k4yxj858gs7yjnnf', + 'bc1pl2jmyw864g7vv2anghtf4c7shrc5jq97e24f7emmjdj7ktq6q37qrzn0zu', + 'bc1pe0xyj63z7yvdgcsdmqt4urdfm2xey30mqk4mnjmxljyzc7yy7y0s9w7edt', + 'bc1ph7z335s94gs0ysvu2sw0e82h7aw2k0smase62c9376yv6resmhuqwq2vl7', + 'bc1pszt4lgddtdhrh057ahw6u6qr7t4q3xej5wnfp3zd248ju7gplkcsqqzxdv', + 'bc1p9jwh42vergz9nyjmxk440mct37ux76nz5434xvsjhh2ekjfgmjtqhly8h3', + 'bc1p3l6gzhh4mgxrqj4muqkgvk462v6zdewn38cck0ye4ckxuc5uf57sqzwq6q', + 'bc1p5xn70e9pc6kv8qky8tr6anjlkahvygc2e7ej90m2yu46smgdurkqlmfgg8', + 'bc1plgvnm5rq2au7dz4tuf8xw0d79x2h7859f9g9ek98du50cccn586ssye22p', + 'bc1pt7a7tnrj5cd7snjpw09rcks3clm88krunks9guh956t0trm43evqasql3n', + 'bc1p5auc0c4qhlshrsshasux2tujen0ajcs75lmk83nrnss74kv633tsg2y47q', + 'bc1pkqwps7m80g6fguph9jgmepk56nart05msajk4gul397c0vjqncpszgw9uv', + 'bc1pcw0hn5xy63nm54m4uzxxzsem458xfj0gx4s5vj5yrhdu3xhr0jhsw0ewcr', + 'bc1p7hxs7s02qlxdtcjdladk0c85yx8dez63jz8qdakk3z523gc6ushqhpv77z', + 'bc1pftffhkqzmfmf0zlauhm0ewxkxl2qwdfzf5tytvdxsuht7thn0yqqzuujkd', + 'bc1pynrvffj50g9tgs0vn2eyyts4gd8whycg55d6pvea0nwz87kf87zsf4puhu', + 'bc1p20jep92gr8mcptfc6nervyframrzshxrx5ye3t6llp6fdmdukfnq9zwuwn', + 'bc1pr09t5u25lr4aplwxvuucvy742x4e48egshq8eczx24vlh9aktrkqrzpz99', + 'bc1pakxha5a3va4rn79txschreud9qr9unwd5rd5xf3aejzn568llpeq00mep3', + 'bc1pwhkhs68k6q54d2vm4y9nrzm0pxmggjxre7p4kj7wm7acyudytyvqpye2d3', + 'bc1plexf7qqt6zzpdc2pex74cqpvrpjhgcqn7h6lp7d9f4y7cu0zql7qmfnd5e', + 'bc1pykfq8clmyau89y3mvt6lsm0rw42hydhk4fpwk3t2f9kmv0dsxfesqts67m', + 'bc1pxzlzq5pazg9wf5cwd4qm42ldv0pamzhjdlnkgchpxup0rm7f9ars6xzq96', + 'bc1p5tv5hdfd737lmtvglj6a5era9uukjsxterlv2ne6e4pktfqhw2vsjrw9xr', + 'bc1pv339ydahcrc5l4t805rhhwagg6pdep6zlgfe4z84kltp4ykux2nswxryk3', + 'bc1p6vgyvlqq300aclfjmx5p2kuvfgkznq8a603j9p7fu7ersarh4w6sdpqv83', + 'bc1pyvghuecx32ml9wpq9przj5y35kenjkn3khl3j5r33g03n8hx7r6q7r7t9g', + 'bc1pq4rr2pu5uux5098rdp7qpe2akyef85u3hchfaltr5epa6r0yemcqkrcxp6', + 'bc1pdcymtfpqfscerv787gkkksjcpsjj7977dzl9rsadvj7fxfwvvzrssxleje', + 'bc1p6uegtrdhdq8tdxe9rhekctmkm2l0gv5atrucdkd482m22r5nx8gq64jzwv', + 'bc1pysm0uhnk9sky4dmr0nk8d99tks0c5p3n6mex4dagvjuyl74l3k0s9sqvrd', + 'bc1pa0qrlxqshjgc6ytgycgwfdzkz0svy5tm744cwnc8q2whdtgcjjtsxzkqfy', + 'bc1p3zdj5r6gfq6l3nexxjnyylwtk3szntwcs99j7pedyvjp930ya7sqs0yjdz', + 'bc1pej7arsqqgc0ucggue2xlr2yqfv9re2eemctskqwqv93mz980gyws6m44kt', + 'bc1pqgexvgnln9g3jv9cdk5gfuwk94qx0cazx55fndzks0gjpd0hjctsuqc3al', + 'bc1p2yxq7kzue2nmlu92gezng4z32x6g5ka7k6trftj8a42zl9c64jgshkqm58', + 'bc1pkd9arump85yy9nyjng3lgm0272y8ne44z3j65v3k3r8pyzv37zmqp4apgk', + 'bc1ppw9czgjcmk3t38xezc4me90dq6e7yyf2gt00mnn5q4c5esv6l9csh563qn', + 'bc1p3fc28a90j6ayx0snpfwkc98447xdvqv6euv6rswt4dd22yxmx32s38yzk3', + 'bc1psen0kgkez4n0jpekukflet2yqmjm8gq5vqcdxdv69lm6szld8q0sz0a5t6', + 'bc1pnmwyse5x69ya6gkpj32wvcu3w4z2v9vqpl59cu9qa945j4ddhf5seemt8m', + 'bc1p50k8fpwxcz70w97fcxxr3hr7e6tlvmyw2alxu6vm7um2d6mnqzgq7cx8v3', + 'bc1p3fxcl9cf75n9c6rd3c6zgna8xwzsjq2zjvdx0v6xnt9rswqtyk7suqknvc', + 'bc1puaujxwps4w9jukr77v3ypswwq6cpgmnmdqfhks383av3v6kawglqsjukly', + 'bc1p5ls64xdx47r20ygvewucs05q003cttwuwj7t2uvauypf0aeny0fsu7kwum', + 'bc1paw036hyuzup8zkc4y8ts2s8ndlh6eyv5n8jjyl9394pr7vqlr6ssnw4l8k', + 'bc1peu0sxm2u2wqk6gx2ap96n4hfqlnpts4g84m7uae6ejsjgj24zhus6q3ws2', + 'bc1pjxmtvrys0gx8kaxxdju3fr75ueg48g7ugk5h4pjuy2ltf36enptsg83wkx', + 'bc1p2zk8d9f8wcyg7gr5yq6n2gyedryjny4d7y6pmv7zzl7zjex0kakswc8tnn', + 'bc1pf2p8pcmnv7ssekf0uvx55acuvs40kehly5430trmcufftw0jupgstya0e2', + 'bc1pdf6yyvz5w6zqesc8t5geenxra23mkv2xnd465wras9jt8ed5kz4syg3wp5', + 'bc1p2andmz4475q7yl2xdurnm33fkun8tdmepf60qgrl09rnzz9uttzqd634r8', + 'bc1pdg95fqjg7a66sj8tnppgpj8j9ukh0qqxd6fcf0apt9wwqwd5ws2sdxkry6', + 'bc1pg402ucm2cz2a0et4mkmxmkr3j75720zepdtpee4lqtdy55l5yn8scj3t70', + 'bc1pfyu87rcnnp95qmxz3l6f6grk40ut8ka7h9z5n3ummr4x6tcxxzlqralu4m', + 'bc1peruv2eealm9zn0ksxlx55e05nwxydw87rsg8xvf35sudrla03zhsmgssx7', + 'bc1pjelvgqecnarwe8m94kyssty9wg2kvdvwzqa9nmgwpz88gxnm5ucsd08vvy', + 'bc1pnhvhpev9cjdfff99aupnjwrvpxpxqznyxvrvjx2apsgpmqmmn2wqdfgn38', + 'bc1p6m56r8asvq33mh84dr4f7nxg20zmxz5dy76zulavtv60d45dppksszrx39', + 'bc1pedh6ntet5my440ullz4cd9cpxqd770urahcjy4dmp2396tmjlrss2df9gt', + 'bc1p7nxjhxwz42au8czxsjctuz0rersy5fqh4488k0rrale72ccgwcyqkpnvxj', + 'bc1pgn4jl6ckx07jcwp36pvg258ztedpkyh7msc9tt9vgswdep8rfqzqygdfnh', + 'bc1pwd2u606q4ft5ueh7gkzfrhxzffq37hspvj68rkjx6x8jngy6rfnqwjrlt4', + 'bc1p6x895u4l5pjdvasvr3afv9zv3gp6ky4t79gdjsv2j0587wavf9xsvw744t', + 'bc1pp4dwfps0squ4dr4srj4t0938rllfsefnjctun8aky5xvpctn9hxqre6jhx', + 'bc1puy9jknghzw4d96hux8kxun27ch94fjn23zdqlgkwx6c803ydsvhqka8mmg', + 'bc1pd059ap923050am3xhau8tg496qnu92wd0kqqd9uazkst0jfy83nsjj8jkc', + 'bc1pe85nk65mpylrqshfqe95d2pvxgp7na0xu6vemf0j2360uu2ea2sqlvdc2f', + 'bc1p3yggawdq8zc3mfqylhq2zjw4sxf9lnncmdpw9x203kjzet0ujqlsvwdr8h', + 'bc1pgzkf3c4347esf5efh88r43htdksqyp6txu2uh4s2pjlrptnywkmsh4zapx', + 'bc1pycz25aklxpysyp0y5nysze322h4a6sz6xp0nlnchh0kffkmtyhaselugw4', + 'bc1puv874pw4dj8zhrcemhqmf4n5c7uyp4rnpgv24l57yl3x3spdrd7sr69w8d', + 'bc1prju0dgjr6xnlj0wzp2r6tdv0u83m2q0e6s4kaxf5jyl2jzx47ddskjy5ey', + 'bc1p6vmqe86enggjam383339g2crqfd9gfjeysd4f2tchugt7d7y6dxsaww8mm', + 'bc1pwxsnwklg6eecmnzygdla5r3uhan9dqa683h6uasfgl98a47h03cqqpjsc6', + 'bc1p0knup6t8nkjajhn03sfyh0v2fj3e8u34t7kvxh294cs0nt20ky0qh7ar9x', + 'bc1pjzrh5apj0xwpdpvxh4neyfhr6myddw4m9xu9kvjh72rdyrnez2ds2vyed5', + 'bc1pa8vvjr54ah70scu98v6f89fce6y2gupkrca0hzlscsqgvgxyl49s8nj9sq', + 'bc1phttpm7ww0cw8f8l604r5dqkczt32et07j4fydxq63xrjjs4tf9tqvjl67h', + 'bc1pytfzru0pd567lvdcvg2nxekp8wdl97wjmwc8ql4e7akvfzlmg4js2jnha0', + 'bc1p23xhj86jarvkwzw8em8h4xhc65v6sy0rkmc4xs0gugr5gvggt6jqteye98', + 'bc1p33xu5xld4sj44q5snc9ngpe6tc54ckz6tyz97zd66ghee29shl3q97apcm', + 'bc1puxnck2gxx0ty9qxkwmfnu299assvu7k9720ndngxkfagqqvg9x2sl3rf8n', + 'bc1ph8f5d7tnskx0et8evhxeehxj82u5wd06qmfzfmsxgfdlefuh64ysh4axyz', + 'bc1p6l95u0ufnqfrnkf3288hxy8h5rzx098l50e8le759qv40997q4wqev6sqv', + 'bc1prygcq7u72pvgzm4d3n9srx33j43dnrwgyp674vux0e8jwjsf0egsumkkwk', + 'bc1purxfjs9rmgwgdgs8emz96ez4k88z8tresrd26z3xh0keuvuc5h2sgf6hv8', + 'bc1p3tf3yfg8cdvwmtaqk62qhey23jjpzjyzz6vggpn2w2cndg8k3w6q6u8nwl', + 'bc1pv9rjswk3w0qg8fn9e0phzfufsxchmyvqdy5e73ux2tjc4plnwhyq24xm8k', + 'bc1p6u97m5ve5deglchq4jpnwym7s70whw9e6lpraw8nygw4lkzuz8asj7h8qj', + 'bc1p07z0jt9m6epy2udmnmqrsagpjpw8z8qr4azz7dnl5sem6pfyez3qe8m0md', + 'bc1pttyq3ccv4w959ll29jk2gk8p9vmkss9wj3fmjd2mlt622sl2ljkqc8agpj', + 'bc1pq34x8ahnmqc8satp6gg8k3vg7zg4w8qgjyqteq7mltmfmq0f85dquv7m79', + 'bc1pdhnthm5e2npuplaw9aa2hqj8jj43davu7hysndk04vntaehmf4kqe748ck', + 'bc1prw2p3ju7vmytq55fkz3rtn5tqe5pe6t9tjrert8r4c2wgudfzl4qdd3yn8', + 'bc1pxrkfxv8nuvglznn9cvkfhpl8fdgxdnv8nwhdvdmhut4t6ucr4gzs0hfyzs', + 'bc1pw2f2pwckcwm09ahzu89lrfqpc5jmnuqpdyyq4c90arz475dsrrjskfx03y', + 'bc1phha7w579mufl8l88yfj6fpk7pdwnn0lh927qqhknlf4297m0s0yqutnh8g', + 'bc1pz028qrsk2apzzap3k0uehw22c3tq5v23zlxetwfpevrnmuwmmglq6t77xg', + 'bc1ppvfknf46ac5apg2uepaulhdkhj74y6fa2jnj8sstz0sg8shxtvxqgwdm48', + 'bc1p0zm6nngc7gfek3ypaey8m6fenf2aqsy7ekjq9et9h5cs7k48dwdsuzgdg0', + 'bc1pf4vrrs7zjygkxa8fz4x97f4wvj3t0kvf36z8ylva5qpmdf3cfv9qexaydh', + 'bc1pj5fck0vyzgrw3j3cnku0qzdps7ncs89dzu5dnanc4p90fzqqc05s04rads', + 'bc1pyh2plmezjzhflc638wqafe9kdte50w3tv66rc0866gxuef7dq5aq4s87c2', + 'bc1peh7shwz6y2fsy832s7ffx9fynlz0yagc7n506lnms32yqc7ekwasfdua6a', + 'bc1p74kn857hxzw8pfssza8zsmtt74w7j5pmhfgqnz8lh47fky3wlx4sk3qk0v', + 'bc1phpda0xr02h87xzmyacm5vh6jxvnrpc3qphjpecgenrvwy7elnxvsqsa9nj', + 'bc1py2m7xrkw4rtqrajf4p9nmvcmp8ulhy98rn6rxke46vmvez8jddwqzmrnze', + 'bc1p6nmecs2af8nd7hwsmt5xavhuge2vnl3rqtv2tu2eg059t0rtdy6qpulh5n', + 'bc1p3rqpmfghptqs4ukf324scs7kqxr9qw0wupmnd8xgz28lmmm2kufqhsjj0v', + 'bc1pdx8e6encs08rqpjeywe8kazxl6exxsay6cr4wrnmf0mltk5uqnhqs69z58', + 'bc1p3p50mxhmpqqwjltxl28v4jta06hpstazv8tlu384w869fex5hdmq8uvq3k', + 'bc1pgs8vr8m8dtkxunnzeppfqtjst7card4ty5kjnjpcq8pw8v33tynsk3hjdv', + 'bc1p5w3nejgqlkca0veuz8whelrxk2xzm2s58902l2kn4ahecfesydaqahxvh0', + 'bc1p4jfgn8n7vwkfeceypvjn4phg62tnln6luzkd39xe4c0awleefcuq22h5zf', + 'bc1pzwm2098dx54dwajj2n9z7azfv6lq2kn30qkfhef8z6rclhh2jkwsanv55x', + 'bc1p6n2ezr4z27r2c9jy3633hx6s7hlaskjvlr6pw295ycurzxgwt6sqjvu0m9', + 'bc1prdrdhgdgsjvrhpslq743wrva2kn8wds0rhj5elngc84cycajpkkshmzgml', + 'bc1pkqv8z8n6hgfe8ym240prq638xx9sn2xuqlph04em52n2xxrn954ste4aln', + 'bc1phknrycyemqgm3r9754pf3gn2hm2an69eqsypu9fcnvfu56dsjdrqels6tc', + 'bc1plqvesppw3djkn5dqxn73xec9s0xk8kp8v0ztpe9xvfp90svx6uas0zafdr', + 'bc1pnag5ynqguersuldlc0q25tyk8za7ar6jp5ecfhy9w88umsg2760secjncm', + 'bc1pelugygv377yc208309m04445pd993fjsatajcgkyy320a4fwj8mqa8yhlt', + 'bc1p9qdf3meuvsxma4t78dznteusgc9nljecx9tpsar4qs6u89fq0gmq24sjk4', + 'bc1pmhrwm6jjkpf44mq4pl32y6nnzq22l4ypu0cnsa2gg6fwtczy0tdqje8h0y', + 'bc1pnvuk2fzy3gyt5mthep0h8hnw9ye3ttngn3yeyd07d67ck9jfrllq5qnr84', + 'bc1pmvnc94ldhn0457achmse234gsqln87lw5e3wt4kj3ft57eyexj9s0etm9t', + 'bc1pf2etuczshaqxgeqrjq387ypag6e96vqd82asplzpa36mc7ll8e8qlxfxel', + 'bc1ppaq2hfny4eusgnml329fl3c4ku90er3rzq7f9hpd5a77m2spwt7qx47vsy', + 'bc1pdyn6hgl7wtjmf93l3xkm52a6zffxarxgw2ure86ddqhz6mdnhunscm5mrj', + 'bc1pkuv5hjywjkgg0xmetcwamadljjdl7az6uepxheu3x66ad6c5utaqzqwaql', + 'bc1pddvzdhar06ln20t6wrrekvg8tdat9xgdy4egtlr82fl553veeseqtaem74', + 'bc1plegu2atvert6sw8078ydsrskmeau2555tpwzmrh53ha2269njc0sxg3kpl', + 'bc1pryukm6w54adqy2g5qjwpuvjnd4y08s5xkqkqh3g7ff32rn3rc94qrseedv', + 'bc1pe7r3cwav5g4cp4yunmnr7h3n0tunss4zjv5f3lgwcjrmjlj35seqcfuhqy', + 'bc1pazdz9q50juq4algnlqaeujcj63vns3veep3umegkhjp5vf90xl4qhz08w2', + 'bc1psg2t3vt3ljp36jupfqr3nkvnhvsxvywh83pmr5ngl50lx5hz63yq07rrlh', + 'bc1pg9wd9xswmwpqq0u4j8djsum6ln5zvvqrnrum6fa8fzsc5g6t74lqtusplp', + 'bc1ppnt2lwgr482n5nh4nq03hcd75taax3mg6qxmcvjzsd0v7fts5d5qmzn0kt', + 'bc1pnz2wlkrmr3ysy3ldvefcjkwfhu2ce6mf38tvqs082mfvuvf99zysmtkwyu', + 'bc1p53ptd9dr8avw0v989yp78qv9rpq9lzkx6zsjpnnsc99vwkzlklmquts522', + 'bc1pprgvujm68xxesu5dmwe42yl2k0x7klghx4c69pa40hwlhx3y36qq4xxx2y', + 'bc1pjh56cqd43untgndwxd4dquuyu0ym7vea6r2k7nz4jdg3p035ny2se0djzw', + 'bc1ptzqu49lfl93m8f3wykujqw8cs45exmve3cd3yg9quydcu48wycgqhhxval', + 'bc1pje57rckyv344475ae6jek9dr07af0k7y3ews278ac3r3t9my63wsp83nky', + 'bc1pwrx00356nneqfxhpycqxfgavmnfhc0j5x4ld9z3f40h2aazzurdqn6kj2n', + 'bc1padqha953gerna0clhgnghlhqk2uz479wap9ftdgegajdq89dhhdq004c4u', + 'bc1p84g9pe943hzdfddyy65r0hrtcnarnqjs4qn66pj068da6c78ee8swtdpgx', + 'bc1p6ycc9vtgg09wzzcu39hq97wrg2ggw94hn9llhyt8vwghg5v78lkqhzlv6t', + 'bc1pjf2thrzcx3g8yquf7pj0ced57jfg9gndjvk96lyrr6pfmwjkdlwqum4l9c', + 'bc1pn23tnue4764na6e82scv9n5tm8gfgsd5v29yj5dscwa8t48ca7kszafy7a', + 'bc1pw6y8vk6aesl9qnctxv5p7l2tev79l594p3dm76jcjhhe8wyjfc0sd344md', + 'bc1p078f7jcexft9j44jqnhamu84h2al7alsze7kdnaljzhx4acp6y5s40srn3', + 'bc1pc47zn6tnlqy7xeryra55lrgyawxrctyq2mysmfj84dpke2c2qqms0n06hc', + 'bc1p7tfxamku98pzvzn4hj0gh79xtds6vwghqf647xukarqy7rcujt4sz5rre5', + 'bc1puxs2edn2j9nutumrfpv00qqhztlwxpet0qpfgg7s9tcn8kwe057saxrpmw', + 'bc1p5ahlzhrzsxm2kh460sr2d59x7fzsqt6kpml8j67c4gea5r7c63escs7g3h', + 'bc1phjte3tazrh88vgu57wkljejkzedvj0pgppqchducpxm465ejt8dqaqva9c', + 'bc1p58xalhmtam2qelasa0j5s37xsfjsfmnvezmvshv6vnz49hv0avqqyegv0r', + 'bc1p3fc7lpx008e8heav83nush9m7x6ktdnl2mf42n2pemgun8ew22zqgssl4n', + 'bc1pms9u0xfe7aytjlsj808una0prmnsj8h95ekv7wg6yfusfea0h5aqekxery', + 'bc1p77v8knduumr9z65xw58ty2nnxsumyspxd2mla4n78q06sd7jut8qp6y5dx', + 'bc1p3klzu6zh0wfzca6w44pf4uwq2f3vmdptmxh9efnkndd2a7qw0qls00q2mq', + 'bc1ptacgey53urcmtgl7qmzdwjruq29fzksdr0tf35p6ummyn4su48cqvuussa', + 'bc1pkjjmgxwrqkyhf2c7asrdxmxpndeyuq36wlcety5clvufqwhrrt7qgw59dd', + 'bc1pasvdk60surtnkv6qh9cd0k8uvp5y0smnxns7cvaxzgtlwu2uqcas4uzp37', + 'bc1pnncv6fw69d55aur2p3x06xesclex2f9gjzx7lxh3g8v879khmuqq3xgjsq', + 'bc1pw8937zezmu4s42gn6fq3ndtng2xsq5an7v4hhg2g4e590p4wj5lqtr8v5f', + 'bc1prl6ep6ne7rqg64fup48vpqu70leqz9c5f8l0k54gdchf92rkgdcsnlxf6x', + 'bc1pfz8gddruugafnlyffy92vy0awvgfh95ydmp4sl9py8qgmwfzvh4sey9ydy', + 'bc1p4rpw0tzr2uqzwelhe3g5auaefjepr9nyg88m8x8dy8fvd8jrcgcskexeph', + 'bc1p54f836cy0reqa7ctjl94umrtcv75sl0je3vwt4kdn6cx5vkdqd8qx8vktw', + 'bc1p45xednxj7ukrs2ezu77hw5taunv9jw02tj34qaxm6qdl97zw9fesu2hf6x', + 'bc1pxtxwj73v9n62jakrvq63sgzdy5k7jeh2dnfnx4jrzyevujy9404s4q3kxn', + 'bc1px8rke2jwsx2kfrzydnw284y5rg9xg0jy2qg7hygr6ftkq5vv768q4699av', + 'bc1pe47r4gk66u6ju0uvd0cwamuak2zcm6vm6u3sl783dq536h6h7rgszlp5ah', + 'bc1p9xuqyhap7txqye7zwqj5elalgyj5x5v5vun0dr9xr3yy236auswqwwq4ns', + 'bc1ps35u2f47fqc8m8swuw88de3fzakdsnk80w9xjw3wzatlcak37lwsy63dnu', + 'bc1puv5zdqw45ew6gkhy2wnz5ceyw5anp7f2ryqjs5a4g8ljpt9tdsusm6gf76', + 'bc1p00ftpj7ktpgw5wxfntca0sxenvnvmsgyqx8lyktufc9eqp4kr4eq0lss8u', + 'bc1pvav3syspg90zkrtsfvjp8526qfr9r4qedk0pqzxt633kmp8te85qv95p3w', + 'bc1p6pt88p2tw942e8f96z4tlh093jlstz0yxy476n9evx27xnfrj44sqh3zx4', + 'bc1p59zavt3r0v5shxkl7a77kz93mgw9kh5sfmtrmpr8ugmaumak37yqn0n5qe', + 'bc1pvr5ggylulpvct9zn3jal398wpfmgjs0p2dp0sjd8fj7385ts4pvq4zvk23', + 'bc1pl8jdylje2v0cdc7mexlkjh2rajk9ly4l5xl9rna2eyjn5d44nyysj4tvy9', + 'bc1pdd8ggxrjlf69drcatukevyh0m2vecyt9e7z7ra83whvdg4umv4msahd598', + 'bc1pjkghpqpxqt2xdnf9kg8phczdc847dxnjmvdf08d8z3w9djjdyx6qlujzll', + 'bc1pcfsgvud4k4ng5pqq8y482r83zv0yygat9dkzq52v8kg2enykcxlsyjxxjl', + 'bc1pfz2qzzc879hc4xnnkrr52cv38wgjpvcf8uxuh65hdk8n5ygpgk5searhee', + 'bc1p782ag0384vszpsapvenpmh2pvm49ncwrsq88t6nz8ehzvxlel9msv4s67m', + 'bc1pn7tc6u8amrg8ht6a70ykp5ea8lcntclvqfllndszqgx2gtt9h4msmpcn9c', + 'bc1p7dakkc9dpl4dmfzvc6ta5p23unnl9qetxlslefndwpcxq259rg7qhzk278', + 'bc1pxgs2d4mpz6tvs9clkj759q8cgsyglg56kr08vdkmvxvmyxjhpuqstt599v', + 'bc1pdn76ap000w32xqjfsdu2n0yg5uuxvtej9gnewmdeauuhqrl6xxmqmg3xt7', + 'bc1pwf9qfvx3ul40te45m2ex254mxq04l37m84ts324lkr6m4qyjcccqlfczyt', + 'bc1phh2z220vfq9wx958ym25ucc3nywg8ydu265gr7r2h9yyzw32a2xqpeqj42', + 'bc1pvdgrj6m0c8jddrqy33ncz5dwzyfp6ul6yhzfkxsx5aetp4eq3emqexytf8', + 'bc1pu4423sdl5463m4hm7jf0l0yz5f56wk2fj6ltamgj7sjr7avhp8tq8j8z3m', + 'bc1prs55frjm22697v2ujxx63385rphsvs7tx9z6mtvl60q3f2yh4w8s4aufj8', + 'bc1pmtvt5wfpdxrrwsg23hhhwsw5kxf7hs6z47wwrrpa0r76qqlktyysz94xnx', + 'bc1pn877aqs352x8rvr29dff0lzmmrzfnh3kf3jph52tq3j8rwn7fjxqf3x3pz', + 'bc1pax44twghgk5tq554hfpfhk5hugkhuhpl6fga3t7h5dgqfcn65z2spf7l5c', + 'bc1plqp7vq3ueda6908le4f8azj9e3czp2cah6c8y3zvc6k39sw7sa6sp0wlka', + 'bc1pnuucy5w6mh9g4eq55h8394a78e40ytmwz4nrw2enqx4800c044qqpqhl6j', + 'bc1pnvem4cvktzgw6zxq60x7wcdljluauvsx7gp48dtxfqe68s35pdvsyfnqjn', + 'bc1pdpeyqeauua9yjv3yrr3nc32wq2j3dxy6trkrhrn9ncxqn8c9nxcqu40l9h', + 'bc1p64mhea79tmllw2kuykc23dyyqarva3tl7lsn8cx4ejvc4csx4mlq07zprc', + 'bc1pl0kpcm6psfxavhcscaplf5sv85gg3m7r0qe7q9vulutrfndzezmqudmx7v', + 'bc1p4m3lyw8kehjq35zlzac8vlk6ytrzhv6euc3g9t9nxvk07qnrdmnq3mmjv4', + 'bc1palv6jnlmlqn99q4ldzclgl0h53wmuzvlq76jgnjtdjdv2tx5mmpsplmg68', + 'bc1psvgq4zew7revgstvvs89nf6zk8wx6up8yj5kahwa63f7qk05ls0q7y9wss', + 'bc1ppkxamtrslym6hvevaewnjjfzplaytuuctklpdhhctutjcsxkzy2qhn7slg', + 'bc1puxusccggwntmuadqv767sy3wxu5m5dk3s5dja44azj5ghlfcv7esw0xq6p', + 'bc1p7q8zkwupxfl3w3q2jjcagwgs36h8mwakggzj30u8q66vtxl8mwssnqr72q', + 'bc1pxhwc9xxyc6w5f5jnngxtkmazsry93nfh4j8tyjx8s408drdwsevqykktw4', + 'bc1phzfutlzv56a33xjd0k2gl9faxzl0nhdvzz9upgl9cqezzft3jm6sewk2uv', + 'bc1pv0r584d7c95gkx6k707psat4luc67msfpmckkvdqfyhydllaxu9s5el436', + 'bc1p8ay5ew45k3pnay6qw2lcl8fyuj8vmc3uczz7xt6mhxs80mflv43sg60a00', + 'bc1p0xdfvxrw0jm2h0ga000lmxtxaze8jn7vfhvv6lmw8n9h242t4v2qk4xjk5', + 'bc1p4m6ejwuwjhfzz94nxfgrzjuqqxcmgve4vj4ey7tzn5m9v23nyafqpes4hl', + 'bc1pwe0v76gch3h6cee2eljgnhwrwn9zkxwar25nden33dxgjc995qcs2k2e7z', + 'bc1ps2gfwh8v7dhenz30jwpr3xcxwd9538xsqn0vdsd8gpuc4hzjgy7snxhcvp', + 'bc1pxrr895mugdaanyeeejz5re6tg54ac5w3rxwj8f30atkju49dljuqzhl7wr', + 'bc1pyw837p3lg0slvnp6vj79unk4zhsgh7ypy5cg9hnmsl9m5qh055zq23lyzm', + 'bc1p9v44w4ln35tpe0ggqm2n4cs2hlhmlzwjcctlke28zdhad9rp29wswuw49g', + 'bc1p8zfvp20drnr0mw3gnh8yd88s2jems5kjc9a2u7hy7x36kmkgjrmqskhuly', + 'bc1p5je72vevln76z2ccegmm9ayh8akk0ucfq70thcvpw5vct44u63tq5u7vyr', + 'bc1pvkrhsr6mpm0sgrq4rvx6m7uk7uar0rjrp4cegut94eqhgfsdkhxquahd77', + 'bc1ppnlftma8gev5ds00v97xdna3a5k79ufww2vyerug0d276n3zt6zse8nqau', + 'bc1pc3rzsyk2rx86t3mrlragnymjf4685llzav40glyxuhw9zt05j3ms3h5wz5', + 'bc1py5pkv9sxgwudcz9prt20xfffh4e8t2p5xw88py27hlpfply47ats22c4y0', + 'bc1pagjh7vxnv577d3f9eqzkcd8tgc6srykys9rgukgyte32nz9z0x3qkmg5yp', + 'bc1p57gc0hvmw30q3v8h94whslj32h5q436ftkjtrh00y4wuv0tt47sq2wkade', + 'bc1p3lg9x2600xmna55hrgf77r4zx8ltxt3x9egr9zxxt596xyr2nt9qf9enec', + 'bc1pc30px7aryevq4mghkj7ytp34a06e0psjjzwvxqly3h8swvknp9yste47m3', + 'bc1pwkc77fssc9m7w5uw83ezt7z5798gusfvh2aep7kl8pzqa5hr6tvs3l2ka6', + 'bc1phgad4uyt35pdy5vvevvjfspqwg6xnh8tywue688lfjxzjec35huqsw7rpn', + 'bc1pn453ejn6dqpqr06npnq8njz7w8suu7jf2wf9056vrjd7laa69kmqfckpz7', + 'bc1p2l2x9s7yvun27xutqd75tetfn0w07eu7haepqfnzdls8hr796n8s6fhheg', + 'bc1pnpmhl3srastmxrnuu8lyey6qe7fthkkpuuen63cthgt0uwqwkkdqtcte9p', + 'bc1pz83r0veyzsgym76wflv3l0exquy5h46ykwgq3lc6pnqqamstjy8qhrpagt', + 'bc1p9ujscj46hn5d6nqkq0syv62hl7wj0k4m63wfhf2ne4qpwj5qdf4q9evd4w', + 'bc1pxjcxp5jrex5swm0huprs0h3cx5pywcgsykwnglp8s3s2gep3dj3qaxlzvx', + 'bc1p6lcnkexgzzj4whzwu96l47y23kzphlfj82aup73ax3pprdwvl3ns36ttr6', + 'bc1pw80rt6tu5d40aue64lh7eelqgyum6y6r7auacwrjk9yerkam8w6s95t63x', + 'bc1pm4z8xtxyrwktquetd7t0wu2rdsex6zjqrrluuhx3njlekrt039jqr0uz8g', + 'bc1prcwwfm9cxazz6z2ljz4n3nhqv0jfhvg4ed7qm97ynz2axr9g3qyqnhjkc2', + 'bc1pxsah25f66axv3uz6n7jttc8f7xh4q5njtlsgerhf67artudl9j9q289463', + 'bc1pa3yth3m6zheq0k2ckqlzsrvcmtdefn2j32u7u0es0vgndj9q2czqphage7', + 'bc1ped68t67t8yk9pe0f2pd84dxxvuulf7ahwcfk0hadx6m4vfq5cypqm09wrk', + 'bc1p0udpd4sfclysym4ex0x7rwrnxzsjvlpa9fk9av4e2ywr02q6p0wsqk57tj', + 'bc1pe32ytfeahzp030cvreg2htufzwhhykw7akk4vefd4vjkkhnyxv6qrk05p8', + 'bc1padt6sgas00edgesju2ce70l56zusq6d7h4p4xgq0nursga0qqzhqj6spk5', + 'bc1phrpwxyauk26h6rayl86fmjvsgfs8yq32x55fd9zvacf6rr5u0j0q4ct4nl', + 'bc1p4d4wq659nvecy08844h0gg79a79tg6wxhznxgtanq2pumtustrvqerhp4w', + 'bc1p8t9ghjgqw46lu6qfxn0jpc7e8lgcr0j9fvsa63e8d665mhrrmjdsttuvwy', + 'bc1p4ynfnkhrt0m3fyjcp69rryp5qee830gnjzls8mg2ptqpt52q73dsgywthc', + 'bc1p6jrtxy4t9aezqv9rgf847kw6nlhdqy88g3tgddds99n5d5expqts3kceg0', + 'bc1p5rr99pz99zg5rrnck9x8t8c9uxvtd5qfez3huglgv26amsupa96stnkk9f', + 'bc1p5msl4th83xacy8sw8u8k0znfhyqqdk9eqq0n805t3y5usuqmcgxqucxv83', + 'bc1pg4dpep60cgntcyzjuns5vmalshhphndeqrp0kpd8fxz6yt9s0tws39ehky', + 'bc1pvwwxkm9jkkfu6cns4gygsxf49v7pt93cmjr82tfcjdquwltq04zqw59qwc', + 'bc1pjx68s6dk9xvqnwvuc3tthz5kuhseptz4s0w3sk5tftmjs5x6ds2qj9vndn', + 'bc1pm2u3gqe544tl7cr0ea8aazve69sp5nkpfdzadr2e260e652r39ksxndney', + 'bc1pw5ls9fr90kddqamprchykkcflqc45g3swur2efxwz53pegzv3hgqmrt9ds', + 'bc1pane2m0z8ymreh67xkathhrst8jm4ljw53nkq3da23fmmf6gm522sf03t55', + 'bc1pmzsjlfwsrfkm6xcq6nay6agx3uxvu87kh5vwaqy9gx5rr8l03vrskr0gds', + 'bc1pk9zqlfjjn9h5vathr63qejscpd4ljsgetjd3zk8uskt3cu3g3z5qrsr2ht', + 'bc1p5zdcgdk5edp6y8zr7dny4lhjqucfjs53750396sdhewkawpy22ess84kk4', + 'bc1p9tt8f4kregqyq55uvgkhyst4sa2mlu6vw68kksnzgqjx9824fy6s3zq7hp', + 'bc1p2avzn4532avveyjgsvlp4efrsm27y390nk3hdxltw9zk5j8r4smqhshyr5', + 'bc1p3haghg60y5jw3dpqn0tz4mx8fp9fu06j0yhzjyhj7l6appywyd4sr6eprj', + 'bc1peg5t029ejm0dzg38pe5nv6rv4e3w25drxcsr664z7vy88nyhpdqqkq6a9a', + 'bc1p72r70w9uhkmftpwkf6qfknpdftcaljyrjlgd36qnluf5wx8eup7sk4kc4u', + 'bc1pqlja2gkl04jcagms942e8z0v8lxdmdxt9w7mqmdygzrqthhwk99sfhl6yq', + 'bc1pc9xzztm74w4zqm8yg690v9r50shyr9vkckufzjs4m4cdxwvf0tzsnk7ewd', + 'bc1p4jxwz3cvfyhgr9dsqnlenp676u9rderu9yvq7re6nyrzseqmw95sph63xc', + 'bc1pvfpg5v2ze70h03td8yc3ecvn6p3t5velj90ngrf2xcdf0kz54utqg6eeuw', + 'bc1pun2370d5c7lg3grc88f6s5p9pycnp6804zpn6waqfd2y5vxrgnksard60z', + 'bc1pdw74npe0yqfxqqmu56dlqvystzsnvlj77w3h404sayrp5w9zz9tsc45y9j', + 'bc1pv8mu9cfpyqrgmz63jtlxsmr7tw2vtpq9pj52a0mzp4vnh049aqeqpp7ule', + 'bc1pfta7kn83dqv893m4hvdev272eyerqt4p7wc76m6z6p9x9wkekkgqsq82sn', + 'bc1pu6vychqpd29rdvcakzsskumc6t3ct0jhcc7gk3gsadrqsk3q5daqtxfyny', + 'bc1p2rffxpdhxvufa8flvgetky286rrzn4u5e2m6kt2nwzzryl7jlpwsxzp9k3', + 'bc1p09y5fjrdcxh56du0wukpy40lqrsdyqdwlq3g3fpgpsqm6jpyrjhq85yjmf', + 'bc1p4kp4p4l00sw75aw733uukm3nmjstxnjgs4nqd9ah4xkhz5vnnknqj2yplj', + 'bc1pj2q2e6ctv4gznn7ymgpedcj4qpwvgyfcvkju8mn0gl08nqhshtes9sfc8n', + 'bc1pqkx2mw0y2tte7f6724a65crpp2lqkjp3sl8zll3uglmun2kakavqhak47u', + 'bc1p3fsnykumz4grrcaep37xu4eywflehuy0kuzvzrhrdz9vx8ljzmjquq08x3', + 'bc1pfpn0v8fend47qdzjd65ll0wxjena8naueetf3k48lzq0uqeh946qvtm3jz', + 'bc1p6zxvxfuksu5t3rxusukgr3kzkqwwry440zlr56k9n9dhus3aup0qh78mpy', + 'bc1p4mtdpt4q83h4jv8fhfkzrfcg3hkz8mfln0wdrhd3xk4qv2g7exwq4zy4cr', + 'bc1p33dzk43j8djjp0pajenefnyvytw67ppkkf6gj376e0nnsqz0e2vs9xrsue', + 'bc1phg9pptky4ldjlcyp650sqlqsrzp780d373degl2npa8gaamjac8sjywcn9', + 'bc1pftx7hqw76p47qfdl3y8nmtajh2clpxme62ltfh9gnnckyrzzay9smzq0a7', + 'bc1p7yhq02qj2tfz3mgnfmttn6w7garrgetk9g4cfp3udkpsqgy89wasq9gdy2', + 'bc1p3vxsmd8pyzvh8c0j0s8re8tlpv98ewn8qnp58juq40ndkrh3yems7nvys6', + 'bc1p7jjwzjpykr2y4pgaejv8ju0rngqy9djzlj36jmjah9hdd84u5n4qqdsq5u', + 'bc1phmcsjz6vsfz63zchzxau877n0wwqz2wfd3t937yeq94uct2vjw3snlwpf7', + 'bc1p9xh359eu37ywynud40hkn5q67yxnz4nhc5uu5mjav69p2gxx9ycq6a7pew', + 'bc1p3ad80amjmadfzdr79xc4s9zqjdxaensslnwyc8ze7lxr6jdnp7fq6zunfv', + 'bc1p7s59sktks4rhev3hw7g9gulz3tj9ttm8wdn5kfm79ddgz8jrrztq3pfya4', + 'bc1p5lfr0sppja5jlfjkds43vtstvzkxmnsagfhtchfsgk93e8e8ktsqp4076q', + 'bc1pjcpvvlg550w7up87g4ayrlaydrlq7h2587wvxcnm97za6q7euqeqg5cnes', + 'bc1pnkvl5s9nsv6she08zq32t78wtcffelhr4mdavw6psw9djfek5z3qhf2hav', + 'bc1pje9u9shrnjx3ymg45lmle7kaeu948ypd5dwnm5s8pch2njy3dehqq7a57e', + 'bc1pykm2afhjyrjuqc37f3uwdggepau97ljk5tv99prlqg54rpejwwsqzjtklk', + 'bc1phn7hzqk0d5km24qagethuh63re6x3esr0szs7f8wvt6afjdv940q9gdh09', + 'bc1prev3smc7n2rlek6pdktdeg4fegy4hr75tvhpwqj0qu794qmn8w5s6yetnl', + 'bc1pungg73vdjmrxevy6jfxggrmemf3mkva9ztr4u8j3sq52nzjpsyssanx6yp', + 'bc1p2ltevrwc2s5se683qxm0zceva5d0c2lasjn6087mw5hph56zk3hqfs3c9q', + 'bc1prrcj4dz3cvzkn3305k7xa9lc4wmnkk9a855jw322l2lvvvzsezmsveg9ld', + 'bc1pa96tlu8jclfkz75rn0ggfdxtfxca9jmgu09fvscep7xmu7hc5znsdzcsr8', + 'bc1psjln9er9upyy8m552zexfgqrj3ah9pe6rjy5uk9shf36d04qa2uqfqk7am', + 'bc1psymgd4x8lt2aq3xsv6687xr2l8c7d8eqjpqvy3dl8tkzzxve9v3s534yjv', + 'bc1p9w2pxlz9hkw2mwvvk4khc3ezqa4x2npptrxqa5wysdfejarn5gyq79ec7v', + 'bc1pe4xh3j29h9fcgzjnyx6gsfwd249a0mp4qu90gkzs0k60gxj5ezqqmsmmey', + 'bc1py9agj7amgqu0378mypddsp6quawpzdtk2ryeclr7nue94y8ffgcshd30gg', + 'bc1p4pp78da3a2hv3hf9ztpmxxc3kqxecm2eep5mdrzgkzfmkmsrs37qt3zk4v', + 'bc1pe3z4h5gyhpyn38x7yx04zwduq0d6e8ctlzm9a45kdcw8t96wcnksldt60w', + 'bc1putufhuxaanf80r9u2ct2ay583h9dsawl45sp6wq6vs6gg37g5ttsd3s9c4', + 'bc1p8y6xzvxa49qygp4eyslcxz4z0rmm2attrffu7m6k5eh3e4envkyqg8hmdg', + 'bc1prs56u7473g26gtjqxzmjl6k07akdnxrhleyvg2kk6kdjurts99gszvq6a3', + 'bc1pf76uhesvxzyjrn6g30lyrn22r96u0k7zyy8avfqwulx6f0u0exqqjerca2', + 'bc1pr3tq23pntrn3970lk4k4gwjgn503ls3lx4f3dv7nudy5234429gqhmcptq', + 'bc1pxfcuk7m40ww5gd50wl2dcwvqqxyjmpx8ejg9m8zmds58wnxxklasxr2qrj', + 'bc1pygh6a33pgg079kya4l3lsfzslj0qmr0j0jqu6xycssy0jxhj59hsruzlhu', + 'bc1pxd7tjtxqcevnnx5nvpd2zkr9fkvxxfznkl0gucck8tmulvxe69asxgrkn7', + 'bc1pwhz0wc4hw8xw65xdjjvnyyrz68w3a6wy7e09a0fj69p0wvmnxymsrjc59x', + 'bc1p7rwrt0yyxup5uxe6vdjxfna7zp52yj4nul9r7qy7gzwdppv72ursz643d4', + 'bc1p073j0k642jre5mvhxz70y4rjyngcc5zwylj9f0k8ua2swm77p5xsjtle68', + 'bc1phqcjzxshcnxazlx3rmkw8wul9s4fqk26c54kqmzw4q0sfwzdtp6qevte47', + 'bc1pqrpr886mnrtt3aypqy6a9hrv0vc6arly57sq5wg40gr229yre7ssh7vvk2', + 'bc1p0pvu2mxwx5k7rtpytcdhf47qpp9k4r62c0awy26efs4wtyw6z7eqecupk2', + 'bc1pdl3xxsz4fdzd0dl4sn8wwcvcn22fd95m3sjpug00lxes93nq6aqs3e8fy7', + 'bc1pumuwgzqtr93ygatvtv36ywktzlnuezyfx4gww8w75agtu4agt79qksnqj5', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/coindcx.js b/projects/helper/bitcoin-book/coindcx.js new file mode 100644 index 0000000000..4522d9ea5a --- /dev/null +++ b/projects/helper/bitcoin-book/coindcx.js @@ -0,0 +1,26 @@ +module.exports = [ + '12hGEyxk4zMLquxiMiFrkvYSohsXz2D3uZ', + 'bc1qz22hegkllltcydg3pz3an6h352mjmyp7n2vhd9', + '1MzSJodjNmACPKyj9VUv9X55Pby87osLhc', + 'bc1qucl4n347qc6e48w85xdxcv86sm3an8fr250hhm', + '1F6CrpEnHEZh6gQtJ7cf1MtK7Y8GYKoP4i', + 'bc1qn2xm6agnanuyuwfcfw92el7nvt2lpsqr5s5c0w', + '17mxRZ9WeXigSwg3Cm62HxeATnuUphMxGL', + 'bc1qffg4ya27430vv5ymg2lhf4mj7tvtc3ur5qyyq3', + '1JV3umtGC6H6tFUVoFyV5KwbJDscUwrtX7', + 'bc1qhlyrdhfqry06nj902p9dxdftm4pxkhdqeum8y8', + '1KXxS6QnzpB8mSLm5kmXJXqvZF7wVvQDCw', + 'bc1qedxsgzuj8ga644gwlqw4nw7f3xncq4g2rskmzu', + '12T8i8tpeczk5JGf8ppZf1w6SFBRwEa9y4', + 'bc1qpl5kqjkugyncr72a4fhxvm0360ehfdl27e00ja', + '1PRwacjHVksLNTkSYNkiWkRgTm1yDSgLMG', + 'bc1q7c9ylgjsyc0yaxwm84jjh6avfajzfe7dhk6e0e', + '1477uXZ1NfUaaZZdnztQ7h8ftGRpuWQPfA', + 'bc1qygg2x02cfy0e6r7798v4qrcjjkzm8tl5t0xkwf', + 'bc1qljm7vwdgdy6ca97stsyjyl3zdjtkdsdm8vnh8f', + 'bc1qqhwh3tcg5duwq7hdlnlr5n2tg2uq755cwmkjqn', + 'bc1qqe4g7sjxzk90nsgj0mwufwcdtd7kufg7k32xch', + '1avi3SkWKGLis8dGCP9JUnFfVeheP8wkt', + 'bc1qmulc2ju4kykj24xuw0fu73h9h3usa897xhaucz', // + '3Dm2TL1pt1VzeBCq9jgvQG81QPv19PyReh' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/coinex.js b/projects/helper/bitcoin-book/coinex.js new file mode 100644 index 0000000000..387e8adfb6 --- /dev/null +++ b/projects/helper/bitcoin-book/coinex.js @@ -0,0 +1,19 @@ +module.exports = [ + '189myj1KAbiCWfqWhT6Td4noANKBuag3QN', + '1C2Pxf3ghtKyM4mKC3xSLKrN33YcKnKF2a', + '1JZw5HYSoAEfvGGVQ4U2JihZaQkjcXrr2i', + '16M3n9p6CLATDnpsJNTjCn22AaxzErxg5V', + '15cYMF4jcRwpcbjENMdMizCzAmd7Pc51So', + '18JQXgQ4GjZAuYCy1fNAFGHVEAWUui2q9h', + '1LGbUy11yMaNC9s73q7vEad8JTZyczCima', + '1DGXwH2gzBYM6UrVE57DaaQ3hJJm3s32YK', + '152GodsXfK5kYMdH4spzYD3Ttm1u2oNipN', + '18oxoXCq5mah3GjLjGCS3BRTQxxN7738rL', + '1H21g458T25SnAzvFDJiBrcyhfwHiCH5YF', + '14BhR6aE8Fkt2c8E1m2ydx76fBz5kpt62K', + '1Ef59jZsv87uAcwBZdDhNxiSbCceQ6bFTA', + '14ukjw4r3UFC5A8yvG7yt2GdvLUHEWtskS', + '141TDnaiLEW1vE5xd42Dw8HEhDCA2qrZTr', + '1Ew9SPwBHY8GjHd3uBxhtGcvVmyBN7PHcw', + '1LYrQCjUf54vf9G4qwFpJQ9RCyL2DprPqQ', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/coinsquare.js b/projects/helper/bitcoin-book/coinsquare.js new file mode 100644 index 0000000000..1452f7562d --- /dev/null +++ b/projects/helper/bitcoin-book/coinsquare.js @@ -0,0 +1,12 @@ +module.exports = [ + '1P7cDFGeWm6ezez6XGXTAjvm8qcsGiMXe7', + 'bc1q0k5rpdwf7wnq3fuk7dfjqd59p3ke7ufqmlkfp4', + 'bc1qdstretw2uvhjen7hvgaya3nsjgr430x9jhqf4a', + 'bc1qez6ezccleuac4dnj5cpexz5mz3j0j3j655j6qn', + 'bc1qg6a9kpmge0fdwtrymjvq3cydfzgpcge7e05e7z', + 'bc1qg8fywv20ztsp0edtf53zpsnxeu5cqxrmdwmtjd', + 'bc1qm5mqpgtt2ufucfdvhu5xcdgs3vzehwu62wsyqy', + 'bc1qmkkejzrq7ayfjpy7w8gmkhd3uwcy7nryr5apch', + 'bc1qsjc50kf72r4q44ac28v3vrukaxjg4w30rh0cmm', + 'bc1qyz9mssutu8xxcgjvsucz38qvxt7hxwtnm5eh8k', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/coinw.js b/projects/helper/bitcoin-book/coinw.js new file mode 100644 index 0000000000..c81128c1b9 --- /dev/null +++ b/projects/helper/bitcoin-book/coinw.js @@ -0,0 +1,4 @@ +module.exports = [ + '14Z9KSmCo1UjvBiXj2j9er35GmGmaFxsmE', + '1KYBKqRjGbRynSiyoiHndULssXrEeWhvU8', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/crypto-com.js b/projects/helper/bitcoin-book/crypto-com.js new file mode 100644 index 0000000000..f092053a2a --- /dev/null +++ b/projects/helper/bitcoin-book/crypto-com.js @@ -0,0 +1,10 @@ +module.exports = [ + 'bc1qpy4jwethqenp4r7hqls660wy8287vw0my32lmy', + '3LhhDLBVWBZChNQv8Dn4nDKFnCyojG1FqN', + '3QsGsAXQ4rqRNvh5pEW55hf3F9PEyb7rVq', + 'bc1qr4dl5wa7kl8yu792dceg9z5knl2gkn220lk7a9', + 'bc1q4c8n5t00jmj8temxdgcc3t32nkg2wjwz24lywv', + '14m3sd9HCCFJW4LymahJCKMabAxTK4DAqW', + 'bc1qjqy709gqpse60hdsm2d2v0dzzu7yp5dej7fdrpl2x3taccvujq4s0vzsyd', + 'bc1qcdqj2smprre85c78d942wx5tauw5n7uw92r7wr' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/deribit.js b/projects/helper/bitcoin-book/deribit.js new file mode 100644 index 0000000000..d918bf65a1 --- /dev/null +++ b/projects/helper/bitcoin-book/deribit.js @@ -0,0 +1,16 @@ +module.exports = [ + // from https://insights.deribit.com/exchange-updates/proof-of-reserves-deribit/ + "bc1qa3phj5uhnuauk6r62cku6r6fl9rawqx4n6d690", + "bc1qtq5zfllw9fs9w6stnfgalf9v59fgrcxxyawuvm", + "1MDq7zyLw6oKichbFiDDZ3aaK59byc6CT8", + "1932eKraQ3Ad9MeNBHb14WFQbNrLaKeEpT", + "13JJ1nxDeX5fMsDeyGHiLoK8rF2ayGq1cX", + "1MdrdcEzfiJdvs6eVSwUx6bWboPX8if5U3", + "35WHp4Hid61peyH4tuhNunwRj2gtNB41Lo", + "34ZHV8dd6uucEUABUydWpKi6F4qKQntEUf", + // added on the 26/06/2024 + "bc1qzwhw94uldd3c8736lsxrda6t6x56030f8zk8nr", + "bc1qrmuxak470z7zch5f3gz05dc6h4ngwqdq4wx80w", + "bc1qf6lm99tp5p27hsmyskve236nsv32lnfwt4h8wk", + "14HeA1YRUiJGb95HVpVTBuavMUBYGk6y7R", +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/elSalvador.js b/projects/helper/bitcoin-book/elSalvador.js new file mode 100644 index 0000000000..ba5ef8fda8 --- /dev/null +++ b/projects/helper/bitcoin-book/elSalvador.js @@ -0,0 +1,3 @@ +module.exports = [ + '32ixEdVJWo3kmvJGMTZq5jAQVZZeuwnqzo' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/fastex.js b/projects/helper/bitcoin-book/fastex.js new file mode 100644 index 0000000000..bcd87353da --- /dev/null +++ b/projects/helper/bitcoin-book/fastex.js @@ -0,0 +1,3 @@ +module.exports = [ + 'bc1qs7yen7ljpvyw7vn58ql6zfaddqf4rcjalsgmt5' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/fbi-dprk.js b/projects/helper/bitcoin-book/fbi-dprk.js new file mode 100644 index 0000000000..f0913effe2 --- /dev/null +++ b/projects/helper/bitcoin-book/fbi-dprk.js @@ -0,0 +1,9 @@ +module.exports = [ + //source https://www.fbi.gov/news/press-releases/fbi-identifies-cryptocurrency-funds-stolen-by-dprk + "3LU8wRu4ZnXP4UM8Yo6kkTiGHM9BubgyiG", + "39idqitN9tYNmq3wYanwg3MitFB5TZCjWu", + "3AAUBbKJorvNhEUFhKnep9YTwmZECxE4Nk", + "3PjNaSeP8GzLjGeu51JR19Q2Lu8W2Te9oc", + "3NbdrezMzAVVfXv5MTQJn4hWqKhYCTCJoB", + "34VXKa5upLWVYMXmgid6bFM4BaQXHxSUoL" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/fetchers.js b/projects/helper/bitcoin-book/fetchers.js new file mode 100644 index 0000000000..4d798dcc63 --- /dev/null +++ b/projects/helper/bitcoin-book/fetchers.js @@ -0,0 +1,177 @@ +const { getConfig, getCache, setCache, } = require('../cache') +const axios = require('axios'); +const { getEnv } = require('../env') +const { get } = require('../http') +const sdk = require('@defillama/sdk') + +const abi = { getQualifiedUserInfo: 'function getQualifiedUserInfo(address _user) view returns ((bool locked, string depositAddress, string withdrawalAddress) info)' } + +module.exports = { + btcfi_cdp: async () => { + const target = "0x0000000000000000000000000000000000000100"; + const api = new sdk.ChainApi({ chain: 'bfc' }) + const round = await api.call({ abi: 'uint32:current_round', target}) + + const utxoVault = await api.call({ abi: 'function registration_info(address target, uint32 pool_round) view returns (address, string, string, address[], bytes[])', target, params: [target, round] }) + const vault = await api.call({ abi: 'function vault_addresses(uint32 pool_round) view returns (string[])', target, params: round }); + vault.push(utxoVault[2]) + + return vault + }, + bedrock: async () => { + const API_URL = 'https://raw.githubusercontent.com/Bedrock-Technology/uniBTC/refs/heads/main/data/tvl/reserve_address.json' + const { btc } = await getConfig('bedrock.btc_address', API_URL) + return btc + }, + exsatCreditStaking: async () => { + const { data: response } = await axios.post('https://rpc-us.exsat.network/v1/chain/get_table_rows', { + json: true, + code: "custody.xsat", + scope: "custody.xsat", + table: "custodies", + limit: "100", + show_payer: true + }) + return response.rows.map(row => row.data.btc_address); + }, + fbtc: async () => { + const api = new sdk.ChainApi({ chain: 'ethereum' }) + const staticAddresses = await getConfig('fbtc', undefined, { + fetcher: async () => { + const token = getEnv('FBTC_ACCESS_TOKEN') + const { result } = await get('https://fbtc.phalcon.blocksec.com/api/v1/extension/fbtc-reserved-addr', { + headers: { + 'access-token': token + } + }) + return result.map(r => r.address) + } + }) + + const users = await api.call({ abi: 'address[]:getQualifiedUsers', target: '0xbee335BB44e75C4794a0b9B54E8027b111395943' }) + const userInfos = await api.multiCall({ abi: abi.getQualifiedUserInfo, target: '0xbee335BB44e75C4794a0b9B54E8027b111395943', calls: users }) + userInfos.forEach(i => staticAddresses.push(i.depositAddress)) + return Array.from(new Set(staticAddresses)) + }, + + b14g: async () => { + + return getConfig('b14g/bit-addresses', undefined, { + fetcher: async () => { + const btcTxHashLockApi = 'https://api.b14g.xyz/restake/marketplace/defillama/btc-tx-hash' + const { data: { result } } = await get(btcTxHashLockApi) + const hashes = result.map(r => r.txHash) + const hashMap = await getCache('b14g/hash-map', 'core',) ?? {} + for (const hash of hashes) { + if (hashMap[hash]) continue; + const addresses = [] + const tx = await get(`https://mempool.space/api/tx/${reserveBytes(hash.slice(2))}`) + let vinAddress = tx.vin.map(el => el.prevout.scriptpubkey_address); + tx.vout.forEach(el => { + if (el.scriptpubkey_type !== "op_return" && !vinAddress.includes(el.scriptpubkey_address)) { + addresses.push(el.scriptpubkey_address) + } + }) + hashMap[hash] = addresses + } + await setCache('b14g/hash-map', 'core', hashMap) + return [...new Set(Object.values(hashMap).flat())] + } + }) + + function reserveBytes(txHashTemp) { + let txHash = '' + if (txHashTemp.length % 2 === 1) { + txHashTemp = '0' + txHashTemp + } + txHashTemp = txHashTemp.split('').reverse().join('') + for (let i = 0; i < txHashTemp.length - 1; i += 2) { + txHash += txHashTemp[i + 1] + txHashTemp[i] + } + return txHash + } + }, + + lombard: async () => { + const API_URL = 'https://mainnet.prod.lombard.finance/api/v1/addresses' + const BATCH_SIZE = 1000 + + return getConfig('lombard', undefined, { + fetcher: async () => { + let allAddresses = []; + let offset = 0; + let batchNumber = 1; + let hasMore = true; + + while (hasMore) { + const { addresses: data, has_more } = await get(`${API_URL}?limit=${BATCH_SIZE}&offset=${offset}`); + const newAddresses = data.map(a => a.btc_address); + + allAddresses.push(...newAddresses); + sdk.log(`Batch ${batchNumber} completed: ${newAddresses.length} addresses`); + + hasMore = has_more; + offset += BATCH_SIZE; + batchNumber++; + } + + return allAddresses; + } + }) + }, + solvBTC: async () => { + const API_URL = 'https://raw.githubusercontent.com/solv-finance/solv-protocol-defillama/refs/heads/main/bitcoin.json' + return Object.values(await getConfig('solv-protocol/solv-btc-lst', API_URL)).flat(); + }, + pumpBTC: async () => { + const API_URL = 'https://dashboard.pumpbtc.xyz/api/dashboard/asset/tokenowners' + return getConfig('pumpbtc/v2', undefined, { + fetcher: async () => { + const { data } = await axios.get(API_URL) + return data.data.bitcoin.owners + } + }) + }, + tBTC: async () => { + const API_URL = 'https://api.threshold.network/tbtc/wallets/pof' + const { wallets } = await getConfig('tbtc/wallets', API_URL) + return wallets.filter(i => +i.walletBitcoinBalance > 0).map(wallet => wallet.walletBitcoinAddress) + }, + exsatBridge: async () => { + const API_URL = 'https://raw.githubusercontent.com/exsat-network/exsat-defillama/refs/heads/main/bridge-bitcoin.json' + const API2_URL = 'https://rpc-us.exsat.network/v1/chain/get_table_rows' + + const config = await getConfig('exsat', API_URL) + const custody_addresses = config['custody_addresses']; + const custody_ids = config['custody_ids']; + const owners = [...custody_addresses]; + + for (let custody_id of custody_ids) { + let lower_bound = null; + let hasMore = true; + + while (hasMore) { + const { data: response } = await axios.post(API2_URL, { + "json": true, + "code": "brdgmng.xsat", + "scope": custody_id, + "table": "addrmappings", + "lower_bound": lower_bound, + "upper_bound": null, + "index_position": 1, + "key_type": "", + "limit": "100", + "reverse": false, + "show_payer": true + }); + + const addrs = response.rows.map(row => row.data.btc_address); + owners.push(...addrs); + + hasMore = response.more; + lower_bound = response.next_key; + } + } + return owners + } +} \ No newline at end of file diff --git a/projects/helper/bitcoin-book/fire.js b/projects/helper/bitcoin-book/fire.js new file mode 100644 index 0000000000..bf91f24ca2 --- /dev/null +++ b/projects/helper/bitcoin-book/fire.js @@ -0,0 +1,6 @@ +module.exports = [ + 'bc1q36c0rp4ydl6uvvguhw9nr7njm49addzkgftqev', + 'bc1q3z0khuld6nd7esv46nxj9ketteqw9qz86peyeh', + 'bc1q4hz59t7v0uxujuyrhp9679uppur7ke9u3vshvd', + 'bc1qdlrh7ycyqxe62vk5m70y353vmep9ullxx5j9ar', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/flipster.js b/projects/helper/bitcoin-book/flipster.js new file mode 100644 index 0000000000..7ec436017a --- /dev/null +++ b/projects/helper/bitcoin-book/flipster.js @@ -0,0 +1,3 @@ +module.exports = [ + "31iAUikiV7yKEYBzbA1iHPcanHNsLBFe8C" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/garden.js b/projects/helper/bitcoin-book/garden.js new file mode 100644 index 0000000000..15748805f0 --- /dev/null +++ b/projects/helper/bitcoin-book/garden.js @@ -0,0 +1,4 @@ +module.exports = [ + "bc1qhww67feqfdf6xasjat88x5stqa6vzx0c6fgtnj", + "bc1qs0vw6ahdv2xc9a5jkgqdpawmmc6eq6hqr50e7e" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/gate-io.js b/projects/helper/bitcoin-book/gate-io.js new file mode 100644 index 0000000000..dbb53dc722 --- /dev/null +++ b/projects/helper/bitcoin-book/gate-io.js @@ -0,0 +1,11 @@ +module.exports = [ + '14kmvhQrWrNEHbrSKBySj4qHGjemDtS3SF', + '162bzZT2hJfv5Gm3ZmWfWfHJjCtMD6rHhw', + '1EkkGXR7dTbZbrKFKoe6YEP4gj4GzMeKvw', + '1G47mSr3oANXMafVrR8UC4pzV7FEAzo3r9', + '1HpED69tpKSaEaWpY3Udt1DtcVcuCUoh2Y', + '3HroDXv8hmzKRtaSfBffRgedKpru8fgy6M', + '1ECeVF6wfbiihCRrrpRnkbwrWsZfYmixMG', + '1FhncfokiSDagazXbuVqKQ6ew4oyDmAzhG', + '1FLKsCiEsABS7LysfDA8R181TQ6eLjoxPv' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/hashkey-exchange.js b/projects/helper/bitcoin-book/hashkey-exchange.js new file mode 100644 index 0000000000..978a0da1c2 --- /dev/null +++ b/projects/helper/bitcoin-book/hashkey-exchange.js @@ -0,0 +1,6 @@ +module.exports = [ + "bc1qqe394jlqq86muq23d4vrnhzzvcv8jnepgt8lx7", + "1NfJSiqBw4fb74KgVQrPsk5W5aqitAD1Xv", + // "bc1qlrawqecuwgpzzwh04pkhtfsqsk33kald22ds3c", // bosera funds https://www.bosera.com/english/index.html + "18oxobhCNKnHjb7nEFDmPdXbCZthFWezrm", +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/hashkey.js b/projects/helper/bitcoin-book/hashkey.js new file mode 100644 index 0000000000..9dbb016d3b --- /dev/null +++ b/projects/helper/bitcoin-book/hashkey.js @@ -0,0 +1,4 @@ +module.exports = [ + "bc1qyvppkaa74d9jvtz664a6uxmj09hf0eyg3uhx4h", + "1DywJMqHHMWuP7xyfkRqJZCEe7GdEKFRcp" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/hibt.js b/projects/helper/bitcoin-book/hibt.js new file mode 100644 index 0000000000..24ca126ecd --- /dev/null +++ b/projects/helper/bitcoin-book/hibt.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1qpxntlx09kqvpwl7vmjw9f28yvytdqkdx8xh63w" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/hope-money.js b/projects/helper/bitcoin-book/hope-money.js new file mode 100644 index 0000000000..3bc94a71f0 --- /dev/null +++ b/projects/helper/bitcoin-book/hope-money.js @@ -0,0 +1,7 @@ +module.exports = [ + '15PYHP5ZW29B3o19jFNKz6RyRdHCtzJj5H', + '16BLcAyJR8unm8RpQT9PGTwh5uPpZEf2ut', + '3JoCB8ifwhL4YKo9rCYMgVGbqxBqnpQpdS', + '179fgM9yyTHj4ZCTfAcGhUFiQMXuPx5xrF', + '1LaC3Xt8RZWYH1pjcvXxrWxLvXe7iR3ybe' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/hotbit.js b/projects/helper/bitcoin-book/hotbit.js new file mode 100644 index 0000000000..2ac17bafc8 --- /dev/null +++ b/projects/helper/bitcoin-book/hotbit.js @@ -0,0 +1,3 @@ +module.exports = [ + "1MiFZMJkFMhMrubjjo6f5oEhh7XgSwXWgp" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/huobi.js b/projects/helper/bitcoin-book/huobi.js new file mode 100644 index 0000000000..ee1188524d --- /dev/null +++ b/projects/helper/bitcoin-book/huobi.js @@ -0,0 +1,14 @@ +module.exports = [ + "12qTdZHx6f77aQ74CPCZGSY47VaRwYjVD8", + "143gLvWYUojXaWZRrxquRKpVNTkhmr415B", + // '1KVpuCfhftkzJ67ZUegaMuaYey7qni7pPj', this wallet is backing USDD acording here https://prnt.sc/i3cFaak7H9Y8. For that reason, it should not included as HTX. + //These 3 addresses has 48,555 #Bitcoin. This is only less than 3% of the total high value assets we have, including btc, usd, stablecoins, T-bills.. According to Justin Sun https://twitter.com/justinsuntron/status/1590311559242612743 + "14XKsv8tT6tt8P8mfDQZgNF8wtN5erNu5D", + "1LXzGrDQqKqVBqxfGDUyhC6rTRBN5s8Sbj", + "1HckjUpRGcrrRAtFaaCAUaGjsPx9oYmLaZ", // add on 08/08/2023 (we defillama) + "1L15W6b9vkxV81xW5HDtmMBycrdiettHEL", // add on 08/08/2023 (we defillama) + "14o5ywJJmLPJe8egNo7a5fSdtEgarkus33", // add on 08/08/2023 (we defillama) + "1BuiWj9wPbQwNY97xU53LRPhzqNQccSquM", // add on 08/08/2023 (we defillama) + "1AQLXAB6aXSVbRMjbhSBudLf1kcsbWSEjg", // add on 23/02/2024 (we defillama) + "1ENWYLQZJRAZGtwBmoWrhmTtDUtJ5LseVj", +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/imbtc.js b/projects/helper/bitcoin-book/imbtc.js new file mode 100644 index 0000000000..e92993a2c3 --- /dev/null +++ b/projects/helper/bitcoin-book/imbtc.js @@ -0,0 +1,3 @@ +module.exports = [ + '3JMjHDTJjKPnrvS7DycPAgYcA6HrHRk8UG', '3GH4EhMi1MG8rxSiAWqfoiUCMLaWPTCxuy' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/index.js b/projects/helper/bitcoin-book/index.js new file mode 100644 index 0000000000..bd4c9be54b --- /dev/null +++ b/projects/helper/bitcoin-book/index.js @@ -0,0 +1,210 @@ +const ainn = require('./ainn-layer2.js') +const allo = require('./allo.js') +const avalanche = require('./avalanche-btc.js') +const fetchers = require('./fetchers.js') +const bevm = require('./bevm.js') +const binance = require('./binance.js') +const binance2 = require('./binance-btc.js') +const bitstable = require('./bitstable-finance.js') +const boringdao = require('./boringdao.js') +const bsquaredBTC = require('./bsquaredBTC.js') +const bsquaredBRC20 = require('./bsquaredBRC20.js') +const elSalvador = require('./elSalvador.js') +const garden = require('./garden.js') +const hopeMoney = require('./hope-money.js') +const krakenBTC = require('./kraken-btc.js') +const lorenzo = require('./lorenzo.js') +const lorenzo2 = require('./lorenzo-enzoBTC.js') +const merlin = require('./merlin.js') +const multibit = require('./multibit.js') +const obelisk = require('./obelisk.js') +const roup = require('./roup.js') +const tronBTC = require('./tron-btc.js') +const wbtc = require('./wbtc.js') +const xlink = require('./xlink.js') +const xlinkLST = require('./xlinkLST.js') +const xrgb = require('./xrgb.js') +const imbtc = require('./imbtc.js') +const twentyOneCo = require('./21Co.js') +const avalonCedefi = require('./avalon-cedefi.js') +const pstakeBTC = require('./pstake-btc.js') +const biconomy = require('./biconomy-cex.js') +const bigone = require('./bigone.js') +const bingCex = require('./bing-cex.js') +const bitfinex = require('./bitfinex.js') +const bitget = require('./bitget.js') +const bitmake = require('./bitmake.js') +const bitmark = require('./bitmark.js') +const bitmex = require('./bitmex.js') +const bitunixCex = require('./bitunix-cex.js') +const bitvenus = require('./bitvenus.js') +const blofinCex = require('./blofin-cex.js') +const btse = require('./btse.js') +const bybit = require('./bybit.js') +const cakeDefi = require('./cake-defi.js') +const coindcx = require('./coindcx.js') +const coinex = require('./coinex.js') +const coinsquare = require('./coinsquare.js') +const coinw = require('./coinw.js') +const cryptoCom = require('./crypto-com.js') +const deribit = require('./deribit.js') +const fbiDprk = require('./fbi-dprk.js') +const mtGoxEntities = require('./mt-gox-entities.js') +const silkroadFBIEntities = require('./silkroad-fbifunds-entities.js') +const fastex = require('./fastex.js') +const fire = require('./fire.js') +const flipster = require('./flipster.js') +const gateIo = require('./gate-io.js') +const hashkey = require('./hashkey.js') +const hashkeyExchange = require('./hashkey-exchange.js') +const hibt = require('./hibt.js') +const hotbit = require('./hotbit.js') +const huobi = require('./huobi.js') +const kleverExchange = require('./klever-exchange.js') +const korbit = require('./korbit.js') +const kraken = require('./kraken.js') +const kucoin = require('./kucoin.js') +const latoken = require('./latoken.js') +const maskex = require('./maskex.js') +const mento = require('./mento.js') +const mexcCex = require('./mexc-cex.js') +const mtGox = require('./mt-gox.js') +const nbx = require('./nbx.js') +const nonkyc = require('./nonkyc.js') +const okcoin = require('./okcoin.js') +const okex = require('./okex.js') +const phemex = require('./phemex.js') +const pionexCex = require('./pionex-cex.js') +const probit = require('./probit.js') +const robinhood = require('./robinhood.js') +const rosenBridge = require('./rosen-bridge.js') +const silkroad = require('./silkroad.js') +const swissborg = require('./swissborg.js') +const toobit = require('./toobit.js') +const indiaCovid = require('./india-covid.js') +const wooCEX = require('./woo-cex.js') +const bitlayerBridge = require('./bitlayer-bridge.js') +const arkhamExchange = require('./arkham-exchange.js') +const chakra = require('./chakra.js') +const nerveNetworkBridge = require('./nervenetworkbridge.js') +const nexusbtc = require('./nexusbtc') +const tapbit = require('./tapbit-cex.js') +const jbtc = require('./jbtc') +const bitkub = require('./bitkub-cex.js') + +const p2pb2b = ['39BFtTzZjj6o2s7eewefFQxqM4617VmhEK'] +const teleswap = [ + '3CAQAw7m95axbY761Xq8d9DADhjNaX9b8o', // POLYGON_LOCKER + '3KLdeu9maZAfccm3TeRWEmUMuw2e8SLo4v', // BNB_LOCKER + '3E2hwnq5BsmP1ea6JUhjdKZjh2wy4NuQ8T', // BSQUARED_LOCKER + '31uHNFfbejkbUD2B26o2CARfU1ALJ6x6Ag', // BOB_LOCKER + '3LNsey3ceG9ZHkQ7bcfAjwnew7KVujHt29', // BRC20_LOCKER +] +const bitomato = [ + 'bc1qgmtx3caf8rlxmzw703ga2sljv3rkkj39e4ysk9', +] + +const stacksSBTC = [ + // https://docs.stacks.co/concepts/sbtc/clarity-contracts/sbtc-deposit + 'bc1pl033nz4lj7u7wz3l2k2ew3f7af4sdja8r25ernl00thflwempayswr5hvc' +] + +module.exports = { + ...fetchers, + stacksSBTC, + bitomato, + bitlayerBridge, + teleswap, + ainn, + allo, + avalanche, + bevm, + binance, + binance2, + bitstable, + boringdao, + bsquaredBTC, + bsquaredBRC20, + elSalvador, + garden, + hopeMoney, + krakenBTC, + lorenzo, + lorenzo2, + merlin, + multibit, + obelisk, + roup, + tronBTC, + wbtc, + xlink, + xlinkLST, + xrgb, + imbtc, + twentyOneCo, + avalonCedefi, + pstakeBTC, + biconomy, + bigone, + bingCex, + bitfinex, + bitget, + bitmake, + bitmark, + bitmex, + bitunixCex, + bitvenus, + blofinCex, + btse, + bybit, + cakeDefi, + coindcx, + coinex, + coinsquare, + coinw, + cryptoCom, + deribit, + fbiDprk, + mtGoxEntities, + silkroadFBIEntities, + fastex, + fire, + flipster, + gateIo, + hashkey, + hashkeyExchange, + hibt, + hotbit, + huobi, + kleverExchange, + korbit, + kraken, + kucoin, + latoken, + maskex, + mento, + mexcCex, + mtGox, + nbx, + nonkyc, + okcoin, + okex, + phemex, + pionexCex, + probit, + robinhood, + rosenBridge, + silkroad, + swissborg, + toobit, + indiaCovid, + wooCEX, + p2pb2b, + arkhamExchange, + chakra, + nerveNetworkBridge, + nexusbtc, + tapbit, + jbtc, + bitkub +} diff --git a/projects/helper/bitcoin-book/india-covid.js b/projects/helper/bitcoin-book/india-covid.js new file mode 100644 index 0000000000..ec4208aeec --- /dev/null +++ b/projects/helper/bitcoin-book/india-covid.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1q220k2449fau0pxu9hfn28q3w4k99ep9hwsa5fa" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/jbtc.js b/projects/helper/bitcoin-book/jbtc.js new file mode 100644 index 0000000000..bf147722d1 --- /dev/null +++ b/projects/helper/bitcoin-book/jbtc.js @@ -0,0 +1,4 @@ + +module.exports = [ + 'bc1qmukuv7j57umsd5tgg9fw88eqap57rzphkfckyp', +] diff --git a/projects/helper/bitcoin-book/klever-exchange.js b/projects/helper/bitcoin-book/klever-exchange.js new file mode 100644 index 0000000000..6c2d7acf09 --- /dev/null +++ b/projects/helper/bitcoin-book/klever-exchange.js @@ -0,0 +1,5 @@ +module.exports = [ + 'bc1qze8pn5vywzk8enqdr9ve28lyas23kurzd37027', + 'bc1qgy5zyuvsw5wnt5lrx3m62tt2pmdl69avd5vw6n', + 'bc1qk4l4u3lh7rrufsw0z6vmkln5kesf0a9q0srnkr' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/korbit.js b/projects/helper/bitcoin-book/korbit.js new file mode 100644 index 0000000000..ccdfbe18b4 --- /dev/null +++ b/projects/helper/bitcoin-book/korbit.js @@ -0,0 +1,23 @@ +module.exports = [ + '1JtAupan5MSPXxSsWFiwA79bY9LD2Ga1je', + '3E8BTrBB7jxAemyUqSnN4YFLMC22cShZJZ', + '3GoBetHTvfnaRNQbR4yy5YNUjX4d8mTQKK', + 'bc1q09j44e0xxxusj3zsan20x7tuvtumxfv9smlq27t0nwp57gxf7htqq6m9lj', + 'bc1q0uffd8egas4w87dxq998ttfl6j3jtw6k7cafce9v4mvr5qc9tvfq9czqk9', + 'bc1q33m8td986p3vcnap9zqpx3d8v8zujtkvqacsya5xfvf945vmvxzqth4h4t', + 'bc1q3yn06lfl8ayjukya52ksff0uaveurfc8lm3ftdgu8ywvwanx8lqswj7w9u', + 'bc1q4sv2fxlp6w08wkq8ywmughxkm7n75d2fmrgnmvwun6rhepyknjxqm99v4x', + 'bc1q7fww9657ts2au45wh0ed39rjze6ja93z0498z4j89pqjky266wzs0sz8ka', + 'bc1q9pnwfyd4jtkulyk4w057wsdjhykaw6fftw06k2cn2m3y7jlsfe2qvxvm8e', + 'bc1qa8may4g0yzezjyesqcq0mwggy5wwzl0yhs0a8tk9ucej5qg6ujfqscv2jq', + 'bc1qgkx4ee8ac3as5y4ddhw6uedyk9adsywdzgc0fzxv304lcrh4qs9sn96agt', + 'bc1qku6z53kuyaj9r898kj6esqnwz7wke82mwgw43vhu33ld7sx3200s2u9p9x', + 'bc1ql0p3klhr2d8z07ja3t5d5dnxrenhp4gcjeszxpfflr08zaqqx5zqpkeqnl', + 'bc1qnerwvz93pcj653r5yd4hnd2d7np2drhdhyruj7qdvl3psc5wnf0q6x9me4', + 'bc1qs9ut74nue7vjknz2eqxegmtuzqhjzx9y8tzjymvlg05v8a5ffr5qz402cx', + 'bc1qsk6h7d2l7e7r2a8krlxjn6wdnhhszyrtzcugdsfa5zz4syajzl5spd52h5', + 'bc1qsmqvkwrsy5xw2hm885l5fv7s2hxzauz5fn9jayfmd86305wehrts2lztgs', + 'bc1qtlen0nuvln3aqcn2r3nljshdmzakq7z5z4rexpk23mj8u8lmc8ysc29jct', + 'bc1qzdt5z4f46jak59jku5jmvv3f2ru20htqs7jhy0whazgd5v4626eq4vkxqz', + 'bc1qzu4lnzfpskwsvnyvzud9a7ru4d2ft7whqvl5d3kskxxhgeupnjjquzvt97', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/kraken-btc.js b/projects/helper/bitcoin-book/kraken-btc.js new file mode 100644 index 0000000000..cb54d312af --- /dev/null +++ b/projects/helper/bitcoin-book/kraken-btc.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1qqwf6hexnnswmj6yuhz5xyj20frtp8exv7mclck" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/kraken.js b/projects/helper/bitcoin-book/kraken.js new file mode 100644 index 0000000000..c089298260 --- /dev/null +++ b/projects/helper/bitcoin-book/kraken.js @@ -0,0 +1,16 @@ +module.exports = [ + 'bc1qnhmemsqfhycvp6g50v732h7wfwdt68el4ux5ttu8xwsrzngmxv0qr55aga', + 'bc1qa5aux0l2c3l99tpmd9c85770kqpksg3g6dxaw03jj6lphnwy4lqq68xfgc', + 'bc1q3gqqnn9hr0uachfk6rv3qhf3pp9z8a4z63ksc5qu0c2vvtykqd9qj3fyum', + 'bc1qplr053c80nzlqapuatfslyhmns6sfn32qzz3xkdn36jjryw8vsys8y7wlc', + 'bc1qhxv3pg2hsnw3m9jukuc6erjwwd03rzwhd2k6zh5uf6s2lwpuv3rq9zefru', + 'bc1q08n37tm63z3f0myqe6zjx7ymtng8c9qedpwpplq95qkmx0cpke7qyz4y8v', + 'bc1q02cq8du8r7ktuy5l0ltc4cv82xnaw4upaaw8y4rq6uycdp0k5nmquljtzk', + 'bc1qcf9qe8ytx5qlcq0ft4vm2xm3fyfvurrkende46hpmwwnzpctfu3szxpve2', + 'bc1qrj5vg73fxs6h6pmdjld387j5szkswc2y39rfutw8gl93h647wpksukyln9', + 'bc1q9hqaqzyf6zsd330pkvtq5uxcxprzr368zdsxx5srtep7kepx523q2gd0ef', + 'bc1q36l8mssxdlncj7njkqvayv3jumked9jdtjxete66cxnzluf4j0msjm4w80', + 'bc1qs8cyln26t2f5rwu2frnqvtltfxt0qqql0elmhrpsexlzveap82eqtyvsgu', + 'bc1qcds58swh4g6zsdmws9ltcdpqz4l44utu5wv9vfpmemps3whgdacqkakrk0', + 'bc1q75tsfq2c5cqp2ss32qksmnzd9yea2mjsjktdmrz900dcmg43ck4s66sgjx', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/kucoin.js b/projects/helper/bitcoin-book/kucoin.js new file mode 100644 index 0000000000..713bd603fb --- /dev/null +++ b/projects/helper/bitcoin-book/kucoin.js @@ -0,0 +1,114 @@ +module.exports = [ + 'bc1q04p5psjsp7j80sq6u4djgqk3c7pk6n93q43ply', + '38fJPq4dYGPoJizEUGCL9yWkqg73cJmC2n', + 'bc1q0243pvcnutwtm3m6t005402yk8utq4kfqqghhu', + 'bc1q080rkmk3kj86pxvf5nkxecdrw6nrx3zzy9xl7q', + 'bc1q07yhcr2qmwkc32z4gfaemtjtx90am6e6rpl9sg', + 'bc1q224fr84g5xqvp2lkwmzvyec9frwk5w5f5v5w38', + 'bc1q204dfzksn4l0rhhajm9fyd5h92dac8tnuur8jp', + '37nA3mMvQwPGVh6BKdLXKBiPjLFVbRLZEp', + 'bc1q0h72mfwgtsnfkcmpsnt3kmrrp4z5x3v469mz0k', + 'bc1q0l84mekaaszjfst7lswaheu7gcymv2h2k8z6fl', + 'bc1q2hpdg7pwghz9um27hqsmv2sg3f8f9fwtjvdenx', + 'bc1q3yy6h7x9wtffu8f7hpkhlyssw3s28xzj0nydye', + 'bc1q3kwpxug0q0w55qjrfrcykxu2yn02xhzn49fnxw', + 'bc1q2wxfd36s204jkpfmez2u0nh7540cctur2v27ht', + 'bc1q3g7sltlncshtqcu9wyhqavzxlfa4tj97whapup', + 'bc1q4jszmgxml90ernkn3l908sn4hr94zk6wynp788', + 'bc1q3sevrnv8khxe6fnl87ad8e4fjefu7rmp39pxl6', + 'bc1q4xt86cp0xf6zsrfsgspnfm8579ksurxppae66a', + 'bc1q4f8uwyargzd8eajj2vrdjz4l0hvhjdlpmchstm', + 'bc1q3fzjrvlvsl6j58x38gzk0c8dgvfudsqcsdqyry', + 'bc1q5h4ucvz7qqnhypekhd8jusc8z8msytxflzfs8s', + 'bc1q5ty9r24qftnx7c0vw0y76d5kneekse7hl878yv', + 'bc1q6z680y2fkmmu49ykm0dm0temp25p034p034fme', + 'bc1q5qsadcuj0at2xk4lfca5zull8mkgwfm06qduq4', + 'bc1q80elat9h0nfhuzvuvn4yl2nh0eqxwfzas5afnv', + 'bc1q6dr8nqmgm5qvuukuf5ux3m0fdthnhx033uv3vr', + 'bc1q6tj4wm295pndmx4dywkg27rj6vqfxl5gn8j7zr', + 'bc1q5w44vqvfpnwzpclwhdmx98uenwdtdfd85qtw34', + 'bc1q82qe6w4afzt2l94wn4d9e0uchj8t2x2dtdf2pu', + 'bc1q5cza73vpzhrsruy4e7gudvq6xv6vfs9hjs5pl3', + 'bc1qa482xwlzz479nyep2ve0z6t9t29dg0zem9wqt2', + 'bc1q8yja3gw33ngd8aunmfr4hj820adc9nlsv0syvz', + 'bc1q9uddlcfqdyh6dlu3pptchazr0va0cshnqss2yk', + 'bc1qa8jaa3pss396sx52hkft5ta2dey69fkrt8mfsc', + 'bc1q9020xphp6ukc4j72hy52gk2nxujwt4kr8dq6eu', + 'bc1q8jjlupqcvxv25usqu8hvlnd8ym0stcpq4jfy9x', + 'bc1q98mvmv9nl4p744tdf2zh3uzv30yea2njy0le9d', + 'bc1q9hrcsckdwrezlw7gspefeyk9nyqmwpy3ea8wwx', + 'bc1qa3h4re6gf6qmmesjqfzn0vu2rmc6e00s4gjjle', + 'bc1q9wvygkq7h9xgcp59mc6ghzczrqlgrj9k3ey9tz', + 'bc1qfyr7tvv0a2dcq6xp4dgr5nemfmnak2e2scn6hg', + 'bc1qdhqxc3h6dnc6x0k8emtcnuyt8aspy83w0g9xht', + 'bc1qfcuvuaam666pv777ad59wwue5l7j36hr95f8gv', + 'bc1qf3wwg8dayutammv2e6lahudyc7j2ef579hyx3m', + 'bc1qamlau4w545vsjsmnhzmztlv3sy4tu6v9cnxtcg', + 'bc1qea6uvmc2kqndhewtlnc9duh5aa30ptvp3mhk9h', + 'bc1qgrxsrmrhsapvh9addyx6sh8j4rw0sn9xtur9uq', + 'bc1qcyjkktrvwatdqyvpm04vs3k2x5r4ystnw7msrk', + 'bc1qggwgcwnjvlma9hr569jhgx2yuncaaq0ace5ywp', + 'bc1qartr66auwm2tlcjp7cqgs8cx4p6q7lydrtwf4p', + 'bc1qkrewa0m37wjmkcgs0w2gh9zhjqclkq74ckt4x4', + 'bc1qk947xflcafthv8k6gx7m2cvwzqzy68kl5npkyw', + 'bc1qh573eaggrqexqx7xzm4e57k6sm9r7zpuxwqxzn', + 'bc1qj5gnrfdmcftzxgrwcdts4plw4kaydjs5kq560l', + 'bc1qlldl5qma9glxwt3j06eef05590uyy2td3ye90c', + 'bc1qhafun32xkhxpec8dq3kpxyq5x9ur437mj4dusy', + 'bc1qh6tqdv9k2pew6vyvrmg76ae55n5rwa2djmyyyk', + 'bc1qjxv6j2sv6za57khvvd5yu9jxkv3g3qvxh6sach', + 'bc1qjefrh2gf28g6x56eeausc30gxewamj7qwtzfpg', + 'bc1qhs4u46ygdskuljadnxn6thqsrjw3nf9r8nfclm', + 'bc1qnl68wnf3d6jz532dl65hj9urw9j2432fjg03nr', + 'bc1qnetky45z2vguazzczuy7x2446vsjn4ku76d5k8', + 'bc1qlw4dv8nt5uc35dkmftlt3nt0rl0cte4he998qt', + 'bc1qnvdx4dt8kn68csvcqvdtnlzw8hadapk9e9k857', + 'bc1qnqhcfntmlh2nnu5rp25szqgxw7v3783xrgcd44', + 'bc1qp22u6u75j2nvvhychyfd9uxr6s2jkf5p985rct', + 'bc1qnxn6352sn9mm6dxgmfrn43fgtu0l2kcx2y3ddh', + 'bc1qm882j3900we3eewa5fdw4hlwlnef35phmsn7x8', + 'bc1qpafgjjmqlv32m6m6qpte2ldlz0wcuj3ajyt8gd', + 'bc1qmtvfu97nlrl8qtujvj5jg47dc0p3w8sun6esaf', + 'bc1qr9hf2v2gf6haq7tsvckel7u6ja46fnqfkt6u5p', + 'bc1qpuhnd3gqhqlezgcuuhc2ywfw2w03uyz0seg802', + 'bc1qr77hw0dek5f8uvmeazd3egym2m3npjf2nvrza5', + 'bc1qpdfchk5j5tvkwf0z4kpftysv88h5szz4ms8try', + 'bc1qprpm6caxcuewnme4at7h2skhv2rury274a0vln', + 'bc1qq9u67zacfe3vz40e36nltn3agt9hf75g7av2xx', + 'bc1qrf9llyljmwy8egcjjsw0z0a8n5sgjlhcemezcl', + 'bc1qqx0udc7ndr77yg4v7rwuugnwk8n8xqaydmakfu', + 'bc1qqg92jrprgh0vdq3pd8wctnzqyuwn5kp20hhfh6', + 'bc1qpnmkhx9ndgnk639wh5gyuex4nsx7s8t8d33pzt', + 'bc1qtcxldruuuhvk8zjmw3a3dpwfvu2d0m9qyctv82', + 'bc1qtlgfyl9yjyluwzyyayp2fs0r4kcjtv2axsmzl8', + 'bc1qs84j4s45nztsx9759vkha0wvvx28dlqk7p2n5y', + 'bc1qteec4z0tcvv40r6py855gg77rwnhe9ege42x0t', + 'bc1qrt7rkpswpgmcag7txzf6ps9mvepwgndshqdx6d', + 'bc1quqy97s6lj3mty7hdp4at7uvmlzssh57jezx85v', + 'bc1qseaaa4hnexjugx26p605getpdnkwy3up64uws9', + 'bc1qudtghe07cfslxyv36zk5ums65c32xcw0nz6zhg', + 'bc1qsfdf47l3ftsqv2muvfftnulcp4qwzypuxm9k30', + 'bc1qul97gsvkpfju6fa53cezzxx5wmv4t8rl6gdt62', + 'bc1qv3v2u78m6vec2jqe7w0esm6rccmysccdvkpr3t', + 'bc1qwjftm2nl65gmevmutfqe8q7k0aaahlxt3a9wam', + 'bc1qvh0zexe6422t85x3kzgvms9fd984606uhf44ug', + 'bc1qvj8a4kjq888c2l22pdgjx3cgaq94vm3hjzyq6l', + 'bc1qwgzyz8xpwdrx54rsm5p74ksc6wkxr8y4ncejwh', + 'bc1qvvqafwsqr2rquyvym4l6rtt7ayukpmw2sfxn7f', + 'bc1qvkzdg9x58zyupept40zcjhmztn3l2flqss2f4x', + 'bc1quyayxjg0r68wsj6c2zcu3f7nnj9um5pwdgr36m', + 'bc1qw83c8j8pf2azegtyeszqqdaafgqj4hl3xcdy95', + 'bc1qwxg6gra5g9tlvztr9qphzpruch30ka40e4tl48', + 'bc1qz0q4hyn5k8plleax2g52jsr0k07vgtqcr634g3', + 'bc1qz0nfyvylrvn9h2rqm7lcegzv79du2p5jezgept', + 'bc1qxfgeqygy229hrjrwmklzgwme70h8mmrjcyueag', + 'bc1qyz4zr7cv2922cjua9xrezsda82gl8z653w6ru4', + 'bc1qxnsr0al2lw7hqg90j05x9s0gxm5g4skmcslrut', + 'bc1qymcn42gst8jvcu4y9c6tf6ngfs38j66hd5zvhs', + 'bc1qzghz50r66hlp4wufyy55m5a3jjl5grkmetygsg', + 'bc1qyatvzh0ndg464ph7txwjw6kgkczw8kw03lcgg7', + 'bc1qy8054ua06akklh6avf06crt4u2hu4skasr5ead', + 'bc1qy7uquly0ha78lmn47hedd7e0swkmwpyft9j7e2', + 'bc1qzy4lg8yg6dsn0dppx3a4kq8tqe2hhrh6af3778', + 'bc1qzkqzmlj47z0ww253xu2egewcw4wagz6qfa6fr8' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/latoken.js b/projects/helper/bitcoin-book/latoken.js new file mode 100644 index 0000000000..220be747b8 --- /dev/null +++ b/projects/helper/bitcoin-book/latoken.js @@ -0,0 +1,5 @@ +module.exports = [ + "bc1q48amr6l7dvacdppgucvnswwuyleaqh4dus8z8h", + "bc1q2cgh9nxn7cqmqhk4hc5fu6mju8nzy9a20qqqh8", //cold + "bc1qw5fc9ml9vm4xq5c6xkcdu3vtwyw4gdn8lw0uwq" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/lorenzo-enzoBTC.js b/projects/helper/bitcoin-book/lorenzo-enzoBTC.js new file mode 100644 index 0000000000..976fbd5141 --- /dev/null +++ b/projects/helper/bitcoin-book/lorenzo-enzoBTC.js @@ -0,0 +1,5 @@ +module.exports = [ + 'bc1qndzgrwj3y2lhcklme4t72jxq3df2h05vjdgzpp', + '19wFRSr3GYHmVQtnmbkx7Wkjw3jZdyYB9a', + 'bc1qa4yfx2meqadqwpmqznlct0t2j6pt5tw5xrpz06' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/lorenzo.js b/projects/helper/bitcoin-book/lorenzo.js new file mode 100644 index 0000000000..2de44a8956 --- /dev/null +++ b/projects/helper/bitcoin-book/lorenzo.js @@ -0,0 +1,47 @@ +module.exports = [ + "bc1qaf6laj9m7jteztyz4lulrtcjtpusfcfnd7r7xn", + "bc1qf6cj2z2e2mzuvfrl80vgt53k7jc2vf36ckahgy", + "bc1q5hc68n6krnzgzswf7rknha2aqxzrzup4vlhce8", + "bc1qpxpmr3zdjulqnwa3jdvm83tpaek6dv3kc75ms7", + "bc1qaml9d9mqgfhsfuaa2ymutdl4psj8c2undx9n72", + "bc1qutgngqyrflxrfmk9k28ucvq0s2v8a43nwfwv02", + "bc1qrx3fpr5j6sprxett45c2kl9p4pajyxep0mapfd", + "bc1q00t2ntm46c2nfvcer6ukj6npaxjurujthse4qq", + "bc1q3pzhncle68gct6me08kn5kf9awkevt6ettwrmg", + "bc1qw6cvwx8ajprmp2lzkhrsps2qx4k9r2pj4xj98x", + + //btc script-address after lorenzo stake to babylon + //cap 1, Delegate to Lorenzo FP(db9160428e401753dc1a9952ffd4fa3386c7609cf8411d2b6d79c42323ca9923) + "bc1pjy5mq7vlqkq6nldxghauq0sqgh3hjdrp2adl7tcalkavt9ly5g8q3zkymk", + "bc1pck8hnfa76k9gqtddyjvt0syzlxj5atfr5g0dk0ktmdr9u9h2gnesge0f5v", + + //cap2, Delegate to Lorenzo FP(db9160428e401753dc1a9952ffd4fa3386c7609cf8411d2b6d79c42323ca9923) + "bc1pf2x7w0wwutvj5qznrxygpv5wcj3nvzq9dqhpmkyfk84nkg778q0qa605e8", + "bc1pstunan5nv657dqx32tdup3y8uxq6eja6z3d4kukspjpq23gxf4zqdce4hn", + + //cap2, Delegate to BSquaredNetwork FP(2f8ec74d558fe7a97d10be230bf1485db9be675228abfbf957ba050c714b679a) + "bc1py54xje6lxdd8ej9hqxdxnp5dyjwu2eda2rxa2yuaptv3lrw3t2tscly6y7", + "bc1pydkry09hpqqv4hxrrlrgpddky4u39xrpqd0xvsf9smjpd65s49qqnq5zel", + + //cap2, Delegate to ChainUp FP(31287a9728f7b11863b9c56fc4cca103f0473dcgitdc6746ed7f79050d3adff644b) + "bc1p6dltgypr57fc648txjj7zwk6k605ca9x2ul0pycld22x86jcvxmsg7547j", + "bc1pw8za3k5upa565n0kv55e89a8l0hkzpnfenj767j0cwfu7rn83yhqvuehcd", + + //cap2, Delegate to Lombard FP(609b4b8e27e214fd830e69a83a8270a03f7af356f64dde433a7e4b81b2399806) + "bc1pa56692v3hxguvu8vgu5d7dh9twlj7wm87qvzvxdru3rnluv8nmdqk58ewz", + //other vault bitcoin address + "bc1pu2e56xlz284s5lh9am2k2ys2lhtau5mgq6j9fgljxt7tegsgtp3spmvk0w", + + // cap3 + "bc1pd8z0x5a34w3s3nvyzfjn5z9qchg52wm2exktqev76uc5mjq9lsxq6wsf0m", + "bc1pm3k5ssdpw7lyzqy4ndqvgs6mvanw046sktw79xfmw0znvrng2wps8qw6zy", + + // cap1, BBN target stake script address + "bc1pzr98tfuzxxjwkk3fq9k86ar98ttnj6zpf4x62099avdupj443x9qv5xdax", + // cap3, BBN target stake script address + "bc1pcrqesnduvztc080dvu0wdm6jzjvuf24g0kamn6p2h2ru0jmssljq69n7mv", + // cap3, BBN target stake script address + "bc1prku5dse3ps3hkyjn5lpu0qcypcmqmhqhh8wfuztpck5h5unx5wjq9mpjjv", + // cap3, BBN target stake script address + "bc1p9yrhpkm6klag7r0xq8f93degehxc086tnv2lsckg54cl2yl5wyeqdhx8v6" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/maskex.js b/projects/helper/bitcoin-book/maskex.js new file mode 100644 index 0000000000..22f1111072 --- /dev/null +++ b/projects/helper/bitcoin-book/maskex.js @@ -0,0 +1,4 @@ +module.exports = [ + // this wallet was collected from https://blog.maskex.com/news/announcements/embracing-transparency-maskex-reveals-wallet-addresses + "39DUz1NCkLu25GczWiAjjgZBu4mUjKbdNA" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/mento.js b/projects/helper/bitcoin-book/mento.js new file mode 100644 index 0000000000..2a3f595798 --- /dev/null +++ b/projects/helper/bitcoin-book/mento.js @@ -0,0 +1,4 @@ +module.exports = [ + '38EPdP4SPshc5CiUCzKcLP9v7Vqo5u1HBL', + '3KWX93e2zPPQ2eWCsUwPAB6VhAKKPLACou' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/merlin.js b/projects/helper/bitcoin-book/merlin.js new file mode 100644 index 0000000000..ce4d8c1851 --- /dev/null +++ b/projects/helper/bitcoin-book/merlin.js @@ -0,0 +1,28 @@ +module.exports = [ + "bc1qtu66zfqxj6pam6e0zunwnggh87f5pjr7vdr5cd", + "15zVuow5e9Zwj4nTrxSH3Rvupk32wiKEsr", + "bc1q4gfsheqz7ll2wdgfwjh2l5hhr45ytc4ekgxaex", + "bc1qua5y9yhknpysslxypd4dahagj9jamf90x4v90x", + "bc1qm64dsdz853ntzwleqsrdt5p53w75zfrtnmyzcx", + "1EEU18ZvWrbMxdXEuqdii6goDKbAbaXiA1", + "bc1qptgujmlkez7e6744yctzjgztu0st372mxs6702", + "16LDby5cWxzQqTFJrA1DDmbwABumCQHteG", + "bc1qq3c6kehun66sdek3q0wmu540n3vg0hgrekkjce", + "124SzTv3bBXZVPz2Li9ADs9oz4zCfT3VmM", + "bc1qyqt9zs42qmyf373k7yvy0t3askxd927v304xlv", + "bc1qgxdqf7837dxe8xkhvctgc499kwh5xw7ap3uwhs", // add on 25/02/2024 + "bc1pruhkl5exjt0z824cafauf750f5g08azuvgcjctv0enz5csayaj7ss3j5wc", // add on 25/02/2024 + "bc1q97vmervc8x9hzr4z4yvzn3x4rk74se6e8x8sgy", // add on 25/02/2024 + "bc1q2lzqzjcq472x8v0kgdcn4m5y8cq95ysnxm6vemu0qsuqgzyge06sqmqdal", // add on 25/02/2024 + "bc1qcmj5lkumeycyn35lxc3yr32k3fzue87yrjrna6", //nft_vault_address; + "bc1qq76dy32nnk5sha36etg6pdj94vl5zrskavux2f", // add on 12/05/2024 + "36n825H7orW1u8yWmvR4zs2CWfmkY2rkpK", // add on 12/05/2024 + "bc1p35l88j3ashhktg75tjctt6pacrgpyr93ldt7yw484dm4expq073qk4n0a0", // add on 12/05/2024 + "bc1pahkqca39mfcfay7nueczyhn9v8wq96x7mp4pjxpsdpsnurxzuwuqnhsdg3", // this wallet was provide by merlin team chain on the 14/08/2024 + "1A7oMBdQir24ESgk8LDccM4MUKJx6d2mCw", // this wallet was provide by merlin team chain on the 14/08/2024 + "bc1q0hgd38zjp2v2rahqverkmdaak4vc8fynyatqet", + "3BN9ECDCAjgxaQUmJCBCM7JtJZaCeB6rL6", + "17z6W1Eq1A7hWcWQiDxUcFTZBVCMsYrLye", + "1McbLy27nLVzJ4ubMnFm3jxnQ3nbq2mpr2", + "17vH7EX655n5L4iPAfVXPn3rVzZbrgKYBC" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/mexc-cex.js b/projects/helper/bitcoin-book/mexc-cex.js new file mode 100644 index 0000000000..0200d05ca5 --- /dev/null +++ b/projects/helper/bitcoin-book/mexc-cex.js @@ -0,0 +1,3 @@ +module.exports = [ + "13uZyaPbt4rTwYQ8xWFySVUzWH3pk2P5c7" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/mt-gox-entities.js b/projects/helper/bitcoin-book/mt-gox-entities.js new file mode 100644 index 0000000000..862186f080 --- /dev/null +++ b/projects/helper/bitcoin-book/mt-gox-entities.js @@ -0,0 +1,7 @@ +module.exports = [ + // https://www.reddit.com/r/CryptoCurrency/comments/li1fw7/btc_silkroad_stash_seized_nov_2020_by_the_feds/ + "bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6", + 'bc1qmxjefnuy06v345v6vhwpwt05dztztmx4g3y7wp', + 'bc1qf2yvj48mzkj7uf8lc2a9sa7w983qe256l5c8fs', + 'bc1qe7nk2nlnjewghgw4sgm0r89zkjzsurda7z4rdg' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/mt-gox.js b/projects/helper/bitcoin-book/mt-gox.js new file mode 100644 index 0000000000..a0581b1999 --- /dev/null +++ b/projects/helper/bitcoin-book/mt-gox.js @@ -0,0 +1,81 @@ +module.exports = [ + "17Tf4bVQaCzwWrDWGRPC97RLCHnU4LY8Qr", + "1BzK87zuqidZn489Wb2oLSktrjKrX7TLKe", + "1Drshi4RAuvxk4T6Bkq959ZvLbvy7b1wvD", + "1EiiKCCnFgHjEvPZdu29qqgdBm8zTvpU3U", + "14p4w3TRCd6NMRSnzTmgdvQhNnbrAmzXmy", + "12KkeeRkiNS13GMbg7zos9KRn9ggvZtZgx", + "12T4oSNd4t9ty9fodgNd47TWhK35pAxDYN", + "15kNZcrhxeFZgVVLK2Yjzd69tRidbFdJEZ", + "1LS5EFRRMDgMQusW6zokQUHjzNUfy6HHCQ", + "1FrV9hv1AW34BGJvobJatyzUWYDWB9epRW", + "1HdKXsNQtzDcfB6PGM7DWTgX9vhBWsz1ak", + "1Fu4YgM3Y9CxvioGPqkSzkydAC8MVaPN1D", + "1G23Uzwj55k2A9TRwaTknqGav66oDTkWCu", + "1GkZQcDy8V6pmHFZqUBUBCnN9dc2hoWasD", + "1Hm6XDmhKCHz68wDEYTapN9MEanke8iwUk", + "15SeCwVCFx5cWyrcdD1Zp1D1zxjH2SELPg", + "15U4VsmWG1cdXAtizvQsW4r7iMxzp64Tgu", + "16jZZkMYqjUWUtQ9DfDvHdH5ko5BcnH9XQ", + "16w6sZBDP58yyeyZAcvnxcEGJpwR9amM6g", + "19Cr4zXpKw43xLJhFZW9iv4DDNtQk2TDeB", + "1GyDutntMuYyA2vQGW5HFcKLfx4cbDdbJq", + "17etv2L3nhk6SCcWSNW4eoZkBy84izAm17", + "18ok25NTkdrUzdByFJCNVsqVYkujZ8aP45", + "199Yxz2TJGtND3QKsHTptTJivqSaUZBvku", + "1AZu7TQmKBAes2duNDctYwjAB9nhHczUnA", + "17KcBp8g76Ue8pywgjta4q8Ds6wK4bEKp7", + "1LLc8aA9C9LLULGbYCYSFKXgxKP2DXdCqP", + "1CZsoJfkknbnW5fKrt1oR7N1ALE5WmDGP1", + "1DedUxzgwErg4ipNi988wPgLk5thwciKcc", + "1H4K3dGfNbAN4AUfyUrpkGpjrd83sntDpV", + "13sXfpp2V16nnxYvW9FHHoBdMa3k98uJw8", + "13Wv5hGhubAWgSPWtXYh6s1s7HX2N1psYg", + "14mP6caC5dFhHdVAPCjPKM8Nm36MBDR5pM", + "155FsTtEFq4eGCcBxDseuwLKPbmtWbyHJR", + "156HpsWfgkWYLT63uhTAGUSUF3ZMnB9WWj", + "15QcKCa84ZCHxbsqXDoKhi5XbmQB8jPEAd", + "1EK8vW7UYaYHKiW4TZmYJKtwcZLM14VjvP", + "1Hb8DmmvvtTYv5RBLuGtDxznkZwVpd5Vjy", + "1HuPVqz2xvf1rdNFUqd62vRTyxP3jeX9Ch", + "13xGCc4TPSYY9GYxBGVNox82KxyjkFnxMX", + "13ahgw8sM95EDbugT3tdb8TYoMU46Uw7PX", + "1439q4Na8v88kPBqoyg8F4ueL9SYr8ANWj", + "13dXFMyG22EsUsvaWhCqUo7SXuX7rBPog6", + "14USZ558Rr28AZwdJQyciSQkN4JT1cEoj2", + "1FhRuUkk8Bfx8FJDemtxhKAR4F8GCNKrXG", + "1Mm9brripN4RPTzkGnRrbt5uDWdqbfk2iX", + "1LueUjEuBgc7cQhsWT8zAfTjcWmrNBZXaR", + "1LXi3x7hyt17cxncscGE887WCrC6XDNZ4P", + "19KiFrafXEyJCUDYFEv3B6tBUwyfFo7kNU", + "18YDgRhxsomuBZ1g9d8Y1JuRmxDhF8Bvff", + "18hcZVFPqDNAovJmb9vA6hEJrDz6uWXNGh", + "1BDZBTb4KE5oq6wAgA6EvAe3uCFRrAbPao", + "195HvmjXgoF3M5vFaBC8swZPhwrE7VhxRD", + "18KDS3q6a4YV9Nn8jcyMvNoVPfcrfemeag", + "19c8sUa54yQuRTVDfJa3iDkkCaFkzBJLPB", + "1B6kJM75iu5ty1HAHMMz6tT1HhjoGNTCa9", + "18M1Z337NqLtK9V69bssnQUYsvb7hmfSFS", + "19eihBKk6e5YD2QXAe4SVUsxRLLnTDKsfv", + "1C5aU4Xnpd3txbxehk46UZgiuNB8QdpHCH", + "1BXyJc6BVuTFnHQCcjiWX2xmCPNVfaSZeb", + "1Ar6meJQCkNoC9wnPcyRNNpzX5fBDaGcKd", + "1CRjKZJu8LvTutnSKq4zTJ4yiqrzMAArYW", + "1HweN9p41BY2RBunsPqyVuheEq7gVoxA9u", + "1HX4s3JeFU3x1eQgPNQVAdx6FoCtbb1hr8", + "1HzEPuenagLEWj68igDXBBXrzc293RuR5V", + "1JtgU6Uo1RAt5eiMf34EehyatUezBQP36C", + "1JVmoJT3471FjsX5H4hAeR1RyrDgpkHbpm", + "1JVU43LNKXqa9W5fCh8tppxDDEWgfeNg46", + "1JztCg7eKSkb1vi7NzGJynXpLZmoaFtYud", + "1KFDUSZuapMv7YaDmL6cyrHTQhma1MtFYs", + "1MkyfwJf7uhWTmVGGQXfcT5ip31DoHMxsz", + "1LzwbLgdKd4eFLkpRdeajkH1YJkVCip2zj", + "1MPJJzRaT8vLhowNB4dVyWRxxu79dq7WkB", + "1MvpYtqgBH7CXbTutrSVCTNHPzm9vakuRy", + "1N5X4kcZ56uRh24XrZoztS9Vb8G7j1Joop", + "1Pq7hooZbEAz5y3QMnqFY8C5xqTdrjUwcA", + "1PRXQEoL8vzEzoJJ9hbtAP6NaV2daccAUn", + "1PxGTuJzDx1ceFHx4Z5CHaWuhiPBNovmZD", + "1NA3Tj4b1jtx9eGELe31Jw4DrzTqKP3ayH" //https://www.cryptoground.com/mtgox-cold-wallet-monitor/ +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/multibit.js b/projects/helper/bitcoin-book/multibit.js new file mode 100644 index 0000000000..d9c9bf3c7a --- /dev/null +++ b/projects/helper/bitcoin-book/multibit.js @@ -0,0 +1,5 @@ +module.exports = [ + 'bc1p6r6hx759e3ulvggvd9x3df0rqh27jz59nvfjd2fzmh3wqyt6walq82u38z', // hot wallet + 'bc1pyyms2ssr0hagy5j50r5n689e6ye0626v3c98j5fw0jk6tz3vrgts7nt56g', // cold wallet + 'bc1qmcrpqanjnrw58y0fvq08fqchgxv5aylctew7vxlkalfns3rpedxsx4hxpu', // cold wallet +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/nbx.js b/projects/helper/bitcoin-book/nbx.js new file mode 100644 index 0000000000..b8d0715362 --- /dev/null +++ b/projects/helper/bitcoin-book/nbx.js @@ -0,0 +1,4 @@ +module.exports = [ + 'bc1qd79ypayqr03lmvcqc40udn6yuq4mve34ychy6a', + 'bc1qgxrcuzn62qjk3e3echysa9srg87la26x0qn2sa', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/nervenetworkbridge.js b/projects/helper/bitcoin-book/nervenetworkbridge.js new file mode 100644 index 0000000000..0e2d9ef953 --- /dev/null +++ b/projects/helper/bitcoin-book/nervenetworkbridge.js @@ -0,0 +1,4 @@ +module.exports = [ + 'bc1q7l4q8kqekyur4ak3tf4s2rr9rp4nhz6axejxjwrc3f28ywm4tl8smz5dpd', + 'bc1qzhwyexqzfz4d0mu7ktdad63wfssg08cek9sgjp' +] diff --git a/projects/helper/bitcoin-book/nexusbtc.js b/projects/helper/bitcoin-book/nexusbtc.js new file mode 100644 index 0000000000..4b7500ca6e --- /dev/null +++ b/projects/helper/bitcoin-book/nexusbtc.js @@ -0,0 +1,4 @@ +module.exports = [ + '31oxjGsmepoq2cipeGQ2zKZRRBCf1m3kAC', + ] + \ No newline at end of file diff --git a/projects/helper/bitcoin-book/nonkyc.js b/projects/helper/bitcoin-book/nonkyc.js new file mode 100644 index 0000000000..efdc101acd --- /dev/null +++ b/projects/helper/bitcoin-book/nonkyc.js @@ -0,0 +1,3 @@ +module.exports = [ + // "bc1qy8xx8fcsmdlc447ls4wzw2tn3y6c6cy64wckhz" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/obelisk.js b/projects/helper/bitcoin-book/obelisk.js new file mode 100644 index 0000000000..713f0b0422 --- /dev/null +++ b/projects/helper/bitcoin-book/obelisk.js @@ -0,0 +1,12 @@ +module.exports = [ + 'bc1p0tr3dgulgpx43dkktjxy8z2azz6yvx4j7s0lelj67tlwct0wnqtqeakfer', + '14ejzLtUSMsjZE8Pp2LUhX3Pf7BbXPeZyP', + 'bc1pr6pga0d44xm3t8z36qnya6sfznsm8fwkn507x6gqt86xtnvm4h4sj2zqus', + 'bc1qy4pkldj4dqxtqypz6awwj7y8vahkht8uqhdlw3', + 'bc1qyd4g2r0n0p9u775z7062rz8j88xxy27kmmh5aj', + '155FvRapVDRbFYxaxGxJ9eCQjgr7X2yC6g', + 'bc1qjnhtrjgr4y0new266twr6x6703lshszuey8zwm', + 'bc1quxgdtm6n9zau50n6aptcyn55gm0r5xjhvl8399', + 'bc1qt887udazek8rl89ck43nar4397a8qkp9qe9qdp', + 'bc1qunzwmk6gkx3ugxd4kmult6vl8vlws0w2jfume8jhnyxmz47ucy4qkhqwu6' +] diff --git a/projects/helper/bitcoin-book/okcoin.js b/projects/helper/bitcoin-book/okcoin.js new file mode 100644 index 0000000000..41c3c4daa9 --- /dev/null +++ b/projects/helper/bitcoin-book/okcoin.js @@ -0,0 +1,4 @@ +module.exports = [ + // we only added wallets with more than 0.1 BTC + "bc1q2s3rjwvam9dt2ftt4sqxqjf3twav0gdx0k0q2etxflx38c3x8tnssdmnjq", +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/okex.js b/projects/helper/bitcoin-book/okex.js new file mode 100644 index 0000000000..359fcec6d0 --- /dev/null +++ b/projects/helper/bitcoin-book/okex.js @@ -0,0 +1,186 @@ +module.exports = [ + '1LnoZawVFFQihU8d8ntxLMpYheZUfyeVAK', + '1JQULE6yHr9UaitLr4wahTwJN7DaMX7W1Z', + '1DcT5Wij5tfb3oVViF8mA8p4WrG98ahZPT', + '1CY7fykRLWXeSbKB885Kr4KjQxmDdvW923', + 'bc1quhruqrghgcca950rvhtrg7cpd7u8k6svpzgzmrjy8xyukacl5lkq0r8l2d', + '16rF2zwSJ9goQ9fZfYoti5LsUqqegb5RnA', + '1FY6RL8Ju9b6CGsHTK68yYEcnzUasufyCe', + '1MbNM3jwxMjRzeA9xyHbMyePN68MY4Jxb', + '1Lj2mCPJYbbC2X6oYwV6sXnE8CZ4heK5UD', + '178E8tYZ5WJ6PpADdpmmZd67Se7uPhJCLX', + '1BsdDaJtgFZrLfzEXvh6cD4VhtHHSHhMea', + '14kHu26yWkVD8qAnBfcFXHXxgquNoSpKum', + '1AumBaQDRaCC3cKKQVRHeyvoSPWNdDzsKP', + '1DnHx95d2t5URq2SYvVk6kxGryvTEbTnTs', + '13rCGm4Z3PDeYwo5a7GTT4jFYnRFBZbKr1', + '15Exz1BAVan4Eweagy1rcPJnfyc6KJ4GvL', + '18QUDxjDZAqAJorr4jkSEWHUDGLBF9uRCc', + '1M6E6vPaYsuCb34mDNS2aepu2aJyL6xBG4', + '1CE8chGD6Nu8qjcDF2uR1wMKyoWb8Kyxwz', + '1FTgXfXZRxMQcKSNeuFvWYVPsNgurTJ7BZ', + '13jTtHxBPFwZkaCdm6BwJMMJkqvTpBZccw', + '1FfgXrQUjX5nQ4zsiLBWjvFwW61jQHCqn', + '1DVTB9YKi4KNjyEbAHPp17T8R1Pp17nSmA', + '162z6mSSHzfTqb2Sn3NUk5r1Y2oGoCMCoM', + '3KbDzhb8B5pUU7Wk1y26J8D4cxYLmxJsca', + '3A8tCFwWyHQey1npTAWYTtrjLPKLXpSpLd', + '33a278YeJBRvQuemSo6yeugafqdS4x98TM', + 'bc1qc3g2dx3fn9s27v92n555r2tzhkxhad2wc0wm0ahlgpmhsr325mpssz80s6', + '3ABQAsnVgK8gDCBtWeEuoRvG3zdgABrDHQ', + '3AWGaggM87Nnhit5DwYYfXyvzW1NYutCw2', + '3QLVSDvh1r9u28PDWUDyg3nR7HqxrUZ4jA', + '3QFtYbR22en2AizTb7JVFA9bL2rf1fbNJr', + 'bc1qrp6msfnqxrl2gp4phmq6mcz995xc6m8n6fn8nygjfg8p63ncy4gsp3xn0e', + '31qq3eDdNyvyoDGrNYAAN5GU2BagDNANFf', + '3BdEq8vnX1o1J4Zpwj6wkPh5FxrgxLAibr', + '3AVMfb3vJi9CbQEGyoHmpgptgbJioyKykQ', + '3MYUxfT4mx8imVz7R8bVs71NisrYnmjUbT', + '3FS1EFCqZM7KEhsVoiNu7NC8658Kq4oCiY', + '3BiWZUFxpjJN6W93Fz3aCcCPBTrpYWwyoS', + '3NiufwUuJZnUHmgSopESaeLBJkALzJMcgk', + '3JcWcMPtxGaCuhKeucTMe1V865t7UhrNnT', + 'bc1qh0w73elagqvhfkkulrah0s2epdp922d3e6r8w43uz0e8ujafcjeqcz8lwa', + '3MWakirPr7MnizUAtWuDJmt919PZciSBvi', + '3LEV2xDk8D7uy4PVEGFZUm9fcT6XvCvHen', + '3FR7ZCHv26jaWWzv7EBPAXGgBpFuVFUnH3', + '38X48VjATu2AHowPzHefNqVvKyheGzVv8k', + '3AgGgHDcqd9sxYiagskZH3EPswwqza1TXd', + '3CGKuMZrkQQd4zj8FsTmDhineKACFpQBZX', + '32hhwGNtGTZ4J1LLz7p6o55Kxm7mzgREJ4', + '3E9GBso3ipQb2fbT3PNbeqgj8RkgJcR4X5', + '34MdsKf8zE6NeAy98TS1yxUTEoBkDT2ZwZ', + '3J7F1pczapCk1sRef6Hmvh9NfU6QiV3w55', + 'bc1qdk55vq5vrzt44pn93t9e3rwecw2dy4pcwc5gwugdjm3sh9xuqu3qzcwt4h', + '3PDMVx1YRhySaPEtCV2AT1aEq9DwgPU4uq', + '33j5fuJc14aff3Z6vHZBxaHEKMdNmKbRxQ', + 'bc1qvg6drx4rdcv85pteka94eskh740wrtgulg3tp7gcmm43vgund4sss4vzyq', + '3QUyiuBQF46KAMM7wdnDnu8GKVQYieRQ1N', + '35D2tNKFmqiVrvXan6tdxgatZoCBimASmZ', + '35Wvz1krBwzgQ7REXS7iJp3Qz7k3rmFNNF', + '3LMYZ3jPoKW2jscuT8fj8Nh4d66W3uX8us', + 'bc1q37nz0uheu4997ufs84efw7jw248mk9v83sgpmvsr6nawhaadx5lq2hclpt', + '3Mkfqxh6BuYCAiKxuvVWKn64N2xvReB3wM', + '3ANAufFoSaVJefhAZ7h9qViqdfJKoCWvbC', + 'bc1qnw79hhts8r84gykqkctyhu3j4gckll9gqxktzqgx5a54m347zf7qxhcyn8', + '3MYrRpUhNWxB8Ydk9gvMou5yZNtXNynxcT', + '3LFcssbNQRmRCCEUSbpDA5yzhsFH5waDoe', + '3NEwT3x6nrab6Wxddwb7jbWY8KYqJkewGA', + '35uFYLvWLQuEo6GxSGHT8JigaoUyqmNJjE', + '3DWvnsbAJJTLufQ4AhQY7LsVQrKoLjEHXQ', + '3PdNS2nqeE6G7cTcVmGjAVjz6HaPcX2FGj', + 'bc1qwkkedj4nzep7dw05s335x6n23520eq955mpcwypftn5q4n9japmqejkxlp', + '3Qae3YK3eKSoM57jpVYjvWkS7E2KnPFHSU', + '34HVDP9RFA9MpopGQ4TutLLVMFhhJFM9AX', + '39ZEaLMDxWi5EWx9cQ2W3ixDP8rWHhz8GY', + '39XwkmkcMAakYG9E564F6RZcp1RSMhUw8X', + '3QpVtFcEdVPTWqZbo8cSZwRgbHMbSEDoeP', + '3PHu7Z1dtRYbeum2SNWFCA4Fmq8r3UeXdQ', + '39AabFsw5ew4QcAC7zpeNkuk58FoZnJkvy', + '3NXxvFdsXK8DPRuGKbhNsvtP5FoL1s6hzF', + '3Jg623UZuqvvFLYbBsqqYiBCAyWUQUDG8k', + '3DgW9QH2GoVVoqwJd3paooAScy2vusEJDu', + 'bc1q8nne4amt4wjdaa0yxuzyw949xjd7fh2w9whh4uvh6haf6c5n2kvswnxk0e', + '38jFY6wBwBpFHtM4L88jF5o155SRVvr2wT', + '3CtTopUBx6QZomCjQDvbW65RtgsWn8g9LS', + '3KPPCAsWf6dxamkMBTeH2svaTVS7xgeL9q', + '3HoEwvrqYRnrizFN7gTg5ouSbV3Tek9pab', + '33yFzhVfaY9phULdN8kBfz2UfyUVZhFHNH', + '3Akts59LQNb7GU3gtHQcxh2r9zDfyUE2FJ', + '3EdYLLYiYpoLt9sEQ9KQQ3LbF56YRoiFPw', + '3GGLdxjaqvaguzTX9z4UTYaCoeu6sUyvNi', + '3M8Xbr9vobCoxMCWwxsS9doTP6HNQvx3op', + '3LcquVjVeDpFn1oJBs6mu2H5cc3EVCcJ2i', + '34Nr2xntQYxtnBARQmzswbuB1hNhnKvkoV', + '373oyKosqPkcYEsF7ipbw13WwDmvoNGgpG', + '34dhaAMB9sCBidT1LpjpbmZjkecsDpGhxH', + '3NRgSpzcsGA5mkjKinjTgBzfBYc9CBGXwW', + '3FMAKm9fEXfNXYtb6qBGaJvG3DRKtvPy5E', + '365S7mJV4MVqBfutYw65KuURCiohnMhzWh', + '3JJ4LULa6VtcVVxZC9tsNN9JM693mcrCeE', + '3CB7RwASFyWfYNCSWrri8crPhfK6yynMQ9', + '3HzYEwURshSeJZJn1ak5ioHKQV5rfZPXY8', + 'bc1qvusjx72vh3qkvw36jdqvl6sdye8ne8hfdaveejprj6xc24mpd8wsrf6w07', + '36U5xAL6FzFetzebPNT1ZQnANEk1TurVJr', + '3LkDsn4LZgYnMqZF2wAXCVs6kc72xpNLLz', + '3Gmt31zvMb52fJRRvLV3Pr3XTeDvVjGHAr', + '3DdCY3f5Ky92nSen5M2M2bzbBLUhMWafG6', + 'bc1qck2mvm6wp8xqxlk98eyl89kgwtmgw02cgqwsjstkg4uerqpqclxq6se9wu', + '3BexyYLsJQuN96qDRsnrU9yACnUSxxjWXx', + 'bc1qt5t0qhww0w7uaczxn9du7yu2l2hgpnen06r42u98du3cs6tqvezqatj38e', + '36PCQLrcXhNG3BZPeaND3zCW7cHgzDVYp3', + '3KGGtqwaQahxaN4GovThCyNdg6THK17Lrv', + '3FLnTqeKpK8CXiEA39b77pCT85sVWJXzN5', + '3AL5dD3jvpDHu8Qn7yZxGdpztWxieKxF4R', + '3G7e21FgygBmWDRMykauLANpuBK8iKqXpJ', + '3Kg2JcNnBczmHSX3udTfrKdqDy1gkrVZak', + '3QJBNEMY6TezfEBXGoc5PUKoLSCcWUd1Y5', + '3QQ8Cotsxbs9qrAyqLKaPjofzvcy5qipCY', + '34SG5K1QrntsigARCZJxNv8NwfSmQxPsDi', + '37Pd5nJZyXwjoGSwKW3ivWfeaW8VSjCey4', + '39J18vgfymGnJ2EYp6fb13rHNKBASbuMtf', + '3JwZq9s3yBhi8FikgYu2RvhjyBAhnSiLgy', + '3H4T7yRpphtyzpDUEiwBTtBa3fBMvHaKUZ', + 'bc1qrysu5ykl5pdlk7d9j0z5rwak5h9rus6cx2udc0s9tqhf5842nqgsdtgtly', + '3JqwqaLxqnDqXuJuKKp41UFSiFR1CuqznP', + '3JqzTCvFxye7nrVWGTBH2CNqZ7bbFppBww', + '3KWKbaAsf5qmbyBHXnVH6YqBgP4ZcNkUsc', + '3FbmQz3WvASHgCQUz3C2JmGdkd1gQFLdC2', + '3FMrfjg6zD3CTXSHLAiRcn3RFyBR8MMFR9', + '3KeFqqpbJawWvAudsi4q8Zx9Lewponyyht', + '32G39DN4kb9Sd6hk8RKySDf1QVFmQeAwtU', + '3BqZtfY5wZk7qHQaQJ4gBmqGLnakH8ybRy', + '3K1WNLse7M28jbowGsZmNaMV9FsM9yW3fE', + '351qZH3E9rwXg5ZDY3tgvsYhkm9CnYV25N', + '321DUXbk9gEEKG72DU2TcADDyfZXkX3fHP', + '3E5jAXsSi5x7oj6GQuM6WQPuVZaXeYd3sU', + '3HEBzhigBkmhVf7kx1KFXif42AqQWr8KH6', + '39smXTQdqD2W767ipLishHV4diSV4xNFxA', + '3GQ4DGB2tfS6YrwfVg9MF7KBRCLWkugLWR', + '3AEKc9AokfB1nBvsdS8LVFJysZSQBJRrny', + '3G3Sis7s9Jjex2Pcaerh17HvSJ19qHNuMg', + '33YfoFAdobotJkMPUqSh2ms9frvRRfRzpu', + '3G38Zn3mvixfamrKJJtsubiEL5gCQAGnSo', + '3KTFyMGHcjWjWE1UqZRM3T4WnHuQt95iRo', + '3JQmpJYkZrVczaNDCyQoLe6JXV3vGFY8ce', + '36EMwG1FHCrp2MLm474CnE9rTQDWFF1uTF', + '392Bq5jWV8NWUTdV59VCqoYviY5KP9q9Ee', + '3G1no1sZwQuNYd5H3m6seWw9oy4E4Yu1pP', + '3K376tvxysV4XDtTTEUF47Xc8LHdjof6kR', + '39ciFiDp9yj1vLSxHh6c13DiVFhcBab7NT', + '3DUGtYyorAm9vhpo3KbMURMiR2CByP6BoM', + '3DeCWk98Wp6bG9apmqCCqTfRc8uVdQ1vyw', + 'bc1qpkgxexfg8ah0j0ffk3ge3d4para29r8ugx02ch7daja3s8u4247qw2d2jq', + '3BnCzXEqQi7VDMfCaGY9zbSySuy5uQUaRp', + '3GkiKw8DBm3nSqjL1mZLJdp4yq6WEkkyoR', + '3LTvYTkSk2jq4a6mPVMadJ9vzv1V6RMDGq', + '34Fg3q75hcnjyCoL5FLPKaDM1bewFCPKsv', + '357DauGAnsbGpMgAApUqTFHCgyE2kXA9SD', + '3K1sq7TwuVEbvyADV2oNz6DYX2EhWSrVxC', + '3LWHs1HvAF362RHUc6MKL4jUPWcTw382pj', + '35oBhEfzDyCMz4KY6j49iu8xjtbHQ9GL7H', + '3CZTmeG25AXcjYurJ59mcFR3BvS4onF61M', + '3C766rkZjRvmvhGmyGeH2x33ciUrZHarvE', + '3DXZB5fAv4ujHv3dfBPnU6qaDR4HDUEuwY', + '3LnMEFH8kYMeZ8d524cj4RgXMVmniHaBSF', + 'bc1q2gp7s58gf75sg5g8v6ah8z90ghk8dqksa62u27gmz850cnaclshsfjvlr0', + '3Ca537VX1HufiVRfKVogWcD85RV3iuFs53', + '3BxyyKih6788xBQKk8aMg1cD3qP1x7Gqgr', + '3LceSbWiDHYvy59BW2swjiEQZkqvaijcsz', + '3MjPfBpz8oDcEJZphpBuiwRnvCAASFsgT1', + '3DdvsQoGp4wtvCAbyNBEZjCoWoWQL6TssG', + '32ZB86r6jT4DkAtnYYSHP99xtcai8LePLP', + '36yNiwCxiEtubUpzBLGPeSBCbubCy9i3QW', + '3GQUyZH3EPoaHFzjWr5peAKSQFNGxxmVw1', + '37wL3HQgir55T4o2Lv4Ygrsgat5W7iPnnd', + '38qt6S3zQKizRnafitwEdz4dTj1fx72dgY', + '3EqD1B8pMgdRE9iPEgUXAzpcyxihW4tbgA', + '3P7a4wgoTDKn8F2g2VB62pHiV22XzJGGbd', + '3FyaksZvXsZxEShwdpNMK7awgDE4kBuKmN', + '36CVsC2nLzvFejTuBXvCFnt3p5QsKaGzwh', + '3BjsuL5pVVWBFSMtoB9cg2d2hsJzJFpo3B', + '34w5Da4HJ54AWTZVo8JrujhV1v8iRZho3e', + '3DuUe32HgxGg8RQ5sFk9drcKRVmwNCAHhV', + '3MoQyLh75Niz1s573waSP8pc95sqQcdJXd', + '3Bvj92ASRnTnqj9kdABSgXJgrBDy6XEgzq', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/phemex.js b/projects/helper/bitcoin-book/phemex.js new file mode 100644 index 0000000000..662e7ca671 --- /dev/null +++ b/projects/helper/bitcoin-book/phemex.js @@ -0,0 +1,3 @@ +module.exports = [ + "3PiGxVdpMjWSsH8X8BypdwcsmPW5cmE4Ta" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/pionex-cex.js b/projects/helper/bitcoin-book/pionex-cex.js new file mode 100644 index 0000000000..b6f49b1587 --- /dev/null +++ b/projects/helper/bitcoin-book/pionex-cex.js @@ -0,0 +1,22 @@ +module.exports = [ + "bc1qs0jdyydyd4kv7fwqre4suhz33mcuy3838xdsla", + "1JkmFSbqijbrv6JdyVx2hNwyE8nzEy3Cs5", + "bc1qctq0v0vecjxp4de66znkh0dcczkvuqjwwt0za4", + "1KH7cEFwFvKfnx7KjMaQUescVSigz3FMaJ", + "bc1qeplx7cy5xx37m9mtrh9qefeuswansr0c9mvewa", + "1BgvqcFm2cYRg8HCrd4qWnC7iA6tQqoeme", + "bc1qw5lxcrk7l2xsy2wx5mapdz58g29xde4x56le3s", + "1A4Ag6y473avEbjVm5N4HAqiVCE6NxLRCS", + "bc1qvdf8f85dn69csyka5tzjezsl66hdhmmfgwgfzz", + "1PDgKsiQo8hkA5pxYBwS1ooXv9jFNJCFh5", + "bc1q7wufvquhtmmd7eepjdu76lumj6efmfl2p6sgch", + "1CNEXYtt6WYZuMwJF7AjNYr39nxbrUTRoh", + "bc1q0jkkjr2qr4wl3v399algvsjuk8g7vlm3yaqufu", + "17UcdCaVWpmgpuZsKfKdWRUUViAzoQFY3H", + "bc1qguymjgurnywqac3rrplr2nmkl26cf5jyyq3vkv", + "1D9YPYQevtEsk26exBjCY2pKfhDsXTxJEE", + "bc1qs5lsnltqwdvledqvgrf82prja04ej4xk2z7ktu", + "bc1qcc2h0dw6t79y4czk8newhazwgzlygyfawu7k30", + "bc1q7d9lknwmc7tnwcemapkymggne2sv0hxkg84vg6", + "bc1q9a67xl67smtue0ajutxttsla25a45x6fdpwccp" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/probit.js b/projects/helper/bitcoin-book/probit.js new file mode 100644 index 0000000000..a68a94a01a --- /dev/null +++ b/projects/helper/bitcoin-book/probit.js @@ -0,0 +1,5 @@ +module.exports = [ + "19EgVpboqNjortWyhJSDAGRvHDtduqiSfr", + "19AtrEvJv7UY75tvWkXMxLUAYibxpZhFfN", + "17PpCEuQUT7xxP1ocfhvFdwQyrB5dG1dQP" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/pstake-btc.js b/projects/helper/bitcoin-book/pstake-btc.js new file mode 100644 index 0000000000..ae061728a9 --- /dev/null +++ b/projects/helper/bitcoin-book/pstake-btc.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1qajcp935tuvqakut95f0sc9qm09hxjj6egexl9d", "bc1pzq0ve6e7j6jt4ckx8uzdjyddrfda9ew8dxvrjmkxmfnj9yz68zeqgqh9cl", "bc1pjp9pg0d6wcejlg576st4s8d424zx443mdumdhvjcxx5ehnfk4xcqyru7ay", "bc1px92pntcj0wd5076nnymp787a7qczsaauuefgntxngdwvkd584xgsaagem2", "bc1pxhkczd3jq9nq50p2xll99edhxlx5dj6ztgw5pgtzszjtlvg7tl4s8ttf04", "bc1pxhe0dvtg7q06st7n7k0s6235ed4dhhawhhewpz7f4a0dmcrch09q2shl8y" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/robinhood.js b/projects/helper/bitcoin-book/robinhood.js new file mode 100644 index 0000000000..784b2493ee --- /dev/null +++ b/projects/helper/bitcoin-book/robinhood.js @@ -0,0 +1,5 @@ +module.exports = [ + "bc1qprdf80adfz7aekh5nejjfrp3jksc8r929svpxk", + "bc1qmxcagqze2n4hr5rwflyfu35q90y22raxdgcp4p", + "bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/rosen-bridge.js b/projects/helper/bitcoin-book/rosen-bridge.js new file mode 100644 index 0000000000..064b7f1c73 --- /dev/null +++ b/projects/helper/bitcoin-book/rosen-bridge.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1qs0852en99dfctv0egj2qxnmc79mhjgn9ap975t" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/roup.js b/projects/helper/bitcoin-book/roup.js new file mode 100644 index 0000000000..7ebc03299d --- /dev/null +++ b/projects/helper/bitcoin-book/roup.js @@ -0,0 +1,6 @@ +module.exports = [ + 'bc1pv5lu5aklz64sye9f4zmnjkfg8j6s2tllu3fem4cs9t0hcrnz5e7qy0qw6e', + 'bc1p2tncs8egnj8e6qt46np3qla70mfx4telu92v4c9hp3pg8khqp37s9lvmfx', + 'bc1phnxqw4gfq349wm2xcqgqk77544ssqwa6ycuhjh7hdxks4mtjg33qrfenw5', + 'bc1pfsu3ts4equ7rdy63dgt7shkqlu2n5kw8p0z7p7c8lsrh2yqg40fsvz4ev3' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/silkroad-fbifunds-entities.js b/projects/helper/bitcoin-book/silkroad-fbifunds-entities.js new file mode 100644 index 0000000000..862186f080 --- /dev/null +++ b/projects/helper/bitcoin-book/silkroad-fbifunds-entities.js @@ -0,0 +1,7 @@ +module.exports = [ + // https://www.reddit.com/r/CryptoCurrency/comments/li1fw7/btc_silkroad_stash_seized_nov_2020_by_the_feds/ + "bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6", + 'bc1qmxjefnuy06v345v6vhwpwt05dztztmx4g3y7wp', + 'bc1qf2yvj48mzkj7uf8lc2a9sa7w983qe256l5c8fs', + 'bc1qe7nk2nlnjewghgw4sgm0r89zkjzsurda7z4rdg' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/silkroad.js b/projects/helper/bitcoin-book/silkroad.js new file mode 100644 index 0000000000..862186f080 --- /dev/null +++ b/projects/helper/bitcoin-book/silkroad.js @@ -0,0 +1,7 @@ +module.exports = [ + // https://www.reddit.com/r/CryptoCurrency/comments/li1fw7/btc_silkroad_stash_seized_nov_2020_by_the_feds/ + "bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6", + 'bc1qmxjefnuy06v345v6vhwpwt05dztztmx4g3y7wp', + 'bc1qf2yvj48mzkj7uf8lc2a9sa7w983qe256l5c8fs', + 'bc1qe7nk2nlnjewghgw4sgm0r89zkjzsurda7z4rdg' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/swissborg.js b/projects/helper/bitcoin-book/swissborg.js new file mode 100644 index 0000000000..d9b9a863f4 --- /dev/null +++ b/projects/helper/bitcoin-book/swissborg.js @@ -0,0 +1,8 @@ +module.exports = [ + '18DowXoMUQT5EU8zPTDTrq4hrwmi8ddCcc', + 'bc1qfu6su3qz4tn0et634mv7p090a0cgameq6rdvuc', + 'bc1qutkfwnuq4v0zdkenqt5vyuxlrmsezldzue5znc', + '1Mgs8zLJ7JyngcNRUscayyPHnnYJpJS5x2', + 'bc1qc8ee9860cdnkyej0ag5hf49pcx7uvz89lkwpr9', + '1JgXCkk3gjmgfgjT2vvnjpvqfvNNTFCRpM', +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/tapbit-cex.js b/projects/helper/bitcoin-book/tapbit-cex.js new file mode 100644 index 0000000000..efd5be2de2 --- /dev/null +++ b/projects/helper/bitcoin-book/tapbit-cex.js @@ -0,0 +1,4 @@ +module.exports = [ + "1HSRxFoxC7HYbNutGyxCNXmGT1FG3M2Bt3", + "1PUvhYpjgvgjzmiwSCuGNqKQjKde29eFbH" + ] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/toobit.js b/projects/helper/bitcoin-book/toobit.js new file mode 100644 index 0000000000..7156f1b2d4 --- /dev/null +++ b/projects/helper/bitcoin-book/toobit.js @@ -0,0 +1,3 @@ +module.exports = [ + "3926KKKCqcLaWpAau73TMo19sNv23s1wji" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/tron-btc.js b/projects/helper/bitcoin-book/tron-btc.js new file mode 100644 index 0000000000..debb9f6483 --- /dev/null +++ b/projects/helper/bitcoin-book/tron-btc.js @@ -0,0 +1,5 @@ +module.exports = [ + // On the 23/10/2024 , defillma receive a PoR from Tron/HTX team with the respective BTC collateral backing BTC on tron chain + "1NBX1UZE3EFPTnYNkDfVhRADvVc8v6pRYu", + "14NEbSYdjumn9h4spMjbp3PdUpeXuM5PBZ" +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/wbtc.js b/projects/helper/bitcoin-book/wbtc.js new file mode 100644 index 0000000000..3fe67c4ea7 --- /dev/null +++ b/projects/helper/bitcoin-book/wbtc.js @@ -0,0 +1,341 @@ + module.exports = [ + // WALLETS FROM HERE https://wbtc.network/dashboard/audit + "31oMgrBjhbAr1ZZjFUFYfDT1ZYvx3Qp9qL", + "31qyn946XELbPKMaSWhk2SfFN8ikqLJ1GY", + "31rYKY9PysQgRoc6eB9fwJ3e89F5dcvRM4", + "31sADuWnUApAxzXJZTaEziCn9DhZVUajwK", + "31sW8NHLr9MELRdoGPWrEk6wBd1pj2uzkB", + "31x6dwHmXYHqd7YiwvJNPX8ryvDj8Cdht1", + "32Cav9GPxma3wRprn2FtPQ7gxmCZ8ZEmzv", + "32Ks4Rtb1A5NtzexGq6zEeqHta6hoqvCZW", + "32Ver3t9feJgByfNLF8pggtNFPMf22iC3Q", + "32fN3YjNhtAzUjBHfTVFtiPBFPgy1MkBAC", + "32hJnfPp6ZDnmkJ3tosoo6PvEemFr1z1Bd", + "32hPQh4EMBS14BMutrW2WJ4V76yxuXHJdF", + "32iT1QaoQD61rZgCNLccNqAdbnx4HwgvZE", + "32m8wzKabRRF7o6JRXN1srLSA5FzND769o", + '32oLNY3suWAZvYTBeAaFFSk32rJtS8w9i8', + '32okkzumvdoocdjN18SzbnTTNd2omQvvt3', + '337ot6fHGs4NCZwg2cKwShhrYX46g8ACtQ', + '33K5r4QntjmmD4mzSHq3WQJQtf4Dw8jvcZ', + '33PbQFD2eAouKnKVTBvZTFWE2pRzLgJdro', + '33ZA8VjwL2oucQceCP9WLEVunLkLvhaaPb', + '33epzdB4nk3FWHtUpHMQrzTWxiehSti11v', + '33gNdUGQTBT7cUbNx4892keGA2L64ixrfJ', + '33jqiX8NtPd8empn7ibEc2tn25GUx8iUE8', + '33xpP9NhBBmQt3XS1mD2g4pi1FZNuUFVR8', + '343uVxqsriiveWxekC6s3mNaERzsbfke3h', + '34CyVpeNgNNEoBdEoSSH6aTjrUZDavaUtr', + '34MPipmU3suumfX7WxTUTxmLX2uVK1Np8R', + '34MSicAL7qVGkevFPLwyc9KohGzoUSnu3Q', + '34Qg9U75RNPqAmZzF2amJ1XNGQyVek7HkQ', + '34whRPeeSYTPcihybfXmkG2uoShUdT3d2d', + '3573rMHLB3VABY7VaXMWhRoCBVspLGC4xV', + '35AY8sKs3yt3FbZpsmAtgvSXBZtvqqwc8e', + '35HfRwMwqB7sNTwijoG4fGHBmfWMm48aaB', + '35LMppVy98ofPKeUXUk79FUSkVC8yiXHUF', + '35QASqiGmQmHoccRc8pk9EtPVDFZDrFA59', + '35ULMyVnFoYaPaMxwHTRmaGdABpAThM4QR', + '35bXvntqjj5LnEpRVqU9bLcAPtT9crggYj', + '35cv1mcZBJkvkjY2KQSdmbo7Mq7E2yEVZD', + '35dn2Sfsi9qmqZke8SfSVcaggED9uJYQhn', + '35sfxCN1Gz37dq9KkpTfW56W59CK46JMY6', + '36RYMHxKrvNvrFcovZVXEQWC11LLbPE56V', + '36U3VfLRN9kbQQXRGwP5SGUYebSB3MqVnp', + '36ZsF5YgJDW25eZKS6gnZMqW4gr6wv9xp1', + '36h9DtMdqYWTxSg1yys2exZPFQoQXv8QRL', + '36jGhq48YgvjJWtEpqrc57QzXcBJQyCsS7', + '36jYq75ewM9AMTfnKRTwkPBBWwJtGg4CsE', + '36m2gCFRpkikK6AXUQGKLabKmd8PMjwx1Z', + '371SbkDHpTvRuYTwayWsBNsXK93Tj4sDAd', + '37Tgw6PStVEAyfAJT8yEvLAcxkoRYK3hDz', + '37Tob2tV9LRVzJng6Z4YCLyPsmq8n2xMQi', + '37aZoS67WApGWTDsn2rYDsxebhTdZSR1sh', + '37hV1tJYctQLPin7vCSjpDL34PpiiUTyTx', + '37kFT7mcJqgkqKbd66VbgkHSQgnys2V7hp', + '38EovPeRhGniW3cpYLJwptCqJkx9Y1Pg7G', + '38J1ce6tPUgy958VBkGGa2AmFU3LQLJ2Gv', + '38R6URq21qncKbYiiRXPi2MVx8xYRgDtWD', + '38b9cazfu4SxqoahgdiHEMSo1aNDdKquRm', + '38bzm6nhQMFJe71jJw1U7CbgNrVNpkonZF', + '39P2pJ9EmN3qmPAm1TTZPzp6T5LSsJq3eQ', + '39RMkGSQUQjifV2TpgRNYW73JK38xwA3NJ', + '39WQqCosC8ZD4S9XBPHRnnRUeVRvNctnnm', + '39e7mxbeNmRRnjfy1qkphv1TiMcztZ8VuE', + '39mayj82aZdb6UWs9qQAZZrC3VzfxUQP7c', + '39pEDUwFFj28sN5muXrmT5mAbDJSf6qEL2', + '39ydxDT3H6KygeXQn8f1tYXk6BtCTrsutw', + '3A25qkpmhCrYGEZh39wc71u89dSXGCYSvd', + '3A2wJ7LBiR4NhPbJSLNVfzZk6vDeYYPrit', + '3A37hJV9JPWR4UMCXC3QvKSeVGiRwgGtiU', + '3AKea5UYSyMc2oRRdQYhkn57nXWMm5woDz', + '3APCmmVbkpKSmLkTbGUvdPUyfqA4CZ25a4', + '3ARRJS9VNVkMdiESpxq2AGfpZUQRUvdGgd', + '3AdKaaTBFPQgpFen9YERPmrfV7QVvkYQfp', + '3AfJyKGXVBUcaWdyJeWxsasq1dHPw8pRZz', + '3Agd6vor95XcHvf1MPKE69KEpNbZTKD6JF', + '3B9UDWZNPdtL81JLnnPEJoiurcmaGx8DZm', + '3BCWh8prqQDsZDi6Pmvut9HJrhii1Vk7Ak', + '3BCm2gVB29QDFLWt768jjTwKoe1N1QVwSU', + '3BJJ68V6H1CoEx4MWdhqVk2kFpPUNVbs3T', + '3BPbdokvatbZEFJHuVUstG9zeSDLr5RdvL', + '3BTqdvZt5MYYWLAGXt8psAMSAa8Gh2AVPA', + '3CDy1xZavmpd27jV6TZm5teH8U6hrdXRES', + '3CPEGQzA227hHR2jUf66MdgBJ5wPnDdaW9', + '3CQBneh4TJtHGUP4QS3mfJc75NoiGgKwV3', + '3CdzzKFGY7ZahrMCM1tBgoxrgSPUWX4RVY', + '3Cr3vRcZD5q4XbXCVTo8sFCN9Xb7z5isth', + '3CrWGaRncSudU3EZPEhvWqeU2PG1xutr5x', + '3CuoRMhRXvsxdYsNL4kmKDJyAhaDB7SmBn', + '3CxK8MVHuqXW85z4MF7A4FYk8k6jKPFgPW', + '3DDUy5Ze4TaqKFpktAhHcmmffz9KKGtTrb', + '3DJNy9xMcMsNdmdipTgqME3TJCRkv7uS2g', + '3DhbEcm1SuJjTRxZBXxHyceYGm7GdRB2pM', + '3DiJgisVit4pqj4ByKxi5p1qdjGDxpGfR4', + '3ERNo3RAgP8o5jqELPKUEV47ADm4JtvKBd', + '3EedqW1fD4QRFmrPgkZZZvzHRzj9f4xVSX', + '3EmKqHZhXic3TymhuY8NLS7Bdk91erm4V7', + '3Epe1CixppBP9QSQ7DkvsWNKsgifTaxMY2', + '3ErNFK17MbH3GAGfakMwTrKo8uHmBuuVX1', + '3EuEvwodW88xEuwecsLb76x16tLxcUZAxx', + '3FDtvkk7hpZq5GuEJxt3Ps95vjtdDEfJ4T', + '3FFgKaYkEf1M73QtzuY9DGqC7VeM2sAQhT', + '3FHRnMSaGMAaLcoHbA5EVcEuYVxTEZdTyp', + '3FKkCxSZe1c4xZiVyJVBTbvzs9Lj1snqVC', + '3FVsTChmR7WYgfnU3CAmrrD3kqmaRMaJCC', + '3GE2pWumzKXnNMA9PFggsBwyk7NYSJvGGg', + '3GTk9xdRHnPQ61Pm7Jnv2Z8hsXv5FMVyeY', + '3HFrW63zQ58PypYhSYgHB2gij5VirsyRAm', + '3HGSCuXjnfEncUCPQ4GzNrv3BHcmLZFdeT', + '3HHLh4HSK8wj1w3YW9i4Chdnuybgadhpz1', + '3HM8YGKhwwnZKmrUEoGroEgaG3dv8xkVZz', + '3HVCDPPbAqiRwRjXhvu7PSDkLGgEajexuH', + '3HaHcbNmhJKgJ3dtbm2tg8XH87BJkRx7QE', + '3HauLvRoUBueiiLwebk19w6rnUTYJkdwNW', + '3Hdj2n5DEKPGsRd5md85exAXdwnRbomWTy', + '3HpHptRrwK5x9i7uULvk116QhsAnRJfJb8', + '3HziaqLNy8PpyQFLdwr2yxCjwEjRUjN6Eg', + '3J37HnDBzWN1sm65mbD9U5zvKrp2bzhuYJ', + '3JDewabYE785vTmaQe3MuHvUvEZJQTx8HU', + '3JMDjCYxxi5MF3aXRx8Dg13Rign3masTXj', + '3JcNkH5QWYuSfiQYADq4yV2hAYnQ8KC74t', + '3Jj1juATP11jHfBvRiu3BbzdJCNeRskqzJ', + '3JqwUY7pUwEWu2hz6mwzZKSQnvKyRRXCQM', + '3JvmhjuxvLVM8NQzAwwMvzWAK6zDLQ5Aor', + '3K2mpXMDFe7cT1baogitkRGeXqCYeDw6J5', + '3K43ux5cCAxfKgymq5eHnHS1toC9nrERbT', + '3KAGrSyTsKLckBgN7AiAfojbScfjGAHwFz', + '3KT7jvZyvhok3fkZt8Y9w8tcqpyQW5Jg8s', + '3KTeq879YjzhqkAXzZmdapJAVC6qz5qEth', + '3KWe9k7TG2j7xNw8BP9YHXBeHy1knC1xGS', + '3KXKTXR9YxHuhm863nqnSrKznkYtcx7wC7', + '3KeG7RzDwGaTywRfQgPCQaeyMgi7C89eQc', + '3KwPoNu1FxihhyRKjv1VG6C3FPy8vgjyse', + '3Kx4doXvL4UhDrKJqn8FoS5wVU3VeS9ebM', + '3LScoRmRA3kknxF5dLxz6wfw3z4LXRiVyT', + '3LbLR4uiq7RFrWgDKHfdgktAC88qtwY2Li', + '3LrxWneLHwvbNrMKXorkc17wxHqCCpNGkq', + '3MJ4rpTvuiTxYhTppNx7NokNUDZg26ofi1', + '3MLH54DXCtmydRocRZz9pEkfTTGWribBa3', + '3MM2BiaXBACfKUtVsyNr2RDXyNEhunez6v', + "3MPcUSHeWCSxCUsJtTS2L2zZfWLvorNFef", + "3MUJjyx13waUriNPkVnemdoJAiJT6nBmef", + "3MkzCjZjodyaBXz7W8i9NTjduEdykdkd89", + "3MnCLWSq31hetgbVA1Xn1VxVVb31SPeSKa", + '3Muz5dT5EguQgTiXgQ1eqJYNkjjQuSMgsb', + "3MwfxJqsy943oqYhbdKiaBrFSK9xbyiAi9", + "3MzRi499Cbcr4795iRnznfC97EFji23h7n", + "3NW5tDLFceDb1a75QkGampkuuceZ3YPMUX", + "3NfBFZRgKfHVJy7rSTutZyGpa5M2GpRdwu", + "3NmVi1xVYZj5YXU8wcQyoUfcVRCLcYhqqQ", + "3NsC2NXzKum7sVWQLQ3YYB3o9JbTz5FoaV", + "3P4EDeK5fxCLEQzM7iQ7n95DWgG1cXSaqG", + "3PRCCQMdWwjEKy89iVdL8LouknsgygwWpL", + "3PRHbh8ajUXv5wPD11CxFRs1hWBo8vR3zW", + "3PfcB36gDa47YkrbRtzZSwmrKSMsBSrhr6", + "3PkGNCt85M3aNQkBqiT5Psgmz8FjNujEKK", + "3PnoF45bZhJcPKGLf4nQzyQVAEFsxBxQQa", + "3PxV5m54ZwMDheUyFecvRVQHJK7WG1t49V", + "3Py2iN5SEwSCtT5QHkDU1qhbvmdmMZ8cpK", + "3PyK2LYBfYMUXsa8sMhTSHQZ8StQy3Xoz8", + "3QSd3JjJ35VAf5Shv3EPVpGCi5eVMQr6dk", + "3QWaxXXXbobqpWprekwzANeFuNrYXmaNXU", + "3QbVP6bTSXN2tXG66MTKtHtiJ1coKXnrjP", + "3QdyHj1i4y5CywEFWJ5PwoqGzDxGyJGPeb", + "3QjqS6A7uyoCx1vcXQoqtLatubFmsHe1ps", + "3QmVyCw6YnEvt1jXLeF5863uHPLRaKhWs5", + 'bc1q02kjkf8gp628thqdfrm54tay5pjw05w297d6p6ez5andhp9gf0nqjaa2e4', + 'bc1q02py7892mlqafaz9wevclp8ve4dl4z6hy4sqp973sz2u4fvpxnmqnzfc2f', + 'bc1q09z8m23n7w7gtqsxpgwun0zvra9jwzf4z9c48cezq36q3zvmsuyqdmyjkn', + 'bc1q0vac8d7jkyds2ux4jqwu6mu943z8keyxq4twaw8p8md8j8rtj94s9wrrl8', + 'bc1q20yv979atkvtmecs5kj88a0pmf85ht500pmp7p2ztd54tz0u60psj7c702', + 'bc1q26ds9juuyjtsek5czqasrvmptf46xan2hfyx88jqzpz2pzly3p6qrwd6e6', + 'bc1q2az30y4lst2x9wlu77kzzdym8n9qr77n0kqmevs4ahf7dmzw624sck5vm5', + 'bc1q2ssdu5v40zmntqc76kaxw0xf67eathhpg59xczh9vpp2qlf3mdrsgr49s8', + 'bc1q2vlwakkk247pnppptdv3kgxj23yptykyd3ge9vvlk2w8h98v7pysmmknxv', + 'bc1q2wyzh5ex2cr7wcth0zsm7ueycg2rkfw28fy2g6axky6r9su9zcls8qngt2', + 'bc1q32phcv5dhwkw59xljxsz2nw8g4he4ssduw7c6d3d6005skfy9gysa6crgk', + 'bc1q35fxxu53qsmv77cjt6ucdj5wu4r8rae8eakq5j5v8nzgjtcmnpvqp6g3sf', + 'bc1q3aqsr7dsajmslelacclkgmmyhd7t6hkeevpw50f5areathvfmwnq4nwt3y', + 'bc1q3cpmjfcfkh8t47q99y5wgwxzvhsw8lywzgvnvnlrlwe6h8xcqw7qjwf646', + 'bc1q3cpz06gvfatn0rgamwk7lws7c7qyt4napdr6h7fsj54zg2fy9wtsahl7xt', + 'bc1q3eff85qd4rhuu8gvn933fvtzg0ys3y5amchq8wzhhylhqvfh8kxsu4kde7', + 'bc1q3l6qerg2gyzxpuk0mmhswkgedrqcqe3eesyhatwauyv980syulfspttjcs', + 'bc1q3qw5de93m5ukxra5md872kjyl29arplm8c4vrh9jggsxp88kk2zs74u39g', + 'bc1q3uzg46kmqexn04rkhsd74t34225tqv88xp3jglr2hpxxu5ujrwyq9amgrx', + 'bc1q424nhx6tpljt65aren3q5hmsx4dwt22g9574lpjnlvtc309gtkhqdtwcss', + 'bc1q47vlc3v9vfqh2sr8f47ukaws408wcr95r27t26y9qxgc72yzg9hs58yzek', + 'bc1q4agva2hg94cdr7xdeg4e7wekq0vkrqggn4kqruns85e69xtx750s7dc2hy', + 'bc1q4ma898qglhvqsjs725emwtmayr0pwj9nmgguqac44styjpjc04ws8hwp7k', + 'bc1q4nalse7wwqe6sx3slmkyywetlzn3tdud77jesadx02v885qjs74spqtg5w', + 'bc1q4xmshjnx7up2940zld0dls42jnec86drca3ph7cjhtsdlfgq3ycsntpvpw', + 'bc1q5anhs0xpsayee84r5yqazljkfn9k92d6dkjfpyq509sfmsdkhfts2vh8l8', + 'bc1q5d93mqzlntc95687tq2un302rnfa6vnlnche7pdxzuypyl2cewnsqrzxc2', + 'bc1q5nzdfhdjv6dh5r2pgdmtxhvkan8stl2h7zrhth908slszrzu2snqm3ds3q', + 'bc1q5qv0gtcfdumqrf9fjhd82uud7whpsam7j9e2dq3k9jy3mj2rm3aq8yj3u9', + 'bc1q5rxwzkcl9hux2ltuppg5jl4c4ld52l3hk7kq8g6qqnjluk6kq5xqp5dpzd', + 'bc1q68r3tjqwch4q5nyqf03a3n3ugcef75klsmqfa4g72k63npwn59hqj2d6hh', + 'bc1q6aw25ef99245cxc4l9m5nvn5fel6tmrze3nfxtstv08yf5jkdvfs5rrajc', + 'bc1q6xdt8tmlp5p6exvsmuf62yswm4vnk0rmm950sdhlqgyxluahv3qqquz3uh', + 'bc1q6z0cm8gzhxz87e5xdlvkpnldj9zspustx7hedll73zg4n0hqemhsrm4d8l', + 'bc1q7awsmqawsstwlxtt48lt6y2hv2qjsju85jgz07yr4hhdcu5df0sqwxc63z', + 'bc1q7h0eyvjp58p5wz563p04lhjt2nef9q089mcdchr9jzz74lq5wzusqckmj2', + 'bc1q7trechgv0g6kgwdcu3wsxkqn9lrc6edzdgvdvpt9a9rg04l7gtvs26hps3', + 'bc1q866pgqwgxvuqvqmkmcfh8n52dtgz3fv3nh5cq3mufqv0ssz8q93qc2eadh', + 'bc1q86aapgzcr7078499tlhp4aatylujug9d2rxwccaekmjgv8j6f93qljjhx6', + 'bc1q89mxkg0dhr3m6vs2gzr3wqccwpzrmnpsldnjc22ztldhqueawtzsq82ydf', + 'bc1q8nr29r27mlkvj0duseshuw5vueywt4640tyrt9jusrk0c9kz2klqg4n66l', + 'bc1q8qlz3znvuq0mk62j0dld5hj3a5uf2y06tcuvtz2x3gffs6gxejnsx2hfk7', + 'bc1q8sw5c5sx3s0r5tujaq6hahnjq88yvrdhepss7qdfaz5evjux6nls63mnuw', + 'bc1q8xamcp8xc3rdh4vqtexgrqfmwlkw0mkruz3gkwaw027erjsrnd0see34cc', + 'bc1q8znctxhsh6knhp07z7ufw8zusucef9vxq7rjrhgf0wecxl7aqcrqz06gmu', + 'bc1q93hcme2prs7upr9zkdakl85jje3leg8g2qf70kstacjuyzy95xkq7h35ft', + 'bc1q99gvfs8e2fsd8zw74wdg4fmfg46n2uf5pjlpt87h93qar044rspsxwck6k', + 'bc1q9eammdvuqyhswd3wqp84d56ah0hyuus62smarhsdw3l3rycjgrhqsskvuq', + 'bc1q9j8l760q75cep90p9gq6dsj3p9d55ewpwkhcmw8dnzcd7tmfg03sc0vmqh', + 'bc1q9xlm3uydvuu3nn8dan0zqyr7e6p3pjh7gxnw7jyv0tujl44dgt6sedtus3', + 'bc1qagrn5sn73azr85navkf0ukh336qvktfunejkzauu9adsuvfvpklq6qut3m', + 'bc1qasluf865jx838k9nad2r2rnp04w3txqtyu7kapuxrv0m7rv90sxqhvjxuv', + 'bc1qc342v9mt8j354pjyaqkweu9nrztcj6cc8udgyezk7dxhjddjcn8q7w9fuc', + 'bc1qc46r9xy82z23s6q9lglhzf60fdxxq5y26x34kdx7dx8549mdtu4slym95w', + 'bc1qcd7jv45swrxgwlj55gfnlxf3tvsm4ek0yer4xac5a909jtxzrgvqyv5v0p', + 'bc1qd7dd9qc0pehqx5a2arlpmlgh30xpfufx9hpf2kfrnpqz2x7jl0xqpmcru6', + 'bc1qd8wk5eesxtynkrjx42temma0spfy0955tr5e5lp267aqhalvpjwq79l4yh', + 'bc1qdj65qknp4cnvxagp0pqnjl3g7d3s8gzxqzrrlh6gutju0ytdfwmsfeetdt', + 'bc1qdt0gu9n7ykyvyhe4v7cmftugsn5qw59rm4tdxn4f8vxs6s694n8qp9u2az', + 'bc1qe46f05uenszej6hvzmxjw8fxyskc6utv4cueeaa77jjea87vjh7ql8wgd5', + 'bc1qe4we3wxhj4f0wy40ftfxfvawmt4hgkgvtmpnn3lv5wme8yzfrltsckhg9g', + 'bc1qer4qvha5nxz09qn7gt7xntvrz2crnaxrd7ju4nmcjm7r9uerc9xqa9gdxd', + 'bc1qesmtfxs4n4ws86242uqpztseyh7l5tgswd0zce5nggaky44t9c4sfwczj2', + 'bc1qetecvjtaya283z7zk9lftqtv03ajx27ekz6uxjpscpap7crkvgmst355jn', + 'bc1qeuz6l0qusf9pd923v8w086j8umn765a7hqvu4su0dfq90ckym47qhvaux3', + 'bc1qezmmhc5k7ccnc6q7l8dhkg9phcnehysq2y3ahdzzcweph5ang9xs0egasc', + 'bc1qf5p8wp6neu0raugt6t7zhm6vjhy3taf8q7rqwuhgdmdnhvpz2c7s8xtrtx', + 'bc1qfcxzh8ag5pv37qywg8wylherg64k7skz0qm0ghc36x7awrd8xszsfxc4k3', + 'bc1qfenuya7nskcjlyxpg0gttrjap9e5gtncxga0vvl8rekyeup55n0slzlhr8', + 'bc1qfeuww8le80ae7qat3kpzspsh7pa8na3qx9fuc4qpdt3w5q3dkavsc02wk4', + 'bc1qfn70w8peuvvywupd8u667g832necv3w6sqellzvd7aaj8l52nhhsfzs6a4', + 'bc1qfpwewuyg8erj2cejamms0682v7ncgdgufdq8efa0maef3uzunkgsvdwyzm', + 'bc1qfugah0e9fw9ze34dpqf22yxqxnxh49wrcq9d3kuqc9dydfhn4pjsjqfpky', + 'bc1qg0amsvtlglecc6x46rzjprjh7wscjzlgqu6n52zw9nz0cck2r5sqwew946', + 'bc1qg54vzuplejd6ymxlma6q7rfyc9zqqes8wvz4xs09mhpclak9z73sf3x3km', + 'bc1qgs30czhkxhxn5qsunlzac0xeznyaxg267p5t8gjupzg7u97vz4zqyuf60l', + 'bc1qgsgj3dh8dztq05v9dzethjcpjqtptm5tsrruprz4w7awzpfrku8qjjegyc', + 'bc1qgxww03juwr8vfp28tzpmyyku3j6hxrgpl0v6natkk2ucwu4weweskcqvnl', + 'bc1qh4r87gzpcx3lz7faz349yvp8yr6zyr2706m2xzsuwcwlptkqsj6svkaqtf', + 'bc1qhagykgzhhh7yt5knsypklpqsgdelrvw5vz73erujapcgh3x5wxrq8c0y9x', + 'bc1qhgfkccy09hr7hlky0jeyz89afan8qh66wa26t4se4mlqda6298hqrtk5zr', + 'bc1qhkw43w4cvzec3836hqrdmxksm20l35yk7gnvysqprd6gareztfsq4uplfs', + 'bc1qhm46vtwep0awkdphurmc2ku3lfp8l7z9f6wn9va42lc3z24zd2fsvnvzk3', + 'bc1qhpnmnswf8ls2q97vg4qzlr2a6c2xpr46zp59e7q9uh5j59ask2ysld0euq', + 'bc1qj2dz58v8etgq3aud24yrgffk73d9cue80kfswl58d5w4vvhdfsyskxtll5', + 'bc1qj38tl824hkgl7qluy32lklp6qfd9d9zqa9qlyeh28khfh9grxwastu3xnw', + 'bc1qj8vt7h7ufrgqlhhcu22vl3jrvx3kluml57kha352k9fex23jphvsuwme6r', + 'bc1qjgua88vymvkctq9t4mcd4q4mlqnr3r07lylp90f7epc9p6qcv6asteyjec', + 'bc1qjpgs63vqgfkalm8janwmelw4mr4wg50axnmx5ueh4ru2xnl3lg7q80yl32', + 'bc1qk8plwr04uu6mvpcf3wtfmg579ztqn59q7yfx39drl9r97q4wcx2q43rvw3', + 'bc1qk9fhnvv7a0nxzxxj503v7mfy3uwdugymj09ugkrda5895cfxa5vsnzp8l5', + 'bc1qkd53jhtmhwv74x2c8hnnfzspatcjdzk0h3f2czqzrav0yxpd5y4szkslrs', + 'bc1qkn3s4hzjthfmt68sk30m69knjauwphsha2paqzexjjmlfc6h7f3sggfn52', + 'bc1qksptar8mpay2mfwzwep3aqxevnc8jj8d4rd82v3v0hm5p3y93w2q5eufa8', + 'bc1ql26wgacxjhuefzcph2wpsyftqzd07kzkczv60d85hj7280qkrz2qlgrhf7', + 'bc1ql33nnw3ngcf343jtmzpe8ps8809nqe0530rv6neu7cefkz6dtcfqn3wzav', + 'bc1qlg2gcz8hzfdt49jgs0438c7ahg4967nfkflzj3m0r5dz3xz7njrqpxxj2j', + 'bc1qlnz5vejmvv6sdy9k3c7a07nlf6c053g0ren0m8kmmsrx677nyllsg6qr2m', + 'bc1qltg30ayn5wexka07ta2x5dnfjf20rqnemf4sfnsase082yfqetfq0s20hv', + 'bc1qmfjm5hlgjfw3tc6cz77nzjcc5xg5mjhrlm6kqewczapae2yhucrs5c0qvf', + 'bc1qmfwcwfntr2adas7yz5l3wn6pnm8rj55l8fk5vgny34wld6d0vfcsg48tta', + 'bc1qmfwq5cjm55m0kcfemjyv6rj8nfunslfjtuhyqawksw892dhvu6wscem2t5', + 'bc1qmmdfeczme4q99ccpmgfx3zxwwwff9nnjhdux47hucwttrjdpqj9s2x8rds', + 'bc1qmur9p99tzxtrq0232tl6nssyejrmwet3m265xg0cgl7uh2qxsy7q0m8fvu', + 'bc1qn3r3kqf90txgcsdxzu2s0p5avp79axlf98lzrwlmpnmxc3ak0vwsuxrepa', + 'bc1qn8w83eglpp7xdtgyjaysgrve5cjjr2yfhsq2x5xyn6cmvup0uwlsq2t5xl', + 'bc1qnpnpcn4gwssvkjpe27zzfex2t997l7garmc2s8fenmk0fpydek2s6zp9yz', + 'bc1qp24kgu3r5n3q6k03230yj6dzr4styppjlvtr3ptdsd7sxql8pcgqwall05', + 'bc1qp27x9j8damzuxc0x7cqkcaf39q4825aafmx3g6mlvh2wd5tzr8kscsjplw', + 'bc1qp6cmqa7hgdean0z8jl7uf20rzf7wgvstmjlxekft3l2vn22zwl2qhunr3h', + 'bc1qparrejjdyc8hcd7hgljlx53wy7ncrjkaz670w3ef0ade369y22eqkujzy0', + 'bc1qpdthtpfcmju642wq4eqxl4uz5hfgtztvtv7u6wrdepnkdsugueusujpg76', + 'bc1qpp5wu443kdfur2vhzwms8d46gq8c2vgu692sgyn79z56gkq4mkvs07gjkd', + 'bc1qpvvt2md0t7435mc8dmlgd5euyc0636vlw8ew25e8pf83uc68km5qpvqpfx', + 'bc1qpwtgr4rld3wr39r762ngvuk8qgvgkrrxra4jdnmn06z4nfgh4vtsluyd3t', + 'bc1qq3p9mqvegpadextyqzxy46ukf5yxc7ej50ksq3w63f895q0t8rzsfe5jym', + 'bc1qqces3upduq6e0c2w0k6mr9n4tkgvzkggteuatqc4eyxawwkuxzpsfgdxzh', + 'bc1qqjmfwnxrjx0khaxf8qa6ccnz7s94k9wa8lelpdy2fn6jf9ffks8s5r4frd', + 'bc1qqlm6edz9azp0d6y4mjc8j8an4q8du2jajgwj65mmz6nkk53yannqvtnvnn', + 'bc1qqlus6fyt05kewddukpge8u0lszp4ffn49mqnr3pvrh2whptf2fhsy6ynmn', + 'bc1qqvf7qq7wvx6pkp5aqvzdxs0rgqkjgqe7ev63hnppxq05t6v3w5ysskzjs5', + 'bc1qr20qujcyr87y3uk2fgkq93u0jtzl6wa4el90we4txgcwgx6avxzsuj0wcx', + 'bc1qr6cvgewvlts5f9wa8u3cpnlmth0mzn0x96ap34hknpaayuyknrlssqfq3n', + 'bc1qrm7nze8cqyazdlhmw8ffeusxucqtvyw3pvtple0047tdkupdnmustkla3w', + 'bc1qrsayv4jq9uf6rpmwsxan3yqxuqtyelwt7k8298ejl8h9tkrunthspnlm6y', + 'bc1qs0q2svqpeaka6f8jakx74j4rydxdmxq4wz7xfy45m6t8xfxzy0zsckrym5', + 'bc1qs48aaups6tzwcs372yqhakcjakfgf6w6aguj0w7gex75vrnjegmsp5hx8n', + 'bc1qsgthnvghgs9wl87kzhkx9xda4xyu35cxfteupjnvxv3zuvgtdyzs9a23te', + 'bc1qsln2s8xu7sv84wj5sv2pjnfpev8lkcqpzmzukmygcll26vf0kwfs6awzkj', + 'bc1qsp7twu469a8p3enevzwdnjhrcmtmc7ljydqxxp4p69u4ggj9wazqa9gsgw', + 'bc1qsrms3khzhupjxph0u2sy6sz8c9q4g6nqm3dy53nrlagw3lc5zmsstg8pft', + 'bc1qsuzvly8z6kr080at2twdlfs8j87gu08kmwlfstafm2lajdvfclyqtvq00a', + 'bc1qsva32zdzx7cd9996qdlxkpl0dnyk4s44myx53zpetf4u7rfg89fswjzza5', + 'bc1qsw4hj3dvqcvtntvsflx8474f52nt6zer5k9pyem6n6g27p8nc4xsrj5fxc', + 'bc1qszmwz85wktn6k7tg953pugtedmssguaavl8qukv77s5u0g5mx3tsmw6pg4', + 'bc1qt3mw55ccejx97tyjdl9dhe60wvextxddg8udxz9n8q8efwhr37wseag63j', + 'bc1qt4ck5563ra7r3xjqlfqm7au407q2dmc0p6wvgyzy239nyyn4vsesfwwsa2', + 'bc1qteyfers4wvfhp6apw4s720tzvp9xafkvvfh7k0sxmu8vrxvt2m5snw45v8', + 'bc1qu4g30hr7lz3qd9jn68x4f2ycl3s533jdtv96g5n96d40kac5l5tshhkvq5', + 'bc1qu5k2h4y9cynds4j3t5d94xg78zpzhx3elk6w93e28xmxrnn37wuql9xf4t', + 'bc1quljnxvuryumd7c44u7f8dwflas5aghecg8ln029v2s7ffezun86qn0wyng', + 'bc1quryt5u9j5rec96c4h6xxatn74nqcen244q3dtgwtpjkma36vvrmq9mjecg', + 'bc1quxy0mlwssdmzsxgk2ct42p09ef7mc9qwmpdjuzy9f3h3ye2k6jzsvmmrsh', + 'bc1quywrhxx6t7mkqshcll3q99qrqlal73l668wldgrcxpa4yvuj2x3qrhsg9m', + 'bc1quzwyq3wewr74vvgwa6nqfj6n6rsc2tsh046glq0n76x9alcpgmzsf24s6x', + 'bc1qv0u3a7jdaygq680cu52puk4xrrr4ckpjqqgg88x66cmfnrfj5c4sre60e9', + 'bc1qv837fuujjlu50z3l6y48vxkv4vd09vve58t92welmxy9lnu5l2usp6hd0j', + 'bc1qva8lqtdcemj9swc6trk4je45xzckqhs3fthst2hy0k3plywfeq5s639wn0', + 'bc1qvfmnrg59p8a3csj032uyzl3mdtv5y46g3mx33krz5kweyvq78f5swvdmna', + 'bc1qvqaqr0jyxf3nphux7gla78dqa9psfpyy0v8med9t63f0x6n2k40s7knecs', + 'bc1qvtckv82yw4efeu9ez8y37rne5ghzxeqjl3cqnsyxf4gm3zhuhc8swt5u3h', + 'bc1qwdgyle9p2gcvyn22sg2tg6jaqkxewjz5xfj229p989dcteu42adqnau2lw', + 'bc1qwfeq7rehmzm5434vaa485s98788cmyyrac2w65nulvucsg7cueesly7x05', + 'bc1qwfydpavg240d4j87nrg0ayqhfzwrt9revzw7a9dpyxujnlpu2xus07f6ud', + 'bc1qwvrrxxqhc6l9zd8rwj39sl8n39v69tju9sfc59dqxl3fjx8jnfqswzs93f', + 'bc1qwwkwppejx79uszdgfrpaaqc24wepvjy729xhx2zyd3qyf3ftfqrs672m9d', + 'bc1qx8xlxd6qnmqprgjs6yr4nd870tt4d8yuupwq4qhl3hh24ulpmk4qem46px', + 'bc1qxfkxl66ee59xpxr30tcexvh9zgtvf7gwtyauj29n6txj7c7a9e9quhcaaz', + 'bc1qxlj7ls9zptgj779w0gzfvt8chpl29xdcv5qjqdw7g462uf0c90wsvkw74y', + 'bc1qxnxp0qdzx07jw3tskcp79xzs7p6p2wpwx4sn7myrx8vgj42f4prsrlcknw', + 'bc1qxqnj2gdznm37yhdw679nx6rqs44hkd2lddj2gn4uyaa5htmjvmzsyjcu7d', + 'bc1qxtf7mx5scgetaaz30w6ngndq8xctegjacvphz2tgky5r9et0q5uqwyks8t', + 'bc1qxu9s6qy6hld9uvd75em9t550q7ppezsmkheldsyny0pzj9yd7e6sqg3qv6', + 'bc1qy30syv0sqafmkt2m4h6lf9tjeddurh9cypa9p8wras2hfjf4y4uqzdz5sk', + 'bc1qy6tfy7k9cjp40m2lcq2s8wrsn88jdn3ffj5ph7uvwxuamfntaylqk38dwp', + 'bc1qyc4v5dtapyta9mcu5n5t9va72rzd9g75z83qxxm90ne4vzhgleeqf9lcfl', + 'bc1qyd5989kz0jgayxelnz7wlnnk5gyn36v7cecjrkgvph4260aew2rsqzx3ua', + 'bc1qyujyd6q7dtnh76wchgavwgxpklkwm73vqllududlx2uunx28zdhsxnvd47', + 'bc1qyvpmf6uv8xgxrvcwc5w630d4vg2s9ztpd64fe0e9ylxtuy34e4lqnmv3sq', + 'bc1qzck7505r8ahwq9g4xuwr60lpflxv5h75y0jntgasd0t9g7psvmqsr902f8', + 'bc1qzgw25sgrn45909quqlydd9729ksj32mfcvwzl44ekf2kkgctz09qvr779j', + 'bc1qzha6dcp9mq8ne7s3cxgp052qzux3jg25fp7cxpshrz0a0005h3gs30vqpf', + 'bc1qzk7gnzhyqcl9x7f52lckdhlznv94k87gpm3fsafvn487euaymmasz95cwa', + 'bc1qztewvcfe424fxat7s2uautmy5ctnsnurul474e2emexfnlj6upsqem0g8d', +]; \ No newline at end of file diff --git a/projects/helper/bitcoin-book/woo-cex.js b/projects/helper/bitcoin-book/woo-cex.js new file mode 100644 index 0000000000..d633c3db58 --- /dev/null +++ b/projects/helper/bitcoin-book/woo-cex.js @@ -0,0 +1,4 @@ +module.exports = [ + 'bc1qh78w4qq9v2dqntjtxne97kp9u2485jdqrfsghh', + 'bc1qm4hycszv0v0qel3swxqyp57nkpnnrda4rc55lm' +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/xlink.js b/projects/helper/bitcoin-book/xlink.js new file mode 100644 index 0000000000..605481c046 --- /dev/null +++ b/projects/helper/bitcoin-book/xlink.js @@ -0,0 +1,17 @@ +module.exports = [ + "bc1pylrcm2ym9spaszyrwzhhzc2qf8c3xq65jgmd8udqtd5q73a2fulsztxqyy", + "bc1qh604n2zey83dnlwt4p0m8j4rvetyersm0p6fts", + "31wQsi1uV8h7mL3QvBXQ3gzkH9zXNTp5cF", + "bc1q9hs56nskqsxmgend4w0823lmef33sux6p8rzlp", + "32jbimS6dwSEebMb5RyjGxcmRoZEC5rFrS", + "bc1qlhkfxlzzzcc25z95v7c0v7svlp5exegxn0tf58", + "3MJ8mbu4sNseNeCprG85emwgG9G9SCort7", + "bc1qeph95q50cq6y66elk3zzp48s9eg66g47cptpft", + "bc1qfcwjrdjk3agmg50n4c7t4ew2kjqqxc09qgvu7d", + "1882c4wfo2CzNo4Y4LCqxKGQvz7BsE7nqJ", + "1KGnLjKyqiGSdTNH9s6okFk2t5J7R6CdWt", + "bc1qt2kjf5guf4dvv4mvnswyk8ksaeuh5xyhc5gz64", + "19GTEWTnVgenpDWSdQEAT9LJqMFQ7Yogsu", + "bc1qxmwuugmcnn5k3hz22cxephy2vkevvt2knsd6u4", + "1617Cf4qmjqVyiN5weQRo8sZvQvyDjshKP", +] \ No newline at end of file diff --git a/projects/helper/bitcoin-book/xlinkLST.js b/projects/helper/bitcoin-book/xlinkLST.js new file mode 100644 index 0000000000..efad41974e --- /dev/null +++ b/projects/helper/bitcoin-book/xlinkLST.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1p78mvfa550t7acg6wm9cl9543zf68ulhqkxex5pvhv8wnw4qpl3gqmpjy2s" +]; \ No newline at end of file diff --git a/projects/helper/bitcoin-book/xrgb.js b/projects/helper/bitcoin-book/xrgb.js new file mode 100644 index 0000000000..6746264168 --- /dev/null +++ b/projects/helper/bitcoin-book/xrgb.js @@ -0,0 +1,3 @@ +module.exports = [ + "bc1ptm05s4f6f8j78zhx62lzx0dep07f2597nlgeltmm4sjn5stdu6gq4sxg2w" +] \ No newline at end of file diff --git a/projects/helper/cache.js b/projects/helper/cache.js index 3563714604..04df9aec61 100644 --- a/projects/helper/cache.js +++ b/projects/helper/cache.js @@ -104,7 +104,7 @@ async function configPost(project, endpoint, data) { } -async function cachedGraphQuery(project, endpoint, query, { api, useBlock = false, variables = {}, fetchById, safeBlockLimit, } = {}) { +async function cachedGraphQuery(project, endpoint, query, { api, useBlock = false, variables = {}, fetchById, safeBlockLimit, headers, } = {}) { if (!project || !endpoint) throw new Error('Missing parameters') endpoint = sdk.graph.modifyEndpoint(endpoint) const key = 'config-cache' @@ -120,9 +120,9 @@ async function cachedGraphQuery(project, endpoint, query, { api, useBlock = fals variables.block = await api.getBlock() } if (!fetchById) - json = await graphql.request(endpoint, query, { variables }) + json = await graphql.request(endpoint, query, { variables, headers }) else - json = await graphFetchById({ endpoint, query, params: variables, api, options: { useBlock, safeBlockLimit } }) + json = await graphFetchById({ endpoint, query, params: variables, api, options: { useBlock, safeBlockLimit, headers } }) if (!json) throw new Error('Empty JSON') await _setCache(key, project, json) return json @@ -135,7 +135,7 @@ async function cachedGraphQuery(project, endpoint, query, { api, useBlock = fals } -async function graphFetchById({ endpoint, query, params = {}, api, options: { useBlock = false, safeBlockLimit = 500 } = {} }) { +async function graphFetchById({ endpoint, query, params = {}, api, options: { useBlock = false, safeBlockLimit = 500, headers } = {} }) { if (useBlock && !params.block) params.block = await api.getBlock() - safeBlockLimit endpoint = sdk.graph.modifyEndpoint(endpoint) @@ -144,7 +144,7 @@ async function graphFetchById({ endpoint, query, params = {}, api, options: { u let lastId = "" let response; do { - const res = await graphql.request(endpoint, query, { variables: { ...params, lastId }}) + const res = await graphql.request(endpoint, query, { variables: { ...params, lastId }, headers }) Object.keys(res).forEach(key => response = res[key]) data.push(...response) lastId = response[response.length - 1]?.id diff --git a/projects/helper/cache/compound.js b/projects/helper/cache/compound.js index 7eec645fc9..5aef7b0d52 100644 --- a/projects/helper/cache/compound.js +++ b/projects/helper/cache/compound.js @@ -1,17 +1,11 @@ const sdk = require('@defillama/sdk'); const abi = require('../abis/compound.json'); -const { nullAddress, unwrapLPsAuto } = require('../unwrapLPs'); -const { requery } = require("../requery"); -const { getCache, setCache } = require("../cache"); +const { nullAddress, } = require('../unwrapLPs'); const { getChainTransform, getFixBalancesSync, } = require('../portedTokens'); -const { usdtAddress } = require('../balances'); -const agoraAbi = require("../../agora/abi.json"); -const project = 'compound' -const getKey = (chain, addr) => `${chain}/${addr}` -function compoundExports(comptroller, { blacklistedTokens = [], resolveLps = false, transformAdress, abis = {}} = {}) { +function compoundExports(comptroller, { blacklistedTokens = [], transformAdress, abis = {}} = {}) { let response abis = { ...abi, ...abis } diff --git a/projects/helper/cache/sumUnknownTokens.js b/projects/helper/cache/sumUnknownTokens.js index e494f6871c..eb7b1e90a0 100644 --- a/projects/helper/cache/sumUnknownTokens.js +++ b/projects/helper/cache/sumUnknownTokens.js @@ -365,7 +365,7 @@ async function getTokenPrices({ async function sumUnknownTokens({ api, tokensAndOwners = [], balances, coreAssets = [], owner, tokens, chain = 'ethereum', block, restrictTokenRatio, blacklist = [], skipConversion = false, onlyLPs, minLPRatio, log_coreAssetPrices = [], log_minTokenValue = 1e6, owners = [], lps = [], useDefaultCoreAssets = false, cache = {}, resolveLP = false, abis, - ownerTokens = [], + ownerTokens = [], allLps = false, }) { if (api) { chain = api.chain ?? chain @@ -386,7 +386,7 @@ async function sumUnknownTokens({ api, tokensAndOwners = [], balances, ownerTokens.forEach(([tokens, owner]) => tokens.forEach(i => tokensAndOwners.push([i, owner]))) tokensAndOwners = tokensAndOwners.filter(t => !blacklist.includes(t[0])) await sumTokens2({ api, balances, chain, block, tokensAndOwners, skipFixBalances: true, resolveLP, abis }) - const { updateBalances, } = await getTokenPrices({ cache, coreAssets, lps: [...tokensAndOwners.map(t => t[0]), ...lps,], chain, block, restrictTokenRatio, blacklist, log_coreAssetPrices, log_minTokenValue, minLPRatio, abis, }) + const { updateBalances, } = await getTokenPrices({ cache, coreAssets, lps: [...tokensAndOwners.map(t => t[0]), ...lps,], chain, block, restrictTokenRatio, blacklist, log_coreAssetPrices, log_minTokenValue, minLPRatio, abis, allLps, }) await updateBalances(balances, { skipConversion, onlyLPs }) const fixBalances = await getFixBalances(chain) fixBalances(balances) diff --git a/projects/helper/cache/vestingHelper.js b/projects/helper/cache/vestingHelper.js index f64477caf7..2741276743 100644 --- a/projects/helper/cache/vestingHelper.js +++ b/projects/helper/cache/vestingHelper.js @@ -16,7 +16,7 @@ async function vestingHelper({ tokens = getUniqueAddresses(tokens) blacklist = getUniqueAddresses(blacklist) tokens = tokens.filter(t => !blacklist.includes(t)) - const chunkSize = chain === 'polygon' ? 250 : 500 // polygon has a lower gas limit + const chunkSize = chain === 'polygon' ? 250 : 2000 // polygon has a lower gas limit const chunks = sliceIntoChunks(tokens, chunkSize) const finalBalances = {} for (let i = 0; i < chunks.length; i++) { diff --git a/projects/helper/cex.js b/projects/helper/cex.js index 1ab2338cb6..3aba02bc49 100644 --- a/projects/helper/cex.js +++ b/projects/helper/cex.js @@ -175,6 +175,7 @@ const defaultTokens = { '0x59769630b236398c2471eb26e6a529448030d94f', //NKYC nonkyc exchange token '0xbf5140a22578168fd562dccf235e5d43a02ce9b1', // UNI '0x25d887ce7a35172c62febfd67a1856f20faebb00', //pepe + '0x2024b9be6b03f2a57d3533ae33c7e1d0b0b4be47', //Bitcointry exchange token BTTY ], eos: [ ["eosio.token", "EOS", "eos"], @@ -255,6 +256,8 @@ const defaultTokens = { ADDRESSES.ton.TON_2, ADDRESSES.ton.TON_3, ], + sui: [], + aptos: [], } function cexExports(config) { diff --git a/projects/helper/chain/acala.js b/projects/helper/chain/acala.js new file mode 100644 index 0000000000..f63d8d148e --- /dev/null +++ b/projects/helper/chain/acala.js @@ -0,0 +1,30 @@ +const sdk = require('@defillama/sdk') +const { post } = require('../http') +const { sleep } = require('../utils') + +const endpoint = 'https://acala.api.subscan.io/api/v2/scan/search' + +async function getBalance(key) { + const data = await post(endpoint, { key }, { + headers: { + 'Content-Type': 'application/json', + 'X-API-Key': 'f89d810db5ef4c4fbc83b987dc2ffcda' + } + }) + return +(data?.data?.account?.balance ?? 0) +} + +async function sumTokens({ balances = {}, owners = [] }) { + let total = 0 + for (const owner of owners) { + const balance = await getBalance(owner) + total += balance + await sleep(3000) + } + sdk.util.sumSingleBalance(balances, 'acala', total) + return balances +} + +module.exports = { + sumTokens +} \ No newline at end of file diff --git a/projects/helper/chain/aelf.js b/projects/helper/chain/aelf.js new file mode 100644 index 0000000000..a7c44bfe19 --- /dev/null +++ b/projects/helper/chain/aelf.js @@ -0,0 +1,22 @@ +const sdk = require('@defillama/sdk') +const { get } = require('../http') + + +async function getBalance(key) { + const data = await get(`https://explorer.aelf.io/api/viewer/balances?address=${key}`) + return +(data?.data?.[0]?.balance ?? 0) +} + +async function sumTokens({ balances = {}, owners = [] }) { + let total = 0 + for (const owner of owners) { + const balance = await getBalance(owner) + total += balance + } + sdk.util.sumSingleBalance(balances, 'aelf', total) + return balances +} + +module.exports = { + sumTokens +} \ No newline at end of file diff --git a/projects/helper/chain/aeternity.js b/projects/helper/chain/aeternity.js new file mode 100644 index 0000000000..1ca93d824b --- /dev/null +++ b/projects/helper/chain/aeternity.js @@ -0,0 +1,29 @@ +const axios = require('axios'); +const sdk = require('@defillama/sdk') + +const endpoint = 'https://mainnet.aeternity.io/v2/accounts'; // Replace with the appropriate endpoint + +async function getBalance(address) { + try { + const response = await axios.get(`${endpoint}/${address}`); + const balance = response.data.balance; + return balance; + } catch (error) { + console.error('Error fetching token balance:', error); + return 0; + } +} + +async function sumTokens({ balances = {}, owners = [] }) { + let total = 0; + for (const owner of owners) { + const balance = await getBalance(owner); + total += balance; + } + sdk.util.sumSingleBalance(balances, 'aeternity', total); + return balances; +} + +module.exports = { + sumTokens +}; \ No newline at end of file diff --git a/projects/helper/chain/alephium.js b/projects/helper/chain/alephium.js index 982a05db0e..b7320e9fb9 100644 --- a/projects/helper/chain/alephium.js +++ b/projects/helper/chain/alephium.js @@ -1,49 +1,92 @@ -const axios = require("axios") -const basex = require('base-x') +const axios = require("axios"); +const basex = require("base-x"); -const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' -const bs58 = basex(ALPHABET) +const ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; +const bs58 = basex(ALPHABET); -const EXPLORER_API_HOST = 'https://backend-v115.mainnet.alephium.org' -const NODE_API_HOST = 'https://node.mainnet.alephium.org' +const EXPLORER_API_HOST = "https://backend.mainnet.alephium.org"; +const NODE_API_HOST = "https://node.mainnet.alephium.org"; async function getAlphBalance(address) { - return (await axios.get(`${EXPLORER_API_HOST}/addresses/${address}/balance`)).data + return (await axios.get(`${EXPLORER_API_HOST}/addresses/${address}/balance`)) + .data; } async function getTokensBalance(address) { - return (await axios.get(`${EXPLORER_API_HOST}/addresses/${address}/tokens-balance`)).data + return ( + await axios.get(`${EXPLORER_API_HOST}/addresses/${address}/tokens-balance`) + ).data; } async function contractMultiCall(payload) { - const result = (await axios.post(`${NODE_API_HOST}/contracts/multicall-contract`, {calls: payload})).data - return result.results.map((r) => tryGetCallResult(r)) + const result = ( + await axios.post(`${NODE_API_HOST}/contracts/multicall-contract`, { + calls: payload, + }) + ).data; + return result.results.map((r) => tryGetCallResult(r)); } function tryGetCallResult(result) { - if (result.type === 'CallContractFailed') { - throw new Error(`Failed to call contract, error: ${result.error}`) + if (result.type === "CallContractFailed") { + throw new Error(`Failed to call contract, error: ${result.error}`); } - return result + return result; +} + +async function getTokenInfo(tokenId) { + const [metadata] = ( + await axios.post(`${EXPLORER_API_HOST}/tokens/fungible-metadata`, [tokenId]) + ).data; + + return metadata; } function contractIdFromAddress(address) { - const decoded = bs58.decode(address) + const decoded = bs58.decode(address); - if (decoded.length == 0) throw new Error('Address string is empty') - const addressType = decoded[0] - const addressBody = decoded.slice(1) + if (decoded.length == 0) throw new Error("Address string is empty"); + const addressType = decoded[0]; + const addressBody = decoded.slice(1); if (addressType == 0x03) { - return Buffer.from(addressBody).toString('hex') + return Buffer.from(addressBody).toString("hex"); } else { - throw new Error(`Invalid contract address type: ${addressType}`) + throw new Error(`Invalid contract address type: ${addressType}`); } } -module.exports = { - getAlphBalance, - getTokensBalance, - contractIdFromAddress, - contractMultiCall +function hexToBinUnsafe(hex) { + const bytes = []; + for (let i = 0; i < hex.length; i += 2) { + bytes.push(parseInt(hex.slice(i, i + 2), 16)); + } + return new Uint8Array(bytes); +} + +function addressFromContractId(contractId) { + const hash = hexToBinUnsafe(contractId); + const bytes = new Uint8Array([0x03, ...hash]); + return bs58.encode(bytes); } + +async function sumTokens({ owners = [], owner }) { + if (owner) owners = [owner]; + let total = 0 + for (const owner of owners) + total += (await getAlphBalance(owner)).balance / 1e18 + + return { + alephium: total + } +} + +module.exports = { + sumTokens, + getAlphBalance, + getTokensBalance, + getTokenInfo, + contractIdFromAddress, + addressFromContractId, + contractMultiCall, +}; diff --git a/projects/helper/chain/algorand.js b/projects/helper/chain/algorand.js index af9476fc01..cd9ca10181 100644 --- a/projects/helper/chain/algorand.js +++ b/projects/helper/chain/algorand.js @@ -64,11 +64,14 @@ const withLimiter = (fn, tokensToRemove = 1) => async (...args) => { return fn(...args); } -async function sumTokens({ owner, owners = [], tokens = [], token, balances = {}, blacklistedTokens = [], tinymanLps = [], blacklistOnLpAsWell = false, tokensAndOwners = [], }) { +async function sumTokens({ owner, owners = [], tokens = [], token, balances, api, blacklistedTokens = [], tinymanLps = [], blacklistOnLpAsWell = false, tokensAndOwners = [], }) { + if (!balances) { + balances = api ? api.getBalances() : {} + } if (owner) owners = [owner] if (token) tokens = [token] if (tokensAndOwners.length) owners = tokensAndOwners.map(i => i[1]) - const accounts = await Promise.all(owners.map(getAccountInfo)) + const accounts = await Promise.all(owners.map(limitedGetAccountInfo)) accounts.forEach(({ assets }, i) => { if (tokensAndOwners.length) tokens = [tokensAndOwners[i][0]] assets.forEach(i => { @@ -89,7 +92,7 @@ async function getAssetInfo(assetId) { async function _getAssetInfo() { const { data: { asset } } = await axiosObj.get(`/v2/assets/${assetId}`) - const reserveInfo = await getAccountInfo(asset.params.reserve) + const reserveInfo = await limitedGetAccountInfo(asset.params.reserve) const assetObj = { ...asset.params, ...asset, reserveInfo, } assetObj.circulatingSupply = assetObj.total - reserveInfo.assetMapping[assetId].amount assetObj.assets = { ...reserveInfo.assetMapping } @@ -98,6 +101,17 @@ async function getAssetInfo(assetId) { } } +async function getAssetInfoWithoutReserve(assetId) { + if (!assetCache[assetId]) assetCache[assetId] = _getAssetInfo() + return assetCache[assetId] + + async function _getAssetInfo() { + const { data: { asset } } = await axiosObj.get(`/v2/assets/${assetId}`) + const assetObj = { ...asset.params, ...asset, } + return assetObj + } +} + async function resolveTinymanLp({ balances, lpId, unknownAsset, blacklistedTokens, }) { const lpBalance = balances['algorand:' + lpId] if (lpBalance && lpBalance !== '0') { @@ -200,15 +214,24 @@ async function getPriceFromAlgoFiLP(lpAssetId, unknownAssetId) { throw new Error('Not mapped with any whitelisted assets') } +async function lookupTransactionsByID(searchParams = {}) { + const urlParams = new URLSearchParams(searchParams).toString(); + return (await axiosObj.get(`/v2/transactions?${urlParams}`)).data +} + +const limitedGetAccountInfo = withLimiter(getAccountInfo) + module.exports = { tokens, getAssetInfo: withLimiter(getAssetInfo), + getAssetInfoWithoutReserve: withLimiter(getAssetInfoWithoutReserve), searchAccountsAll, - getAccountInfo, + getAccountInfo: limitedGetAccountInfo, sumTokens, getApplicationAddress, lookupApplications: withLimiter(lookupApplications), lookupAccountByID: withLimiter(lookupAccountByID), + lookupTransactionsByID: withLimiter(lookupTransactionsByID), searchAccounts: withLimiter(searchAccounts), getAppGlobalState: getAppGlobalState, getPriceFromAlgoFiLP, diff --git a/projects/helper/chain/aptos.js b/projects/helper/chain/aptos.js index 4fc5379249..01e416955a 100644 --- a/projects/helper/chain/aptos.js +++ b/projects/helper/chain/aptos.js @@ -1,4 +1,3 @@ - const sdk = require('@defillama/sdk') const http = require('../http') @@ -6,6 +5,7 @@ const { getEnv } = require('../env') const coreTokensAll = require('../coreAssets.json') const { transformBalances } = require('../portedTokens') const { log, getUniqueAddresses } = require('../utils') +const { GraphQLClient } = require("graphql-request"); const coreTokens = Object.values(coreTokensAll.aptos) @@ -14,6 +14,7 @@ const endpoint = () => getEnv('APTOS_RPC') async function aQuery(api) { return http.get(`${endpoint()}${api}`) } + async function getResources(account) { const data = [] let lastData @@ -36,11 +37,6 @@ async function getResource(account, key) { return data } -async function getCoinInfo(address) { - if (address === '0x1') return { data: { decimals: 8, name: 'Aptos' } } - return http.get(`${endpoint()}/v1/accounts/${address}/resource/0x1::coin::CoinInfo%3C${address}::coin::T%3E`) -} - function dexExport({ account, poolStr, @@ -101,9 +97,11 @@ async function getTableData({ table, data }) { return response } -async function function_view({ functionStr, type_arguments = [], args = [] }) { - const response = await http.post(`${endpoint()}/v1/view`, { "function": functionStr, "type_arguments": type_arguments, arguments: args }) - return response +async function function_view({ functionStr, type_arguments = [], args = [], ledgerVersion = undefined }) { + let path = `${endpoint()}/v1/view` + if (ledgerVersion !== undefined) path += `?ledger_version=${ledgerVersion}` + const response = await http.post(path, { "function": functionStr, "type_arguments": type_arguments, arguments: args }) + return response.length === 1 ? response[0] : response } function hexToString(hexString) { @@ -126,11 +124,65 @@ function sumTokensExport(options) { return async (api) => sumTokens({ ...api, api, ...options }) } +const graphQLClient = new GraphQLClient("https://api.mainnet.aptoslabs.com/v1/graphql"); + +// Query to get the latest block. +const latestBlockQuery = `query LatestBlock { + block_metadata_transactions(order_by: {version: desc}, limit: 1) { + block_height + } +}`; + +// Query to get a block. +const blockQuery = `query Block($block: bigint) { + block_metadata_transactions(limit: 1, where: {block_height: {_eq: $block}}) { + timestamp + version + } +}`; + +// Query to get a block range. +const blockRangeQuery = `query Block($firstBlock: bigint, $limit: Int) { + block_metadata_transactions(limit: $limit, where: {block_height: {_gte: $firstBlock}}, order_by: {block_height: asc}) { + timestamp + version + } +}`; + +// Given a timestamp, returns the transaction version that is closest to that timestamp. +const timestampToVersion = async (timestamp, minBlock = 0) => { + let left = minBlock; + let right = await graphQLClient.request(latestBlockQuery).then(r => Number(r.block_metadata_transactions[0].block_height)); + let middle; + while (left + 100 < right) { + middle = Math.round((left + right) / 2); + const middleBlock = await graphQLClient.request(blockQuery, { block: middle }).then(r => r.block_metadata_transactions[0]); + const middleBlockDate = new Date(middleBlock.timestamp); + if (middleBlockDate.getTime() === timestamp.getTime()) { + return Number(middleBlock.version); + } + if (timestamp.getTime() < middleBlockDate.getTime()) { + right = middle; + } else { + left = middle + 1; + } + } + const blocks = await graphQLClient.request( + blockRangeQuery, + { firstBlock: left, limit: right - left } + ).then(r => r.block_metadata_transactions); + const mappedBlocks = blocks.map((e) => ({ + version: Number(e.version), + delta: Math.abs(timestamp.getTime() - new Date(e.timestamp).getTime()) + })); + mappedBlocks.sort((a, b) => a.delta - b.delta); + return mappedBlocks[0].version; +} + module.exports = { endpoint: endpoint(), dexExport, aQuery, - getCoinInfo, getResources, getResource, coreTokens, @@ -139,4 +191,5 @@ module.exports = { getTableData, function_view, hexToString, + timestampToVersion }; diff --git a/projects/helper/chain/astar.js b/projects/helper/chain/astar.js new file mode 100644 index 0000000000..8598f8e2e8 --- /dev/null +++ b/projects/helper/chain/astar.js @@ -0,0 +1,30 @@ +const sdk = require('@defillama/sdk') +const { post } = require('../http') +const { sleep } = require('../utils') + +const endpoint = 'https://astar.api.subscan.io/api/v2/scan/search' + +async function getBalance(key) { + const data = await post(endpoint, { key }, { + headers: { + 'Content-Type': 'application/json', + 'X-API-Key': 'f89d810db5ef4c4fbc83b987dc2ffcda' + } + }) + return +(data?.data?.account?.balance ?? 0) +} + +async function sumTokens({ balances = {}, owners = [] }) { + let total = 0 + for (const owner of owners) { + const balance = await getBalance(owner) + total += balance + await sleep(3000) + } + sdk.util.sumSingleBalance(balances, 'astar', total) + return balances +} + +module.exports = { + sumTokens +} \ No newline at end of file diff --git a/projects/helper/chain/bifrost.js b/projects/helper/chain/bifrost.js new file mode 100644 index 0000000000..2977c8e200 --- /dev/null +++ b/projects/helper/chain/bifrost.js @@ -0,0 +1,30 @@ +const sdk = require('@defillama/sdk') +const { post } = require('../http') +const { sleep } = require('../utils') + +const endpoint = 'https://bifrost.api.subscan.io/api/v2/scan/search' + +async function getBalance(key) { + const data = await post(endpoint, { key }, { + headers: { + 'Content-Type': 'application/json', + 'X-API-Key': 'f89d810db5ef4c4fbc83b987dc2ffcda' + } + }) + return +(data?.data?.account?.balance ?? 0) +} + +async function sumTokens({ balances = {}, owners = [] }) { + let total = 0 + for (const owner of owners) { + const balance = await getBalance(owner) + total += balance + await sleep(3000) + } + sdk.util.sumSingleBalance(balances, 'bifrost', total) + return balances +} + +module.exports = { + sumTokens +} \ No newline at end of file diff --git a/projects/helper/chain/bittensor.js b/projects/helper/chain/bittensor.js new file mode 100644 index 0000000000..2278ee6547 --- /dev/null +++ b/projects/helper/chain/bittensor.js @@ -0,0 +1,38 @@ +const sdk = require('@defillama/sdk') +const { post } = require('../http') + +const TAO_STATS_SUBQUERY = "https://api.subquery.network/sq/TaoStats/bittensor-indexer"; + +async function getBalance(key) { + const query = `{ + query{ + account(id: "${key}"){ + id + nodeId + balanceTotal + balanceStaked + balanceFree + address + } + } + }`; + + + const { data: { query: { account: { balanceTotal } } } } = await post(TAO_STATS_SUBQUERY, { query, variables: {}, }); + return balanceTotal/1e9 +} + + +async function sumTokens({ balances = {}, owners = [] }) { + let total = 0 + for (const owner of owners) { + const balance = await getBalance(owner) + total += balance + } + sdk.util.sumSingleBalance(balances, 'bittensor', total) + return balances +} + +module.exports = { + sumTokens +} \ No newline at end of file diff --git a/projects/helper/chain/cosmos.js b/projects/helper/chain/cosmos.js index a5aaa88520..9fa4cb73c2 100644 --- a/projects/helper/chain/cosmos.js +++ b/projects/helper/chain/cosmos.js @@ -2,16 +2,18 @@ const sdk = require("@defillama/sdk"); const { transformBalances } = require("../portedTokens"); const { get, post } = require("../http"); const { PromisePool } = require("@supercharge/promise-pool"); -const { log } = require("../utils"); +const { log, sleep } = require("../utils"); const ADDRESSES = require('../coreAssets.json') // where to find chain info // https://proxy.atomscan.com/chains.json // https://cosmos-chain.directory/chains/cosmoshub // https://cosmos-chain.directory/chains +// https://celestia.publicnode.com/ +// https://api.axelarscan.io/api/getTVL const endPoints = { crescent: "https://mainnet.crescent.network:1317", - osmosis: "https://rest.cosmos.directory/osmosis", + osmosis: "https://lcd.osmosis.zone", cosmos: "https://cosmoshub-lcd.stakely.io", kujira: "https://kuji-api.kleomedes.network", comdex: "https://rest.comdex.one", @@ -43,7 +45,17 @@ const endPoints = { nibiru: "https://lcd.nibiru.fi", bostrom: "https://lcd.bostrom.cybernode.ai", joltify: "https://lcd.joltify.io", - noble: "https://api.noble.xyz" + kopi: "https://rest.kopi.money", + noble: "https://noble-api.polkachu.com", + mantra: "https://api.mantrachain.io", + elys: "https://api.elys.network", // https://api.elys.network/#/Query/ElysAmmPoolAll + pryzm: "https://api.pryzm.zone", + agoric: 'https://as-proxy.gateway.atomscan.com/agoric-lcd', + band: 'https://laozi1.bandchain.org/api', + celestia: 'https://celestia-rest.publicnode.com', + dydx: 'https://dydx-rest.publicnode.com', + carbon: 'https://rest.lavenderfive.com/carbon/', + evmos: 'https://evmos-api.polkachu.com', }; const chainSubpaths = { @@ -189,7 +201,8 @@ async function lpMinter({ token, block, chain } = {}) { return data.minter; } -async function queryContract({ contract, chain, data }) { +async function queryContract({ contract, chain, data, api }) { + if (api) chain = api.chain; if (typeof data !== "string") data = JSON.stringify(data); data = Buffer.from(data).toString("base64"); return ( @@ -303,10 +316,15 @@ async function sumTokens({ balances, owners = [], chain, owner, tokens, blacklis if (owner) owners = [owner] log(chain, "fetching balances for ", owners.length); let parallelLimit = 25; + if (chain === 'osmosis') parallelLimit = 5; const { errors } = await PromisePool.withConcurrency(parallelLimit) .for(owners) - .process(async (owner) => getBalance2({ balances, owner, chain, tokens, blacklistedTokens, api, })); + .process(async (owner, i) => { + await getBalance2({ balances, owner, chain, tokens, blacklistedTokens, api, }) + if (chain === 'osmosis' && owners.length > 100) + await sleep(3000) + }); if (errors && errors.length) throw errors[0]; return transformBalances(chain, balances); diff --git a/projects/helper/chain/flow.js b/projects/helper/chain/flow.js new file mode 100644 index 0000000000..33e5c9c6f7 --- /dev/null +++ b/projects/helper/chain/flow.js @@ -0,0 +1,31 @@ +// const sdk = require('@defillama/sdk') + +const { post } = require('../http') +const { getEnv } = require('../env') + +const endpoint = () => getEnv('FLOW_RPC') + +async function callCadenceScript(script, isNumber = false) { + const queryCodeBase64 = Buffer.from(script, "utf-8").toString("base64"); + const response = await post( + `${endpoint()}/v1/scripts`, + { script: queryCodeBase64 }, + { + headers: { "content-type": "application/json" }, + } + ); + let resEncoded = response; + let resString = Buffer.from(resEncoded, "base64").toString("utf-8"); + let resJson = JSON.parse(resString); + + if (isNumber) { + return Number(resJson.value); + } else { + return resJson; + } +} + +module.exports = { + endpoint: endpoint(), + callCadence: callCadenceScript, +}; diff --git a/projects/helper/chain/fuel.js b/projects/helper/chain/fuel.js new file mode 100644 index 0000000000..43ead7d6cc --- /dev/null +++ b/projects/helper/chain/fuel.js @@ -0,0 +1,55 @@ + +const { GraphQLClient, } = require('graphql-request') +const { transformBalances } = require('../portedTokens') +const { fuel: { query }} = require('./rpcProxy') +const client = new GraphQLClient('https://mainnet.fuel.network/v1/graphql') + +async function sumTokens({ api, owner, owners, token, tokens = [], tokensAndOwners = [] }) { + if (token) + tokens = [token] + if (owner) + owners = [owner] + + if (owners.length && !tokens.length) { + await addAllTokenBalances({ api, owners }) + } else if (owners.length) + tokensAndOwners = tokens.map(token => owners.map(owner => [token, owner])).flat() + + tokensAndOwners = getUniqueToA(tokensAndOwners) + + if (tokensAndOwners.length) { + const query = tokensAndOwners.map(([token, owner], i) => `q${i}: contractBalance( + contract: "${owner}" asset: "${token}" + ) { contract assetId amount}`).join('\n'); + + const results = await client.request(`{${query}}`) + Object.values(results).forEach(i => api.add(i.assetId, i.amount)) + } + + return transformBalances('fuel', api.getBalances()) + + function getUniqueToA(toa) { + toa = toa.map(i => i.join('-').toLowerCase()) + toa = new Set(toa) + return [...toa].map(i => i.split('-')) + } +} + +async function addAllTokenBalances({ api, owners = [] }) { + + for (const owner of owners) { + const query = `contractBalances( + filter: { contract: "${owner}" }, first: 1000 + ) { nodes { assetId amount } }` + + const results = await client.request(`{${query}}`) + results.contractBalances.nodes.forEach(node => { + api.add(node.assetId, node.amount); + }) + } +} + +module.exports = { + sumTokens, + query, +} \ No newline at end of file diff --git a/projects/helper/chain/litecoin.js b/projects/helper/chain/litecoin.js index 400d6f6d20..b8c42f51c1 100644 --- a/projects/helper/chain/litecoin.js +++ b/projects/helper/chain/litecoin.js @@ -4,7 +4,7 @@ const { PromisePool } = require('@supercharge/promise-pool') // const url = addr => 'https://chainz.cryptoid.info/ltc/api.dws?q=getbalance&a=' + addr const url1 = addr => 'https://ltc.tokenview.io/api/address/balancetrend/ltc/' + addr -const url = addr => 'https://explorer.litecoin.net/api/address/' + addr +const url = addr => 'https://litecoinspace.org/api/address/' + addr async function getBalance(addr) { try { diff --git a/projects/helper/chain/near.js b/projects/helper/chain/near.js index 958ad675dc..55e6d4137d 100644 --- a/projects/helper/chain/near.js +++ b/projects/helper/chain/near.js @@ -13,6 +13,7 @@ function transformAddress(addr) { } const endpoint = "https://rpc.mainnet.near.org" +// const endpoint = "https://near.lava.build" const tokenMapping = { 'wrap.near': { name: 'near', decimals: 24, }, @@ -43,6 +44,16 @@ const tokenMapping = { 'token.sweat': { name: 'sweatcoin', decimals: 18 }, 'v2-nearx.stader-labs.near': { name: 'stader-nearx', decimals: 24 }, '17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1': { name: 'usd-coin', decimals: 6 }, + 'edge-fast.near': { name: 'edge-video-ai', decimals: 24 }, + '802d89b6e511b335f05024a65161bce7efc3f311.factory.bridge.near': { name: 'linear-protocol-lnr', decimals: 18 }, + 'ftv2.nekotoken.near': { name: 'neko', decimals: 24 }, + 'token.lonkingnearbackto2024.near': { name: 'lonk-on-near', decimals: 8 }, + 'blackdragon.tkn.near': { name: 'black-dragon', decimals: 24 }, + 'gear.enleap.near': { name: 'near-tinker-union-gear', decimals: 18 }, + 'token.0xshitzu.near': { name: 'shitzu', decimals: 18 }, + 'purge-558.meme-cooking.near': { name: 'forgive-me-father', decimals: 18 }, + 'mpdao-token.near': { name: 'meta-pool-dao', decimals: 6 }, + 'kat.token0.near': { name: 'nearkat', decimals: 18 }, } async function view_account(account_id) { diff --git a/projects/helper/chain/radixdlt.js b/projects/helper/chain/radixdlt.js index 84bd139608..5ca6b9bba5 100644 --- a/projects/helper/chain/radixdlt.js +++ b/projects/helper/chain/radixdlt.js @@ -12,7 +12,8 @@ const chain = 'radixdlt' const ENTITY_DETAILS_URL = `https://mainnet.radixdlt.com/state/entity/details` -async function sumTokens({ owner, owners = [], api, transformLSU = false, }) { +async function sumTokens({ owner, owners = [], api, transformLSU = false, blacklistedTokens = [] }) { + const blacklistSet = new Set(blacklistedTokens.map(i => i.toLowerCase())) const fixBalances = getFixBalancesSync(chain) if (owner) owners.push(owner) @@ -23,6 +24,7 @@ async function sumTokens({ owner, owners = [], api, transformLSU = false, }) { let items = await queryAddresses({ addresses: owners }) items.forEach((item) => { item.fungible_resources.items.forEach(({ resource_address, amount }) => { + if (blacklistSet.has(resource_address.toLowerCase())) return; api.add(resource_address, +amount) }); }); @@ -30,11 +32,12 @@ async function sumTokens({ owner, owners = [], api, transformLSU = false, }) { return fixBalances(api.getBalances()) } -async function queryAddresses({ addresses = [], }) { +async function queryAddresses({ addresses = [], miscQuery = {} }) { let items = [] - const chunks = sliceIntoChunks(addresses, 20) + const chunks = sliceIntoChunks(addresses, 20) for (const chunk of chunks) { const body = { + ...miscQuery, "addresses": chunk, "opt_ins": { "explicit_metadata": ["name"] } } @@ -69,7 +72,7 @@ async function queryLiquidStakeUnitDetails(addresses = []) { addresses = addresses.filter(i => i !== ADDRESSES.radixdlt.XRD) let lsuRedemptionValues = {} - const chunks = sliceIntoChunks(addresses, 20) + const chunks = sliceIntoChunks(addresses, 20) for (const chunk of chunks) { let body = { "addresses": chunk, @@ -81,7 +84,7 @@ async function queryLiquidStakeUnitDetails(addresses = []) { let validators = [] for (const lsuResource of data.items) { let v = lsuResource.metadata.items.filter(metadataItem => metadataItem.key === "validator") - if (v !== undefined) { + if (v !== undefined && v.length > 0) { let validator = v[0] if (validator.value.typed.type === "GlobalAddress" && validator.value.typed.value.startsWith("validator_")) { lsuRedemptionValues[lsuResource.address] = { @@ -97,6 +100,11 @@ async function queryLiquidStakeUnitDetails(addresses = []) { } } + + if (validators.length == 0) { + continue + } + let validatorsDetailsBody = { "addresses": validators, "aggregation_level": "Vault" @@ -111,10 +119,10 @@ async function queryLiquidStakeUnitDetails(addresses = []) { let xrdStakeVaultBalance = new BigNumber(xrdStakeVault[0].amount) let totalSupplyOfStakeUnits = new BigNumber(lsuRedemptionValues[stakeUnitResourceAddress]["totalSupplyOfStakeUnits"]) - let xrdRedemptionValue = xrdStakeVaultBalance / totalSupplyOfStakeUnits + let xrdRedemptionValue = xrdStakeVaultBalance / totalSupplyOfStakeUnits lsuRedemptionValues[stakeUnitResourceAddress]["xrdRedemptionValue"] = xrdRedemptionValue } - } catch(error) { + } catch (error) { console.log("There was an error getting the xrd redemption value. Check that all addressed used are LSU resource addresses") return {} } @@ -122,7 +130,7 @@ async function queryLiquidStakeUnitDetails(addresses = []) { return lsuRedemptionValues } -function sumTokensExport({...args}) { +function sumTokensExport({ ...args }) { return async (api) => sumTokens({ ...args, api, }) } diff --git a/projects/helper/chain/rpcProxy.js b/projects/helper/chain/rpcProxy.js new file mode 100644 index 0000000000..ee05f6104b --- /dev/null +++ b/projects/helper/chain/rpcProxy.js @@ -0,0 +1,49 @@ +const axios = require('axios') +const { getEnv } = require('../env') + +const client = axios.create({ + baseURL: getEnv('RPC_PROXY_URL'), + timeout: 30000, +}) + + +module.exports = { + fuel: { + query: async ({ contractId, abi, method }) => { + const { data } = await client.post('/fuel/query', { contractId, abi, method }) + return data + } + }, + ripple: { + gatewayBalances: async ({ account, hotwallet }) => { + const { data } = await client.post('/ripple/gateway_balances', { account, hotwallet }) + return data + } + }, + drift: { + vaultTvl: async (vault, version) => { + const { data } = await client.get('/drift/vault_tvl', { params: { vault, version } }) + return data + } + }, + injective: { + mitoVaultQuery: async ({ address }) => { + const { data } = await client.get('/injective/mito-vault/' + address) + return data + }, + getMarkets: async (body) => { + const { data } = await client.post('/injective/orderbook/markets', body) + return data + }, + getOrders: async (body) => { + const { data } = await client.post('/injective/orderbook/orders', body) + return data + }, + }, + kamino: { + tvl: async () => { + const { data } = await client.get('/kamino/tvl') + return data + }, + }, +} \ No newline at end of file diff --git a/projects/helper/chain/stellar.js b/projects/helper/chain/stellar.js new file mode 100644 index 0000000000..460b0378f5 --- /dev/null +++ b/projects/helper/chain/stellar.js @@ -0,0 +1,17 @@ +const { get } = require('../http') + +async function getAssetSupply(asset) { + const [assetCode, assetIssuer] = asset.split('-') + const { _embedded: { records } } = await get(`https://horizon.stellar.org/assets?asset_code=${assetCode}&asset_issuer=${assetIssuer}`) + let supply = 0 + for (const { balances } of records) { + supply += +balances.authorized + supply += +balances.authorized_to_maintain_liabilities + } + return supply +} + + +module.exports = { + getAssetSupply +} \ No newline at end of file diff --git a/projects/helper/chain/sui.js b/projects/helper/chain/sui.js index 01b1749635..97ff648317 100644 --- a/projects/helper/chain/sui.js +++ b/projects/helper/chain/sui.js @@ -9,6 +9,7 @@ const { sliceIntoChunks, getUniqueAddresses } = require('../utils') //https://docs.sui.io/sui-jsonrpc const endpoint = () => getEnv('SUI_RPC') +const graphEndpoint = () => getEnv('SUI_GRAPH_RPC') async function getObject(objectId) { return (await call('sui_getObject', [objectId, { @@ -32,8 +33,8 @@ async function queryEvents({ eventType, transform = i => i }) { } async function getObjects(objectIds) { - if (objectIds.length > 49) { - const chunks = sliceIntoChunks(objectIds, 49) + if (objectIds.length > 9) { + const chunks = sliceIntoChunks(objectIds, 9) const res = [] for (const chunk of chunks) res.push(...(await getObjects(chunk))) return res @@ -47,7 +48,7 @@ async function getObjects(objectIds) { "showContent": true, }], }) - return objectIds.map(i => result.find(j => j.data.objectId === i)?.data?.content) + return objectIds.map(i => result.find(j => j.data?.objectId === i)?.data?.content) } async function getDynamicFieldObject(parent, id, { idType = '0x2::object::ID' } = {}) { @@ -73,8 +74,9 @@ async function getDynamicFieldObjects({ parent, cursor = null, limit = 48, items async function call(method, params, { withMetadata = false } = {}) { if (!Array.isArray(params)) params = [params] const { - result + result, error } = await http.post(endpoint(), { jsonrpc: "2.0", id: 1, method, params, }) + if (!result && error) throw new Error(`[sui] ${error.message}`) if (['suix_getAllBalances'].includes(method)) return result return withMetadata ? result : result.data } @@ -132,13 +134,45 @@ function dexExport({ } -async function sumTokens({ balances = {}, owners = [], blacklistedTokens = [], tokens = [], api }) { +async function sumTokens({ owners = [], blacklistedTokens = [], api, tokens = [], }) { owners = getUniqueAddresses(owners, true) const bals = await call('suix_getAllBalances', owners) - bals.forEach(i => api.add(i.coinType, i.totalBalance)) + const blacklistSet = new Set(blacklistedTokens) + const tokenSet = new Set(tokens) + bals.forEach(i => { + if (blacklistSet.has(i.coinType)) return; + if (tokenSet.size > 0 && !tokenSet.has(i.coinType)) return; + api.add(i.coinType, i.totalBalance) + }) return api.getBalances() } +function sumTokensExport(config) { + return (api) => sumTokens({ ...config, api }) +} + +async function queryEventsByType({ eventType, transform = i => i }) { + const query = `query GetEvents($after: String, $eventType: String!) { + events(first: 50, after: $after, filter: { eventType: $eventType }) { + pageInfo { + endCursor + hasNextPage + } + nodes { + json + } + } +}` + const items = [] + let after = null + do { + const { events: { pageInfo: { endCursor, hasNextPage}, nodes } } = await sdk.graph.request(graphEndpoint(), query, {variables: { after, eventType}}) + after = hasNextPage ? endCursor : null + items.push(...nodes.map(i => i.json).map(transform)) + } while (after) + return items +} + module.exports = { endpoint: endpoint(), call, @@ -150,4 +184,6 @@ module.exports = { getDynamicFieldObjects, dexExport, sumTokens, + sumTokensExport, + queryEventsByType, }; diff --git a/projects/helper/chain/tezos.js b/projects/helper/chain/tezos.js index 5bc17101dc..a0c60de443 100644 --- a/projects/helper/chain/tezos.js +++ b/projects/helper/chain/tezos.js @@ -3,7 +3,7 @@ const http = require('../http') const sdk = require('@defillama/sdk') const { PromisePool } = require('@supercharge/promise-pool') -const RPC_ENDPOINT = 'https://api.tzkt.io' +const RPC_ENDPOINT = 'https://api.mainnet.tzkt.io' const usdtAddressTezos = ADDRESSES.tezos.USDt const transformAddressDefault = t => t == "tezos" ? "coingecko:tezos" : 'tezos:' + t @@ -86,7 +86,7 @@ async function resolveLPPosition({ balances = {}, owner, lpToken, transformAddre } async function sumTokens({ owners = [], balances = {}, includeTezos = false }) { - const { errors } = await PromisePool.withConcurrency(10) + const { errors } = await PromisePool.withConcurrency(5) .for(owners) .process(async item => { await getTokenBalances(item, includeTezos, { balances }) diff --git a/projects/helper/chain/ton.js b/projects/helper/chain/ton.js index 2efa80e6a5..43a4266227 100644 --- a/projects/helper/chain/ton.js +++ b/projects/helper/chain/ton.js @@ -4,18 +4,26 @@ const plimit = require('p-limit') const _rateLimited = plimit(1) const rateLimited = fn => (...args) => _rateLimited(() => fn(...args)) -const { getUniqueAddresses, sleep } = require('../utils') +const { getUniqueAddresses, sleep, sliceIntoChunks } = require('../utils') async function getTonBalance(addr) { const res = await get(`https://toncenter.com/api/v3/account?address=${addr}`) return res.balance } +async function getJettonBalances(addr) { + const response = await get(`https://tonapi.io/v2/accounts/${addr}/jettons?currencies=usd`) + + const res = {} + response.balances.forEach(val => { + res[val.jetton.address] = { balance: val.balance, price: val.price.prices.USD, decimals: val.jetton.decimals } + }) + + return res +} + async function _sumTokensAccount({ api, addr, tokens = [], onlyWhitelistedTokens = false }) { - if (tokens.includes(ADDRESSES.null)) { - const balance = await getTonBalance(addr) - api.add(ADDRESSES.null, balance) - } + if (onlyWhitelistedTokens && tokens.length === 1 && tokens.includes(ADDRESSES.ton.TON)) return; const { balances } = await get(`https://tonapi.io/v2/accounts/${addr}/jettons?currencies=usd`) await sleep(1000 * (3 * Math.random() + 3)) balances.forEach(({ balance, price, jetton }) => { @@ -28,6 +36,23 @@ async function _sumTokensAccount({ api, addr, tokens = [], onlyWhitelistedTokens }) } +async function getTokenRates({ tokens = [] }) { + const { rates } = await get(`https://tonapi.io/v2/rates?` + ( + new URLSearchParams({ tokens: tokens.join(','), currencies: "usd" }) + ).toString()); + + const tokenPrices = {}; + + tokens.forEach(tokenAddress => { + if (rates[tokenAddress]) { + const usdPrice = rates[tokenAddress].prices.USD; + tokenPrices[tokenAddress] = usdPrice; + } + }); + + return tokenPrices +} + const sumTokensAccount = rateLimited(_sumTokensAccount) async function sumTokens({ api, tokens, owners = [], owner, onlyWhitelistedTokens = false }) { @@ -35,6 +60,9 @@ async function sumTokens({ api, tokens, owners = [], owner, onlyWhitelistedToken if (owner) owners.push(owner) owners = getUniqueAddresses(owners, api.chain) + + if (tokens.includes(ADDRESSES.null)) await addTonBalances({ api, addresses: owners }) + for (const addr of owners) { await sumTokensAccount({ api, addr, tokens, onlyWhitelistedTokens }) } @@ -45,7 +73,7 @@ function sumTokensExport({ ...args }) { return (api) => sumTokens({ api, ...args }) } -async function call({ target, abi, params = [] }) { +async function call({ target, abi, params = [], rawStack = false, }) { const requestBody = { "address": target, "method": abi, @@ -59,6 +87,9 @@ async function call({ target, abi, params = [] }) { if (exit_code !== 0) { throw new Error('Expected a zero exit code, but got ' + exit_code) } + + if (rawStack) return stack + stack.forEach((i, idx) => { if (i[0] === 'num') { stack[idx] = parseInt(i[1], 16) @@ -68,9 +99,28 @@ async function call({ target, abi, params = [] }) { return stack } +async function addTonBalances({ api, addresses }) { + api.log('Fetching TON balances', { addresses: addresses.length }) + const chunks = sliceIntoChunks(addresses, 399) + let i = 0 + for (const chunk of chunks) { + api.log('Fetching TON balances', { chunk: i++, chunks: chunks.length }) + const { accounts } = await get('https://toncenter.com/api/v3/accountStates?address=' + encodeURIComponent(chunk.join(',')) + '&include_boc=false') + accounts.forEach(({ balance }) => { + api.add(ADDRESSES.null, balance) + }) + if (addresses.length > 199) { + await sleep(3000) + } + } +} + module.exports = { + addTonBalances, getTonBalance, + getTokenRates, sumTokens, sumTokensExport, call, + getJettonBalances, } \ No newline at end of file diff --git a/projects/helper/chain/utils/ton-address.js b/projects/helper/chain/utils/ton-address.js new file mode 100644 index 0000000000..d704c7d436 --- /dev/null +++ b/projects/helper/chain/utils/ton-address.js @@ -0,0 +1,237 @@ +const bounceable_tag = 0x11; +const non_bounceable_tag = 0x51; +const test_flag = 0x80; + +function crc16(data) { + const poly = 0x1021; + let reg = 0; + const message = Buffer.alloc(data.length + 2); + message.set(data); + for (let byte of message) { + let mask = 0x80; + while (mask > 0) { + reg <<= 1; + if (byte & mask) { + reg += 1; + } + mask >>= 1; + if (reg > 0xffff) { + reg &= 0xffff; + reg ^= poly; + } + } + } + return Buffer.from([Math.floor(reg / 256), reg % 256]); +} + +function parseFriendlyAddress(src) { + if (typeof src === "string" && !Address.isFriendly(src)) { + throw new Error("Unknown address type"); + } + const data = Buffer.isBuffer(src) ? src : Buffer.from(src, "base64"); + // 1byte tag + 1byte workchain + 32 bytes hash + 2 byte crc + if (data.length !== 36) { + throw new Error("Unknown address type: byte length is not equal to 36"); + } + // Prepare data + const addr = data.subarray(0, 34); + const crc = data.subarray(34, 36); + const calcedCrc = (0, crc16)(addr); + if (!(calcedCrc[0] === crc[0] && calcedCrc[1] === crc[1])) { + throw new Error("Invalid checksum: " + src); + } + // Parse tag + let tag = addr[0]; + let isTestOnly = false; + let isBounceable = false; + if (tag & test_flag) { + isTestOnly = true; + tag = tag ^ test_flag; + } + if (tag !== bounceable_tag && tag !== non_bounceable_tag) + throw "Unknown address tag"; + isBounceable = tag === bounceable_tag; + let workchain = null; + if (addr[1] === 0xff) { + // TODO we should read signed integer here + workchain = -1; + } else { + workchain = addr[1]; + } + const hashPart = addr.subarray(2, 34); + return { isTestOnly, isBounceable, workchain, hashPart }; +} +class Address { + static isAddress(src) { + return src instanceof Address; + } + static isFriendly(source) { + // Check length + if (source.length !== 48) { + return false; + } + // Check if address is valid base64 + if (!/[A-Za-z0-9+/_-]+/.test(source)) { + return false; + } + return true; + } + static isRaw(source) { + // Check if has delimiter + if (source.indexOf(":") === -1) { + return false; + } + let [wc, hash] = source.split(":"); + // wc is not valid + if (!Number.isInteger(parseFloat(wc))) { + return false; + } + // hash is not valid + if (!/[a-f0-9]+/.test(hash.toLowerCase())) { + return false; + } + // has is not correct + if (hash.length !== 64) { + return false; + } + return true; + } + static normalize(source) { + if (typeof source === "string") { + return Address.parse(source).toString(); + } else { + return source.toString(); + } + } + static parse(source) { + if (Address.isFriendly(source)) { + return this.parseFriendly(source).address; + } else if (Address.isRaw(source)) { + return this.parseRaw(source); + } else { + throw new Error("Unknown address type: " + source); + } + } + static parseRaw(source) { + let workChain = parseInt(source.split(":")[0]); + let hash = Buffer.from(source.split(":")[1], "hex"); + return new Address(workChain, hash); + } + static parseFriendly(source) { + if (Buffer.isBuffer(source)) { + let r = parseFriendlyAddress(source); + return { + isBounceable: r.isBounceable, + isTestOnly: r.isTestOnly, + address: new Address(r.workchain, r.hashPart), + }; + } else { + let addr = source.replace(/-/g, "+").replace(/_/g, "/"); // Convert from url-friendly to true base64 + let r = parseFriendlyAddress(addr); + return { + isBounceable: r.isBounceable, + isTestOnly: r.isTestOnly, + address: new Address(r.workchain, r.hashPart), + }; + } + } + constructor(workChain, hash) { + this.toRawString = () => { + return this.workChain + ":" + this.hash.toString("hex"); + }; + this.toRaw = () => { + const addressWithChecksum = Buffer.alloc(36); + addressWithChecksum.set(this.hash); + addressWithChecksum.set( + [ + this.workChain, + this.workChain, + this.workChain, + this.workChain, + ], + 32 + ); + return addressWithChecksum; + }; + this.toStringBuffer = (args) => { + let testOnly = + args && args.testOnly !== undefined ? args.testOnly : false; + let bounceable = + args && args.bounceable !== undefined ? args.bounceable : true; + let tag = bounceable ? bounceable_tag : non_bounceable_tag; + if (testOnly) { + tag |= test_flag; + } + const addr = Buffer.alloc(34); + addr[0] = tag; + addr[1] = this.workChain; + addr.set(this.hash, 2); + const addressWithChecksum = Buffer.alloc(36); + addressWithChecksum.set(addr); + addressWithChecksum.set((0, crc16)(addr), 34); + return addressWithChecksum; + }; + this.toString = (args) => { + let urlSafe = + args && args.urlSafe !== undefined ? args.urlSafe : true; + let buffer = this.toStringBuffer(args); + if (urlSafe) { + return buffer + .toString("base64") + .replace(/\+/g, "-") + .replace(/\//g, "_"); + } else { + return buffer.toString("base64"); + } + }; + if (hash.length !== 32) { + throw new Error("Invalid address hash length: " + hash.length); + } + this.workChain = workChain; + this.hash = hash; + Object.freeze(this); + } + equals(src) { + if (src.workChain !== this.workChain) { + return false; + } + return src.hash.equals(this.hash); + } +} + +const addressToInt = (address) => { + return BigInt(`0x${address.toRawString().replace("0:", "")}`); +}; + +const intTo256BitHex = (n) => { + // Convert the BigInt to a hexadecimal string + const hex = n.toString(16); + // Pad with leading zeros to ensure it is 64 characters (256 bits) + return hex.padStart(64, "0"); +}; + +const convertIntToAddress = (uint) => { + const addressString = `0:${intTo256BitHex(uint)}`; + return Address.parseRaw(addressString); +}; + +const compareAddress = (a, b) => { + if (!a || !b) { + return false; + } + + try { + const parsedA = typeof a === "string" ? Address.parse(a) : a; + const parsedB = typeof b === "string" ? Address.parse(b) : b; + + return parsedA.equals(parsedB); + } catch { + return false; + } +}; + +module.exports = { + addressToInt, + convertIntToAddress, + compareAddress, +}; \ No newline at end of file diff --git a/projects/helper/chains.json b/projects/helper/chains.json index 9225969f62..e850239e96 100644 --- a/projects/helper/chains.json +++ b/projects/helper/chains.json @@ -3,17 +3,20 @@ "ace", "aelf", "aeternity", + "agoric", "ailayer", "airdao", "alephium", "algorand", "alv", + "ancient8", + "apechain", "aptos", "arbitrum", "arbitrum_nova", - "ancient8", "archway", "area", + "assetchain", "astar", "astrzk", "aura", @@ -31,10 +34,10 @@ "bitcoincash", "bitgert", "bitindi", + "bitkub", "bitrock", "bittensor", "bittorrent", - "bitkub", "blast", "bob", "boba", @@ -46,8 +49,8 @@ "bouncebit", "bsc", "bsquared", - "btr", "btn", + "btr", "bytomsidechain", "callisto", "candle", @@ -56,6 +59,7 @@ "cardano", "celestia", "celo", + "chainflip", "chainx", "chihuahua", "chz", @@ -66,12 +70,14 @@ "concordium", "conflux", "core", + "corn", "cosmos", "coti", "crab", "crescent", "cronos", "cronos_zkevm", + "crossfi", "csc", "cube", "curio", @@ -84,18 +90,21 @@ "degen", "dexalot", "dexit", - "dfs", "dfk", + "dfs", "doge", "dogechain", "dsc", + "duckchain", "dydx", "dymension", "echelon", + "eclipse", "edg", "elastos", "elrond", "elsm", + "elys", "empire", "energi", "energyweb", @@ -106,11 +115,12 @@ "equilibrium", "era", "ergo", - "etlk", "ethereum", "ethereumclassic", "ethf", "ethpow", + "etlk", + "etn", "europa", "everscale", "evmos", @@ -123,6 +133,7 @@ "fraxtal", "fsc", "ftn", + "fuel", "functionx", "fuse", "fusion", @@ -132,13 +143,15 @@ "godwoken", "godwoken_v1", "goerli", + "gravity", "gravitybridge", "grove", - "harmony", "ham", + "harmony", "heco", "hedera", "heiko", + "hela", "hoo", "hpb", "hydra", @@ -146,9 +159,11 @@ "hyperliquid", "icon", "icp", + "idex", "imx", "inevm", "injective", + "ink", "interlay", "iotaevm", "iotex", @@ -166,6 +181,7 @@ "kinto", "kintsugi", "klaytn", + "kopi", "kroma", "kujira", "kusama", @@ -177,15 +193,18 @@ "lightlink_phoenix", "linea", "liquidchain", + "lisk", "litecoin", "loop", "lukso", "lung", "manta", - "massa", "manta_atlantic", "mantle", + "mantra", "map", + "massa", + "matchain", "mayachain", "meer", "merlin", @@ -200,6 +219,7 @@ "mode", "moonbeam", "moonriver", + "morph", "multivac", "muuchain", "mvc", @@ -209,6 +229,7 @@ "neo", "neo3", "neon_evm", + "neox", "neutron", "new", "nibiru", @@ -220,6 +241,7 @@ "oas", "oasis", "obyte", + "odyssey", "okexchain", "omax", "ontology", @@ -245,15 +267,19 @@ "polkadot", "polygon", "polygon_zkevm", + "polynomial", "pool2", "posi", "proton", + "pryzm", "pulse", "q", + "qom", "quasar", "quicksilver", "radixdlt", "rari", + "rbn", "real", "reef", "regen", @@ -274,14 +300,18 @@ "scroll", "secret", "sei", + "shape", "shibarium", "shiden", + "shido", "shimmer_evm", "sifchain", "smartbch", "solana", "sommelier", "songbird", + "sonic", + "sophon", "sora", "stacks", "stafi", @@ -294,9 +324,11 @@ "stride", "sui", "svm", + "swellchain", "sx", "syscoin", "taiko", + "tara", "telos", "tenet", "terra", @@ -314,28 +346,36 @@ "ultra", "ultron", "umee", + "unit0", + "vana", "vechain", "velas", "venom", + "verus", + "vinu", "vision", "vite", "vive", "wan", + "water", "waves", "wax", + "wc", "wemix", "xai", "xdai", "xdc", "xlayer", "xpla", + "xsat", "zeniq", "zeta", "zilliqa", + "zircuit", "zkcro", "zkfair", "zklink", "zksync", "zora", "zyx" -] +] \ No newline at end of file diff --git a/projects/helper/compound.js b/projects/helper/compound.js index 1431b9681c..eee33c2a43 100644 --- a/projects/helper/compound.js +++ b/projects/helper/compound.js @@ -1,342 +1,60 @@ -const ADDRESSES = require('./coreAssets.json') - -const sdk = require('@defillama/sdk'); const abi = require('./abis/compound.json'); -const { unwrapUniswapLPs } = require('./unwrapLPs'); -const { requery } = require("./requery"); -const { getChainTransform, transformBalances } = require('./portedTokens'); -const { usdtAddress } = require('./balances'); -const agoraAbi = require("./../agora/abi.json"); -const { sumTokens2, nullAddress, unwrapLPsAuto, } = require('./unwrapLPs') +const { sumTokens2, nullAddress, } = require('./unwrapLPs') const methodologies = require('./methodologies'); -// ask comptroller for all markets array -async function getAllCTokens(comptroller, block, chain, allMarketsAbi = abi['getAllMarkets']) { - return (await sdk.api.abi.call({ - block, - target: comptroller, - params: [], - abi: allMarketsAbi, - chain - })).output; -} - // returns [{cToken, underlying}] -async function getMarkets(comptroller, block, chain, cether, cetheEquivalent, blacklist = [], abis = {}) { - const marketKey = `${chain}:${comptroller}:${block}` - - if (!marketsCache[marketKey]) marketsCache[marketKey] = _getMarkets() - return marketsCache[marketKey] - - async function _getMarkets() { - let allCTokens = await getAllCTokens(comptroller, block, chain, abis.getAllMarkets); - const markets = [] - const calls = [] - allCTokens.forEach(cToken => { - cToken = cToken.toLowerCase() - if (blacklist.includes(cToken)) return; - if (cether && (cToken === cether.toLowerCase?.() || cether.includes(cToken))) { - markets.push({ underlying: cetheEquivalent, cToken }) - return; - } - if (cToken === '0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5'.toLowerCase()) { - markets.push({ underlying: ADDRESSES.ethereum.WETH, cToken }) //cETH => WETH - return; - } - if (cToken === '0x5C0401e81Bc07Ca70fAD469b451682c0d747Ef1c'.toLowerCase() && chain === 'avax') { - markets.push({ underlying: ADDRESSES.avax.WAVAX, cToken }) - return; - } - if (['0xd2ec53e8dd00d204d3d9313af5474eb9f5188ef6', '0x0aeadb9d4c6a80462a47e87e76e487fa8b9a37d7'].includes(cToken) && chain === 'rsk') { - markets.push({ underlying: ADDRESSES.rsk.WRBTC1, cToken }) - return; - } - - calls.push({ target: cToken }) - }) - - const underlyings = await sdk.api.abi.multiCall({ - abi: abi['underlying'], - calls, - chain, block, - }) - - await requery(underlyings, chain, block, abi) - - const isCeth = underlyings.output.find(i => !i.output) - if (isCeth) - throw new Error(`${isCeth.input.target} market rugged, is that market CETH?`) - - underlyings.output.forEach(({ output, input: { target } }) => markets.push({ cToken: target, underlying: output })) - - return markets; - } -} -async function unwrapPuffTokens(balances, lpPositions, block) { - const pricePerShare = (await sdk.api.abi.multiCall({ - block, - abi: agoraAbi.getPricePerFullShare, - calls: lpPositions.map(p => ({ - target: p.token - })), - chain: 'metis' - })).output; - const underlying = (await sdk.api.abi.multiCall({ - block, - abi: agoraAbi.want, - calls: lpPositions.map(p => ({ - target: p.token - })), - chain: 'metis' - })).output; - - const newLpPositions = []; - for (let i = 0; i < lpPositions.length; i++) { - newLpPositions.push({ balance: lpPositions[i].balance * pricePerShare[i].output / 10 ** 18, token: underlying[i].output }) - } - - await unwrapUniswapLPs( - balances, - newLpPositions, - block, - 'metis' - ); +async function getMarkets(comptroller, api, cether, cetheEquivalent = nullAddress, blacklist = [], abis = {}) { + + if (cether) { + if (!Array.isArray(cether)) cether = [cether] + cether = new Set(cether.map(i => i.toLowerCase())) + } + const blacklistSet = new Set([...blacklist].map(i => i.toLowerCase())) + const cTokens = (await api.call({ abi: abis.getAllMarkets, target: comptroller })).map(i => i.toLowerCase()) + const underlyings = await api.multiCall({ abi: abi.underlying, calls: cTokens, permitFailure: true }) + + const markets = [] + underlyings.forEach((underlying, i) => { + const cToken = cTokens[i] + if (cether?.has(cToken)) underlying = cetheEquivalent + if (blacklistSet.has(cToken)) return; + if (underlying) markets.push({ cToken, underlying }) + else throw new Error(`Market rugged, is that market CETH? ${cToken}`) + }) + return markets; } -let marketsCache = {} - -function getCompoundV2Tvl(comptroller, chain, transformAdress, - cether = "0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5", cetheEquivalent = ADDRESSES.ethereum.WETH, - borrowed = false, checkForLPTokens = undefined, - { - fetchBalances = false, - blacklistedTokens = [], - abis = {}, - resolveLPs = true, - } = {}) { +function _getCompoundV2Tvl(comptroller, cether, cetheEquivalent, borrowed = false, { blacklistedTokens = [], abis = {}, } = {}) { abis = { ...abi, ...abis } - blacklistedTokens = blacklistedTokens.map(i => i.toLowerCase()) return async (api) => { - if (!api) { - api = new sdk.ChainApi({ chain, }) - } - chain = api.chain - const block = api.block - if (!transformAdress) transformAdress = await getChainTransform(chain) - let balances = {}; - let markets = await getMarkets(comptroller, block, chain, cether, cetheEquivalent, blacklistedTokens, abis) - if (!borrowed && fetchBalances) { - return sumTokens2({ api, tokensAndOwners: markets.map(i => [i.underlying, i.cToken]), blacklistedTokens, }) - } - const cTokenCalls = markets.map(market => ({ - target: market.cToken, - })) - // Get V2 tokens locked - let v2Locked = await sdk.api.abi.multiCall({ - block, - chain, - calls: cTokenCalls, - abi: borrowed ? abis.totalBorrows : abis.getCash, - }); - - let symbols; - if (checkForLPTokens !== undefined) { - symbols = await sdk.api.abi.multiCall({ - block, - chain, - calls: cTokenCalls, - abi: "erc20:symbol", - }); - } - - const lpPositions = [] - markets.forEach((market, idx) => { - const underlying = market.underlying.toLowerCase() - if (blacklistedTokens.includes(underlying)) return; - let getCash = v2Locked.output.find((result) => result.input.target === market.cToken); - if (checkForLPTokens !== undefined && checkForLPTokens(symbols.output[idx].output)) { - lpPositions.push({ - token: underlying, - balance: getCash.output - }) - } else { - sdk.util.sumSingleBalance(balances, transformAdress(underlying), getCash.output) - } - }); - - if (comptroller == "0x92DcecEaF4c0fDA373899FEea00032E8E8Da58Da") { - await unwrapPuffTokens(balances, lpPositions, block) - } else if (lpPositions.length > 0) { - await unwrapUniswapLPs(balances, lpPositions, block, chain, transformAdress) - } - - if (resolveLPs) await unwrapLPsAuto({ balances, block, chain, abis}) - - return transformBalances(chain, balances); - } -} - -const BigNumber = require('bignumber.js').default; -const { toUSDTBalances } = require('./balances'); - -// ask comptroller for oracle -async function getOracle(block, chain, comptroller, oracleAbi) { - const { output: oracle } = await sdk.api.abi.call({ - target: comptroller, - abi: oracleAbi, - block, - chain: chain, - }); - return oracle; -} - -async function getUnderlyingDecimalsMultiple(block, chain, marketData, cether) { - marketData = marketData.filter(i => i.underlying) - const response = {} - const calls = marketData.map(i => ({ target: i.underlying })) - const { output: decimals } = await sdk.api.abi.multiCall({ - calls, - abi: "erc20:decimals", - block, - chain, - permitFailure: true, - }) - - decimals.forEach(({ output }, i) => { - if (output !== null) - response[marketData[i].cToken] = output - }) - - return response -} - -async function getCashMultiple(block, chain, tokens, borrowed) { - const calls = tokens.map(t => ({ target: t })) - const { output: cash } = await sdk.api.abi.multiCall({ - calls, - abi: borrowed ? abi.totalBorrows : abi['getCash'], - block, - chain, - }); - const response = {} - cash.forEach(({ input, output }) => response[input.target] = output) - return response; -} + let markets = await getMarkets(comptroller, api, cether, cetheEquivalent, blacklistedTokens, abis) + const cTokens = markets.map(market => market.cToken) + const tokens = markets.map(market => market.underlying) + if (!borrowed) + return sumTokens2({ api, tokensAndOwners2: [tokens, cTokens], blacklistedTokens, resolveLP: true, }) -async function getUnderlyingPriceMultiple(block, chain, oracle, tokens, methodAbi) { - const calls = tokens.map(t => ({ params: [t] })) - const { output: underlyingPrice } = await sdk.api.abi.multiCall({ - target: oracle, - abi: methodAbi, - block, - chain, - calls, - }); - const response = {} - underlyingPrice.forEach(({ input, output }) => response[input.params[0]] = output) - return response; -} + let v2Locked = await api.multiCall({ calls: cTokens, abi: borrowed ? abis.totalBorrows : abis.getCash, }) + api.add(tokens, v2Locked) + blacklistedTokens.forEach(token => api.removeTokenBalance(token)) -function getCompoundUsdTvl(comptroller, chain, cether, borrowed, abis = { - oracle: abi['oracle'], - underlyingPrice: abi['getUnderlyingPrice'], - getAllMarkets: abi['getAllMarkets'] -}, { - blacklist = [], - cetheEquivalent = undefined, -} = {}) { - return async (timestamp, ethBlock, { [chain]: block }) => { - let tvl = new BigNumber('0'); - blacklist = blacklist.map(i => i.toLowerCase()) - const marketData = await getMarkets(comptroller, block, chain, cether, cetheEquivalent, blacklist, abis) - let allMarkets = marketData.map(i => i.cToken); - // allMarkets = allMarkets.filter(token => !blacklist.includes(token.toLowerCase())) // taken care of by getMarkets - let oracle = await getOracle(block, chain, comptroller, abis.oracle); - const amounts = await getCashMultiple(block, chain, allMarkets, borrowed) - const decimalsAll = await getUnderlyingDecimalsMultiple(block, chain, marketData, cether) - const underlyingPrices = await getUnderlyingPriceMultiple(block, chain, oracle, allMarkets, abis.underlyingPrice) - - allMarkets.forEach(token => { - let amount = new BigNumber(amounts[token]); - let decimals = decimalsAll[token] ?? 0; - let locked = amount.div(10 ** decimals); - let underlyingPrice = new BigNumber(underlyingPrices[token]).div(10 ** (18 + 18 - decimals)) - tvl = tvl.plus(locked.times(underlyingPrice)); - }) - return toUSDTBalances(tvl.toNumber()); + return sumTokens2({ api, resolveLP: true, }); } } -function compoundExports(comptroller, chain, cether, cetheEquivalent, transformAdressRaw, checkForLPTokens, { blacklistedTokens = [], fetchBalances, abis = {}, resolveLPs=true } = {}) { - if (cether !== undefined && cetheEquivalent === undefined) { - throw new Error("You need to define the underlying for native cAsset") - } - return { - tvl: getCompoundV2Tvl(comptroller, chain, transformAdressRaw, cether, cetheEquivalent, false, checkForLPTokens, { blacklistedTokens, fetchBalances, abis, resolveLPs }), - borrowed: getCompoundV2Tvl(comptroller, chain, transformAdressRaw, cether, cetheEquivalent, true, checkForLPTokens, { blacklistedTokens, fetchBalances, abis, resolveLPs }) - } -} - -function compoundExportsWithAsyncTransform(comptroller, chain, cether, cetheEquivalent, options) { - return { - tvl: async (...args) => { - const transformAddress = await getChainTransform(chain) - return getCompoundV2Tvl(comptroller, chain, transformAddress, cether, cetheEquivalent, false, undefined, options)(...args) - }, - borrowed: async (...args) => { - const transformAddress = await getChainTransform(chain) - return getCompoundV2Tvl(comptroller, chain, transformAddress, cether, cetheEquivalent, true, undefined, options)(...args) - }, - } -} - -function fullCoumpoundExports(comptroller, chain, cether, cetheEquivalent, transformAdress) { - return { - [chain]: compoundExports(comptroller, chain, cether, cetheEquivalent, transformAdress) - } -} - -function usdCompoundExports(comptroller, chain, cether, abis, options = {}) { - return { - tvl: getCompoundUsdTvl(comptroller, chain, cether, false, abis, options,), - borrowed: getCompoundUsdTvl(comptroller, chain, cether, true, abis, options,) - } -} - -function compoundExportsWithDifferentBase(comptroller, chain, token) { - const raw = usdCompoundExports(comptroller, chain) - async function tvl(...params) { - const tvl = await raw.tvl(...params) - return { - [token]: Number(tvl[usdtAddress]) / 1e6 - } - } - - async function borrowed(...params) { - const tvl = await raw.borrowed(...params) - return { - [token]: Number(tvl[usdtAddress]) / 1e6 - } - } +function compoundExports(comptroller, cether, cetheEquivalent = nullAddress, { blacklistedTokens = [], abis = {}, } = {}) { return { - tvl, - borrowed + tvl: _getCompoundV2Tvl(comptroller, cether, cetheEquivalent, false, { blacklistedTokens, abis, }), + borrowed: _getCompoundV2Tvl(comptroller, cether, cetheEquivalent, true, { blacklistedTokens, abis, }) } } -function compoundExports2({ comptroller, chain, cether, cetheEquivalent = nullAddress, transformAdressRaw, checkForLPTokens, blacklistedTokens = [], fetchBalances = true, abis = {} }) { - return compoundExports(comptroller, chain, cether, cetheEquivalent, transformAdressRaw, checkForLPTokens, { blacklistedTokens, fetchBalances, abis, }) +function compoundExports2({ comptroller, cether, cetheEquivalent = nullAddress, blacklistedTokens = [], abis = {}, }) { + return compoundExports(comptroller, cether, cetheEquivalent, { blacklistedTokens, abis, }) } module.exports = { methodology: methodologies.lendingMarket, - getCompoundV2Tvl, compoundExports, compoundExports2, - getCompoundUsdTvl, - compoundExportsWithAsyncTransform, - fullCoumpoundExports, - usdCompoundExports, - compoundExportsWithDifferentBase }; diff --git a/projects/helper/coreAssets.json b/projects/helper/coreAssets.json index d4971e537c..caf3334767 100644 --- a/projects/helper/coreAssets.json +++ b/projects/helper/coreAssets.json @@ -4,6 +4,7 @@ "WETH": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", "WSTETH": "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", "STETH": "0xae7ab96520de3a18e5e111b5eaab095312d7fe84", + "WEETH": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", "sfrxETH": "0xac3e018457b222d93114458476f3e3416abbe38f", "USDC": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", "LINK": "0x514910771af9ca656af840dff83e8264ecf986ca", @@ -43,6 +44,7 @@ "sUSD_OLD": "0x57ab1e02fee23774580c119740129eac7081e9d3", "sUSD": "0x57Ab1ec28D129707052df4dF418D58a2D46d5f51", "sUSDe": "0x9D39A5DE30e57443BfF2A8307A4256c8797A3497", + "sUSDS": "0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD", "SUSHI": "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2", "cbETH": "0xBe9895146f7AF43049ca1c1AE358B0541Ea49704", "FDUSD": "0xc5f0f7b66764f6ec8c8dff7ba683102295e16409", @@ -167,7 +169,8 @@ "ETHIX": "0xec3f3e6d7907acda3a7431abd230196cda3fbb19", "SDAI": "0xaf204776c7245bF4147c2612BF6e5972Ee483701", "XHOPR": "0xD4fdec44DB9D44B8f2b6d529620f9C0C7066A2c1", - "DAI_1": "0x678df3415fc31947da4324ec63212874be5a82f8" + "DAI_1": "0x678df3415fc31947da4324ec63212874be5a82f8", + "sDAI": "0xaf204776c7245bf4147c2612bf6e5972ee483701" }, "okexchain": { "USDC": "0xc946daf81b08146b1c7a8da2a851ddf2b3eaaf85", @@ -220,7 +223,9 @@ "USDC": "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", "USDC_CIRCLE": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", "DAI": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", - "WBTC": "0x68f180fcCe6836688e9084f035309E29Bf0A2095" + "WBTC": "0x68f180fcCe6836688e9084f035309E29Bf0A2095", + "weETH": "0x5a7facb970d094b6c7ff1df0ea68d99e6e73cbff", + "ezETH": "0x2416092f143378750bb29b79ed961ab195cceea5" }, "moonriver": { "WMOVR": "0xe3c7487eb01c74b73b7184d198c7fbf46b34e5af", @@ -275,7 +280,8 @@ "WSTETH": "0x5979D7b546E38E414F7E9822514be443A4800529", "plvGLP": "0x5326e71ff593ecc2cf7acae5fe57582d6e74cff1", "USDe": "0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34", - "FRAX": "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F" + "FRAX": "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F", + "sUSDe": "0x211cc4dd073734da055fbf44a2b4667d5e5fe5d2" }, "fuse": { "WFUSE": "0x0be9e53fd7edac9f859882afdda116645287c629", @@ -436,6 +442,7 @@ }, "klaytn": { "WKLAY": "0x57d1a61e4fd09fbf16e35b04959e94dcf2032974", + "WKLAY_1": "0x19aac5f612f524b754ca7e7c41cbfa2e981a4432", "BORA": "0x02cbe46fb8a1f579254a9b485788f2d86cad51aa", "DAI": "0xcb2c7998696ef7a582dfd0aafadcd008d03e791a", "USDC": "0x608792deb376cce1c9fa4d0e6b7b44f507cffa6a", @@ -464,7 +471,8 @@ "aDAI": "0x2ff5371dad5c6ef76d55213b7c5a519f6654ba17", "aDAI_Wormhole_": "0xe9a88c33abf71c902f7581321d05e6516cbca761", "USDK": "0xd2137fdf10bd9e4e850c17539eb24cfe28777753", - "NPT": "0xe06597d02a2c3aa7a9708de2cfa587b128bd3815" + "NPT": "0xe06597d02a2c3aa7a9708de2cfa587b128bd3815", + "stKaia": "0x42952B873ed6f7f0A7E4992E2a9818E3A9001995" }, "nova": { "NUSD": "0x1f5396f254ee25377a5c1b9c6bff5f44e9294fff" @@ -487,6 +495,7 @@ }, "cronos": { "WCRO": "0xca2503482e5d6d762b524978f400f03e38d5f962", + "WCRO_1": "0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23", "USDC": "0xc21223249ca28397b4b6541dffaecc539bff0c59", "WBTC": "0x062e66477faf219f25d27dced647bf57c3107d52", "SVN": "0x654bac3ec77d6db497892478f854cf6e8245dca9", @@ -802,7 +811,10 @@ "CELER_DAI": "0x8d87a65ba30e09357fa2edea2c80dbac296e5dec2b18287113500b902942929d::celer_coin_manager::DaiCoin", "CELER_ETH": "0x8d87a65ba30e09357fa2edea2c80dbac296e5dec2b18287113500b902942929d::celer_coin_manager::WethCoin", "CELER_WBTC": "0x8d87a65ba30e09357fa2edea2c80dbac296e5dec2b18287113500b902942929d::celer_coin_manager::WbtcCoin", - "amAPT": "0x111ae3e5bc816a5e63c2da97d0aa3886519e0cd5e4b046659fa35796bd11542a::amapt_token::AmnisApt" + "amAPT": "0x111ae3e5bc816a5e63c2da97d0aa3886519e0cd5e4b046659fa35796bd11542a::amapt_token::AmnisApt", + "zWBTC": "0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::WBTC", + "zWETH": "0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::WETH", + "USDt": "0x357b0b74bc833e95a115ad22604854d6b0fca151cecd94111770e5d6ffc9dc2b" }, "dogechain": { "WWDOGE": "0xb7ddc6414bf4f5515b52d8bdd69973ae205ff101", @@ -1033,6 +1045,15 @@ "ETH": "0x7c598c96d02398d89fbcb9d41eab3df0c16f227d", "USDT": "0x922d641a426dcffaef11680e5358f34d97d112e1" }, + "rollux": { + "WSYS": "0x4200000000000000000000000000000000000006", + "USDC": "0x368433cac2a0b8d76e64681a9835502a1f2a8a30", + "WETH": "0xaa1c53afd099e415208f47fcfa2c880f659e6904", + "USDT": "0x28c9c7fb3fe3104d2116af26cc8ef7905547349c", + "WBTC": "0x2a4dc2e946b92ab4a1f7d62844eb237788f9056c", + "ETH": "0xaa1c53afd099e415208f47fcfa2c880f659e6904", + "BTC": "0x2a4dc2e946b92ab4a1f7d62844eb237788f9056c" + }, "vision": { "USDT": "0x1db6cdc620388a0b6046b20cd59503a0839adcff", "VBTC": "0x4dE4B92C12dD4584873e72447573382C41da5597", @@ -1088,7 +1109,8 @@ "TT_USDT": "0x4f3c8e20942461e2c3bdd8311ac57b0c222f2b82", "TT_ETH": "0x6576bb918709906dcbfdceae4bb1e6df7c8a1077", "TT_USDC": "0x22e89898a04eaf43379beb70bf4e38b1faf8a31e", - "TT_BUSD": "0xbeb0131d95ac3f03fd15894d0ade5dbf7451d171" + "TT_BUSD": "0xbeb0131d95ac3f03fd15894d0ade5dbf7451d171", + "veTT": "0xc3c857a9e5be042c8acf4f2827aa053e93b5d039" }, "conflux": { "WCFX": "0x14b2d3bc65e74dae1030eafd8ac30c533c976a9b", @@ -1281,7 +1303,10 @@ "UNO": "0x0719b5092403233201aa822ce928bd4b551d0cdb071a724edd7dc5e5f57b7f34", "NSTSTRK": "0x04619e9ce4109590219c5263787050726be63382148538f3f936c22aa87d2fc2", "ZEND": "0x00585c32b625999e6e5e78645ff8df7a9001cf5cf3eb6b80ccdd16cb64bd3a34", - "NSTR": "0x00c530f2c0aa4c16a0806365b0898499fba372e5df7a7172dc6fe9ba777e8007" + "NSTR": "0x00c530f2c0aa4c16a0806365b0898499fba372e5df7a7172dc6fe9ba777e8007", + "BROTHER": "0x03b405a98c9e795d427fe82cdeeeed803f221b52471e3a757574a2b4180793ee", + "XSTRK": "0x028d709c875c0ceac3dce7065bec5328186dc89fe254527084d1689910954b0a", + "SSTRK": "0x0356f304b154d29d2a8fe22f1cb9107a9b564a733cf6b4cc47fd121ac1af90c9" }, "ton": { "TON": "0x0000000000000000000000000000000000000000", @@ -1399,7 +1424,10 @@ "USDC_ARB": "0xe32d3ebafa42e6011b87ef1087bbc6053b499bf6f095807b9013aff5a6ecd7bb::coin::COIN", "USDC_BNB": "0x909cba62ce96d54de25bec9502de5ca7b4f28901747bbf96b76c2e63ec5f1cba::coin::COIN", "BUCK": "0xce7ff77a83ea0cb6fd39bd8748e2ec89a3f41e8efdc3f4eb123e0ca37b184db2::buck::BUCK", - "SUI": "0x2::sui::SUI" + "SUI": "0x2::sui::SUI", + "USDC_CIRCLE": "0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC", + "ETH": "0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH", + "suiUSDT": "0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT" }, "grove": { "WGRV": "0xE85f139488c689038028a3EB8fC38dcC29D4C340" @@ -1463,7 +1491,13 @@ "WMNT": "0x78c1b0c915c4faa5fffa6cabf0219da63d7f4cb8", "WETH": "0xdeaddeaddeaddeaddeaddeaddeaddeaddead1111", "USDT": "0x201eba5cc46d216ce6dc03f6a759e8e766e956ae", - "USDC": "0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9" + "USDC": "0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9", + "cmETH": "0xE6829d9a7eE3040e1276Fa75293Bde931859e8fA", + "mETH": "0xcDA86A272531e8640cD7F1a92c01839911B90bb0", + "FBTC": "0xC96dE26018A54D51c097160568752c4E3BD6C364", + "AUSD": "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a", + "USDe": "0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34", + "sUSDe": "0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2" }, "linea": { "WETH": "0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f", @@ -1477,7 +1511,9 @@ "USDbC": "0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA", "USDC": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "DAI": "0x50c5725949a6f0c72e6c4a641f24049a917db0cb", - "USDT": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2" + "USDT": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", + "rETH": "0xb6fe221fe9eef5aba221c348ba20a1bf5e73624c", + "wstETH": "0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452" }, "sei": { "SEI": "usei", @@ -1494,7 +1530,9 @@ }, "op_bnb": { "WBNB": "0x4200000000000000000000000000000000000006", - "USDT": "0x9e5aac1ba1a2e6aed6b32689dfcf62a509ca96f3" + "USDT": "0x9e5aac1ba1a2e6aed6b32689dfcf62a509ca96f3", + "ETH": "0xe7798f023fc62146e8aa1b36da45fb70855a77ea", + "FDUSD": "0x50c5725949a6f0c72e6c4a641f24049a917db0cb" }, "archway": { "ARCH": "aarch" @@ -1525,7 +1563,9 @@ "USDT": "secret18wpjn83dayu4meu6wnn29khfkwdxs7kyrz9c8f" }, "aura": { - "AURA": "uaura" + "AURA": "uaura", + "WAURA": "0xDE47A655a5d9904BD3F7e1A536D8323fBD99993A", + "USDT": "0x80b5a32e4f032b2a058b4f29ec95eefeeb87adcd" }, "shibarium": { "WETH": "0x8ed7d143ef452316ab1123d28ab302dc3b80d3ce", @@ -1583,7 +1623,8 @@ "WBTC": "0x7b8FAC5F29E101BaaB33c5f9c39d4F85ba2cc7C1", "BTCB": "0xd267F821F1b8344B5A63626c8c824697194A173E", "BitcoinUSD": "0x6906Ccda405926FC3f04240187dd4fAd5DF6d555", - "BtcUSD": "0x6906Ccda405926FC3f04240187dd4fAd5DF6d555" + "BtcUSD": "0x6906Ccda405926FC3f04240187dd4fAd5DF6d555", + "cbBTC": "0x74B73Fd2eE237e9219dF30dfFDB206D237cbFC00" }, "scroll": { "WETH": "0x5300000000000000000000000000000000000004", @@ -1625,7 +1666,10 @@ }, "zilliqa": { "WZIL": "0x94e18ae7dd5ee57b55f30c4b63e2760c09efb192", - "USDT": "0x2274005778063684fbb1bfa96a2b725dc37d75f9" + "USDT": "0x2274005778063684fbb1bfa96a2b725dc37d75f9", + "stZIL": "0x097c26f8a93009fd9d98561384b5014d64ae17c2", + "gZIL": "0x03a79429acc808e4261a68b0117acd43cb0fdbfa", + "XCAD": "0xccf3ea256d42aeef0ee0e39bfc94baa9fa14b0ba" }, "fsc": { "WFSC": "0xb582fD9d0D5C3515EEB6b02fF2d6eE0b6E45E7A7" @@ -1719,7 +1763,10 @@ "WBTC_1": "0xB880fd278198bd590252621d4CD071b1842E9Bcd" }, "ftn": { - "USDC": "0x4237e0A5b55233D5B6D6d1D9BF421723954130D8" + "USDC": "0x4237e0A5b55233D5B6D6d1D9BF421723954130D8", + "stFTN": "0x780fb5aca83f2e3f57ee18cc3094988ef49d8c3d", + "mUSDC": "0x4b7708ee3ccbd3f9af68208e69ad31f611e1befe", + "mUSDT": "0xb7dc5eca6de5cb9b46ac405d3d4596333714f3f7" }, "q": { "WBTC": "0xde397e6C442A3E697367DecBF0d50733dc916b79", @@ -1766,7 +1813,8 @@ "ETH": "0xeceeefcee421d8062ef8d6b4d814efe4dc898265", "WBTC": "0x5fd55a1b9fc24967c4db09c513c3ba0dfa7ff687", "USDT": "0xd567b3d7b8fe3c79a1ad8da978812cfc4fa05e75", - "AXLUSDC": "0x80b5a32e4f032b2a058b4f29ec95eefeeb87adcd" + "AXLUSDC": "0x80b5a32e4f032b2a058b4f29ec95eefeeb87adcd", + "USDC": "0x0ce35b0d42608ca54eb7bcc8044f7087c18e7717" }, "xlayer": { "WOKB": "0xe538905cf8410324e03a5a23c1c177a474d59b2b", @@ -1807,7 +1855,11 @@ "USDC_1": "0x75E20C5d4aade76143b8b74d1C5E2865347f9d3B" }, "lac": { - "LAC": "0x2911a1ab18546cb501628be8625c7503a2a7db54" + "LAC": "0x2911a1ab18546cb501628be8625c7503a2a7db54", + "WETH": "0x42c8c9c0f0a98720dacdaeac0c319cb272b00d7e", + "WBTC": "0xf54b8cb8eeee3823a55dddf5540ceaddf9724626", + "USDT": "0x7dc8b9e3b083c26c68f0b124ca923aaec7fbee39", + "USDC": "0x51115241c7b8361eee88d8610f71d0a92cee5323" }, "bob": { "WETH": "0x4200000000000000000000000000000000000006", @@ -1817,7 +1869,13 @@ "STETH": "0x85008aE6198BC91aC0735CB5497CF125ddAAc528", "STONE": "0x96147a9ae9a42d7da551fd2322ca15b71032f342", "RETH": "0xb5686c4f60904ec2bda6277d6fe1f7caa8d1b41a", - "TBTC": "0xbba2ef945d523c4e2608c9e1214c2cc64d4fc2e2" + "TBTC": "0xbba2ef945d523c4e2608c9e1214c2cc64d4fc2e2", + "SolvBTC": "0x541fd749419ca806a8bc7da8ac23d346f2df8b77", + "SolvBTC_BBN": "0xCC0966D8418d412c599A6421b760a847eB169A8c", + "FBTC": "0xc96de26018a54d51c097160568752c4e3bd6c364", + "satUSD": "0x78Fea795cBFcC5fFD6Fb5B845a4f53d25C283bDB", + "uniBTC": "0x236f8c0a61dA474dB21B693fB2ea7AAB0c803894", + "pumpBTC": "0x1fcca65fb6ae3b2758b9b2b394cb227eae404e1e" }, "btr": { "ETH": "0xef63d4e178b3180beec9b0e143e0f37f4c93f4c2", @@ -1827,11 +1885,15 @@ "USDC": "0x07d83526730c7438048D55A4fc0b850e2aaB6f0b", "USDT": "0x2def195713cf4a606b49d07e520e22c17899a736", "USDC_e": "0x19e26b0638bf63aa9fa4d14c6baf8d52ebe86c5c", + "DAI": "0x7d02A3E0180451B17e5D7f29eF78d06F8117106C", + "TAIKO": "0xA9d23408b9bA935c230493c40C73824Df71A0975", + "LRC": "0xd347949f8c85d9f3d6b06bfc4f8c2e07c161f064", "WETH": "0xA51894664A773981C6C112C43ce576f315d5b1B6" }, "stellar": { "XLM": "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA", - "USDC": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" + "USDC": "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75", + "EURC": "CDTKPWPLOURQA2SGTKTUQOWRCBZEORB4BWBOMJ3D3ZTQQSGE5F6JBQLV" }, "lukso": { "WLYX": "0x2db41674f2b882889e5e1bd09a3f3613952bc472" @@ -1866,21 +1928,26 @@ }, "etlk": { "OGV1WXTZ": "0x3571aed54ccea5b69b00516d5a149a6baea77118", - "WXTZ": "0xc9B53AB2679f573e480d01e0f49e2B5CFB7a3EAb" + "WXTZ": "0xc9B53AB2679f573e480d01e0f49e2B5CFB7a3EAb", + "USDC": "0x796ea11fa2dd751ed01b53c372ffdb4aaa8f00f9", + "USDT": "0x2c03058c8afc06713be23e58d2febc8337dbfe6a", + "WETH": "0xfc24f770f94edbca6d6f885e12d4317320bcb401" }, "rari": { "WETH": "0xf037540e51d71b2d2b1120e8432ba49f29edfbd0", - "USDC.e": "0xfbda5f676cb37624f28265a144a48b0d6e87d3b6" + "USDC_e": "0xfbda5f676cb37624f28265a144a48b0d6e87d3b6" }, "real": { - "RWA": "0x4644066f535ead0cde82d209df78d94572fcbf14" + "RWA": "0x4644066f535ead0cde82d209df78d94572fcbf14", + "USDC": "0xc518A88c67CECA8B3f24c4562CB71deeB2AF86B7" }, "saakuru": { "WOAS": "0x557a526472372f1F222EcC6af8818C1e6e78A85f", - "USDC.e": "0x739222D8A9179fE05129C77a8fa354049c088CaA" + "USDC_e": "0x739222D8A9179fE05129C77a8fa354049c088CaA" }, "bouncebit": { - "wstBBTC": "0x8f083eafcbba2e126ad9757639c3a1e25a061a08" + "wstBBTC": "0x8f083eafcbba2e126ad9757639c3a1e25a061a08", + "BBUSD": "0x77776b40C3d75cb07ce54dEA4b2Fd1D07F865222" }, "reya": { "WETH": "0x6b48c2e6a32077ec17e8ba0d98ffc676dfab1a30", @@ -1892,9 +1959,168 @@ }, "noble": { "USDC": "uusdc", - "USDY": "ausdy" + "USDY": "ausdy", + "ausdy": "ausdy" }, "ripple": { "XRP": "XRP" + }, + "polynomial": { + "USDC": "0x17C9D8Cef7Ef072844EEaEdE1F9f54C7E3fa8743", + "fxUSDC": "0x2369eb4a76d80fbeaa7aa73e1e1f9eaee88c07f4", + "SDAI": "0x615172e47c0C5A6dA8ea959632Ac0166f7a59eDc", + "sUSDe": "0x2A06DEAc3E863c23DD6a89Eeacd80aBA9E08B77B", + "USD0": "0x6224dC817dC4D5c53fcF3eb08A4f84C456F9f38f" + }, + "cronos_zkevm": { + "wzkCRO": "0xc1bf55ee54e16229d9b369a5502bfe5fc9f20b6d", + "ETH": "0x898b3560affd6d955b1574d87ee09e46669c60ea", + "USDC": "0xaa5b845f8c9c047779bedf64829601d8b264076c" + }, + "neox": { + "WGAS": "0x008cd7f573998cb841a5d82a857ed1f0ce03a653", + "WGAS_1": "0xde41591ed1f8ed1484ac2cd8ca0876428de60eff" + }, + "gravity": { + "wG": "0xbb859e225ac8fb6be1c7e38d87b767e95fef0ebd", + "WETH": "0xf6f832466Cd6C21967E0D954109403f36Bc8ceaA", + "USDC_e": "0xfbda5f676cb37624f28265a144a48b0d6e87d3b6" + }, + "idex": { + "0xfbda5f676cb37624f28265a144a48b0d6e87d3b6": "0xfbda5f676cb37624f28265a144a48b0d6e87d3b6" + }, + "etn": { + "WETN": "0x138dafbda0ccb3d8e39c19edb0510fc31b7c1c77" + }, + "bitkub": { + "KKUB": "0x67ebd850304c70d983b2d1b93ea79c7cd6c3f6b5" + }, + "shape": { + "WETH": "0x4200000000000000000000000000000000000006", + "WETH_1": "0x48A9B22b80F566E88f0f1DcC90Ea15A8A3bAE8a4" + }, + "hela": { + "hUSDC": "0xf5b85320a772b436cb8105441a3db9ba29437b4a", + "hUSDT": "0xd3442073fa7ccf8a7c39d95dc125cd59497aa078", + "WHLUSD": "0x3a035615e101373fa9ba21c5bea7fe4026fc40b4" + }, + "lisk": { + "USDT": "0x05d032ac25d322df992303dca074ee7392c117b9", + "WETH": "0x4200000000000000000000000000000000000006", + "LSK": "0xac485391eb2d7d88253a7f1ef18c37f4242d1a24" + }, + "flow": { + "WFLOW": "0xd3bF53DAC106A0290B0483EcBC89d40FcC961f3e", + "ankrFLOWEVM": "0x1b97100eA1D7126C4d60027e231EA4CB25314bdb", + "USDC_e": "0x7f27352d5f83db87a5a3e00f4b07cc2138d8ee52" + }, + "matchain": { + "WBNB": "0x4200000000000000000000000000000000000006" + }, + "fuel": { + "USDC": "0x286c479da40dc953bddc3bb4c453b608bba2e0ac483b077bd475174115395e6b", + "ETH": "0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07", + "USDT": "0xa0265fb5c32f6e8db3197af3c7eb05c48ae373605b8165b6f4a51c5b0ba4812e", + "sDAI": "0x9e46f919fbf978f3cad7cd34cca982d5613af63ff8aab6c379e4faa179552958", + "mBTC": "0xaf3111a248ff7a3238cdeea845bb2d43cf3835f1f6b8c9d28360728b55b9ce5b", + "METH": "0xafd219f513317b1750783c6581f55530d6cf189a5863fd18bd1b3ffcec1714b4", + "RZETH": "0x91b3559edb2619cde8ffb2aa7b3c3be97efd794ea46700db7092abeee62281b0" + }, + "wc": { + "USDC_e": "0x79A02482A880bCE3F13e09Da970dC34db4CD24d1", + "WLD": "0x2cFc85d8E48F8EAB294be644d9E25C3030863003", + "WBTC": "0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", + "WETH": "0x4200000000000000000000000000000000000006" + }, + "apechain": { + "WAPE": "0x48b62137EdfA95a428D35C09E44256a739F6B557", + "sDAI": "0xA2235d059F80e176D931Ef76b6C51953Eb3fBEf4", + "ApeETH": "0xcF800F4948D16F23333508191B1B1591daF70438" + }, + "zircuit": { + "WETH": "0x4200000000000000000000000000000000000006" + }, + "hedera": { + "XSAUCE": "0x00000000000000000000000000000000001647e8", + "USDC": "0x000000000000000000000000000000000006f89a", + "KARATE": "0x000000000000000000000000000000000022d6de", + "HBARX": "0x00000000000000000000000000000000000cba44", + "SAUCE": "0x00000000000000000000000000000000000b2ad5", + "WHBAR": "0x0000000000000000000000000000000000163b5a", + "DOVU": "0x000000000000000000000000000000000038b3db", + "HLQT": "0x00000000000000000000000000000000005c9f70", + "HST": "0x00000000000000000000000000000000000ec585", + "PACK": "0x0000000000000000000000000000000000492a28", + "STEAM": "0x000000000000000000000000000000000030fb8b" + }, + "morph": { + "WETH": "0x5300000000000000000000000000000000000011", + "USDT": "0xc7d67a9cbb121b3b0b9c053dd9f469523243379a", + "WBTC": "0x803dce4d3f4ae2e17af6c51343040dee320c149d" + }, + "eclipse": { + "ETH": "So11111111111111111111111111111111111111112", + "ETH_1": "9pan9bMn5HatX4EJdBwg9VgCa7Uz5HL8N1m5D3NdXejP", + "SOL": "BeRUj3h7BqkbdfFU7FBNYbodgf8GCHodzKvF9aVjNNfL", + "USDC": "AKEWE7Bgh87GPp171b4cJPSSZfmZwQ3KaqYqXoKLNAEE", + "WIF": "841P4tebEgNux2jaWSjCoi9LhrVr9eHGjLc758Va3RPH" + }, + "unit0": { + "UNIT": "0xcf43f7703d9b4e8835f977ef364b4014fa7e856e" + }, + "rbn": { + "WRBNT": "0x6ed1f491e2d31536d6561f6bdb2adc8f092a6076" + }, + "shido": { + "WSHIDO": "0x8cbaffd9b658997e7bf87e98febf6ea6917166f7", + "USDC": "0x80b5a32e4f032b2a058b4f29ec95eefeeb87adcd" + }, + "ace": { + "USDC_e": "0x71ee6485cf72b9c3bf183528a2241474f21b2efa" + }, + "tara": { + "WTARA": "0x5d0fa4c5668e5809c83c95a7cef3a9dd7c68d4fe", + "USDM": "0xc26b690773828999c2612549cc815d1f252ea15e" + }, + "corn": { + "BTCN": "0xda5ddd7270381a7c2717ad10d1c0ecb19e3cdfb2" + }, + "sonic": { + "wS": "0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38", + "WS_1": "0x832497895f05100e53f42dfa8fc758b4866b183a", + "USDC.e": "0x29219dd400f2Bf60E5a23d13Be72B486D4038894", + "WETH": "0x309C92261178fA0CF748A855e90Ae73FDb79EBc7", + "STS": "0xe5da20f15420ad15de0fa650600afc998bbe3955" + }, + "vinu": { + "USDT": "0xC0264277fcCa5FCfabd41a8bC01c1FcAF8383E41", + "ETH": "0xDd4b9b3Ce03faAbA4a3839c8B5023b7792be6e2C", + "VINU": "0x00c1E515EA9579856304198EFb15f525A0bb50f6", + "WVC": "0xEd8c5530a0A086a12f57275728128a60DFf04230" + }, + "sophon": { + "ETH": "0x72af9f169b619d85a47dfa8fefbcd39de55c567d", + "USDT": "0x6386da73545ae4e2b2e0393688fa8b65bb9a7169", + "USDC": "0x9aa0f72392b5784ad86c6f3e899bcc053d00db4f", + "WSTETH": "0x60d02f185f80644e1a5ae35497736dd31d1b078b", + "WEETH": "0x5e9fc50b44988b66ba84500f8bc32c0493fe8f8d", + "DAI": "0x88171a5bbacd92ca5e25575c5904581c80b025dd", + "SDAI": "0xeccbb9360d235548473cb8c752735f68e652439b" + }, + "ink": { + "WETH": "0x4200000000000000000000000000000000000006" + }, + "duckchain": { + "WTON": "0x7F9308E8d724e724EC31395f3af52e0593BB2e3f" + }, + "qom": { + "WQOM": "0xa26dfBF98Dd1A32FAe56A3D2B2D60A8a41b0bDF0" + }, + "vana": { + "WVANA": "0x00eddd9621fb08436d0331c149d1690909a5906d", + "USDC.e": "0xf1815bd50389c46847f0bda824ec8da914045d14" + }, + "crossfi": { + "WXFI" : "0xC537D12bd626B135B251cCa43283EFF69eC109c4" } } \ No newline at end of file diff --git a/projects/helper/env.js b/projects/helper/env.js index 0779759b7b..71192fcd5c 100644 --- a/projects/helper/env.js +++ b/projects/helper/env.js @@ -1,18 +1,25 @@ + const BOOL_KEYS = [ 'HISTORICAL', 'LLAMA_DEBUG_MODE', ] const DEFAULTS = { + WATER_MULTICALL_RPC: "0x63cee78B11774535132fd773C5dDe3c4b41CD07f", + EVMOS_MULTICALL_CHUNK_SIZE: "3", // evmos reduced gas limit, this is a workaround to make multicall work STARKNET_RPC: 'https://starknet-mainnet.public.blastapi.io', COVALENT_KEY: 'ckey_72cd3b74b4a048c9bc671f7c5a6', - SOLANA_RPC: 'https://mainnet.helius-rpc.com/?api-key=0109717a-77b4-498a-bc3c-a0b31aa1b3bf', - APTOS_RPC: 'https://aptos-mainnet.pontem.network', + // SOLANA_RPC: 'https://mainnet.helius-rpc.com/?api-key=0109717a-77b4-498a-bc3c-a0b31aa1b3bf', + SOLANA_RPC: "https://api.mainnet-beta.solana.com", + ECLIPSE_RPC: 'https://eclipse.lgns.net', + APTOS_RPC: 'https://fullnode.mainnet.aptoslabs.com', SUI_RPC: 'https://fullnode.mainnet.sui.io/', + SUI_GRAPH_RPC: 'https://sui-mainnet.mystenlabs.com/graphql', MULTIVERSX_RPC: 'https://api.multiversx.com', ANKR_API_KEY: '79258ce7f7ee046decc3b5292a24eb4bf7c910d7e39b691384c7ce0cfb839a01', RENEC_RPC: "https://api-mainnet-beta.renec.foundation:8899/", - CRONOS_ZKEVM_RPC_MULTICALL: '0x9b122BF7a96F24EFB7A2b5765c635909dB3458F7', + RPC_PROXY_URL: "https://rpc-proxy.llama.fi", + FLOW_RPC: "https://mainnet.evm.nodes.onflow.org" } const ENV_KEYS = [ @@ -26,7 +33,9 @@ const ENV_KEYS = [ 'SUMMER_AJNA_ENDPOINT', 'SUMMER_CONFIRMED_VAULTS_ENDPOINT', 'ETHEREUM_TOKENS_ENDPOINT', - 'UNISAT_AUTH' + 'FBTC_ACCESS_TOKEN', + 'UNISAT_AUTH', + 'BLACKSAIL_API_KEY', ] Object.keys(DEFAULTS).forEach(i => { diff --git a/projects/helper/karpatkey.js b/projects/helper/karpatkey.js index d412e0fe79..9484f6ce62 100644 --- a/projects/helper/karpatkey.js +++ b/projects/helper/karpatkey.js @@ -1,29 +1,14 @@ const { sumSingleBalance } = require("@defillama/sdk/build/generalUtil") const { fetchURL } = require("./utils") -const symbolToId = { - "BAL":"balancer", - "DAI":"dai", - "ETH":"ethereum", - "USDC":"usd-coin", - "USDT":"tether", - "WBTC":"bitcoin", - "WETH":"ethereum", - "rETH2":"reth2", - "stETH":"staked-ether", - "sETH2":"seth2", - "rETH": "rocket-pool-eth", - "ankrETH":"ankreth", - "cbETH":"coinbase-wrapped-staked-eth", - "ETHx": "stader-ethx", - "GNO": "gnosis", - wstETH: "wrapped-steth", - WXDAI: "dai", - XDAI: "dai" -} - const MONTH = 30*24*3600e3 +const chainMapping = { + "Gnosis": "xdai", + "Avalanche": "avax", + "Binance": "bsc" +} + async function karpatKeyTvl({timestamp}, daoName, tokenToExclude) { const {data} = await fetchURL("https://aumapi.karpatkey.dev/our_daos_token_details") let date = new Date(timestamp*1e3) @@ -37,8 +22,9 @@ async function karpatKeyTvl({timestamp}, daoName, tokenToExclude) { } const balances = {} monthlyData.forEach(bal=>{ - if(symbolToId[bal.token_symbol] && tokenToExclude !== bal.token_symbol){ - sumSingleBalance(balances, symbolToId[bal.token_symbol], bal.token_balance) + if(tokenToExclude !== bal.token_symbol){ + const chain = chainMapping[bal.blockchain] ?? bal.blockchain.toLowerCase() + sumSingleBalance(balances, chain +':' + bal.token_address, bal.value) } else { console.log(`Skipping ${bal.token_symbol}`) } diff --git a/projects/helper/ohm.js b/projects/helper/ohm.js index 59ed5d2312..79502966df 100644 --- a/projects/helper/ohm.js +++ b/projects/helper/ohm.js @@ -1,26 +1,15 @@ -const { staking, stakingUnknownPricedLP } = require('./staking') -const { sumTokensAndLPsSharedOwners, sumLPWithOnlyOneTokenOtherThanKnown } = require('./unwrapLPs') +const { staking, } = require('./staking') +const { sumTokens2 } = require('./unwrapLPs') -function ohmTvl(treasury, treasuryTokens, chain = 'ethereum', stakingAddress, stakingToken, transformOriginal = undefined, fix, tokenOnCoingecko = true) { - let transform = transformOriginal - const tvl = async (time, ethBlock, chainBlocks) => { - const block = chainBlocks[chain] - const balances = {} - await sumTokensAndLPsSharedOwners(balances, tokenOnCoingecko?treasuryTokens:treasuryTokens.filter(t=>t[1]===false), [treasury], block, chain, transform || (addr => `${chain}:${addr}`)) - if(!tokenOnCoingecko){ - await Promise.all(treasuryTokens.filter(t=>t[1]===true).map(t=> - sumLPWithOnlyOneTokenOtherThanKnown(balances, t[0], treasury, stakingToken, block, chain, transform) - )) - } - if (fix) fix(balances) - return balances +function ohmTvl(treasury, treasuryTokens, chain = 'ethereum', stakingAddress, stakingToken) { + const tvl = async (api) => { + const tokens = treasuryTokens.map(t => t[0]) + return sumTokens2({ api, tokens, owner: treasury, resolveLP: true, }) } return { [chain]: { tvl, - staking: tokenOnCoingecko? - staking(stakingAddress, stakingToken, chain, transform ? transform(stakingToken) : undefined) - : stakingUnknownPricedLP(stakingAddress, stakingToken, chain, treasuryTokens.find(t=>t[1]===true)[0], transform) + staking: staking(stakingAddress, stakingToken) } } } diff --git a/projects/helper/pool2.js b/projects/helper/pool2.js index bc4a64d177..82589cad5f 100644 --- a/projects/helper/pool2.js +++ b/projects/helper/pool2.js @@ -1,163 +1,26 @@ const { _BASE_TOKEN_, _QUOTE_TOKEN_ } = require('./abis/dodo.json') -const sdk = require('@defillama/sdk') -const { default: BigNumber } = require('bignumber.js') -const { unwrapUniswapLPs, sumTokensAndLPsSharedOwners, sumTokensExport, } = require('./unwrapLPs'); -const { getFixBalancesSync } = require('../helper/portedTokens') -const masterchefAbi = require("./abis/masterchef.json") -const token0Abi = 'address:token0' -const token1Abi = 'address:token1' -const { isLP, getPoolInfo } = require('./masterchef') +const { sumTokensExport, sumTokens2, } = require('./unwrapLPs'); const { sumTokensExport: uSumExport } = require('./unknownTokens') -function pool2(stakingContract, lpToken, chain, transformAddress) { +function pool2(stakingContract, lpToken) { if (!Array.isArray(stakingContract)) stakingContract = [stakingContract] if (!Array.isArray(lpToken)) lpToken = [lpToken] if (arguments.length === 2) return uSumExport({ tokens: lpToken, owners: stakingContract, useDefaultCoreAssets: true }) - return pool2s(stakingContract, lpToken, chain, transformAddress) + return pool2s(stakingContract, lpToken) } -function pool2s(stakingContracts, lpTokens, chain = "ethereum", transformAddress = undefined) { +function pool2s(stakingContracts, lpTokens) { return async (api) => { - chain = api.chain ?? chain - const block = api.block - const balances = {} - let transform = transformAddress - if (transform === undefined) { - transform = addr => `${chain}:${addr}` - } - await sumTokensAndLPsSharedOwners(balances, lpTokens.map(token => [token, true]), stakingContracts, block, chain, transform) - const fixBalances = getFixBalancesSync(chain) - fixBalances(balances) - return balances + return sumTokens2({ api, tokens: lpTokens, owners: stakingContracts, resolveLP: true}) } } -function pool2Exports(stakingContract, lpTokens, chain, transformAddress) { - return pool2s([stakingContract], lpTokens, chain, transformAddress) -} - -function dodoPool2(stakingContract, lpToken, chain = "ethereum", transformAddress = addr => addr) { - return async (_timestamp, _ethBlock, chainBlocks) => { - const balances = {} - const block = chainBlocks[chain] - const [baseToken, quoteToken, totalSupply] = await Promise.all([_BASE_TOKEN_, _QUOTE_TOKEN_, "erc20:totalSupply"].map(abi => sdk.api.abi.call({ - target: lpToken, - chain, - block, - abi - }).then(r => r.output))) - const [baseTokenBalance, quoteTokenBalance, stakedLPBalance] = await Promise.all([ - [baseToken, lpToken], [quoteToken, lpToken], [lpToken, stakingContract] - ].map(token => sdk.api.abi.call({ - target: token[0], - params: [token[1]], - chain, - block, - abi: 'erc20:balanceOf' - }).then(r => r.output))) - sdk.util.sumSingleBalance(balances, baseToken, BigNumber(baseTokenBalance).times(stakedLPBalance).div(totalSupply).toFixed(0)) - sdk.util.sumSingleBalance(balances, quoteToken, BigNumber(quoteTokenBalance).times(stakedLPBalance).div(totalSupply).toFixed(0)) - return balances - } -} - - -async function pool2BalanceFromMasterChef(balances, masterchef, token, block, chain = "ethereum", transformAddress = (addr) => addr, poolInfoAbi = masterchefAbi.poolInfo) { - const poolInfo = await getPoolInfo(masterchef, block, chain, poolInfoAbi) - - let symbols = ( - await sdk.api.abi.multiCall({ - calls: poolInfo.map((p) => ({ - target: p.output.lpToken, - })), - abi: "erc20:symbol", - block, - chain, - }) - ).output; - - let lpTokens = []; - - for (let i = 0; i < symbols.length; i++) { - let symbol = symbols[i]; - if (symbol.output === null) { - continue; - } - if (isLP(symbol.output, symbol.input.target, chain)) { - lpTokens.push(symbol.input.target); - } - } - - let [tokens0, tokens1] = await Promise.all([ - sdk.api.abi.multiCall({ - calls: lpTokens.map((p) => ({ - target: p, - })), - abi: token0Abi, - block, - chain, - }), - sdk.api.abi.multiCall({ - calls: lpTokens.map((p) => ({ - target: p, - })), - abi: token1Abi, - block, - chain, - }), - ]); - - let pool2LPs = []; - - for (let i = 0; i < lpTokens.length; i++) { - if ( - tokens0.output[i].output.toLowerCase() === token.toLowerCase() || - tokens1.output[i].output.toLowerCase() === token.toLowerCase() - ) { - pool2LPs.push(lpTokens[i]); - } - } - - let lpBalances = (await sdk.api.abi.multiCall({ - calls: pool2LPs.map((p) => ({ - target: p, - params: masterchef - })), - abi: "erc20:balanceOf", - block, - chain, - })).output; - - let lpPositions = lpBalances.map((p) => ({ - balance: p.output, - token: p.input.target - })); - - await unwrapUniswapLPs(balances, lpPositions, block, chain, transformAddress); - -} - -function pool2BalanceFromMasterChefExports(masterchef, token, chain = "ethereum", transformAddress = (addr) => addr, poolInfoAbi = masterchefAbi.poolInfo) { - - return async (_timestamp, _ethBlock, chainBlocks) => { - let balances = {}; - - await pool2BalanceFromMasterChef(balances, masterchef, token, chainBlocks[chain], chain, transformAddress, poolInfoAbi); - - return balances; - } -} - -function pool2UniV3({ stakingAddress, chain = 'ethereum' }) { +function pool2UniV3({ stakingAddress, }) { return sumTokensExport({ owner: stakingAddress, resolveUniV3: true }) } module.exports = { pool2, - pool2Exports, - dodoPool2, pool2s, - pool2BalanceFromMasterChef, - pool2BalanceFromMasterChefExports, pool2UniV3, } \ No newline at end of file diff --git a/projects/helper/portedTokens.js b/projects/helper/portedTokens.js index 1db3a4f770..f24b23c6f3 100644 --- a/projects/helper/portedTokens.js +++ b/projects/helper/portedTokens.js @@ -16,6 +16,7 @@ async function transformInjectiveAddress() { addr = addr.replace(/\//g, ':') if (addr.startsWith('peggy0x')) return `ethereum:${addr.replace('peggy', '')}` + if (addr.startsWith('injective:') || addr.startsWith('ethereum:')) return addr return `injective:${addr}`; }; } @@ -112,7 +113,7 @@ async function getChainTransform(chain) { if (chain === 'aura' && addr.startsWith('aura')) return chainStr if (chain === 'massa' && addr.startsWith('AS1')) return chainStr if (chain === 'algorand' && /^\d+$/.test(addr)) return chainStr - if (addr.startsWith('0x') || ['solana', 'kava', 'renec'].includes(chain)) return chainStr + if (addr.startsWith('0x') || ['solana', 'kava', 'renec', 'eclipse'].includes(chain)) return chainStr return addr }; } diff --git a/projects/helper/solana.js b/projects/helper/solana.js index 05f88094cb..fbc591600b 100644 --- a/projects/helper/solana.js +++ b/projects/helper/solana.js @@ -9,7 +9,15 @@ const { sleep, sliceIntoChunks, log, } = require('./utils') const { decodeAccount } = require('./utils/solana/layout') const sdk = require('@defillama/sdk'); -const { TOKEN_PROGRAM_ID, ASSOCIATED_PROGRAM_ID, } = require('@project-serum/anchor/dist/cjs/utils/token'); + +/** Address of the SPL Token program */ +const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA') + +/** Address of the SPL Token 2022 program */ +const TOKEN_2022_PROGRAM_ID = new PublicKey('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb') + +/** Address of the SPL Associated Token Account program */ +const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL') const blacklistedTokens_default = [ 'CowKesoLUaHSbAMaUxJUj7eodHHsaLsS65cy8NFyRDGP', @@ -22,7 +30,8 @@ const blacklistedTokens_default = [ '5fTwKZP2AK39LtFN9Ayppu6hdCVKfMGVm79F2EgHCtsi', //WHEY ] -let connection, provider +let connection = {} +let provider = {} const endpoint = (isClient) => { if (isClient) return getEnv('SOLANA_RPC_CLIENT') ?? getEnv('SOLANA_RPC') @@ -30,34 +39,58 @@ const endpoint = (isClient) => { } const renecEndpoint = () => getEnv('RENEC_RPC') +const eclipseEndpoint = () => getEnv('ECLIPSE_RPC') + const endpointMap = { solana: endpoint, renec: renecEndpoint, + eclipse: eclipseEndpoint, } function getConnection(chain = 'solana') { - if (!connection) connection = new Connection(endpointMap[chain](true)) - return connection + if (!connection[chain]) connection[chain] = new Connection(endpointMap[chain](true)) + return connection[chain] } function getProvider(chain = 'solana') { - if (!provider) { + if (!provider[chain]) { const dummy_keypair = Keypair.generate(); const wallet = new Wallet(dummy_keypair); - provider = new Provider(getConnection(chain), wallet) + provider[chain] = new Provider(getConnection(chain), wallet) } - return provider; + return provider[chain] } -async function getTokenSupply(token) { - const tokenSupply = await http.post(endpoint(), { - jsonrpc: "2.0", - id: 1, - method: "getTokenSupply", - params: [token], - }); - return tokenSupply.result.value.uiAmount; + +function getAssociatedTokenAddress(mint, owner,) { + if (typeof mint === 'string') mint = new PublicKey(mint) + if (typeof owner === 'string') owner = new PublicKey(owner) + const [associatedTokenAddress] = PublicKey.findProgramAddressSync([owner.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), mint.toBuffer()], ASSOCIATED_TOKEN_PROGRAM_ID); + return associatedTokenAddress; +} + + +async function getTokenSupplies(tokens, { api } = {}) { + const sleepTime = tokens.length > 2000 ? 2000 : 200 + const connection = getConnection() + tokens = tokens.map(i => typeof i === 'string' ? new PublicKey(i) : i) + const res = await runInChunks(tokens, chunk => connection.getMultipleAccountsInfo(chunk), { sleepTime }) + const response = {} + res.forEach((data, idx) => { + if (!data) { + sdk.log(`Invalid account: ${tokens[idx]}`) + return; + } + try { + data = decodeAccount('mint', data) + response[tokens[idx].toString()] = data.supply.toString() + if (api) api.add(tokens[idx].toString(), data.supply.toString()) + } catch (e) { + sdk.log(`Error decoding account: ${tokens[idx]}`) + } + }) + return response } async function getTokenAccountBalances(tokenAccounts, { individual = false, allowError = false, chain = 'solana' } = {}) { @@ -102,8 +135,9 @@ async function getTokenAccountBalances(tokenAccounts, { individual = false, allo return individual ? balancesIndividual : balances } -async function getMultipleAccounts(accountsArray) { - const connection = getConnection() +async function getMultipleAccounts(accountsArray, {api} = {}) { + const chain = api?.chain ?? 'solana' + const connection = getConnection(chain) if (!accountsArray.length) return [] accountsArray.forEach((val, i) => { if (typeof val === 'string') accountsArray[i] = new PublicKey(val) @@ -141,6 +175,9 @@ function exportDexTVL(DEX_PROGRAM_ID, getTokenAccounts, chain = 'solana') { const tokenAccounts = [] programAccounts.forEach((account) => { + if (DEX_PROGRAM_ID === '9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP' && account.account.space < 324) { + return; + } const tokenSwap = decodeAccount('tokenSwap', account.account); tokenAccounts.push(tokenSwap.tokenAccountA.toString()) tokenAccounts.push(tokenSwap.tokenAccountB.toString()) @@ -154,8 +191,13 @@ function sumTokensExport({ tokenAccounts, owner, owners, tokens, solOwners, blac return (api) => sumTokens2({ api, chain: api.chain, tokenAccounts, owner, owners, tokens, solOwners, blacklistedTokens, allowError, tokensAndOwners, ...rest }) } +function getEndpoint(chain) { + return endpointMap[chain]() +} + async function sumTokens2({ - balances = {}, + api, + balances, tokensAndOwners = [], tokens = [], owners = [], @@ -165,19 +207,32 @@ async function sumTokens2({ blacklistedTokens = [], allowError = false, computeTokenAccount = false, + chain = 'solana', }) { + + if (api) chain = api.chain + if (!balances) { + if (api) balances = api.getBalances() + else balances = {} + } + + const endpoint = getEndpoint(chain) blacklistedTokens.push(...blacklistedTokens_default) if (!tokensAndOwners.length) { if (owner) tokensAndOwners = tokens.map(t => [t, owner]) if (owners.length) tokensAndOwners = tokens.map(t => owners.map(o => [t, o])).flat() } if (!tokensAndOwners.length) { - const _owners = getUniqueAddresses([...owners, owner].filter(i => i), 'solana') - - const data = await getOwnerAllAccounts(_owners) - for (const item of data) { - if (blacklistedTokens.includes(item.mint) || +item.amount < 1e6) continue; - sdk.util.sumSingleBalance(balances, 'solana:' + item.mint, item.amount) + const _owners = getUniqueAddresses([...owners, owner].filter(i => i), chain) + + if (_owners.length) { + const data = await getOwnerAllAccounts(_owners) + const tokenBalances = {} + for (const item of data) { + if (blacklistedTokens.includes(item.mint) || +item.amount < 1e6) continue; + sdk.util.sumSingleBalance(tokenBalances,item.mint, item.amount) + } + await transformBalances({ tokenBalances, balances, chain, }) } } @@ -191,24 +246,24 @@ async function sumTokens2({ tokensAndOwners = getUnique(tokensAndOwners) log('total balance queries: ', tokensAndOwners.length) await runInChunks(tokensAndOwners, async (chunk) => { - const tokenBalances = await getTokenBalances(chunk) - transformBalances({ tokenBalances, balances, }) + const tokenBalances = await getTokenBalances(chunk, chain) + transformBalances({ tokenBalances, balances, chain, }) }, { sleepTime: 400 }) } if (tokenAccounts.length) { - tokenAccounts = getUniqueAddresses(tokenAccounts, 'solana') + tokenAccounts = getUniqueAddresses(tokenAccounts, chain) - const tokenBalances = await getTokenAccountBalances(tokenAccounts, { allowError }) - await transformBalances({ tokenBalances, balances, }) + const tokenBalances = await getTokenAccountBalances(tokenAccounts, { allowError, chain }) + await transformBalances({ tokenBalances, balances, chain, }) } if (solOwners.length) { const solBalance = await getSolBalances(solOwners) - sdk.util.sumSingleBalance(balances, 'solana:' + ADDRESSES.solana.SOL, solBalance) + sdk.util.sumSingleBalance(balances, `${chain}:` + ADDRESSES.solana.SOL, solBalance) } - blacklistedTokens.forEach(i => delete balances['solana:' + i]) + blacklistedTokens.forEach(i => delete balances[`${chain}:` + i]) return balances @@ -221,10 +276,10 @@ async function sumTokens2({ } async function getOwnerAllAccounts(owners) { - console.log('fetching sol token balances for', owners.length, 'owners') + sdk.log('fetching sol token balances for', owners.length, 'owners', chain,) return runInChunks(owners, async (chunk) => { const body = chunk.map(i => formOwnerBalanceQuery(i)) - const tokenBalances = await http.post(endpoint(), body) + const tokenBalances = await http.post(endpoint, body) return tokenBalances.map(i => i.result.value).flat().map(i => ({ account: i.pubkey, mint: i.account.data.parsed.info.mint, @@ -249,8 +304,8 @@ async function sumTokens2({ } } - async function getSolBalances(accounts) { - const connection = getConnection() + async function getSolBalances(accounts, { chain} = {}) { + const connection = getConnection(chain) const balances = await runInChunks(accounts, async (chunk) => { chunk = chunk.map(i => typeof i === 'string' ? new PublicKey(i) : i) @@ -269,14 +324,15 @@ async function sumTokens2({ return tokensAndOwners.map(([mint, owner]) => { return PublicKey.findProgramAddressSync( [owner.toBuffer(), programBuffer, mint.toBuffer(),], - ASSOCIATED_PROGRAM_ID + ASSOCIATED_TOKEN_PROGRAM_ID )[0] }) } - async function getTokenBalances(tokensAndAccounts) { + async function getTokenBalances(tokensAndAccounts, chain) { + const endpoint = getEndpoint(chain) const body = tokensAndAccounts.map(([token, account], i) => formTokenBalanceQuery(token, account, i)) - const tokenBalances = await http.post(endpoint(), body); + const tokenBalances = await http.post(endpoint, body); const balances = {} tokenBalances.forEach(({ result: { value } = {} } = {}) => { if (!value) return; @@ -301,8 +357,8 @@ async function sumTokens2({ } } -async function transformBalances({ tokenBalances, balances = {}, }) { - await transformBalancesOrig('solana', tokenBalances) +async function transformBalances({ tokenBalances, balances = {}, chain = 'solana' }) { + await transformBalancesOrig(chain, tokenBalances) for (const [token, balance] of Object.entries(tokenBalances)) sdk.util.sumSingleBalance(balances, token, balance) return balances @@ -353,9 +409,23 @@ async function runInChunks(inputs, fn, { chunkSize = 99, sleepTime } = {}) { return results.flat() } +function i80f48ToNumber(i80f48) { + if (i80f48.value) i80f48 = i80f48.value + // Create a mask with the lower 48 bits set to 1 + const mask = BigInt((1n << 48n) - 1n) + + // Shift right by 48 bits to get the integer part + const integerPart = BigInt(i80f48) >> BigInt(48) + + // Use bitwise AND to get the fractional part + const fractionalPart = BigInt(i80f48) & mask + + // Convert to regular numbers and add together + return Number(integerPart) + Number(fractionalPart) / Number(1n << 48n) +} + module.exports = { endpoint: endpoint(), - getTokenSupply, getMultipleAccounts, exportDexTVL, getProvider, @@ -368,4 +438,10 @@ module.exports = { blacklistedTokens_default, getStakedSol, getSolBalanceFromStakePool, + getTokenSupplies, + TOKEN_PROGRAM_ID, + ASSOCIATED_TOKEN_PROGRAM_ID, + TOKEN_2022_PROGRAM_ID, + getAssociatedTokenAddress, + i80f48ToNumber, }; diff --git a/projects/helper/sumTokens.js b/projects/helper/sumTokens.js index c376231260..f1cc248167 100644 --- a/projects/helper/sumTokens.js +++ b/projects/helper/sumTokens.js @@ -20,11 +20,26 @@ const helpers = { "bitcoin": require("./chain/bitcoin"), "litecoin": require("./chain/litecoin"), "polkadot": require("./chain/polkadot"), + "acala": require("./chain/acala"), + "bifrost": require("./chain/bifrost"), + "aelf": require("./chain/aelf"), + "aeternity": require("./chain/aeternity"), + "alephium": require("./chain/alephium"), "hedera": require("./chain/hbar"), "stacks": require("./chain/stacks"), "starknet": require("./chain/starknet"), "brc20": require("./chain/brc20"), "doge": require("./chain/doge"), + "bittensor": require("./chain/bittensor"), + "fuel": require("./chain/fuel"), + "radixdlt": require("./chain/radixdlt"), +} + + +// some chains support both evm & non-evm, this is to handle if address provided is not evm +const altEVMHelper = { + "astar": require("./chain/astar"), + "evmos": helpers.cosmos, } const geckoMapping = { @@ -60,11 +75,21 @@ async function sumTokens(options) { if (token) tokens = [token] if (owner) owners = [owner] + const evmAddressExceptions = new Set(['tron', 'xdc']) + const nonEvmOwnerFound = !evmAddressExceptions.has(chain) && owners.some(o => !o.startsWith('0x')) + const isAltEvm = altEVMHelper[chain] && nonEvmOwnerFound - if (!ibcChains.includes(chain) && !helpers[chain] && !specialChains.includes(chain)) + if (!ibcChains.includes(chain) && !helpers[chain] && !specialChains.includes(chain) && !isAltEvm) { + if (nonEvmOwnerFound) throw new Error('chain handler missing: ' + chain) return sumTokensEVM(options) + } + + + if (!isAltEvm) + owners = getUniqueAddresses(owners, chain) + else + owners = [...new Set(owners)] // retain case sensitivity - owners = getUniqueAddresses(owners, chain) blacklistedTokens = getUniqueAddresses(blacklistedTokens, chain) if (!['eos'].includes(chain)) tokens = getUniqueAddresses(tokens, chain).filter(t => !blacklistedTokens.includes(t)) @@ -80,7 +105,7 @@ async function sumTokens(options) { options.owners = owners options.tokens = tokens options.blacklistedTokens = blacklistedTokens - let helper = helpers[chain] + let helper = helpers[chain] || altEVMHelper[chain] if (ibcChains.includes(chain)) helper = helpers.cosmos @@ -118,6 +143,7 @@ async function sumTokens(options) { async function getRippleBalance(account) { const body = { "method": "account_info", "params": [{ account }] } const res = await post('https://s1.ripple.com:51234', body) + if (res.result.error === 'actNotFound') return 0 return res.result.account_data.Balance / 1e6 } diff --git a/projects/helper/tokenMapping.js b/projects/helper/tokenMapping.js index 46ff851fd1..e519aad233 100644 --- a/projects/helper/tokenMapping.js +++ b/projects/helper/tokenMapping.js @@ -1,4 +1,3 @@ -const { decimals } = require('@defillama/sdk/build/erc20') let coreAssets = require('./coreAssets.json') const ADDRESSES = coreAssets const nullAddress = ADDRESSES.null @@ -18,8 +17,14 @@ coreAssets = JSON.parse(JSON.stringify(coreAssets)) // orbit brige: https://bridge.orbitchain.io/open/v1/api/monitor/rawTokenList -const ibcChains = ['ibc', 'terra', 'terra2', 'crescent', 'osmosis', 'kujira', 'stargaze', 'juno', 'injective', 'cosmos', 'comdex', 'umee', 'orai', 'persistence', 'fxcore', 'neutron', 'quasar', 'chihuahua', 'sei', 'archway', 'migaloo', 'secret', 'aura', 'xpla', 'bostrom', 'joltify'] -const caseSensitiveChains = [...ibcChains, 'solana', 'tezos', 'ton', 'algorand', 'aptos', 'near', 'bitcoin', 'waves', 'tron', 'litecoin', 'polkadot', 'ripple', 'elrond', 'cardano', 'stacks', 'sui', 'ergo', 'mvc', 'renec', 'doge', 'stellar', 'massa', ] +const ibcChains = ['ibc', 'terra', 'terra2', 'crescent', 'osmosis', 'kujira', 'stargaze', 'juno', 'injective', 'cosmos', 'comdex', 'umee', 'orai', 'persistence', 'fxcore', 'neutron', 'quasar', 'chihuahua', 'sei', 'archway', 'migaloo', 'secret', 'aura', 'xpla', 'bostrom', 'joltify', 'nibiru', + 'kopi', 'elys', "pryzm", "mantra", 'agoric', 'band', + 'celestia', 'dydx', 'carbon' + +] +const caseSensitiveChains = [...ibcChains, 'solana', 'tezos', 'ton', 'algorand', 'aptos', 'near', 'bitcoin', 'waves', 'tron', 'litecoin', 'polkadot', 'ripple', 'elrond', 'cardano', 'stacks', 'sui', 'ergo', 'mvc', 'renec', 'doge', 'stellar', 'massa', + 'eclipse', 'acala', 'aelf', 'aeternity', 'alephium', 'bifrost', 'bittensor', 'verus', +] const transformTokens = { // Sample Code @@ -33,38 +38,94 @@ const ibcMappings = { // Sample Code // 'ibc/CA1261224952DF089EFD363D8DBB30A8AB6D8CD181E60EE9E68E432F8DE14FE3': { coingeckoId: 'inter-stable-token', decimals: 6, }, // 'ibc/5A76568E079A31FA12165E4559BA9F1E9D4C97F9C2060B538C84DCD503815E30': { coingeckoId: 'injective-protocol', decimals: 18, }, + 'ibc:DE63D8AC34B752FB7D4CAA7594145EDE1C9FC256AC6D4043D0F12310EB8FC255': { coingeckoId: 'injective-protocol', decimals: 18, }, + 'ibc:25418646C017D377ADF3202FF1E43590D0DAE3346E594E8D78176A139A928F88': { coingeckoId: 'cosmos', decimals: 6, }, + 'ibc:D8A36AE90F20FE4843A8D249B1BCF0CCDDE35C4B605C8DED57BED20C639162D0': { coingeckoId: 'tether', decimals: 6, }, + 'ibc:45D6B52CAD911A15BD9C2F5FFDA80E26AFCB05C7CD520070790ABC86D2B24229': { coingeckoId: 'celestia', decimals: 6, }, } const fixBalancesTokens = { + // Sample Code ozone: { // '0x83048f0bf34feed8ced419455a4320a735a92e9d': { coingeckoId: "ozonechain", decimals: 18 }, // was mapped to wrong chain }, - islm: { - '0x0ce35b0d42608ca54eb7bcc8044f7087c18e7717': { coingeckoId: 'usd-coin', decimals: 6 }, + water: { + '0xC807C5FfFf748eF435Ddb99b181846Edd1e70041': { coingeckoId: "water-3", decimals: 18 }, + }, + bittorrent: { + [ADDRESSES.null]: { coingeckoId: "bittorrent", decimals: 18 }, + }, + dymension: { + [ADDRESSES.null]: { coingeckoId: "dymension", decimals: 18 }, + }, + energyweb: { + [ADDRESSES.null]: { coingeckoId: "energy-web-token", decimals: 18 }, + }, + etn: { + [ADDRESSES.null]: { coingeckoId: "electroneum", decimals: 18 }, + }, + kopi: { + 'uasusdc': { coingeckoId: 'usd-coin', decimals: 6 }, + 'ucusdc': { coingeckoId: 'usd-coin', decimals: 6 }, + 'uasusdtinj': { coingeckoId: 'tether', decimals: 6 }, + 'ucusdtinj': { coingeckoId: 'tether', decimals: 6 }, + }, + swellchain: { + [ADDRESSES.null]: { coingeckoId: 'ethereum', decimals: 18 }, + [ADDRESSES.base.WETH]: { coingeckoId: 'ethereum', decimals: 18 }, + "0xb5668713E9BA8bC96f97D691663E70b54CE90b0A": { "coingeckoId": "wrapped-bitcoin-universal", "decimals": 18 }, + "0xf6718b2701D4a6498eF77D7c152b2137Ab28b8A3": { "coingeckoId": "lorenzo-stbtc", "decimals": 18 }, + "0x2826D136F5630adA89C1678b64A61620Aab77Aea": { "coingeckoId": "swell-network", "decimals": 18 }, + "0x1cf7b5f266A0F39d6f9408B90340E3E71dF8BF7B": { "coingeckoId": "swell-restaked-btc", "decimals": 8 }, + "0xb89c6ED617f5F46175E41551350725A09110bbCE": { "coingeckoId": "tether", "decimals": 6 }, + "0x99a38322cAF878Ef55AE4d0Eda535535eF8C7960": { "coingeckoId": "usd-coin", "decimals": 6 }, + "0xA6cB988942610f6731e664379D15fFcfBf282b44": { "coingeckoId": "wrapped-eeth", "decimals": 18 }, + "0x18d33689AE5d02649a859A1CF16c9f0563975258": { "coingeckoId": "restaked-swell-eth", "decimals": 18 }, + "0x09341022ea237a4DB1644DE7CCf8FA0e489D85B7": { "coingeckoId": "sweth", "decimals": 18 }, + "0x9cb41CD74D01ae4b4f640EC40f7A60cA1bCF83E7": { "coingeckoId": "renzo-restaked-lst", "decimals": 18 }, + "0x2416092f143378750bb29b79eD961ab195CcEea5": { "coingeckoId": "renzo-restaked-eth", "decimals": 18 }, + "0xc3eACf0612346366Db554C991D7858716db09f58": { "coingeckoId": "kelp-dao-restaked-eth", "decimals": 18 }, + "0x7c98E0779EB5924b3ba8cE3B17648539ed5b0Ecc": { "coingeckoId": "wrapped-steth", "decimals": 18 }, + "0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34": { "coingeckoId": "ethena-usde", "decimals": 18 }, + "0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2": { "coingeckoId": "ethena-staked-usde", "decimals": 18 }, + "0x58538e6A46E07434d7E7375Bc268D3cb839C0133": { "coingeckoId": "ethena", "decimals": 18 }, + }, + elys: { + 'uelys': { coingeckoId: 'elys-network', decimals: 6 }, }, - cronos_zkevm: { - '0xc1bf55ee54e16229d9b369a5502bfe5fc9f20b6d': { coingeckoId: 'crypto-com-chain', decimals: 18 }, + wc: { + [ADDRESSES.null]: { coingeckoId: 'ethereum', decimals: 18 }, }, - lac: { - [ADDRESSES.null]: { coingeckoId: "la-coin", decimals: 18 }, - '0x2911a1AB18546cb501628Be8625C7503a2A7DB54': { coingeckoId: "la-coin", decimals: 18 }, - '0x42c8c9c0f0a98720dacdaeac0c319cb272b00d7e': { coingeckoId: "ethereum", decimals: 18 }, - '0xf54b8cb8eeee3823a55dddf5540ceaddf9724626': { coingeckoId: "wrapped-bitcoin", decimals: 8 }, + odyssey: { + [ADDRESSES.null]: { coingeckoId: 'dione', decimals: 18 }, + '0xf21cbaf7bd040d686bd390957770d2ea652e4013': { coingeckoId: 'dione', decimals: 18 }, }, - blast: { - '0xf8a5d147a3a3416ab151758d969eff15c27ab743': { coingeckoId: "blast:0x59c159e5a4f4d1c86f7abdc94b7907b7473477f6", decimals: 0 }, + crossfi: { + [ADDRESSES.null]: { coingeckoId: 'crossfi-2', decimals: 18 }, + [ADDRESSES.crossfi.WXFI]: { coingeckoId: 'crossfi-2', decimals: 18 }, }, - noble: { - [ADDRESSES.noble.USDC]: { coingeckoId: "usd-coin", decimals: 6 }, - [ADDRESSES.noble.USDY]: { coingeckoId: "ondo-us-dollar-yield", decimals: 18 }, + mantra: { + uom: { coingeckoId: 'mantra-dao', decimals: 6 }, }, - q: { - [ADDRESSES.q.WQ]: { coingeckoId: "q-protocol", decimals: 18 }, + verus: { + 'i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV': { coingeckoId: 'verus-coin', decimals: 0 }, + 'iGBs4DWztRNvNEJBt4mqHszLxfKTNHTkhM': { coingeckoId: 'dai', decimals: 0 }, + 'iCkKJuJScy4Z6NSDK7Mt42ZAB2NEnAE1o4': { coingeckoId: 'maker', decimals: 0 }, + 'i9nwxtKuVYX4MSbeULLiK2ttVi6rUEhh4X': { coingeckoId: 'ethereum', decimals: 0 }, + 'iS8TfRPfVpKo5FVfSUzfHBQxo9KuzpnqLU': { coingeckoId: 'tbtc', decimals: 0 }, + 'i9oCSqKALwJtcv49xUKS2U2i79h1kX6NEY': { coingeckoId: 'tether', decimals: 0 }, }, - taiko: { - '0x7d02A3E0180451B17e5D7f29eF78d06F8117106C': { coingeckoId: "dai", decimals: 18 }, + unit0: { + '0xEb19000D90f17FFbd3AD9CDB8915D928F4980fD1': { coingeckoId: 'usd-coin', decimals: 6 }, + '0xb303d80db8415FD1d3C9FED68A52EEAc9a052671': { coingeckoId: 'tether', decimals: 6 }, + '0x1B100DE3F13E3f8Bb2f66FE58c1949c32E71248B': { coingeckoId: 'ethereum', decimals: 18 }, + '0x9CE808657ba90C65a2700b1cA5D943eC72834B52': { coingeckoId: 'wrapped-bitcoin', decimals: 8 }, }, + starknet: { + '0x20ff2f6021ada9edbceaf31b96f9f67b746662a6e6b2bc9d30c0d3e290a71f6': { coingeckoId: 'spiko-us-t-bills-money-market-fund', decimals: 5 }, + '0x4f5e0de717daa6aa8de63b1bf2e8d7823ec5b21a88461b1519d9dbc956fb7f2': { coingeckoId: 'eutbl', decimals: 5 }, + } } ibcChains.forEach(chain => fixBalancesTokens[chain] = { ...ibcMappings, ...(fixBalancesTokens[chain] || {}) }) diff --git a/projects/helper/tomb.js b/projects/helper/tomb.js index ba6f784d49..7473d16b0c 100644 --- a/projects/helper/tomb.js +++ b/projects/helper/tomb.js @@ -1,5 +1,5 @@ const { staking, stakingUnknownPricedLP } = require("./staking"); -const { pool2Exports } = require("./pool2"); +const { pool2 } = require("./pool2"); const sdk = require("@defillama/sdk"); const token0Abi = 'address:token0' const token1Abi = 'address:token1' @@ -12,7 +12,7 @@ function tombTvl(token, share, rewardPool, masonry, pool2LPs, chain = "ethereum" [chain]: { tvl: async () => ({}), staking: staking(masonry, share, chain), - pool2: pool2Exports(rewardPool, pool2LPs, chain, transform) + pool2: pool2(rewardPool, pool2LPs, chain, transform) } } } diff --git a/projects/helper/uniswapV3.js b/projects/helper/uniswapV3.js index 726e43b289..64f03f3199 100644 --- a/projects/helper/uniswapV3.js +++ b/projects/helper/uniswapV3.js @@ -44,12 +44,14 @@ function uniV3Export(config) { return exports } -function uniV3GraphExport({ blacklistedTokens = [], graphURL, name, minTVLUSD = 10,}) { +function uniV3GraphExport({ blacklistedTokens = [], graphURL, name, minTVLUSD = 0,}) { return async (api) => { const size = 1000 // let lastId = '' // let pools + const minTvlFilter = minTVLUSD ? `totalValueLockedUSD_gt: ${minTVLUSD}` : '' + const graphQueryPagedWithBlock = ` query poolQuery($lastId: String, $block: Int) { pools(block: { number: $block } first:${size} where: {id_gt: $lastId totalValueLockedUSD_gt: ${minTVLUSD}}) { @@ -61,7 +63,7 @@ function uniV3GraphExport({ blacklistedTokens = [], graphURL, name, minTVLUSD = ` const graphQueryPagedWithoutBlock = ` query poolQuery($lastId: String) { - pools(first:${size} where: {id_gt: $lastId totalValueLockedUSD_gt: ${minTVLUSD}}) { + pools(first:${size} where: {id_gt: $lastId ${minTvlFilter}}) { id token0 { id } token1 { id } diff --git a/projects/helper/unwrapLPs.js b/projects/helper/unwrapLPs.js index deca1d854b..e8eb59a1cd 100644 --- a/projects/helper/unwrapLPs.js +++ b/projects/helper/unwrapLPs.js @@ -4,7 +4,6 @@ const BigNumber = require("bignumber.js"); const token0 = 'address:token0' const symbol = 'string:symbol' const { getPoolTokens, getPoolId, bPool, getCurrentTokens, } = require('./abis/balancer.json') -const { requery } = require('./requery') const { getChainTransform, getFixBalances } = require('./portedTokens') const { getUniqueAddresses, normalizeAddress } = require('./tokenMapping') const creamAbi = require('./abis/cream.json') @@ -103,53 +102,6 @@ async function addTokensAndLPs(balances, tokens, amounts, block, chain = "ethere await unwrapUniswapLPs(balances, lpBalances, block, chain, transformAddress) } -/* -tokens [ - [token, isLP] - eg ["0xaaa", true] -] -*/ -async function sumTokensAndLPsSharedOwners(balances, tokens, owners, block, chain = "ethereum", transformAddress) { - if (!transformAddress) - transformAddress = await getChainTransform(chain) - const balanceOfTokens = await sdk.api.abi.multiCall({ - calls: tokens.map(t => owners.map(o => ({ - target: t[0], - params: o - }))).flat(), - abi: 'erc20:balanceOf', - block, - chain - }) - await requery(balanceOfTokens, chain, block, 'erc20:balanceOf') - const isLP = {} - tokens.forEach(token => { - isLP[token[0].toLowerCase()] = token[1] - }) - const lpBalances = [] - balanceOfTokens.output.forEach((result, idx) => { - const token = result.input.target.toLowerCase() - const balance = result.output - if (isLP[token] === true) { - lpBalances.push({ - token, - balance - }) - } else { - sdk.util.sumSingleBalance(balances, transformAddress(token), balance); - } - }) - if (lpBalances.length > 0) { - await unwrapUniswapLPs(balances, lpBalances, block, chain, transformAddress) - } -} - -async function sumTokensSharedOwners(balances, tokens, owners, block, chain = "ethereum", transformAddress) { - if (transformAddress === undefined) { - transformAddress = addr => `${chain}:${addr}` - } - await sumTokensAndLPsSharedOwners(balances, tokens.map(t => [t, false]), owners, block, chain, transformAddress) -} - async function sumLPWithOnlyOneToken(balances, lpToken, owner, listedToken, block, chain = "ethereum", transformAddress = id => id) { const [balanceOfLP, balanceOfTokenListedInLP, lpSupply] = await Promise.all([ sdk.api.erc20.balanceOf({ @@ -239,7 +191,7 @@ async function unwrapUniswapV3NFT({ balances, owner, owners, nftAddress, block, let positionIds = uniV3ExtraConfig.positionIds if (!positionIds) { - if (!owners && owner) owners = [owner] + if (!owners?.length && owner) owners = [owner] owners = getUniqueAddresses(owners, chain) const { output: lengths } = await sdk.api.abi.multiCall({ block, chain, abi: wildCreditABI.balanceOf, @@ -261,7 +213,6 @@ async function unwrapUniswapV3NFT({ balances, owner, owners, nftAddress, block, block, chain, abi: wildCreditABI.positions, target: nftAddress, calls: positionIds.map((position) => ({ params: [position] })), })).output.map(positionsCall => positionsCall.output) - const lpInfo = {} positions.forEach(position => lpInfo[getKey(position)] = position) const lpInfoArray = Object.values(lpInfo) @@ -514,7 +465,9 @@ async function sumBalancerLps(balances, tokensAndOwners, block, chain, transform } const nullAddress = ADDRESSES.null -const gasTokens = [nullAddress, '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'] +const gasTokens = [nullAddress, '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee', '0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', + '0x000000000000000000000000000000000000800a', // zksync era gas token +] /* tokensAndOwners [ [token, owner] - eg ["0xaaa", "0xbbb"] @@ -589,40 +542,6 @@ async function sumTokens(balances = {}, tokensAndOwners, block, chain = "ethereu return balances } -async function unwrapCreamTokens(balances, tokensAndOwners, block, chain = "ethereum", transformAddress = id => id) { - const [balanceOfTokens, exchangeRates, underlyingTokens] = await Promise.all([ - sdk.api.abi.multiCall({ - calls: tokensAndOwners.map(t => ({ - target: t[0], - params: t[1] - })), - abi: 'erc20:balanceOf', - block, - chain - }), - sdk.api.abi.multiCall({ - calls: tokensAndOwners.map(t => ({ - target: t[0], - })), - abi: creamAbi.exchangeRateStored, - block, - chain - }), - sdk.api.abi.multiCall({ - calls: tokensAndOwners.map(t => ({ - target: t[0], - })), - abi: creamAbi.underlying, - block, - chain - }) - ]) - balanceOfTokens.output.forEach((balanceCall, i) => { - const underlying = underlyingTokens.output[i].output - const balance = BigNumber(balanceCall.output).times(exchangeRates.output[i].output).div(1e18).toFixed(0) - sdk.util.sumSingleBalance(balances, transformAddress(underlying), balance) - }) -} const cvx_abi = { cvxBRP_pid: "uint256:pid", @@ -666,15 +585,6 @@ async function genericUnwrapCvx(balances, holder, cvx_BaseRewardPool, block, cha return balances } -async function genericUnwrapCvxDeposit({ api, owner, token, balances }) { - if (!balances) balances = await api.getBalances() - const [bal, cToken] = await api.batchCall([ - { target: token, params: owner, abi: 'erc20:balanceOf' }, - { target: token, abi: 'address:curveToken' }, - ]) - sdk.util.sumSingleBalance(balances, cToken, bal, api.chain) - return balances -} async function genericUnwrapCvxRewardPool({ api, owner, pool, balances }) { if (!balances) balances = await api.getBalances() @@ -867,6 +777,8 @@ async function sumTokens2({ }, resolveICHIVault = false, solidlyVeNfts = [], + convexRewardPools = [], + auraPools = [], }) { if (api) { chain = api.chain ?? chain @@ -918,6 +830,24 @@ async function sumTokens2({ .flat() ) } + + if (convexRewardPools.length) { + const convexRewardPoolsTokensAndOwners = convexRewardPools.map(poolAddress => { + return owners.map(owner => [poolAddress, owner]) + }).flat(); + await unwrapConvexRewardPools({ api, tokensAndOwners: convexRewardPoolsTokensAndOwners }); + } + + if (auraPools.length) { + const tokensAndOwners = auraPools.map(poolAddress => { + return owners.map(owner => [poolAddress, owner]) + }).flat(); + Promise.all( + tokensAndOwners.map(([pool, owner]) => { + return unwrapAuraPool({ api, auraPool: pool, owner }) + }) + ); + } if (ownerTokens.length) { ownerTokens.map(([tokens, owner]) => { @@ -1002,7 +932,25 @@ function sumTokensExport({ balances, tokensAndOwners, tokensAndOwners2, tokens, return async (api) => sumTokens2({ api, balances, tokensAndOwners, tokensAndOwners2, tokens, owner, owners, transformAddress, unwrapAll, resolveLP, blacklistedLPs, blacklistedTokens, skipFixBalances, ownerTokens, resolveUniV3, resolveSlipstream, resolveArtBlocks, resolveNFTs, fetchCoValentTokens, ...args, }) } -async function unwrapBalancerToken({ api, chain, block, balancerToken, owner, balances, isBPool = false, isV2 = true }) { +async function unwrapAuraPool({ api, chain, block, auraPool, owner, balances, isBPool = false, isV2 = true }) { + if (!api) { + api = new sdk.ChainApi({ chain, block, }) + } + balances = balances || api.getBalances() + const [lpSupply, lpTokens, balancerToken] = await api.batchCall([ + { abi: 'erc20:totalSupply', target: auraPool }, + { abi: 'erc20:balanceOf', target: auraPool, params: owner }, + { abi: 'address:asset', target: auraPool }, + ]); + if (+lpTokens === 0) return balances; + const [vault] = await api.batchCall([ + { abi: 'address:getVault', target: balancerToken }, + ]); + const auraRatio = lpTokens / lpSupply; + return unwrapBalancerToken({ api, chain, block, balancerToken, owner: vault, balances, isBPool, isV2, extraRatio: auraRatio }) +} + +async function unwrapBalancerToken({ api, chain, block, balancerToken, owner, balances, isBPool = false, isV2 = true, extraRatio = 1 }) { if (!api) { api = new sdk.ChainApi({ chain, block, }) } @@ -1012,14 +960,17 @@ async function unwrapBalancerToken({ api, chain, block, balancerToken, owner, ba { abi: 'erc20:balanceOf', target: balancerToken, params: owner }, ]) if (+lpTokens === 0) return balances - const ratio = lpTokens / lpSupply + const ratio = lpTokens / lpSupply * extraRatio if (isV2) { const poolId = await api.call({ abi: 'function getPoolId() view returns (bytes32)', target: balancerToken }) const vault = await api.call({ abi: 'address:getVault', target: balancerToken }) const [tokens, bals] = await api.call({ abi: 'function getPoolTokens(bytes32) view returns (address[], uint256[],uint256)', target: vault, params: poolId }) tokens.forEach((v, i) => { - sdk.util.sumSingleBalance(balances, v, bals[i] * ratio, api.chain) + // handle balancer composable metapools case where the pool contains the LP itself, we can skip it for our calc + if(v.toLowerCase() !== balancerToken.toLowerCase()) { + sdk.util.sumSingleBalance(balances, v, bals[i] * ratio, api.chain) + } }) } else { let underlyingPool = balancerToken @@ -1132,13 +1083,10 @@ module.exports = { unwrapUniswapLPs, unwrapSlipstreamNFT, addTokensAndLPs, - sumTokensAndLPsSharedOwners, sumTokensAndLPs, sumTokens, sumBalancerLps, - unwrapCreamTokens, sumLPWithOnlyOneToken, - sumTokensSharedOwners, sumLPWithOnlyOneTokenOtherThanKnown, genericUnwrapCvx, unwrapLPsAuto, @@ -1147,7 +1095,6 @@ module.exports = { sumTokens2, unwrapBalancerToken, sumTokensExport, - genericUnwrapCvxDeposit, genericUnwrapCvxRewardPool, genericUnwrapCvxFraxFarm, genericUnwrapCvxPrismaPool, diff --git a/projects/helper/utils.js b/projects/helper/utils.js index c588d76acb..2102c3d093 100644 --- a/projects/helper/utils.js +++ b/projects/helper/utils.js @@ -68,7 +68,8 @@ function isLP(symbol, token, chain) { if (chain === 'moonriver' && ['HBLP'].includes(symbol)) return true if (chain === 'ethpow' && ['LFG_LP'].includes(symbol)) return true if (chain === 'aurora' && ['wLP'].includes(symbol)) return true - if (chain === 'oasis' && ['LPT'].includes(symbol)) return true + if (chain === 'oasis' && ['LPT', 'GLP'].includes(symbol)) return true + if (chain === 'iotex' && ['MIMO-LP'].includes(symbol)) return true if (chain === 'base' && ['RCKT-V2'].includes(symbol)) return true if (chain === 'wan' && ['WSLP'].includes(symbol)) return true if (chain === 'telos' && ['zLP'].includes(symbol)) return true @@ -99,6 +100,8 @@ function isLP(symbol, token, chain) { if (chain === 'btn' && /(XLT)$/.test(symbol)) return true //xenwave LP if (['fantom', 'nova',].includes(chain) && ['NLT'].includes(symbol)) return true if (chain === 'ethereumclassic' && symbol === 'ETCMC-V2') return true + if (chain === 'shibarium' && ['SSLP', 'ChewyLP'].includes(symbol)) return true + if (chain === 'omax' && ['OSWAP-V2'].includes(symbol)) return true let label if (symbol.startsWith('ZLK-LP') || symbol.includes('DMM-LP') || (chain === 'avax' && 'DLP' === symbol) || symbol === 'fChe-LP') @@ -255,7 +258,7 @@ async function debugBalances({ balances = {}, chain, log = false, tableLabel = ' labelMapping[label] = token return } - const blacklistedChains = ['starknet', 'solana', 'sui', 'aptos'] + const blacklistedChains = ['starknet', 'solana', 'sui', 'aptos', 'fuel'] if (!token.startsWith('0x') || blacklistedChains.includes(chain)) return; if (!label.startsWith(chain)) ethTokens.push(token) @@ -304,12 +307,16 @@ async function debugBalances({ balances = {}, chain, log = false, tableLabel = ' }) sdk.log('Balance table for [%s] %s', chain, tableLabel) - const filtered = logObj.filter(i => { + let filtered = logObj.filter(i => { const symbol = i.symbol?.toLowerCase() ?? '' if (/\.(com|net|org|xyz|site|io)/.test(symbol)) return false if (/claim|access|airdrop/.test(symbol)) return false return true }) + if (filtered.length > 300) { + sdk.log('Too many unknowns to display #'+filtered.length, 'displaying first 100') + filtered = filtered.slice(0, 100) + } if (filtered.length) console.table(filtered) } diff --git a/projects/helper/utils/graphql.js b/projects/helper/utils/graphql.js index e9a2c82f81..8860b580cd 100644 --- a/projects/helper/utils/graphql.js +++ b/projects/helper/utils/graphql.js @@ -1,7 +1,7 @@ const axios = require("axios"); -async function request(endpoint, query, { variables, withMetadata = false } = {}) { - const { data: result } = await axios.post(endpoint, { query, variables }) +async function request(endpoint, query, { variables, withMetadata = false, headers } = {}) { + const { data: result } = await axios.post(endpoint, { query, variables }, { headers }) if (result.errors) throw new Error(result.errors[0].message) return withMetadata ? result : result.data } diff --git a/projects/helper/utils/solana/layout.js b/projects/helper/utils/solana/layout.js index b7523fd96e..e409ec8d92 100644 --- a/projects/helper/utils/solana/layout.js +++ b/projects/helper/utils/solana/layout.js @@ -5,7 +5,7 @@ const { parsePhoenix } = require('./layouts/phoenix-dex') const { RAYDIUM_LIQUIDITY_STATE_LAYOUT_CLMM, RAYDIUM_STABLE_STATE_LAYOUT_V1, } = require('./layouts/raydium-layout') const { INVESTIN_FUND_DATA, } = require('./layouts/investin-layout') const { MARKET_STATE_LAYOUT_V3, OPEN_ORDERS_LAYOUT_V2, MARKET_STATE_LAYOUT_V3_MINIMAL } = require('./layouts/openbook-layout') -const { ReserveLayout, ReserveLayoutLarix, MintLayout, AccountLayout, TokenSwapLayout, ESOLStakePoolLayout, } = require('./layouts/mixed-layout'); +const { ReserveLayout, ReserveLayoutLarix, MintLayout, AccountLayout, TokenSwapLayout, ESOLStakePoolLayout, PARLAY_LAYOUT_PARTIAL, HH_PARI_LAYOUT_PARTIAL, ACCESS_LAYOUT, } = require('./layouts/mixed-layout'); const { SCN_STAKE_POOL, TOKEN_LAYOUT, } = require("./layouts/scnSOL"); const { SANCTUM_INFINITY } = require("./layouts/sanctum-infinity-layout"); const { parseSanctumLstStateList } = require("./layouts/sanctum-validators-lsts-layout"); @@ -63,6 +63,9 @@ const customDecoders = { sanctumValidatorLsts: parseSanctumLstStateList, stakePoolPartial: defaultParseLayout(STAKE_POOL_PARTIAL), stakePool: defaultParseLayout(STAKE_POOL_LAYOUT), + hhParlay: defaultParseLayout(PARLAY_LAYOUT_PARTIAL), + hhPari: defaultParseLayout(HH_PARI_LAYOUT_PARTIAL), + access: defaultParseLayout(ACCESS_LAYOUT), } function decodeAccount(layout, accountInfo) { diff --git a/projects/helper/utils/solana/layouts/mixed-layout.js b/projects/helper/utils/solana/layouts/mixed-layout.js index 77e760154d..3fe49025b4 100644 --- a/projects/helper/utils/solana/layouts/mixed-layout.js +++ b/projects/helper/utils/solana/layouts/mixed-layout.js @@ -250,7 +250,53 @@ const ESOLStakePoolLayout = BufferLayout.struct([ u32("maxValidatorYieldPerEpochNumerator") ]); + +const PARLAY_LAYOUT_PARTIAL = BufferLayout.struct([ + publicKey('mint'), + u32("entryCount"), + u64('entryCost'), +]); + +const HH_PARI_LAYOUT_PARTIAL = BufferLayout.struct([ + publicKey('mint'), + u64("closeTimestamp"), + u64("resolveTimestamp"), + u64("outcomeTimestamp"), + u16("creatorFee"), + u16("platformFee"), + u8('state'), + u8('outcome'), + BufferLayout.seq(u64(), u8().span, 'amounts'), +]); + +const ACCESS_LAYOUT = BufferLayout.struct([ + BufferLayout.u8('tag'), + BufferLayout.u8('bumpSeed'), + uint64('dailyInflation'), + publicKey('tokenMint'), + publicKey('authority'), + uint64('creationTime'), + uint64('totalStaked'), + uint64('totalStakedSnapshot'), + uint64('lastSnapshotOffset'), + uint128('ixGate'), + publicKey('freezeAuthority'), + uint128('adminIxGate'), + BufferLayout.u16('feeBasisPoints'), + uint64('lastFeeDistributionTime'), + BufferLayout.u32('feeRecipientsCount'), + BufferLayout.seq( + BufferLayout.struct([ + publicKey('owner'), + uint64('percentage'), + ]), + 10, + 'recipients' + ), +]); + module.exports = { - ReserveLayout, ReserveLayoutLarix, MintLayout, AccountLayout, TokenSwapLayout, ESOLStakePoolLayout, + ReserveLayout, ReserveLayoutLarix, MintLayout, AccountLayout, TokenSwapLayout, ESOLStakePoolLayout, + PARLAY_LAYOUT_PARTIAL, HH_PARI_LAYOUT_PARTIAL, ACCESS_LAYOUT } diff --git a/projects/hermes-finance/index.js b/projects/hermes-finance/index.js index a44ac2602a..9cb0bd2a3a 100644 --- a/projects/hermes-finance/index.js +++ b/projects/hermes-finance/index.js @@ -1,5 +1,5 @@ const { staking } = require('../helper/staking'); -const { pool2Exports } = require('../helper/pool2'); +const { pool2 } = require('../helper/pool2'); const hermes = "0xB15f02F9Da8CD1f99E9dd375F21dc96D25ddd82C"; const hermesShares = "0xfa4b6db72a650601e7bd50a0a9f537c9e98311b2"; @@ -15,6 +15,6 @@ module.exports = { avax:{ tvl: async () => ({}), staking: staking(olympus, hermesShares), - pool2: pool2Exports(hShareRewardPool, pool2LPs, "avax") + pool2: pool2(hShareRewardPool, pool2LPs, "avax") } } \ No newline at end of file diff --git a/projects/hermes-protocol/index.js b/projects/hermes-protocol/index.js index 588585d64a..af59abf701 100644 --- a/projects/hermes-protocol/index.js +++ b/projects/hermes-protocol/index.js @@ -5,6 +5,6 @@ module.exports = { misrepresentedTokens: true, metis:{ tvl: uniTvlExport("0x633a093C9e94f64500FC8fCBB48e90dd52F6668F", "metis", undefined, undefined, { hasStablePools: true, useDefaultCoreAssets: true, }), - staking: staking("0xa4C546c8F3ca15aa537D2ac3f62EE808d915B65b", "0xb27bbeaaca2c00d6258c3118bab6b5b6975161c8"), + staking: () => ({}), }, } diff --git a/projects/hermes-v2/index.js b/projects/hermes-v2/index.js new file mode 100644 index 0000000000..2ebf35d431 --- /dev/null +++ b/projects/hermes-v2/index.js @@ -0,0 +1,13 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') +const { staking } = require('../helper/staking'); + +const stakerAddress = '0x54De3b7b5D1993Db4B2a93C897b5272FBd60e99E' + +module.exports = { + doublecounted: true, + methodology: 'The sum of All staked Uniswap V3 NFTs and burnt Hermes for staked TVL.', + arbitrum: { + tvl: sumTokensExport({ owner: stakerAddress, resolveUniV3: true}), + staking: staking('0x3A0000000000E1007cEb00351F65a1806eCd937C', '0x45940000009600102A1c002F0097C4A500fa00AB'), + }, +}; diff --git a/projects/hermes/abi.json b/projects/hermes/abi.json deleted file mode 100644 index f1669f797d..0000000000 --- a/projects/hermes/abi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "poolInfo": "function poolInfo(uint256) view returns (address lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accIrisPerShare, uint16 depositFeeBP, uint256 lpSupply)", - "balance": "uint256:balance", - "balanceof": "function balanceOf(address) view returns (uint256)", - "token0": "address:token0", - "token1": "address:token1" -} \ No newline at end of file diff --git a/projects/hexaswap/index.js b/projects/hexaswap/index.js index 4feae8d0c7..583e1cd8c0 100644 --- a/projects/hexaswap/index.js +++ b/projects/hexaswap/index.js @@ -4,7 +4,6 @@ module.exports = { misrepresentedTokens: true, telos: { tvl: getUniTVL({ - fetchBalances: true, useDefaultCoreAssets: true, factory: '0x7853cDd20592aaff59D6e89B59bF67499564C525', }) diff --git a/projects/hibt/index.js b/projects/hibt/index.js index f2544d5e6a..5c7a3a96e8 100644 --- a/projects/hibt/index.js +++ b/projects/hibt/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -7,13 +8,14 @@ const config = { ], }, bitcoin: { - owners: [ - 'bc1qpxntlx09kqvpwl7vmjw9f28yvytdqkdx8xh63w' - ] + owners: bitcoinAddressBook.hibt }, tron: { owners: [ - 'TWVCro8i15sJjmwRKfV53gPnCsgz2ThQSc' + 'TWVCro8i15sJjmwRKfV53gPnCsgz2ThQSc', + 'TGoPfFBjoZ6wFFia1NAFio21Pi9Sc8KFw5', + 'TXzjxSsfS2YDc8wktEjbUAHnETWdAgN3aF', + 'TWkAzr1bfTbm84awjbBgyThPqZPs6GbskW' ] }, } diff --git a/projects/hidden-hand/index.js b/projects/hidden-hand/index.js index ed63f14c7f..ffcf2f25d3 100644 --- a/projects/hidden-hand/index.js +++ b/projects/hidden-hand/index.js @@ -1,5 +1,6 @@ const { sumTokens2 } = require('../helper/unwrapLPs') const { cachedGraphQuery } = require('../helper/cache') +const marionette = require('./marionette'); const protocol_contracts = { ethereum: { @@ -77,8 +78,9 @@ async function tvl(api) { } module.exports = { - methodology: `Sums bribe tokens deposited on Hidden Hand Reward Distributors, Bribe Vaults and Harvester contracts.`, + methodology: `Sums bribe tokens deposited on Hidden Hand Reward Distributors, Bribe Vaults and Harvester contracts and veTHE deposited in Marionette.`, ethereum: { tvl }, optimism: { tvl }, arbitrum: { tvl }, + bsc: marionette.bsc, }; diff --git a/projects/hidden-hand/marionette.js b/projects/hidden-hand/marionette.js new file mode 100644 index 0000000000..af92074f7e --- /dev/null +++ b/projects/hidden-hand/marionette.js @@ -0,0 +1,23 @@ +const { sumTokens2 } = require('../helper/unwrapLPs') + +async function tvl(api) { + const owners = ["0x60443fd265b4a4D51DFE2569569D45DBde393B14", "0x6045648cF69285fC2018Ca8F3ee8844d5e05Ee5d"]; //marionette adapters + + return sumTokens2({ + api, + owners, + solidlyVeNfts: [ + { + isAltAbi: true, + baseToken: "0xF4C8E32EaDEC4BFe97E0F595AdD0f4450a863a11", + veNft: "0xfBBF371C9B0B994EebFcC977CEf603F7f31c070D" + }, // veTHENA + ], + permitFailure: true, + }); +} + +module.exports = { + methodology: `Sums veTokens deposited on Hidden Hand Marionette Adapters.`, + bsc: { tvl }, +}; diff --git a/projects/hinkal/registryTokens.js b/projects/hinkal/registryTokens.js index 2b653c698e..11eb4ad25d 100644 --- a/projects/hinkal/registryTokens.js +++ b/projects/hinkal/registryTokens.js @@ -253,6 +253,9 @@ const ETHEREUM_REGISTRY_TOKENS = [ "0x0d86883faf4ffd7aeb116390af37746f45b6f378", "0x73a15fed60bf67631dc6cd7bc5b6e8da8190acf5", "0x35d8949372d46b7a3d5a56006ae77b215fc69bc0", + "0x1f7e9321ce32af1f9ea1185fd10d31fea31ffd95", + "0x270B7748CdF8243bFe68FaCE7230ef0fCE695389", + "0x8B2098043Cea715A18E81CC0A6a9d202Cf279014", ]; const ARBITRUM_REGISTRY_TOKENS = [ @@ -908,7 +911,7 @@ const BASE_REGISTRY_TOKENS = [ ADDRESSES.base.DAI, "0xd07379a755A8f11B57610154861D694b2A0f615a", "0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22", - "0xB6fe221Fe9EeF5aBa221c348bA20A1Bf5e73624c", + ADDRESSES.base.rETH, "0x9EaF8C1E34F05a589EDa6BAfdF391Cf6Ad3CB239", "0xf6C5F01C7F3148891ad0e19DF78743D31E390D1f", "0x6e53131F68a034873b6bFA15502aF094Ef0c5854", @@ -954,7 +957,7 @@ const BASE_REGISTRY_TOKENS = [ "0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB", ADDRESSES.blast.ezETH, "0x1Bc71130A0e39942a7658878169764Bbd8A45993", - "0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452", + ADDRESSES.base.wstETH, ]; const BLAST_REGISTRY_TOKENS = [ diff --git a/projects/hinkal/registryTokensWithUnderlyingAddresses.js b/projects/hinkal/registryTokensWithUnderlyingAddresses.js index 02fa16045c..f8b4bb45aa 100644 --- a/projects/hinkal/registryTokensWithUnderlyingAddresses.js +++ b/projects/hinkal/registryTokensWithUnderlyingAddresses.js @@ -88,6 +88,8 @@ const ETHEREUM_REGISTRY_TOKENS_WITH_UNDERLYING_ADDRESSES = { ADDRESSES.ethereum.USDT, "0x028171bCA77440897B824Ca71D1c56caC55b68A3": ADDRESSES.ethereum.DAI, + "0x8B2098043Cea715A18E81CC0A6a9d202Cf279014": + "0x1f7e9321ce32af1f9ea1185fd10d31fea31ffd95", }; const ARBITRUM_REGISTRY_TOKENS_WITH_UNDERLYING_ADDRESSES = { @@ -247,7 +249,7 @@ const BASE_REGISTRY_TOKENS_WITH_UNDERLYING_ADDRESSES = { "0xD4a0e0b9149BCee3C920d2E00b5dE09138fd8bb7": ADDRESSES.optimism.WETH_1, "0x99CBC45ea5bb7eF3a5BC08FB1B7E56bB2442Ef0D": - "0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452", + ADDRESSES.base.wstETH, "0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB": ADDRESSES.base.USDC, }; diff --git a/projects/hliquity/index.js b/projects/hliquity/index.js new file mode 100644 index 0000000000..dc53a952b2 --- /dev/null +++ b/projects/hliquity/index.js @@ -0,0 +1,6 @@ +const { getLiquityTvl } = require("../helper/liquity"); + +module.exports = { + methodology: 'the amount of locked hbar in the HLiquity protocol', + hedera: { tvl: getLiquityTvl('0x00000000000000000000000000000000005c9f66')} +}; \ No newline at end of file diff --git a/projects/hodlify/index.js b/projects/hodlify/index.js index 563355f224..0a7450f092 100644 --- a/projects/hodlify/index.js +++ b/projects/hodlify/index.js @@ -51,7 +51,7 @@ const tvl = async (api) => { module.exports = { doublecounted: true, - start: 1693929600, // Tue Sep 05 2023 16:00:00 GMT+0000 + start: '2023-09-05', // Tue Sep 05 2023 16:00:00 GMT+0000 methodology: 'Hodlify TVL including total values of assets deposited in other protocols, and the petty cash in our earning vaults.', arbitrum: { tvl }, optimism: { tvl }, diff --git a/projects/holdstation-swap/index.js b/projects/holdstation-swap/index.js new file mode 100644 index 0000000000..8d760f2337 --- /dev/null +++ b/projects/holdstation-swap/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + era: { factory: '0x1153D1d27A558471eF051c5D2D075d7D07B84A07', fromBlock: 31199635 }, +}) \ No newline at end of file diff --git a/projects/homecoin/index.js b/projects/homecoin/index.js index 87375a41a3..96479b80ab 100644 --- a/projects/homecoin/index.js +++ b/projects/homecoin/index.js @@ -52,9 +52,10 @@ const borrowed = async (_, ethBlock) => { module.exports = { misrepresentedTokens: true, start: HOME_START, + deadFrom: '2022-11-09', ethereum: { tvl, - borrowed, + borrowed: ()=>({}), // it's all bad debt }, methodology: "The base TVL metric counts only USDC liquidity in the protocol." + diff --git a/projects/honeyswap/index.js b/projects/honeyswap/index.js index 5d94a36f0c..99d67f7e88 100644 --- a/projects/honeyswap/index.js +++ b/projects/honeyswap/index.js @@ -9,12 +9,6 @@ module.exports = { blacklist: [ '0x4f4f9b8d5b4d0dc10506e5551b0513b61fd59e75', ], - log_minTokenValue: 1e5, - log_coreAssetPrices: [ - 1/1e18, - 197/1e18, - 1824/1e18, - ] }) }, polygon: { diff --git a/projects/hope-lend/index.js b/projects/hope-lend/index.js index f40f2632f1..3b9d5302ae 100644 --- a/projects/hope-lend/index.js +++ b/projects/hope-lend/index.js @@ -9,6 +9,7 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2023-10-18')/1e3), 'Protocol was hacked!'], ], + deadFrom: '2023-10-18' }; delete module.exports.ethereum.borrowed \ No newline at end of file diff --git a/projects/hope-money/index.js b/projects/hope-money/index.js index 19aae3e2e0..4e7fbd7f0a 100644 --- a/projects/hope-money/index.js +++ b/projects/hope-money/index.js @@ -1,18 +1,11 @@ const { sumTokensExport } = require('../helper/sumTokens') const ADDRESSES = require('../helper/coreAssets.json') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { methodology: 'Tokens held in coinbase custody. Reserve info taken from: https://hope.money/gomboc.html', doublecounted: true, - bitcoin: { - tvl: sumTokensExport({ owners: [ - '15PYHP5ZW29B3o19jFNKz6RyRdHCtzJj5H', - '16BLcAyJR8unm8RpQT9PGTwh5uPpZEf2ut', - '3JoCB8ifwhL4YKo9rCYMgVGbqxBqnpQpdS', - '179fgM9yyTHj4ZCTfAcGhUFiQMXuPx5xrF', - '1LaC3Xt8RZWYH1pjcvXxrWxLvXe7iR3ybe' - ]}) - }, + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.hopeMoney }) }, ethereum: { tvl: sumTokensExport({ tokensAndOwners: [ diff --git a/projects/hope-swap/index.js b/projects/hope-swap/index.js index 1c8fabe0c4..00c5071ad3 100644 --- a/projects/hope-swap/index.js +++ b/projects/hope-swap/index.js @@ -3,6 +3,6 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, ethereum: { - tvl: getUniTVL({ factory: '0x26F53fbADeEb777fb2A122dC703433d79241b64e', useDefaultCoreAssets: true, fetchBalances: true }), + tvl: getUniTVL({ factory: '0x26F53fbADeEb777fb2A122dC703433d79241b64e', useDefaultCoreAssets: true, }), }, }; \ No newline at end of file diff --git a/projects/hotbit/index.js b/projects/hotbit/index.js index 1d37046092..a8d828a135 100644 --- a/projects/hotbit/index.js +++ b/projects/hotbit/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { bsc: { @@ -22,7 +23,7 @@ const config = { ] }, bitcoin: { - owners: ['1MiFZMJkFMhMrubjjo6f5oEhh7XgSwXWgp'] + owners: bitcoinAddressBook.hotbit }, ripple: { owners: ['rJKBidE4Av6ZaFTBcAucZXCpU7QvNXyfpT'] diff --git a/projects/hourglass/index.js b/projects/hourglass/index.js new file mode 100644 index 0000000000..f0ac27afab --- /dev/null +++ b/projects/hourglass/index.js @@ -0,0 +1,44 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { getLogs2 } = require('../helper/cache/getLogs') + +const ethereum_pitchfxs = '0x11ebe21e9d7bf541a18e1e3ac94939018ce88f0b'; + +const config = { + ethereum: { factory: '0x679619FA685a18782a86dD5850124A75E83daD8F', fromBlock: 19877998 }, + mantle: { factory: '0x624bd5ba06A856C4D5f60c8Ba29eeE1f684Ddf05', fromBlock: 65870976 }, +} + +module.exports = { + methodology: 'TVL accounts for all assets deposited into our boosted vaults. It also includes the amount of FXS time-locked and minted as pitchFXS.', +}; + + +Object.keys(config).forEach(chain => { + const { factory, fromBlock, } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + if (chain === 'ethereum') + await computePitchfxsTvl(api) + const logs = await getLogs2({ + api, + factory, + eventAbi: 'event NewMaturityCreated (uint256 deploymentIndex, address depositor, address[] receipts)', + fromBlock, + }) + + const vaults = logs.map(log => log.depositor) + const tokens = await api.multiCall({ abi: 'address:getUnderlying', calls: vaults }) + return api.sumTokens({ tokensAndOwners2: [tokens, vaults] }) + } + } +}) + +const computePitchfxsTvl = async (api) => { + const balance = await api.call({ + target: ethereum_pitchfxs, + params: [], + abi: 'erc20:totalSupply', + }); + + api.addToken(ADDRESSES.ethereum.FXS, balance); +} diff --git a/projects/hub3-ee/index.js b/projects/hub3-ee/index.js index 1ae76f86a8..369792591d 100644 --- a/projects/hub3-ee/index.js +++ b/projects/hub3-ee/index.js @@ -1,19 +1,6 @@ const { PublicKey } = require("@solana/web3.js"); -const { sumTokens2, getProvider, getConnection, } = require("../helper/solana"); -const { Program } = require("@project-serum/anchor"); -const sdk = require('@defillama/sdk') +const { getConnection, } = require("../helper/solana"); -async function _tvl() { - const provider = getProvider(); - const programId = new PublicKey("2pi53pUUC5S4zyUU6Wrbe6EfYXS9LNcpikpwPFahtQQw"); - const program = new Program(sharesIDL, programId, provider); - let accounts = await program.account.issuer.all(); - accounts = accounts.filter(i => +i.account.holders > 0) - accounts.sort((a, b) => +b.account.holders - a.account.holders) - sdk.log(accounts.length) - console.log(accounts.slice(0, 10).map(i => i.account.span)) - return sumTokens2({ solOwners: accounts.map(i => i.publicKey) }) -} async function tvl() { const programId = new PublicKey("2pi53pUUC5S4zyUU6Wrbe6EfYXS9LNcpikpwPFahtQQw"); @@ -36,61 +23,3 @@ module.exports = { tvl, }, }; - -const sharesIDL = { - version: '0.1.0', - name: 'shares', - instructions: [], - accounts: [ - { - name: 'issuer', - type: { - kind: 'struct', - fields: [ - { - name: 'issuerKey', - type: 'publicKey' - }, - { - name: 'price', - type: 'u64' - }, - { - name: 'totalShares', - type: 'u64' - }, - { - name: 'totalFees', - type: 'u64' - }, - { - name: 'bump', - type: 'u8' - }, - { - name: 'holders', - type: 'u32' - }, - { - name: 'migration', - type: 'bool' - }, - { - name: 'a', - type: 'u64' - }, - { - name: 'b', - type: 'u64' - }, - { - name: 'd', - type: 'u64' - } - ] - } - }, - ], - errors: [] -} -//test it diff --git a/projects/huckleberry-lending/index.js b/projects/huckleberry-lending/index.js index 0316dbf678..3d8df54037 100644 --- a/projects/huckleberry-lending/index.js +++ b/projects/huckleberry-lending/index.js @@ -1,18 +1,7 @@ -const { usdCompoundExports } = require('../helper/compound') -const sdk = require('@defillama/sdk') - +const { compoundExports2 } = require('../helper/compound') const unitroller = '0xcffef313b69d83cb9ba35d9c0f882b027b846ddc' -const lendingMarket = usdCompoundExports(unitroller, "moonriver", "0x455D0c83623215095849AbCF7Cc046f78E3EDAe0") - - - module.exports = { - methodology: "Liquidity on DEX and supplied and borrowed amounts found using the comptroller address(0xcffef313b69d83cb9ba35d9c0f882b027b846ddc)", - misrepresentedTokens: true, - moonriver: { - tvl: lendingMarket.tvl, - borrowed: lendingMarket.borrowed - } + moonriver: compoundExports2({ comptroller: unitroller, cether: '0x455d0c83623215095849abcf7cc046f78e3edae0' }), } \ No newline at end of file diff --git a/projects/huma/index.js b/projects/huma/index.js index fd27dc2d22..a174d7192b 100644 --- a/projects/huma/index.js +++ b/projects/huma/index.js @@ -14,7 +14,7 @@ const config = { module.exports = { methodology: 'sum all tvls from all pools', - start: 1716248276, //2023-05-01 + start: '2024-05-21', //2023-05-01 } Object.keys(config).forEach(chain => { diff --git a/projects/hundredfinance/index.js b/projects/hundredfinance/index.js index 54510aaca7..09e4115b04 100644 --- a/projects/hundredfinance/index.js +++ b/projects/hundredfinance/index.js @@ -1,76 +1,20 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const {compoundExports, compoundExportsWithAsyncTransform} = require('../helper/compound') -const sdk = require("@defillama/sdk"); -const BigNumber = require("bignumber.js"); +const { compoundExports2 } = require('../helper/compound') const comptroller = "0x0f390559f258eb8591c8e31cf0905e97cf36ace2" -const usdcEth = ADDRESSES.ethereum.USDC -const usdcFantom = ADDRESSES.fantom.USDC -const usdcArbitrum = ADDRESSES.arbitrum.USDC - -const daiEth = ADDRESSES.ethereum.DAI -const daiFantom = ADDRESSES.fantom.DAI - -const usdtEth = ADDRESSES.ethereum.USDT -const usdtArbitrum = ADDRESSES.arbitrum.USDT - -const usdcFantomBAMM = "0xEDC7905a491fF335685e2F2F1552541705138A3D" -const daiFantomBAMM = "0x6d62d6Af9b82CDfA3A7d16601DDbCF8970634d22" -const usdcArbitrumBAMM = "0x04208f296039f482810B550ae0d68c3E1A5EB719" -const usdtArbitrumBAMM = "0x24099000AE45558Ce4D049ad46DDaaf71429b168" - - -const bamms = { - "fantom" : [ - {"bamm" : usdcFantomBAMM, "underlying" : usdcFantom, "underlyingEth" : usdcEth }, - { "bamm" : daiFantomBAMM, "underlying" : daiFantom, "underlyingEth" : daiEth } - ], - "arbitrum" : [ - {"bamm" : usdcArbitrumBAMM, "underlying" : usdcArbitrum, "underlyingEth" : usdcEth }, - { "bamm" : usdtArbitrumBAMM, "underlying" : usdtArbitrum, "underlyingEth" : usdtEth } - ] -} - -async function bammTvlFunc(chain, retTvl, unixTimestamp, ethBlock, chainBlocks) { - const block = chainBlocks[chain] - - const balances = await retTvl(unixTimestamp, ethBlock, chainBlocks) - - for(let bamm of bamms[chain]) { - const bammBalance = ( - await sdk.api.erc20.balanceOf({ - target: bamm["underlying"], - owner: bamm["bamm"], - block: block, - chain: chain, - }) - ).output; - - const ethToken = bamm["underlyingEth"] - sdk.util.sumSingleBalance(balances, ethToken, bammBalance) - } - - return balances -} - -function tvlWithBamm() { - const chain = arguments[1] - const retVal = compoundExportsWithAsyncTransform(...arguments) - return {tvl: async(...args)=> bammTvlFunc(chain, retVal.tvl, ...args), borrowed: retVal.borrowed} -} - -module.exports={ +module.exports = { hallmarks: [ [1647302400, "Reentrancy attack"], [1681541920, "Protocol hacked (oc Optimism)"], ], - ethereum:compoundExports(comptroller, "ethereum", "0xfCD8570AD81e6c77b8D252bEbEBA62ed980BD64D", ADDRESSES.ethereum.WETH), - arbitrum:tvlWithBamm(comptroller, "arbitrum", "0x8e15a22853A0A60a0FBB0d875055A8E66cff0235", ADDRESSES.arbitrum.WETH), - fantom:tvlWithBamm(comptroller, "fantom", "0xfCD8570AD81e6c77b8D252bEbEBA62ed980BD64D", ADDRESSES.fantom.WFTM), - harmony:compoundExportsWithAsyncTransform(comptroller, "harmony", "0xbb93C7F378B9b531216f9aD7b5748be189A55807", ADDRESSES.harmony.WONE), - moonriver:compoundExportsWithAsyncTransform("0x7d166777bd19a916c2edf5f1fc1ec138b37e7391", "moonriver", "0xd6fcBCcfC375c2C61d7eE2952B329DcEbA2D4e10", "0x98878b06940ae243284ca214f92bb71a2b032b8a"), - xdai:compoundExportsWithAsyncTransform("0x6bb6ebCf3aC808E26545d59EA60F27A202cE8586", "xdai", "0x6eDCB931168C9F7C20144f201537c0243b19dCA4", ADDRESSES.xdai.WXDAI), - polygon:compoundExportsWithAsyncTransform("0xedba32185baf7fef9a26ca567bc4a6cbe426e499", "polygon", "0xEbd7f3349AbA8bB15b897e03D6c1a4Ba95B55e31", ADDRESSES.polygon.WMATIC_2), - optimism:compoundExportsWithAsyncTransform("0x5a5755E1916F547D04eF43176d4cbe0de4503d5d", "optimism", "0x1A61A72F5Cf5e857f15ee502210b81f8B3a66263", ADDRESSES.tombchain.FTM), + ethereum: compoundExports2({ comptroller, cether: '0xfcd8570ad81e6c77b8d252bebeba62ed980bd64d' }), + arbitrum: compoundExports2({ comptroller, cether: '0x8e15a22853a0a60a0fbb0d875055a8e66cff0235' }), + fantom: compoundExports2({ comptroller, cether: '0xfCD8570AD81e6c77b8D252bEbEBA62ed980BD64D' }), + harmony: compoundExports2({ comptroller, cether: '0xbb93c7f378b9b531216f9ad7b5748be189a55807' }), + moonriver: compoundExports2({ comptroller: "0x7d166777bd19a916c2edf5f1fc1ec138b37e7391", cether: '0xd6fcbccfc375c2c61d7ee2952b329dceba2d4e10' }), + xdai: compoundExports2({ comptroller: "0x6bb6ebCf3aC808E26545d59EA60F27A202cE8586", cether: '0x6edcb931168c9f7c20144f201537c0243b19dca4' }), + polygon: compoundExports2({ comptroller: "0xedba32185baf7fef9a26ca567bc4a6cbe426e499", cether: '0xEbd7f3349AbA8bB15b897e03D6c1a4Ba95B55e31' }), + optimism: compoundExports2({ comptroller: "0x5a5755E1916F547D04eF43176d4cbe0de4503d5d", cether: '0x1A61A72F5Cf5e857f15ee502210b81f8B3a66263' }), } + +module.exports.optimism.borrowed = () => ({}) diff --git a/projects/huobi/index.js b/projects/huobi/index.js index 2eee4134fa..5f92f4e4d5 100644 --- a/projects/huobi/index.js +++ b/projects/huobi/index.js @@ -1,200 +1,235 @@ -const { cexExports } = require('../helper/cex') -const { mergeExports, sliceIntoChunks, sleep } = require('../helper/utils') -const { post, get } = require('../helper/http') -const sdk = require('@defillama/sdk') +const { cexExports } = require("../helper/cex"); +const { mergeExports, sliceIntoChunks, sleep } = require("../helper/utils"); +const { post, get } = require("../helper/http"); +const sdk = require("@defillama/sdk"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + const config = { bitcoin: { - owners: [ - '12qTdZHx6f77aQ74CPCZGSY47VaRwYjVD8', - '143gLvWYUojXaWZRrxquRKpVNTkhmr415B', - // '1KVpuCfhftkzJ67ZUegaMuaYey7qni7pPj', this wallet is backing USDD acording here https://prnt.sc/i3cFaak7H9Y8. For that reason, it should not included as HTX. - //These 3 addresses has 48,555 #Bitcoin. This is only less than 3% of the total high value assets we have, including btc, usd, stablecoins, T-bills.. According to Justin Sun https://twitter.com/justinsuntron/status/1590311559242612743 - '14XKsv8tT6tt8P8mfDQZgNF8wtN5erNu5D', - '1LXzGrDQqKqVBqxfGDUyhC6rTRBN5s8Sbj', - '1HckjUpRGcrrRAtFaaCAUaGjsPx9oYmLaZ', // add on 08/08/2023 (we defillama) - '1L15W6b9vkxV81xW5HDtmMBycrdiettHEL', // add on 08/08/2023 (we defillama) - '14o5ywJJmLPJe8egNo7a5fSdtEgarkus33', // add on 08/08/2023 (we defillama) - '1BuiWj9wPbQwNY97xU53LRPhzqNQccSquM', // add on 08/08/2023 (we defillama) - '1AQLXAB6aXSVbRMjbhSBudLf1kcsbWSEjg', // add on 23/02/2024 (we defillama) - '1ENWYLQZJRAZGtwBmoWrhmTtDUtJ5LseVj' - ], + owners: bitcoinAddressBook.huobi, }, ethereum: { owners: [ - '0xa929022c9107643515f5c777ce9a910f0d1e490c', - '0x18709e89bd403f470088abdacebe86cc60dda12e', - '0xcac725bef4f114f728cbcfd744a731c2a463c3fc', - '0x0511509A39377F1C6c78DB4330FBfcC16D8A602f', - '0x1205E4f0D2f02262E667fd72f95a68913b4F7462', - '0xE4818f8fDe0C977A01DA4Fa467365B8bF22b071E', - '0x5C985E89DDe482eFE97ea9f1950aD149Eb73829B', - '0xc589b275e60dda57ad7e117c6dd837ab524a5666', - '0x6b2286fc3a9265bab3f064808022aca54de4b6ce', // add on 08/08/2023 (we defillama) - '0x3d655889d197125fb90dcb72e4a287a8410ed1b9', // add on 08/08/2023 (we defillama) - '0x2abc22eb9a09ebbe7b41737ccde147f586efeb6a', // add on 08/08/2023 (we defillama) - '0xa5d7f0f7027fa8f4d1be8042e1e43bbdec36951e', // add on 08/08/2023 (we defillama) - '0xeee28d484628d41a82d01e21d12e2e78d69920da', // add on 08/08/2023 (we defillama) - '0x6748f50f686bfbca6fe8ad62b22228b87f31ff2b', // add on 08/08/2023 (we defillama) - '0x34189c75cbb13bdb4f5953cda6c3045cfca84a9e', // add on 08/08/2023 (we defillama) - '0x1062a747393198f70f71ec65a582423dba7e5ab3', // add on 08/08/2023 (we defillama) - '0xab5c66752a9e8167967685f1450532fb96d5d24f', // add on 08/08/2023 (we defillama) - '0xdb0e89a9b003a28a4055ef772e345e8089987bfd', // add on 08/08/2023 (we defillama) - '0xfdb16996831753d5331ff813c29a93c76834a0ad', // add on 08/08/2023 (we defillama) - '0x46705dfff24256421a05d056c29e81bdc09723b8', // add on 08/08/2023 (we defillama) - '0xfd54078badd5653571726c3370afb127351a6f26', // add on 08/08/2023 (we defillama) - '0x07ef60deca209ea0f3f3f08c1ad21a6db5ef9d33', // add on 08/08/2023 (we defillama) - '0x18916e1a2933cb349145a280473a5de8eb6630cb', // add on 08/08/2023 (we defillama) - '0xfa4b5be3f2f84f56703c42eb22142744e95a2c58', // add on 08/08/2023 (we defillama) - '0x0a98fb70939162725ae66e626fe4b52cff62c2e5', // add on 08/08/2023 (we defillama) - '0x918800e018a0eeea672740f88a60091c7d327a79', // add on 08/08/2023 (we defillama) - '0xadb2b42f6bd96f5c65920b9ac88619dce4166f94', // add on 08/08/2023 (we defillama) - '0x42dc966b7ecc3c6cc73e7bc04862859d5bddce65', // add on 08/08/2023 (we defillama) - '0xe8d8a02601f54acb6fb69537be1f1d7cc76ccd8c', // add on 08/08/2023 (we defillama) - '0xf881bcb3705926cea9c598ab05a837cf41a833a9', // add on 08/08/2023 (we defillama) - '0xa03400e098f4421b34a3a44a1b4e571419517687', - '0x598273ea2cabd9f798564877851788c5e0d5b7b9', // start add on 23/02/2024 (we defillama) - '0x4fb312915b779b1339388e14b6d079741ca83128', - '0x30741289523c2e4d2a62c7d6722686d14e723851', - '0xe93381fb4c4f14bda253907b18fad305d799241a', // end add on 23/02/2024 (we defillama) - '0x6663613FbD927cE78abBF7F5Ca7e2c3FE0d96d18', // add on 22/07/2024 + "0xa929022c9107643515f5c777ce9a910f0d1e490c", + "0x18709e89bd403f470088abdacebe86cc60dda12e", + "0xcac725bef4f114f728cbcfd744a731c2a463c3fc", + "0x0511509A39377F1C6c78DB4330FBfcC16D8A602f", + "0x1205E4f0D2f02262E667fd72f95a68913b4F7462", + "0xE4818f8fDe0C977A01DA4Fa467365B8bF22b071E", + "0x5C985E89DDe482eFE97ea9f1950aD149Eb73829B", + "0xc589b275e60dda57ad7e117c6dd837ab524a5666", + "0x6b2286fc3a9265bab3f064808022aca54de4b6ce", // add on 08/08/2023 (we defillama) + "0x3d655889d197125fb90dcb72e4a287a8410ed1b9", // add on 08/08/2023 (we defillama) + "0x2abc22eb9a09ebbe7b41737ccde147f586efeb6a", // add on 08/08/2023 (we defillama) + "0xa5d7f0f7027fa8f4d1be8042e1e43bbdec36951e", // add on 08/08/2023 (we defillama) + "0xeee28d484628d41a82d01e21d12e2e78d69920da", // add on 08/08/2023 (we defillama) + "0x6748f50f686bfbca6fe8ad62b22228b87f31ff2b", // add on 08/08/2023 (we defillama) + "0x34189c75cbb13bdb4f5953cda6c3045cfca84a9e", // add on 08/08/2023 (we defillama) + "0x1062a747393198f70f71ec65a582423dba7e5ab3", // add on 08/08/2023 (we defillama) + "0xab5c66752a9e8167967685f1450532fb96d5d24f", // add on 08/08/2023 (we defillama) + "0xdb0e89a9b003a28a4055ef772e345e8089987bfd", // add on 08/08/2023 (we defillama) + "0xfdb16996831753d5331ff813c29a93c76834a0ad", // add on 08/08/2023 (we defillama) + "0x46705dfff24256421a05d056c29e81bdc09723b8", // add on 08/08/2023 (we defillama) + "0xfd54078badd5653571726c3370afb127351a6f26", // add on 08/08/2023 (we defillama) + "0x07ef60deca209ea0f3f3f08c1ad21a6db5ef9d33", // add on 08/08/2023 (we defillama) + "0x18916e1a2933cb349145a280473a5de8eb6630cb", // add on 08/08/2023 (we defillama) + "0xfa4b5be3f2f84f56703c42eb22142744e95a2c58", // add on 08/08/2023 (we defillama) + "0x0a98fb70939162725ae66e626fe4b52cff62c2e5", // add on 08/08/2023 (we defillama) + "0x918800e018a0eeea672740f88a60091c7d327a79", // add on 08/08/2023 (we defillama) + "0xadb2b42f6bd96f5c65920b9ac88619dce4166f94", // add on 08/08/2023 (we defillama) + "0x42dc966b7ecc3c6cc73e7bc04862859d5bddce65", // add on 08/08/2023 (we defillama) + "0xe8d8a02601f54acb6fb69537be1f1d7cc76ccd8c", // add on 08/08/2023 (we defillama) + "0xf881bcb3705926cea9c598ab05a837cf41a833a9", // add on 08/08/2023 (we defillama) + "0xa03400e098f4421b34a3a44a1b4e571419517687", + "0x598273ea2cabd9f798564877851788c5e0d5b7b9", // start add on 23/02/2024 (we defillama) + "0x4fb312915b779b1339388e14b6d079741ca83128", + "0x30741289523c2e4d2a62c7d6722686d14e723851", + "0xe93381fb4c4f14bda253907b18fad305d799241a", // end add on 23/02/2024 (we defillama) + "0x6663613FbD927cE78abBF7F5Ca7e2c3FE0d96d18", // add on 22/07/2024 ], blacklistedTokens: [ - '0x0316eb71485b0ab14103307bf65a021042c6d380', // HBTC , we already track their backed BTC (1btc wallet on the list) - ] + "0x0316eb71485b0ab14103307bf65a021042c6d380", // HBTC , we already track their backed BTC (1btc wallet on the list) + ], }, polygon: { owners: [ - '0xd70250731a72c33bfb93016e3d1f0ca160df7e42', - '0x9a7ffd7f6c42ab805e0edf16c25101964c6326b6', // add on 23/02/2024 - '0x18709e89bd403f470088abdacebe86cc60dda12e', - '0x2177c77a1f3c4900de7668662706633db4688726', - ] + "0xd70250731a72c33bfb93016e3d1f0ca160df7e42", + "0x9a7ffd7f6c42ab805e0edf16c25101964c6326b6", // add on 23/02/2024 + "0x18709e89bd403f470088abdacebe86cc60dda12e", + "0x2177c77a1f3c4900de7668662706633db4688726", + ], }, litecoin: { owners: [ - 'MNky8PL58UjL14mcZm3ESvEkYQkzMY9kfu', - 'LYmdXiH1u6UN2bFetfTGnNuFgEG64FWVLU', - 'MGZv8pEkrsmpa2YAXRVXTtdCPBMnnR28fY', - 'MCRXTQ5uuBh6Qt8t4LuqZNvruZ5SmWXjrY' - ] + "MNky8PL58UjL14mcZm3ESvEkYQkzMY9kfu", + "LYmdXiH1u6UN2bFetfTGnNuFgEG64FWVLU", + "MGZv8pEkrsmpa2YAXRVXTtdCPBMnnR28fY", + "MCRXTQ5uuBh6Qt8t4LuqZNvruZ5SmWXjrY", + ], }, solana: { owners: [ - '88xTWZMeKfiTgbfEmPLdsUCQcZinwUfk25EBQZ21XMAZ', - 'BY4StcU9Y2BpgH8quZzorg31EGE4L1rjomN8FNsCBEcx', // add on 23/02/2024 - '8NBEbxLknGv5aRYefFrW2qFXoDZyi9fSHJNiJRvEcMBE', - '5bJcc9eb2XE7mqcET2xDuAdMGuXWybb4YPmAHLjKLhQG', - ] + "88xTWZMeKfiTgbfEmPLdsUCQcZinwUfk25EBQZ21XMAZ", + "BY4StcU9Y2BpgH8quZzorg31EGE4L1rjomN8FNsCBEcx", // add on 23/02/2024 + "8NBEbxLknGv5aRYefFrW2qFXoDZyi9fSHJNiJRvEcMBE", + "5bJcc9eb2XE7mqcET2xDuAdMGuXWybb4YPmAHLjKLhQG", + ], }, tron: { owners: [ - 'TYh6mgoMNZTCsgpYHBz7gttEfrQmDMABub', - 'TKgD8Qnx9Zw3DNvG6o83PkufnMbtEXis4T', - 'TCQQjfccKdMi4CnPAzmZW5TALH4HbwceVb', - 'TNaRAoLUyYEV2uF7GUrzSjRQTU8v5ZJ5VR', - 'TDToUxX8sH4z6moQpK3ZLAN24eupu2ivA4', - 'TCiRCBNFrL6bFKWL94yWQi5hNMGNp1Nu27', - 'TGn1uvntAVntT1pG8o7qoKkbViiYfeg6Gj', - 'TAuUCiH4JVNBZmDnEDZkXEUXDARdGpXTmX', - 'TF2fmSbg5HAD34KPUH7WtWCxxvgXHohzYM', - 'THZovMcKoZaV9zzFTWteQYd2f3NEvnzxAM', - // 'TZ1SsapyhKNWaVLca6P2qgVzkHTdk6nkXa', // this wallet is backing USDD acording here https://prnt.sc/lvIQUtCNbk2X. For that reason, it should not included as HTX. - 'TDvf1dSBhR7dEskJs17HxGHheJrjXhiFyM', - 'TUJGLHo3rq4EAUY1LHRhNkHPX8qmrv9WFs', // add on 08/08/2023 (we defillama) - 'TRSXRWudzfzY4jH7AaMowdMNUXDkHisbcd', // add on 08/08/2023 (we defillama) - 'TU1ZA8T2g8PvLK8BfM7N94xpmSSpyfxZoK', - 'TFTWNgDBkQ5wQoP8RXpRznnHvAVV8x5jLu', // add on 23/02/2024 - 'TK86Qm97uM848dMk8G7xNbJB7zG1uW3h1n', - 'TT5iK8oqGEyRKJAnRwrLSZ4fM5y77F2LNT', - ] + "TYh6mgoMNZTCsgpYHBz7gttEfrQmDMABub", + "TKgD8Qnx9Zw3DNvG6o83PkufnMbtEXis4T", + "TCQQjfccKdMi4CnPAzmZW5TALH4HbwceVb", + "TNaRAoLUyYEV2uF7GUrzSjRQTU8v5ZJ5VR", + "TDToUxX8sH4z6moQpK3ZLAN24eupu2ivA4", + "TCiRCBNFrL6bFKWL94yWQi5hNMGNp1Nu27", + "TGn1uvntAVntT1pG8o7qoKkbViiYfeg6Gj", + "TAuUCiH4JVNBZmDnEDZkXEUXDARdGpXTmX", + "TF2fmSbg5HAD34KPUH7WtWCxxvgXHohzYM", + "THZovMcKoZaV9zzFTWteQYd2f3NEvnzxAM", + // 'TZ1SsapyhKNWaVLca6P2qgVzkHTdk6nkXa', // this wallet is backing USDD acording here https://prnt.sc/lvIQUtCNbk2X. For that reason, it should not included as HTX. + "TDvf1dSBhR7dEskJs17HxGHheJrjXhiFyM", + "TUJGLHo3rq4EAUY1LHRhNkHPX8qmrv9WFs", // add on 08/08/2023 (we defillama) + "TRSXRWudzfzY4jH7AaMowdMNUXDkHisbcd", // add on 08/08/2023 (we defillama) + "TU1ZA8T2g8PvLK8BfM7N94xpmSSpyfxZoK", + "TFTWNgDBkQ5wQoP8RXpRznnHvAVV8x5jLu", // add on 23/02/2024 + "TK86Qm97uM848dMk8G7xNbJB7zG1uW3h1n", + "TT5iK8oqGEyRKJAnRwrLSZ4fM5y77F2LNT", + ], }, algorand: { - owners: ['J4AEINCSSLDA7LNBNWM4ZXFCTLTOZT5LG3F5BLMFPJYGFWVCMU37EZI2AM'] + owners: ["J4AEINCSSLDA7LNBNWM4ZXFCTLTOZT5LG3F5BLMFPJYGFWVCMU37EZI2AM"], }, avax: { owners: [ - '0xe195b82df6a797551eb1acd506e892531824af27', - '0xa77ff0e1c52f58363a53282624c7baa5fa91687d', //start add on 23/02/2024 - '0x18709e89bd403f470088abdacebe86cc60dda12e', - '0x8b6a3587676719a4fecbb24b503a3634c44a44d5', - ] + "0xe195b82df6a797551eb1acd506e892531824af27", + "0xa77ff0e1c52f58363a53282624c7baa5fa91687d", //start add on 23/02/2024 + "0x18709e89bd403f470088abdacebe86cc60dda12e", + "0x8b6a3587676719a4fecbb24b503a3634c44a44d5", + ], }, eos: { - owners: ['vuniyuoxoeub'], + owners: ["vuniyuoxoeub"], }, ripple: { owners: [ - 'rKUDvXFJMFu65LqPTH3Yfpii4rbKT9bSQT', - 'raC4udvEeeni6aLPHbz9RKjHTQiWxKPfom', - 'ra4haepf6fehiCfVvB33j1D7vmv7JJD8M5', // add on 23/02/2024 - 'rNPuS242i9ufMPEMusnjYPxyyu4STqSDGq', - 'rPzT7GA6vWU3PvYSXBpdP5fQPnzwVLwL24', + "rKUDvXFJMFu65LqPTH3Yfpii4rbKT9bSQT", + "raC4udvEeeni6aLPHbz9RKjHTQiWxKPfom", + "ra4haepf6fehiCfVvB33j1D7vmv7JJD8M5", // add on 23/02/2024 + "rNPuS242i9ufMPEMusnjYPxyyu4STqSDGq", + "rPzT7GA6vWU3PvYSXBpdP5fQPnzwVLwL24", ], }, arbitrum: { owners: [ - '0xf2dbc42875e7764edbd89732a15214a9a0deb085', - '0xce7ec11a5f306c6b896526149db1a86c7d1531e2', // add on 23/02/2024 - '0x18709e89bd403f470088abdacebe86cc60dda12e', - '0x82d015d74670d8645b56c3f453398a3e799ee582', - ], + "0xf2dbc42875e7764edbd89732a15214a9a0deb085", + "0xce7ec11a5f306c6b896526149db1a86c7d1531e2", // add on 23/02/2024 + "0x18709e89bd403f470088abdacebe86cc60dda12e", + "0x82d015d74670d8645b56c3f453398a3e799ee582", + ], }, optimism: { owners: [ - '0x9ef21be1c270aa1c3c3d750f458442397fbffcb6', - '0xe0b7a39fef902c21bad124b144c62e7f85f5f5fa', // add on 23/02/2024 - '0x18709e89bd403f470088abdacebe86cc60dda12e', - '0xd3cc0c7d40366a061397274eae7c387d840e6ff8' - ], + "0x9ef21be1c270aa1c3c3d750f458442397fbffcb6", + "0xe0b7a39fef902c21bad124b144c62e7f85f5f5fa", // add on 23/02/2024 + "0x18709e89bd403f470088abdacebe86cc60dda12e", + "0xd3cc0c7d40366a061397274eae7c387d840e6ff8", + ], }, bsc: { owners: [ - '0xdd3cb5c974601bc3974d908ea4a86020f9999e0c', // add on 23/02/2024 - '0x18709e89bd403f470088abdacebe86cc60dda12e', - '0xafdfd157d9361e621e476036fee62f688450692b', - ], + "0xdd3cb5c974601bc3974d908ea4a86020f9999e0c", // add on 23/02/2024 + "0x18709e89bd403f470088abdacebe86cc60dda12e", + "0xafdfd157d9361e621e476036fee62f688450692b", + ], }, -} + starknet: { + owners: [ + "0x03fd14213a96e9d90563ebe1b224f357c6481a755ee6f046c8ce9acd9b8654a7", + ], + }, + doge: { + owners: [ + "DRRU8L7fF4k9w7SF3Z6ei8onPCsh9hjGX1", + "9ztZpRN3v9xv5JhAT7MTtmy4DfyMEAG8YU", + "DLzCvKskasu4Adj3XgbyNitKBukBSa5JPP", + ], + }, + cardano: { + owners: [ + "addr1q8wk8rw6xeqzerhahlhweuukkxme0fjsy4xqsqze3m4r8lxavwxa5djq9j80m0lwaneedvdhj7n9qf2vpqq9nrh2x07qfmr8sf", + "addr1q9n8v7e76pt4mmvxqprc4k7nk5nqz4x2flplfr0azq9dtnz5wckfyaph0sj98f7nc5g98q9dv2v8ece9jm8w30upgfvq4zhpjy", + "DdzFFzCqrhsuQV5ohP1EBh9d4UjmmWDb2Vui2s2SACSBDeEW74kHhp3zj9hvLFDb9mK7hRr7fbctu1UYatPaF1omXiXPwf12bn7DQvbT" + ], + }, + core: { + owners: [ + "0x18709e89bd403f470088abdacebe86cc60dda12e", + "0x6635dbb3d78671be495a6d876940752a0c4e7743", + "0x27387a41fd7c6cf86b4c96a54a4a1d8bd0b926bf" + ], + }, + sui: { + owners: [ + "0d9948b61478ec1609b4c00cd0162131109e7fd60d7d2ebb539cb414f3ec7b9d", + "0x1f7b27844f2c4a0262b2c481f7ab956d10ace524c5a7b06c3742cfb8701db714", + ], + }, + ton: { + owners: [ + "EQBf6sUcCkUrRCMzmpOW22P3BOD4XgL_solOp3M4n6Vb8_1c", + "EQC2bRkktc-ZATV_VK8B1dmN3KXZRKiblMiyvFW_aUzNTwxS", + "EQA9Q1P4Wtm5orpfWgV_DTbqoeRUx7h8LCqdx38x5RwIkuS3", + "EQCFr3jo0DXpIBF82mVGFc3zcdRkSAtinhENPFMQ2FqzYqDB" + ], + }, +}; module.exports = mergeExports([ cexExports(config), - { ethereum: { tvl: stakingTVL, } } -]) -module.exports.methodology = 'We added the wallets from here https://github.com/huobiapi/Tool-Node.js-VerifyAddress/blob/main/snapshot/huobi_por_20230701.csv . We are not tracking 3 wallets, 2 on Heco Chain, 1 on BTTC chain. We also count stUSDT.' -module.exports.hallmarks = [ - [1723066836,"remove usdd collateral"] -] - + { ethereum: { tvl: stakingTVL } }, +]); +module.exports.methodology = + "We added the wallets from here https://github.com/huobiapi/Tool-Node.js-VerifyAddress/blob/main/snapshot/huobi_por_20230701.csv . We are not tracking 3 wallets, 2 on Heco Chain, 1 on BTTC chain. We also count stUSDT."; +module.exports.hallmarks = [[1723066836, "remove usdd collateral"]]; async function stakingTVL() { - const withdrawalAddress = '0x08DeB6278D671E2a1aDc7b00839b402B9cF3375d' - let fetchedValidators = 2400 - let size = 200 - let ethBalance = (await sdk.api2.eth.getBalance({ target: '0x08DeB6278D671E2a1aDc7b00839b402B9cF3375d'})).output/1e18 + const withdrawalAddress = "0x08DeB6278D671E2a1aDc7b00839b402B9cF3375d"; + let fetchedValidators = 2400; + let size = 200; + let ethBalance = + ( + await sdk.api2.eth.getBalance({ + target: "0x08DeB6278D671E2a1aDc7b00839b402B9cF3375d", + }) + ).output / 1e18; do { - const validators = (await get(`https://beaconcha.in/api/v1/validator/withdrawalCredentials/${withdrawalAddress}?limit=${size}&offset=${fetchedValidators}`)).data.map(i => i.publickey) - fetchedValidators += validators.length - await addValidatorBalance(validators) - await sleep(10000) - } while (fetchedValidators % size === 0) + const validators = ( + await get( + `https://beaconcha.in/api/v1/validator/withdrawalCredentials/${withdrawalAddress}?limit=${size}&offset=${fetchedValidators}` + ) + ).data.map((i) => i.publickey); + fetchedValidators += validators.length; + await addValidatorBalance(validators); + await sleep(10000); + } while (fetchedValidators % size === 0); return { - ethereum: ethBalance - } + ethereum: ethBalance, + }; async function addValidatorBalance(validators) { if (validators.length > 100) { - const chunks = sliceIntoChunks(validators, 100) - for (const chunk of chunks) await addValidatorBalance(chunk) + const chunks = sliceIntoChunks(validators, 100); + for (const chunk of chunks) await addValidatorBalance(chunk); return; } - const { data } = await post('https://beaconcha.in/api/v1/validator', { - indicesOrPubkey: validators.join(',') - }) + const { data } = await post("https://beaconcha.in/api/v1/validator", { + indicesOrPubkey: validators.join(","), + }); - - data.forEach((i) => ethBalance += i.balance/1e9) + data.forEach((i) => (ethBalance += i.balance / 1e9)); } -} \ No newline at end of file +} diff --git a/projects/hydro-farm/index.js b/projects/hydro-farm/index.js new file mode 100644 index 0000000000..8260dc4d3e --- /dev/null +++ b/projects/hydro-farm/index.js @@ -0,0 +1,94 @@ +const { queryContract, endPoints, } = require("../helper/chain/cosmos"); +const { get } = require("../helper/http"); +const { injective: { mitoVaultQuery } } = require("../helper/chain/rpcProxy") + +// Contract +const lrpManager = "inj1rv7ztpa8nkywc89a05eys52fzgezlnzjq3grkz" +const vaultMaster = "inj1vcqkkvqs7prqu70dpddfj7kqeqfdz5gg662qs3" + +async function getAllRegisteredVaults(api) { + let startAfterSubaccount + let results = [] + let loop = true + + while (loop) { + const { registered_vaults } = await queryContract({ + chain: api.chain, + contract: vaultMaster, + data: { + get_registered_vaults: { + start_after_subaccount: startAfterSubaccount, + limit: 30, + } + } + }) + + if (registered_vaults.length === 0) { + loop = false + return results + } + + results.push(...registered_vaults) + const lastOne = results[results.length - 1] + startAfterSubaccount = lastOne.vault.master_subaccount_id + } +} + +async function getMitoLpPrice(api, lrp, vaults) { + const { vault_subaccount_id } = await queryContract({ chain: api.chain, contract: lrp.yield_proxy_address, data: { config: {} } }) + const { vault: { address } } = vaults.find((vault) => vault.vault.master_subaccount_id === vault_subaccount_id) + const res = await mitoVaultQuery({ address }) + return res.lpTokenPrice +} + +async function tvl(api) { + const { lrps } = await queryContract({ chain: api.chain, contract: lrpManager, data: { lrps: { limit: 100 } } }) + const vaults = await getAllRegisteredVaults(api) + + for (const lrp of lrps) { + const { total_supply: lrpTotalSupply } = await queryContract({ chain: api.chain, contract: lrp.lrp_address, data: { token_info: {} } }) + if (+lrpTotalSupply === 0) continue; + + const { contract_info } = await get(`${endPoints[api.chain]}/cosmwasm/wasm/v1/contract/${lrp.yield_proxy_address}`, undefined, api.chain) + const isDojo = contract_info.label.includes("dojo") + const isMito = contract_info.label.includes("mito") + + if (isDojo) { + const asset_infos = lrp.bond_tokens.map((i) => { + if (i.native) return { native_token: { denom: i.native } } + console.error({ lrp, i, contract_info, lrpTotalSupply }) + throw new Error("Unknown asset_infos") + }) + + // get LP contract address + const { contract_addr } = await queryContract({ + chain: api.chain, contract: 'inj1pc2vxcmnyzawnwkf03n2ggvt997avtuwagqngk', data: { + pair: { asset_infos } + } + }) + const { assets, total_share } = await queryContract({ chain: api.chain, contract: contract_addr, data: { pool: {} } }) + const ratio = lrpTotalSupply / total_share + assets.forEach((asset) => { + api.add(getToken(asset), asset.amount * ratio) + }) + + } else if (isMito) { + const lpPrice = await getMitoLpPrice(api, lrp, vaults) + api.addUSDValue(lpPrice * lrpTotalSupply) + } else { + console.error("Unknown lrp type", { lrp, contract_info }) + } + } +} + +module.exports = { + methodology: "Liquidity on hydro-protocol", + misrepresentedTokens: true, + injective: { + tvl, + }, +}; + +function getToken(asset) { + return asset.info.native_token?.denom ?? asset.info.token?.contract_addr +} \ No newline at end of file diff --git a/projects/hydrometer/index.js b/projects/hydrometer/index.js new file mode 100644 index 0000000000..9a59ad55e9 --- /dev/null +++ b/projects/hydrometer/index.js @@ -0,0 +1,14 @@ +const { uniTvlExport } = require('../helper/calculateUniTvl.js') + +module.exports = { + misrepresentedTokens: true, + hallmarks: [ + [1732734407,"Rug Pull"] + ], + base: { + tvl: uniTvlExport("0xF60caCf0A3daa5B6a79ca6594BEF38F85391AE0A", undefined, undefined, { + allPairsLength: 'uint256:allPoolsLength', + allPairs: 'function allPools(uint256) view returns (address)', + }, { useDefaultCoreAssets: true, hasStablePools: true, }), + }, +} \ No newline at end of file diff --git a/projects/hydt/index.js b/projects/hydt/index.js index 0b916251df..977fc48e64 100644 --- a/projects/hydt/index.js +++ b/projects/hydt/index.js @@ -42,7 +42,7 @@ async function staking(api) { module.exports = { misrepresentedTokens: true, methodology: "Retrieving the reserve BNB balance for TVL. Retrieving the staked amounts for HYDT from the earn (HYDT staking) contract and the LP Tokens from the farm contract for staking.", - start: 1693763345, + start: '2023-09-03', bsc: { tvl, staking, diff --git a/projects/hyperdrive/index.js b/projects/hyperdrive/index.js new file mode 100644 index 0000000000..adffd93fc4 --- /dev/null +++ b/projects/hyperdrive/index.js @@ -0,0 +1,60 @@ +const ethers = require("ethers") +const { nullAddress } = require('../helper/unwrapLPs') + +const FUTURE_REGISTRY_ADDRESS = "0x6668310631Ad5a5ac92dC9549353a5BaaE16C666" +const GET_POOL_CONFIG_ABI = "function getPoolConfig() view returns (tuple(address baseToken, address vaultSharesToken, address linkerFactory, bytes32 linkerCodeHash, uint256 initialVaultSharePrice, uint256 minimumShareReserves, uint256 minimumTransactionAmount, uint256 circuitBreakerDelta, uint256 positionDuration, uint256 checkpointDuration, uint256 timeStretch, address governance, address feeCollector, address sweepCollector, address checkpointRewarder, tuple(uint256 curve, uint256 flat, uint256 governanceLP, uint256 governanceZombie) fees))"; +const POSITION_ABI = "function position(bytes32 id, address user) view returns (tuple(uint256 supplyShares, uint128 borrowShares, uint128 collateral))"; + +const config = { + ethereum: { registry: '0xbe082293b646cb619a638d29e8eff7cf2f46aa3a', }, + xdai: { registry: '0x666fa9ef9bca174a042c4c306b23ba8ee0c59666', }, + base: {}, + linea: {}, +} + +Object.keys(config).forEach(chain => module.exports[chain] = { tvl }) + +async function tvl(api) { + const { registry = FUTURE_REGISTRY_ADDRESS, } = config[api.chain] + const instances = await api.fetchList({ lengthAbi: 'getNumberOfInstances', itemAbi: 'getInstanceAtIndex', target: registry }) + const vaultNames = await api.multiCall({ abi: 'string:name', calls: instances }) + const vaultConfig = await api.multiCall({ abi: GET_POOL_CONFIG_ABI, calls: instances }) + const vaults = vaultNames.map((name, i) => ({ name, config: vaultConfig[i], address: instances[i] })) + const morphoVaults = [] + const morphoVaultInfos = [] + const tokensAndOwners = [] + + for (const vault of vaults) { + if (vault.name.includes("Morpho")) { + morphoVaults.push(vault.address) + morphoVaultInfos.push(vault) + } else if (vault.config.vaultSharesToken !== nullAddress) { + tokensAndOwners.push([vault.config.vaultSharesToken, vault.address]) + } else { + tokensAndOwners.push([vault.config.baseToken, vault.address]) + } + } + + const mVaults = await api.multiCall({ abi: 'address:vault', calls: morphoVaults}) + const mCollaterals = await api.multiCall({ abi: 'address:collateralToken', calls: morphoVaults}) + const mOracles = await api.multiCall({ abi: 'address:oracle', calls: morphoVaults}) + const mIrms = await api.multiCall({ abi: 'address:irm', calls: morphoVaults}) + const mLltvs = await api.multiCall({ abi: 'uint256:lltv', calls: morphoVaults}) + + const morphoMarketIds = morphoVaultInfos.map((vault, i) => { + const abiCoder = ethers.AbiCoder.defaultAbiCoder(); + const packedIds = abiCoder.encode( + ['address', 'address', 'address', 'address', 'uint256'], + [vault.config.baseToken, mCollaterals[i], mOracles[i], mIrms[i], mLltvs[i]] + ); + return ethers.keccak256(packedIds); + }) + const positionCalls = morphoVaults.map((vault, i) => ({ target: mVaults[i], abi: POSITION_ABI, params: [morphoMarketIds[i], vault], })) + const positions = await api.multiCall({ calls: positionCalls, abi: POSITION_ABI }) + positions.forEach((position, i) => { + api.add(morphoVaultInfos[i].config.baseToken, position.supplyShares / 1e6) + api.add(mCollaterals[i], position.borrowShares * -1 / 1e6) + }) + + return api.sumTokens({ tokensAndOwners }) +} diff --git a/projects/hyperfluid/index.js b/projects/hyperfluid/index.js new file mode 100644 index 0000000000..aea4412314 --- /dev/null +++ b/projects/hyperfluid/index.js @@ -0,0 +1,68 @@ +const { function_view } = require("../helper/chain/aptos"); + +async function _getPoolInfo(offset, limit) { + const poolInfo = await function_view({ + functionStr: "0x6cd504c269458a3a24ef21063c21bd222eb82cb75ac51f4622787a23558fa488::liquidity_pool::all_pools_with_info", + args: [String(offset), String(limit)], + type_arguments: [], + }); + + return poolInfo; +} + +async function _getCoinInfo(faType) { + const coinInfo = await function_view({ + functionStr: "0x1::coin::paired_coin", + args: [faType], + type_arguments: [], + }); + + if (coinInfo.vec.length > 0) { + const address = coinInfo.vec[0].account_address; + const module = Buffer.from(coinInfo.vec[0].module_name.replace('0x', ''), 'hex').toString('utf-8'); + const struct = Buffer.from(coinInfo.vec[0].struct_name.replace('0x', ''), 'hex').toString('utf-8'); + + return (address + "::" + module + "::" + struct); + } else { + return null; + } +} + +async function getPoolInfo() { + let offset = 0; + let limit = 100; + let poolInfo = []; + let [data, pager] = await _getPoolInfo(offset, limit); + + if (data.length !== 0) { + poolInfo = poolInfo.concat(data); + } + + while (offset + limit < pager.total) { + offset += limit; + [data, pager] = await _getPoolInfo(offset, limit); + poolInfo = poolInfo.concat(data); + } + + return poolInfo; +} + +module.exports = { + timetravel: false, + methodology: "Counts the total liquidity in all pools on Hyperfluid.", + aptos: { + tvl: async (api) => { + const poolInfo = await getPoolInfo(); + let balances = {}; + + for (const pool of poolInfo) { + const coin1 = await _getCoinInfo(pool.token_1.inner) || pool.token_1.inner; + const coin2 = await _getCoinInfo(pool.token_2.inner) || pool.token_2.inner; + + api.add(coin1, pool.token_1_reserve); + api.add(coin2, pool.token_2_reserve); + } + }, + }, +}; + diff --git a/projects/hyperliquid-hlp/index.js b/projects/hyperliquid-hlp/index.js new file mode 100644 index 0000000000..4ee18f0853 --- /dev/null +++ b/projects/hyperliquid-hlp/index.js @@ -0,0 +1,13 @@ +const { get } = require("../helper/http"); + +async function tvl(api) { + const data = await get("https://stats-data.hyperliquid.xyz/Mainnet/vaults"); + const hlp = data.find((d) => d.summary?.vaultAddress?.toLowerCase() === "0xdfc24b077bc1425ad1dea75bcb6f8158e10df303"); + api.addUSDValue(+hlp.summary.tvl) +} + +module.exports = { + hyperliquid: { tvl }, + misrepresentedTokens: true, + doublecounted: true, +} \ No newline at end of file diff --git a/projects/hyperliquid-perp/index.js b/projects/hyperliquid-perp/index.js index 5c14aacaae..4e7268de7f 100644 --- a/projects/hyperliquid-perp/index.js +++ b/projects/hyperliquid-perp/index.js @@ -3,7 +3,7 @@ const { post } = require('../helper/http') async function tvl(api) { let data= await post('https://api.hyperliquid.xyz/info', {"type":"tvlBreakdown"}) data = data.find(i => i.protocol === "Hyperliquid Perps DEX") - data.tokens.forEach(i => api.addCGToken('tether', +i.usdcValue)) + data.tokens.forEach(i => api.addCGToken('usd-coin', +i.usdcValue)) } module.exports = { diff --git a/projects/hyperliquid-spot/index.js b/projects/hyperliquid-spot/index.js index ce0db61f47..fd4550ff1d 100644 --- a/projects/hyperliquid-spot/index.js +++ b/projects/hyperliquid-spot/index.js @@ -1,12 +1,40 @@ -const { post } = require('../helper/http') +const ADDRESSES = require('../helper/coreAssets.json') +const axios = require('axios') -async function tvl(api) { - let data= await post('https://api.hyperliquid.xyz/info', {"type":"tvlBreakdown"}) - data = data.find(i => i.protocol === "Hyperliquid Spot DEX") - data.tokens.forEach(i => api.addCGToken('tether', +i.usdcValue)) +const USDC = ADDRESSES.ethereum.USDC +const API_URL = 'https://api.hyperliquid.xyz/info' + +const assetsInfos = async () => { + const payload = { "type": "spotMetaAndAssetCtxs" } + const { data } = await axios.post(API_URL, payload) + + return data[0].tokens.map((token) => { + const ctxToken = data[1].find((item) => item.coin.replace("@", "") == token.index); + return { ...token, ...ctxToken }; + }); +} + +const tvl = async (api) => { + const assets = await assetsInfos() + const payload = { "type": "spotClearinghouseState", "user": "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF" } + const { data } = await axios.post(API_URL, payload) + + const tokens = data.balances.map((token) => { + const tokenHold = assets.find((item) => item.index == token.token) + return { ...token, ...tokenHold } + }) + + const totalBalance = tokens.reduce((sum, token) => { + const total = parseFloat(token.hold || 0); + const markPx = parseFloat(token.markPx || 0); + return sum + (total * markPx); + }, 0); + + return api.add(USDC, totalBalance * 1e6, { skipChain: true }) } module.exports = { + methodology: 'TVL represents assets locked in limit order on the spot order book', misrepresentedTokens: true, hyperliquid: { tvl } } \ No newline at end of file diff --git a/projects/hyperlock/index.js b/projects/hyperlock/index.js index 5c0497aae5..1d7a76babb 100644 --- a/projects/hyperlock/index.js +++ b/projects/hyperlock/index.js @@ -1,30 +1,42 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokens2 } = require("../helper/unwrapLPs"); -const { cachedGraphQuery } = require('../helper/cache') -const v2Deposits = "0xC3EcaDB7a5faB07c72af6BcFbD588b7818c4a40e"; -const v3Deposits = "0xc28EffdfEF75448243c1d9bA972b97e32dF60d06"; +const { sumTokens2 } = require("../helper/unwrapLPs") +const { staking } = require('../helper/staking') + +const HYPER = "0xEC73284E4EC9bcea1A7DDDf489eAA324C3F7dd31"; +const THRUST = "0xE36072DD051Ce26261BF50CD966311cab62C596e"; +const HYPER_THRUST = "0x569FcbDa292f1a69AB14e401bAD13Cc0E1DEC790"; + +const BOOSTER = "0x08d46dC9E455c9B97E671b6291a54ba5668B94AC"; +const VOTER_PROXY = "0x70A8075C73A9Ff9616CB5aF6BB09c04844718F27"; +const LOCKER = "0xc1De2d060a18CFfAB121E90118e380629d11977E"; + +const abi = { + "poolLength": "uint256:poolLength", + "poolInfo": "function poolInfo(uint256) view returns (address lptoken, address token, address gauge, address crvRewards, address stash, bool shutdown)" +} // https://docs.hyperlock.finance/developers/hyperlock-contracts module.exports = { doublecounted: true, blast: { tvl, + staking: staking(LOCKER, HYPER) }, } -const query = `{ - pools(where:{type: V2}) { id type } -}` +// node test.js projects/hyperlock/index.js +async function tvl(api) { + // THRUST + const totalSupply = await api.call({ target: HYPER_THRUST, abi: 'erc20:totalSupply' }); + api.add(THRUST, totalSupply); -async function tvl(api) { - const { pools } = await cachedGraphQuery('hyperlock/v2', 'https://graph.hyperlock.finance/subgraphs/name/hyperlock/points-blast-mainnet', query) - const tokens = pools.map(i => i.id) - await sumTokens2({ api, owner: v2Deposits, tokens: pools.map(i => i.id), resolveLP: true, }) - await sumTokens2({ api, tokensAndOwners: [ - [ADDRESSES.blast.USDB, '0x390b781BAf1e6Db546cF4e3354b81446947838d2'], - [ADDRESSES.blast.WETH, '0x1856c7e0b559e9d7287473cb4b4786398db4032a'], - ] }) - return sumTokens2({ api, owner: v3Deposits, resolveUniV3: true }) + // v2 pools + const pools = await api.fetchList({ target: BOOSTER, itemAbi: abi.poolInfo, lengthAbi: abi.poolLength, }); + pools.shift(); // remove the first pool, which is hyperTHRUST/THRUST stable pool + const tokensAndOwners = pools.map(p => [p.lptoken, p.gauge]); + await sumTokens2({ tokensAndOwners, resolveLP: true, api}); + + // v3 pools + await sumTokens2({ api, owners: [VOTER_PROXY], resolveUniV3: true }); } \ No newline at end of file diff --git a/projects/iTrustfinance/index.js b/projects/iTrustfinance/index.js index 3b82c128a9..b66dd9fd19 100644 --- a/projects/iTrustfinance/index.js +++ b/projects/iTrustfinance/index.js @@ -1,7 +1,4 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const vaults = [ // sNXM (Nexus Mutual Strategy Vault) @@ -31,29 +28,10 @@ const erc20Tokens = [ ]; /*** Vaults and staking TVL Portions ***/ -const ethTvl = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - for (const vault of vaults) { - const supply = ( - await sdk.api.abi.call({ - abi: abi.totalSupply, - target: vault, - ethBlock, - }) - ).output; - - sdk.util.sumSingleBalance(balances, NXM, supply); - } - - await sumTokensAndLPsSharedOwners( - balances, - erc20Tokens.map(token => [token, false]), - vaults, - chainBlocks["ethereum"] - ); - - return balances; +const ethTvl = async (api) => { + const supplies = await api.multiCall({ abi: 'erc20:totalSupply', calls: vaults}) + api.add(NXM, supplies) + return api.sumTokens({ owners: vaults, tokens: erc20Tokens}) }; module.exports = { diff --git a/projects/ibtc/index.js b/projects/ibtc/index.js new file mode 100644 index 0000000000..f31ee5d6c6 --- /dev/null +++ b/projects/ibtc/index.js @@ -0,0 +1,14 @@ +const ibtcContract = "0x8154Aaf094c2f03Ad550B6890E1d4264B5DdaD9A"; + +async function tvl(api) { + // 1iBTC=1XBTC=1BTC(exsat)=1BTC + const ibtcTotalSupply = await api.call({ target: ibtcContract, abi: "uint256:totalSupply" }) + api.addCGToken('bitcoin', ibtcTotalSupply / 1e18) +} + +module.exports = { + doublecounted: true, + xsat: { + tvl + }, +} diff --git a/projects/icecreamswap/index.js b/projects/icecreamswap/index.js index 0f5623414d..738a9baeed 100644 --- a/projects/icecreamswap/index.js +++ b/projects/icecreamswap/index.js @@ -4,6 +4,7 @@ const config = { shimmer_evm: '0x24cb308a4e2F3a4352F513681Bd0c31a0bd3BA31', bob: '0x7b2a5C88AB9367147F6ac384F857CbaDF5aA70a7', lightlink_phoenix: '0xC87De04e2EC1F4282dFF2933A2D58199f688fC3d', + taiko: '0xC87De04e2EC1F4282dFF2933A2D58199f688fC3d' } const chains = [...Object.keys(config), 'base', 'telos', 'core', 'dogechain', 'fuse', 'xdc', 'bitgert', 'scroll', 'neon_evm', 'blast' ] diff --git a/projects/iceswap/index.js b/projects/iceswap/index.js index eb2acf7e1d..26fcdd3422 100644 --- a/projects/iceswap/index.js +++ b/projects/iceswap/index.js @@ -1,7 +1,7 @@ const { getUniTVL } = require("../helper/unknownTokens"); const FACTORY = "0x79b8F15a3bEEcd5014B748499Ec89692665ea368"; -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true, }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, }) module.exports = { misrepresentedTokens: true, diff --git a/projects/ichifarm/index.js b/projects/ichifarm/index.js index 15462f2083..4317e4b75a 100644 --- a/projects/ichifarm/index.js +++ b/projects/ichifarm/index.js @@ -49,6 +49,8 @@ const config = { base: { vaultConfigs: [ { factory: '0xfBf38920cCbCFF7268Ad714ae5F9Fad6dF607065', fromBlock: 10607512, isAlgebra: false, }, // Equalizer + { factory: '0x24430E837efB64EF87bb32be03437fc6005EEF74', fromBlock: 22095330, isAlgebra: false, }, // PancakeSwap + { factory: '0xaBe5B5AC472Ead17B4B4CaC7fAF42430748ab3b3', fromBlock: 12978552, isAlgebra: false, }, // Uniswap ] }, blast: { @@ -67,6 +69,7 @@ const config = { celo: { vaultConfigs: [ { factory: '0x9FAb4bdD4E05f5C023CCC85D2071b49791D7418F', fromBlock: 24256269, isAlgebra: false, }, // Uniswap v3 + { factory: '0x8D05f6870106707BaeCFCf5C0570DB7a583eb92A', fromBlock: 27821113, isAlgebra: false, }, // Ubeswap ] }, eon: { @@ -95,6 +98,11 @@ const config = { { factory: '0x89FFdaa18b296d9F0CF02fBD88e5c633FEFA5f34', fromBlock: 79156621, isAlgebra: true, }, // Spiritswap ] }, + flare: { + vaultConfigs: [ + { factory: '0x85a4dd4ed356A7976a8302b1b690202d58583c55', fromBlock: 30879155, isAlgebra: false, }, // SparkDex + ] + }, fuse: { vaultConfigs: [ { factory: '0xfBf38920cCbCFF7268Ad714ae5F9Fad6dF607065', fromBlock: 30026180, isAlgebra: false, }, // Voltage @@ -124,6 +132,11 @@ const config = { { factory: '0xbBB97d634460DACCA0d41E249510Bb741ef46ad3', fromBlock: 39366721, isAlgebra: false, }, // Cleo ] }, + mode: { + vaultConfigs: [ + { factory: '0x9FAb4bdD4E05f5C023CCC85D2071b49791D7418F', fromBlock: 12395812, isAlgebra: true, }, // Kim + ] + }, op_bnb: { vaultConfigs: [ { factory: '0xADDA3A15EA71c223a82Af86d4578EF2B076035F1', fromBlock: 13911597, isAlgebra: true, }, // Thena @@ -143,17 +156,38 @@ const config = { { factory: '0x1721cB3ff3cAF70a79bDE9d771B27646ed8115b1', fromBlock: 11102475, isAlgebra: true, }, // QuickSwap ] }, + real: { + vaultConfigs: [ + { factory: '0x860F3881aCBbF05D48a324C5b8ca9004D31A146C', fromBlock: 599247, isAlgebra: false, }, // Pearl + ] + }, + rsk: { + vaultConfigs: [ + { factory: '0x8cCd02E769e6A668a447Bd15e134C31bEccd8182', fromBlock: 6753128, isAlgebra: false, }, // Uniswap + ] + }, scroll: { vaultConfigs: [ { factory: '0xb42D5956cDe4386B65C087CfCD16910aB6114F15', fromBlock: 5264782, isAlgebra: false, }, // Metavault { factory: '0x9FAb4bdD4E05f5C023CCC85D2071b49791D7418F', fromBlock: 4728729, isAlgebra: false, }, // Uniswap ] }, + sonic: { + vaultConfigs: [ + { factory: '0x7D18F2D60E4fd6F485419727515807d09A542eb9', fromBlock: 1971740, isAlgebra: false, }, // Equalizer + { factory: '0x34513e8A327987Bb44acF5A925a7f3b4092d8b5F', fromBlock: 1476044, isAlgebra: true, }, // SwapX + ] + }, taiko: { vaultConfigs: [ { factory: '0x9FAb4bdD4E05f5C023CCC85D2071b49791D7418F', fromBlock: 11578, isAlgebra: true, }, // Henjin ] }, + zircuit: { + vaultConfigs: [ + { factory: '0x1A58D4CFF22C7E2e0c4cCf4a0010b87822d024A1', fromBlock: 5104000, isAlgebra: true, }, // Ocelex + ] + }, } Object.keys(config).forEach(chain => { diff --git a/projects/idex-v4/index.js b/projects/idex-v4/index.js new file mode 100644 index 0000000000..d515e069e2 --- /dev/null +++ b/projects/idex-v4/index.js @@ -0,0 +1,8 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs') + +module.exports = { + idex: { + tvl: sumTokensExport({ owner: '0xF0b08bd86f8479a96B78CfACeb619cfFeCc5FBb5', tokens: [ADDRESSES.rari.USDC_e]}), + } +} \ No newline at end of file diff --git a/projects/idle/index.js b/projects/idle/index.js index 6cd4367607..b7cd2d799a 100644 --- a/projects/idle/index.js +++ b/projects/idle/index.js @@ -41,8 +41,7 @@ const contracts = { // "0xd0DbcD556cA22d3f3c142e9a3220053FD7a247BC", // "0x1f5A97fB665e295303D2F7215bA2160cc5313c8E", // "0x8E0A8A5c1e5B3ac0670Ea5a613bB15724D51Fc37", // Instadapp stETH - "0x9e0c5ee5e4B187Cf18B23745FCF2b6aE66a9B52f", // Amphor wstETH - "0x1EB1b47D0d8BCD9D761f52D26FCD90bBa225344C" // Ethena USDe + "0xf6223C567F21E33e859ED7A045773526E9E3c2D5" // Fasanara Yield vault ] }, polygon: { @@ -58,7 +57,14 @@ const contracts = { ] }, optimism: { - + cdos: [ + "0xD2c0D848aA5AD1a4C12bE89e713E70B73211989B" // FalconX + ] + }, + arbitrum: { + cdos: [ + "0x3919396Cd445b03E6Bb62995A7a4CB2AC544245D" // Bastion Credit Vault + ] } } @@ -120,32 +126,32 @@ async function tvl(api) { fromBlock, }) cdos.push(...logs.map(i => i.proxy)) - - const [strategyToken, token, aatrances, bbtrances, aaprices, bbprices] = await Promise.all(['address:strategyToken', "address:token", "address:AATranche", "address:BBTranche", "uint256:priceAA", "uint256:priceBB"].map(abi => api.multiCall({ abi, calls: cdos }))) - blacklistedTokens.push(...cdos) - blacklistedTokens.push(...aatrances) - blacklistedTokens.push(...bbtrances) - - // Get CDOs contract values - const contractValue = await api.multiCall({ abi: 'uint256:getContractValue', calls: cdos }) - cdos.forEach((cdo, i) => { - const tokenDecimals = tokensDecimals[token[i]] || 18 - trancheTokensMapping[aatrances[i]] = { - token: token[i], - decimals: tokenDecimals, - price: BigNumber(aaprices[i]).div(`1e${tokenDecimals}`).toFixed() - } - trancheTokensMapping[bbtrances[i]] = { - token: token[i], - decimals: tokenDecimals, - price: BigNumber(bbprices[i]).div(`1e${tokenDecimals}`).toFixed() - } - - // Get CDOs underlying tokens balances - sdk.util.sumSingleBalance(balances, token[i], contractValue[i], api.chain) - }) } + const [cdoToken, aatrances, bbtrances, aaprices, bbprices] = await Promise.all(["address:token", "address:AATranche", "address:BBTranche", "uint256:priceAA", "uint256:priceBB"].map(abi => api.multiCall({ abi, calls: cdos }))) + blacklistedTokens.push(...cdos) + blacklistedTokens.push(...aatrances) + blacklistedTokens.push(...bbtrances) + + // Get CDOs contract values + const contractValue = await api.multiCall({ abi: 'uint256:getContractValue', calls: cdos }) + cdos.forEach((cdo, i) => { + const tokenDecimals = tokensDecimals[cdoToken[i]] || 18 + trancheTokensMapping[aatrances[i]] = { + token: cdoToken[i], + decimals: tokenDecimals, + price: BigNumber(aaprices[i]).div(`1e${tokenDecimals}`).toFixed() + } + trancheTokensMapping[bbtrances[i]] = { + token: cdoToken[i], + decimals: tokenDecimals, + price: BigNumber(bbprices[i]).div(`1e${tokenDecimals}`).toFixed() + } + + // Get CDOs underlying tokens balances + sdk.util.sumSingleBalance(balances, cdoToken[i], contractValue[i], api.chain) + }) + const trancheTokensBalancesCalls = [] allTokens.forEach((tokens, i) => { diff --git a/projects/iguana-v2/index.js b/projects/iguana-v2/index.js new file mode 100644 index 0000000000..15546e8e6d --- /dev/null +++ b/projects/iguana-v2/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'etlk': '0x3eebf549D2d8839E387B63796327eE2C8f64A0C4' +}) \ No newline at end of file diff --git a/projects/iguana-v3/index.js b/projects/iguana-v3/index.js new file mode 100644 index 0000000000..7c5a9ab7d8 --- /dev/null +++ b/projects/iguana-v3/index.js @@ -0,0 +1,4 @@ +const { uniV3GraphExport } = require("../helper/uniswapV3"); + + +module.exports.etlk = { tvl: uniV3GraphExport({ name: 'iguana-etlk', graphURL: 'https://api.studio.thegraph.com/query/86688/exchange-v3-etherlink/version/latest' }) } \ No newline at end of file diff --git a/projects/illuminex/index.js b/projects/illuminex/index.js index e4f0b39cd6..33f6241155 100644 --- a/projects/illuminex/index.js +++ b/projects/illuminex/index.js @@ -7,7 +7,7 @@ const ixToken = "0x08Fe02Da45720f754e6FCA338eC1286e860d2d2f"; module.exports = { methodology: "Counts liquidity on illumineX Exchange, as well as IX token single staking together with liquidity mining locked LP", misrepresentedTokens: true, - start: 1706475600, + start: '2024-01-28', sapphire: { tvl: getUniTVL({ factory: '0x045551B6A4066db850A1160B8bB7bD9Ce3A2B5A5', useDefaultCoreAssets: true,}), staking: stakingPricedLP(stakingFarmingContractAddress, ixToken, "sapphire", "0xf0f7c4e8edb9edcbe200a4eaec384e8a48fc7815", "oasis-network", true), diff --git a/projects/iloop/iloop_sc_mainnet.json b/projects/iloop/iloop_sc_mainnet.json new file mode 100644 index 0000000000..30200dbf2c --- /dev/null +++ b/projects/iloop/iloop_sc_mainnet.json @@ -0,0 +1,169 @@ +{ + "address": "3i8rGP3ex8cjs7YYWrQeE4nWizuaStsVNUXpRGtMbs3H", + "metadata": { + "name": "iloop_sc", + "version": "0.1.0", + "spec": "0.1.0", + "description": "Created with Anchor" + }, + "instructions": [], + "accounts": [ + { + "name": "Reserve", + "discriminator": [ + 43, + 242, + 204, + 202, + 26, + 247, + 59, + 127 + ] + } + ], + "events": [], + "errors": [], + "types": [ + { + "name": "Reserve", + "serialization": "bytemuck", + "repr": { + "kind": "c" + }, + "type": { + "kind": "struct", + "fields": [ + { + "name": "lending_market", + "type": "pubkey" + }, + { + "name": "liquidity_mint", + "type": "pubkey" + }, + { + "name": "liquidity_supply", + "type": "pubkey" + }, + { + "name": "liquidity_supply_amount", + "type": "u64" + }, + { + "name": "liquidity_price", + "type": "u64" + }, + { + "name": "liquidity_price_account", + "type": "pubkey" + }, + { + "name": "liquidity_price_max_age_price_seconds", + "type": "u64" + }, + { + "name": "liquidity_price_updated_at", + "type": "u64" + }, + { + "name": "collateral_mint", + "type": "pubkey" + }, + { + "name": "collateral_supply", + "type": "pubkey" + }, + { + "name": "collateral_supply_amount", + "type": "u64" + }, + { + "name": "borrow_rate", + "type": "u64" + }, + { + "name": "deposit_rate", + "type": "u64" + }, + { + "name": "borrow_enabled", + "type": "u64" + }, + { + "name": "borrowed_amount", + "type": "u64" + }, + { + "name": "borrowed_collateral_amount", + "type": "u64" + }, + { + "name": "max_withdraw_per_day", + "type": "u64" + }, + { + "name": "withdrew_today", + "type": "u64" + }, + { + "name": "last_withdrew_at", + "type": "i64" + }, + { + "name": "margin_rate", + "type": "u64" + }, + { + "name": "optimal_utilization_rate_1", + "type": "u64" + }, + { + "name": "optimal_utilization_rate_2", + "type": "u64" + }, + { + "name": "max_borrow_rate", + "type": "u64" + }, + { + "name": "reserve_factor", + "type": "u64" + }, + { + "name": "max_multiply", + "type": "u64" + }, + { + "name": "max_supply", + "type": "u64" + }, + { + "name": "liquidation_threshold", + "type": "u64" + }, + { + "name": "liquidation_penalty", + "type": "u64" + }, + { + "name": "flash_loan_enabled", + "type": "u64" + }, + { + "name": "utilization_cap", + "type": "u64" + }, + { + "name": "apy", + "type": "u64" + }, + { + "name": "updated_at", + "type": "i64" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/projects/iloop/index.js b/projects/iloop/index.js new file mode 100644 index 0000000000..64523d8dc8 --- /dev/null +++ b/projects/iloop/index.js @@ -0,0 +1,27 @@ +const { Program, } = require('@coral-xyz/anchor'); +const iloopIdl = require('./iloop_sc_mainnet.json'); +const { sumTokens2, getProvider } = require("../helper/solana"); + +async function tvl() { + const provider = getProvider(); + const iloopProgram = new Program(iloopIdl, provider); + const reserves = await iloopProgram.account.reserve.all(); + const tokenAccounts = reserves.map(({ account }) => account.liquiditySupply.toBase58()); + return sumTokens2({ tokenAccounts }) +} +async function borrowed(api) { + const provider = getProvider(); + const iloopProgram = new Program(iloopIdl, provider); + const reserves = await iloopProgram.account.reserve.all(); + for (const { account } of reserves) { + api.add(account.liquidityMint.toBase58(), account.borrowedAmount) + } +} + +module.exports = { + timetravel: false, + solana: { + tvl, borrowed, + }, + methodology: 'TVL consists of deposits made to the protocol, borrowed tokens are not counted.', +}; diff --git a/projects/imbtc.js b/projects/imbtc.js index 7d80f59ec1..57fffe932e 100644 --- a/projects/imbtc.js +++ b/projects/imbtc.js @@ -1,11 +1,15 @@ - -async function tvl(api) { - const imBTC = '0x3212b29E33587A00FB1C83346f5dBFA69A458923' - const supply = await api.call({ abi: 'erc20:totalSupply', target: imBTC }) - api.add(imBTC, supply) -} +const { sumTokens } = require('./helper/chain/bitcoin') +const { imbtc } = require('./helper/bitcoin-book/index.js') module.exports = { - ethereum: { tvl }, - methodology: `TVL for imBTC consists of the BTC deposits in custody that were used to mint imBTC` + ethereum: { tvl: () => ({}) }, + bitcoin: { + tvl: () => sumTokens({ + owners: imbtc, + }) + }, + methodology: `TVL for imBTC consists of the BTC deposits in custody that were used to mint imBTC`, + hallmarks: [ + [Math.floor(new Date('2024-01-31') / 1e3), 'Project ceases operation'], + ], } diff --git a/projects/impermax/impermaxHelper.js b/projects/impermax/impermaxHelper.js index b52e855789..b748b736bf 100644 --- a/projects/impermax/impermaxHelper.js +++ b/projects/impermax/impermaxHelper.js @@ -92,6 +92,7 @@ function impermaxHelper(exportsObj, config, blacklistedPools) { async function getUVTokens(rawPools, underlyings, uSymbols, api) { var impermaxSymbol; + var stableImpermaxSymbol; switch (api.chain) { case 'ethereum': impermaxSymbol = 'UNI-V2' @@ -110,7 +111,8 @@ function impermaxHelper(exportsObj, config, blacklistedPools) { case 'optimism': default: impermaxSymbol = 'STKD-UNI-V2' - return underlyings.filter((_, i) => uSymbols[i] === impermaxSymbol) + stableImpermaxSymbol = 'STKD-STBL' + return underlyings.filter((_, i) => uSymbols[i] === impermaxSymbol || uSymbols[i] === stableImpermaxSymbol) } } diff --git a/projects/impermax/index.js b/projects/impermax/index.js index 9a991c4522..337639cc74 100644 --- a/projects/impermax/index.js +++ b/projects/impermax/index.js @@ -71,6 +71,24 @@ const config = { factories: [ '0xa058Ba91958cD30D44c7B0Cf58A369876Fb70B05' ] + }, + real: { + factories: [ + '0x3b1f3a48a70e372144307a4b126a5cda46e169ad', + '0x2944e1544cE201ae19e6385490bBA13DaA5f44e4' + ] + }, + blast: { + factories: [ + '0x7b816c1ccafa7d3e71e279ed9dc3226484f6ef87', + '0xb3c80cfcdd177e3fce2e66870e4768d1ead89f6c', + '0xfff3C004D115002E0fe8Ef08bBB127aEF5B97bE1' + ] + }, + sonic: { + factories: [ + '0x26fca5916c20D252feEF7A58E39886d3d3112b91' + ] } } @@ -83,14 +101,29 @@ const blacklistedPools = { '0xdf5096804705d135656b50b62f9ee13041253d97', // YPIE-ETH ], polygon: [ - '0x76483d4ba1177f69fa1448db58d2f1dbe0fb65fa', // IMX-WETH - '0x8ce3bf56767dd87e87487f3fae63e557b821ea32', // IMX-WETH - '0xd4f5f9643a4368324ac920414781b1c5655baed1', // IMX-WETH - '0x5f819f510ca9b1469e6a3ffe4ecd7f0c1126f8f5', // IMX-WETH - '0x23312fceadb118381c33b34343a61c7812f7a6a3', // IMX-WETH - '0x5ed3147f07708a269f744b43c489e6cf3b60aec4', // USDT-DAI - '0xb957d5a232eebd7c4c4b0a1af9f2043430304e65', // USDC-rUSD - '0x87B94444d0f2c1e4610A2De8504D5d7b81898221', // QUICK-POLYDOGE + // QuickSwap + "0x5ed3147F07708A269f744B43c489e6Cf3B60aEC4", //DAI-USDT + "0x87B94444d0f2c1e4610A2De8504D5d7b81898221", //QUICK-POLYDOGE + "0x5f819f510ca9b1469e6a3ffe4ecd7f0c1126f8f5", //IMX-ETH [OLD] + "0xb957D5a232EEbD7C4c4B0A1af9F2043430304E65", //rUSD-USDC + "0x23312FCEADb118381C33B34343A61c7812f7a6a3", //IMX-ETH + "0x76483D4Ba1177F69FA1448dB58d2f1dBE0Fb65fa", //IMX-QUICK + "0xD4f5F9643A4368324aC920414781B1c5655BaeD1", //IMX-QUICK + "0x8ce3bf56767dD87E87487f3fae63e557B821Ea32", //IMX-WETH + "0x8ce3bf56767dd87e87487f3fae63e557b821ea32", //IMX-ETH + // Pearl + "0x2712fbb291d8784b7bf75e50f472968d0bd43fc1", //USDR-ETH + "0x7c91c66f7df3d23858937b0d419fd10b72bdc6d3", //USDR-BTC + "0xbde0990EeB2509931a0f73f78010F00191D746BA", //USDR-MATIC + "0x281Db118b0CB2865d9370c98AaC6e42523582AED", //USDR-PEARL + "0x822363B6dFaa8C41c1ADa904F1829143375EA6Da", //USDR-TNGBL + "0x6467FeF60a061f541967415fcBcDFb6Dc964f711", //USDR-IBEX + // Satin + "0x7166f0509bd1deedf90e42046025d929078089b4", //MATIC-LIBERA + "0x06D3AE1Cfe7D3D27B8b9f541E2d76e5f33778923", //SATIN-CASH + "0x3E626179241585235FF7B002cc4dC5439338990e", //IBEX-WETH + "0xCB091859dd1d994d513721fB9722Ca9f8839A825", //ETH-CASH + "0x7b750A5C4c0c7b36D206383353AB3c54DeE74deF", //MATIC-CASH ], arbitrum: [ '0xb7e5e74b52b9ada1042594cfd8abbdee506cc6c5', // IMX-WETH @@ -99,10 +132,30 @@ const blacklistedPools = { '0x4062f4775bc001595838fbaae38908b250ee07cf', // SWPR-ETH ], avax: [ - '0xde0037afbe805c00d3cec67093a40882880779b7', // IMX-WETH - '0xe9439f67201894c30f1c1c6b362f0e9195fb8e2c', // IMX-WETH - '0xa34862a7de51a0e1aee6d3912c3767594390586d', // IMX-WETH - '0x69c1c44e8742b66d892294a7eeb9aac51891b0eb', // USDC-UST + // Traderjoe + "0x21249FC0Ad45fB3e33C12BE0fA2B81000A290C5f", //SPELL-AVAX + "0xa34862a7de51a0e1aee6d3912c3767594390586d", //IMX-AVAX OLD + // Pangolin V1 + "0xE9439f67201894C30F1C1c6b362F0e9195FB8e2C", //IMX-AVAX + // Pangolin V2 + "0xde0037aFbE805C00d3CEc67093A40882880779b7", //IMX-AVAX + "0x69c1C44e8742b66D892294a7EEB9aac51891B0EB", //USDC-UST + "0xc6E68d77d0f4FA925A1cF2611dAB6b10900Eaf2B", //UST-AVAX + // Thorus + "0xd60709441b483453e84aD8E1C30F2e9EE116851D", //USDC-THO + // Pangolin + "0xE429Fbdc3275e29cA4c11F9c1EB4C8Cee1fCAda3", //WBTC-USDC + "0xc532a2885027677c4BE61F710F7D41941dBaD1B1", //ETH-AVAX + "0x677dCE0683e6Db30325cD97e8d04D138F34821A6", //PNG-AVAX + "0x65A9a0b25A2397e67Fe688361Bf4113cf4Fa5313", //USDT-AVAX + // Glacier + "0x96f1F13865f11E2EC0E15051415f420dAC440EC1", //WETH-USDT.e + "0x674A38dE6dC83FBde29784C9A974D38a11EbFB37", //BTC.b-AVAX + "0x4ab56108FD36F5da28b56a43b17909f745d560e4", //AVAX-USDT + "0x29327d37Ee0395a22dd419E2E81F3Bf2da066cfe", //GMX-USDC + "0x0d4E0EaFA9002957371a0cadbD3BF168d6D0741A", //fBOMB-AVAX + "0x7AEDD611c361cfc53d14953A6CbDC2d4Cd48AC94", //AVAX-WMEMO + "0x8dc6fae7fedd7a60ecbb27c17af830f5811d773e", //MMTH-BTC.b ], moonriver: [ '0x6ed3bc66dfcc5ac05daec840a75836da935fac97', // IMX-WETH @@ -113,10 +166,18 @@ const blacklistedPools = { '0x877a330af63094d88792b9ca28ac36c71673eb1c', // IMX-FTM '0xb97b6ed451480fe6466a558e9c54eaac32e6c696', // OXD-FTM ], - scroll: [], + scroll: [ + "0x94d81405985A4c34EaC4945d2b98c74258EdD07F", // tkn/chi - stakedlp + "0xE8f4895DF06a0c69A9BA87509EfdBBFBAFe86c2d", // weth/tkn - stakedlp + "0x7c80Be56a6f23A3E598822648baaFD7524fe1239", // chi/wUKRE stakedlp + "0xDD14d0c651C63e1EeA5bd8b250cf99757425D68F", // chi/usdc stakedlp + ], base: [], mantle: [], - optimism: [] + optimism: [], + real: [], + blast: [], + sonic: [] } module.exports = {} diff --git a/projects/incaswap/index.js b/projects/incaswap/index.js new file mode 100644 index 0000000000..5a6ad6704a --- /dev/null +++ b/projects/incaswap/index.js @@ -0,0 +1,5 @@ +const { uniTvlExports } = require('../helper/unknownTokens'); + +module.exports = uniTvlExports({ + matchain: '0x1d9e11881Fca0e692B09AF0C0cbE70A643CB06FB' +}) diff --git a/projects/inception-lrt/index.js b/projects/inception-lrt/index.js index 3731811b65..0fa72a37e4 100644 --- a/projects/inception-lrt/index.js +++ b/projects/inception-lrt/index.js @@ -1,18 +1,19 @@ const ADDRESSES = require('../helper/coreAssets.json') async function tvl_eth(api) { - const vaults = ['0x36B429439AB227fAB170A4dFb3321741c8815e55', '0xfE715358368416E01d3A961D3a037b7359735d5e', '0x90E80E25ABDB6205B08DeBa29a87f7eb039023C2', '0x4878F636A9Aa314B776Ac51A25021C44CAF86bEd', '0xA9F8c770661BeE8DF2D026edB1Cb6FF763C780FF', '0x1Aa53BC4Beb82aDf7f5EDEE9e3bBF3434aD59F12', '0x814CC6B8fd2555845541FB843f37418b05977d8d', '0xc4181dC7BB31453C4A48689ce0CBe975e495321c', '0xC0660932C5dCaD4A1409b7975d147203B1e9A2B6', '0x6E17a8b5D33e6DBdB9fC61d758BF554b6AD93322', '0x295234B7E370a5Db2D2447aCA83bc7448f151161', '0xd0ee89d82183D7Ddaef14C6b4fC0AA742F426355'] + const vaults = ['0x36B429439AB227fAB170A4dFb3321741c8815e55', '0xfE715358368416E01d3A961D3a037b7359735d5e', '0x90E80E25ABDB6205B08DeBa29a87f7eb039023C2', '0x4878F636A9Aa314B776Ac51A25021C44CAF86bEd', '0xA9F8c770661BeE8DF2D026edB1Cb6FF763C780FF', '0x1Aa53BC4Beb82aDf7f5EDEE9e3bBF3434aD59F12', '0x814CC6B8fd2555845541FB843f37418b05977d8d', '0xc4181dC7BB31453C4A48689ce0CBe975e495321c', '0xC0660932C5dCaD4A1409b7975d147203B1e9A2B6', '0x6E17a8b5D33e6DBdB9fC61d758BF554b6AD93322', '0x295234B7E370a5Db2D2447aCA83bc7448f151161', '0xd0ee89d82183D7Ddaef14C6b4fC0AA742F426355', '0xf9D9F828989A624423C48b95BC04E9Ae0ef5Ec97'] const total_deposited = await api.multiCall({ abi: 'uint256:getTotalDeposited', calls: vaults, permitFailure: true}) // const total_withdraw = await api.multiCall({ abi: 'uint256:totalAmountToWithdraw', calls: vaults, permitFailure: true}) - const strategies = await api.multiCall({ abi: 'address:strategy', calls: vaults}) - const tokens = await api.multiCall({ abi: 'address:underlyingToken', calls: strategies}) + // const strategies = await api.multiCall({ abi: 'address:strategy', calls: vaults}) + const tokens = await api.multiCall({ abi: 'address:asset', calls: vaults}) // const result = total_deposited.map((deposited, index) => deposited - total_withdraw[index]); api.add(tokens, total_deposited) } module.exports = { hallmarks: [ - [1714953600,"Genesis Merges with InceptionLRT"] + [1714953600, "Genesis Merges with InceptionLRT"], + [1734530420, "Amphor Labs Merges with InceptionLRT"] ], doublecounted: true, ethereum: { tvl: tvl_eth, } , diff --git a/projects/increment-liquidStaking/index.js b/projects/increment-liquidStaking/index.js index 50b89e3ca2..e5c6176800 100644 --- a/projects/increment-liquidStaking/index.js +++ b/projects/increment-liquidStaking/index.js @@ -1,11 +1,12 @@ // increment liquid staking link: https://app.increment.fi/staking const { post } = require('../helper/http') -let queryLiquidStakingTVLCode = - "import DelegatorManager from 0xd6f80565193ad727\ -pub fun main(): UFix64 {\ - return DelegatorManager.getTotalValidStakingAmount()\ -}"; +let queryLiquidStakingTVLCode = ` +import DelegatorManager from 0xd6f80565193ad727 + +access(all) fun main(): UFix64 { + return DelegatorManager.getTotalValidStakingAmount() +}`; const queryCodeBase64 = Buffer.from(queryLiquidStakingTVLCode, 'utf-8').toString('base64'); diff --git a/projects/increment-protocol/index.js b/projects/increment-protocol/index.js index 0d30a34cf2..108d63ca2a 100644 --- a/projects/increment-protocol/index.js +++ b/projects/increment-protocol/index.js @@ -4,5 +4,5 @@ const { sumTokensExport } = require('../helper/unwrapLPs') module.exports = { methodology: "Counting the value of all tokens locked in the contracts to be used as collateral to trade or provide liquidity.", era: { tvl: sumTokensExport({ owner: '0xfc840c55b791a1dbaf5c588116a8fc0b4859d227', tokens: [ADDRESSES.era.USDC] }) }, - start: 1710004200 // 2024-03-09 09:10 + start: '2024-03-09' // 2024-03-09 09:10 } \ No newline at end of file diff --git a/projects/infinite/index.js b/projects/infinite/index.js new file mode 100644 index 0000000000..5b7c53d3aa --- /dev/null +++ b/projects/infinite/index.js @@ -0,0 +1,47 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const ITP_VAULT_ADDRRESS= '0x23371aEEaF8718955C93aEC726b3CAFC772B9E37' +const ITP_ON_OPTIMISM = "0x0a7B751FcDBBAA8BB988B9217ad5Fb5cfe7bf7A0"; +const VELO_PRICE_ORACLE = "0x395942C2049604a314d39F370Dfb8D87AAC89e16"; +const WETH_TOKEN_ADDRESS = ADDRESSES.optimism.WETH_1; +const VELO_TOKEN_ADDRESS = "0x3c8b650257cfb5f272f799f5e2b4e65093a11a05"; +const OP_TOKEN_ADDRESS = ADDRESSES.optimism.OP; +const USDC_OP_TOKEN_ADDRESS = ADDRESSES.optimism.USDC_CIRCLE; +const ITP_STAKED_ABI = "function getVaultInfo() view returns (uint256, uint256, uint256, uint256, uint256, uint256[], uint256)"; + +const getStakedTVL = async (api) => { + const { chain } = api + let stakedTVL = 0; + if(chain === 'optimism'){ + const fetchVeloPrice = await api.call( { + abi: "function getManyRatesWithConnectors(uint8, address[]) view returns (uint256[] memory rates)", + target: VELO_PRICE_ORACLE, + params: [ + 1, + [ + ITP_ON_OPTIMISM, + VELO_TOKEN_ADDRESS, + WETH_TOKEN_ADDRESS, + OP_TOKEN_ADDRESS, + USDC_OP_TOKEN_ADDRESS, + ], + ], + }) + const price = parseInt(fetchVeloPrice[0]) / Math.pow(10, 18) + + const stakedBalance = await api.call({ + abi: ITP_STAKED_ABI, + target: ITP_VAULT_ADDRRESS, + }); + const staked = parseInt(stakedBalance[0]) / Math.pow(10, 18) + stakedTVL = staked * price + } + api.addUSDValue(stakedTVL) +} + +module.exports = { + optimism: { + tvl: () => ({}), + staking: getStakedTVL + }, +} diff --git a/projects/infusion/index.js b/projects/infusion/index.js index 65c9f6f5d9..4b751f0c0a 100644 --- a/projects/infusion/index.js +++ b/projects/infusion/index.js @@ -3,6 +3,6 @@ const { getUniTVL } = require('../helper/unknownTokens.js') module.exports = { misrepresentedTokens: true, base: { - tvl: getUniTVL({ factory: '0x2D9A3a2bd6400eE28d770c7254cA840c82faf23f', hasStablePools: true, useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: '0x2D9A3a2bd6400eE28d770c7254cA840c82faf23f', hasStablePools: true, useDefaultCoreAssets: true, }), }, } diff --git a/projects/injective-orderbook-spot/index.js b/projects/injective-orderbook-spot/index.js new file mode 100644 index 0000000000..75da5bb07c --- /dev/null +++ b/projects/injective-orderbook-spot/index.js @@ -0,0 +1,8 @@ +const { getOrderBookTvl, TYPES } = require('../injective-orderbook/util') + +module.exports = { + timetravel: false, + injective: { + tvl: getOrderBookTvl(TYPES.SPOT), + } +} \ No newline at end of file diff --git a/projects/injective-orderbook/index.js b/projects/injective-orderbook/index.js index 4be227fa2a..7a7a4304fd 100644 --- a/projects/injective-orderbook/index.js +++ b/projects/injective-orderbook/index.js @@ -1,6 +1,8 @@ -const { getExports } = require('../helper/heroku-api') +const { getOrderBookTvl, TYPES } = require('./util') module.exports = { timetravel: false, - ...getExports("injective-orderbook", ['injective']), -} + injective: { + tvl: getOrderBookTvl(TYPES.DERIVATIVES), + } +} \ No newline at end of file diff --git a/projects/injective-orderbook/util.js b/projects/injective-orderbook/util.js new file mode 100644 index 0000000000..8a0d89ff56 --- /dev/null +++ b/projects/injective-orderbook/util.js @@ -0,0 +1,39 @@ +const { injective: { getMarkets, getOrders } } = require('../helper/chain/rpcProxy') + +const TYPES = { + BANK: 'BANK', + SPOT: 'SPOT', + DERIVATIVES: 'DERIVATIVES', +} + +function getOrderBookTvl(typeStr) { + return async (api) => { + const markets = await getMarkets({ type: typeStr }) + const orders = await getOrders({ type: typeStr, marketIds: markets.map(i => i.marketId) }) + const marketObj = {} + for (const market of markets) + marketObj[market.marketId] = market + + for (const order of orders) marketObj[order.marketId].orderbook = order.orderbook + for (const { quoteDenom, baseDenom, orderbook: { buys, sells, } } of markets) { + for (const { price, quantity } of buys) + api.add(quoteDenom, Math.floor(quantity * price)) + + for (const { quantity } of sells) { + + if (typeStr === TYPES.SPOT) { + api.add(baseDenom, Math.floor(quantity)) + } else if (typeStr === TYPES.DERIVATIVES) { + const price = buys.length ? buys[0].price : 0 + api.add(quoteDenom, Math.floor(quantity * price)) + } + } + } + return api.getBalances() + } +} + +module.exports = { + TYPES, + getOrderBookTvl +} \ No newline at end of file diff --git a/projects/ink/index.js b/projects/ink/index.js new file mode 100644 index 0000000000..960c3f1599 --- /dev/null +++ b/projects/ink/index.js @@ -0,0 +1,15 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + "0x88FF1e5b602916615391F55854588EFcBB7663f0", + "0x5d66C1782664115999C47c9fA5cd031f495D3e4F", + ], + fetchCoValentTokens: true, + }), + }, +}; diff --git a/projects/inkswap/index.js b/projects/inkswap/index.js new file mode 100644 index 0000000000..4e3cead06b --- /dev/null +++ b/projects/inkswap/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + ink: '0xBD5B41358A6601924F1Fd708aF1535a671f530A9' +}) \ No newline at end of file diff --git a/projects/inkyswap/index.js b/projects/inkyswap/index.js new file mode 100644 index 0000000000..6f52f46f15 --- /dev/null +++ b/projects/inkyswap/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + ink: '0x458C5d5B75ccBA22651D2C5b61cB1EA1e0b0f95D' +}) \ No newline at end of file diff --git a/projects/insuredefi/index.js b/projects/insuredefi/index.js index ab7335ad8e..d58c575df8 100644 --- a/projects/insuredefi/index.js +++ b/projects/insuredefi/index.js @@ -36,7 +36,7 @@ async function tvl(timestamp, block) { module.exports = { - start: 1513566671, // 2020/10/21 6:34:47 (+UTC) + start: '2017-12-18', // 2020/10/21 6:34:47 (+UTC) ethereum: { tvl } }; diff --git a/projects/intentx.js b/projects/intentx.js index 9b82e7597d..06c4e3000a 100644 --- a/projects/intentx.js +++ b/projects/intentx.js @@ -3,9 +3,9 @@ const { request, } = require("graphql-request"); const config = { - blast: { token: ADDRESSES.blast.USDB, start: 1710115200, graphUrl: "https://api.studio.thegraph.com/query/62472/intentx-analytics_082_blast/version/latest", accountSource: '0x083267D20Dbe6C2b0A83Bd0E601dC2299eD99015'}, - base: { token: ADDRESSES.base.USDbC, start: 1700006400, graphUrl: "https://api.studio.thegraph.com/query/62472/intentx-analytics_082/version/latest", accountSource: '0x8Ab178C07184ffD44F0ADfF4eA2ce6cFc33F3b86'}, - mantle: { token: ADDRESSES.mantle.USDC, start: 1712966400, graphUrl: "https://subgraph-api.mantle.xyz/subgraphs/name/mantle_intentx-analytics_082", accountSource: '0xECbd0788bB5a72f9dFDAc1FFeAAF9B7c2B26E456' }, + blast: { token: ADDRESSES.blast.USDB, start: 1710115200, graphUrl: "https://api.goldsky.com/api/public/project_cm0bho0j0ji6001t8e26s0wv8/subgraphs/intentx-blast-analytics-083/latest/gn", accountSource: '0x083267D20Dbe6C2b0A83Bd0E601dC2299eD99015'}, + base: { token: ADDRESSES.base.USDbC, start: 1700006400, graphUrl: "https://api.goldsky.com/api/public/project_cm0bho0j0ji6001t8e26s0wv8/subgraphs/intentx-base-analytics-083/latest/gn", accountSource: '0x8Ab178C07184ffD44F0ADfF4eA2ce6cFc33F3b86'}, + mantle: { token: ADDRESSES.mantle.USDC, start: 1712966400, graphUrl: "https://api.goldsky.com/api/public/project_cm0bho0j0ji6001t8e26s0wv8/subgraphs/intentx-mantle-analytics-083/latest/gn", accountSource: '0xECbd0788bB5a72f9dFDAc1FFeAAF9B7c2B26E456' }, } async function tvl(api) { @@ -46,9 +46,10 @@ module.exports = { [1704200400, "0.8.2 Migration"], [config.blast.start, "Blast Deploy"], [config.mantle.start, "Mantle Deploy"], + [1725753600, "0.8.3 Migration"] ], } Object.keys(config).forEach(chain => { module.exports[chain] = { tvl } -}) \ No newline at end of file +}) diff --git a/projects/intuition/index.js b/projects/intuition/index.js new file mode 100644 index 0000000000..4c6e84d212 --- /dev/null +++ b/projects/intuition/index.js @@ -0,0 +1,10 @@ +const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs'); + +const ETHMULTIVAULT = "0x430BbF52503Bd4801E51182f4cB9f8F534225DE5"; // Intuition's EthMultiVault contract address on Base mainnet + +module.exports = { + methodology: "The TVL is calculated based on the current ETH balance held within Intuition's EthMultiVault contract on the Base mainnet.", + base: { + tvl: sumTokensExport({ owner: ETHMULTIVAULT, tokens: [nullAddress] }), + } +} diff --git a/projects/inuswap/index.js b/projects/inuswap/index.js index 1cb8565c42..f608b398b4 100644 --- a/projects/inuswap/index.js +++ b/projects/inuswap/index.js @@ -8,6 +8,7 @@ module.exports = { hallmarks: [ [1663200000, "Rug Pull"] ], + deadFrom: '2022-09-15', dogechain: { tvl: getUniTVL({ useDefaultCoreAssets: true, diff --git a/projects/invar-finance/index.js b/projects/invar-finance/index.js index a909807781..7b1f51ad20 100644 --- a/projects/invar-finance/index.js +++ b/projects/invar-finance/index.js @@ -1,39 +1,13 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const abis = require("./abis.js"); -const BigNumber = require("bignumber.js"); +const { sumTokensExport } = require('../helper/unwrapLPs.js'); -const USDC_ADDRESS = ADDRESSES.ethereum.USDC; -const RE_NFT = "0x502818ec5767570F7fdEe5a568443dc792c4496b"; const INVARIA2222 = "0x10a92B12Da3DEE9a3916Dbaa8F0e141a75F07126"; -const toUSDCBalaces = (amount, unitPrice) => ({ - [USDC_ADDRESS] : BigNumber(amount).dp(0, BigNumber.ROUND_DOWN).times(unitPrice).toFixed(0) -}); - -async function tvl(timestamp, block) { - const stakingNFTs = (await sdk.api.abi.call({ - block, - target: RE_NFT, - abi: abis.balanceOf, - params: [INVARIA2222, 1], - })).output; - - const nftUnitPrice = (await sdk.api.abi.call({ - block, - target: RE_NFT, - abi: abis.SellingPrice, - })).output; - - return toUSDCBalaces(stakingNFTs, nftUnitPrice); -} - module.exports = { - misrepresentedTokens: true, methodology: "Counts the number of staking nfts time the unit price of nft", ethereum: { - tvl, + tvl: sumTokensExport({ owner:INVARIA2222, token: ADDRESSES.ethereum.USDC}), }, - start: 15389792, + deadFrom: '2023-11-12', }; diff --git a/projects/invariant/index.js b/projects/invariant/index.js index 0098e4a90e..82fb0475e9 100644 --- a/projects/invariant/index.js +++ b/projects/invariant/index.js @@ -1,13 +1,25 @@ const { sumTokens2 } = require('../helper/solana') +const { getConfig } = require('../helper/cache') -async function tvl() { - return sumTokens2({ owner: 'J4uBbeoWpZE8fH58PM1Fp9n9K6f1aThyeVCyRdJbaXqt' }) +const config = { + solana: 'J4uBbeoWpZE8fH58PM1Fp9n9K6f1aThyeVCyRdJbaXqt', + eclipse: 'D4P9HJYPczLFHvxBgpLKooy7eWczci8pr4x9Zu7iYCVN', } module.exports = { timetravel: false, - solana: { - tvl - }, methodology: "TVL is a sum of the locked capital in each liquidity pool", }; + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + if (chain === 'eclipse') { + const { tokensData } = await getConfig('invariant/eclipse', 'https://stats.invariant.app/svm/full_snap/eclipse-mainnet') + const tokens = tokensData.map(t => t.address) + return sumTokens2({ owner: config[chain], tokens, api }) + } + return sumTokens2({ owner: config[chain], api }) + } + } +}) diff --git a/projects/inverse-finance-firm/index.js b/projects/inverse-finance-firm/index.js index 3ea79f3943..cb1ee47c30 100644 --- a/projects/inverse-finance-firm/index.js +++ b/projects/inverse-finance-firm/index.js @@ -50,6 +50,6 @@ module.exports = { [1707177600, "Launch of sDOLA"], [1718236800, "CRV liquidation"] ], - start: 1670701200, // Dec 10 2022 + start: '2022-12-10', // Dec 10 2022 ethereum: { tvl } }; diff --git a/projects/inverse/index.js b/projects/inverse/index.js index 9f7137a697..c4e11e6c61 100644 --- a/projects/inverse/index.js +++ b/projects/inverse/index.js @@ -1,16 +1,12 @@ +const { compoundExports2 } = require('../helper/compound') const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const BigNumber = require("bignumber.js"); -const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); +const { sumTokens2 } = require("../helper/unwrapLPs"); // Anchor const anchorStart = 11915867; const comptroller = "0x4dcf7407ae5c07f8681e1659f626e114a7667339"; -const ignore = ["0x7Fcb7DAC61eE35b3D4a51117A7c58D53f0a8a670"]; // anDOLA will be counted through the stabilizer -const anETH = "0x697b4acAa24430F254224eB794d2a85ba1Fa1FB8"; -const wETH = ADDRESSES.ethereum.WETH; // Stabilizer const stabilizer = "0x7eC0D931AFFBa01b77711C2cD07c76B970795CDd"; @@ -24,190 +20,37 @@ const vaults = [ "0x2dCdCA085af2E258654e47204e483127E0D8b277", // inDAI->ETH ]; -// ask comptroller for all markets array -async function getAllTokens(block) { - let tokens = ( - await sdk.api.abi.call({ - block, - target: comptroller, - params: [], - abi: abi["getAllMarkets"], - }) - ).output; - return tokens.filter(function (token) { - return ignore.indexOf(token) === -1; - }); +async function vaultsTVL(api) { + const tokens = await api.multiCall({ abi: abi.underlying, calls: vaults}) + const bals = await api.multiCall({ abi: abi.totalSupply, calls: vaults}) + api.add(tokens, bals) } -async function getAllUnderlying(block, tokens) { - let allUnderlying = ( - await sdk.api.abi.multiCall({ - block, - calls: tokens.filter((token) => token !== anETH).map( - (token) => ({ - target: token, - }) - ), - abi: abi["underlying"], - permitFailure: true, - }) - ).output; +async function stabilizerTVL(api) { + if (api < anchorStart) + return; - allUnderlying.push({ - input: { - target: anETH, - }, - success: true, - output: wETH, - }); - return allUnderlying; + const supply = await api.call({ target: stabilizer, abi: abi["supply"], }) + api.add(dai, supply); } -async function getCashes(block, tokens) { - return ( - await sdk.api.abi.multiCall({ - block, - calls: tokens.map((token) => ({ - target: token, - })), - abi: abi["getCash"], - }) - ).output; -} - -async function getTotalSupplies(block, tokens) { - return ( - await sdk.api.abi.multiCall({ - block, - calls: tokens.map((token) => ({ - target: token, - })), - abi: abi["totalSupply"], - }) - ).output; -} - -async function anchorTVL(block) { - const balances = {}; - if (block < anchorStart) { - return balances; - } - - const tokens = await getAllTokens(block); - const [allUnderlying, cashes] = await Promise.all([ - getAllUnderlying(block, tokens), - getCashes(block, tokens), - ]); - - tokens.forEach((token) => { - let cash = cashes.find( - (result) => result.input.target === token - ); - let underlying = allUnderlying.find( - (result) => result.input.target === token - ); - if (cash && underlying) { - balances[underlying.output] = BigNumber( - balances[underlying.output] || 0 - ).plus(cash.output); - } - }); - - return balances; -} - -async function vaultsTVL(block) { - const balances = {}; - - const [allUnderlying, totalSupplies] = await Promise.all([ - getAllUnderlying(block, vaults), - getTotalSupplies(block, vaults), - ]); +async function tvl(api) { + const compTvl = compoundExports2({ comptroller, cether: ['0x697b4acaa24430f254224eb794d2a85ba1fa1fb8', '0x8e103eb7a0d01ab2b2d29c91934a9ad17eb54b86'], blacklistedTokens: ['0x865377367054516e17014ccded1e7d814edc9ce4']}).tvl - vaults.forEach((token) => { - let totalSupply = totalSupplies.find( - (result) => result.input.target === token - ); - let underlying = allUnderlying.find( - (result) => result.input.target === token - ); - if (totalSupply && underlying) { - balances[underlying.output] = BigNumber( - balances[underlying.output] || 0 - ).plus(totalSupply.output); - } - }); - - return balances; -} - -async function stabilizerTVL(block) { - if (block < anchorStart) { - return {}; - } - - const supply = ( - await sdk.api.abi.call({ - block, - target: stabilizer, - abi: abi["supply"], - }) - ).output; - - return { - [dai]: BigNumber(supply), - }; -} - -async function tvl(timestamp, block) { - const balances = {}; - - const [ - anchorBalances, - vaultBalances, - stabilizerBalances, - ] = await Promise.all([ - anchorTVL(block), - vaultsTVL(block), - stabilizerTVL(block), + await Promise.all([ + compTvl(api), + vaultsTVL(api), + stabilizerTVL(api), ]); - - const lps = [] - Object.entries(anchorBalances).forEach(([token, value]) => { - const balance = BigNumber(balances[token] || 0); - if(token === '0xAA5A67c256e27A5d80712c51971408db3370927D'){ - token = "0x865377367054516e17014ccded1e7d814edc9ce4" - } - if(token === "0x5BA61c0a8c4DccCc200cd0ccC40a5725a426d002"){ - lps.push({ - token, - balance: value.toFixed(0) - }) - } else { - balances[token] = balance.plus(BigNumber(value)).toFixed(); - } - }); - - Object.entries(vaultBalances).forEach(([token, value]) => { - const balance = BigNumber(balances[token] || 0); - balances[token] = balance.plus(BigNumber(value)).toFixed(); - }); - - Object.entries(stabilizerBalances).forEach(([token, value]) => { - const balance = BigNumber(balances[token] || 0); - balances[token] = balance.plus(BigNumber(value)).toFixed(); - }); - await unwrapUniswapLPs(balances, lps, block) - - return balances; + return sumTokens2({ api, resolveLP: true, }) } module.exports = { methodology: "DOLA curve metapool replaced by DOLA", hallmarks: [ - [1648771200, "INV price hack"], - [1655380800, "Inverse Frontier Deprecated"] -], - start: 1607731200, // Dec 12 2020 00:00:00 GMT+0000 + [1648771200, "INV price hack"], + [1655380800, "Inverse Frontier Deprecated"] + ], + start: '2020-12-12', // Dec 12 2020 00:00:00 GMT+0000 ethereum: { tvl } }; diff --git a/projects/iolend/index.js b/projects/iolend/index.js new file mode 100644 index 0000000000..ea6d5126f4 --- /dev/null +++ b/projects/iolend/index.js @@ -0,0 +1,8 @@ +const { aaveExports, methodology } = require("../helper/aave"); + +module.exports = { + methodology, + iotaevm: { + ...aaveExports('iotaevm', '0xA9Bb7ebb4F51B0e0BbD0FaE640e32298a0Bcf4A5'), + }, +}; diff --git a/projects/ion-dao/index.js b/projects/ion-dao/index.js index f60d837fa3..1beb1eee81 100644 --- a/projects/ion-dao/index.js +++ b/projects/ion-dao/index.js @@ -11,7 +11,6 @@ async function tvl() { module.exports = { timetravel: false, // need to add code to fetch osmosis block - start: 5887991, osmosis: { tvl, }, diff --git a/projects/ionic/index.js b/projects/ionic/index.js index fd64d1f9e1..a7c095deb8 100644 --- a/projects/ionic/index.js +++ b/projects/ionic/index.js @@ -6,4 +6,14 @@ module.exports = mergeExports([{ mode: compoundExports2({ comptroller: '0xfb3323e24743caf4add0fdccfb268565c0685556' }) }, { mode: compoundExports2({ comptroller: '0x8fb3d4a94d0aa5d6edaac3ed82b59a27f56d923a' }) + }, { + base: compoundExports2({ comptroller: '0x05c9C6417F246600f8f5f49fcA9Ee991bfF73D13' }) + }, { + bob: compoundExports2({ comptroller: '0x9cFEe81970AA10CC593B83fB96eAA9880a6DF715' }) + }, { + fraxtal: compoundExports2({ comptroller: '0xB5141403e811fFFE02f4d49Ea8d4a7B0b9590658' }) + }, { + optimism: compoundExports2({ comptroller: '0xaFB4A254D125B0395610fdc8f1D022936c7b166B' }) + }, { + lisk: compoundExports2({ comptroller: '0xF448A36feFb223B8E46e36FF12091baBa97bdF60' }) }]) \ No newline at end of file diff --git a/projects/ip/index.js b/projects/ip/index.js index f9f78c593f..1844ce8490 100644 --- a/projects/ip/index.js +++ b/projects/ip/index.js @@ -83,7 +83,6 @@ async function op_tvl(api) { } module.exports = { - start: 14962974, ethereum: { tvl: eth_tvl }, diff --git a/projects/ipor-fusion/index.js b/projects/ipor-fusion/index.js new file mode 100644 index 0000000000..bbb66ccef0 --- /dev/null +++ b/projects/ipor-fusion/index.js @@ -0,0 +1,16 @@ +const { getConfig } = require('../helper/cache') + +const IPOR_GITHUB_ADDRESSES_URL = "https://raw.githubusercontent.com/IPOR-Labs/ipor-abi/refs/heads/main/mainnet/addresses.json"; + +async function tvl(api) { + const config = await getConfig('ipor/assets', IPOR_GITHUB_ADDRESSES_URL); + const calls = config[api.chain].vaults.map(vault => vault.PlasmaVault); + return api.erc4626Sum2({ calls }) +} + +module.exports = { + methodology: `Counts the tokens deposited into IPOR Fusion Vaults.`, + ethereum: { tvl }, + arbitrum: { tvl }, + base: { tvl }, +}; diff --git a/projects/ipor/abi.js b/projects/ipor/abi.js index ec952bd711..b206dea50a 100644 --- a/projects/ipor/abi.js +++ b/projects/ipor/abi.js @@ -2,6 +2,7 @@ module.exports = { abi: { getAccruedBalance: "function getAccruedBalance() view returns (uint256 totalCollateralPayFixed, uint256 totalCollateralReceiveFixed, uint256 liquidityPool, uint256 vault)", getAmmBalance: "function getAmmBalance(address asset) view returns (uint256 totalCollateralPayFixed, uint256 totalCollateralReceiveFixed, uint256 liquidityPool, uint256 vault)", + getBalancesForOpenSwap: " function getBalancesForOpenSwap(address asset) external view returns (uint256 totalCollateralPayFixed, uint256 totalNotionalPayFixed, uint256 totalCollateralReceiveFixed, uint256 totalNotionalReceiveFixed, uint256 liquidityPool)", getAsset: "address:getAsset", } }; diff --git a/projects/ipor/index.js b/projects/ipor/index.js index 8b3c6f9505..2a506a631e 100644 --- a/projects/ipor/index.js +++ b/projects/ipor/index.js @@ -1,8 +1,7 @@ -const ADDRESSES = require('../helper/coreAssets.json') const { abi } = require("./abi"); const { getConfig } = require('../helper/cache') -const IPOR_GITHUB_ADDRESSES_URL = "https://raw.githubusercontent.com/IPOR-Labs/ipor-abi/main/mainnet/addresses.json"; +const IPOR_GITHUB_ADDRESSES_URL = "https://raw.githubusercontent.com/IPOR-Labs/ipor-abi/refs/heads/main/mainnet/addresses.json"; const V2DeploymentBlockNumber = 18333744 async function tvlEthereum(api) { @@ -14,37 +13,28 @@ async function tvlEthereum(api) { return await calculateTvlForV1(api); } } -async function tvlArbitrum(_, block, _1, {api}) { - const addresses = await getConfig('ipor/assets', IPOR_GITHUB_ADDRESSES_URL); - for (const pool of addresses.arbitrum.pools) { - await api.sumTokens({owner: pool.AmmTreasury, tokens: [pool.asset]}); - } - return api.getBalances(); -} async function calculateTvlForV2(api) { - const addresses = await getConfig('ipor/assets', IPOR_GITHUB_ADDRESSES_URL) + const chain = api.chain; + const {[chain]: { IporProtocolRouter, pools }} = await getConfig('ipor/assets', IPOR_GITHUB_ADDRESSES_URL); - const assets = [ - ADDRESSES.ethereum.USDT, // USDT - ADDRESSES.ethereum.USDC, // USDC - ADDRESSES.ethereum.DAI, // DAI - ] + // pools with swaps + const poolsWithSwaps = pools.filter(pool => pool.swapsAvailable); + const assets = [...new Set(poolsWithSwaps.map(pool => pool.asset))]; - const output = await api.multiCall({ abi: abi.getAmmBalance, calls: assets, target: addresses.ethereum.IporProtocolRouter }) - const decimals = await api.multiCall({ abi: 'erc20:decimals', calls: assets }) + const [balances, decimals] = await Promise.all([ + api.multiCall({ abi: abi.getBalancesForOpenSwap, calls: assets, target: IporProtocolRouter }), + api.multiCall({ abi: 'erc20:decimals', calls: assets }) + ]); - output.forEach(({ totalCollateralPayFixed, totalCollateralReceiveFixed, liquidityPool, vault }, i) => { - const balance = +totalCollateralPayFixed + +totalCollateralReceiveFixed + +liquidityPool - const decimal = 18 - decimals[i] - api.add(assets[i], balance / (10 ** decimal)) + balances.forEach(({ totalCollateralPayFixed, totalCollateralReceiveFixed, liquidityPool }, i) => { + const balance = +totalCollateralPayFixed + +totalCollateralReceiveFixed + +liquidityPool; + api.add(assets[i], balance / (10 ** (18 - decimals[i]))); }); - for (const pool of addresses.ethereum.pools) { - await api.sumTokens({owner: pool.AmmTreasury, tokens: [pool.asset]}); - } - - return api.getBalances(); + // pools without swaps + const tokensAndOwners = pools.filter(pool => !pool.swapsAvailable).map(pool => [pool.asset, pool.AmmTreasury]); + return api.sumTokens({ tokensAndOwners }); } async function calculateTvlForV1(api) { @@ -53,11 +43,11 @@ async function calculateTvlForV1(api) { '0x137000352B4ed784e8fa8815d225c713AB2e7Dc9', // USDC '0xEd7d74AA7eB1f12F83dA36DFaC1de2257b4e7523', // DAI ] - const output = await api.multiCall({ abi: abi.getAccruedBalance, calls: miltonAddresses, }) + const res = await api.multiCall({ abi: abi.getAccruedBalance, calls: miltonAddresses, }) const tokens = await api.multiCall({ abi: abi.getAsset, calls: miltonAddresses, }) const decimals = await api.multiCall({ abi: 'erc20:decimals', calls: tokens }) - output.forEach(({ totalCollateralPayFixed, totalCollateralReceiveFixed, liquidityPool }, i) => { + res.forEach(({ totalCollateralPayFixed, totalCollateralReceiveFixed, liquidityPool }, i) => { const balance = +totalCollateralPayFixed + +totalCollateralReceiveFixed + +liquidityPool const decimal = 18 - decimals[i] api.add(tokens[i], balance / (10 ** decimal)) @@ -72,6 +62,12 @@ module.exports = { tvl: tvlEthereum }, arbitrum: { - tvl: tvlArbitrum - } + tvl: calculateTvlForV2 + }, + base: { + tvl: calculateTvlForV2 + }, + hallmarks:[ + [1674648000, "Liquidity Mining Start"] + ], }; diff --git a/projects/ironbank/index.js b/projects/ironbank/index.js index 0f55648591..ece02f5062 100644 --- a/projects/ironbank/index.js +++ b/projects/ironbank/index.js @@ -1,11 +1,9 @@ -const { getCompoundV2Tvl, compoundExports, usdCompoundExports } = require("../helper/compound"); +const { compoundExports2 } = require("../helper/compound"); - - -const ftmSFIreplace = addr=> addr==="0x924828a9Fb17d47D0eb64b57271D10706699Ff11" ? "0xb753428af26e81097e7fd17f40c88aaa3e04902c":`fantom:${addr}` module.exports = { - start: 1599552000, // 09/08/2020 @ 8:00am (UTC) - ethereum: compoundExports("0xAB1c342C7bf5Ec5F02ADEA1c2270670bCa144CbB", "ethereum",undefined,undefined,undefined,undefined,{ + start: '2020-09-08', // 09/08/2020 @ 8:00am (UTC) + ethereum: compoundExports2({ + comptroller: '0xAB1c342C7bf5Ec5F02ADEA1c2270670bCa144CbB', blacklistedTokens: [ '0x96E61422b6A9bA0e068B6c5ADd4fFaBC6a4aae27', //ibEUR '0x95dfdc8161832e4ff7816ac4b6367ce201538253', //ibKRW @@ -17,10 +15,7 @@ module.exports = { '0x4e3a36A633f63aee0aB57b5054EC78867CB3C0b8', //old hacked sUSD cream market ] }), - fantom: { - tvl: getCompoundV2Tvl("0x4250a6d3bd57455d7c6821eecb6206f507576cd2", "fantom", ftmSFIreplace, undefined, undefined, false), - borrowed: getCompoundV2Tvl("0x4250a6d3bd57455d7c6821eecb6206f507576cd2", "fantom", ftmSFIreplace, undefined, undefined, true) - }, - avax:compoundExports("0x2eE80614Ccbc5e28654324a66A396458Fa5cD7Cc", "avax"), - optimism: compoundExports("0xE0B57FEEd45e7D908f2d0DaCd26F113Cf26715BF", "optimism") -}; + fantom: compoundExports2({ comptroller: '0x4250a6d3bd57455d7c6821eecb6206f507576cd2' }), + avax: compoundExports2({ comptroller: '0x2eE80614Ccbc5e28654324a66A396458Fa5cD7Cc' }), + optimism: compoundExports2({ comptroller: '0xE0B57FEEd45e7D908f2d0DaCd26F113Cf26715BF' }), +} diff --git a/projects/ironfinance/index.js b/projects/ironfinance/index.js index cbf7041091..574f4a1346 100644 --- a/projects/ironfinance/index.js +++ b/projects/ironfinance/index.js @@ -128,24 +128,24 @@ const fantomTvl = async (timestamp, ethBlock, chainBlocks) => { return tvl; }; -const {tvl: polygonLending, borrowed: polygonBorrowed} = - compoundExports(Contracts.polygon.lend.ironController, "polygon", "0xCa0F37f73174a28a64552D426590d3eD601ecCa1", Contracts.polygon.wrappedNative) -const {tvl: fantomLending, borrowed: fantomBorrowed} = - compoundExports(Contracts.fantom.lend.ironController, "fantom", "0xdfce3E14a8c77D32fe2455a9E56424F149E2F271", Contracts.fantom.wrappedNative) +const { tvl: polygonLending, borrowed: polygonBorrowed } = + compoundExports(Contracts.polygon.lend.ironController, "0xCa0F37f73174a28a64552D426590d3eD601ecCa1", Contracts.polygon.wrappedNative) +const { tvl: fantomLending, borrowed: fantomBorrowed } = + compoundExports(Contracts.fantom.lend.ironController, "0xdfce3E14a8c77D32fe2455a9E56424F149E2F271", Contracts.fantom.wrappedNative) module.exports = { - polygon: { + polygon: { tvl: sdk.util.sumChainTvls([polygonTvl, polygonLending]), borrowed: polygonBorrowed }, - avax:{ + avax: { tvl: avaxTvl, }, fantom: { - tvl: sdk.util.sumChainTvls([fantomTvl, fantomLending]), + tvl: sdk.util.sumChainTvls([fantomTvl, fantomLending]), borrowed: fantomBorrowed }, hallmarks: [ - [1652270400,"Re-entrancy Exploit"] + [1652270400, "Re-entrancy Exploit"] ], }; diff --git a/projects/issuaa/index.js b/projects/issuaa/index.js index 54a0b8406a..b6b40250bd 100644 --- a/projects/issuaa/index.js +++ b/projects/issuaa/index.js @@ -11,7 +11,7 @@ module.exports = { factory: '0xC7e06CAF7880421cD21E98656B4755B3Df61537b', useDefaultCoreAssets: true, hasStablePools: true, - fetchBalances: true, + fetchBalances: true, // get reserves call fails }) } } \ No newline at end of file diff --git a/projects/ithaca/index.js b/projects/ithaca/index.js index 4f6229cbf4..33eb0d72fe 100644 --- a/projects/ithaca/index.js +++ b/projects/ithaca/index.js @@ -4,16 +4,23 @@ const { sumTokensExport } = require("../helper/unwrapLPs"); const ITHACA_FUNDLOCK_CONTRACT = '0x4a20d341315b8ead4e5ebecc65d95080a47a7316'; const WETH_CONTRACT = ADDRESSES.arbitrum.WETH; const USDC_CONTRACT = ADDRESSES.arbitrum.USDC_CIRCLE; +const ITHACA_WETH_AAVE_STRATEGY_CONTRACT = '0xb2dd2f67132e2e5bc37cb2c1d3b193909b7fb26c' +const ITHACA_USDC_AAVE_STRATEGY_CONTRACT = '0x9f494058e0501498f09fd0173d5024e1d3a6fc57' +const AWETH_CONTRACT = '0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8' +const AUSDC_CONTRACT = '0x724dc807b04555b71ed48a6896b6F41593b8C637' module.exports = { timetravel: true, misrepresentedTokens: false, methodology: 'counts the number of WETH and USDC in Ithaca Fundlock contract', - start: 176036233, arbitrum: { - tvl: sumTokensExport({ - owner: ITHACA_FUNDLOCK_CONTRACT, - tokens: [ WETH_CONTRACT, USDC_CONTRACT ], + tvl: sumTokensExport({ + tokensAndOwners: [ + [WETH_CONTRACT, ITHACA_FUNDLOCK_CONTRACT], + [USDC_CONTRACT, ITHACA_FUNDLOCK_CONTRACT], + [AWETH_CONTRACT, ITHACA_WETH_AAVE_STRATEGY_CONTRACT], + [AUSDC_CONTRACT, ITHACA_USDC_AAVE_STRATEGY_CONTRACT], + ], }), } }; \ No newline at end of file diff --git a/projects/ithil/index.js b/projects/ithil/index.js index 8f083e0f55..aaf2d87656 100644 --- a/projects/ithil/index.js +++ b/projects/ithil/index.js @@ -19,7 +19,6 @@ const config = { } module.exports = { methodology: 'We calculate the TVL as the sum of (deposits + loans + locked profits - losses) for each vault available', - start: 171730567, hallmarks: [ [1691649008, "private mainnet launch"] ], diff --git a/projects/ixswap/index.js b/projects/ixswap/index.js index 31154e2017..03f2490147 100644 --- a/projects/ixswap/index.js +++ b/projects/ixswap/index.js @@ -1,14 +1,28 @@ -const { getUniTVL } = require("../helper/unknownTokens"); -const { staking } = require('../helper/staking') +const {getUniTVL} = require("../helper/unknownTokens"); +const {staking} = require('../helper/staking') +const { sumTokensExport } = require('../helper/unwrapLPs') const IXS_POLYGON = "0x1BA17C639BdaeCd8DC4AAc37df062d17ee43a1b8" +const IXS_BASE = "0xfe550bffb51eb645ea3b324d772a19ac449e92c5" const STAKING_CONTRACTS = [ - "0xad644F3cC768bc6dceF97096790e2210D5191cec", // stake bank + "0xad644F3cC768bc6dceF97096790e2210D5191cec", // stake bank +] + + +const FUNDS = [ + '0x9546a22c244497b6fb5338e4ff7c74c5accb3ddd', // CKGP ] module.exports = { - polygon:{ - tvl: getUniTVL({ factory: '0xc2D0e0bc81494adB71Ce9Aa350cC875DaE12D81D', fetchBalances: true, blacklistedTokens: [IXS_POLYGON] }), + polygon: { + tvl: getUniTVL({factory: '0xc2D0e0bc81494adB71Ce9Aa350cC875DaE12D81D', blacklistedTokens: [IXS_POLYGON]}), staking: staking(STAKING_CONTRACTS, IXS_POLYGON), }, -} \ No newline at end of file + base: { + tvl: getUniTVL({factory: '0x2eE28d1Bbc2EcB1fFDB83E8055d585E9F0fb757f'}), + staking: staking(['0x44F07B446e14127136f3554A16014b49BC67D9E6'], IXS_BASE), + }, + ethereum: { + tvl: sumTokensExport({ owners: FUNDS, fetchCoValentTokens: true }) + } +} diff --git a/projects/izumi-iziswap/index.js b/projects/izumi-iziswap/index.js index 256c2d5b2a..c0d5d3c317 100644 --- a/projects/izumi-iziswap/index.js +++ b/projects/izumi-iziswap/index.js @@ -35,6 +35,10 @@ const poolHelpers = { 'bob': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], 'taiko': ['0x33531bDBFE34fa6Fd5963D0423f7699775AacaaF'], 'core': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], + 'gravity': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], + 'iotex': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], + 'morph': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], + 'kava': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], } // iziswap liquidityManager contracts const blacklistedTokens = [ diff --git a/projects/jademoney/index.js b/projects/jademoney/index.js new file mode 100644 index 0000000000..9a592c3173 --- /dev/null +++ b/projects/jademoney/index.js @@ -0,0 +1,16 @@ +const { queryContract } = require("../helper/chain/cosmos"); + +const jadeContract = "neutron1mdy5fhtwdjagp5eallsdhlx6gxylm8rxqk72wjzg6y5d5kt44ysqprkduw"; +const usdcDenom = "ibc/B559A80D62249C8AA07A380E2A2BEA6E5CA9A6F079C912C3A9E9B494105E4F81"; + +async function tvl(api) { + const data = await queryContract({ contract: jadeContract, chain: "neutron", data: "{\"value\":{}}" }); + api.add(usdcDenom, data); +} + +module.exports = { + methodology: "Queries the Jade.Money contract for the total value of USDC deposits.", + neutron: { + tvl + } +} \ No newline at end of file diff --git a/projects/jadeswap/index.js b/projects/jadeswap/index.js index a1dde66f40..e6f0213094 100644 --- a/projects/jadeswap/index.js +++ b/projects/jadeswap/index.js @@ -4,7 +4,6 @@ const sdk = require("@defillama/sdk"); const uniTvl = getUniTVL({ factory: "0xb20a6389cA872d094f3c7A8180fE5BAb431BD794", useDefaultCoreAssets: true, - fetchBalances: true, }); const masterchef = "0xcC507803A4b832684154C4E395D92A6EDbEAfE52"; const jade = "0x7c70229F108D3d506Cff8Ea243FFA57344Fc4cE1"; diff --git a/projects/jarvis/index.js b/projects/jarvis/index.js index cbdab35bee..4bdd6b4dd4 100644 --- a/projects/jarvis/index.js +++ b/projects/jarvis/index.js @@ -36,64 +36,34 @@ async function tvl(api) { const { synthpoolRegistry, version } = contracts[chain] const { fixedRateRegistry, fixedRateVersion } = contracts[chain] const { selfMintingRegistry, creditLineVersion } = contracts[chain] - const block = api.block - const balances = {} // Get liquidityPools by calling getElements(synth, collateral, version) // For v5, the collateral is stored in the liquidity pools directly // Get collaterals, usually single collat, USDC on polygon, BUSD on BSC, but might be multiple collats later on - const collaterals = await api.call({ - abi: abi["SynthereumPoolRegistry_getCollaterals"], - target: synthpoolRegistry, - }) + const collaterals = await api.call({ abi: abi["SynthereumPoolRegistry_getCollaterals"], target: synthpoolRegistry, }) // Get synth token symbols - jEUR, jCHF etc - const syntheticTokens = await api.call({ - abi: abi["SynthereumPoolRegistry_getSyntheticTokens"], - target: synthpoolRegistry, - }) + const syntheticTokens = await api.call({ abi: abi["SynthereumPoolRegistry_getSyntheticTokens"], target: synthpoolRegistry, }) if (chain === 'polygon' || chain === 'bsc') { // Get collateral for SynthereumFixedRate Wrappers - const fixedRateCollaterals = await api.call({ - abi: abi["SynthereumFixedRateRegistry_getCollaterals"], - target: fixedRateRegistry, - }) + const fixedRateCollaterals = await api.call({ abi: abi["SynthereumFixedRateRegistry_getCollaterals"], target: fixedRateRegistry, }) // Get synthTokens for SynthereumFixedRate Wrappers - jEUR, jCHF etc. - const fixedRateSynthTokens = await api.call({ - abi: abi["SynthereumFixedRateRegistry_getSyntheticTokens"], - target: fixedRateRegistry, - }) + const fixedRateSynthTokens = await api.call({ abi: abi["SynthereumFixedRateRegistry_getSyntheticTokens"], target: fixedRateRegistry, }) // Get fixedRateWrappers by calling SynthereumFixedRateRegistry_getElements const params_list_fixedRate = fixedRateCollaterals.map(fixedRateCollateral => fixedRateSynthTokens.map(fixedRateSynth => [fixedRateSynth, fixedRateCollateral, fixedRateVersion])).flat().map(i => ({ params: i })) - const elements_obj_fixedRate = await api.multiCall({ - abi: abi["SynthereumFixedRateRegistry_getElements"], - target: fixedRateRegistry, - calls: params_list_fixedRate - }) + const elements_obj_fixedRate = await api.multiCall({ abi: abi["SynthereumFixedRateRegistry_getElements"], target: fixedRateRegistry, calls: params_list_fixedRate }) const fixedRateWrappers = elements_obj_fixedRate.flat(2) const fixedRateCalls = fixedRateWrappers - const fixedRateCollateralTokens = await api.multiCall({ - abi: abi.collateralToken, - calls: fixedRateCalls, - }) - const fixedRateTotalCollateralAmounts = await api.multiCall({ - abi: abi.totalPegCollateral, - calls: fixedRateCalls, - }) - fixedRateCollateralTokens.forEach((data, i) => { - sdk.util.sumSingleBalance(balances, chain + ':' + data, fixedRateTotalCollateralAmounts[i]) - }) + const fixedRateCollateralTokens = await api.multiCall({ abi: abi.collateralToken, calls: fixedRateCalls, }) + const fixedRateTotalCollateralAmounts = await api.multiCall({ abi: abi.totalPegCollateral, calls: fixedRateCalls, }) + api.add(fixedRateCollateralTokens, fixedRateTotalCollateralAmounts) } // Get synthereumPools by calling SynthereumPoolRegistry_getElements - const params_list = collaterals.map(collateral => syntheticTokens.map(synth => [synth, collateral, version])).flat().map(i => ({ params: i })) - const elements_obj = await api.multiCall({ - abi: abi["SynthereumPoolRegistry_getElements"], - target: synthpoolRegistry, - calls: params_list - }) + const params_list = collaterals.map(collateral => syntheticTokens.map(synth => ({ params: [synth, collateral, version]}))).flat() + const elements_obj = await api.multiCall({ abi: abi["SynthereumPoolRegistry_getElements"], target: synthpoolRegistry, calls: params_list }) const liquidityPools = elements_obj.flat(2) if (version === 6) { @@ -103,66 +73,39 @@ async function tvl(api) { '0xBC988A0146178825C26c255989cfd5083Bae672C', '0x8FEceC5629EED60D18Fd3438aae4a8E69723D190', ].map(i => i.toLowerCase()) - const calls = liquidityPools.filter(i => !blacklistedPools.includes(i.toLowerCase())).map(a => ({ target: a })) - const collateralTokens = await api.multiCall({ - abi: abi.collateralToken, - calls - }) - const totalCollateralAmounts = await api.multiCall({ - abi: abi.totalCollateralAmount, - calls - }) + const calls = liquidityPools.filter(i => !blacklistedPools.includes(i.toLowerCase())) + const collateralTokens = await api.multiCall({ abi: abi.collateralToken, calls }) + const totalCollateralAmounts = await api.multiCall({ abi: abi.totalCollateralAmount, calls, permitFailure: true }) collateralTokens.forEach((data, i) => { - sdk.util.sumSingleBalance(balances, chain + ':' + data, totalCollateralAmounts[i].totalCollateral) + const totalCollateralAmount = totalCollateralAmounts[i] + if (!totalCollateralAmount) return + api.add(data, totalCollateralAmount.totalCollateral) }) } else if (version === 5) { // Get balances of every LiquidityPool and SynthToken Contracts - await sumTokens2({ api, balances, owners: liquidityPools, tokens: collaterals }) + await sumTokens2({ api, owners: liquidityPools, tokens: collaterals }) } if (chain === 'polygon' || chain === 'bsc' || chain === 'optimism' || chain === 'arbitrum') { // Get collateral token addresses from self minting registry - const { output: selfMintingCollaterals } = await sdk.api.abi.call({ - abi: abi["SynthereumSelfMintingRegistry_getCollaterals"], - target: selfMintingRegistry, - block, - chain - }) + const selfMintingCollaterals = await api.call({ abi: abi["SynthereumSelfMintingRegistry_getCollaterals"], target: selfMintingRegistry, }) // Get synth token symbols - jEUR, jCHF etc - const { output: selfMintingSyntheticTokens } = await sdk.api.abi.call({ - abi: abi["SynthereumSelfMintingRegistry_getSyntheticTokens"], - target: selfMintingRegistry, - block, - chain - }) + const selfMintingSyntheticTokens = await api.call({ abi: abi["SynthereumSelfMintingRegistry_getSyntheticTokens"], target: selfMintingRegistry, }) // Get creditLineDerivatives by calling SynthereumSelfMintingRegistry_getElements - const params_list_creditline = selfMintingCollaterals.map(selfMintingCollateral => selfMintingSyntheticTokens.map(selfMintingSynth => [selfMintingSynth, selfMintingCollateral, creditLineVersion])).flat() - const { output: elements_obj_creditline } = await sdk.api.abi.multiCall({ - abi: abi["SynthereumSelfMintingRegistry_getElements"], - calls: params_list_creditline.map(params => ({ - target: selfMintingRegistry, - params: params - })), - block, - chain + const params_list_creditline = selfMintingCollaterals.map(selfMintingCollateral => selfMintingSyntheticTokens.map(selfMintingSynth => ({ params: [selfMintingSynth, selfMintingCollateral, creditLineVersion]}))).flat() + const elements_obj_creditline = await api.multiCall({ + abi: abi["SynthereumSelfMintingRegistry_getElements"], target: selfMintingRegistry, calls: params_list_creditline, }) - const creditLineDerivatives = elements_obj_creditline.map(e => e.output).flat(2) + const creditLineDerivatives = elements_obj_creditline.flat(2) - const creditLineCalls = creditLineDerivatives.map(f => ({ target: f })) - const { output: creditLineCollateralTokens } = await sdk.api.abi.multiCall({ - abi: abi.collateralToken, - chain, block, calls: creditLineCalls, - }) - const { output: creditLineTotalCollateralAmounts } = await sdk.api.abi.multiCall({ - abi: abi.getGlobalPositionData, - chain, block, calls: creditLineCalls, - }) + const creditLineCalls = creditLineDerivatives + const creditLineCollateralTokens = await api.multiCall({ abi: abi.collateralToken, calls: creditLineCalls, }) + const creditLineTotalCollateralAmounts = await api.multiCall({ abi: abi.getGlobalPositionData, calls: creditLineCalls, }) creditLineCollateralTokens.forEach((data, i) => { - sdk.util.sumSingleBalance(balances, chain + ':' + data.output, creditLineTotalCollateralAmounts[i].output.totCollateral) + api.add(data, creditLineTotalCollateralAmounts[i].totCollateral) }) } - return balances } module.exports = { diff --git a/projects/jaspervault/index.js b/projects/jaspervault/index.js index a327a6ec8b..f6abdb3bed 100644 --- a/projects/jaspervault/index.js +++ b/projects/jaspervault/index.js @@ -1,19 +1,31 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require("../helper/unwrapLPs") +const dlcBTC_arbitrum = '0x050C24dBf1eEc17babE5fc585F06116A259CC77A' +const cbBTC_base = '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf' module.exports = { arbitrum: { tvl: sumTokensExport({ owners: [ - '0xE980FD1dEA4E93c25B7f5B27351CF069C4f63a41', - '0xE26f15B3cc23e8a5adE4c10CCc69e50520eE2a89', - '0x5954B84F4ba745E1A85E9A5875ce3bDf863200ba', - '0xaaa5a76b9397eE41309CC15Bd71a5ae99662d6cd', - '0x3cF1A20AE73ff128D3A40F4492fdE59F2B2D1e8C', - '0x1eb466780e412C796A7BEdA541CfF47E0571A000', - '0x1DDD814589376Db497F91eFD2E6AFF969822a951' + '0x5954B84F4ba745E1A85E9A5875ce3bDf863200ba', // ETH CALL + '0x3cF1A20AE73ff128D3A40F4492fdE59F2B2D1e8C', // WBTC CALL + '0x1eb466780e412C796A7BEdA541CfF47E0571A000', // ARB CALL + '0x69ff3c3344C4F945205ddeA9A66c99c0A07D8aae', // WSOL CALL + '0x7A5A597d5c1D09F919e91Db5A986A4Dd2DEc0Af4', // dlcBTC CALL + '0xE26f15B3cc23e8a5adE4c10CCc69e50520eE2a89', // ETH WBTC dlcBTC PUT + '0x1DDD814589376Db497F91eFD2E6AFF969822a951' // ETH WBTC dlcBTC PUT ], - tokens: [ADDRESSES.arbitrum.WBTC, ADDRESSES.null, ADDRESSES.arbitrum.USDT, ADDRESSES.arbitrum.ARB] + tokens: [ADDRESSES.arbitrum.WBTC, ADDRESSES.null, ADDRESSES.arbitrum.USDT, ADDRESSES.arbitrum.ARB, dlcBTC_arbitrum] + }) + }, + base: { + tvl: sumTokensExport({ + owners: [ + '0x37a4f273B341C077230aA2d967590b8a74D37598', // ETH CALL + '0x4FAF5c3809E8Dc966Ff7AeDDFb501AF6f85Fbeb7', // cbBTC CALL + '0x8aB7037c4073200c907da014C626222624E1Fc47', // ETH cbBTC PUT + ], + tokens: [ADDRESSES.null, cbBTC_base] }) }, } diff --git a/projects/javsphere/index.js b/projects/javsphere/index.js index 415910ea31..076b8815ee 100644 --- a/projects/javsphere/index.js +++ b/projects/javsphere/index.js @@ -1,32 +1,33 @@ -const { get } = require('../helper/http') const { staking } = require("../helper/staking.js"); -const {stakings} = require("../helper/staking"); -const vaultUrl = "https://mainnet.ocean.jellyfishsdk.com/v0/mainnet/address/df1q7zkdpw6hd5wzcxudx28k72vjvpefa4pyqls2grnahhyw4u8kf0zqu2cnz6/vaults"; -const ONE_YEAR_LOCKING_MAINNET = '0xD88Bb8359D694c974C9726b6201479a123212333' -const TWO_YEARS_LOCKING_MAINNET = '0xc5B7aAc761aa3C3f34A3cEB1333f6431d811d638' +const STAKING_BASE = '0xE420BBb4C2454f305a3335BBdCE069326985fb5b' +const FREEZER_BASE = '0x03e225D2bd32F5ecE539005B57F9B94A743ADBFB' +const VESTING_BASE = '0x42a40321843220e9811A1385D74d9798436f7002' +const JAV_BASE = '0xEdC68c4c54228D273ed50Fc450E253F685a2c6b9' +const LEVERAGEX_BASE_EARN = '0xfd916d70eb2d0e0e1c17a6a68a7fbede3106b852' +const LEVERAGEX_BASE_DIAMOND = '0xBF35e4273db5692777EA475728fDbBa092FFa1B3' async function tvl(api) { - const tvls = await api.multiCall({ abi: 'uint256:currentTvl', calls: [ONE_YEAR_LOCKING_MAINNET, TWO_YEARS_LOCKING_MAINNET] }) - const dusdTVL = tvls.reduce((agg, i) => agg + i / 1e18, 0) - api.addCGToken('decentralized-usd', dusdTVL) -} - -async function defichainTvl(api) { - const { data: [vault] } = await get(vaultUrl) - const vaultTvl = +vault.collateralValue - +vault.loanValue - api.addCGToken('decentralized-usd', vaultTvl) + const config = await api.fetchList({ lengthAbi: 'tokensCount', itemAbi: "function tokens(uint256) view returns (address asset, bytes32 priceFeed, uint256 targetWeightage, bool isActive)", target: LEVERAGEX_BASE_EARN }) + const tokens = config.map(i => i.asset) + return api.sumTokens({ owners: [LEVERAGEX_BASE_EARN, LEVERAGEX_BASE_DIAMOND], tokens, }) } module.exports = { - methodology: `We count the total value locked in DUSD from all current products (dusd staking is a vault in defichain L1, - 1 year bond and 2 year bond are smart contracts on defimetachain L2. We also track staking and freezer of javsphers native token JAV). `, - defichain_evm: { + methodology: `We count the TVL of LeverageX Trading platform leveragex.trade (LPs and Traders). And TVL from staking and freezer of javsphers native token JAV.`, + hallmarks: [ + [1733837635, "Migration to BASE"], + ], + base: { tvl, - staking: stakings( ['0x4e15D4225623D07Adb43e9D546E57E1E6097e869', '0xF923f0828c56b27C8f57bc698c99543f63091E9A'], - '0x66F3Cf265D2D146A0348F6fC67E3Da0835e0968E'), - vesting: staking('0x7246ad1ac72715c5fd6c1FD7460A63afB8289104','0x66F3Cf265D2D146A0348F6fC67E3Da0835e0968E') - }, defichain: { - tvl: defichainTvl + staking: staking([STAKING_BASE, FREEZER_BASE], JAV_BASE), + vesting: staking(VESTING_BASE, JAV_BASE) + }, + defichain_evm: { + tvl: () => { }, + staking: () => { }, + }, + defichain: { + tvl: () => { }, }, } diff --git a/projects/jbc/index.js b/projects/jbc/index.js index 0f32be4f1e..bd8d385e16 100644 --- a/projects/jbc/index.js +++ b/projects/jbc/index.js @@ -14,6 +14,7 @@ module.exports = { hallmarks: [ [1681516800, "Rug Pull"] ], + deadFrom: '2023-04-15', arbitrum: { tvl: sumTokensExport({ tokensAndOwners }), pool2: pool2({ stakingContract: '0x0F6f73c7ecCE4FB9861E25dabde79CBA112550b3', lpToken, useDefaultCoreAssets: true, }), diff --git a/projects/jbtc/index.js b/projects/jbtc/index.js new file mode 100644 index 0000000000..9b66d22e76 --- /dev/null +++ b/projects/jbtc/index.js @@ -0,0 +1,12 @@ +const { sumTokensExport, nullAddress, } = require('../helper/sumTokens') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +module.exports = { + methodology: 'Total amount of BTC locked in Bitcoin network on wallet bc1qmukuv7j57umsd5tgg9fw88eqap57rzphkfckyp', + bitcoin: { + tvl: sumTokensExport({ owner: bitcoinAddressBook.jbtc }), + }, + ethereum: { + tvl: sumTokensExport({ owners: ['0x7e90Ef7D172843dB68e42FC5fAA8CB7C1803Dcfa'], tokens: [nullAddress] }), + }, +} diff --git a/projects/jetfuelfinance/index.js b/projects/jetfuelfinance/index.js index ff15a4a38a..4988a81dad 100644 --- a/projects/jetfuelfinance/index.js +++ b/projects/jetfuelfinance/index.js @@ -109,7 +109,7 @@ const bscTvl = async (timestamp, block, chainBlocks) => { return balances; }; -const {tvl:lendingTvl, borrowed} = compoundExports("0x67340bd16ee5649a37015138b3393eb5ad17c195", "bsc", "0xE24146585E882B6b59ca9bFaaaFfED201E4E5491", ADDRESSES.bsc.WBNB) +const {tvl:lendingTvl, borrowed} = compoundExports("0x67340bd16ee5649a37015138b3393eb5ad17c195", "0xE24146585E882B6b59ca9bFaaaFfED201E4E5491", ADDRESSES.bsc.WBNB) module.exports = { bsc: { diff --git a/projects/jiblend/index.js b/projects/jiblend/index.js index 77e2bef40c..849fc5eb67 100644 --- a/projects/jiblend/index.js +++ b/projects/jiblend/index.js @@ -4,6 +4,5 @@ module.exports = { jbc: compoundExports2({ comptroller: '0x603122Cdd36abCD164e448e1f3fbd33730edf35a', cether: '0xAc3e5aD93DDeac9B32772c8A864B5E73820c5d16', - fetchBalances: true, }) }; \ No newline at end of file diff --git a/projects/jones-dao/addresses.js b/projects/jones-dao/addresses.js index 52d3218687..2588230f71 100644 --- a/projects/jones-dao/addresses.js +++ b/projects/jones-dao/addresses.js @@ -50,6 +50,7 @@ module.exports = { "0xb385809cCdB2BD87A5Cd32ad09287399F0318a92", "0xf965734b1750E64D9a01c991C5E630D279C34fd2", "0xb754D87BdAb6Cc8c903abC2Bda9cE6B3c9481e60", + "0xB2cBa14C94B30297DBFbCB7517d9105D67bB692d" ], tokens: { aura: "0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF", diff --git a/projects/jones-dao/aura-locker-abi.json b/projects/jones-dao/aura-locker-abi.json deleted file mode 100644 index 32a964f6ed..0000000000 --- a/projects/jones-dao/aura-locker-abi.json +++ /dev/null @@ -1,48 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - } - ], - "name": "lockedBalances", - "outputs": [ - { - "internalType": "uint256", - "name": "total", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "unlockable", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "locked", - "type": "uint256" - }, - { - "components": [ - { - "internalType": "uint112", - "name": "amount", - "type": "uint112" - }, - { - "internalType": "uint32", - "name": "unlockTime", - "type": "uint32" - } - ], - "internalType": "struct AuraLocker.LockedBalance[]", - "name": "lockData", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - } -] \ No newline at end of file diff --git a/projects/jones-dao/index.js b/projects/jones-dao/index.js index fa378a17fe..5b1e2dfd97 100644 --- a/projects/jones-dao/index.js +++ b/projects/jones-dao/index.js @@ -4,7 +4,6 @@ const { pool2s } = require("../helper/pool2"); const { stakings } = require("../helper/staking"); const { sumTokens2 } = require("../helper/unwrapLPs"); -const lockerABI = require("./aura-locker-abi.json"); const addresses = require("./addresses"); const jAssetToAsset = { @@ -14,94 +13,77 @@ const jAssetToAsset = { "0x1f6fa7a58701b3773b08a1a16d06b656b0eccb23": addresses.tokens.rdpx, // jrdpx }; -async function tvl(api) { +const tokensAndOwners = [ + [addresses.tokens.uvrt, addresses.glp.stableRewardTracker], + [addresses.tokens.uvrt, addresses.glp.router], + [addresses.tokens.glp, addresses.glp.leverageStrategy], +]; + +const abi = { + locker: "function lockedBalances(address _user) view returns (uint256 total, uint256 unlockable, uint256 locked, (uint112 amount, uint32 unlockTime)[] lockData)", + glpManager: "function getLPManagerContracts(uint256 _nonce) view returns (address lp,address viewer,address swapper,address receiver,address priceHelper,address lpManager,address doubleTracker,address singleTrackerZero,address singleTrackerOne,address compounder,address router)" +} + +async function tvl_arbitrum (api) { const [metavaultTokens, metavaultBalances, optionVaultTokens, optionVaultBalances, jusdcTvl] = await Promise.all([ - api.multiCall({ - abi: "address:depositToken", - calls: addresses.metaVaultsAddresses, - }), - api.multiCall({ - abi: "uint256:workingBalance", - calls: addresses.metaVaultsAddresses, - }), - api.multiCall({ - abi: "address:asset", - calls: addresses.optionVaultAddresses, - }), - api.multiCall({ - abi: "uint256:totalAssets", - calls: addresses.optionVaultAddresses, - }), - sdk.api.abi.call({ - abi: "uint256:totalAssets", - target: addresses.jusdc.underlyingVault, - chain: "arbitrum", - }), + api.multiCall({ abi: "address:depositToken", calls: addresses.metaVaultsAddresses }), + api.multiCall({ abi: "uint256:workingBalance", calls: addresses.metaVaultsAddresses }), + api.multiCall({ abi: "address:asset", calls: addresses.optionVaultAddresses }), + api.multiCall({ abi: "uint256:totalAssets", calls: addresses.optionVaultAddresses }), + api.call({ abi: "uint256:totalAssets", target: addresses.jusdc.underlyingVault }), ]); api.addTokens(metavaultTokens, metavaultBalances); api.addTokens(optionVaultTokens, optionVaultBalances); - api.addTokens(addresses.tokens.usdc, jusdcTvl.output); - const getLPManagerContractsABI = "function getLPManagerContracts(uint256 _nonce) view returns (address lp,address viewer,address swapper,address receiver,address priceHelper,address lpManager,address doubleTracker,address singleTrackerZero,address singleTrackerOne,address compounder,address router)" - + api.addTokens(addresses.tokens.usdc, jusdcTvl); for (const factoryAddress of addresses.smartLpArbFactories) { - const contracts = await api.fetchList({ lengthAbi: 'nonce', itemAbi: getLPManagerContractsABI, target: factoryAddress, startFromOne: true }) + const contracts = await api.fetchList({ lengthAbi: 'nonce', itemAbi: abi.glpManager, target: factoryAddress, startFromOne: true }) const lpManagers = contracts.map(c => c.lpManager) - const token0s = await api.multiCall({ abi: "address:token0", calls: lpManagers }) - const token1s = await api.multiCall({ abi: "address:token1", calls: lpManagers }) - const aums = await api.multiCall({ abi: "function aum() returns (uint256 amount0, uint256 amount1)", calls: lpManagers }) - - api.add(token0s, aums.map(a => a.amount0)) - api.add(token1s, aums.map(a => a.amount1)) + const [token0s, token1s, aums] = await Promise.all([ + api.multiCall({ abi: "address:token0", calls: lpManagers, permitFailure: true }), + api.multiCall({ abi: "address:token1", calls: lpManagers, permitFailure: true }), + api.multiCall({ abi: "function aum() returns (uint256 amount0, uint256 amount1)", calls: lpManagers, permitFailure: true }) + ]) + + lpManagers.forEach((_lp, i) => { + const token0 = token0s[i] + const token1 = token1s[i] + const aum = aums[i] + if (!token0 || !token1 || !aum) return + api.add(token0, aum.amount0) + api.add(token1, aum.amount1) + }) } - const tokensAndOwners = [ - [addresses.tokens.uvrt, addresses.glp.stableRewardTracker], - [addresses.tokens.uvrt, addresses.glp.router], - [addresses.tokens.glp, addresses.glp.leverageStrategy], - ]; - return sumTokens2({ api, tokensAndOwners }); } async function tvl_ethereum(api) { - const balances = {}; - - const leftoverStrategy = await sdk.api.erc20 - .balanceOf({ - target: addresses.tokens.aura, - owner: addresses.aura.strategy, - }) - .then((result) => result.output); - sdk.util.sumSingleBalance(balances, addresses.tokens.aura, leftoverStrategy); - - const lockedBalance = await sdk.api.abi - .call({ - abi: lockerABI.at(0), - target: addresses.aura.locker, - params: addresses.aura.strategy, - }) - .then((result) => result.output[0]); - sdk.util.sumSingleBalance(balances, addresses.tokens.aura, lockedBalance); - - return balances; + const [leftoverStrategy, total] = await Promise.all([ + api.call({ target: addresses.tokens.aura, params: [addresses.aura.strategy], abi: 'erc20:balanceOf' }), + api.call({ target: addresses.aura.locker, params: [addresses.aura.strategy], abi: abi.locker }).then(res => res.total) + ]); + + [leftoverStrategy, total].forEach((bals) => { + api.add(addresses.tokens.aura, bals) + }); } + module.exports = { arbitrum: { - tvl, + tvl: tvl_arbitrum, + staking: stakings(addresses.stakingContracts, addresses.tokens.jones, "arbitrum"), pool2: pool2s(addresses.lpStaking, addresses.lps, "arbitrum", (addr) => { addr = addr.toLowerCase(); return `arbitrum:${jAssetToAsset[addr] ?? addr}`; }), - staking: stakings(addresses.stakingContracts, addresses.tokens.jones, "arbitrum"), }, ethereum: { tvl: tvl_ethereum, }, }; -// node test.js projects/jones-dao/index.js diff --git a/projects/joule/index.js b/projects/joule/index.js new file mode 100644 index 0000000000..bdbcff59f9 --- /dev/null +++ b/projects/joule/index.js @@ -0,0 +1,43 @@ +const { getResource } = require("../helper/chain/aptos") + +const CONTRACT_ADDRESS = "0x2fe576faa841347a9b1b32c869685deb75a15e3f62dfe37cbd6d52cc403a16f6" + +function replaceAtWith0x(str) { + if (str.startsWith('@')) { + return '0x' + str.slice(1); + } else { + return str; + } +} + +async function getPoolsData() { + const res = await getResource("0x7f83b020b8ab60dbdc4208029fa6aa0804bf5a71eeaca63382d24622b9e6f647", `${CONTRACT_ADDRESS}::pool::PoolConfigsMap`) + + const poolConfigsMap = res.pool_configs_map.data; + + return poolConfigsMap.map(item => ({ + coin: replaceAtWith0x(item.key), + total_lend: item.value.total_lend, + total_borrow: item.value.total_borrow + })); +} + +module.exports = { + timetravel: false, + methodology: + "Aggregates TVL for all markets in Joule.", + aptos: { + tvl: async (api) => { + const marketsData = await getPoolsData() + marketsData.forEach(({ coin, total_lend }) => { + api.add(coin, total_lend) + }) + }, + borrowed: async (api) => { + const marketsData = await getPoolsData() + marketsData.forEach(({ coin, total_borrow }) => { + api.add(coin, total_borrow) + }) + }, + } +}; diff --git a/projects/juicebox-v1/index.js b/projects/juicebox-v1/index.js index 693c5e8369..8f9403b7da 100644 --- a/projects/juicebox-v1/index.js +++ b/projects/juicebox-v1/index.js @@ -11,7 +11,7 @@ module.exports = { methodology: "Count the value of the Ether in the Juicebox V1 terminals", ethereum: { - start: 1626369243, // 2021-06-15 17:14:03 (UTC) + start: '2021-07-15', // 2021-06-15 17:14:03 (UTC) tvl: async (_, block) => sumTokens2({ block, tokensAndOwners: [ diff --git a/projects/juicebox-v2/index.js b/projects/juicebox-v2/index.js index 8ccfde45aa..f9bf57d759 100644 --- a/projects/juicebox-v2/index.js +++ b/projects/juicebox-v2/index.js @@ -10,7 +10,7 @@ module.exports = { methodology: "Count the value of the Ether in the Juicebox V2 terminal", ethereum: { - start: 1653853643, // 2022-05-29 19:47:23 (UTC) + start: '2022-05-29', // 2022-05-29 19:47:23 (UTC) tvl: async (_, block) => sumTokens2({ block, tokensAndOwners: [ diff --git a/projects/juicebox-v3/index.js b/projects/juicebox-v3/index.js index 5521467880..b109c4c410 100644 --- a/projects/juicebox-v3/index.js +++ b/projects/juicebox-v3/index.js @@ -13,7 +13,7 @@ module.exports = { methodology: "Count the value of the Ether in the Juicebox V3 terminals", ethereum: { - start: 1663679075, // 2022-10-20 15:04:35(UTC) + start: '2022-09-20', // 2022-10-20 15:04:35(UTC) tvl: async (_, block) => sumTokens2({ block, tokensAndOwners: [ diff --git a/projects/jumpdefi/index.js b/projects/jumpdefi/index.js index b75f250f77..ead26216fd 100644 --- a/projects/jumpdefi/index.js +++ b/projects/jumpdefi/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require("../helper/unknownTokens"); -module.exports = uniTvlExport("telos", "0xff59EBFf3e3F72E8162eA2aB0a0d1C9258692dF5", { fetchBalances: true }); +module.exports = uniTvlExport("telos", "0xff59EBFf3e3F72E8162eA2aB0a0d1C9258692dF5"); diff --git a/projects/justlend.js b/projects/justlend.js index ca90788a59..33547deab2 100644 --- a/projects/justlend.js +++ b/projects/justlend.js @@ -1,6 +1,44 @@ -const { compoundExports2 } = require('./helper/compound') +const { unhexifyTarget, } = require('@defillama/sdk/build/abi/tron'); const ADDRESSES = require('./helper/coreAssets.json') +const { sumTokens } = require('./helper/sumTokens') + +const comptroller = 'TGjYzgCyPobsNS9n6WcbdLVR9dH7mWqFx7' module.exports = { - tron: compoundExports2({ comptroller: 'TGjYzgCyPobsNS9n6WcbdLVR9dH7mWqFx7', cether: '0x2c7c9963111905d29eb8da37d28b0f53a7bb5c28', cetheEquivalent: ADDRESSES.null, transformAdressRaw: i => 'tron:' + i }), + tron: { + tvl, borrowed, + }, }; + +async function tvl(api) { + const markets = (await api.call({ abi: 'address[]:getAllMarkets', target: comptroller })).map(unhexifyTarget) + const cMarkets = ['TE2RzoSV3wFK99w6J9UnnZ4vLfXYoxvRwP'] + const tokensAndOwners = [] + const otherMarkets = [] + for (let i = 0; i < markets.length; i++) { + if (cMarkets.includes(markets[i])) { + tokensAndOwners.push([ADDRESSES.null, markets[i]]) + } else + otherMarkets.push(markets[i]) + } + + const underlyings = await api.multiCall({ abi: 'address:underlying', calls: otherMarkets }) + underlyings.forEach((t, i) => tokensAndOwners.push([t, otherMarkets[i]])) + return sumTokens({ chain: 'tron', tokensAndOwners }) +} + +async function borrowed(api) { + const markets = (await api.call({ abi: 'address[]:getAllMarkets', target: comptroller })).map(unhexifyTarget) + const cMarkets = ['TE2RzoSV3wFK99w6J9UnnZ4vLfXYoxvRwP'] + const otherMarkets = [] + for (let i = 0; i < markets.length; i++) { + if (!cMarkets.includes(markets[i])) + otherMarkets.push(markets[i]) + } + + const underlyings = await api.multiCall({ abi: 'address:underlying', calls: otherMarkets }) + const uBorrowed = await api.multiCall({ abi: 'uint256:totalBorrows', calls: otherMarkets }) + const cBorrowed = await api.multiCall({ abi: 'uint256:totalBorrows', calls: cMarkets }) + api.add(underlyings, uBorrowed) + api.add(ADDRESSES.null, cBorrowed) +} diff --git a/projects/k9-finance/index.js b/projects/k9-finance/index.js new file mode 100644 index 0000000000..7c8e195d0b --- /dev/null +++ b/projects/k9-finance/index.js @@ -0,0 +1,59 @@ +const { sumUnknownTokens } = require("../helper/unknownTokens"); + +const vestingSettingsAbi = "function settings() view returns (bool lockedOnly, uint64 backingRatio, uint64 vestingRatio, uint64 vestingPeriod)" + +const BONE_TOKEN = "0x9813037ee2218799597d83D4a5B6F3b6778218d9"; +const BONE_CONTRACT = "0x3358FCA51d7C0408750FBbE7777012E0b67C027F"; + +const REAL_YIELD_STAKING = "0xe13824Fb7b206E585c775B30431600528572C3E7"; +const KNINE_TOKEN = "0x91fbB2503AC69702061f1AC6885759Fc853e6EaE"; + +const FARMING_FABRIC = "0x8ed1A7c4736b5835560b0f9E961B8E3581774D42"; + +const VESTING = "0xf7384ba80A51979eC8cc0F17a843089ffD706f0a"; + +async function tvl(api) { + const bonesBalance = await api.call({ abi: "uint256:getTotalPooledBONE", target: BONE_CONTRACT, }); + // api.addToken(BONE_TOKEN, bonesBalance); + api.addCGToken('bone-shibaswap', bonesBalance / 1e18) +} + +async function pool2(api) { + const poolsAddresses = await api.call({ abi: "address[]:getAllCreatedPools", target: FARMING_FABRIC, }); + + const tokens = await api.multiCall({ abi: "address:pool", calls: poolsAddresses, }); + const bals = await api.multiCall({ abi: "uint256:intermediate", calls: poolsAddresses, }); + api.add(tokens, bals) + return sumUnknownTokens({ api, lps: tokens, useDefaultCoreAssets: true, resolveLP: true, }) +} + +async function vesting(api) { + const vestingSettings = await api.call({ abi: vestingSettingsAbi, target: VESTING, }); + const esKNINEAddress = await api.call({ abi: "address:esKNINE", target: VESTING, }); + + const esKNINEBalance = await api.call({ abi: "erc20:balanceOf", target: esKNINEAddress, params: VESTING, }); + const vestingRatio = vestingSettings[2]; + + const KNINEAmount = esKNINEBalance * vestingRatio / 100 + api.addToken(KNINE_TOKEN, KNINEAmount); + return sumUnknownTokens({ api, useDefaultCoreAssets: true, lps: ['0xF3452bCdEcaDa5E08ce56EC3D2BF8e35ECFFFF91'], }) +} +async function staking(api) { + const bal = await api.call({ abi: "erc20:balanceOf", target: KNINE_TOKEN, params: REAL_YIELD_STAKING, }); + + api.addToken(KNINE_TOKEN, bal); + return sumUnknownTokens({ api, useDefaultCoreAssets: true, lps: ['0xF3452bCdEcaDa5E08ce56EC3D2BF8e35ECFFFF91'],}) +} + +module.exports = { + methodology: + "Counts the liquidity locked inside the K9 Finance DAO protocol, including: the BONE amount locked at the Liquid Staking, the KNINE amount locked at the Real Yield Staking, the KNINE amount locked at the Vesting, the LP tokens locked at the Farming.", + ethereum: { + tvl, + }, + shibarium: { + staking, + pool2, + vesting, + }, +}; diff --git a/projects/kai/index.js b/projects/kai/index.js index 6cccb37455..d3b97e64bb 100644 --- a/projects/kai/index.js +++ b/projects/kai/index.js @@ -1,11 +1,11 @@ const ADDRESSES = require('../helper/coreAssets.json') const sui = require("../helper/chain/sui"); -const UsdcVault = { +const wUsdcVault = { id: '0x7a2f75a3e50fd5f72dfc2f8c9910da5eaa3a1486e4eb1e54a825c09d82214526', tType: ADDRESSES.sui.USDC } -const UsdtVault = { +const wUsdtVault = { id: '0x0fce8baed43faadf6831cd27e5b3a32a11d2a05b3cd1ed36c7c09c5f7bcb4ef4', tType: ADDRESSES.sui.USDT } @@ -13,9 +13,17 @@ const SuiVault = { id: '0x16272b75d880ab944c308d47e91d46b2027f55136ee61b3db99098a926b3973c', tType: ADDRESSES.sui.SUI } +const UsdcVault = { + id: '0x5663035df5f403ad5a015cc2a3264de30370650bc043c4dab4d0012ea5cb7671', + tType: ADDRESSES.sui.USDC_CIRCLE +} +const suiUsdtVault = { + id: '0x7a2e56773ad4d9bd4133c67ed0ae60187f00169b584a55c0204175897e41d166', + tType: ADDRESSES.sui.suiUSDT +} async function tvl(api) { - const vaults = [UsdcVault, UsdtVault, SuiVault] + const vaults = [wUsdcVault, wUsdtVault, SuiVault, UsdcVault, suiUsdtVault] const vaultObjs = await sui.getObjects(vaults.map(v => v.id)) for (let i = 0; i < vaults.length; i++) { diff --git a/projects/kaiafun/index.js b/projects/kaiafun/index.js new file mode 100644 index 0000000000..c045193c92 --- /dev/null +++ b/projects/kaiafun/index.js @@ -0,0 +1,12 @@ +const { sumTokensExport } = require('../helper/unwrapLPs'); + +// Canonical WKLAY +const WKLAY = '0x19aac5f612f524b754ca7e7c41cbfa2e981a4432'; + +module.exports.klaytn = { + methodology: 'TVL counts Canonical WKLAY coins in KaiaFun\'s Core Contract.', + tvl: sumTokensExport({ + owners: ["0x080f8b793fe69fe9e65b5ae17b10f987c95530bf"], + tokens: [WKLAY] + }), +}; diff --git a/projects/kalax/index.js b/projects/kalax/index.js index 49a4905a40..79466e4f99 100644 --- a/projects/kalax/index.js +++ b/projects/kalax/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { sumTokens2 } = require("../helper/unwrapLPs") const blastKalax = "0x2F67F59b3629Bf24962290DB9edE0CD4127e606D" @@ -18,8 +19,8 @@ async function tvl(api) { pools .filter((i) => i.assets !== kalax) .forEach((i)=>{ - if(i.assets === '0x0000000000000000000000000000000000000001'){ - i.assets ='0x0000000000000000000000000000000000000000' + if(i.assets === ADDRESSES.linea.WETH_1){ + i.assets =ADDRESSES.null } api.add(i.assets, i.tvl) }) @@ -29,7 +30,7 @@ async function tvl(api) { } -const usdt = "0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df" +const usdt = ADDRESSES.scroll.USDT const scrollKalaLp = "0x4fc09BE6eB49764CcAE4e95Bd2B93f67a34c0188" async function staking(api) { let farms = api.chain === 'blast'?blastfarms:scrollFarms @@ -53,6 +54,9 @@ async function staking(api) { } module.exports = { + hallmarks:[ + [1728777600,'Rugpull'] + ], blast: { tvl, staking, diff --git a/projects/kamino/api.js b/projects/kamino/api.js index 29a30ff912..e41670c743 100644 --- a/projects/kamino/api.js +++ b/projects/kamino/api.js @@ -1,7 +1,8 @@ -const { Kamino } = require('@hubbleprotocol/kamino-sdk') +const { Kamino } = require('@kamino-finance/kliquidity-sdk') const { getConnection, } = require('../helper/solana') async function tvl() { + throw new Error('Using rpc proxy now') const kamino = new Kamino('mainnet-beta', getConnection()); const shareData = await kamino.getStrategiesShareData({}); return { diff --git a/projects/kamino/index.js b/projects/kamino/index.js index c35d609f75..060baec168 100644 --- a/projects/kamino/index.js +++ b/projects/kamino/index.js @@ -1,8 +1,13 @@ -const { getExports } = require('../helper/heroku-api') + +const { kamino } = require("../helper/chain/rpcProxy") module.exports = { doublecounted: true, timetravel: false, - misrepresentedTokens: true, - ...getExports("kamino", ['solana']) + misrepresentedTokens: true, + solana: { tvl } +} + +async function tvl(api) { + api.addUSDValue(await kamino.tvl()) } \ No newline at end of file diff --git a/projects/kannagi-finance/index.js b/projects/kannagi-finance/index.js index 5e3dc9686d..26c9249b8c 100644 --- a/projects/kannagi-finance/index.js +++ b/projects/kannagi-finance/index.js @@ -35,4 +35,5 @@ helperReturn.era.tvl = tvlFunWrapper return helperReturn; } -module.exports = {...yieldHelperWrapper(), hallmarks:[[1690589340, "Rug"]]} +module.exports = {...yieldHelperWrapper(), hallmarks:[[1690589340, "Rug"]]}, +module.exports.deadFrom='2023-07-29' diff --git a/projects/kapinus/index.js b/projects/kapinus/index.js index 601109737a..6a2d5369ca 100644 --- a/projects/kapinus/index.js +++ b/projects/kapinus/index.js @@ -7,7 +7,6 @@ module.exports = { factory: '0x70e881fa43a7124e36639b54162395451cef1922', abi: 'uint256:allPairs', useDefaultCoreAssets: true, - fetchBalances: true, }) }, }; diff --git a/projects/karak/index.js b/projects/karak/index.js index 4596dcbd6e..b3e20d8482 100644 --- a/projects/karak/index.js +++ b/projects/karak/index.js @@ -1,21 +1,38 @@ +const { getLogs2 } = require('../helper/cache/getLogs') const { sumTokens2 } = require("../helper/unwrapLPs") const config = { - ethereum: { factory: '0x54e44dbb92dba848ace27f44c0cb4268981ef1cc', }, - arbitrum: { factory: '0x399f22ae52a18382a67542b3de9bed52b7b9a4ad', }, - karak: { factory: '0xB308474350D75447cA8731B7Ce87c9ee9DA03B1C', }, - mantle: { factory: '0x4a2b015CcB8658998692Db9eD4522B8e846962eD', }, - bsc: { factory: '0x4a2b015CcB8658998692Db9eD4522B8e846962eD', }, - blast: { factory: '0x58b5dc145ca2BE84fe087614CFe36055be609BB3', }, + ethereum: { v1: { factory: '0x54e44dbb92dba848ace27f44c0cb4268981ef1cc' }, v2: { factory: '0x7A91498D5fA6705d35c9406b752d6D50f49C9510', block: 21189340 }}, + arbitrum: { v1: { factory: '0x399f22ae52a18382a67542b3de9bed52b7b9a4ad' }, v2: { factory: '0xc4B3D494c166eBbFF9C716Da4cec39B579795A0d', block: 261874079 }}, + karak: { v1: { factory:'0xB308474350D75447cA8731B7Ce87c9ee9DA03B1C' }, v2: { factory: '0x1368AE21e85c9FA25f1aB579b6D3C6e20Ad6db04', block: 13814008 }}, + mantle: { v1: { factory: '0x4a2b015CcB8658998692Db9eD4522B8e846962eD'}, v2: { factory: '0x993E140Ba530E8Ffe1135ecef07ce7484f26CAA3', block: 71616200 }}, + bsc: { v1: { factory: '0x4a2b015CcB8658998692Db9eD4522B8e846962eD'}, v2: { factory: '0x93036971877E084DD303463628494c150572856D', block: 43813383 }}, + blast: { v1: { factory: '0x58b5dc145ca2BE84fe087614CFe36055be609BB3'} }, + fraxtal: { v1: { factory: '0xdF922c74CC0dc394022ea002Af5aFaa32348670e'}, v2: { factory: '0x04962047B6a9E8c99C8Da874D34c4285a87d541E', block: 11669871 } }, +} + +const eventAbi = 'event DeployedVault(address operator, address vault, address asset)' + +const karak_v1_tvl = async (api, { factory }) => { + const vaults = await api.call({ abi: 'address[]:getVaults', target: factory }) + const tokens = await api.multiCall({ abi: 'address:asset', calls: vaults }) + return sumTokens2({ api, tokensAndOwners2: [tokens, vaults] }) +} + +const karak_v2_tvl = async (api, { factory, block }) => { + const logs = await getLogs2({ api, target: factory, fromBlock: block, eventAbi }) + const vaults = logs.map(log => log[1]) + const tokens = logs.map(log => log[2]) + return sumTokens2({ api, tokensAndOwners2: [tokens, vaults] }) +} + +const tvl = async (api, factories) => { + const { v1, v2 } = factories + if (v1) await karak_v1_tvl(api, v1) + if (v2) await karak_v2_tvl(api, v2) } Object.keys(config).forEach(chain => { - const { factory, } = config[chain] - module.exports[chain] = { - tvl: async (api) => { - const vaults = await api.call({ abi: 'address[]:getVaults', target: factory }) - const tokens = await api.multiCall({ abi: 'address:asset', calls: vaults }) - return sumTokens2({ api, tokensAndOwners2: [tokens, vaults] }) - } - } + const factories = config[chain] + module.exports[chain] = { tvl: (api) => tvl(api, factories) } }) diff --git a/projects/kayak-uni-v3/index.js b/projects/kayak-uni-v3/index.js new file mode 100644 index 0000000000..9ed424e05f --- /dev/null +++ b/projects/kayak-uni-v3/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + scroll: { factory: '0x359d8BC3c4C70b8b73cf911aA5EfEC004146b663', fromBlock: 8564317, }, +}) diff --git a/projects/kayak/index.js b/projects/kayak/index.js index 9227635cfa..3204e9d4f3 100644 --- a/projects/kayak/index.js +++ b/projects/kayak/index.js @@ -2,7 +2,8 @@ const { getLogs2 } = require('../helper/cache/getLogs') const { sumTokens2 } = require('../helper/unwrapLPs') const config = { - avax: { factory: '0x4df3038C2C7e13F46F0d63eC3AF5728F75Be3775', fromBlock: 46950081, } + avax: { factory: '0x4df3038C2C7e13F46F0d63eC3AF5728F75Be3775', fromBlock: 46950081, }, + scroll: { factory: '0xA218beD0C2b487599A3799Bc318428e5219A7978', fromBlock: 8563591, }, } Object.keys(config).forEach(chain => { diff --git a/projects/kdlaunch/index.js b/projects/kdlaunch/index.js index d1c4dd3068..2da059a049 100644 --- a/projects/kdlaunch/index.js +++ b/projects/kdlaunch/index.js @@ -1,40 +1,12 @@ const { fetchLocal, mkMeta } = require("../helper/pact"); const network = (chainId) => `https://api.chainweb.com/chainweb/0.0/mainnet01/chain/${chainId}/pact`; -const GAS_PRICE = 0.00000001; const creationTime = () => Math.round(new Date().getTime() / 1000) - 10; const getReserve = (tokenData) => { return parseFloat(tokenData.decimal ? tokenData.decimal : tokenData); } -const getTokenToKadena = async (token) => { - const chainId = '3'; - let data = await fetchLocal({ - pactCode: ` - (use free.exchange) - (let* - ( - (p (get-pair ${token} coin)) - (reserveA (reserve-for p ${token})) - (reserveB (reserve-for p coin)) - )[reserveA reserveB]) - `, - meta: mkMeta("account", chainId, GAS_PRICE, 3000, creationTime(), 600), - }, network(chainId)); - - if (data.result.status === "success") { - const tokenReserve = getReserve(data.result.data[0]); - const kadenaReserve = getReserve(data.result.data[1]); - return kadenaReserve / tokenReserve; - } - - throw new Error(`Kadena fetch failed`); -} - -const fetchKdlPrice = async () => { - return await getTokenToKadena("kdlaunch.token"); -} const getTotalStakedKdl = async () => { const chainId = '1'; @@ -54,10 +26,9 @@ const getTotalStakedKdl = async () => { } async function fetchStakingTvl() { - const kdlPrice = await fetchKdlPrice(); const stakedKdl = await getTotalStakedKdl(); return { - kadena: stakedKdl * kdlPrice + kdlaunch: stakedKdl } } diff --git a/projects/keep3r/index.js b/projects/keep3r/index.js index 1c0b7e2ce0..8bbbffe31d 100644 --- a/projects/keep3r/index.js +++ b/projects/keep3r/index.js @@ -1,99 +1,53 @@ -const sdk = require("@defillama/sdk"); - const abis = require("./abis.js").abis; const registry = require("./registry.js").registry; -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); - -async function staking(_timestamp, block) { - const { KP3R, VKP3R } = registry; - const balances = {}; - - await sumTokensAndLPsSharedOwners(balances, [[KP3R, false]], [VKP3R], block); +const { staking } = require('../helper/staking'); +const { sumTokens2 } = require("../helper/unwrapLPs.js"); - // @dev should return stakingTvl - return balances; -} - -async function borrowed(_timestamp, block) { - /** @type {Balances} */ - const balances = {}; +async function borrowed(api) { const cyTokens = Object.values(registry.cTokens); - const { output: borrowed } = await sdk.api.abi.multiCall({ - block: block, - calls: cyTokens.map((coin) => ({ - target: coin, - })), - abi: abis.totalBorrows, - }); + const borrowed = await api.multiCall({ calls: cyTokens, abi: abis.totalBorrows, }); const ib = Object.values(registry.ibTokens); for (const idx in borrowed) { - sdk.util.sumSingleBalance( - balances, - ib[idx].toLowerCase(), - borrowed[idx].output - ); + api.add(ib[idx], borrowed[idx]) } - - return balances; } -async function tvl(_timestamp, block) { - /** @type {Balances} */ - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [registry.CVX, false], - [registry.DAI, false], - [registry.KP3R, false], - [registry.SUSHI, false], - [registry.CRV, false], - [registry.CVXCRV, false], - [registry.SPELL, false], - [registry.WETH, false], - ].concat( - [ - [registry.KPR_WETH_SUSHI_POOL, false], - [registry.USDC_ibAUD_POOL, false], - [registry.USDC_ibEUR_POOL, false], - [registry.USDC_ibKRW_POOL, false], - [registry.USDC_ibJPY_POOl, false], - [registry.USDC_ibGBP_POOL, false], - [registry.USDC_ibCHF_POOL, false], - ], - Object.values(registry.ibTokens).map((t) => [t, false]) - ), - [registry.YEARN_DEPLOYER, registry.BOND_TREASURY].concat( +async function tvl(api) { + const tokens = [ + registry.CVX, + registry.DAI, + registry.KP3R, + registry.SUSHI, + registry.CRV, + registry.CVXCRV, + registry.SPELL, + registry.WETH, + registry.KPR_WETH_SUSHI_POOL, + registry.USDC_ibAUD_POOL, + registry.USDC_ibEUR_POOL, + registry.USDC_ibKRW_POOL, + registry.USDC_ibJPY_POOl, + registry.USDC_ibGBP_POOL, + registry.USDC_ibCHF_POOL, + ].concat(Object.values(registry.ibTokens)) + + await api.sumTokens({ + tokens, owners: [registry.YEARN_DEPLOYER, registry.BOND_TREASURY].concat( Object.values(registry.cTokens), Object.values(registry.ibCrvGauges) ), - block - ); - - await sumTokensAndLPsSharedOwners( - balances, - Object.values(registry.Kp3rV2Klps).map((t) => [t, false]), - [registry.KP3RV2], - block - ); - - await sumTokensAndLPsSharedOwners( - balances, - Object.values(registry.Kp3rV1Slps).map((t) => [t, false]), - [registry.KP3R], - block - ); - - return balances; + }) + await api.sumTokens({ tokens: Object.values(registry.Kp3rV2Klps), owner: registry.KP3RV2, }) + await api.sumTokens({ tokens: Object.values(registry.Kp3rV1Slps), owner: registry.KP3R, }) + return sumTokens2({ api, resolveLP: true, }) } module.exports = { ethereum: { tvl, - staking, + staking: staking(registry.VKP3R, registry.KP3R), borrowed }, }; diff --git a/projects/keeper-dao/index.js b/projects/keeper-dao/index.js index 0220bd0596..6b1b9b7fcd 100644 --- a/projects/keeper-dao/index.js +++ b/projects/keeper-dao/index.js @@ -142,7 +142,7 @@ async function tvl(api) { } module.exports = { - start: 1611991703, // 01/30/2021 @ 07:28:23 AM +UTC + start: '2021-01-30', // 01/30/2021 @ 07:28:23 AM +UTC ethereum: { tvl } diff --git a/projects/kefirswap/index.js b/projects/kefirswap/index.js index a459ae97e6..cdd05b8a8a 100644 --- a/projects/kefirswap/index.js +++ b/projects/kefirswap/index.js @@ -9,6 +9,7 @@ module.exports = { hallmarks: [ [1656806400, "Rug Pull"] ], + deadFrom: '2022-07-03', methodology: "Count TVL as liquidity on the dex", misrepresentedTokens: true, kava: { diff --git a/projects/kelp-gain/index.js b/projects/kelp-gain/index.js new file mode 100644 index 0000000000..02aeab1095 --- /dev/null +++ b/projects/kelp-gain/index.js @@ -0,0 +1,9 @@ +const { sumERC4626VaultsExport } = require('../helper/erc4626') + +module.exports = { + doublecounted: true, + methodology: "TVL corresponds to the sum of rsETH from all active loans managed by the pool and the rsETH balance held within the pool.", + ethereum: { + tvl: sumERC4626VaultsExport({ vaults: ['0xe1b4d34e8754600962cd944b535180bd758e6c2e'], isOG4626: true }), + }, +} diff --git a/projects/kernel-dao/index.js b/projects/kernel-dao/index.js new file mode 100644 index 0000000000..43ca55a118 --- /dev/null +++ b/projects/kernel-dao/index.js @@ -0,0 +1,21 @@ +/** + * Kernel DAO contracts + * + * @see https://github.com/Kelp-DAO/kernel-smart-contracts-private/blob/develop/doc/contract-address/Mainnet.md + */ +const ASSET_REGISTRY = '0xd0B91Fc0a323bbb726faAF8867CdB1cA98c44ABB'; + + +async function tvl(api) { + const tokens = await api.call({ abi: 'address[]:getAssets', target: ASSET_REGISTRY}) + const vaults = await api.multiCall({ abi: 'function getVault(address) view returns (address)', calls: tokens, target: ASSET_REGISTRY}) + return api.sumTokens({ tokensAndOwners2: [tokens, vaults]}) +} + +module.exports = { + methodology: 'Calculates total TVL.', + start: 1733817000, + bsc: { + tvl, + } +}; diff --git a/projects/kewl/index.js b/projects/kewl/index.js index 90684e4225..0b7693686c 100644 --- a/projects/kewl/index.js +++ b/projects/kewl/index.js @@ -2,14 +2,13 @@ const { getUniTVL } = require("../helper/unknownTokens"); module.exports = { methodology: "We count liquidity of all paris through Factory Contract and Pools (single tokens) seccions through Factory Contract.", - start: 1701478462, //Dec-2-2023 3:54:26 PM +UTC + start: '2023-12-02', //Dec-2-2023 3:54:26 PM +UTC misrepresentedTokens: true, chz: { tvl: getUniTVL({ factory: "0xA0BB8f9865f732C277d0C162249A4F6c157ae9D0", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/kiloex/index.js b/projects/kiloex/index.js index d2980aad50..f2dc1bbf2d 100644 --- a/projects/kiloex/index.js +++ b/projects/kiloex/index.js @@ -8,20 +8,60 @@ const manta_stone_token = "0xEc901DA9c68E90798BbBb74c11406A32A70652C3"; const manat_manta_token = "0x95CeF13441Be50d20cA4558CC0a27B601aC544E5"; const taiko_owners = ["0x735D00A9368164B9dcB2e008d5Cd15b367649aD5", "0x235C5C450952C12C8b815086943A7bBCF96bc619","0x2646E743A8F47b8d2427dBcc10f89e911f2dBBaa"]; const bsquared_owners = ["0xA2E2F3726DF754C1848C8fd1CbeA6aAFF84FC5B2", "0x1EbEd4024308afcb05E6938eF8Ebd1ec5d6E8C46","0xB20Faa4BA0DdEbDe49299557f4F1ebB5532745e3"]; +const base_owners = ["0x43E3E6FFb2E363E64cD480Cbb7cd0CF47bc6b477", "0x7BC8D56cC78cF467C7230B77De0fcBDea9ac44cE","0xdf5ACC616cD3ea9556EC340a11B54859a393ebBB"]; module.exports = { - start: 1690971144, - bsc: { tvl: sumTokensExport({ owners, tokens: [ADDRESSES.bsc.USDT, ADDRESSES.ethereum.FDUSD, ADDRESSES.scroll.STONE], }) }, + start: '2023-08-02', + bsc: { tvl: sumTokensExport({ owners, tokens: [ + ADDRESSES.bsc.USDT, ADDRESSES.ethereum.FDUSD, ADDRESSES.scroll.STONE, + ADDRESSES.bsc.WBNB, //WBNB + '0xba2ae424d960c26247dd6c32edc70b295c744c43', //DOGE + ADDRESSES.bsc.BTCB, //BTCB + '0xb0b84d294e0c75a6abe60171b70edeb2efd14a1b',//slisBNB + '0x0782b6d8c4551b9760e74c0545a9bcd90bdc41e5',//lisUSD + ADDRESSES.bsc.USDC, //usdc + '0xf6718b2701d4a6498ef77d7c152b2137ab28b8a3', //stBTC + '0x4aae823a6a0b376de6a78e74ecc5b079d38cbcf7', //SolvBTC + '0x2a3dc2d5daf9c8c46c954b8669f4643c6b1c081a', //uBTC + ], }) }, op_bnb: { - tvl: sumTokensExport({ owners: opbnb_owners, tokens: [ADDRESSES.op_bnb.USDT, ADDRESSES.base.DAI,ADDRESSES.optimism.WETH_1] }) + tvl: sumTokensExport({ owners: opbnb_owners, tokens: [ + ADDRESSES.op_bnb.USDT, + ADDRESSES.base.DAI, //FDUSD + ADDRESSES.optimism.WETH_1, //WBNB + ADDRESSES.defiverse.USDC, //BTCB + ADDRESSES.defiverse.ETH, //ETH + + ] }) }, manta: { - tvl: sumTokensExport({ owners: manta_owners, tokens: [ADDRESSES.manta.USDT, manta_stone_token, manat_manta_token] }) + tvl: sumTokensExport({ owners: manta_owners, tokens: [ + ADDRESSES.manta.USDT, manta_stone_token, manat_manta_token, + '0x7746ef546d562b443ae4b4145541a3b1a3d75717', //vMANTA + ADDRESSES.manta.USDC, //USDC + ] }) }, taiko: { - tvl: sumTokensExport({ owners: taiko_owners, tokens: [ADDRESSES.taiko.USDC] }) + tvl: sumTokensExport({ owners: taiko_owners, tokens: [ + ADDRESSES.taiko.USDC, + ADDRESSES.taiko.USDC_e, //USDC.e + ] }) }, bsquared: { - tvl: sumTokensExport({ owners: bsquared_owners, tokens: [ADDRESSES.bsquared.USDT] }) + tvl: sumTokensExport({ owners: bsquared_owners, tokens: [ + ADDRESSES.bsquared.USDT, + ADDRESSES.bsquared.USDC, //USDC + ADDRESSES.bsquared.BSTONE, //BSTONE + ADDRESSES.bsquared.UBTC,//uBTC + ] }) + }, + base: { + tvl: sumTokensExport({ owners: base_owners, tokens: [ + ADDRESSES.base.USDC, //USDC + '0x3b86ad95859b6ab773f55f8d94b4b9d443ee931f', //SolvBTC + '0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf',//cbBTC + ADDRESSES.blast.weETH,//weETH + ADDRESSES.base.wstETH,//wstETH + ] }) }, }; diff --git a/projects/kimberlite/config.js b/projects/kimberlite/config.js index 4da89a31c9..aa21ddd727 100644 --- a/projects/kimberlite/config.js +++ b/projects/kimberlite/config.js @@ -49,6 +49,11 @@ const config = { locker: "0xE4E56E5e234783BCb77A80e19C8B3B5b42588AAb", startBlock: 4533304 }, + kimberliteSafeApe: { + chain: "apechain", + locker: "0xE4E56E5e234783BCb77A80e19C8B3B5b42588AAb", + startBlock: 7797536 + }, } module.exports = { diff --git a/projects/kinetix-v2/index.js b/projects/kinetix-v2/index.js index b8c1fa524f..e954dd1f36 100644 --- a/projects/kinetix-v2/index.js +++ b/projects/kinetix-v2/index.js @@ -6,14 +6,12 @@ module.exports = { tvl: getUniTVL({ factory: "0xE8E917BC80A26CDacc9aA42C0F4965d2E1Fa52da", useDefaultCoreAssets: true, - fetchBalances: true, }), }, base: { tvl: getUniTVL({ factory: "0x8aD3d3e6B1b7B65138bD508E48330B544539b2C3", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/kinetix-v3/index.js b/projects/kinetix-v3/index.js index 4f26b6b52c..8361c26f38 100644 --- a/projects/kinetix-v3/index.js +++ b/projects/kinetix-v3/index.js @@ -1,12 +1,16 @@ -const { uniV3Export } = require("../helper/uniswapV3"); +const { uniV3GraphExport } = require('../helper/uniswapV3') -module.exports = uniV3Export({ +module.exports = { kava: { - factory: "0x2dBB6254231C5569B6A4313c6C1F5Fe1340b35C2", - fromBlock: 6069472, + tvl: uniV3GraphExport({ + graphURL: 'https://kava-graph-node.metavault.trade/subgraphs/name/kinetixfi/v3-subgraph', + name: 'kinetixfi/kava-v3', + }) }, base: { - factory: "0xdDF5a3259a88Ab79D5530eB3eB14c1C92CD97FCf", - fromBlock: 14195510, - }, -}); + tvl: uniV3GraphExport({ + graphURL: 'https://api.studio.thegraph.com/query/55804/kinetixfi-base-v3/version/latest', + name: 'kinetixfi/base-v3', + }) + } +} diff --git a/projects/kinetix/index.js b/projects/kinetix/index.js index d6e0c16762..062d667e7c 100644 --- a/projects/kinetix/index.js +++ b/projects/kinetix/index.js @@ -1,7 +1,12 @@ const { gmxExports } = require('../helper/gmx') +const { staking } = require('../helper/staking'); + +const KAI_ADDRESS_KAVA = "0x52369B1539EA8F4e1eadEEF18D85462Dcf9a3658" +const veKAI_ADDRESS_KAVA = "0x2A0A26D08E2F7A8E86431Ddf6910Fe7cD59b9908" module.exports = { kava: { - tvl: gmxExports({ vault: "0xa721f9f61CECf902B2BCBDDbd83E71c191dEcd8b", }) + tvl: gmxExports({ vault: "0xa721f9f61CECf902B2BCBDDbd83E71c191dEcd8b", }), + staking: staking(veKAI_ADDRESS_KAVA, KAI_ADDRESS_KAVA), }, }; \ No newline at end of file diff --git a/projects/kittypunch/index.js b/projects/kittypunch/index.js new file mode 100644 index 0000000000..013a8ba469 --- /dev/null +++ b/projects/kittypunch/index.js @@ -0,0 +1,5 @@ +const { uniTvlExports } = require("../helper/unknownTokens") + +module.exports = uniTvlExports({ + flow: "0x29372c22459a4e373851798bFd6808e71EA34A71" +}) \ No newline at end of file diff --git a/projects/klap/index.js b/projects/klap/index.js index ff539335d6..4c7c3a5107 100644 --- a/projects/klap/index.js +++ b/projects/klap/index.js @@ -2,6 +2,9 @@ const { aaveExports } = require("../helper/aave"); const methodologies = require("../helper/methodologies"); module.exports = { + deadFrom: "2023-09-17", methodology: methodologies.lendingMarket, klaytn: aaveExports('klaytn', '0x969E4A05c2F3F3029048e7943274eC2E762497AB'), } + +module.exports.klaytn.borrowed = () => ({}) // bad debt diff --git a/projects/klaylend/index.js b/projects/klaylend/index.js index e0eb6d0f59..a0fe378587 100644 --- a/projects/klaylend/index.js +++ b/projects/klaylend/index.js @@ -12,4 +12,5 @@ module.exports = masterchefExports({ }) module.exports.hallmarks = [ [1662336000, "Rug Pull"] -] \ No newline at end of file +], +module.exports.deadFrom = 1662336000 \ No newline at end of file diff --git a/projects/klend/index.js b/projects/klend/index.js index 1cc6f5d58f..b8f20192f4 100644 --- a/projects/klend/index.js +++ b/projects/klend/index.js @@ -1,19 +1,19 @@ const ADDRESSES = require('../helper/coreAssets.json') const sdk = require('@defillama/sdk'); -const {compoundExports} = require('../helper/compound'); -const {unwrapUniswapLPs} = require('../helper/unwrapLPs'); +const { compoundExports } = require('../helper/compound'); +const { unwrapUniswapLPs } = require('../helper/unwrapLPs'); // BSC const unitroller = "0xA6bEd5B7320941eA185A315D1292492F7Fdd1e5c"; const kBnb = "0x2C334c6cBC0547e759084bD8D469f933B17Ff481"; const wbnb = ADDRESSES.bsc.WBNB const bscPools = [ - "0xf1D447656692d51d4DB7057104Ac6E97029A7790", - "0x95D4D2D88C96cE96c97A912Aa7122715716013D4" + "0xf1D447656692d51d4DB7057104Ac6E97029A7790", + "0x95D4D2D88C96cE96c97A912Aa7122715716013D4" ]; const okexPools = [ - "0x2404c9F6Ba2d4D5c73d86b3E3b9D7F6c70ba3448", - "0x5A74de8e3D0c46c106AB769d50bf9CAF8681D30d" + "0x2404c9F6Ba2d4D5c73d86b3E3b9D7F6c70ba3448", + "0x5A74de8e3D0c46c106AB769d50bf9CAF8681D30d" ]; const lpAbi = 'address:lp' // OKEX @@ -23,60 +23,56 @@ const wokt = ADDRESSES.okexchain.WOKT async function pool2Tvl(balances, chainBlocks, chain, pools) { - let lpofPools = (await sdk.api.abi.multiCall({ - calls: pools.map(p => ({ - target: p - })), - abi: lpAbi, - block: chainBlocks, - chain: chain - })).output; + let lpofPools = (await sdk.api.abi.multiCall({ + calls: pools.map(p => ({ + target: p + })), + abi: lpAbi, + block: chainBlocks, + chain: chain + })).output; - let lpBalances = (await sdk.api.abi.multiCall({ - calls: lpofPools.map(p => ({ - target: p.output, - params: p.input.target - })), - abi: "erc20:balanceOf", - block: chainBlocks, - chain: chain - })).output; + let lpBalances = (await sdk.api.abi.multiCall({ + calls: lpofPools.map(p => ({ + target: p.output, + params: p.input.target + })), + abi: "erc20:balanceOf", + block: chainBlocks, + chain: chain + })).output; - let lpPositions = []; - for (let i in lpBalances) { - lpPositions.push({ - balance: lpBalances[i].output, - token: lpBalances[i].input.target - }); - } + let lpPositions = []; + for (let i in lpBalances) { + lpPositions.push({ + balance: lpBalances[i].output, + token: lpBalances[i].input.target + }); + } - await unwrapUniswapLPs(balances, lpPositions, chainBlocks, chain, addr=>`${chain}:${addr}`); + await unwrapUniswapLPs(balances, lpPositions, chainBlocks, chain, addr => `${chain}:${addr}`); } async function bscPool2(timestamp, block, chainBlocks) { - let balances = {}; - - await pool2Tvl(balances, chainBlocks.bsc, "bsc", bscPools); - - return balances; + let balances = {}; + await pool2Tvl(balances, chainBlocks.bsc, "bsc", bscPools); + return balances; } async function okexPool2(timestamp, block, chainBlocks) { - let balances = {}; - - await pool2Tvl(balances, chainBlocks.okexchain, "okexchain", okexPools); - - return balances; + let balances = {}; + await pool2Tvl(balances, chainBlocks.okexchain, "okexchain", okexPools); + return balances; } module.exports = { - bsc: { - ...compoundExports(unitroller, "bsc", kBnb, wbnb), - pool2: bscPool2 - }, - okexchain: { - ...compoundExports(okexUnitroller, "okexchain", kOkt, wokt), - pool2: okexPool2 - } + bsc: { + ...compoundExports(unitroller, kBnb, wbnb), + pool2: bscPool2 + }, + okexchain: { + ...compoundExports(okexUnitroller, kOkt, wokt), + pool2: okexPool2 + } } \ No newline at end of file diff --git a/projects/klever-exchange/index.js b/projects/klever-exchange/index.js index 75626130cf..2c6c205e08 100644 --- a/projects/klever-exchange/index.js +++ b/projects/klever-exchange/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -18,11 +19,7 @@ const config = { ] }, bitcoin: { - owners: [ - 'bc1qze8pn5vywzk8enqdr9ve28lyas23kurzd37027', - 'bc1qgy5zyuvsw5wnt5lrx3m62tt2pmdl69avd5vw6n', - 'bc1qk4l4u3lh7rrufsw0z6vmkln5kesf0a9q0srnkr' - ] + owners: bitcoinAddressBook.kleverExchange }, } diff --git a/projects/klondike/index.js b/projects/klondike/index.js index 80b23854d4..4e8df2ff23 100644 --- a/projects/klondike/index.js +++ b/projects/klondike/index.js @@ -1,8 +1,7 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const { staking } = require("../helper/staking"); const { pool2 } = require("../helper/pool2"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { sumTokens2 } = require("../helper/unwrapLPs"); const stakingContract = "0xAcbdB82f07B2653137d3A08A22637121422ae747"; const KlonX = "0xbf15797BB5E47F6fB094A4abDB2cfC43F77179Ef"; @@ -23,31 +22,12 @@ const fundContracts = [ "0x3BE908C22D21ab32C5A04CFCa3a9A70d4FEfc098", ]; -async function ethTvl(block) { - const balances = {}; - - for (const pool of [KWBTCWBTCLPKlonXPool, KXUSDDAILPKlonXPool]) { - await sumTokensAndLPsSharedOwners( - balances, - pool == KWBTCWBTCLPKlonXPool - ? [[WBTC_KBTC_UNI, true]] - : [[KXUSD_DAI_UNI, true]], - [pool] - ); - } - - const tokenAddresses = ( - await sdk.api.abi.call({ - abi: abi.allAllowedTokens, - target: fundContracts[0], - }) - ).output; - - for (const token of tokenAddresses) { - await sumTokensAndLPsSharedOwners(balances, [[token, false]], fundContracts); - } - - return balances; +async function ethTvl(api) { + const tokenAddresses = await api.call({ abi: abi.allAllowedTokens, target: fundContracts[0], }) + tokenAddresses.push(WBTC_KBTC_UNI, KXUSD_DAI_UNI) + fundContracts.push(KWBTCWBTCLPKlonXPool, KXUSDDAILPKlonXPool) + + return sumTokens2({ api, tokens: tokenAddresses, owners: fundContracts, resolveLP: true }) } module.exports = { diff --git a/projects/knightdex/index.js b/projects/knightdex/index.js index dade05359c..4baf3d7120 100644 --- a/projects/knightdex/index.js +++ b/projects/knightdex/index.js @@ -2,6 +2,6 @@ const {getUniTVL} = require("../helper/unknownTokens"); module.exports = { op_bnb: { - tvl: getUniTVL({factory: "0xAe9F4488CC751637b18070c5453a3b7Acc137a3b", useDefaultCoreAssets: true, fetchBalances: true, }) + tvl: getUniTVL({factory: "0xAe9F4488CC751637b18070c5453a3b7Acc137a3b", useDefaultCoreAssets: true, }) }, } diff --git a/projects/knitfinance/index.js b/projects/knitfinance/index.js index c3adaaece5..81226c1fbc 100644 --- a/projects/knitfinance/index.js +++ b/projects/knitfinance/index.js @@ -51,6 +51,7 @@ module.exports = { }; function addChain(chain) { + module.exports.deadFrom = "2023-02-01" module.exports[chain] = { tvl: async () => { const balances = {} diff --git a/projects/kogefarm/abi.json b/projects/kogefarm/abi.json deleted file mode 100644 index 7106043696..0000000000 --- a/projects/kogefarm/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "balance": "uint256:balance", - "token": "address:token" -} \ No newline at end of file diff --git a/projects/kogefarm/index.js b/projects/kogefarm/index.js index 0ca96c5eac..6708969d45 100644 --- a/projects/kogefarm/index.js +++ b/projects/kogefarm/index.js @@ -1,5 +1,4 @@ const { sumUnknownTokens } = require('../helper/unknownTokens') -const abi = require('./abi.json') const { getConfig } = require('../helper/cache') const kogeMasterChefAddr = '0x6275518a63e891b1bC54FEEBBb5333776E32fAbD' @@ -27,32 +26,56 @@ const _kogePool2 = [ ] const config = { - kava: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/kava_vault_addresses.json', }, - moonriver: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/movr_vault_addresses.json', }, - fantom: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/ftm_vault_addresses.json', }, - polygon: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/vaultaddresses', }, + kava: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/kava_vault_addresses.json' }, + moonriver: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/movr_vault_addresses.json' }, + fantom: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/ftm_vault_addresses.json' }, + polygon: { endpoint: 'https://raw.githubusercontent.com/kogecoin/vault-contracts/main/vaultaddresses' }, +} + +const abi = { + strategy: "function strategy() view returns (address)", + balance: "uint256:balance", + token: "address:token", + balanceOfPool: "function balanceOf() view returns (uint256)" } Object.keys(config).forEach(chain => { - const { endpoint } = config[chain] + const { endpoint } = config[chain]; module.exports[chain] = { tvl: async (api) => { - let info = (await getConfig('kogefarm/' + chain, endpoint)) - if (typeof info === 'string') info = JSON.parse(vaults.replace(/,(\s*[}\]])/g, '$1')) - let vaults = chain === 'polygon' ? info : info.map(v => v.vault) - if (chain === 'polygon') - vaults = vaults.filter(v => !_kogePool2.includes(v)) - const tokens = await api.multiCall({ abi: abi.token, calls: vaults }) - const bals = await api.multiCall({ abi: abi.balance, calls: vaults }) - api.addTokens(tokens, bals) - return sumUnknownTokens({ api, resolveLP: true, }) + let info = await getConfig('kogefarm/' + chain, endpoint); + if (typeof info === 'string') info = JSON.parse(info.replace(/,(\s*[}\]])/g, '$1')); + + let vaults = chain === 'polygon' ? info : info.map(v => v.vault); + if (chain === 'polygon') { + vaults = vaults.filter(v => !_kogePool2.includes(v)); + const [tokens, bals] = await Promise.all([ + api.multiCall({ abi: abi.token, calls: vaults }), + api.multiCall({ abi: abi.balance, calls: vaults }) + ]); + api.addTokens(tokens, bals); + + } else { + const [tokens, strategies] = await Promise.all([ + api.multiCall({ abi: abi.token, calls: vaults }), + api.multiCall({ abi: abi.strategy, calls: vaults }) + ]); + + const balanceOfPools = await api.multiCall({ calls: strategies, abi: abi.balanceOfPool }); + api.addTokens(tokens, balanceOfPools); + } + return sumUnknownTokens({ api, resolveLP: true }); } - } -}) + }; +}); + + module.exports.polygon.pool2 = async (api) => { - const tokens = await api.multiCall({ abi: abi.token, calls: _kogePool2 }) - const bals = await api.multiCall({ abi: abi.balance, calls: _kogePool2 }) + const [tokens, bals] = await Promise.all([ + api.multiCall({ abi: abi.token, calls: _kogePool2 }), + api.multiCall({ abi: abi.balance, calls: _kogePool2 }) + ]) api.addTokens(tokens, bals) return sumUnknownTokens({ api, resolveLP: true, tokens: ['0x3885503aef5e929fcb7035fbdca87239651c8154'], owner: kogeMasterChefAddr, }) } diff --git a/projects/kokomo/index.js b/projects/kokomo/index.js index 3a95257d7a..da8909d969 100644 --- a/projects/kokomo/index.js +++ b/projects/kokomo/index.js @@ -4,6 +4,9 @@ module.exports = { hallmarks: [ [1680264000,"Rug Pull"] ], - optimism: compoundExports('0x91c471053bA4697B13d62De1E850Cc89EbE23633', 'optimism'), - arbitrum: compoundExports('0x91c471053bA4697B13d62De1E850Cc89EbE23633', 'arbitrum'), + optimism: compoundExports('0x91c471053bA4697B13d62De1E850Cc89EbE23633'), + arbitrum: compoundExports('0x91c471053bA4697B13d62De1E850Cc89EbE23633'), } + +module.exports.optimism.borrowed = () => ({}) +module.exports.deadFrom = 1680264000 \ No newline at end of file diff --git a/projects/kongswap/index.js b/projects/kongswap/index.js new file mode 100644 index 0000000000..41e8df6946 --- /dev/null +++ b/projects/kongswap/index.js @@ -0,0 +1,11 @@ +const { get } = require('../helper/http') + +module.exports = { + misrepresentedTokens: true, + icp: { tvl }, +} + +async function tvl(api) { + let { tvlUSD } = await get('https://api.kongswap.io/api/defillama/tvl') + api.addCGToken('tether', Math.round(tvlUSD)) +} diff --git a/projects/kopi/index.js b/projects/kopi/index.js new file mode 100644 index 0000000000..dc7e08916a --- /dev/null +++ b/projects/kopi/index.js @@ -0,0 +1,16 @@ +const { sumTokens } = require('../helper/chain/cosmos'); + +async function tvl(api) { + return sumTokens({ api, owner: 'kopi14t4jnhmjejj08x5w8f4t0r3lv820gvh85xw8np', blacklistedTokens: [ + // excluding projects own tokens + 'ukopi', + 'ukusd', + ]}) +} + +module.exports = { + kopi: { + tvl + } +}; + diff --git a/projects/korbit/index.js b/projects/korbit/index.js index ce8fb929e0..03fb6da66a 100644 --- a/projects/korbit/index.js +++ b/projects/korbit/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -14,29 +15,7 @@ const config = { ], }, bitcoin: { - owners: [ - '1JtAupan5MSPXxSsWFiwA79bY9LD2Ga1je', - '3E8BTrBB7jxAemyUqSnN4YFLMC22cShZJZ', - '3GoBetHTvfnaRNQbR4yy5YNUjX4d8mTQKK', - 'bc1q09j44e0xxxusj3zsan20x7tuvtumxfv9smlq27t0nwp57gxf7htqq6m9lj', - 'bc1q0uffd8egas4w87dxq998ttfl6j3jtw6k7cafce9v4mvr5qc9tvfq9czqk9', - 'bc1q33m8td986p3vcnap9zqpx3d8v8zujtkvqacsya5xfvf945vmvxzqth4h4t', - 'bc1q3yn06lfl8ayjukya52ksff0uaveurfc8lm3ftdgu8ywvwanx8lqswj7w9u', - 'bc1q4sv2fxlp6w08wkq8ywmughxkm7n75d2fmrgnmvwun6rhepyknjxqm99v4x', - 'bc1q7fww9657ts2au45wh0ed39rjze6ja93z0498z4j89pqjky266wzs0sz8ka', - 'bc1q9pnwfyd4jtkulyk4w057wsdjhykaw6fftw06k2cn2m3y7jlsfe2qvxvm8e', - 'bc1qa8may4g0yzezjyesqcq0mwggy5wwzl0yhs0a8tk9ucej5qg6ujfqscv2jq', - 'bc1qgkx4ee8ac3as5y4ddhw6uedyk9adsywdzgc0fzxv304lcrh4qs9sn96agt', - 'bc1qku6z53kuyaj9r898kj6esqnwz7wke82mwgw43vhu33ld7sx3200s2u9p9x', - 'bc1ql0p3klhr2d8z07ja3t5d5dnxrenhp4gcjeszxpfflr08zaqqx5zqpkeqnl', - 'bc1qnerwvz93pcj653r5yd4hnd2d7np2drhdhyruj7qdvl3psc5wnf0q6x9me4', - 'bc1qs9ut74nue7vjknz2eqxegmtuzqhjzx9y8tzjymvlg05v8a5ffr5qz402cx', - 'bc1qsk6h7d2l7e7r2a8krlxjn6wdnhhszyrtzcugdsfa5zz4syajzl5spd52h5', - 'bc1qsmqvkwrsy5xw2hm885l5fv7s2hxzauz5fn9jayfmd86305wehrts2lztgs', - 'bc1qtlen0nuvln3aqcn2r3nljshdmzakq7z5z4rexpk23mj8u8lmc8ysc29jct', - 'bc1qzdt5z4f46jak59jku5jmvv3f2ru20htqs7jhy0whazgd5v4626eq4vkxqz', - 'bc1qzu4lnzfpskwsvnyvzud9a7ru4d2ft7whqvl5d3kskxxhgeupnjjquzvt97', - ] + owners: bitcoinAddressBook.korbit }, ripple: { owners: [ diff --git a/projects/kraken-btc/index.js b/projects/kraken-btc/index.js new file mode 100644 index 0000000000..fee50c310c --- /dev/null +++ b/projects/kraken-btc/index.js @@ -0,0 +1,7 @@ +const { sumTokensExport } = require('../helper/sumTokens') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +// https://www.kraken.com/kbtc +module.exports = { + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.krakenBTC }) } +} \ No newline at end of file diff --git a/projects/kraken/index.js b/projects/kraken/index.js index 89911dc81a..f690c4eb30 100644 --- a/projects/kraken/index.js +++ b/projects/kraken/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -21,21 +22,11 @@ const config = { ], }, bitcoin: { + owners: bitcoinAddressBook.kraken, + }, + starknet: { owners: [ - 'bc1qnhmemsqfhycvp6g50v732h7wfwdt68el4ux5ttu8xwsrzngmxv0qr55aga', - 'bc1qa5aux0l2c3l99tpmd9c85770kqpksg3g6dxaw03jj6lphnwy4lqq68xfgc', - 'bc1q3gqqnn9hr0uachfk6rv3qhf3pp9z8a4z63ksc5qu0c2vvtykqd9qj3fyum', - 'bc1qplr053c80nzlqapuatfslyhmns6sfn32qzz3xkdn36jjryw8vsys8y7wlc', - 'bc1qhxv3pg2hsnw3m9jukuc6erjwwd03rzwhd2k6zh5uf6s2lwpuv3rq9zefru', - 'bc1q08n37tm63z3f0myqe6zjx7ymtng8c9qedpwpplq95qkmx0cpke7qyz4y8v', - 'bc1q02cq8du8r7ktuy5l0ltc4cv82xnaw4upaaw8y4rq6uycdp0k5nmquljtzk', - 'bc1qcf9qe8ytx5qlcq0ft4vm2xm3fyfvurrkende46hpmwwnzpctfu3szxpve2', - 'bc1qrj5vg73fxs6h6pmdjld387j5szkswc2y39rfutw8gl93h647wpksukyln9', - 'bc1q9hqaqzyf6zsd330pkvtq5uxcxprzr368zdsxx5srtep7kepx523q2gd0ef', - 'bc1q36l8mssxdlncj7njkqvayv3jumked9jdtjxete66cxnzluf4j0msjm4w80', - 'bc1qs8cyln26t2f5rwu2frnqvtltfxt0qqql0elmhrpsexlzveap82eqtyvsgu', - 'bc1qcds58swh4g6zsdmws9ltcdpqz4l44utu5wv9vfpmemps3whgdacqkakrk0', - 'bc1q75tsfq2c5cqp2ss32qksmnzd9yea2mjsjktdmrz900dcmg43ck4s66sgjx', + '0x620102ea610be8518125cf2de850d0c4f5d0c5d81f969cff666fb53b05042d2' ], }, } diff --git a/projects/kriya-dex-earn/index.js b/projects/kriya-dex-earn/index.js index f96382b549..02986229aa 100644 --- a/projects/kriya-dex-earn/index.js +++ b/projects/kriya-dex-earn/index.js @@ -1,11 +1,14 @@ const { fetchURL } = require("../helper/utils"); const sui = require("../helper/chain/sui"); -const vaultUrl = - "https://88ob93rfva.execute-api.ap-southeast-1.amazonaws.com/release/vaults"; +const clmmVaultUrl = + "https://vjkibmct3h.execute-api.ap-southeast-1.amazonaws.com/release/vaults"; -async function vaultTVL(api) { - const vaults = (await fetchURL(vaultUrl))?.data; +const llVaultUrl = + "https://c19eainr59.execute-api.ap-southeast-1.amazonaws.com/release/defilama/vaults"; + +async function clmmVaultTVL(api) { + const vaults = (await fetchURL(clmmVaultUrl))?.data; for (const vault of vaults) { const tokenX = Number(vault?.coinA); const tokenY = Number(vault?.coinB); @@ -15,12 +18,26 @@ async function vaultTVL(api) { } } +async function llVaultTVL(api) { + const vaults = (await fetchURL(llVaultUrl))?.data; + for (const vault of vaults) { + const aumBaseTokenReserve = Number(vault?.aumInBaseToken); + + api.add(vault?.pool?.tokenXType, aumBaseTokenReserve); + } +} + +async function vaultsTVL(api) { + await llVaultTVL(api); + await clmmVaultTVL(api); +} + module.exports = { timetravel: true, misrepresentedTokens: false, methodology: "Collets all the TVL from the KriyaDEX vaults. The TVL is denominated in USD.", sui: { - tvl: vaultTVL, + tvl: vaultsTVL, }, }; diff --git a/projects/kryptonite/index.js b/projects/kryptonite/index.js index d2584d3830..dc3a8ad3c5 100644 --- a/projects/kryptonite/index.js +++ b/projects/kryptonite/index.js @@ -1,5 +1,11 @@ const { queryContractWithRetries, getToken, getTokenBalance } = require("../helper/chain/cosmos"); +const getReservesAbi = "function getReserves() view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast)"; +const totalSupplyAbi = "uint256:totalSupply"; +const decimalsAbi = "uint256:decimals"; +const token0Abi = "address:token0"; +const token1Abi = "address:token1"; + // node test.js projects/kryptonite/index.js const config = { sei: { @@ -23,13 +29,32 @@ const config = { lp: "sei1hxh76ty0fk9esq3qsvrhzz6fsvmh55j59xnduswn6dfnsyjs06vqcye8yf", pair: "sei1qgyrkxvnydcvtzj8w6e4n2p07pykxw4y25ntncz5a4puz6fd6e9slq6jgk", staking: "sei1400dydwghdkpxz9tqzv2f9nr7p04tvwawkvxsxf9xqvylec593fs73vr53" + }, + { + name: "SEILOR-USEI-WLP", + lp: "sei1lahjp2h2wchtncxsszpjeu5kr77wmn6uh354hu0l57pym9p3mvys8qnpp6", + lpEvm: "0xe7d76b9affb1f7a7bcf0b9206386d570e16bc17a", + pair: "sei1lahjp2h2wchtncxsszpjeu5kr77wmn6uh354hu0l57pym9p3mvys8qnpp6", + staking: "sei1ckske9cf8kw9ea66n5p3xpnz4ns3ruw052zcyhdsqpm54jjy3t9qjn7c7l", + wrapperLpEvm: true + }, + { + name: "STSEI-USEI-WLP", + lp: "sei16pe95h9uujjdp660tzsuv0utp9zymw926j604lx3p53rsy2tjh3s7ypvnu", + lpEvm: "0xa543dfa5c278d0d8499676e17b7f6bfd8ce18e39", + pair: "sei16pe95h9uujjdp660tzsuv0utp9zymw926j604lx3p53rsy2tjh3s7ypvnu", + staking: "sei1488mn0n3j3dv36nk9t2zkz3c5x8xsmfkmx36qg57z2xnkl6a5tns6stzm6", + wrapperLpEvm: true } ], coinGeckoMap: { usei: "sei-network", - sei1ln7ntsqmxl8s502f83km9a475zyhcfhpj7v2fsm3pcmckdyys3tsktx9vk: "sei-network", - sei1xq7g6asf63mkv7t5jkfu6uf8jpzkvwnu4zl2kh4cfvk0ynxvvksqf7z3d2: "sei-network", - sei10knxlv9e54z0xcywdhtycc63uf970aefeec73ycqwd75ep9nu45sh66m6a: "kryptonite", + "0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7": "sei-network", // wSEI EVM + sei1xq7g6asf63mkv7t5jkfu6uf8jpzkvwnu4zl2kh4cfvk0ynxvvksqf7z3d2: "sei-network", // bSEI + sei1ln7ntsqmxl8s502f83km9a475zyhcfhpj7v2fsm3pcmckdyys3tsktx9vk: "kryptonite-staked-sei", // stSEI + "0xe5085112160fF75ee89a540Cdba570eAFdAF7f57": "kryptonite-staked-sei", // stSEI EVM + sei10knxlv9e54z0xcywdhtycc63uf970aefeec73ycqwd75ep9nu45sh66m6a: "kryptonite", // SEILOR + "0x89aeC21572F6637cCbd0d66861AAAC46Dd775ed1": "kryptonite", // SEILOR EVM sei1hrndqntlvtmx2kepr0zsfgr7nzjptcc72cr4ppk4yav58vvy7v3s4er8ed: "seiyan" } }, @@ -64,26 +89,47 @@ Object.keys(config).forEach(chain => { }, pool2: async (api) => { // Logic for calculating the value of staked LP tokens - for (let { lp, pair, staking, pairInfo } of seilorLps) { - const lpTokenInfo = await queryContractWithRetries({ contract: lp, chain, data: { token_info: {} } }); - const stakingState = await queryContractWithRetries({ contract: staking, chain, data: { query_staking_state: {} } }); - if (!pairInfo) { - pairInfo = await queryContractWithRetries({ contract: pair, chain, data: { pair: {} } }); - } - const token0Obj = pairInfo.asset_infos[0]; - const token1Obj = pairInfo.asset_infos[1]; - const token0 = getToken(token0Obj); - const token1 = getToken(token1Obj); - const token0Balance = await getTokenBalance({ token: token0Obj, owner: pair, chain }); - const token1Balance = await getTokenBalance({ token: token1Obj, owner: pair, chain }); - const token0Staked = token0Balance * stakingState.total_supply / lpTokenInfo.total_supply / 10 ** 6; - const token1Staked = token1Balance * stakingState.total_supply / lpTokenInfo.total_supply / 10 ** 6; - const token0CoinGeckoId = getCoinGeckoId(chain, token0); - const token1CoinGeckoId = getCoinGeckoId(chain, token1); + for (let { lp, pair, staking, pairInfo, wrapperLpEvm, lpEvm } of seilorLps) { + if (!wrapperLpEvm) { + const lpTokenInfo = await queryContractWithRetries({ contract: lp, chain, data: { token_info: {} } }); + const stakingState = await queryContractWithRetries({ contract: staking, chain, data: { query_staking_state: {} } }); + if (!pairInfo) { + pairInfo = await queryContractWithRetries({ contract: pair, chain, data: { pair: {} } }); + } + const token0Obj = pairInfo.asset_infos[0]; + const token1Obj = pairInfo.asset_infos[1]; + const token0 = getToken(token0Obj); + const token1 = getToken(token1Obj); + const token0Balance = await getTokenBalance({ token: token0Obj, owner: pair, chain }); + const token1Balance = await getTokenBalance({ token: token1Obj, owner: pair, chain }); + const token0Staked = token0Balance * stakingState.total_supply / lpTokenInfo.total_supply / 10 ** 6; + const token1Staked = token1Balance * stakingState.total_supply / lpTokenInfo.total_supply / 10 ** 6; - api.add(token0CoinGeckoId, token0Staked, { skipChain: true }); - api.add(token1CoinGeckoId, token1Staked, { skipChain: true }); + api.add(getCoinGeckoId(chain, token0), token0Staked, { skipChain: true }); + api.add(getCoinGeckoId(chain, token1), token1Staked, { skipChain: true }); + } else { + // Logic for calculating the value of staked wrapper EVM LP tokens + const stakingState = await queryContractWithRetries({ contract: staking, chain, data: { query_staking_state: {} } }); + + const [reserveAmounts, totalSupply, token0, token1] = await api.batchCall([ + { target: lpEvm, abi: getReservesAbi }, + { target: lpEvm, abi: totalSupplyAbi }, + { target: lpEvm, abi: token0Abi }, + { target: lpEvm, abi: token1Abi } + ]); + const [token0Decimals, token1Decimals] = await api.batchCall([ + { target: token0, abi: decimalsAbi }, + { target: token1, abi: decimalsAbi } + ]); + + const token0Staked = reserveAmounts[0] * stakingState.total_supply / totalSupply / 10 ** token0Decimals; + const token1Staked = reserveAmounts[1] * stakingState.total_supply / totalSupply / 10 ** token1Decimals; + + api.add(getCoinGeckoId(chain, token0), token0Staked, { skipChain: true }); + api.add(getCoinGeckoId(chain, token1), token1Staked, { skipChain: true }); + } } + return api.getBalances(); } }; diff --git a/projects/kucoin/index.js b/projects/kucoin/index.js index f158e6a2fb..4f0ecfb981 100644 --- a/projects/kucoin/index.js +++ b/projects/kucoin/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -42,120 +43,7 @@ const config = { ] }, bitcoin: { - owners: [ - 'bc1q04p5psjsp7j80sq6u4djgqk3c7pk6n93q43ply', - '38fJPq4dYGPoJizEUGCL9yWkqg73cJmC2n', - 'bc1q0243pvcnutwtm3m6t005402yk8utq4kfqqghhu', - 'bc1q080rkmk3kj86pxvf5nkxecdrw6nrx3zzy9xl7q', - 'bc1q07yhcr2qmwkc32z4gfaemtjtx90am6e6rpl9sg', - 'bc1q224fr84g5xqvp2lkwmzvyec9frwk5w5f5v5w38', - 'bc1q204dfzksn4l0rhhajm9fyd5h92dac8tnuur8jp', - '37nA3mMvQwPGVh6BKdLXKBiPjLFVbRLZEp', - 'bc1q0h72mfwgtsnfkcmpsnt3kmrrp4z5x3v469mz0k', - 'bc1q0l84mekaaszjfst7lswaheu7gcymv2h2k8z6fl', - 'bc1q2hpdg7pwghz9um27hqsmv2sg3f8f9fwtjvdenx', - 'bc1q3yy6h7x9wtffu8f7hpkhlyssw3s28xzj0nydye', - 'bc1q3kwpxug0q0w55qjrfrcykxu2yn02xhzn49fnxw', - 'bc1q2wxfd36s204jkpfmez2u0nh7540cctur2v27ht', - 'bc1q3g7sltlncshtqcu9wyhqavzxlfa4tj97whapup', - 'bc1q4jszmgxml90ernkn3l908sn4hr94zk6wynp788', - 'bc1q3sevrnv8khxe6fnl87ad8e4fjefu7rmp39pxl6', - 'bc1q4xt86cp0xf6zsrfsgspnfm8579ksurxppae66a', - 'bc1q4f8uwyargzd8eajj2vrdjz4l0hvhjdlpmchstm', - 'bc1q3fzjrvlvsl6j58x38gzk0c8dgvfudsqcsdqyry', - 'bc1q5h4ucvz7qqnhypekhd8jusc8z8msytxflzfs8s', - 'bc1q5ty9r24qftnx7c0vw0y76d5kneekse7hl878yv', - 'bc1q6z680y2fkmmu49ykm0dm0temp25p034p034fme', - 'bc1q5qsadcuj0at2xk4lfca5zull8mkgwfm06qduq4', - 'bc1q80elat9h0nfhuzvuvn4yl2nh0eqxwfzas5afnv', - 'bc1q6dr8nqmgm5qvuukuf5ux3m0fdthnhx033uv3vr', - 'bc1q6tj4wm295pndmx4dywkg27rj6vqfxl5gn8j7zr', - 'bc1q5w44vqvfpnwzpclwhdmx98uenwdtdfd85qtw34', - 'bc1q82qe6w4afzt2l94wn4d9e0uchj8t2x2dtdf2pu', - 'bc1q5cza73vpzhrsruy4e7gudvq6xv6vfs9hjs5pl3', - 'bc1qa482xwlzz479nyep2ve0z6t9t29dg0zem9wqt2', - 'bc1q8yja3gw33ngd8aunmfr4hj820adc9nlsv0syvz', - 'bc1q9uddlcfqdyh6dlu3pptchazr0va0cshnqss2yk', - 'bc1qa8jaa3pss396sx52hkft5ta2dey69fkrt8mfsc', - 'bc1q9020xphp6ukc4j72hy52gk2nxujwt4kr8dq6eu', - 'bc1q8jjlupqcvxv25usqu8hvlnd8ym0stcpq4jfy9x', - 'bc1q98mvmv9nl4p744tdf2zh3uzv30yea2njy0le9d', - 'bc1q9hrcsckdwrezlw7gspefeyk9nyqmwpy3ea8wwx', - 'bc1qa3h4re6gf6qmmesjqfzn0vu2rmc6e00s4gjjle', - 'bc1q9wvygkq7h9xgcp59mc6ghzczrqlgrj9k3ey9tz', - 'bc1qfyr7tvv0a2dcq6xp4dgr5nemfmnak2e2scn6hg', - 'bc1qdhqxc3h6dnc6x0k8emtcnuyt8aspy83w0g9xht', - 'bc1qfcuvuaam666pv777ad59wwue5l7j36hr95f8gv', - 'bc1qf3wwg8dayutammv2e6lahudyc7j2ef579hyx3m', - 'bc1qamlau4w545vsjsmnhzmztlv3sy4tu6v9cnxtcg', - 'bc1qea6uvmc2kqndhewtlnc9duh5aa30ptvp3mhk9h', - 'bc1qgrxsrmrhsapvh9addyx6sh8j4rw0sn9xtur9uq', - 'bc1qcyjkktrvwatdqyvpm04vs3k2x5r4ystnw7msrk', - 'bc1qggwgcwnjvlma9hr569jhgx2yuncaaq0ace5ywp', - 'bc1qartr66auwm2tlcjp7cqgs8cx4p6q7lydrtwf4p', - 'bc1qkrewa0m37wjmkcgs0w2gh9zhjqclkq74ckt4x4', - 'bc1qk947xflcafthv8k6gx7m2cvwzqzy68kl5npkyw', - 'bc1qh573eaggrqexqx7xzm4e57k6sm9r7zpuxwqxzn', - 'bc1qj5gnrfdmcftzxgrwcdts4plw4kaydjs5kq560l', - 'bc1qlldl5qma9glxwt3j06eef05590uyy2td3ye90c', - 'bc1qhafun32xkhxpec8dq3kpxyq5x9ur437mj4dusy', - 'bc1qh6tqdv9k2pew6vyvrmg76ae55n5rwa2djmyyyk', - 'bc1qjxv6j2sv6za57khvvd5yu9jxkv3g3qvxh6sach', - 'bc1qjefrh2gf28g6x56eeausc30gxewamj7qwtzfpg', - 'bc1qhs4u46ygdskuljadnxn6thqsrjw3nf9r8nfclm', - 'bc1qnl68wnf3d6jz532dl65hj9urw9j2432fjg03nr', - 'bc1qnetky45z2vguazzczuy7x2446vsjn4ku76d5k8', - 'bc1qlw4dv8nt5uc35dkmftlt3nt0rl0cte4he998qt', - 'bc1qnvdx4dt8kn68csvcqvdtnlzw8hadapk9e9k857', - 'bc1qnqhcfntmlh2nnu5rp25szqgxw7v3783xrgcd44', - 'bc1qp22u6u75j2nvvhychyfd9uxr6s2jkf5p985rct', - 'bc1qnxn6352sn9mm6dxgmfrn43fgtu0l2kcx2y3ddh', - 'bc1qm882j3900we3eewa5fdw4hlwlnef35phmsn7x8', - 'bc1qpafgjjmqlv32m6m6qpte2ldlz0wcuj3ajyt8gd', - 'bc1qmtvfu97nlrl8qtujvj5jg47dc0p3w8sun6esaf', - 'bc1qr9hf2v2gf6haq7tsvckel7u6ja46fnqfkt6u5p', - 'bc1qpuhnd3gqhqlezgcuuhc2ywfw2w03uyz0seg802', - 'bc1qr77hw0dek5f8uvmeazd3egym2m3npjf2nvrza5', - 'bc1qpdfchk5j5tvkwf0z4kpftysv88h5szz4ms8try', - 'bc1qprpm6caxcuewnme4at7h2skhv2rury274a0vln', - 'bc1qq9u67zacfe3vz40e36nltn3agt9hf75g7av2xx', - 'bc1qrf9llyljmwy8egcjjsw0z0a8n5sgjlhcemezcl', - 'bc1qqx0udc7ndr77yg4v7rwuugnwk8n8xqaydmakfu', - 'bc1qqg92jrprgh0vdq3pd8wctnzqyuwn5kp20hhfh6', - 'bc1qpnmkhx9ndgnk639wh5gyuex4nsx7s8t8d33pzt', - 'bc1qtcxldruuuhvk8zjmw3a3dpwfvu2d0m9qyctv82', - 'bc1qtlgfyl9yjyluwzyyayp2fs0r4kcjtv2axsmzl8', - 'bc1qs84j4s45nztsx9759vkha0wvvx28dlqk7p2n5y', - 'bc1qteec4z0tcvv40r6py855gg77rwnhe9ege42x0t', - 'bc1qrt7rkpswpgmcag7txzf6ps9mvepwgndshqdx6d', - 'bc1quqy97s6lj3mty7hdp4at7uvmlzssh57jezx85v', - 'bc1qseaaa4hnexjugx26p605getpdnkwy3up64uws9', - 'bc1qudtghe07cfslxyv36zk5ums65c32xcw0nz6zhg', - 'bc1qsfdf47l3ftsqv2muvfftnulcp4qwzypuxm9k30', - 'bc1qul97gsvkpfju6fa53cezzxx5wmv4t8rl6gdt62', - 'bc1qv3v2u78m6vec2jqe7w0esm6rccmysccdvkpr3t', - 'bc1qwjftm2nl65gmevmutfqe8q7k0aaahlxt3a9wam', - 'bc1qvh0zexe6422t85x3kzgvms9fd984606uhf44ug', - 'bc1qvj8a4kjq888c2l22pdgjx3cgaq94vm3hjzyq6l', - 'bc1qwgzyz8xpwdrx54rsm5p74ksc6wkxr8y4ncejwh', - 'bc1qvvqafwsqr2rquyvym4l6rtt7ayukpmw2sfxn7f', - 'bc1qvkzdg9x58zyupept40zcjhmztn3l2flqss2f4x', - 'bc1quyayxjg0r68wsj6c2zcu3f7nnj9um5pwdgr36m', - 'bc1qw83c8j8pf2azegtyeszqqdaafgqj4hl3xcdy95', - 'bc1qwxg6gra5g9tlvztr9qphzpruch30ka40e4tl48', - 'bc1qz0q4hyn5k8plleax2g52jsr0k07vgtqcr634g3', - 'bc1qz0nfyvylrvn9h2rqm7lcegzv79du2p5jezgept', - 'bc1qxfgeqygy229hrjrwmklzgwme70h8mmrjcyueag', - 'bc1qyz4zr7cv2922cjua9xrezsda82gl8z653w6ru4', - 'bc1qxnsr0al2lw7hqg90j05x9s0gxm5g4skmcslrut', - 'bc1qymcn42gst8jvcu4y9c6tf6ngfs38j66hd5zvhs', - 'bc1qzghz50r66hlp4wufyy55m5a3jjl5grkmetygsg', - 'bc1qyatvzh0ndg464ph7txwjw6kgkczw8kw03lcgg7', - 'bc1qy8054ua06akklh6avf06crt4u2hu4skasr5ead', - 'bc1qy7uquly0ha78lmn47hedd7e0swkmwpyft9j7e2', - 'bc1qzy4lg8yg6dsn0dppx3a4kq8tqe2hhrh6af3778', - 'bc1qzkqzmlj47z0ww253xu2egewcw4wagz6qfa6fr8' - ] + owners: bitcoinAddressBook.kucoin }, arbitrum: { owners: [ @@ -217,6 +105,11 @@ const config = { '0xd6216fc19db775df9774a6e33526131da7d19a2c', '0xfb6a733bf7ec9ce047c1c5199f18401052eb062d', ], + }, + starknet: { + owners: [ + '0x0566ec9d06c79b1ca32970519715a27f066e76fac8971bbd21b96a50db826d90' + ], } } diff --git a/projects/kumu-finance/index.js b/projects/kumu-finance/index.js index f2c9a5ed31..a1ce5305f4 100644 --- a/projects/kumu-finance/index.js +++ b/projects/kumu-finance/index.js @@ -44,6 +44,7 @@ module.exports = { hallmarks: [ [1662336000, "Rug Pull"] ], + deadFrom: '2022-09-25', klaytn: { tvl, staking } diff --git a/projects/kyber/index.js b/projects/kyber/index.js index 069bb63b20..57595dea3d 100644 --- a/projects/kyber/index.js +++ b/projects/kyber/index.js @@ -2,40 +2,18 @@ const sdk = require("@defillama/sdk") const { cachedGraphQuery } = require("../helper/cache"); const { sumTokens2 } = require('../helper/unwrapLPs') -const chains = { - ethereum: { - graphId: "mainnet", - }, - arbitrum: { - graphId: "arbitrum-one", - }, - polygon: { - graphId: "matic", - }, - avax: { - graphId: "avalanche", - }, - bsc: { - graphId: "bsc", - }, - fantom: { - graphId: "fantom", - }, - cronos: { - graphId: "cronos", - }, - optimism: { - graphId: "optimism", - }, - linea: { - graphId: 'linea' - }, - base: { - graphId: 'base' - }, - scroll: { - graphId: 'scroll' - } +const CONFIG = { + ethereum: { graphId: "mainnet" }, + arbitrum: { graphId: "arbitrum-one", blacklistedTokens: ['0x0df5dfd95966753f01cb80e76dc20ea958238c46'] }, // rWETH + polygon: { graphId: "matic" }, + avax: { graphId: "avalanche" }, + bsc: { graphId: "bsc" }, + fantom: { graphId: "fantom" }, + cronos: { graphId: "cronos" }, + optimism: { graphId: "optimism" }, + linea: { graphId: 'linea' }, + base: { graphId: 'base' }, + scroll: { graphId: 'scroll' } }; async function fetchPools(chain) { @@ -76,12 +54,11 @@ async function fetchPools(chain) { return toa; } -function elastic(chain) { +function elastic(graphId, blacklistedTokens = []) { return async (api) => { - if (!("graphId" in chains[chain])) return {}; - - const pools = await fetchPools(chains[chain].graphId); - return sumTokens2({ api, tokensAndOwners: pools }) + if (!graphId) return + const pools = await fetchPools(graphId); + return sumTokens2({ api, tokensAndOwners: pools, blacklistedTokens }) } } @@ -92,10 +69,10 @@ module.exports = { [1700611200,'Protocol exploit'], ], }; -Object.keys(chains).forEach(chain => { - module.exports[chain] = { - tvl: elastic(chain) - }; -}); + +Object.keys(CONFIG).forEach((chain) => { + const { graphId, blacklistedTokens } = CONFIG[chain] + module.exports[chain] = { tvl: elastic(graphId, blacklistedTokens)} +}) module.exports.base.tvl = () => ({}) // setting base to 0 for now as I could not find the graph endpoint \ No newline at end of file diff --git a/projects/kyros/index.js b/projects/kyros/index.js new file mode 100644 index 0000000000..2bfab21bf2 --- /dev/null +++ b/projects/kyros/index.js @@ -0,0 +1,16 @@ +const { sumTokens2 } = require("../helper/solana"); + +async function tvl() { + return sumTokens2({ + tokenAccounts: [ + "CRFtzwkekKorgdTRSdvsYeqL1vEuVvwGRvweuWCyaRt3", // jitoSOL token account in kySOL Vault address + ] + }) +} + +module.exports = { + timetravel: false, + doublecounted: true, + solana: { tvl }, + methodology: 'The TVL is calculated by summing all restaked assets.', +}; diff --git a/projects/laari-fi/index.js b/projects/laari-fi/index.js index d36349d111..28baf4b785 100644 --- a/projects/laari-fi/index.js +++ b/projects/laari-fi/index.js @@ -13,4 +13,5 @@ module.exports = yieldHelper({ poolInfo: 'function poolInfo(uint256) view returns (address want, uint256, uint256, uint256, uint256, uint256, uint256, uint256 amount, uint256, address strat)', }, }) -module.exports.hallmarks=[[1697068800, "Rug Pull"]] \ No newline at end of file +module.exports.hallmarks=[[1697068800, "Rug Pull"]], +module.exports.deadFrom='2023-10-12' \ No newline at end of file diff --git a/projects/lachain-yield-market.js b/projects/lachain-yield-market.js index fb34d20f73..417f2d4fd0 100644 --- a/projects/lachain-yield-market.js +++ b/projects/lachain-yield-market.js @@ -1,4 +1,5 @@ const utils = require('./helper/utils'); +const { deadFrom } = require('./ladex-exchange'); async function fetch() { const response = await utils.fetchURL(`https://farms-info.lachain.io/farms/beefy`); @@ -20,6 +21,7 @@ async function fetch() { } module.exports = { + deadFrom: '2024-01-01', lachain: { fetch }, fetch, } diff --git a/projects/ladex-exchange/index.js b/projects/ladex-exchange/index.js index 1ad19b40b8..84f750c548 100644 --- a/projects/ladex-exchange/index.js +++ b/projects/ladex-exchange/index.js @@ -2,6 +2,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const factory_contract = "0xD707d9038C1d976d3a01c770f01CB73a1fd305Cd" module.exports = { + deadFrom: '2024-01-01', lachain: { tvl: getUniTVL({ factory: factory_contract, useDefaultCoreAssets: true }), } diff --git a/projects/lagoon/index.js b/projects/lagoon/index.js new file mode 100644 index 0000000000..b358e56f0b --- /dev/null +++ b/projects/lagoon/index.js @@ -0,0 +1,26 @@ +const { sumERC4626VaultsExport } = require('../helper/erc4626'); +const sdk = require('@defillama/sdk'); + +const config = { + ethereum: { + lvTokens: { + totalAssets: [ + "0x07ed467acD4ffd13023046968b0859781cb90D9B", // 9Summits Flagship ETH + "0x03D1eC0D01b659b89a87eAbb56e4AF5Cb6e14BFc", + ], + }, + }, +}; + + + +const totalAssetsVaults = config.ethereum.lvTokens.totalAssets; + +const tvl = sdk.util.sumChainTvls([ + sumERC4626VaultsExport({ + vaults: totalAssetsVaults, + tokenAbi: 'asset', + balanceAbi: 'totalAssets', + }), +]); +module.exports['ethereum'] = { tvl }; diff --git a/projects/lander/index.js b/projects/lander/index.js new file mode 100644 index 0000000000..f51e96289b --- /dev/null +++ b/projects/lander/index.js @@ -0,0 +1,5 @@ +const { compoundExports2 } = require("../helper/compound"); + +module.exports = { + bsc: compoundExports2({ comptroller: '0x344655CB08a25A7b2501CafB47CdF9490cE7fad3' }) +} diff --git a/projects/latch/index.js b/projects/latch/index.js new file mode 100644 index 0000000000..2aab05309f --- /dev/null +++ b/projects/latch/index.js @@ -0,0 +1,27 @@ +const { sumTokens2 } = require('../helper/unwrapLPs'); + +const tvl = async (api) => { + const depositPools = [ + '0xFE606EEc8Eb8e6Ad8E8654968a15650F5331a023', + '0x7cC08f23a6E8222c86a62fCE3d4d252dd1b8f90C', + ] + + const proxies = [ + '0xa116b4680b52973426B6D2a92DcC972b8DbcB46F', + '0x97cA296139f114BF3040Cf05D05c240B770c627E' + ] + + const tokens = await api.multiCall({ abi: 'address:ASSET_TOKEN', calls: depositPools }) + const stakingPools = await api.multiCall({ abi: 'address:treasury', calls: depositPools }) + const nextTreasuries = await api.multiCall({ abi: 'address:nextTreasury', calls: stakingPools }) + const withdrawPools = await api.multiCall({ abi: 'address:withdrawPool', calls: stakingPools }) + + await sumTokens2({ api, tokens, owners: depositPools.concat(withdrawPools), }) + return sumTokens2({ api, tokens, owners: nextTreasuries.concat(stakingPools).concat(proxies), fetchCoValentTokens: true, tokenConfig: { onlyWhitelisted: false, } }) +}; + +module.exports = { + ethereum: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/latoken/index.js b/projects/latoken/index.js index fe04fb0fe9..2042ea7eb8 100644 --- a/projects/latoken/index.js +++ b/projects/latoken/index.js @@ -1,12 +1,9 @@ const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { bitcoin: { - owners: [ - "bc1q48amr6l7dvacdppgucvnswwuyleaqh4dus8z8h", - "bc1q2cgh9nxn7cqmqhk4hc5fu6mju8nzy9a20qqqh8", //cold - "bc1qw5fc9ml9vm4xq5c6xkcdu3vtwyw4gdn8lw0uwq" - ] + owners: bitcoinAddressBook.latoken }, ethereum: { owners: [ diff --git a/projects/lavarage/index.js b/projects/lavarage/index.js new file mode 100644 index 0000000000..97acad61c0 --- /dev/null +++ b/projects/lavarage/index.js @@ -0,0 +1,197 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { getProvider, sumTokens2 } = require("../helper/solana"); +const { PublicKey } = require("@solana/web3.js"); +const anchor = require("@project-serum/anchor"); +const bs58 = require('bs58'); + +const solProgramId = "CRSeeBqjDnm3UPefJ9gxrtngTsnQRhEJiTA345Q83X3v"; +const usdcProgramId = "1avaAUcjccXCjSZzwUvB2gS3DzkkieV2Mw8CjdN65uu"; +const stakingProgramId = "85vAnW1P89t9tdNddRGk6fo5bDxhYAY854NfVJDqzf7h"; +const TOKEN_PROGRAM_ID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); +const SPL_ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); + +const edgeCaseTimestamps = [ + { start: '2024-04-23', end: 1713885480 }, // 10:32 AM - 10:58 AM ET on April 23, 2024 + { start: '2024-04-23', end: 1713876060 }, // 8:15 AM - 8:41 AM ET on April 23, 2024 +]; + +const idleAccount = new PublicKey("bkhAyULeiXwju7Zmy4t3paDHtVZjNaofVQ4VgEdTWiE"); +const deployedAccount = new PublicKey("6riP1W6R3qzUPWYwLGtXEC23aTqmyAEdDtXzhntJquAh"); +const multisigAccount = new PublicKey("DkPYEECBc28iute8vWvAuAU4xiM91Sht59p7FHZbmNQv"); +const pendingUnstakeAccount = new PublicKey("HTnwdgfXrA6gZRiQsnfxLKbvdcqnxdbuC2FJsmCCVMw9"); +const usdcAddress = new PublicKey(ADDRESSES.solana.USDC); +const iscAddress = new PublicKey("J9BcrQfX4p9D1bvLzRNCbMDv8f44a9LFdeqNE4Yk2WMD"); +const usdcPoolAccount = new PublicKey("9m3wEeK3v5yyqDGMnDiDRR3FjCwZjRVB4n92pieGtTbP"); +const iscPoolAccount = new PublicKey("CrsxVEF7YNGAk9QwwbB2vuesUWoDopfgFAhA9apoCJ2z"); + +function getPositionFilters() { + const sizeFilter = { dataSize: 178 }; + const value = BigInt(9999); + const valueBuffer = Buffer.alloc(8); + valueBuffer.writeBigUInt64LE(value, 0); + const val0Filter = { + memcmp: { + offset: 40, + bytes: bs58.encode(Buffer.from(new Uint8Array(8))), + }, + } + const val9999Filter = { + memcmp: { + offset: 40, + bytes: bs58.encode(valueBuffer), + }, + } + return [ + [sizeFilter, val0Filter], + [sizeFilter, val9999Filter], + ] +} + +async function tvl(api) { + const provider = getProvider(); + for (const programId of [solProgramId, usdcProgramId]) { + + const program = new anchor.Program(lavarageIDL, programId, provider); + const pools = await program.account.pool.all() + const poolMap = {} + pools.forEach((pool) => { + poolMap[pool.publicKey.toBase58()] = pool.account.collateralType.toBase58() + }) + for (const filter of getPositionFilters()) { + const positions = await program.account.position.all(filter) + positions.forEach(({ account }) => { + let { closeStatusRecallTimestamp, pool, collateralAmount, timestamp } = account + const token = poolMap[pool.toBase58()] + const closeTS = closeStatusRecallTimestamp.toNumber() + const ts = timestamp.toNumber() + if ((closeTS && !isWithinEdgeCaseTimeRange(ts)) || !token) return; + api.add(token, collateralAmount.toString()) + }) + } + } + return sumTokens2({ + balances: api.getBalances(), tokenAccounts: [ + getAssociatedTokenAddress(usdcAddress, usdcPoolAccount), + getAssociatedTokenAddress(iscAddress, iscPoolAccount), + ], solOwners: [ + deployedAccount, pendingUnstakeAccount, + ] + }) +} + +function getAssociatedTokenAddress(mint, owner,) { + const [associatedTokenAddress] = PublicKey.findProgramAddressSync([owner.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), mint.toBuffer()], SPL_ASSOCIATED_TOKEN_PROGRAM_ID); + return associatedTokenAddress; +} + +function isWithinEdgeCaseTimeRange(closeTimestamp) { + return edgeCaseTimestamps.some( + ({ start, end }) => closeTimestamp >= start && closeTimestamp <= end + ); +} + +module.exports = { + timetravel: false, + solana: { + tvl, + }, +}; + +const lavarageIDL = { + version: "0.1.0", + name: "lavarage", + instructions: [], + accounts: [ + { + name: "pool", + type: { + kind: "struct", + fields: [ + { + name: "interestRate", + type: "u8", + }, + { + name: "collateralType", + type: "publicKey", + }, + { + name: "maxBorrow", + type: "u64", + }, + { + name: "nodeWallet", + type: "publicKey", + }, + { + name: "maxExposure", + type: "u64", + }, + { + name: "currentExposure", + type: "u64", + }, + ], + }, + }, + { + name: "position", + type: { + kind: "struct", + fields: [ + { + name: "pool", + type: "publicKey", + }, + { + name: "closeStatusRecallTimestamp", + type: "u64", + }, + { + name: "amount", + type: "u64", + }, + { + name: "userPaid", + type: "u64", + }, + { + name: "collateralAmount", + type: "u64", + }, + { + name: "timestamp", + type: "i64", + }, + { + name: "trader", + type: "publicKey", + }, + { + name: "seed", + type: "publicKey", + }, + { + name: "closeTimestamp", + type: "i64", + }, + { + name: "closingPositionSize", + type: "u64", + }, + { + name: "interestRate", + type: "u8", + }, + { + name: "lastInterestCollect", + type: "i64", + }, + ], + }, + }, + ], + types: [], + events: [], + errors: [], +}; diff --git a/projects/lazyotter/index.js b/projects/lazyotter/index.js index 4dd3d84cda..e39cfda970 100644 --- a/projects/lazyotter/index.js +++ b/projects/lazyotter/index.js @@ -1,10 +1,31 @@ -const aaveVaults = ["0x7100409baaeda121ab92f663e3ddb898f11ff745", "0x844Ccc93888CAeBbAd91332FCa1045e6926a084d"]; +// [usdc, weth, wstETH] +const aaveVaults = ["0xF91caE959D134065f39DDaa41d66E254dfaFc6f8", "0x81A47E298d634273Afe43AD58EaC5888983d21c4", "0x22EdDd86Ee6e1dcD2eAb06f80ee39B3c084a1E77"]; + +// [eth/usdc, eth/wbtc, eth/wrsETH, eth/wstETH, usdc/usdt] +const ambientVaultHelper = "0x9b5BD88893d73d114d252Cff7CFd4f2705eEFAe7" +const ambientVaults = ["0x07ab0C3A3D9e286ba790FF57f205970bC462BB21", "0x018B3ac371344735025cB01d79871Be0e4AB351C", "0x7D1E707011bA5be76806037532c266fA6eb0699f", "0xe18acadfb098fbf4017108a5C83Fa901B062a53d", "0xfbB0D0cB3324Ec90c6667D9E2b8B98dB8F73a3e6"] + +// [USDC, USDT, wstETH, weETH, wrsETH, STONE] +const rhoMarketsVault = [ + "0x1BA2A898b5EfB716557696e3E42E6479882fCDE1", + "0x87131c9Bb4878067742dd5D60596ED3b353493FD", + "0xfAe6c6E62bc5374a229960891Ec9707e8671a219", + "0x74a28efb7275c3871aCCaE2917f6EE073039042d", + "0x4220F7297eBa7cE583826eC754A0CBE29E4e6F6f", + "0x235ea5d1EA9407334E0AF8F45BA6c9A69DF9AC18" +] async function tvl(api) { - const tokens = await api.multiCall({ abi: "address:asset", calls: aaveVaults }); - const aTokens = await api.multiCall({ abi: "address:aToken", calls: aaveVaults }); - const tokensAndOwners2 = [tokens.concat(aTokens), aaveVaults.concat(aaveVaults)]; - return api.sumTokens({ tokensAndOwners2 }); + await api.erc4626Sum2({ calls: aaveVaults.concat(rhoMarketsVault), }); + const ambAssets = await api.multiCall({ abi: 'uint256:totalAssets', calls: ambientVaults}) + const calls = ambAssets.map((v, i) => ({ params: [ambientVaults[i], v]})) + const res = await api.multiCall({ abi: 'function previewAmountByAsset(address vault, uint256 assets) view returns (uint256, uint256)', calls, target: ambientVaultHelper}) + const quoteTokens = await api.multiCall({ abi: 'address:quoteToken', calls: ambientVaults}) + const baseTokens = await api.multiCall({ abi: 'address:baseToken', calls: ambientVaults}) + for (const i in res){ + api.add(quoteTokens[i], res[i][0]) + api.add(baseTokens[i], res[i][1]) + } } module.exports = { diff --git a/projects/lemonX/index.js b/projects/lemonX/index.js new file mode 100644 index 0000000000..bc6051bb81 --- /dev/null +++ b/projects/lemonX/index.js @@ -0,0 +1,7 @@ +const { gmxExports } = require('../helper/gmx') + +module.exports = { + core: { + tvl: gmxExports({ vault: '0xC2acC8e5Be6613f53C71AE5E386D39a40a4761aA', }) + }, +} \ No newline at end of file diff --git a/projects/lendexe/index.js b/projects/lendexe/index.js index 376990d3fb..b4b942c905 100644 --- a/projects/lendexe/index.js +++ b/projects/lendexe/index.js @@ -4,8 +4,7 @@ const { nullAddress } = require('../helper/tokenMapping') const { lendingMarket } = require("../helper/methodologies"); -const u = undefined -const { tvl, borrowed } = compoundExports('0x2c7b7A776b5c3517B77D05B9313f4699Fb38a8d3',u,'0x36e66547e27a5953f6ca3d46cc2663d9d6bdc59e', nullAddress, undefined, undefined, { fetchBalances: true, blacklistedTokens: ['0x53011e93f21ec7a74cdfbb7e6548f1abce306833'] }) +const { tvl, borrowed } = compoundExports('0x2c7b7A776b5c3517B77D05B9313f4699Fb38a8d3','0x36e66547e27a5953f6ca3d46cc2663d9d6bdc59e', nullAddress, { blacklistedTokens: ['0x53011e93f21ec7a74cdfbb7e6548f1abce306833'] }) const mapping = { [ADDRESSES.ethereum.USDC]: 6, diff --git a/projects/lendoraprotocol/index.js b/projects/lendoraprotocol/index.js index 0f1065f74c..22078344ca 100644 --- a/projects/lendoraprotocol/index.js +++ b/projects/lendoraprotocol/index.js @@ -4,13 +4,17 @@ const { staking } = require('../helper/staking') module.exports = { scroll: compoundExports2({ comptroller: '0xA27CDE1F3dcaaF653624049Fc3b1a720eC1D4e91', - fetchBalances: true, cether: '0xBC7fA7C2dF265d073Be6D1c88468AEB5c06ba07c', }), }; + +module.exports.deadFrom = '2023-12-04', + module.exports.scroll.staking = staking( ['0xca4fb5541D0f2899549e5f454155E1B34acc9379', '0x578E4f84663260e5C5c64d5310Dd76aA3CEC633c'], '0x3e6c99915803631D200441CdF6D84786912b0871', 'scroll' ) + +module.exports.scroll.borrowed = () => ({}) // bad debt diff --git a/projects/levana/index.js b/projects/levana/index.js index 15aa1fa68b..41ddd123cb 100644 --- a/projects/levana/index.js +++ b/projects/levana/index.js @@ -56,6 +56,7 @@ const config = { osmosis: { factory: 'osmo1ssw6x553kzqher0earlkwlxasfm2stnl3ms3ma2zz4tnajxyyaaqlucd45' }, sei: { factory: 'sei18rdj3asllguwr6lnyu2sw8p8nut0shuj3sme27ndvvw4gakjnjqqper95h' }, injective: { factory: 'inj1vdu3s39dl8t5l88tyqwuhzklsx9587adv8cnn9' }, + neutron: { factory: 'neutron1an8ls6d57c4qcvjq0jmm27jtrpk65twewfjqzdn7annefv7gadqsjs7uc3' } } diff --git a/projects/level-money/index.js b/projects/level-money/index.js new file mode 100644 index 0000000000..dd8bce06cb --- /dev/null +++ b/projects/level-money/index.js @@ -0,0 +1,52 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs"); + +const AUSDC = '0x98C23E9d8f34FEFb1B7BD6a91B7FF122F4e16F5c'; +const AUSDT = '0x23878914EFE38d27C4D67Ab83ed1b93A74D4086a'; + +const LEVEL_WRAPPED_AUSDC = '0x78c6B27Be6DB520d332b1b44323F94bC831F5e33'; +const LEVEL_WRAPPED_AUSDT = '0xb723377679b807370Ae8615ae3E76F6D1E75a5F2'; + +const LEVEL_STAKING_CONTRACT = '0x7FDA203f6F77545548E984133be62693bCD61497'; +const LEVEL_RESERVE_MANAGERS = ['0x70D544F75c2228D68EE04BC63e6e4Bae8F31fCEF', '0x7B2c2C905184CEf1FABe920D4CbEA525acAa6f14']; +const LEVEL_WRAPPED_TOKENS = [LEVEL_WRAPPED_AUSDC, LEVEL_WRAPPED_AUSDT]; + +const LEVEL_USD_POINTS_FARM = '0x80B73eF4534FE245300017A5197451973559c00f'; + +const LEVEL_USD_USDC_CURVE_LP_TOKEN = '0x1220868672d5b10f3e1cb9ab519e4d0b08545ea4'; + +const TOKEN_CONTRACTS = [ + ADDRESSES.ethereum.USDT, // USDT + ADDRESSES.ethereum.USDC, // USDC + ADDRESSES.ethereum.DAI, // DAI + ADDRESSES.ethereum.SDAI, // sDAI + ADDRESSES.ethereum.sUSDe, // sUSD + ADDRESSES.ethereum.USDe, // USDe + ADDRESSES.ethereum.FRAX, // FRAX + "0x0022228a2cc5E7eF0274A7Baa600d44da5aB5776", // stUSD + "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32", // sFRAX + "0xa663b02cf0a4b149d2ad41910cb81e23e1c41c32", // sFRAX + "0x57F5E098CaD7A3D1Eed53991D4d66C45C9AF7812", // wUSDM + "0x73A15FeD60Bf67631dC6cd7Bc5B6e8da8190aCF5", // USD0 + "0x35D8949372D46B7a3D5A56006AE77B215fc69bC0", // USD0++ + "0x15700B564Ca08D9439C58cA5053166E8317aa138", // deUSD + "0x5C5b196aBE0d54485975D1Ec29617D42D9198326", // stdeUSD + AUSDC, + AUSDT, + "0x437cc33344a0B27A429f795ff6B469C72698B291", // smart M + "0x8a60e489004ca22d775c5f2c657598278d17d9c2", // USDa (Avalon) + "0x2b66aade1e9c062ff411bd47c44e0ad696d43bd9", // staked USDa (Avalon) + "0x4956b52aE2fF65D74CA2d61207523288e4528f96", // RLP + "0x66a1E37c9b0eAddca17d3662D6c05F4DECf3e110", // USR + "0xfd03723a9a3abe0562451496a9a394d2c4bad4ab" // DYAD +]; + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + owners: [LEVEL_STAKING_CONTRACT, ...LEVEL_RESERVE_MANAGERS, ...LEVEL_WRAPPED_TOKENS], + tokens: TOKEN_CONTRACTS, + }), + pool2: sumTokensExport({ owner: LEVEL_USD_POINTS_FARM, tokens: [LEVEL_USD_USDC_CURVE_LP_TOKEN] }) + } +}; diff --git a/projects/levva/config.js b/projects/levva/config.js new file mode 100644 index 0000000000..e30bd8d460 --- /dev/null +++ b/projects/levva/config.js @@ -0,0 +1,67 @@ +module.exports = { + arbitrum: { + factories: [ + { + factory: "0x1e36749E00229759dca262cB25Ad8d9B21bEB3F5", + fromBlock: 144171029, + version: "v1", + }, + { + factory: "0x537A3417Fe03e28F4E9640Bece70887a6938ff92", + fromBlock: 208756175, + version: "v1.5", + }, + { + factory: "0x4a805A6dbaCF824D5A39b9f3559aeFb831C1df95", + fromBlock: 220673210, + version: "v1.5", + }, + ], + contractRegistries: [ + { + fromBlock: 257563019, + address: "0x7a923e412B934ceC16042AA28244eE4881f9B722", + } + ] + }, + blast: { + factories: [ + { + factory: "0x1768Faee0A63927FeB81100046f5D63BfE0f08dB", + fromBlock: 501400, + version: "v1.5", + }, + ], + contractRegistries:[], + }, + ethereum: { + factories: [ + { + factory: "0xF8D88A292B0afa85E5Cf0d1195d0D3728Cfd7070", + fromBlock: 19824726, + version: "v1.5", + }, + { + factory: "0xc1aC50D46783387F4236a8364435b5CCEaDd9fe2", + fromBlock: 20725907, + version: "v1.5" + } + ], + contractRegistries: [ + { + fromBlock: 21027804, + address: "0x8Dbc09C0BD6D99AF01B8254432A13E6FF1b214Bd", + } + ] + }, + linea: { + factories: [ + { + factory: "0xF97305253804e7A7796f79aB4f8c8908492A8402", + fromBlock: 9312068, + version: "v1.5" + } + ], + contractRegistries:[], + } +}; diff --git a/projects/levva/index.js b/projects/levva/index.js new file mode 100644 index 0000000000..d22299f7a6 --- /dev/null +++ b/projects/levva/index.js @@ -0,0 +1,85 @@ +const { getLogs2 } = require("../helper/cache/getLogs"); +const { sumTokens2 } = require("../helper/unwrapLPs"); +const config = require("./config"); + +module.exports = { + methodology: + "Counts the number of base and quote tokens in every marginly pool and underlying tokens in every levva vaults", +}; + +Object.keys(config).forEach((chain) => { + const { factories, contractRegistries } = config[chain]; + + module.exports[chain] = { + tvl: async (api) => { + await getPoolTvl(api, factories); + await getVaultTvl(api, contractRegistries); + }, + }; +}); + + +async function getPoolTvl(api, factories){ + const ownerTokens = []; + + for (const { factory, fromBlock, version } of factories) { + let logs; + if (version === "v1") { + // v1.0 contract + logs = await getLogs2({ + api, + target: factory, + eventAbi: + "event PoolCreated(address indexed quoteToken, address indexed baseToken, address uniswapPool, bool quoteTokenIsToken0, address pool)", + fromBlock, + }); + } else { + // v1.5 contract + logs = await getLogs2({ + api, + target: factory, + eventAbi: + "event PoolCreated(address indexed quoteToken, address indexed baseToken, address indexed priceOracle, uint32 defaultSwapCallData, address pool)", + fromBlock, + }); + } + + logs.forEach((i) => + ownerTokens.push([[i.quoteToken, i.baseToken], i.pool]) + ); + } + + await sumTokens2({ api, ownerTokens }); +} + +async function getVaultTvl(api, contractRegistries) { + const LEVVA_VAULT_CONTRACT_TYPE = 2000; + + const vaults = []; + // Retrieve logs from each contract registry to identify vaults + for (const { address, fromBlock } of contractRegistries) { + const logs = await getLogs2({ + api, + target: address, + eventAbi: "event ContractRegistered(uint64 contractType, address contractAddress, bytes data)", + fromBlock, + }); + + // Filter logs to find levva vault contracts + logs.forEach((l) => { + if (Number.parseInt(l.contractType) === LEVVA_VAULT_CONTRACT_TYPE) + vaults.push(l.contractAddress); + }); + } + + const tokens = await api.multiCall({ abi: 'address:asset', calls: vaults}) + const marginlyLent = await api.multiCall({ abi: 'function getLentAmount(uint8 protocol) view returns (uint256)', calls: vaults.map((i) => ({ target: i, params: 0})) }) + const totalLent = await api.multiCall({ abi: 'uint256:getTotalLent', calls: vaults }) + // Add total lent amount to balances + api.add(tokens, totalLent) + // Subtract marginlyLent from balances since it is counted as marginly pool TVL + api.add(tokens, marginlyLent.map(i => i * -1)) + + // Add free amount in ERC4626 + await api.erc4626Sum({ calls: vaults, tokenAbi: 'asset', balanceAbi: 'getFreeAmount' }); +} diff --git a/projects/lien/index.js b/projects/lien/index.js index ff7c6e0b89..f311d8a05c 100644 --- a/projects/lien/index.js +++ b/projects/lien/index.js @@ -27,6 +27,6 @@ async function tvl(timestamp, block) { } module.exports = { - start: 1619798400, // 30/4/2021 @ 04:00PM (UTC) + start: '2021-04-30', // 30/4/2021 @ 04:00PM (UTC) ethereum: { tvl } }; diff --git a/projects/lifinity-v2/index.js b/projects/lifinity-v2/index.js index db5e782803..7debe1a2d3 100644 --- a/projects/lifinity-v2/index.js +++ b/projects/lifinity-v2/index.js @@ -1,21 +1,27 @@ const { getProvider, sumTokens2, } = require('../helper/solana') const { Program } = require("@project-serum/anchor"); -async function getTokenAccounts(programId, idl) { - const provider = getProvider() +async function getTokenAccounts(programId, idl, chain) { + const provider = getProvider(chain) const program = new Program(idl, programId, provider) const data = await program.account.amm.all() return data.map(({ account: { tokenAAccount, tokenBAccount }}) => ([tokenAAccount, tokenBAccount,])).flat() } -async function tvl() { - const tokenAccounts = await getTokenAccounts('2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c', v2Idl) - return sumTokens2({ tokenAccounts, }) +const config = { + solana: '2wT8Yq49kHgDzXuPxZSaeLaH1qbmGXtEyPy64bL7aD3c', + eclipse: '4UsSbJQZJTfZDFrgvcPBRCSg5BbcQE6dobnriCafzj12', +} + +async function tvl(api) { + const tokenAccounts = await getTokenAccounts(config[api.chain], v2Idl, api.chain) + return sumTokens2({ tokenAccounts, api, }) } module.exports = { timetravel: false, solana: { tvl, }, + eclipse: { tvl, }, } const v2Idl = { diff --git a/projects/lightning-network/index.js b/projects/lightning-network/index.js index 6aeb3aa7d3..179cc4a6d7 100644 --- a/projects/lightning-network/index.js +++ b/projects/lightning-network/index.js @@ -53,7 +53,7 @@ async function tvl({ timestamp }) { } module.exports = { - start: 1516406400, + start: '2018-01-20', bitcoin: { tvl }, }; diff --git a/projects/lila-finance/index.js b/projects/lila-finance/index.js index 5a08174570..dbc86ded8a 100644 --- a/projects/lila-finance/index.js +++ b/projects/lila-finance/index.js @@ -10,7 +10,7 @@ async function tvl(api) { data = data.filter(i => i.strategy !== ADDRESSES.null) const aTokens = await api.multiCall({ abi: 'address:aToken', calls: data.map(i => i.strategy)}) const ownerTokens = data.map((i, idx) => [[i.asset, aTokens[idx]], i.strategy]) - return api.sumTokens({ ownerTokens }) + return api.sumTokens({ ownerTokens, blacklistedTokens: ['0x42c248d137512907048021b30d9da17f48b5b7b2'] }) } module.exports = { diff --git a/projects/limitless-exchange/index.js b/projects/limitless-exchange/index.js new file mode 100644 index 0000000000..c4eb1608ec --- /dev/null +++ b/projects/limitless-exchange/index.js @@ -0,0 +1,27 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +const eventAbi = "event FixedProductMarketMakerCreation(address indexed creator, address fixedProductMarketMaker, address indexed conditionalTokens, address indexed collateralToken, bytes32[] conditionIds, uint256 fee)"; + +const config = [ + { factory: "0x8E50578ACa3C5E2Ef5ed2aA4bd66429B5e44C16E", resolver: "0x15A61459d65D89A25a9e91e0dc9FC69598791505", fromBlock: 13547870 }, + { factory: "0xc397D5d70cb3B56B26dd5C2824d49a96c4dabF50", resolver: "0xc9c98965297bc527861c898329ee280632b76e18", fromBlock: 13547845 }, +]; + +const blacklistedTokens = ['0xd7788ffc73c9ae39ce24dfc1098b375792dd42ac'] + +const getMarkets = async ({ factory, resolver, fromBlock }, api) => { + const logs = await getLogs2({ api, target: factory, eventAbi, fromBlock }); + const tokens = logs.map(i => i.collateralToken) + return api.sumTokens({ owner: resolver, tokens, blacklistedTokens }); +}; + +const tvl = async (api) => { + for (const marketConfig of config) { + await getMarkets(marketConfig, api); + } +}; + +module.exports = { + methodology: "The TVL represents the total amount of tokens deposited in the prediction markets", + base: { tvl } +}; diff --git a/projects/limitless/index.js b/projects/limitless/index.js index da315123fc..04cd577516 100644 --- a/projects/limitless/index.js +++ b/projects/limitless/index.js @@ -108,7 +108,6 @@ Object.keys(config).forEach(chain => { } }) - console.log(provided.length, withdrawn.length) const pools = getUniqueAddresses(provided.map(entry => entry.pool).concat(withdrawn.map(entry => entry.pool))) const token0s = await api.multiCall({ abi: 'address:token0', calls: pools}) const token1s = await api.multiCall({ abi: 'address:token1', calls: pools}) diff --git a/projects/lineabank/index.js b/projects/lineabank/index.js index 876dc1ede3..1cd38ee386 100644 --- a/projects/lineabank/index.js +++ b/projects/lineabank/index.js @@ -8,7 +8,9 @@ const config = { zklink: '0x4Ac518DbF0CC730A1c880739CFa98fe0bB284959', bsquared: '0x72f7a8eb9F83dE366AE166DC50F16074076C3Ea6', bob: '0x77cabFd057Bd7C81c011059F1bf74eC1fBeDa971', - btr: '0xf1E25704e75dA0496B46Bf4E3856c5480A3c247F' + btr: '0xf1E25704e75dA0496B46Bf4E3856c5480A3c247F', + mint: '0x0f225d10dd29D4703D42C5E93440F828bf04D150', + taiko: '0x803a61d82BaD2743bE35Be5dC6DEA0CccE82C056' } const abis = { @@ -19,9 +21,9 @@ const abis = { Object.keys(config).forEach(chain => { const comptroller = config[chain] - module.exports[chain] = compoundExports2({ comptroller, fetchBalances: true, abis, }) + module.exports[chain] = compoundExports2({ comptroller, abis, }) }) module.exports = mergeExports([module.exports, { - linea: compoundExports2({ comptroller: '0x43Eac5BFEa14531B8DE0B334E123eA98325de866', fetchBalances: true, abis, }), + linea: compoundExports2({ comptroller: '0x43Eac5BFEa14531B8DE0B334E123eA98325de866', abis, }), }]) \ No newline at end of file diff --git a/projects/linehub-v2/index.js b/projects/linehub-v2/index.js index 28159d8de6..4bd21a19cd 100644 --- a/projects/linehub-v2/index.js +++ b/projects/linehub-v2/index.js @@ -6,7 +6,6 @@ module.exports = { tvl: getUniTVL({ factory: "0x7811DeF28977060784cC509641f2DD23584b7671", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/linqai/index.js b/projects/linqai/index.js new file mode 100644 index 0000000000..48aeb83521 --- /dev/null +++ b/projects/linqai/index.js @@ -0,0 +1,19 @@ +const stakingPools = [ + "0x786d0536B63f3638bcD17897A98B066D901C27b8", + "0xCB5Dc61Cc672761Ec049dd9349745b418580BC83", + ]; + + const rewardToken = "0xD4F4D0a10BcaE123bB6655E8Fe93a30d01eEbD04"; // LNQ + + module.exports = { + ethereum: { + tvl: async () => ({}), + staking: async (api) => { + const stakingData = stakingPools.map((poolAddress) => [rewardToken, poolAddress]); + return api.sumTokens({ + tokensAndOwners: stakingData, + }); + }, + }, + }; + \ No newline at end of file diff --git a/projects/liqee/index.js b/projects/liqee/index.js index 624c99e19c..795ccdb364 100644 --- a/projects/liqee/index.js +++ b/projects/liqee/index.js @@ -127,5 +127,5 @@ module.exports = { bsc: { tvl: bsc }, - start: 1629776276, // Aug-24-2021 11:37:56 AM +UTC + start: '2021-08-24', // Aug-24-2021 11:37:56 AM +UTC } diff --git a/projects/liquidity-slicing/index.js b/projects/liquidity-slicing/index.js new file mode 100644 index 0000000000..0928513e44 --- /dev/null +++ b/projects/liquidity-slicing/index.js @@ -0,0 +1,55 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { ethers } = require('ethers'); + +const abi = { + "checkContract": "function checkContract(uint16,bytes32) view returns (uint256)", + "nodeStates": "function nodeStates(uint256,bytes32) view returns (uint256 totalStaked,uint256,uint256)" +} + + +const MANAGER_CONTRACT_ADDRESS = "0x1F0ea3b63F3Fca05719E54E7469Ef897754eF666"; + +const config = { + manta: { + transformToken: "manta-network", + chainId: 2, + decimals: 18, + delegator: { + "0x89060B31DB21C6cB4e946EaCB28EFefF085C275a": ["0x2847e7f2823a5048f4ae2cd808a5e978aa6ce41fcbb6e7e7bbbb1b64446b0639"] + }, + validator: { + "0xaB21907461313127Ce944F6f168888d93C091363": ["0x8e8103383262ff2256490767e2338ffc452bf602b0addede203da3218cc9d241"] + } + }, + aleo: { + transformToken: "aleo", + chainId: 5, + decimals: 6, + delegator: { + "0x52ade9c48599d71603cf661f98c9b7bd21cfb8ba448efd6204e89096b969c30c": ["0xbb57045a8a9c39dfb06baaf5ed6cb02343a17feecbf63aba9b15a6694476140f"] + }, + validator: { + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff": ["0x0000000000000000000000000000000000000000000000000000000000000005"] + } + } +}; + +async function tvl(api) { + for (const chain of Object.keys(config)) { + const { transformToken: tokenId, chainId, decimals, delegator, validator, } = config[chain]; + const allConfig = { ...delegator, ...validator }; + + for (const [hostAddr, nodes] of Object.entries(allConfig)) { + const i = await api.call({ abi: abi.checkContract, target: MANAGER_CONTRACT_ADDRESS, params: [chainId, ethers.zeroPadValue(hostAddr, 32)] }); + const calls = nodes.map(v => ({ params: [i, v] })) + const stakes = (await api.multiCall({ abi: abi.nodeStates, calls, target: MANAGER_CONTRACT_ADDRESS })).map(i => i.totalStaked) + stakes.forEach(val => api.addCGToken(tokenId, val / (10 ** decimals))) + } + } +} + +module.exports = { + arbitrum: { + tvl, + } +} diff --git a/projects/liquity/index.js b/projects/liquity/index.js index 2cdcb367d9..835ba9c1ca 100644 --- a/projects/liquity/index.js +++ b/projects/liquity/index.js @@ -7,7 +7,7 @@ const STAKING_ADDRESS = "0x4f9Fbb3f1E99B56e0Fe2892e623Ed36A76Fc605d"; const LQTY_ADDRESS = "0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D" module.exports = { - start: 1617607296, + start: '2021-04-05', ethereum: { tvl: getLiquityTvl(TROVE_MANAGER_ADDRESS), staking: staking(STAKING_ADDRESS, LQTY_ADDRESS) diff --git a/projects/liquix/index.js b/projects/liquix/index.js index 9df6fa82d2..5f699b26c4 100644 --- a/projects/liquix/index.js +++ b/projects/liquix/index.js @@ -46,7 +46,6 @@ Object.keys(config).forEach((chain) => { fromBlock, }); const vaults = logs.map(i => i.proxyAddress) - console.log(vaults.length) const _balances = await api.multiCall({ abi: 'function totalUnderlying(address vault_) external view returns ((address,uint256)[] memory)', target: helper, calls: vaults, permitFailure: true, }) for (const balances of _balances) { if (!balances) continue; diff --git a/projects/liqwid/index.js b/projects/liqwid/index.js index bfa1a678b1..ba25beed08 100644 --- a/projects/liqwid/index.js +++ b/projects/liqwid/index.js @@ -11,99 +11,124 @@ module.exports = { } }; - -const endpoint = 'https://api.liqwid.finance/graphql' - -const queryAdaLoans = `query ($page: Int) { - Page (page: $page) { - pageInfo { - currentPage - hasNextPage - } - loan(marketId: "Ada") { - collaterals { - id - amount +const endpoint = 'https://v2.api.liqwid.finance/graphql' + +const queryAdaLoans = `query($input: LoansInput){ + liqwid { + data { + loans(input: $input) { + page + pagesCount + results { + collaterals { + qTokenAmount + market { + id + } + } + } } } } } ` -const query = `query ($page: Int) { - Page (page: $page) { - pageInfo { - currentPage - hasNextPage - } - market { - asset { - marketId - name - qTokenId - qTokenPolicyId - } - state { - totalSupply - utilization - } - marketId - decimals - info { - params { - underlyingClass { - value0 { - symbol - name - } - } - } - scripts { - actionToken { - script { - value0 { - value0 - } - } +const query = `query($input: MarketsInput) { + liqwid { + data { + markets(input: $input) { + page + pagesCount + results { + id + asset { + id + currencySymbol + name + decimals } + supply + liquidity + borrow + utilization } } } } } ` + const tokenMapping = { - ADA: 'lovelace', + Ada: 'lovelace', DJED: '8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61446a65644d6963726f555344', + USDM: 'c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d', DAI: 'dai', - + USDC: 'usd-coin', + USDT: 'tether', } -const getToken = market => tokenMapping[market.marketId.toUpperCase()] ?? market.info.params.underlyingClass.value0.symbol + toHex(market.info.params.underlyingClass.value0.name) +const getToken = (market) => tokenMapping[market.id] ?? market.asset.currencySymbol + market.asset.name const getOptimBondTVL = async () => { - const getLoans = async (pageIndex) => { - const { Page: { pageInfo, loan: loans } } = await graphQuery(endpoint, queryAdaLoans, { page: pageIndex }) - - if (!pageInfo.hasNextPage) { - return loans + const getLoans = async (pageIndex = 0, collectedLoans = []) => { + const { + liqwid: { + data: { loans }, + }, + } = await graphQuery(endpoint, queryAdaLoans, { + input: { + marketIds: 'Ada', + page: pageIndex, + }, + }) + + const allLoans = [...collectedLoans, ...loans.results] + + // Check if we've reached the last page + if (pageIndex < loans.pagesCount - 1) { + return await getLoans(pageIndex + 1, allLoans) } - return [...loans, ...(await getLoans(pageIndex + 1))] + + return allLoans } - const loans = await getLoans(0) - const relevantLoans = - loans.filter(l => (l.collaterals.filter(c => c.id === "OptimBond1")).length != 0) - const bonds = - relevantLoans.map(l => l.collaterals[0].amount).reduce((acc, amount) => - acc + Number(amount), 0) + const loans = await getLoans() + const relevantLoans = loans.filter((l) => + l.collaterals.some((c) => c.market.id === 'OptimBond1'), + ) + const bonds = relevantLoans + .flatMap((l) => l.collaterals) + .filter((c) => c.market.id === 'OptimBond1') + .reduce((acc, collateral) => acc + collateral.qTokenAmount, 0) return bonds } async function tvl(api) { - const { Page: { market: markets } } = await graphQuery(endpoint, query, { page: 0 }) + const getMarkets = async (pageIndex = 0, collectedMarkets = []) => { + const { + liqwid: { + data: { markets }, + }, + } = await graphQuery(endpoint, query, { + input: { + page: pageIndex, + }, + }) + + const allMarkets = [...collectedMarkets, ...markets.results] + + // Check if we've reached the last page + if (pageIndex < markets.pagesCount - 1) { + return await getMarkets(pageIndex + 1, allMarkets) + } - markets.forEach(market => add(api, market, market.state.totalSupply)) + return allMarkets + } + + const markets = await getMarkets() + markets.forEach((market) => + add(api, market, market.liquidity * 10 ** market.asset.decimals), + ) add(api, "OptimBond1", await getOptimBondTVL()) } @@ -117,36 +142,29 @@ function add(api, market, bal) { } async function borrowed(api) { - const { Page: { market: markets } } = await graphQuery(endpoint, query) - - markets.forEach(market => { - const utilization = market.state.utilization - const availability = 1 - utilization - const totalBorrowed = market.state.totalSupply * utilization / availability - add(api, market, totalBorrowed) - }) -} - -function base64ToHex(base64) { - return base64 - /* // Step 1: Decode the Base64 string to a byte array - const binaryData = atob(base64); + const getMarkets = async (pageIndex = 0, collectedMarkets = []) => { + const { + liqwid: { + data: { markets }, + }, + } = await graphQuery(endpoint, query, { + input: { + page: pageIndex, + }, + }) + + const allMarkets = [...collectedMarkets, ...markets.results] + + // Check if we've reached the last page + if (pageIndex < markets.pagesCount - 1) { + return await getMarkets(pageIndex + 1, allMarkets) + } - // Step 2: Convert each byte to its hexadecimal representation - const hexArray = []; - for (let i = 0; i < binaryData.length; i++) { - const byte = binaryData.charCodeAt(i).toString(16).padStart(2, '0'); - hexArray.push(byte); + return allMarkets } - // Step 3: Concatenate the hexadecimal values to form the final hexadecimal string - return hexArray.join(''); */ + const markets = await getMarkets() + markets.forEach((market) => { + add(api, market, market.borrow * 10 ** market.asset.decimals) + }) } - -function toHex(str) { - let hex = '' - for (let i = 0; i < str.length; i++) { - hex += str.charCodeAt(i).toString(16); - } - return hex -} \ No newline at end of file diff --git a/projects/lisk-l2/index.js b/projects/lisk-l2/index.js index 40f48c841a..9d4cb7703a 100644 --- a/projects/lisk-l2/index.js +++ b/projects/lisk-l2/index.js @@ -2,7 +2,6 @@ const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs') const config = { ethereum: { owners: ['0x2658723bf70c7667de6b25f99fcce13a16d25d08', '0x26dB93F8b8b4f7016240af62F7730979d353f9A7',], - blacklistedTokens: ['0x6033F7f88332B8db6ad452B7C6D5bB643990aE3f'], tokens: [nullAddress], } } diff --git a/projects/lixir/index.js b/projects/lixir/index.js index dcf15c9715..5d003a73f6 100644 --- a/projects/lixir/index.js +++ b/projects/lixir/index.js @@ -1,75 +1,38 @@ -const sdk = require('@defillama/sdk'); const abi = require('./abi.json') -const {staking} = require('../helper/staking') +const { staking } = require('../helper/staking'); const oldRegistry = "0x3228f22d98d81A859aCC9890c3874FfF864a8Bd4"; const newRegistry = "0x18bf8A3eE39Be5730189A0C88D90f744e3c55B20"; const vault_role = "0x0e2208c692f4f271957e6c9d7c9785b7c2c3a7e329d54eecdfaa3c5f48b0cd51"; const lixirToken = "0xd0345D30FD918D7682398ACbCdf139C808998709"; -// node test.js projects/lixir/index.js -async function ethTvl(timestamp, block) { - let balances = await vaultTvl(oldRegistry, block, {}); - await vaultTvl(newRegistry, block, balances) - return balances//await newVaultTvl(block, newVaults, balances); +async function ethTvl(api) { + await vaultTvl(oldRegistry, api); + await vaultTvl(newRegistry, api) } -async function vaultTvl(registry, block, balances, pool2 = false) { - const count = Number((await sdk.api.abi.call({ - target: registry, - block, - params: [vault_role], - abi: abi.getRoleMemberCount - })).output) - const vaults = await sdk.api.abi.multiCall({ - block, - abi: abi.getRoleMember, - calls: [...Array(count)].map((_, i) => ({ - target: registry, - params: [vault_role, i], - })) - }) +async function vaultTvl(registry, api) { + const count = await api.call({ abi: abi.getRoleMemberCount, target: registry, params: vault_role }) + const calls = [] + for (let i = 0; i < count; i++) + calls.push({ params: [vault_role, i] }) - const calls = vaults.output.map(v=>({ - target: v.output - })) - const [totals, token0, token1] = await Promise.all([ - abi.calculateTotals, - abi.token0, - abi.token1 - ].map(abi=>sdk.api.abi.multiCall({ - block, - abi, - calls - }))) + const vaults = await api.multiCall({ abi: abi.getRoleMember, target: registry, calls, }) + const token0s = await api.multiCall({ abi: abi.token0, calls: vaults }) + const token1s = await api.multiCall({ abi: abi.token1, calls: vaults }) + const totals = await api.multiCall({ abi: abi.calculateTotals, calls: vaults }) - for(let i =0; i Array.from(new Set(arr)) diff --git a/projects/llamalend/index.js b/projects/llamalend/index.js index 42a4f8ebdf..47a846a397 100644 --- a/projects/llamalend/index.js +++ b/projects/llamalend/index.js @@ -37,7 +37,7 @@ async function tvl(api) { } module.exports = { - start: 1666638251, + start: '2022-10-24', methodology: 'TVL is calculated by adding up all the ETH in the pools and the totalBorrowed of every pool', ethereum: { tvl: tvl, diff --git a/projects/llamapay/index.js b/projects/llamapay/index.js index 73fc74d78a..55bec7661f 100644 --- a/projects/llamapay/index.js +++ b/projects/llamapay/index.js @@ -1,8 +1,7 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const { sumTokens2, } = require('../helper/unwrapLPs') -const { getParamCalls, getSymbols } = require('../helper/utils') -const { isWhitelistedToken, } = require('../helper/streamingHelper') +const { getSymbols } = require('../helper/utils') +const { isWhitelistedToken, } = require('../helper/streamingHelper') const llamaPayAvax = "0x7d507b4c2d7e54da5731f643506996da8525f4a3"; const llamaPayDefault = "0xde1C04855c2828431ba637675B6929A684f84C7F"; @@ -13,42 +12,24 @@ const llamaPayMetis = "0x43634d1C608f16Fb0f4926c12b54124C93030600"; const llamaPayKava = "0xCA052D073591C0C059675B6F7F95cE75a4Ab8fc8"; const llamaPayKavaVesting = "0xB93427b83573C8F27a08A909045c3e809610411a" -async function calculateTvl(llamapay, vesting, block, chain, isVesting) { - let tokensAndOwners = await getTokensAndOwners(llamapay, chain, block) +async function calculateTvl(llamapay, vestingContract, api, isVesting) { + let tokensAndOwners = await getTokensAndOwners(llamapay, api, false) const tokens = tokensAndOwners.map(i => i[0]) - const symbolMapping = await getSymbols(chain, tokens) + const symbolMapping = await getSymbols(api.chain, tokens) tokensAndOwners = tokensAndOwners.filter(([token]) => isWhitelistedToken(symbolMapping[token], token, isVesting)) if (isVesting) - tokensAndOwners.push(...await getTokensAndOwners(vesting, chain, block, true)) - return sumTokens2({ tokensAndOwners, chain, block, }) + tokensAndOwners.push(...await getTokensAndOwners(vestingContract, api, true)) + return sumTokens2({ tokensAndOwners, api, resolveLP: false, }) // resolveLP: false maybe breaking them down returns too high TVL for some reason } -async function getTokensAndOwners(contract, chain, block, isVestingContract) { +async function getTokensAndOwners(contract, api, isVestingContract) { const abis = { count: isVestingContract ? abi.escrows_length : abi.getLlamaPayContractCount, vault: isVestingContract ? abi.escrows : abi.getLlamaPayContractByIndex, } - const { output:contractCount } = await sdk.api.abi.call({ - target: contract, - abi: abis.count, - chain, block, - }) - - const { output: llamaPayContractsRes } = await sdk.api.abi.multiCall({ - target: contract, - abi: abis.vault, - calls: getParamCalls(contractCount), - chain, block, - }) - - const llamaPayContracts = llamaPayContractsRes.map(i => i.output) - const { output: llamaPayTokens } = await sdk.api.abi.multiCall({ - calls: llamaPayContracts.map(i => ({ target: i })) , - abi: abi.token, - chain, block, - }) - - return llamaPayTokens.map(({ output}, i) => ([output, llamaPayContracts[i]])) + const llamaPayContracts = await api.fetchList({ lengthAbi: abis.count, itemAbi: abis.vault, target: contract }) + const llamaPayTokens = await api.multiCall({ calls: llamaPayContracts, abi: abi.token, }) + return llamaPayTokens.map((token, i) => ([token, llamaPayContracts[i]])) } const chains = [ @@ -64,8 +45,6 @@ const chains = [ "metis" ] -module.exports = {} - chains.forEach(chain => { let contract = llamaPayDefault let vestingContract = llamaPayVesting @@ -74,14 +53,14 @@ chains.forEach(chain => { case 'avax': contract = llamaPayAvax; break; case 'meter': contract = llamaPayMeter; vestingContract = llamaPayMeterVesting; break; case 'metis': contract = llamaPayMetis; break; - case 'kava': contract = llamaPayKava ; vestingContract = llamaPayKavaVesting; break; + case 'kava': contract = llamaPayKava; vestingContract = llamaPayKavaVesting; break; } module.exports[chain] = { hallmarks: [ - [Math.floor(new Date('2022-10-03')/1e3), 'Vesting tokens are not included in tvl'], + [Math.floor(new Date('2022-10-03') / 1e3), 'Vesting tokens are not included in tvl'], ], - tvl: async (_, _b, { [chain]: block }) => calculateTvl(contract, vestingContract, block, chain, false), - vesting: async (_, _b, { [chain]: block }) => calculateTvl(contract, vestingContract, block, chain, true), + tvl: async (api) => calculateTvl(contract, vestingContract, api, false), + vesting: async (api) => calculateTvl(contract, vestingContract, api, true), } }) \ No newline at end of file diff --git a/projects/lobster-protocol/index.js b/projects/lobster-protocol/index.js index f136ccff46..140567d574 100644 --- a/projects/lobster-protocol/index.js +++ b/projects/lobster-protocol/index.js @@ -18,7 +18,7 @@ async function tvl(api) { module.exports = { misrepresentedTokens: true, - start: 1704067199, // Sunday 31 December 2023 23:59:59 + start: '2024-01-01', // Sunday 31 December 2023 23:59:59 methodology: "Aggregates total value of Lobster protocol vaults on Arbitrum", arbitrum: { diff --git a/projects/lockon/index.js b/projects/lockon/index.js index 3eab9037df..d061659ef0 100644 --- a/projects/lockon/index.js +++ b/projects/lockon/index.js @@ -1,14 +1,26 @@ const START_TIMESTAMP = 1690340140; // 2023-07-26T02:55:40Z -const CONTROLLER_ADDRESS = "0x153e739B8823B277844Ad885A30AC5bD9DfB6E83" - -async function tvl(api) { - const sets = await api.call({ abi: "address[]:getSets", target: CONTROLLER_ADDRESS, }) - const tokens = await api.multiCall({ abi: 'address[]:getComponents', calls: sets}) - const ownerTokens = sets.map((set, i) => [tokens[i], set]) - return api.sumTokens({ ownerTokens }) +const config = { + polygon: { + controllerAddress: "0x153e739B8823B277844Ad885A30AC5bD9DfB6E83", + }, + arbitrum: { + controllerAddress: "0xA36c2B06aFc96Ffd52d148Ed6acbB9fe2Ab864Be", + } } -module.exports = { - start: START_TIMESTAMP, - polygon: { tvl } +function tvlExport({controllerAddress}) { + return async function tvl(api) { + const sets = await api.call({ abi: "address[]:getSets", target: controllerAddress, }) + const tokens = await api.multiCall({ abi: 'address[]:getComponents', calls: sets}) + const ownerTokens = sets.map((set, i) => [tokens[i], set]) + return api.sumTokens({ ownerTokens }) + } + } + +module.exports.start = START_TIMESTAMP +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: tvlExport(config[chain]) + } +}) diff --git a/projects/logx-v2/index.js b/projects/logx-v2/index.js new file mode 100644 index 0000000000..cbf99a443d --- /dev/null +++ b/projects/logx-v2/index.js @@ -0,0 +1,35 @@ +const { staking } = require('../helper/staking') + +module.exports = { + methodology: "Tokens locked in HypCollateral contracts on different chains.", +} + +const config = { + base: ['0xaca5146bc74230e77DAB543d3a14F26c8c63939e',], + arbitrum: ['0x4882520D47491561F51ea96aBC0397776Efc6cFd', '0x1d9B044393804CCFa2da3127470C9F65D4E0E5E6',], + mantle: ['0x4417613C0fe034f7D333BF8a6247EaAAF1d51965', '0x650e8941E4d90b70576fDF1b05dbDc962DA2cab8',], + mode: ['0x4882520D47491561F51ea96aBC0397776Efc6cFd','0x8BF17893f08C570fBA78E9268d3aFc61f42557f1'], + bob: ['0xaca5146bc74230e77DAB543d3a14F26c8c63939e','0x1e7c3B771b27A29116E4Df5a2DCC54FDaAC902db'], + sei: ['0xc010f83ae18dC5f40e888898F6605F075686432e','0x0B3b4FAFDe8baFde82C3BfD38538B7aEe4407498'], + scroll: ['0x1C70cc9F8236C4Ae2ce3d34d4Da4696Aea611f90','0xcfFe53CEd05A750Fa58304c11997a0335dE731b6'], + kroma: ['0xaca5146bc74230e77DAB543d3a14F26c8c63939e','0x1e7c3B771b27A29116E4Df5a2DCC54FDaAC902db'], + taiko: ['0x650e8941E4d90b70576fDF1b05dbDc962DA2cab8','0x1d9B044393804CCFa2da3127470C9F65D4E0E5E6'], + optimism: ['0x650e8941E4d90b70576fDF1b05dbDc962DA2cab8','0x4417613C0fe034f7D333BF8a6247EaAAF1d51965'], + linea: ['0xaca5146bc74230e77DAB543d3a14F26c8c63939e','0x1e7c3B771b27A29116E4Df5a2DCC54FDaAC902db'], + rari: ['0x1C70cc9F8236C4Ae2ce3d34d4Da4696Aea611f90',], + mint: ['0xaca5146bc74230e77DAB543d3a14F26c8c63939e', '0xdB29A58A53Ac438a5E325f1d7a41346aA63b7ece',], + polygon: ['0x1e7c3B771b27A29116E4Df5a2DCC54FDaAC902db', '0xaca5146bc74230e77DAB543d3a14F26c8c63939e',], +} + +Object.keys(config).forEach(chain => { + let vault = config[chain] + module.exports[chain] = { + tvl: async (api) => { + if (!Array.isArray(vault)) vault = [vault] + const tokens = await api.multiCall({ abi: 'address:wrappedToken', calls: vault }) + return api.sumTokens({ tokensAndOwners2: [tokens, vault] }) + } + } +}) + +module.exports.arbitrum.staking = staking('0x89E86f7d2398e8C1070d321D18c1Ce75aBF09b75', '0x59062301Fb510F4ea2417B67404CB16D31E604BA') \ No newline at end of file diff --git a/projects/logx/index.js b/projects/logx/index.js index a90d5d4e53..35bd295364 100644 --- a/projects/logx/index.js +++ b/projects/logx/index.js @@ -2,6 +2,9 @@ const { nullAddress } = require("../helper/tokenMapping") module.exports = { methodology: "USDC.e in the vault", + hallmarks: [ + [Math.floor(new Date('2024-09-10')/1e3), 'v1 is deprecated'], + ], } const config = { diff --git a/projects/lolik/index.js b/projects/lolik/index.js index e791764661..a26d2d8d65 100644 --- a/projects/lolik/index.js +++ b/projects/lolik/index.js @@ -1,6 +1,7 @@ +const ADDRESSES = require('../helper/coreAssets.json') async function tvl(api) { - const pooledFTN = await api.call({ target: '0x780Fb5AcA83F2e3F57EE18cc3094988Ef49D8c3d', abi: "uint256:getTotalPooledFtn" }) + const pooledFTN = await api.call({ target: ADDRESSES.ftn.stFTN, abi: "uint256:getTotalPooledFtn" }) return { 'coingecko:fasttoken': pooledFTN / 1e18, diff --git a/projects/lombard-vault/index.js b/projects/lombard-vault/index.js new file mode 100644 index 0000000000..d169e56869 --- /dev/null +++ b/projects/lombard-vault/index.js @@ -0,0 +1,13 @@ +const { sumTokensExport } = require('../helper/unwrapLPs'); +const vaults = [ + '0x5401b8620E5FB570064CA9114fd1e135fd77D57c', +] + +module.exports = { + doublecounted: true, + ethereum: { + tvl: sumTokensExport({ owners: vaults, fetchCoValentTokens: true, tokenConfig: { + onlyWhitelisted: false, + }, resolveUniV3: true,}), + }, +} \ No newline at end of file diff --git a/projects/lombard/index.js b/projects/lombard/index.js new file mode 100644 index 0000000000..8789b8cfd0 --- /dev/null +++ b/projects/lombard/index.js @@ -0,0 +1,13 @@ +const { sumTokens } = require('../helper/chain/bitcoin') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +async function tvl() { + return sumTokens({ owners: await bitcoinAddressBook.lombard() }) +} + +module.exports = { + doublecounted:true, + timetravel: false, + isHeavyProtocol: true, + bitcoin: { tvl } +} \ No newline at end of file diff --git a/projects/loopfi/index.js b/projects/loopfi/index.js index 1cc6ccdb44..9def15476c 100644 --- a/projects/loopfi/index.js +++ b/projects/loopfi/index.js @@ -2,6 +2,9 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require("../helper/unwrapLPs") const LOOP_PRELAUNCH = "0xaBEEcB1d3414550B30694bB37ac24CAaD0b82aE9" +const LOOP_PRELAUNCH_SCROLL = "0x640befeAd1A7ce841ef878058A7003EC260ebAE8" +const LOOP_PRELAUNCH_BTC = "0x497Fb40D610C29E66d06F3B18Cd9966053abB49A" +const LOOP_PRELAUNCH_YNETH = "0xa67C60AE18BE09F074a6c733a1cc06B63Ae53589" const tokens = { WETH: ADDRESSES.ethereum.WETH, @@ -13,14 +16,36 @@ const tokens = { pufETH: "0xD9A442856C234a39a81a089C06451EBAa4306a72", } +const tokensScroll = { + WETH: ADDRESSES.scroll.WETH, + STONE: ADDRESSES.scroll.STONE, + weETH: '0x01f0a31698C4d065659b9bdC21B3610292a1c506', + wrsETH: '0xa25b25548B4C98B0c7d3d27dcA5D5ca743d68b7F', + pufETH: '0xc4d46E8402F476F269c379677C99F18E22Ea030e', +} + +const tokensBtc = { + WBTC: ADDRESSES.ethereum.WBTC, + swBTC: '0x8DB2350D78aBc13f5673A411D4700BCF87864dDE' +} + +const tokensYieldnest = { + ynETH: '0x09db87A538BD693E9d08544577d5cCfAA6373A48' +} + module.exports = { methodology: - "Counts the number of WETH and LRT tokens in the LoopFi Prelaunch Contract.", - start: 1718390875, + "Counts the number of WETH, WBTC and LRT tokens in the LoopFi Prelaunch Contracts in Ethereum and Scroll networks.", + start: '2024-06-14', ethereum: { tvl: sumTokensExport({ - owner: LOOP_PRELAUNCH, - tokens: Object.values(tokens), - }), + ownerTokens: [[Object.values(tokens), LOOP_PRELAUNCH], [Object.values(tokensBtc), LOOP_PRELAUNCH_BTC], [Object.values(tokensYieldnest), LOOP_PRELAUNCH_YNETH]], + }) }, + scroll: { + tvl: sumTokensExport({ + owner: LOOP_PRELAUNCH_SCROLL, + tokens: Object.values(tokensScroll), + }) + } } diff --git a/projects/loopring/index.js b/projects/loopring/index.js index 9dfd04a6f1..eb0990b644 100644 --- a/projects/loopring/index.js +++ b/projects/loopring/index.js @@ -1,4 +1,6 @@ const { sumTokens2 } = require("../helper/unwrapLPs"); +const { sumTokensExport } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') module.exports = { ethereum: { @@ -12,4 +14,18 @@ module.exports = { fetchCoValentTokens: true, }), }, + taiko: { + tvl: + sumTokensExport({ + owners: ['0x3e71a41325e1d6B450307b6535EC48627ac4DaCC'], + tokens: [ + ADDRESSES.null, + ADDRESSES.taiko.USDC, + ADDRESSES.taiko.USDT, + ADDRESSES.taiko.DAI, + ADDRESSES.taiko.LRC, + ADDRESSES.taiko.TAIKO + ] + }), + } }; diff --git a/projects/lorenzo-bsc-lst/index.js b/projects/lorenzo-bsc-lst/index.js new file mode 100644 index 0000000000..09fedff989 --- /dev/null +++ b/projects/lorenzo-bsc-lst/index.js @@ -0,0 +1,20 @@ +const sdk = require('@defillama/sdk'); + +async function bscTvl(api) { + const stBTCTokenAddress = '0xf6718b2701D4a6498eF77D7c152b2137Ab28b8A3'; + const totalSupply = await api.call({ + abi: 'erc20:totalSupply', + target: stBTCTokenAddress, + }); + + const balances = {}; + sdk.util.sumSingleBalance(balances, 'coingecko:bitcoin', totalSupply / (1e18)); + return balances; +} + +module.exports = { + methodology: "Lorenzo, As the Bitcoin Liquidity Finance Layer", + bsc: { + tvl: bscTvl, + } +}; \ No newline at end of file diff --git a/projects/lorenzo-enzoBTC/index.js b/projects/lorenzo-enzoBTC/index.js new file mode 100644 index 0000000000..1f26d167d7 --- /dev/null +++ b/projects/lorenzo-enzoBTC/index.js @@ -0,0 +1,7 @@ +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') +const { sumTokensExport } = require("../helper/sumTokens"); + +module.exports = { + methodology: "enzoBTC, Lorenzo Wrapped Bitcoin", + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.lorenzo2 }) } +}; \ No newline at end of file diff --git a/projects/lorenzo/index.js b/projects/lorenzo/index.js index c0ee691cba..cf0fbcf01e 100644 --- a/projects/lorenzo/index.js +++ b/projects/lorenzo/index.js @@ -1,23 +1,8 @@ const { sumTokensExport } = require("../helper/sumTokens"); - -const LorenzoOwners = [ - "bc1pzd6luyardlle9f7lul2y8fl72c22p6vxspc4k4g4gzgjf8975s0sr042yt", - "bc1p7agkadaau66jtva9n8k5pg3lsctuyqur8a2l5y9hzwqkh5nlmd0skuhws3", - "bc1qaf6laj9m7jteztyz4lulrtcjtpusfcfnd7r7xn", - "bc1qf6cj2z2e2mzuvfrl80vgt53k7jc2vf36ckahgy", - "bc1q5hc68n6krnzgzswf7rknha2aqxzrzup4vlhce8", - "bc1qpxpmr3zdjulqnwa3jdvm83tpaek6dv3kc75ms7", - "bc1qaml9d9mqgfhsfuaa2ymutdl4psj8c2undx9n72", - "bc1qutgngqyrflxrfmk9k28ucvq0s2v8a43nwfwv02", - "bc1qrx3fpr5j6sprxett45c2kl9p4pajyxep0mapfd", - "bc1q00t2ntm46c2nfvcer6ukj6npaxjurujthse4qq", - "bc1q3pzhncle68gct6me08kn5kf9awkevt6ettwrmg", - "bc1qw6cvwx8ajprmp2lzkhrsps2qx4k9r2pj4xj98x" -]; +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { methodology: "Lorenzo, As the Bitcoin Liquidity Finance Layer", - bitcoin: { - tvl: sumTokensExport({ owners : LorenzoOwners }), - } + doublecounted:true, + bitcoin: { tvl: sumTokensExport({ owners : bitcoinAddressBook.lorenzo }) } }; \ No newline at end of file diff --git a/projects/louverture/index.js b/projects/louverture/index.js index 5dd6974172..9d39b7ee95 100644 --- a/projects/louverture/index.js +++ b/projects/louverture/index.js @@ -21,7 +21,7 @@ async function staking(timestamp, ethBlock, chainBlocks) { module.exports = { - start: 1639872000, // 19/12/2021 @ 00:00am (UTC) + start: '2021-12-19', // 19/12/2021 @ 00:00am (UTC) avax:{ staking, tvl: async()=>({}) diff --git a/projects/love/index.js b/projects/love/index.js index e0587f6593..ec0391bcc3 100644 --- a/projects/love/index.js +++ b/projects/love/index.js @@ -2,7 +2,6 @@ module.exports = { methodology: "The liquidity on these three pools + the tokens staked on all three chains (PulseChain, Ethereum, and Binance Smart Chain)", - start: 1000235, }; const config = { diff --git a/projects/loxodrome-perp/index.js b/projects/loxodrome-perp/index.js new file mode 100644 index 0000000000..8aded92dff --- /dev/null +++ b/projects/loxodrome-perp/index.js @@ -0,0 +1,7 @@ +const { gmxExports } = require('../helper/gmx') + +module.exports = { + iotex: { + tvl: gmxExports({ vault: '0x13904291B7d3e87d23070d22Bc34FA514F99Db18' }) + }, +} \ No newline at end of file diff --git a/projects/lpeth/index.js b/projects/lpeth/index.js new file mode 100644 index 0000000000..2b2ba1f532 --- /dev/null +++ b/projects/lpeth/index.js @@ -0,0 +1,14 @@ + +async function tvl(api) { + const LPETH_CONTRACT = "0xF3a75E087A92770b4150fFF14c6d36FB07796252" + const liabilities = await api.call({ abi: 'uint256:liabilities', target: LPETH_CONTRACT, }) + api.addGasToken(liabilities) +} + +module.exports = { + methodology: 'Counts the amount of deposited ETH in the LPETH contract.', + doublecounted: true, + ethereum: { + tvl + } +} \ No newline at end of file diff --git a/projects/lsdx/index.js b/projects/lsdx/index.js index 9e6484c7b8..fdc0114b3d 100644 --- a/projects/lsdx/index.js +++ b/projects/lsdx/index.js @@ -24,7 +24,6 @@ async function tvl(api) { } module.exports = { - start: 16831303, ethereum: { tvl, pool2: staking(['0x1D31755E03119311c7F00ae107874dddEC7573f3', '0xE05630Da82604591F002b61F7116429CfDC4B542'], LSD_LPs), diff --git a/projects/lucidly/index.js b/projects/lucidly/index.js new file mode 100644 index 0000000000..34df9999c1 --- /dev/null +++ b/projects/lucidly/index.js @@ -0,0 +1,18 @@ +async function tvl(api) { + const registryAddress = '0x3C2A24c9296eC8B1fdb8039C937DaC7CBca3976c'; + + const pools = await api.call({ + abi: 'function getPoolAddresses() view returns (address[])', + target: registryAddress, + }); + + const tokens = await api.fetchList({ lengthAbi: 'numTokens', itemAbi: 'tokens', calls: pools, groupedByInput: true, }) + const ownerTokens = pools.map((v, i) => [tokens[i], v]) + return api.sumTokens({ ownerTokens }) +} + + +module.exports = { + start: '2023-09-06', + ethereum: { tvl } +}; diff --git a/projects/lumin-finance/index.js b/projects/lumin-finance/index.js index c39a9bc6ff..16a8afa881 100644 --- a/projects/lumin-finance/index.js +++ b/projects/lumin-finance/index.js @@ -41,7 +41,6 @@ async function staking(api) { module.exports = { methodology: 'Gets v1 total deposits, and v2 staking statistics on-chain.', - start: 194344665, arbitrum: { staking, tvl, borrowed, diff --git a/projects/lusd-chickenbonds/index.js b/projects/lusd-chickenbonds/index.js index d93510fdcd..d7caf1c27c 100644 --- a/projects/lusd-chickenbonds/index.js +++ b/projects/lusd-chickenbonds/index.js @@ -23,7 +23,6 @@ async function tvl(_, block) { module.exports = { methodology: 'counts the amount of LUSD tokens in the 3 buckets of the LUSD ChickenBonds protocol.', - start: 15674057, ethereum: { tvl, }, diff --git a/projects/lybra-v2/index.js b/projects/lybra-v2/index.js index c8acd6af6f..18d8cdd058 100644 --- a/projects/lybra-v2/index.js +++ b/projects/lybra-v2/index.js @@ -8,7 +8,6 @@ const wbETHvault = "0xB72dA4A9866B0993b9a7d842E5060716F74BF262"; const rETHvault = "0x090B2787D6798000710a8e821EC6111d254bb958" module.exports = { - start: 17990141, ethereum: { tvl: sumTokensExport({ tokensAndOwners2: [[ADDRESSES.ethereum.STETH, ADDRESSES.ethereum.WSTETH, "0xa2e3356610840701bdf5611a53974510ae27e2e1", ADDRESSES.ethereum.RETH], [stETHvault, wstETHvault, wbETHvault, rETHvault]] }), } diff --git a/projects/lybra/index.js b/projects/lybra/index.js index 848b7bf64d..bee2811b23 100644 --- a/projects/lybra/index.js +++ b/projects/lybra/index.js @@ -5,7 +5,7 @@ const { sumTokensExport } = require("../helper/unwrapLPs"); const LYBRA_CONTRACT = "0x97de57eC338AB5d51557DA3434828C5DbFaDA371"; module.exports = { - start: 1682265600, + start: '2023-04-23', ethereum: { tvl: sumTokensExport({ owner: LYBRA_CONTRACT, tokens: [ADDRESSES.ethereum.STETH]}), } diff --git a/projects/lynx/index.js b/projects/lynx/index.js index 84a8d36aee..55a61557e3 100644 --- a/projects/lynx/index.js +++ b/projects/lynx/index.js @@ -2,62 +2,111 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require("../helper/unwrapLPs"); const config = { - linea: { + // Engine Chips + sonic: { tokenAndOwnerPair: [ [ - // veLVC Token - "0xcc22F6AA610D1b2a0e89EF228079cB3e1831b1D1", - // OFTChipAdapter (owner) - "0xc5e782e2a4e2cfcb7ed454cf5a7b6aa2bb424b90", + // wS Token + ADDRESSES.sonic.wS, + // EngineChip (owner) + "0x0e7a7a477ab4dDFB2d7a500D33c38A19372a70Fc" ], - ], + [ + // AG Token + "0x005851f943ee2957b1748957f26319e4f9edebc1", + // EngineChip (owner) + "0x4461913eCa88EDE2d76B576C8fA5D08535bb714A" + ], + ] }, fantom: { tokenAndOwnerPair: [ [ - // FTM Token - "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", - // OFTChipAdapter (owner) + // WFTM Token + ADDRESSES.fantom.WFTM, + // EngineChip (owner) "0x614aA983f54409D475aeC5D18120FECFD6320eF4" ], + // [ + // // FTM Token + // "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", + // // EngineChip (owner) + // "0x614aA983f54409D475aeC5D18120FECFD6320eF4" + // ], [ // USDC Token - ADDRESSES.fantom.USDC, - // OFTChipAdapter (owner) + "0x2F733095B80A04b38b0D10cC884524a3d09b836a", + // EngineChip (owner) "0x194609ea1C1D77e66eaB28C48CE266A48f3bC30a", ], - [ + [ + // SPIRIT Token + "0x5cc61a78f164885776aa610fb0fe1257df78e59b", + // EngineChip (owner) + "0x1401C2C092df468862e23502B88A8795e2e9aecf", + ], + [ // FSONIC Token "0x05e31a691405d06708a355c029599c12d5da8b28", - // OFTChipAdapter (owner) + // EngineChip (owner) "0xCCC0d9d276176FED7E6918dCf99F23DCAaCFcAc5" ], [ // BRUSH Token "0x85dec8c4b2680793661bca91a8f129607571863d", - // OFTChipAdapter (owner) - "0xcbd1a63a84af4baa9541331420ff98d8fca3ba1c", + // EngineChip (owner) + "0xCBd1A63A84af4BAA9541331420fF98d8Fca3ba1C", ], [ // POLTER Token "0x5c725631FD299703D0A74C23F89a55c6B9A0C52F", - // OFTChipAdapter (owner) - "0x089cd8ac58d9a1488b3cdfdfeb20963e7bb33732", + // EngineChip (owner) + "0x089cD8AC58D9a1488b3cDfDfeb20963e7BB33732", ], [ // fBUX Token "0x1e2Ea3f3209D66647f959CF00627107e079B870d", - // OFTChipAdapter (owner) - "0x86facb048fee156a16104531bd36cdff118d8107", + // EngineChip (owner) + "0x86fAcB048FEe156A16104531Bd36CDfF118d8107", ], [ // fTAILS Token "0x5cF90b977C86415a53CE3B7bE13b26f6abdDfee2", - // OFTChipAdapter (owner) - "0x2c241eefc4b61ed475d7f1ded112df99e5de0e8f", + // EngineChip (owner) + "0x2c241eeFc4b61ed475d7f1DeD112df99E5De0E8F", + ], + [ + // sGOAT Token + "0x43f9a13675e352154f745d6402e853fecc388aa5", + // EngineChip (owner) + "0xa8ddbf9B7E307100ba689C02CC1360112d660206", + ], + [ + // EQUAL Token + "0x3fd3a0c85b70754efc07ac9ac0cbbdce664865a6", + // EngineChip (owner) + "0x59698CA79B8568F25294d6Eab6281667712079eE", ], ], }, + boba: { + tokenAndOwnerPair: [ + [ + // BOBA Token + ADDRESSES.boba.BOBA, + // EngineChip (owner) + "0x9beABD8699E2306c5632C80E663dE9953e104C3f" + ], + [ + // USDC Token + ADDRESSES.boba.USDC, + // EngineChip (owner) + "0xcDD339d704Fb8f35A3a2f7d9B064238D33DC7550" + ], + ] + }, + + // OFT Chips fuse: { tokenAndOwnerPair: [ [ @@ -86,11 +135,33 @@ const config = { ], ], }, + linea: { + tokenAndOwnerPair: [ + [ + // veLVC Token + "0xcc22F6AA610D1b2a0e89EF228079cB3e1831b1D1", + // OFTChipAdapter (owner) + "0xc5e782e2a4e2cfcb7ed454cf5a7b6aa2bb424b90", + ], + [ + // LVC Token + "0xcc22F6AA610D1b2a0e89EF228079cB3e1831b1D1", + // OFTChipAdapter (owner) + "0x55f2f3fA843C1755e17eb5F32D29a35c99a3aF09", + ], + ], + }, arbitrum: { tokenAndOwnerPair: [ [ // stEUR Token - ADDRESSES.celo.STEUR, + ADDRESSES.arbitrum.ARB, + // OFTChipAdapter (owner) + "0x094DE4d315198Df981D3a20ceFc3381B2182a572", + ], + [ + // stEUR Token + "0x004626a008b1acdc4c74ab51644093b155e59a23", // OFTChipAdapter (owner) "0xc5e782e2a4e2cfcb7ed454cf5a7b6aa2bb424b90", ], @@ -104,7 +175,7 @@ const config = { // EUROs Token "0x643b34980e635719c15a2d4ce69571a258f940e9", // OFTChipAdapter (owner) - "0x3552fe61af3f6d3235dd1cb75402d4281d1fbac6", + "0x3552fE61af3F6d3235Dd1CB75402d4281d1FbaC6", ], [ // GRAI Token @@ -112,6 +183,36 @@ const config = { // OFTChipAdapter (owner) "0xBe1fa4177fBf43683434CecD5563DA6Ea00FD474", ], + [ + // SLIZ Token + "0x463913D3a3D3D291667D53B8325c598Eb88D3B0e", + // OFTChipAdapter (owner) + "0x1E1F546dF45A82F2a29E709C85331E3974dC26b0", + ], + [ + // SCALES Token + "0xe6af844d5740b6b297b6dd7fb2ce299ee9e3d16f", + // OFTChipAdapter (owner) + "0x1E71Fad2d453dAb287Dad8CD003CA24A9d9194EA", + ], + [ + // USDFI Token + "0x249c48e22e95514ca975de31f473f30c2f3c0916", + // OFTChipAdapter (owner) + "0x24d6318B87ABB45B62D981693FCF25A5956F41e2", + ], + [ + // STABLE Token + "0x666966ef3925b1c92fa355fda9722899f3e73451", + // OFTChipAdapter (owner) + "0x2E2a9b820BDDfD54487f8d5A0Dfd5940D5Dac6A9", + ], + [ + // uniBTC Token + "0x6B2a01A5f79dEb4c2f3c0eDa7b01DF456FbD726a", + // OFTChipAdapter (owner) + "0xCf3562bbe462A249a4b2B2a421dF00b93E081066", + ], ], }, optimism: { @@ -124,34 +225,46 @@ const config = { ], ], }, - polygon: { + mantle: { tokenAndOwnerPair: [ [ - // MAI Token - "0xa3fa99a148fa48d14ed51d610c367c61876997f1", + // aUSD Token + "0xD2B4C9B0d70e3Da1fBDD98f469bD02E77E12FC79", // OFTChipAdapter (owner) - "0x7279d1cff1510e503b6be64fbbad64088034504c", + "0xC5E782E2A4E2cFCb7eD454CF5a7b6aa2bB424B90", ], + ], + }, + polygon: { + tokenAndOwnerPair: [ [ // WMATIC Token ADDRESSES.polygon.WMATIC_2, // OFTChipAdapter (owner) "0x028815b56433a4aae10087290d1ed9ef7437068f", ], - ], - }, - mantle: { - tokenAndOwnerPair: [ [ - // aUSD Token - "0xD2B4C9B0d70e3Da1fBDD98f469bD02E77E12FC79", + // MIMATIC Token + "0xa3fa99a148fa48d14ed51d610c367c61876997f1", // OFTChipAdapter (owner) - "0xC5E782E2A4E2cFCb7eD454CF5a7b6aa2bB424B90", + "0x7279d1cFf1510E503B6Be64fBBAd64088034504C", ], ], }, bsc: { tokenAndOwnerPair: [ + [ + // wBNB Token + ADDRESSES.bsc.WBNB, + // OFTChipAdapter (owner) + "0x67ac4355787fe8313D6cAfd23aEa4463704fBaeC", + ], + [ + // USDT Token + ADDRESSES.bsc.USDT, + // OFTChipAdapter (owner) + "0x7eDb95ba0294EfD054221141FcC8f12F2Ada1129", + ], [ // lisUSD Token "0x0782b6d8c4551B9760e74c0545a9bCD90bdc41E5", @@ -160,6 +273,64 @@ const config = { ], ], }, + mode: { + tokenAndOwnerPair: [ + [ + // MODE Token + "0xDfc7C877a950e49D2610114102175A06C2e3167a", + // OFTChipAdapter (owner) + "0x3b7ED1cDF0Fc64d95c0D0428b9Cc99b6A9a5CB94", + ], + [ + // ION Token + "0x18470019bF0E94611f15852F7e93cf5D65BC34CA", + // OFTChipAdapter (owner) + "0xD22c72aB0f4967edB876d84773BfF0b60A92e51a", + ], + ], + }, + celo: { + tokenAndOwnerPair: [ + [ + // CELO Token + ADDRESSES.celo.CELO, + // OFTChipAdapter (owner) + "0x7279d1cFf1510E503B6Be64fBBAd64088034504C", + ], + [ + // USDT Token + ADDRESSES.celo.USDT_1, + // OFTChipAdapter (owner) + "0xA36cB6e644cCE5fB98bDa9aa538927B2c934D8fa", + ], + ] + }, + zircuit: { + tokenAndOwnerPair: [ + [ + // ZRC Token + "0xfd418e42783382e86ae91e445406600ba144d162", + // OFTChipAdapter (owner) + "0xa624818151078Ccc936BF056DEf51114808BFE16", + ], + ] + }, + ethereum: { + tokenAndOwnerPair: [ + [ + // WEETh Token + ADDRESSES.ethereum.WEETH, + // OFTChipAdapter (owner) + "0x66Aaf6Da70dA10aC8dC024E668edcade1C8F5b44", + ], + [ + // TUNA Token + "0xadd353fb2e2c563383ff3272a500f3e7134dafe4", + // OFTChipAdapter (owner) + "0x3b7ED1cDF0Fc64d95c0D0428b9Cc99b6A9a5CB94", + ], + ], + } }; Object.keys(config).forEach((chain) => { diff --git a/projects/lyra-v2/index.js b/projects/lyra-v2/index.js index cc0875f993..1c119dda7a 100644 --- a/projects/lyra-v2/index.js +++ b/projects/lyra-v2/index.js @@ -21,7 +21,6 @@ chains.forEach(chain => { tvl: async (api) => { const oldToA = await getOldToA(api) const toa = await getToA(api) - console.log(chain, oldToA.concat(toa)) return sumTokens2({ tokensAndOwners: oldToA.concat(toa), api }) } } diff --git a/projects/lyve/index.js b/projects/lyve/index.js index b3dc27950d..ce53e42837 100644 --- a/projects/lyve/index.js +++ b/projects/lyve/index.js @@ -15,7 +15,7 @@ async function tvl(api) { module.exports = { methodology: "Adds up the total value locked as collateral on the Lyve platform", - start: 1699459200, + start: '2023-11-08', }; Object.keys(ADMIN_ADDRESSES).forEach(chain => { diff --git a/projects/m0/index.js b/projects/m0/index.js new file mode 100644 index 0000000000..3bb30964b3 --- /dev/null +++ b/projects/m0/index.js @@ -0,0 +1,18 @@ +const { getLogs2 } = require('../helper/cache/getLogs') +const ADDRESSES = require('../helper/coreAssets.json') + +const minterGateway = '0xf7f9638cb444d65e5a40bf5ff98ebe4ff319f04e' +const eventAbi = "event MinterActivated(address indexed minter, address indexed caller)" +const abi = 'function collateralOf(address minter_) view returns (uint240)' + +const tvl = async (api) => { + const logs = await getLogs2({ api, target: minterGateway, eventAbi, fromBlock: 19818447, extraKey: 'MinterActivated' }) + const minters = [...new Set(logs.map(log => log.minter))]; + const collateralOf = await api.multiCall({ target: minterGateway, calls: minters, abi }) + api.add(ADDRESSES.ethereum.USDC, collateralOf) +} + +module.exports = { + methodology: "TVL corresponds to the value minted by an institution by depositing short-term T-bills", + ethereum: { tvl } +} \ No newline at end of file diff --git a/projects/macaron/config.js b/projects/macaron/config.js index 15ca85d9a0..af0703676f 100644 --- a/projects/macaron/config.js +++ b/projects/macaron/config.js @@ -1,1011 +1,250 @@ -const ADDRESSES = require('../helper/coreAssets.json') const vaults_bsc = [ { - "sousId": 0, "stakingToken": { "symbol": "CAKE", - "address": { - "56": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", - "97": "0xa35062141Fa33BCA92Ce69FeD37D0E8908868AAe" - }, - "decimals": 18, - "projectLink": "https://pancakeswap.finance/" + "address": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", }, - "earningToken": { - "symbol": "CAKE", - "address": { - "56": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", - "97": "0xa35062141Fa33BCA92Ce69FeD37D0E8908868AAe" - }, - "decimals": 18, - "projectLink": "https://pancakeswap.finance/" - }, - "contractAddress": { - "56": "0xCd59d44E94Dec10Bb666f50f98cD0B1593dC3a3A", - "97": "" - }, - "masterchef": { - "56": "0x73feaa1eE314F8c655E354234017bE2193C9E24E", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "10", - "sortOrder": 1, - "isFinished": true + "contractAddress": "0xCd59d44E94Dec10Bb666f50f98cD0B1593dC3a3A", + "masterchef": "0x73feaa1eE314F8c655E354234017bE2193C9E24E", }, { - "sousId": 1, "stakingToken": { "symbol": "BAKE", - "address": { - "56": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5", - "97": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5" - }, - "decimals": 18, - "projectLink": "https://www.bakeryswap.org/" - }, - "earningToken": { - "symbol": "BAKE", - "address": { - "56": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5", - "97": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5" - }, - "decimals": 18, - "projectLink": "https://www.bakeryswap.org/" + "address": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5", }, - "contractAddress": { - "56": "0xBB7ac3eB02c6d012cc8e2d916678De8843Eb8A56", - "97": "" - }, - "masterchef": { - "56": "0x20eC291bB8459b6145317E7126532CE7EcE5056f", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.39375", - "sortOrder": 1, - "isFinished": true + "contractAddress": "0xBB7ac3eB02c6d012cc8e2d916678De8843Eb8A56", + "masterchef": "0x20eC291bB8459b6145317E7126532CE7EcE5056f", }, { - "sousId": 2, "stakingToken": { "symbol": "BANANA", - "address": { - "56": "0x603c7f932ed1fc6575303d8fb018fdcbb0f39a95", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apeswap.finance/" - }, - "earningToken": { - "symbol": "BANANA", - "address": { - "56": "0x603c7f932ed1fc6575303d8fb018fdcbb0f39a95", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apeswap.finance/" - }, - "contractAddress": { - "56": "0xd474366F6c80230507481495F3C1490e62E3093F", - "97": "" - }, - "masterchef": { - "56": "0x5c8d727b265dbafaba67e050f2f739caeeb4a6f9", - "97": "" + "address": "0x603c7f932ed1fc6575303d8fb018fdcbb0f39a95", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "2.5", - "sortOrder": 1, - "isFinished": false + "contractAddress": "0xd474366F6c80230507481495F3C1490e62E3093F", + "masterchef": "0x5c8d727b265dbafaba67e050f2f739caeeb4a6f9", }, { - "sousId": 3, "stakingToken": { "symbol": "BAKE", - "address": { - "56": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5", - "97": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5" - }, - "decimals": 18, - "projectLink": "https://www.bakeryswap.org/" + "address": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5", }, - "earningToken": { - "symbol": "BAKE", - "address": { - "56": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5", - "97": "0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5" - }, - "decimals": 18, - "projectLink": "https://www.bakeryswap.org/" - }, - "contractAddress": { - "56": "0x6dAc44A858Cb51e0d4d663A6589D2535A746607A", - "97": "" - }, - "masterchef": { - "56": "0x6a8DbBfbB5a57d07D14E63E757FB80B4a7494f81", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.025315565", - "sortOrder": 1, - "isFinished": false + "contractAddress": "0x6dAc44A858Cb51e0d4d663A6589D2535A746607A", + "masterchef": "0x6a8DbBfbB5a57d07D14E63E757FB80B4a7494f81", } ] const choco_pools_bsc = [ { - "sousId": 0, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "contractAddress": { - "56": "0xFcDE390bF7a8B8614EC11fa8bde7565b3E64fe0b", - "97": "0x09B7e4A3E9d3c5d5Da59B2F371ABC3a81Ff6c443" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.0715", - "sortOrder": 1, - "isFinished": false + "contractAddress": "0xFcDE390bF7a8B8614EC11fa8bde7565b3E64fe0b", }, { - "sousId": 1, "stakingToken": { "symbol": "CAKE", - "address": { - "56": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", - "97": "0xa35062141Fa33BCA92Ce69FeD37D0E8908868AAe" - }, - "decimals": 18, - "projectLink": "https://pancakeswap.finance/" - }, - "earningToken": { - "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", }, - "contractAddress": { - "56": "0xCded81aa5Ab3A433CadF77Fd5aC8B6fD973906e1", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.0022", - "sortOrder": 3, - "isFinished": true, + "contractAddress": "0xCded81aa5Ab3A433CadF77Fd5aC8B6fD973906e1", "isCLP": true, - "syrupAddresses": { - "56": "0x009cF7bC57584b7998236eff51b98A168DceA9B0", - "97": "" - } + "syrupAddresses": "0x009cF7bC57584b7998236eff51b98A168DceA9B0", }, { - "sousId": 3, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "earningToken": { - "symbol": "CAKE", - "address": { - "56": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", - "97": "0xa35062141Fa33BCA92Ce69FeD37D0E8908868AAe" - }, - "decimals": 18, - "projectLink": "https://pancakeswap.finance/" - }, - "contractAddress": { - "56": "0xF69bdcDB577F98753d4890Cc5aCfF3BE00177584", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.002", - "sortOrder": 4, - "isFinished": false, - "isCLP": false + "contractAddress": "0xF69bdcDB577F98753d4890Cc5aCfF3BE00177584", }, { - "sousId": 4, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "TAPE", - "address": { - "56": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apetools.co/" - }, - "contractAddress": { - "56": "0x7DB34B681c759918079C67EeF08868225F34fbcB", - "97": "" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.810185185", - "sortOrder": 5, - "isFinished": false, - "isCLP": false + "contractAddress": "0x7DB34B681c759918079C67EeF08868225F34fbcB", }, { - "sousId": 5, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "TBAKE", - "address": { - "56": "0x26d6e280f9687c463420908740ae59f712419147", - "97": "" - }, - "decimals": 18, - "projectLink": "https://bakerytools.io/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "contractAddress": { - "56": "0x13ED683DDf483d1f0bd2AE02b01D4d1D451D6c5b", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "1.099", - "sortOrder": 6, - "isFinished": false, - "isCLP": false + "contractAddress": "0x13ED683DDf483d1f0bd2AE02b01D4d1D451D6c5b", }, { - "sousId": 6, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "BREW", - "address": { - "56": "0x790Be81C3cA0e53974bE2688cDb954732C9862e1", - "97": "" - }, - "decimals": 18, - "projectLink": "https://cafeswap.finance/" - }, - "contractAddress": { - "56": "0x0f819C8E6A7c0F0906CBc84b9b1e6642f9634E61", - "97": "" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.00498", - "sortOrder": 5, - "isFinished": false, - "isCLP": false + "contractAddress": "0x0f819C8E6A7c0F0906CBc84b9b1e6642f9634E61", }, { - "sousId": 7, "stakingToken": { "symbol": "TAPE", - "address": { - "56": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apetools.co/" - }, - "earningToken": { - "symbol": "TAPE", - "address": { - "56": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apetools.co/" + "address": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", }, - "contractAddress": { - "56": "0x903A20CDbAC174250eAcc7437720929f0dE97B99", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.950347", - "sortOrder": 7, - "isFinished": false, - "isCLP": false + "contractAddress": "0x903A20CDbAC174250eAcc7437720929f0dE97B99", }, { - "sousId": 8, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "Helmet", - "address": { - "56": "0x948d2a81086a075b3130bac19e4c6dee1d2e3fe8", - "97": "" - }, - "decimals": 18, - "projectLink": "https://www.helmet.insure/" - }, - "contractAddress": { - "56": "0x82cF07a989835b68260989F13Bc853f8fe48ad04", - "97": "" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.06510416", - "sortOrder": 3, - "isFinished": false, - "isCLP": false + "contractAddress": "0x82cF07a989835b68260989F13Bc853f8fe48ad04", }, { - "sousId": 9, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "earningToken": { - "symbol": "HOTCROSS", - "address": { - "56": "0x4FA7163E153419E0E1064e418dd7A99314Ed27b6", - "97": "" - }, - "decimals": 18, - "projectLink": "https://www.hotcross.com/" - }, - "contractAddress": { - "56": "0xc8De98F603af53a5D52AF6AA153d9e15b0002B2c", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.0992476", - "sortOrder": 3, - "isFinished": false, - "isCLP": false + "contractAddress": "0xc8De98F603af53a5D52AF6AA153d9e15b0002B2c", }, { - "sousId": 10, "stakingToken": { "symbol": "SMG", - "address": { - "56": "0x6bfd576220e8444ca4cc5f89efbd7f02a4c94c16", - "97": "" - }, - "decimals": 8, - "projectLink": "https://smaugs.com/" + "address": "0x6bfd576220e8444ca4cc5f89efbd7f02a4c94c16", }, - "earningToken": { - "symbol": "SMG", - "address": { - "56": "0x6bfd576220e8444ca4cc5f89efbd7f02a4c94c16", - "97": "" - }, - "decimals": 8, - "projectLink": "https://smaugs.com/" - }, - "contractAddress": { - "56": "0xf3D514263239672455306D188DD5f045E61deD03", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.138", - "sortOrder": 3, - "isFinished": true, - "isCLP": false + "contractAddress": "0xf3D514263239672455306D188DD5f045E61deD03", }, { - "sousId": 11, "stakingToken": { "symbol": "SMG", - "address": { - "56": "0x6bfd576220e8444ca4cc5f89efbd7f02a4c94c16", - "97": "" - }, - "decimals": 8, - "projectLink": "https://smaugs.com/" - }, - "earningToken": { - "symbol": "SMG", - "address": { - "56": "0x6bfd576220e8444ca4cc5f89efbd7f02a4c94c16", - "97": "" - }, - "decimals": 8, - "projectLink": "https://smaugs.com/" - }, - "contractAddress": { - "56": "0xC85C50988AEC8d260853443B345CAE63B7432b7A", - "97": "" + "address": "0x6bfd576220e8444ca4cc5f89efbd7f02a4c94c16", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.138", - "sortOrder": 3, - "isFinished": false, - "isCLP": false + "contractAddress": "0xC85C50988AEC8d260853443B345CAE63B7432b7A", }, { - "sousId": 12, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "earningToken": { - "symbol": "DUEL", - "address": { - "56": "0x297817ce1a8de777e7ddbed86c3b7f9dc9349f2c", - "97": "" - }, - "decimals": 18, - "projectLink": "https://www.duel.network/" - }, - "contractAddress": { - "56": "0xF60EDbF7D95E79878f4d448F0CA5622479eB8790", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.11574", - "sortOrder": 2, - "isFinished": false, - "isCLP": false + "contractAddress": "0xF60EDbF7D95E79878f4d448F0CA5622479eB8790", }, { - "sousId": 13, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "CAKE", - "address": { - "56": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", - "97": "0xa35062141Fa33BCA92Ce69FeD37D0E8908868AAe" - }, - "decimals": 18, - "projectLink": "https://pancakeswap.finance/" - }, - "contractAddress": { - "56": "0x99d3334CC9dF44Fb2788C2161FB296fb6Cf14a57", - "97": "" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.001", - "sortOrder": 3, - "isFinished": false, - "isCLP": false + "contractAddress": "0x99d3334CC9dF44Fb2788C2161FB296fb6Cf14a57", }, { - "sousId": 14, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "wBNB", - "address": { - "56": ADDRESSES.bsc.WBNB, - "97": "0xae13d989dac2f0debff460ac112a837c89baa7cd" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "contractAddress": { - "56": "0xD80bdF70b17bA4fDd0383171623D782D00c8be2E", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.000011574", - "sortOrder": 3, - "isFinished": false, - "isCLP": false, - "isLockPool": true + "contractAddress": "0xD80bdF70b17bA4fDd0383171623D782D00c8be2E", }, { - "sousId": 15, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "CAKE", - "address": { - "56": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", - "97": "0xa35062141Fa33BCA92Ce69FeD37D0E8908868AAe" - }, - "decimals": 18, - "projectLink": "https://pancakeswap.finance/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "contractAddress": { - "56": "0x28D0e8f18FA73824C91ca77e28727d79b815aEF1", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.0008", - "sortOrder": 3, - "isFinished": false, - "isCLP": false, - "isLockPool": true + "contractAddress": "0x28D0e8f18FA73824C91ca77e28727d79b815aEF1", }, { - "sousId": 16, "stakingToken": { "symbol": "TAPE", - "address": { - "56": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apetools.co/" - }, - "earningToken": { - "symbol": "TAPE", - "address": { - "56": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apetools.co/" + "address": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", }, - "contractAddress": { - "56": "0xa71aFD72A7ed03d2ad9D08A20cdadf17b067f33a", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.81", - "sortOrder": 6, - "isFinished": false, - "isCLP": false + "contractAddress": "0xa71aFD72A7ed03d2ad9D08A20cdadf17b067f33a", }, { - "sousId": 17, "stakingToken": { "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "TAPE", - "address": { - "56": "0xf63400ee0420ce5b1ebdee0c942d7de1c734a41f", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apetools.co/" + "address": "0xacb2d47827c9813ae26de80965845d80935afd0b", }, - "contractAddress": { - "56": "0x765c1a0b22130d0e8a61dbb125c1eec5710383f1", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.81", - "sortOrder": 3, - "isFinished": false, - "isCLP": false, - "isLockPool": true + "contractAddress": "0x765c1a0b22130d0e8a61dbb125c1eec5710383f1", }, { - "sousId": 18, "stakingToken": { "symbol": "BANANA", - "address": { - "56": "0x603c7f932ed1fc6575303d8fb018fdcbb0f39a95", - "97": "" - }, - "decimals": 18, - "projectLink": "https://apeswap.finance/" - }, - "earningToken": { - "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0x603c7f932ed1fc6575303d8fb018fdcbb0f39a95", }, - "contractAddress": { - "56": "0x4f0a992B465C1D8482b4E2a0861B6cAEE8B3171f", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "", - "sortOrder": 4, - "isFinished": false, - "isCLP": false, - "isLockPool": false, - "isBBChef": true + "contractAddress": "0x4f0a992B465C1D8482b4E2a0861B6cAEE8B3171f", }, { - "sousId": 19, "stakingToken": { "symbol": "BSW", - "address": { - "56": "0x965F527D9159dCe6288a2219DB51fc6Eef120dD1", - "97": "" - }, - "decimals": 18, - "projectLink": "https://biswap.org/" - }, - "earningToken": { - "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0x965F527D9159dCe6288a2219DB51fc6Eef120dD1", }, - "contractAddress": { - "56": "0x2a1Bf8e04633e397207d63F234d281fEf781B6F5", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "", - "sortOrder": 4, - "isFinished": false, - "isCLP": false, - "isLockPool": false, - "isBBChef": true + "contractAddress": "0x2a1Bf8e04633e397207d63F234d281fEf781B6F5", }, { - "sousId": 20, "stakingToken": { "symbol": "CAKE", - "address": { - "56": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", - "97": "0xa35062141Fa33BCA92Ce69FeD37D0E8908868AAe" - }, - "decimals": 18, - "projectLink": "https://pancakeswap.finance/" + "address": "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", }, - "earningToken": { - "symbol": "MCRN", - "address": { - "56": "0xacb2d47827c9813ae26de80965845d80935afd0b", - "97": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "contractAddress": { - "56": "0x7C454456fc9E86EA1cF1e524FF8B8EbA613189E5", - "97": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "", - "sortOrder": 1, - "isFinished": false, - "isCLP": false, - "isLockPool": false, - "isBBChef": true + "contractAddress": "0x7C454456fc9E86EA1cF1e524FF8B8EbA613189E5", } ] const choco_pools_polygon = [ { - "sousId": 0, "stakingToken": { "symbol": "MCRN", - "address": { - "137": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "80001": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "MCRN", - "address": { - "137": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "80001": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "contractAddress": { - "137": "0xC200cE4853d97e5f11320Bb8ee17F4D895f5e7BB", - "80001": "0xcE702936B63B6C9c3E059b315807BbE6212F1647" + "address": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.0085", - "sortOrder": 1, - "isFinished": false + "contractAddress": "0xC200cE4853d97e5f11320Bb8ee17F4D895f5e7BB", }, { - "sousId": 1, "stakingToken": { "symbol": "QUICK", - "address": { - "137": "0x831753dd7087cac61ab5644b308642cc1c33dc13", - "80001": "" - }, - "decimals": 18, - "projectLink": "https://quickswap.exchange/" + "address": "0x831753dd7087cac61ab5644b308642cc1c33dc13", }, - "earningToken": { - "symbol": "MCRN", - "address": { - "137": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "80001": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "contractAddress": { - "137": "0xDeC7950840a32010410dcfFDC735911151604Ba5", - "80001": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.002", - "sortOrder": 2, - "isFinished": true, + "contractAddress": "0xDeC7950840a32010410dcfFDC735911151604Ba5", "isCLP": true, - "syrupAddresses": { - "137": "0xf28164A485B0B2C90639E47b0f377b4a438a16B1", - "80001": "" - } + "syrupAddresses": "0xf28164A485B0B2C90639E47b0f377b4a438a16B1", }, { - "sousId": 2, "stakingToken": { "symbol": "QUICK", - "address": { - "137": "0x831753dd7087cac61ab5644b308642cc1c33dc13", - "80001": "" - }, - "decimals": 18, - "projectLink": "https://quickswap.exchange/" - }, - "earningToken": { - "symbol": "MCRN", - "address": { - "137": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "80001": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "contractAddress": { - "137": "0x4b68bA327Cad4d8C4d0Bc783d686d08CFAa5C5D3", - "80001": "" + "address": "0x831753dd7087cac61ab5644b308642cc1c33dc13", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.002", - "sortOrder": 3, - "isFinished": false, + "contractAddress": "0x4b68bA327Cad4d8C4d0Bc783d686d08CFAa5C5D3", "isCLP": true, - "syrupAddresses": { - "137": "0xf28164A485B0B2C90639E47b0f377b4a438a16B1", - "80001": "" - } + "syrupAddresses": "0xf28164A485B0B2C90639E47b0f377b4a438a16B1", }, { - "sousId": 3, "stakingToken": { "symbol": "MCRN", - "address": { - "137": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "80001": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", }, - "earningToken": { - "symbol": "QUICK", - "address": { - "137": "0x831753dd7087cac61ab5644b308642cc1c33dc13", - "80001": "" - }, - "decimals": 18, - "projectLink": "https://quickswap.exchange/" - }, - "contractAddress": { - "137": "0xdb5640313fc4c958D3Fb2CF546d57dF142882acf", - "80001": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.0000125", - "sortOrder": 4, - "isFinished": false, - "isCLP": false + "contractAddress": "0xdb5640313fc4c958D3Fb2CF546d57dF142882acf", }, { - "sousId": 4, "stakingToken": { "symbol": "MCRN", - "address": { - "137": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "80001": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "earningToken": { - "symbol": "QUICK", - "address": { - "137": "0x831753dd7087cac61ab5644b308642cc1c33dc13", - "80001": "" - }, - "decimals": 18, - "projectLink": "https://quickswap.exchange/" - }, - "contractAddress": { - "137": "0x337CC5daBaf1f874ACec0031d3d682CAF6DD2FC8", - "80001": "" + "address": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.0000125", - "sortOrder": 3, - "isFinished": false, - "isCLP": false, - "isLockPool": true + "contractAddress": "0x337CC5daBaf1f874ACec0031d3d682CAF6DD2FC8", }, { - "sousId": 5, "stakingToken": { "symbol": "MCRN", - "address": { - "137": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "80001": "0xfb53da50e544b06ecdc6827ab0df60a3b3801021" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" + "address": "0xba25b552c8a098afdf276324c32c71fe28e0ad40", }, - "earningToken": { - "symbol": "wMATIC", - "address": { - "137": ADDRESSES.polygon.WMATIC_2, - "80001": "" - }, - "decimals": 18, - "projectLink": "https://macaronswap.finance/" - }, - "contractAddress": { - "137": "0xA7661a7aeAF507a7782C230a45a002519cFC158C", - "80001": "" - }, - "poolCategory": "Core", - "harvest": true, - "tokenPerBlock": "0.00195216", - "sortOrder": 2, - "isFinished": false, - "isCLP": false, - "isLockPool": true + "contractAddress": "0xA7661a7aeAF507a7782C230a45a002519cFC158C", } ] - module.exports = { bsc: { masterchef: '0xFcDE390bF7a8B8614EC11fa8bde7565b3E64fe0b', token: '0xacb2d47827c9813ae26de80965845d80935afd0b'.toLowerCase(), chocochef: 'https://api.macaronswap.finance/chocofalls?chainId=56', pools: choco_pools_bsc, - masterchefPools: 'https://api.macaronswap.finance/magicboxes?chainId=56', - vaults: 'https://api.macaronswap.finance/boostpools', vaults_json: vaults_bsc, LPs: [ '0xe8D5d81dac092Ae61d097f84EFE230759BF2e522'.toLowerCase(), '0xc8f900cd8052862a8a5abf9278ad088611b2bd04'.toLowerCase(), ], - erc20s: [ - //MCRN - // "0xacb2d47827c9813ae26de80965845d80935afd0b", - //BANANA - "0x603c7f932ed1fc6575303d8fb018fdcbb0f39a95", - //CAKE - "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82", - - ], - treasury: "0x67f1D48a8991009e0b092e9C34ca16f7d6072ec1", - chainId: 56, }, polygon: { masterchef: '0xC200cE4853d97e5f11320Bb8ee17F4D895f5e7BB', token: '0xba25b552c8a098afdf276324c32c71fe28e0ad40'.toLowerCase(), - chocochef: 'https://api.macaronswap.finance/chocofalls?chainId=137', pools: choco_pools_polygon, LPs: [ '0xfc53defcF4e21B868DaCEAA6350D507493F57110'.toLowerCase(), '0xde84c8f0562eB56A5fc8f07819cEF1FAf9Df3EBc'.toLowerCase(), ], - masterchefPools: 'https://api.macaronswap.finance/magicboxes?chainId=137', - chainId: 137, } } diff --git a/projects/macaron/index.js b/projects/macaron/index.js index c1d7c566b9..58c4312444 100644 --- a/projects/macaron/index.js +++ b/projects/macaron/index.js @@ -1,52 +1,31 @@ const abi = require("./abi.json"); const config = require("./config"); -const { sumTokens, unwrapUniswapLPs, } = require("../helper/unwrapLPs"); -const sdk = require("@defillama/sdk"); - -const { getChainTransform, } = require("../helper/portedTokens"); - -module.exports = {} +const { sumTokensExport, sumTokens2, } = require("../helper/unwrapLPs"); function setChainTVL(chain) { - const { masterchef, pools, vaults_json, chainId, erc20s, LPs, token, } = config[chain] - let getTvl - - async function getAllTVL(ts, _block, chainBlocks) { - const transform = await getChainTransform(chain) - const block = chainBlocks[chain] - const balances = { - tvl: {}, - staking: {}, - pool2: {}, - } - - const lengthOfPool = ( - await sdk.api.abi.call({ - abi: abi.poolLength, - target: masterchef, - chain, block, - }) - ).output - - const lpPositionCalls = []; - - for (let index = 0; index < lengthOfPool; index++) - lpPositionCalls.push({ params: [index] }) - - const { output: mcPools } = await sdk.api.abi.multiCall({ - target: masterchef, calls: lpPositionCalls, block, chain, abi: abi.poolInfo + const { masterchef, pools, vaults_json, LPs, token, } = config[chain] + const stakingOwners = [masterchef] + const pool2Owners = [masterchef] + if (vaults_json) { + vaults_json.forEach(pool => { + const symbol = pool.stakingToken?.symbol?.toLowerCase() + const addr = pool.stakingToken.address.toLowerCase() + if (symbol === 'mcrn') + stakingOwners.push(addr) + else if (symbol.includes('mcrn') && symbol.endsWith('lp')) { + LPs.push(addr) + pool2Owners.push(pool.contractAddress.toLowerCase()) + } }) + } - const masterchefPools = [] + const blacklistedTokens = [...LPs, token] + async function tvl(api) { + const tokensAndOwners = [] - mcPools.forEach(({ output }) => { - masterchefPools.push(output) - }) + const masterchefPools = await api.fetchList({ target: masterchef, lengthAbi: abi.poolLength, itemAbi: abi.poolInfo }) - const toaTvl = [] const toaSyrup = [] - const toaPool2 = [] - const toaStaking = [] const syrupMapping = {} // handle masterchef @@ -58,12 +37,7 @@ function setChainTVL(chain) { syrupMapping[syrup] = addr return; } - if (addr === token) - toaStaking.push([addr, masterchef]) - else if (LPs.includes(addr)) - toaPool2.push([addr, masterchef]) - else - toaTvl.push([addr, masterchef]) + tokensAndOwners.push([addr, masterchef]) }) // handle chocochef and boost pools @@ -71,52 +45,27 @@ function setChainTVL(chain) { pools.push(...vaults_json) pools.forEach(pool => { - const symbol = pool.stakingToken?.symbol?.toLowerCase() - const masterchef = pool.contractAddress[chainId].toLowerCase() - const addr = pool.stakingToken.address[chainId].toLowerCase() - if (symbol === 'mcrn') - toaStaking.push([addr, masterchef]) - else if (symbol.includes('mcrn') && symbol.endsWith('lp')) - toaPool2.push([addr, masterchef]) - else - toaTvl.push([addr, masterchef]) + const masterchef = pool.contractAddress + const addr = pool.stakingToken.address + tokensAndOwners.push([addr, masterchef]) }) const balanceCalls = toaSyrup.map(([token, address]) => ({ target: token, params: [address] })) - const { output: syrupBalances } = await sdk.api.abi.multiCall({ - abi: 'erc20:balanceOf', calls: balanceCalls, block, chain - }) + const syrupBalances = await api.multiCall({ abi: 'erc20:balanceOf', calls: balanceCalls, }) - const lpPositions = [] - syrupBalances.forEach(({ input, output }) => { - lpPositions.push({ - token: syrupMapping[input.target], - balance: output - }) + syrupBalances.forEach((bal, i) => { + api.add(syrupMapping[toaSyrup[i][0]], bal) }) - await sumTokens(balances.tvl, toaTvl, block, chain, transform) - await sumTokens(balances.pool2, toaPool2, block, chain, transform) - await sumTokens(balances.staking, toaStaking, block, chain, transform) - await unwrapUniswapLPs(balances.tvl, lpPositions, block, chain, transform) - return balances - } - - function getTvlFunction(key) { - return async (ts, _block, chainBlocks) => { - if (!getTvl) getTvl = getAllTVL(ts, _block, chainBlocks) - return (await getTvl)[key] - } + return sumTokens2({ api, tokensAndOwners, blacklistedTokens, resolveLP: true }) } - const chainExports = { - tvl: getTvlFunction('tvl'), - pool2: getTvlFunction('pool2'), - staking: getTvlFunction('staking'), + module.exports[chain] = { + tvl, + pool2: sumTokensExport({ tokens: LPs, owners: pool2Owners, resolveLP: true }), + staking: sumTokensExport({ token, owners: stakingOwners, }), } - - module.exports[chain] = chainExports } Object.keys(config).forEach(setChainTVL) \ No newline at end of file diff --git a/projects/machfi/index.js b/projects/machfi/index.js new file mode 100644 index 0000000000..295f7d84d7 --- /dev/null +++ b/projects/machfi/index.js @@ -0,0 +1,5 @@ +const { compoundExports2 } = require('../helper/compound') + +module.exports = { + sonic: compoundExports2({comptroller: '0x646F91AbD5Ab94B76d1F9C5D9490A2f6DDf25730', cether: '0x9F5d9f2FDDA7494aA58c90165cF8E6B070Fe92e6'}), +} diff --git a/projects/magma/index.js b/projects/magma/index.js index 944f4132a0..1d1b5cbf0d 100644 --- a/projects/magma/index.js +++ b/projects/magma/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { getLiquityTvl } = require('../helper/liquity') // const { staking } = require('../helper/staking') const sdk = require('@defillama/sdk') @@ -6,7 +7,9 @@ module.exports = { iotex: { tvl: sdk.util.sumChainTvls([ getLiquityTvl('0x21d81DABF6985587CE64C2E8EB12F69DF2178fe2'), - getLiquityTvl('0xAeB0B38040aDdc4a2b520919f13944D9bC944435') + getLiquityTvl('0xAeB0B38040aDdc4a2b520919f13944D9bC944435'), + getLiquityTvl('0x4315BcE6076953571caf1903d15D682727FBD935'), + getLiquityTvl('0xFF5F4bA96586EDae7E7D838D8770dFB3376Ec245', { nonNativeCollateralToken: true, collateralToken: ADDRESSES.bob.uniBTC }) ]), // staking: staking('0x037a2e9a464fbA409D0E55600836864B410d6Dd8', '0x6C0bf4b53696b5434A0D21C7D13Aa3cbF754913E'), // disabled as backing of WEN is already counted towards tvl }, diff --git a/projects/mahaxyz/index.js b/projects/mahaxyz/index.js index 7bb6e8ba04..ce02152c27 100644 --- a/projects/mahaxyz/index.js +++ b/projects/mahaxyz/index.js @@ -1,40 +1,77 @@ -const ADDRESSES = require('../helper/coreAssets.json'); -const { sumTokensExport } = require('../helper/unwrapLPs.js'); +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokensExport } = require("../helper/unwrapLPs.js"); +const { staking } = require("../helper/staking"); const eth = { // tokens dai: ADDRESSES.ethereum.DAI, maha: "0x745407c86df8db893011912d3ab28e68b62e49b0", usdc: ADDRESSES.ethereum.USDC, + susde: ADDRESSES.ethereum.sUSDe, usdt: ADDRESSES.ethereum.USDT, weth: ADDRESSES.ethereum.WETH, - zai: "0x69000405f9dce69bd4cbf4f2865b79144a69bfe0", + zai: "0x69000dFD5025E82f48Eb28325A2B88a241182CEd", + szai: "0x69000195D5e3201Cf73C9Ae4a1559244DF38D47C", // peg stability modules - psmUSDC: '0x69000052a82e218ccb61fe6e9d7e3f87b9c5916f', + psmUSDC: "0x69000052a82e218ccb61fe6e9d7e3f87b9c5916f", + psmsUSDe: "0x7DCdE153e4cACe9Ca852590d9654c7694388Db54", // pools - zaiUsdcCurve: "0x6ee1955afb64146b126162b4ff018db1eb8f08c3", - zaiMahaCurve: "0x0086ef314a313018c70a2cd92504c7d1038a25aa", + zaiUsdcCurve: "0x4a0c954d0f19269f4fc5c217821c6150a8870ad4", + zaiMahaCurve: "0x7d2dffa9e903b8377c96196da424c7965b06bcc3", + zaiSzaiCurve: "0x53ad9268a66cef20a4c458d759eee5aa55be1140", // pool staking contracts - zaiMahaCurveStaking: "0x237efe587f2cb44597063dc8403a4892a60a5a4f", - zaiUsdcCurveStaking: "0x154F52B347D8E48b8DbD8D8325Fe5bb45AAdCCDa", + zaiMahaCurveStaking: "0xE2EbBf803d0199A5A26108bA36FBAc366b201Be1", + zaiUsdcCurveStaking: "0xdFB06C4c562Bcc810C112FBAC99c59C2856b86D1", + zaiSzaiCurveStaking: "0xfDAeB792FF19e7bd4f7ED5d6ce2ef7925d002A19", +}; + +const base = { + usdc: ADDRESSES.base.USDC, + maha: "0x554bba833518793056CF105E66aBEA330672c0dE", + mahax: "0x7DF7505aa7cfAb3AC1A8D1EC225f2fafe5f04c74", + zai: "0x69000dFD5025E82f48Eb28325A2B88a241182CEd", + szai: "0x69000195D5e3201Cf73C9Ae4a1559244DF38D47C", + + // pools + zaiUsdcAerodrome: "0x93EdC603D7A2eA03518Ac55219cAD320010a58e4", + zaiMahaAerodrome: "0x96A0EC12A9F3bEabFf9Bb59c3F33EE439dAF2a85", + zaiMahaV3Aerodrome: "0xebF0D2faC88448874947550FA9B2A75f22FF571F", + + // staking contracts + zaiUsdcStaking: "0xD87ECeF739161be77bbe9891dBA80F14275BBE34", + zaiMahaStaking: "0xe77b404e934c1d97f179061349F459847f70Cd8C", + + gnosis: "0x7202136d70026DA33628dD3f3eFccb43F62a2469", }; Object.keys(eth).forEach((k) => (eth[k] = eth[k].toLowerCase())); -const collaterals = [eth.usdc, eth.usdt, eth.dai]; -const pegStabilityModules = [eth.psmUSDC] +const collaterals = [eth.usdc, eth.susde]; +const pegStabilityModules = [eth.psmsUSDe]; module.exports = { ethereum: { pool2: sumTokensExport({ tokensAndOwners: [ [eth.zaiMahaCurve, eth.zaiMahaCurveStaking], - [eth.zaiUsdcCurve, eth.zaiUsdcCurveStaking] - ] + [eth.zaiUsdcCurve, eth.zaiUsdcCurveStaking], + [eth.zaiSzaiCurve, eth.zaiSzaiCurveStaking], + ], + resolveLP: true, }), tvl: sumTokensExport({ owners: pegStabilityModules, tokens: collaterals }), - } + }, + base: { + pool2: sumTokensExport({ + tokensAndOwners: [ + [base.zaiMahaAerodrome, base.zaiMahaStaking], + [base.zaiUsdcAerodrome, base.zaiUsdcStaking], + ], + resolveLP: true, + }), + staking: staking(base.mahax, base.maha), + }, }; diff --git a/projects/maia-dao/api.js b/projects/maia-dao/api.js index 55e19de8f5..64f900102d 100644 --- a/projects/maia-dao/api.js +++ b/projects/maia-dao/api.js @@ -2,7 +2,10 @@ const { staking } = require('../helper/staking') module.exports = { metis: { - tvl: () => 0, - staking: staking('0xD7a586CE5250bEfaB2cc2239F7226B9602536E6A', '0x72c232D56542Ba082592DEE7C77b1C6CFA758BCD') - } + tvl: () => ({}), + staking: () => ({}), + }, + arbitrum: { + staking: staking('0x000000f0C01c6200354f240000b7003668B4D080', '0x00000000ea00F3F4000e7Ed5Ed91965b19f1009B'), // v2 + }, } \ No newline at end of file diff --git a/projects/maia-dao/index.js b/projects/maia-dao/index.js index 7b1ebdd7e6..0f1290838c 100644 --- a/projects/maia-dao/index.js +++ b/projects/maia-dao/index.js @@ -1,96 +1,30 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { getChainTransform } = require('../helper/portedTokens'); -const { unwrapUniswapLPs, sumTokens2, } = require('../helper/unwrapLPs'); +const { sumTokens2, } = require('../helper/unwrapLPs'); const abis = require("./abis.json"); const HERMES = '0xb27bbeaaca2c00d6258c3118bab6b5b6975161c8'; -const excludedTokens = ["0xa3e8e7eb4649ffc6f3cbe42b4c2ecf6625d3e802"]; +const blacklistedTokens = ["0xa3e8e7eb4649ffc6f3cbe42b4c2ecf6625d3e802"]; const multisig = '0x77314eAA8D99C2Ad55f3ca6dF4300CFC50BdBC7F'; const tokens = [ADDRESSES.metis.WETH, ADDRESSES.metis.Metis, ADDRESSES.metis.m_USDC, ADDRESSES.metis.m_USDT, ADDRESSES.metis.DAI, '0xEfFEC28996aAff6D55B6D108a46446d45C3a2E71', '0x5ab390084812E145b619ECAA8671d39174a1a6d1',]; -async function tvl(timestamp, _, { metis: block }) { - const chain = 'metis' - const balances = {}; - const transform = await getChainTransform(chain); +async function tvl(api) { - const hermesBalance = (await sdk.api.abi.call({ + const hermesBalance = await api.call({ target: '0xa4C546c8F3ca15aa537D2ac3f62EE808d915B65b', abi: abis.locked, params: [2], - block, - chain: 'metis' - })).output; - - balances[`metis:${HERMES}`] = BigInt(hermesBalance.amount - 8424424910000000000000000).toString() - - const noPairs = (await sdk.api.abi.call({ - target: '0x879828da3a678D349A3C8d6B3D9C78e9Ee31137F', - abi: abis.length, - block, - chain: 'metis' - })).output; - - const pairAddresses = (await sdk.api.abi.multiCall({ - target: '0x879828da3a678D349A3C8d6B3D9C78e9Ee31137F', - calls: Array.from({ length: Number(noPairs) }, (_, k) => ({ - params: k, - })), - abi: abis.pools, - block, - chain: 'metis' - })).output; - - let gauges = (await sdk.api.abi.multiCall({ - target: '0x879828da3a678D349A3C8d6B3D9C78e9Ee31137F', - calls: pairAddresses.map(a => ({ - params: a.output - })), - abi: abis.gauges, - block, - chain: 'metis' - })).output; - - let pairBalances = [] - - for (let i = 0; i < Number(noPairs); i++) { - pairBalances.push( - await sdk.api.abi.call({ - target: gauges[i].output, - abi: abis.balanceOf, - params: [multisig], - block: block, - chain: "metis", - }) - ); - } - - let lpPositions = []; - for (let i = 0; i < pairBalances.length; i++) { - if ( - pairAddresses[i].output && - excludedTokens.includes(pairAddresses[i].output.toLowerCase()) - ) { - continue; - } - lpPositions.push({ - balance: pairBalances[i].output, - token: pairAddresses[i].output - }); - } - - await unwrapUniswapLPs( - balances, - lpPositions, - block, - 'metis', - transform - ); - return sumTokens2({ balances, owner: multisig, tokens, chain, block, resolveLP: 'true', }) + }) + api.add(HERMES, hermesBalance.amount - 8424424910000000000000000) + const pairs = await api.fetchList({ lengthAbi: abis.length, itemAbi: abis.pools, target: '0x879828da3a678D349A3C8d6B3D9C78e9Ee31137F' }) + + const gauges = await api.multiCall({ abi: abis.gauges, calls: pairs, target: '0x879828da3a678D349A3C8d6B3D9C78e9Ee31137F'}) + const bals = await api.multiCall({ abi: 'erc20:balanceOf', calls: gauges.map(gauge => ({ target: gauge, params: [multisig] }))}) + api.add(pairs, bals) + return sumTokens2({ owner: multisig, tokens, api, resolveLP: 'true', blacklistedTokens, }) } module.exports = { metis: { - tvl, + tvl: () => ({}), } } diff --git a/projects/maker-rwa/index.js b/projects/maker-rwa/index.js index d25b128706..33a025a5e0 100644 --- a/projects/maker-rwa/index.js +++ b/projects/maker-rwa/index.js @@ -1,185 +1,79 @@ const ADDRESSES = require('../helper/coreAssets.json') -// const utils = require('web3-utils'); -const sdk = require('@defillama/sdk'); -const MakerSCDConstants = require("../maker/abis/makerdao.js"); -const MakerMCDConstants = require("../maker/abis/maker-mcd.js"); -const { sumTokens2 } = require('../helper/unwrapLPs') -const { getLogs } = require('../helper/cache/getLogs') +const { getLogs2 } = require('../helper/cache/getLogs') -async function getJoins(block, api) { - // let rely = utils.sha3("rely(address)").substr(0, 10); - // let relyTopic = utils.padRight(rely, 64); - let relyTopic = '0x65fae35e00000000000000000000000000000000000000000000000000000000' +const MCD_VAT = '0x35d1b3f3d7966a1dfe207aa4514c12a259a0492b' +const VAT_topic = '0x65fae35e00000000000000000000000000000000000000000000000000000000' +const START_VAT_BLOCK = 8928152 - let joins = []; - let failed = []; - const failedSet = new Set(failedJoins) +const MCD_DOG = '0x135954d155898d42c90d2a57824c690e0c7bef1b' +const DOG_topic = '0x4ff2caaa972a7c6629ea01fae9c93d73cc307d13ea4c369f9bbbb7f9b7e9461d' +const START_DOG_BLOCK = 12317310 - // get list of auths - const auths = ( - await getLogs({ - api, - target: MakerMCDConstants.VAT, - fromBlock: MakerMCDConstants.STARTBLOCK, - topics: [relyTopic], - }) - ).map(i => `0x${i.topics[1].substr(26)}`).filter(i => !failedSet.has(i)) - - const ilks = await api.multiCall({ - abi: MakerMCDConstants.ilk, - calls: auths, - permitFailure: true, - }); +const abi = { + ilk: 'function ilk() view returns (bytes32)', + ilks: 'function ilks (bytes32) view returns (uint256 art, uint256 rate, uint256 spot, uint256 line,uint256 dust)', + gem: "address:gem", + dog: "address:dog", +} - ilks.forEach((_, i) => { - const token = auths[i].toLowerCase() - if (_) joins.push(token) - else failed.push(token) +const getJoins = async (api) => { + const logs = (await getLogs2({ api, target: MCD_VAT, fromBlock: START_VAT_BLOCK, topics: [VAT_topic] })).map(log => { + return '0x' + log.topics[1].slice(-40); }) - if (failed.length) sdk.log('failed', failed) - - return joins; + const ilks = await api.multiCall({ abi: abi.ilk, calls: logs, permitFailure: true }) + + return logs.map((auth, i) => { + const ilk = ilks[i]; + if (!ilk) return null + return auth.toLowerCase(); + }).filter(Boolean); } -async function tvl(api) { - const block = api.block - let toa = [] - - const blacklistedJoins = [ - '0x7b3799b30f268ba55f926d7f714a3001af89d359', - '0x41ca7a7aa2be78cf7cb80c0f4a9bdfbc96e81815', - ] - if (block > MakerMCDConstants.STARTBLOCK) { - let joins = await getJoins(block, api); - const dogSet = new Set(dogs) - joins = joins.filter(i => !blacklistedJoins.includes(i) && !dogSet.has(i)) - - const { output: gems } = await sdk.api.abi.multiCall({ - abi: MakerMCDConstants.gem, - block, calls: joins.map(i => ({ target: i })), - permitFailure: true, - }) - const dogCalls = dogs.map(i => ({ target: i })) - - gems.forEach(({ success, output, input: { target } }) => { - target = target.toLowerCase() - if (!success) { - dogCalls.push({ target }) - return; - } - - toa.push([output, target]) - }) - - const { output: dogRes } = await sdk.api.abi.multiCall({ - abi: MakerMCDConstants.dog, - calls: dogCalls, block, - permitFailure: true, - }) - - const failedCalls = dogRes.filter(i => !i.success) - if (failedCalls.length) { - failedCalls.forEach(i => sdk.log('Failed both gem and dog calls', i.input.target)) - throw new Error('Failed both gem and dog calls') - } - } +const getDogs = async (api) => { + const logs = (await getLogs2({ api, target: MCD_DOG, fromBlock: START_DOG_BLOCK, topics: [DOG_topic], })).map(log => { + return '0x' + log.data.slice(-40); + }) - toa = toa.filter(i => i[0].toLowerCase() !== ADDRESSES.ethereum.SAI.toLowerCase()) - const symbols = await api.multiCall({ abi: 'erc20:symbol', calls: toa.map(t => t[0]) }) + const dogs = await api.multiCall({ abi: abi.dog, calls: logs, permitFailure: true }) + + return logs.map((auth, i) => { + const dog = dogs[i]; + if (!dog) return null + return auth.toLowerCase(); + }).filter(Boolean); +} - const owners = [] - toa.map((_, i) => { - if (!symbols[i].startsWith('RWA')) return; - owners.push(toa[i][1]) - }) - const ilks = await api.multiCall({ abi: 'function ilk() view returns (bytes32)', calls: owners }) - const res = await api.multiCall({ abi: 'function ilks (bytes32) view returns (uint256 art, uint256 rate, uint256 spot, uint256 line,uint256 dust)', calls:ilks, target:'0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B' }) +const tvl = async (api) => { + const [joins/*, dogs*/] = await Promise.all([ + getJoins(api), + // getDogs(api) + ]) + + const tokens = await api.multiCall({ abi: abi.gem, calls: joins, permitFailure: true }) + + let toas = joins.map((join, i) => { + const token = tokens[i]; + if (!token) return null + return [token, join] + }).filter(Boolean) + + toas = toas.filter(i => i[0].toLowerCase() !== ADDRESSES.ethereum.SAI.toLowerCase()) + const symbols = await api.multiCall({ abi: 'erc20:symbol', calls: toas.map(t => t[0]) }) + const owners = toas.map((toa, i) => { + if (!symbols[i].startsWith('RWA')) return null + return toa[1] + }).filter(Boolean) + + const ilks = await api.multiCall({ abi: abi.ilk, calls: owners }) + const res = await api.multiCall({ abi: abi.ilks, calls: ilks, target:'0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B' }) res.forEach(i => api.add(ADDRESSES.ethereum.DAI, i.art)) - - return api.getBalances() } module.exports = { - methodology: `Counts all the tokens being used as collateral of CDPs. - - On the technical level, we get all the collateral tokens by fetching events, get the amounts locked by calling balanceOf() directly, unwrap any uniswap LP tokens and then get the price of each token from coingecko`, - start: 1513566671, // 12/18/2017 @ 12:00am (UTC) + methodology: `Counts all the tokens being used as collateral of CDPs. On the technical level, we get all the collateral tokens by fetching events, get the amounts locked by calling balanceOf() directly, unwrap any uniswap LP tokens and then get the price of each token from coingecko`, + start: '2017-12-18', // 12/18/2017 @ 12:00am (UTC) ethereum: { tvl }, }; - -const dogs = [ - '0x832dd5f17b30078a5e46fdb8130a68cbc4a74dc0', - '0x9dacc11dcd0aa13386d295eaeebbd38130897e6f', - '0xc67963a226eddd77b91ad8c421630a1b0adff270', - '0x71eb894330e8a4b96b8d6056962e7f116f50e06f', - '0xc2b12567523e3f3cbd9931492b91fe65b240bc47', - '0x0227b54adbfaeec5f1ed1dfa11f54dcff9076e2c', - '0x3d22e6f643e2f4c563fd9db22b229cbb0cd570fb', - '0xdc90d461e148552387f3ab3ebee0bdc58aa16375', - '0x006aa3eb5e666d8e006aa647d4afab212555ddea', - '0xf5c8176e1eb0915359e46ded16e52c071bb435c0', - '0x2bb690931407dca7ece84753ea931ffd304f0f38', - '0x81c5cdf4817dbf75c7f08b8a1cdab05c9b3f70f7', - '0x6aac067bb903e633a422de7be9355e62b3ce0378', - '0x3713f83ee6d138ce191294c131148176015bc29a', - '0x834719bea8da68c46484e001143bdde29370a6a3', - '0x8723b74f598de2ea49747de5896f9034cc09349e', - '0x9f6981ba5c77211a34b76c6385c0f6fa10414035', - '0x93ae03815baf1f19d7f18d9116e4b637cc32a131', - '0x2ac4c9b49051275acb4c43ec973082388d015d48', - '0x4fc53a57262b87abda61d6d0db2be7e9be68f6b8', - '0xb15afab996904170f87a64fe42db0b64a6f75d24', - '0x6aa0520354d1b84e1c6abfe64a708939529b619e', - '0xb0ece6f5542a4577e2f1be491a937ccbbec8479e', - '0x854b252ba15eafa4d1609d3b98e00cc10084ec55', - '0xe4b82be84391b9e7c56a1fc821f47569b364dd4a', - '0x046b1a5718da6a226d912cfd306ba19980772908', - '0x5590f23358fe17361d7e4e4f91219145d8ccfcb3', - '0x0f6f88f8a4b918584e3539182793a0c276097f44', - '0xfc9d6dd08bee324a5a8b557d2854b9c36c2aec5d', - '0xbcb396cd139d1116bd89562b49b9d1d6c25378b0', - '0xa47d68b9db0a0361284fa04ba40623fcbd1a263e', - '0x66609b4799fd7ce12ba799ad01094abd13d5014d', - '0x9b3310708af333f6f379fa42a5d09cbaa10ab309', - '0x5322a3551bc6a1b39d5d142e5e38dc5b4bc5b3d2', - '0x29342f530ed6120bdb219d602dafd584676293d1', - '0x5048c5cd3102026472f8914557a1fd35c8dc6c9e', - '0x49a33a28c4c7d9576ab28898f4c9ac7e52ea457a', - '0xa93b98e57dde14a3e301f20933d59dc19bf8212e', - '0xe30663c6f83a06edee6273d72274ae24f1084a22', - '0x39f29773dcb94a32529d0612c6706c49622161d1', - '0xf93cc3a50f450ed245e003bfecc8a6ec1732b0b2', - '0xb55da3d3100c4ebf9de755b6ddc24bf209f6cc06', - '0x1926862f899410bfc19fefb8a3c69c7aed22463a', - '0x3ea60191b7d5990a3544b6ef79983fd67e85494a', - '0x27ca5e525ea473ed52ea9423cd08ccc081d96a98', - '0xd9e758bd239e5d568f44d0a748633f6a8d52cbbb', -] - -const failedJoins = [ - '0xbaa65281c2fa2baacb2cb550ba051525a480d3f4', - '0x65c79fcb50ca1594b025960e539ed7a9a6d434a3', - '0x19c0976f590d67707e62397c87829d896dc0f1f1', - '0x197e90f9fad81970ba7976f33cbd77088e5d7cf7', - '0x78f2c2af65126834c51822f56be0d7469d7a523e', - '0xab14d3ce3f733cacb76ec2abe7d2fcb00c99f3d5', - '0xbe8e3e3618f7474f8cb1d074a26affef007e98fb', - '0x4d95a049d5b0b7d32058cd3f2163015747522e99', - '0xa41b6ef151e06da0e34b009b86e828308986736d', - '0xa5679c04fc3d9d8b0aab1f0ab83555b301ca70ea', - '0xc7bdd1f2b16447dcf3de045c4a039a60ec2f0ba3', - '0x88f88bb9e66241b73b84f3a6e197fbba487b1e30', - '0xbb856d1742fd182a90239d7ae85706c2fe4e5922', - '0x29cfbd381043d00a98fd9904a431015fef07af2f', - '0x135954d155898d42c90d2a57824c690e0c7bef1b', - '0x1eb4cf3a948e7d72a198fe073ccb8c7a948cd853', - '0x2cc583c0aacdac9e23cb601fda8f1a0c56cdcb71', - '0x09e05ff6142f2f9de8b6b65855a1d56b6cfe4c58', - '0xa4c22f0e25c6630b2017979acf1f865e94695c4b', - '0x0e2e8f1d1326a4b9633d96222ce399c708b19c28', - '0x60744434d6339a6b27d73d9eda62b6f66a0a04fa', - '0x12f36cdea3a28c35ac8c6cc71d9265c17c74a27f', -] diff --git a/projects/maker/index.js b/projects/maker/index.js index 3775e50cd2..c78a981db2 100644 --- a/projects/maker/index.js +++ b/projects/maker/index.js @@ -1,103 +1,73 @@ const ADDRESSES = require('../helper/coreAssets.json') -// const utils = require('web3-utils'); -const sdk = require('@defillama/sdk'); -const MakerSCDConstants = require("./abis/makerdao.js"); -const MakerMCDConstants = require("./abis/maker-mcd.js"); +const { getLogs2 } = require('../helper/cache/getLogs') const { sumTokens2 } = require('../helper/unwrapLPs') -const { getLogs } = require('../helper/cache/getLogs') -async function getJoins(block, api) { - // let rely = utils.sha3("rely(address)").substr(0, 10); - // let relyTopic = utils.padRight(rely, 64); - let relyTopic = '0x65fae35e00000000000000000000000000000000000000000000000000000000' +const MCD_VAT = '0x35d1b3f3d7966a1dfe207aa4514c12a259a0492b' +const VAT_topic = '0x65fae35e00000000000000000000000000000000000000000000000000000000' +const START_VAT_BLOCK = 8928152 - let joins = []; - let failed = []; - const failedSet = new Set(failedJoins) +const MCD_DOG = '0x135954d155898d42c90d2a57824c690e0c7bef1b' +const DOG_topic = '0x4ff2caaa972a7c6629ea01fae9c93d73cc307d13ea4c369f9bbbb7f9b7e9461d' +const START_DOG_BLOCK = 12317310 - // get list of auths - const auths = ( - await getLogs({ - api, - target: MakerMCDConstants.VAT, - fromBlock: MakerMCDConstants.STARTBLOCK, - topics: [relyTopic], - }) - ).map(i => `0x${i.topics[1].substr(26)}`).filter(i => !failedSet.has(i)) - - const ilks = await api.multiCall({ - abi: MakerMCDConstants.ilk, - calls: auths, - permitFailure: true, - }); +const abi = { + ilk: "function ilk() view returns (bytes32)", + gem: "address:gem", + Pie: "uint256:Pie", + dog: "address:dog", +} - ilks.forEach((_, i) => { - const token = auths[i].toLowerCase() - if (_) joins.push(token) - else failed.push(token) +const getJoins = async (api) => { + const logs = (await getLogs2({ api, target: MCD_VAT, fromBlock: START_VAT_BLOCK, topics: [VAT_topic] })).map(log => { + return '0x' + log.topics[1].slice(-40); }) - if (failed.length) sdk.log('failed', failed) - - return joins; + const ilks = await api.multiCall({ abi: abi.ilk, calls: logs, permitFailure: true }) + + return logs.map((auth, i) => { + const ilk = ilks[i]; + if (!ilk) return null + return auth.toLowerCase(); + }).filter(Boolean); } -async function tvl(api) { - const block = api.block - let toa = [ - [MakerSCDConstants.WETH_ADDRESS, MakerSCDConstants.TUB_ADDRESS,], - ] - - const blacklistedJoins = [ - '0x7b3799b30f268ba55f926d7f714a3001af89d359', - '0x41ca7a7aa2be78cf7cb80c0f4a9bdfbc96e81815', - ] - if (block > MakerMCDConstants.STARTBLOCK) { - let joins = await getJoins(block, api); - const dogSet = new Set(dogs) - joins = joins.filter(i => !blacklistedJoins.includes(i) && !dogSet.has(i)) - - const { output: gems } = await sdk.api.abi.multiCall({ - abi: MakerMCDConstants.gem, - block, calls: joins.map(i => ({ target: i })), - permitFailure: true, - }) - const dogCalls = dogs.map(i => ({ target: i })) - - gems.forEach(({ success, output, input: { target } }) => { - target = target.toLowerCase() - if (!success) { - dogCalls.push({ target }) - return; - } +const getDogs = async (api) => { + const logs = (await getLogs2({ api, target: MCD_DOG, fromBlock: START_DOG_BLOCK, topics: [DOG_topic], skipCache: true, skipCacheRead: true })).map(log => { + return '0x' + log.data.slice(-40); + }) - toa.push([output, target]) - }) + const dogs = await api.multiCall({ abi: abi.dog, calls: logs, permitFailure: true }) + + return logs.map((auth, i) => { + const dog = dogs[i]; + if (!dog) return null + return auth.toLowerCase(); + }).filter(Boolean); +} - const { output: dogRes } = await sdk.api.abi.multiCall({ - abi: MakerMCDConstants.dog, - calls: dogCalls, block, - permitFailure: true, - }) +const tvl = async (api) => { + const [joins/*, dogs*/] = await Promise.all([ + getJoins(api), + // getDogs(api) + ]) - const failedCalls = dogRes.filter(i => !i.success) - if (failedCalls.length) { - failedCalls.forEach(i => sdk.log('Failed both gem and dog calls', i.input.target)) - throw new Error('Failed both gem and dog calls') - } - } + const tokens = await api.multiCall({ abi: abi.gem, calls: joins, permitFailure: true }) - toa = toa.filter(i => i[0].toLowerCase() !== ADDRESSES.ethereum.SAI.toLowerCase()) - const symbols = await api.multiCall({ abi: 'erc20:symbol', calls: toa.map(t => t[0]) }) - const gUNIToa = toa.filter((_, i) => symbols[i] === 'G-UNI') - toa = toa.filter((_, i) => symbols[i] !== 'G-UNI' && !symbols[i].startsWith('RWA')) + let toas = joins.map((join, i) => { + const token = tokens[i]; + if (!token) return null + return [token, join] + }).filter(Boolean) - const balances = await sumTokens2({ api, tokensAndOwners: toa, resolveLP: true, }) - await unwrapGunis({ api, toa: gUNIToa, balances, }) - return balances + toas = toas.filter(i => i[0].toLowerCase() !== ADDRESSES.ethereum.SAI.toLowerCase()) + const symbols = await api.multiCall({ abi: 'erc20:symbol', calls: toas.map(([token]) => token) }) + const gUNIToa = toas.filter((_, i) => symbols[i] === 'G-UNI') + toas = toas.filter((_, i) => symbols[i] !== 'G-UNI' && !symbols[i].startsWith('RWA')) + await unwrapGunis({ api, toa: gUNIToa, }) + return sumTokens2({ api, tokensAndOwners: toas, resolveLP: true}) } -async function unwrapGunis({ api, toa, balances = {} }) { +async function unwrapGunis({ api, toa, }) { const lps = toa.map(i => i[0]) const balanceOfCalls = toa.map(t => ({ params: t[1], target: t[0] })) const [ @@ -114,93 +84,17 @@ async function unwrapGunis({ api, toa, balances = {} }) { const ratio = bal / supplies[i] const token0Bal = uBalances[i][0] * ratio const token1Bal = uBalances[i][1] * ratio - sdk.util.sumSingleBalance(balances, token0s[i], token0Bal) - sdk.util.sumSingleBalance(balances, token1s[i], token1Bal) + api.add(token0s[i], token0Bal) + api.add(token1s[i], token1Bal) }) - sdk.util.removeTokenBalance(balances, ADDRESSES.ethereum.DAI) // remove dai balances - return balances + api.removeTokenBalance(ADDRESSES.ethereum.DAI) // remove dai balances } + module.exports = { - methodology: `Counts all the tokens being used as collateral of CDPs. - - On the technical level, we get all the collateral tokens by fetching events, get the amounts locked by calling balanceOf() directly, unwrap any uniswap LP tokens and then get the price of each token from coingecko`, - start: 1513566671, // 12/18/2017 @ 12:00am (UTC) + methodology: `Counts all the tokens being used as collateral of CDPs. On the technical level, we get all the collateral tokens by fetching events, get the amounts locked by calling balanceOf() directly, unwrap any uniswap LP tokens and then get the price of each token from coingecko`, + start: '2017-12-18', // 12/18/2017 @ 12:00am (UTC) ethereum: { tvl }, -}; - -const dogs = [ - '0x832dd5f17b30078a5e46fdb8130a68cbc4a74dc0', - '0x9dacc11dcd0aa13386d295eaeebbd38130897e6f', - '0xc67963a226eddd77b91ad8c421630a1b0adff270', - '0x71eb894330e8a4b96b8d6056962e7f116f50e06f', - '0xc2b12567523e3f3cbd9931492b91fe65b240bc47', - '0x0227b54adbfaeec5f1ed1dfa11f54dcff9076e2c', - '0x3d22e6f643e2f4c563fd9db22b229cbb0cd570fb', - '0xdc90d461e148552387f3ab3ebee0bdc58aa16375', - '0x006aa3eb5e666d8e006aa647d4afab212555ddea', - '0xf5c8176e1eb0915359e46ded16e52c071bb435c0', - '0x2bb690931407dca7ece84753ea931ffd304f0f38', - '0x81c5cdf4817dbf75c7f08b8a1cdab05c9b3f70f7', - '0x6aac067bb903e633a422de7be9355e62b3ce0378', - '0x3713f83ee6d138ce191294c131148176015bc29a', - '0x834719bea8da68c46484e001143bdde29370a6a3', - '0x8723b74f598de2ea49747de5896f9034cc09349e', - '0x9f6981ba5c77211a34b76c6385c0f6fa10414035', - '0x93ae03815baf1f19d7f18d9116e4b637cc32a131', - '0x2ac4c9b49051275acb4c43ec973082388d015d48', - '0x4fc53a57262b87abda61d6d0db2be7e9be68f6b8', - '0xb15afab996904170f87a64fe42db0b64a6f75d24', - '0x6aa0520354d1b84e1c6abfe64a708939529b619e', - '0xb0ece6f5542a4577e2f1be491a937ccbbec8479e', - '0x854b252ba15eafa4d1609d3b98e00cc10084ec55', - '0xe4b82be84391b9e7c56a1fc821f47569b364dd4a', - '0x046b1a5718da6a226d912cfd306ba19980772908', - '0x5590f23358fe17361d7e4e4f91219145d8ccfcb3', - '0x0f6f88f8a4b918584e3539182793a0c276097f44', - '0xfc9d6dd08bee324a5a8b557d2854b9c36c2aec5d', - '0xbcb396cd139d1116bd89562b49b9d1d6c25378b0', - '0xa47d68b9db0a0361284fa04ba40623fcbd1a263e', - '0x66609b4799fd7ce12ba799ad01094abd13d5014d', - '0x9b3310708af333f6f379fa42a5d09cbaa10ab309', - '0x5322a3551bc6a1b39d5d142e5e38dc5b4bc5b3d2', - '0x29342f530ed6120bdb219d602dafd584676293d1', - '0x5048c5cd3102026472f8914557a1fd35c8dc6c9e', - '0x49a33a28c4c7d9576ab28898f4c9ac7e52ea457a', - '0xa93b98e57dde14a3e301f20933d59dc19bf8212e', - '0xe30663c6f83a06edee6273d72274ae24f1084a22', - '0x39f29773dcb94a32529d0612c6706c49622161d1', - '0xf93cc3a50f450ed245e003bfecc8a6ec1732b0b2', - '0xb55da3d3100c4ebf9de755b6ddc24bf209f6cc06', - '0x1926862f899410bfc19fefb8a3c69c7aed22463a', - '0x3ea60191b7d5990a3544b6ef79983fd67e85494a', - '0x27ca5e525ea473ed52ea9423cd08ccc081d96a98', - '0xd9e758bd239e5d568f44d0a748633f6a8d52cbbb', -] - -const failedJoins = [ - '0xbaa65281c2fa2baacb2cb550ba051525a480d3f4', - '0x65c79fcb50ca1594b025960e539ed7a9a6d434a3', - '0x19c0976f590d67707e62397c87829d896dc0f1f1', - '0x197e90f9fad81970ba7976f33cbd77088e5d7cf7', - '0x78f2c2af65126834c51822f56be0d7469d7a523e', - '0xab14d3ce3f733cacb76ec2abe7d2fcb00c99f3d5', - '0xbe8e3e3618f7474f8cb1d074a26affef007e98fb', - '0x4d95a049d5b0b7d32058cd3f2163015747522e99', - '0xa41b6ef151e06da0e34b009b86e828308986736d', - '0xa5679c04fc3d9d8b0aab1f0ab83555b301ca70ea', - '0xc7bdd1f2b16447dcf3de045c4a039a60ec2f0ba3', - '0x88f88bb9e66241b73b84f3a6e197fbba487b1e30', - '0xbb856d1742fd182a90239d7ae85706c2fe4e5922', - '0x29cfbd381043d00a98fd9904a431015fef07af2f', - '0x135954d155898d42c90d2a57824c690e0c7bef1b', - '0x1eb4cf3a948e7d72a198fe073ccb8c7a948cd853', - '0x2cc583c0aacdac9e23cb601fda8f1a0c56cdcb71', - '0x09e05ff6142f2f9de8b6b65855a1d56b6cfe4c58', - '0xa4c22f0e25c6630b2017979acf1f865e94695c4b', - '0x0e2e8f1d1326a4b9633d96222ce399c708b19c28', - '0x60744434d6339a6b27d73d9eda62b6f66a0a04fa', - '0x12f36cdea3a28c35ac8c6cc71d9265c17c74a27f', -] +}; \ No newline at end of file diff --git a/projects/makiswap/abi.json b/projects/makiswap/abi.json deleted file mode 100644 index f73548ff07..0000000000 --- a/projects/makiswap/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "totalPairs": "uint256:totalPairs", - "allPairs": "function allPairs(uint256) view returns (address)" -} \ No newline at end of file diff --git a/projects/makiswap/index.js b/projects/makiswap/index.js index 1092095a4e..dbc74e4106 100644 --- a/projects/makiswap/index.js +++ b/projects/makiswap/index.js @@ -1,107 +1,14 @@ -const sdk = require("@defillama/sdk"); -const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); - -const abi = require("./abi.json"); +const { staking } = require("../helper/staking"); +const { getUniTVL } = require("../helper/unknownTokens"); const factory = "0x11cdC9Bd86fF68b6A6152037342bAe0c3a717f56"; const maki = "0x5FaD6fBBA4BbA686bA9B8052Cf0bd51699f38B93"; const makiChef = "0x4cb4c9C8cC67B171Ce86eB947cf558AFDBcAB17E"; -const ignoreLPs = [ - "0x329bae377d60df25e58a17b3d0b1d46cf2f4fd8b", - "0x4db7c033137c2843481a686cc0cb415ad09fa764", - "0x5e9cdc40d1acf45fef65313142e40c72059bcb98", -]; - -async function tvl(timestamp, block, chainBlocks) { - let balances = {}; - let poolLength = ( - await sdk.api.abi.call({ - target: factory, - abi: abi.totalPairs, - block: chainBlocks.heco, - chain: "heco", - }) - ).output; - let allPools = ( - await sdk.api.abi.multiCall({ - calls: Array.from({ length: Number(poolLength) }, (_, k) => ({ - target: factory, - params: k, - })), - abi: abi.allPairs, - block: chainBlocks.heco, - chain: "heco", - }) - ).output; - let supply = ( - await sdk.api.abi.multiCall({ - calls: allPools.map((p) => ({ - target: p.output, - })), - abi: "erc20:totalSupply", - block: chainBlocks.heco, - chain: "heco", - }) - ).output; - let ignoreLPSupply = ( - await sdk.api.abi.multiCall({ - calls: ignoreLPs.map((p) => ({ - target: p, - })), - abi: "erc20:totalSupply", - block: chainBlocks.heco, - chain: "heco", - }) - ).output; - let lpPositions = []; - supply.forEach((p) => { - let addr = p.output.toLowerCase(); - if (addr === "0") { - return; - } - lpPositions.push({ - balance: p.output, - token: p.input.target, - }); - }); - ignoreLPSupply.forEach((p) => { - lpPositions.push({ - balance: p.output, - token: p.input.target, - }); - }); - await unwrapUniswapLPs( - balances, - lpPositions, - chainBlocks.heco, - "heco", - (addr) => { - return `heco:${addr}`; - }, - ignoreLPs - ); - return balances; -} - -async function staking(timestamp, block, chainBlocks) { - let balances = {}; - let balance = ( - await sdk.api.erc20.balanceOf({ - target: maki, - owner: makiChef, - block: chainBlocks.heco, - chain: "heco", - }) - ).output; - sdk.util.sumSingleBalance(balances, `heco:${maki}`, balance); - return balances; -} - module.exports = { - methodology: "TVL consists of LPs created by the factory contract", + misrepresentedTokens: true, heco: { - tvl, - staking, + tvl: getUniTVL({ factory, useDefaultCoreAssets: true, abis: { allPairsLength: 'uint256:totalPairs'}}), + staking: staking(makiChef, maki), }, -}; +} \ No newline at end of file diff --git a/projects/mangrove/index.js b/projects/mangrove/index.js index 4063ddd380..476dbded11 100644 --- a/projects/mangrove/index.js +++ b/projects/mangrove/index.js @@ -55,7 +55,7 @@ module.exports = { misrepresentedTokens: false, methodology: "TVL is calculated by getting the total promised liquidity on the orderbook on a specific block.", - start: 1708992000, + start: '2024-02-27', }; for (const chain in mgvReaders) { diff --git a/projects/manifest-trade/index.js b/projects/manifest-trade/index.js new file mode 100644 index 0000000000..9208b0fc67 --- /dev/null +++ b/projects/manifest-trade/index.js @@ -0,0 +1,83 @@ +const { PublicKey } = require("@solana/web3.js"); +const { getConnection, sumTokens2, } = require("../helper/solana"); + +const PROGRAM_ADDRESS = 'MNFSTqtC93rEfYHB6hF82sKdZpUDFWkViLByLd1k1Ms'; +const PROGRAM_ID = new PublicKey(PROGRAM_ADDRESS); +function getVaultAddress(market, mint) { + const [vaultAddress, _unusedBump] = PublicKey.findProgramAddressSync( + [Buffer.from('vault'), market.toBuffer(), mint.toBuffer()], + PROGRAM_ID, + ); + return vaultAddress; +} +function getGlobalVaultAddress(mint) { + const [globalVaultAddress, _unusedBump] = PublicKey.findProgramAddressSync( + [Buffer.from('global-vault'), mint.toBuffer()], + PROGRAM_ID, + ); + return globalVaultAddress; +} + +async function listMarketPublicKeys( + connection, +) { + const accounts = await connection.getProgramAccounts(PROGRAM_ID, { + filters: [ + { + memcmp: { + offset: 0, + bytes: '8K9hj5OfcUM=', + encoding: 'base64', + }, + }, + ], + }); + + return accounts.map((a) => a.pubkey); +} + +async function tvl() { + const connection = getConnection(); + const marketPks = await listMarketPublicKeys(connection); + + const vaultAccounts = []; + let globalAccounts = []; + for (const pk of marketPks) { + const [buffer, _slot] = await connection + .getAccountInfoAndContext(pk) + .then( + ( + getAccountInfoAndContext, + ) => { + return [ + getAccountInfoAndContext.value?.data, + getAccountInfoAndContext.context.slot, + ]; + }, + ); + + let offset = 16; + const baseMint = new PublicKey(buffer.subarray(offset, offset + 32)); + const quoteMint = new PublicKey(buffer.subarray(offset + 32, offset + 32 + 32)); + + const baseVaultPk = getVaultAddress(pk, baseMint); + const quoteVaultPk = getVaultAddress(pk, quoteMint); + vaultAccounts.push(baseVaultPk); + vaultAccounts.push(quoteVaultPk); + + const baseGlobalPk = getGlobalVaultAddress(baseMint); + const quoteGlobalPk = getGlobalVaultAddress(quoteMint); + globalAccounts.push(baseGlobalPk); + globalAccounts.push(quoteGlobalPk); + } + + const tokenAccounts = vaultAccounts.concat(globalAccounts); + return sumTokens2({ tokenAccounts, allowError: true }) +} + +module.exports = { + timetravel: false, + solana: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/manifesto/index.js b/projects/manifesto/index.js index 41468a3c68..081aa1b6f0 100644 --- a/projects/manifesto/index.js +++ b/projects/manifesto/index.js @@ -1,5 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require("../helper/unknownTokens"); +const { deadFrom } = require('../mosquitos-finance'); const lps = [ '0xF65af1E61D7aC87d73E347D17E369Dc2118E9517', ] @@ -8,12 +9,13 @@ module.exports = { hallmarks: [ [1676332800, "Rug Pull"] ], + deadFrom: 1676332800, misrepresentedTokens: true, canto: { tvl: sumTokensExport({ owner: '0x20636bd0E15be0e1faADE1b27f568e642f59814E', tokens: [ - ADDRESSES.canto.NOTE, + '0x4e71a2e537b7f9d9413d3991d37958c0b5e1e503', ADDRESSES.canto.WCANTO, ADDRESSES.functionx.PURSE, ADDRESSES.functionx.WFX, diff --git a/projects/mantle-restaking/index.js b/projects/mantle-restaking/index.js new file mode 100644 index 0000000000..8ad5875e80 --- /dev/null +++ b/projects/mantle-restaking/index.js @@ -0,0 +1,24 @@ +const targets = [ + '0x6DfbE3A1a0e835C125EEBb7712Fffc36c4D93b25', // eigenPos1 + '0x021180A06Aa65A7B5fF891b5C146FbDaFC06e2DA', // eigenPos2 + '0x52EA8E95378d01B0aaD3B034Ca0656b0F0cc21A2', // karakPos + '0x919531146f9a25dfc161d5ab23b117feae2c1d36', // symbioticPos +] + +const mETH = '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa' +const boringVault = '0x33272D40b247c4cd9C646582C9bbAD44e85D4fE4' +const delayedWithdraw = '0x12be34be067ebd201f6eaf78a861d90b2a66b113' + +const abi = "function getUnderlyings() view returns (address[] assets, uint256[] amounts)" + +const tvl = async (api) => { + const allocateds = await api.multiCall({ calls: targets, abi }) + allocateds.forEach(({ assets: [asset], amounts: [amount] }) => api.add(asset, amount)); + return api.sumTokens({ tokens: [mETH], owners: [boringVault, delayedWithdraw] }) +} + +module.exports = { + doublecounted: true, + methodology: 'TVL corresponds to the sum of mETH deposited across various restaking protocols + the funds pending withdrawal or deposit', + ethereum: { tvl } +} diff --git a/projects/mantra-amm/index.js b/projects/mantra-amm/index.js new file mode 100644 index 0000000000..8ab368def4 --- /dev/null +++ b/projects/mantra-amm/index.js @@ -0,0 +1,36 @@ +const { queryContract } = require("../helper/chain/cosmos"); + +const chain = 'mantra' +const mantraPoolManager = 'mantra1466nf3zuxpya8q9emxukd7vftaf6h4psr0a07srl5zw74zh84yjqagspfm' + +/** + * Get all pools in the DEX + * @returns {Promise}, total_share: {denom: string, amount: string}}>>} + */ +async function getDexPools() { + const response = await queryContract({ + chain, + contract: mantraPoolManager, + data: { + pools: {} + } + }) + return response.pools +} + +async function tvl(api) { + const allPools = await getDexPools() + allPools.forEach(pool => { + pool.pool_info.assets.forEach(asset => { + api.add(asset.denom, asset.amount) + }) + }) +} + +module.exports = { + timetravel: false, + methodology: "Counts the liquidity on MANTRA Chain AMM pools", + mantra: { + tvl + } +} \ No newline at end of file diff --git a/projects/mantradao.js b/projects/mantradao.js index 0512395825..c64fa9605e 100644 --- a/projects/mantradao.js +++ b/projects/mantradao.js @@ -76,7 +76,8 @@ Object.keys(config).forEach(chain => { const { staking = [], pool2 = [], } = config[chain] if (!module.exports[chain]) module.exports[chain] = {} - + module.exports.deadFrom='2024-07-09' module.exports[chain].staking = sumTokensExport({ tokensAndOwners: staking }) module.exports[chain].pool2 = sumTokensExport({ tokensAndOwners: pool2, resolveLP: true, }) + module.exports.ethereum.borrowed = () => ({}) // bad debt }) \ No newline at end of file diff --git a/projects/manxswap/index.js b/projects/manxswap/index.js index d64fbeb8c7..6366c787fd 100644 --- a/projects/manxswap/index.js +++ b/projects/manxswap/index.js @@ -6,7 +6,6 @@ module.exports = { tvl: getUniTVL({ factory: "0xFF073cEd2867F7085eC058f5C5Bd6Cf0d9B1Af8f", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/maple-syrup/index.js b/projects/maple-syrup/index.js index bf031ef8e1..8682bef97f 100644 --- a/projects/maple-syrup/index.js +++ b/projects/maple-syrup/index.js @@ -1,5 +1,6 @@ const rwaPools = [ '0x80ac24aA929eaF5013f6436cdA2a7ba190f5Cc0b', + '0x356b8d89c1e1239cbbb9de4815c39a1474d5ba7d' ] async function tvl(api) { diff --git a/projects/mare-finance-v2/index.js b/projects/mare-finance-v2/index.js index c4848883fe..a6807bbd88 100644 --- a/projects/mare-finance-v2/index.js +++ b/projects/mare-finance-v2/index.js @@ -6,6 +6,6 @@ const unitroller = "0xFcD7D41D5cfF03C7f6D573c9732B0506C72f5C72"; module.exports = { methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", kava: { - ...compoundExports(unitroller, "kava"), + ...compoundExports(unitroller), }, } \ No newline at end of file diff --git a/projects/mare-finance/index.js b/projects/mare-finance/index.js index 3239fb0971..77b498d232 100644 --- a/projects/mare-finance/index.js +++ b/projects/mare-finance/index.js @@ -5,8 +5,11 @@ const unitroller = "0x4804357AcE69330524ceb18F2A647c3c162E1F95"; module.exports = { methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", + deadFrom: '2023-07-08', kava: { - ...compoundExports(unitroller, "kava"), + ...compoundExports(unitroller), staking: staking(['0x2c4A1f47c3E15F468399A87c4B41ec0d19297772', '0x194AAd54F363D28aDEaE53A7957d63B9BCf8a6b2'], '0xd86C8d4279CCaFbec840c782BcC50D201f277419') }, -} \ No newline at end of file +} + +module.exports.kava.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/margin-zero/index.js b/projects/margin-zero/index.js new file mode 100644 index 0000000000..49de756f08 --- /dev/null +++ b/projects/margin-zero/index.js @@ -0,0 +1,47 @@ +const { cachedGraphQuery } = require("../helper/cache"); +const { addUniV3LikePosition } = require('../helper/unwrapLPs'); + +const chainConfigs = +{ + sonic: { + subgraphUrl: "https://api.goldsky.com/api/public/project_cm58q8wq01kbk01ts09lc52kp/subgraphs/mz-subgraph/main/gn", + }, +} + +const LiquidityRangesQuery = `{ liquidityRanges(where: { liquidity_gt: "100" }) { pool hook liquidity tickLower tickUpper }}` + +const slot0Abi = + "function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)"; + +async function tvl(api) { + const config = chainConfigs[api.chain] + + const liquidityRanges = await cachedGraphQuery('marign-zero/tvl', config.subgraphUrl, LiquidityRangesQuery, { + api, + fetchById: true, + useBlock: true, + }) + + let poolsDataMap = {} + const pools = Array.from(new Set(liquidityRanges.map(({ pool }) => pool.toLowerCase()))) + const poolIndexMap = {} + pools.forEach((pool, index) => poolIndexMap[pool] = index) + const token0s = await api.multiCall({ abi: 'address:token0', calls: pools }) + const token1s = await api.multiCall({ abi: 'address:token1', calls: pools }) + const slots = await api.multiCall({ abi: slot0Abi, calls: pools }) + + for (const { liquidity, tickLower, tickUpper, pool } of liquidityRanges) { + const idx = poolIndexMap[pool.toLowerCase()] + + addUniV3LikePosition({ api, token0: token0s[idx], token1: token1s[idx], tick: slots[idx].tick, liquidity, tickUpper, tickLower, }) + } + +} + +module.exports = { + methodology: "TVL is calculated by summing the value of all tokens in Margin Zero liquidity positions across supported chains", + doublecounted: true, + sonic: { + tvl, + } +}; diff --git a/projects/marginal/index.js b/projects/marginal/index.js new file mode 100644 index 0000000000..8516807bad --- /dev/null +++ b/projects/marginal/index.js @@ -0,0 +1,17 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +const config = { + base: { factory: '0x407fA8029852A8386a907287018CEAFd7242C621', fromBlock: 17016522 }, + ethereum: { factory: '0x95D95C41436C15b50217Bf1C0f810536AD181C13', fromBlock: 20297876 }, +} + +Object.keys(config).forEach(chain => { + const { factory, fromBlock } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: 'event PoolCreated (address indexed token0, address indexed token1, uint24 maintenance, address indexed oracle, address pool)', fromBlock, }) + const ownerTokens = logs.map(log => [[log.token0, log.token1], log.pool]) + return api.sumTokens({ ownerTokens }) + } + } +}) \ No newline at end of file diff --git a/projects/margined-protocol/index.js b/projects/margined-protocol/index.js index 6a796969dd..ef90f06432 100644 --- a/projects/margined-protocol/index.js +++ b/projects/margined-protocol/index.js @@ -1,19 +1,48 @@ -const { sumTokensExport} = require('../helper/sumTokens') -const contractAddresses = [ - 'osmo1rk4hregdr63rlqqj0k2rjzk6kz7w6v6tw8f5fqx2wg8203eam5equ67tdl', - 'osmo1zttzenjrnfr8tgrsfyu8kw0eshd8mas7yky43jjtactkhvmtkg2qz769y2', - 'osmo18pfsg9n2kn6epty7uhur7vxfszadvflx6f66569ejc469k8p64pqrve3yz', -] +const { queryContract } = require('../helper/chain/cosmos') + +const osmosisVaults = { + stOSMO: "osmo16s3sxs5886p42kteunp6370pken2n5ukzszz0trkr39epqtawn2qk4r9l5", + stTIA: "osmo1q3w9kedgtc8sdh7xlcr77ydv3qu7fs2e3q6xznysp2lrdfyz9xyqv26yqv", + ampOSMO: "osmo1cztgw4e467vjljd0s2flz8asu3x3wg9q0ttga9t6kzmpyaauxxrs2gjshq", + bOSMO: "osmo159f7axyc32cyfgzx0gs9r98jwpgutj5qz4ns97xvu7nw3xzpavzsg2uxr3", + qOSMO: "osmo18vk0rsu4qwzx74g9alu2f7x5zs99sluwkuh5wp70yed2ne4pmutqf9lvdu", + usdcaxlGrid: "osmo1qngwlgzt0r3fdg6zgln5wa6mr5c7t6fek3qqgxesujjak5ds747sy6qu2f", + // usdtGrid: "osmo1cj8tzmvun6urr0djrax7v92jyk86gnp8hsep0hacf83quvknq5lsutucjj", + OSMORedemption: "osmo15fqmdl8lfl9h0qflljd63ufw9j2m7xmsk3hu5vsn8xpta4hk5chqt7mddc", + TIARedemption: "osmo1reyz7pwu7y9e7lmzqg6j4h7jcv32du7n7jhnk2lz93a9lxr56ess2qtgzl", + ATOMRedemption: "osmo1hvl5kj4xzdj4udxjv2dzk2zfqhzkd9afqygwq3t84tn53e0250zqrltj48", + DYDXRedemption: "osmo1grs74ux62lukjdlfs9ll4myyulcyjcd4uzwpw3cgnzdygtsspp2se2ense", + BTCUSDC: "osmo193kjx80ag4tck2enuxcprxnrcusemmh5mun5k87c96d7swz6y2dqf39rxe", +} + +const neutronVaults = { + ATOMFund: "neutron1puedrclm6rn33x3zv66xg6m23qcdagayqua6jj2wqzvfznlqef8qe53wr2", + NTRNStructured: "neutron13h4jzme5880knnc23xvwu9gytynnxu5cc0fek6fndmjyctzznj9sd5yhhy", + ATOMdATOM: "neutron1f99ujxefjr4jqmskc7hvg09am6pdq2j2c5049xwl0de4cavc4rfsl866y0", + wBTCUSDC: "neutron17fyzkafg4scrd6xu0sp9llrl6hazegza7yer4erlea0kvk30yxsqk2xqfd", + NTRNUSDC: "neutron1t0fl9k43g86sv60ghx9vtwed9rpgtf49rxzm05ff477j23h52c6s0urdc7", + TIAUSDC: "neutron1wv8pl7tsatzx6n9yaqfksvu5y0x7j50g6mhy636udwfn3vyqp0hsu7g8yk", + ATOMUSDC: "neutron1krqwpk0kmphl93kykavp2fnr88g5rnrpk40c34a55yrl00tmfz0s99ewc6", + TIAFund: "neutron14q3umuuvyv6mndd5acuc3n8u5mlvrrq3kkzrputu3rkhz8nd2uzqmfl4v6", +} + +const config = { + osmosis: osmosisVaults, + neutron: neutronVaults, +} module.exports = { - methodology: 'Total collateral held on power perpetual contracts', - osmosis: { - tvl: sumTokensExport({ owners: contractAddresses}), - }, - hallmarks:[ - [Math.floor(new Date('2023-11-06') / 1e3), 'sqOSMO contract deployed'], - [Math.floor(new Date('2023-11-21') / 1e3), 'sqATOM contract deployed'], - [Math.floor(new Date('2024-01-19') / 1e3), 'sqTIA contract deployed'], - ] + methodology: 'Total TVL on vaults', +} + +Object.keys(config).forEach(chain => module.exports[chain] = { tvl }) + +async function tvl(api) { + const vaults = config[api.chain] + for (const contract of Object.values(vaults)) { + let vaultInfo = await queryContract({ contract, api, data: { 'info': {} }, }); + let totalAssets = await queryContract({ contract, api, data: { 'total_assets': {} }, }); + api.add(vaultInfo.base_token, totalAssets); + } } diff --git a/projects/marinade.js b/projects/marinade.js index 82d33f65dc..21e776536f 100644 --- a/projects/marinade.js +++ b/projects/marinade.js @@ -1,7 +1,8 @@ const { getProvider, sumTokens2, } = require("./helper/solana") const { Program, } = require("@project-serum/anchor"); +const ADDRESSES = require('./helper/coreAssets.json') -async function tvl() { +async function tvl(api) { const provider = getProvider() const programId = 'MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD' const idl = await Program.fetchIdl(programId, provider) @@ -13,12 +14,12 @@ async function tvl() { emergencyCoolingDown, }, },] = await program.account.state.all() + + api.add(ADDRESSES.solana.SOL, totalActiveBalance) + api.add(ADDRESSES.solana.SOL, availableReserveBalance) + api.add(ADDRESSES.solana.SOL, emergencyCoolingDown) - const balances = { - solana: (+totalActiveBalance + +availableReserveBalance + +emergencyCoolingDown) / 1e9 - } - - return sumTokens2({ balances, solOwners: ['UefNb6z6yvArqe4cJHTXCqStRsKmWhGxnZzuHbikP5Q'] }) // Liq Pool Sol Leg Pda + return sumTokens2({ api, solOwners: ['UefNb6z6yvArqe4cJHTXCqStRsKmWhGxnZzuHbikP5Q'] }) // Liq Pool Sol Leg Pda } module.exports = { diff --git a/projects/marlinprotocol/index.js b/projects/marlinprotocol/index.js new file mode 100644 index 0000000000..50ca1cc023 --- /dev/null +++ b/projects/marlinprotocol/index.js @@ -0,0 +1,11 @@ +const { staking } = require('../helper/staking'); + +module.exports = { + arbitrum: { + tvl: () => ({}), + staking: staking( + "0xf90490186F370f324DEF2871F077668455f65253", + "0xdA0a57B710768ae17941a9Fa33f8B720c8bD9ddD" + ) + }, +}; \ No newline at end of file diff --git a/projects/mars-perp/index.js b/projects/mars-perp/index.js new file mode 100644 index 0000000000..d770a8b0d7 --- /dev/null +++ b/projects/mars-perp/index.js @@ -0,0 +1,23 @@ +const { queryContract } = require('../helper/chain/cosmos'); + +const contractAddresses = { + neutron: { + perps: 'neutron1g3catxyv0fk8zzsra2mjc0v4s69a7xygdjt85t54l7ym3gv0un4q2xhaf6' + }, +}; + +async function tvl(api) { + const chain = api.chain; + const { perps } = contractAddresses[chain]; + const info = await queryContract({ contract: perps, chain, data: { 'config': {} }, }); + const perpsVault = await queryContract({ contract: perps, chain, data: { 'vault': {} }, }); + + if (perpsVault) api.add(info.base_denom, perpsVault['total_balance']); +} + +module.exports = { + timetravel: false, + methodology: + "For each chain, sum token balances by querying the total deposit amount for each asset in the chain's params contract.", + neutron: { tvl }, +} diff --git a/projects/mars/index.js b/projects/mars/index.js index 166827d8bb..4713913830 100644 --- a/projects/mars/index.js +++ b/projects/mars/index.js @@ -1,167 +1,127 @@ -const sdk = require('@defillama/sdk'); +const { queryContract } = require('../helper/chain/cosmos'); +const axios = require('axios'); +const BigNumber = require('bignumber.js'); -const { endPoints, queryContract, sumTokens} = require('../helper/chain/cosmos'); -const { getChainTransform } = require('../helper/portedTokens'); -const { get } = require('../helper/http'); - -const addresses = { +const contractAddresses = { osmosis: { + params: 'osmo1nlmdxt9ctql2jr47qd4fpgzg84cjswxyw6q99u4y4u4q6c2f5ksq7ysent', redBank: 'osmo1c3ljch9dfw5kf52nfwpxd2zmj2ese7agnx0p9tenkrryasrle5sqf3ftpg', - creditManager: 'osmo1f2m24wktq0sw3c0lexlg7fv4kngwyttvzws3a3r3al9ld2s2pvds87jqvf', - params: 'osmo1nlmdxt9ctql2jr47qd4fpgzg84cjswxyw6q99u4y4u4q6c2f5ksq7ysent' }, neutron: { + params: 'neutron1x4rgd7ry23v2n49y7xdzje0743c5tgrnqrqsvwyya2h6m48tz4jqqex06x', redBank: 'neutron1n97wnm7q6d2hrcna3rqlnyqw2we6k0l8uqvmyqq6gsml92epdu7quugyph', - } -} - - -// OSMOSIS + }, +}; -async function osmosisTVL() { - let balances = {}; - await addRedBankTvl(balances, 'osmosis'); - await addCreditManagerTvl(balances, 'osmosis'); - await osmosisSumVaultsTVL(balances); - return balances; -} +const poolsApis = { + osmosis: 'https://api.astroport.fi/api/pools?chainId=osmosis-1', + neutron: 'https://api.astroport.fi/api/pools?chainId=neutron-1', +}; -async function osmosisSumVaultsTVL(balances) { - let coins = []; - let vaultPagesRemaining = true; +async function tvl(api) { + const chain = api.chain; + const { params, redBank } = contractAddresses[chain]; let startAfter = null; - const pageLimit = 10; - const osmosisDenomTransform = await getChainTransform('osmosis'); - - while (vaultPagesRemaining) { - const roverVaultConfigs = await queryContract({ - contract: addresses.osmosis.params, - chain: 'osmosis', - data: { 'all_vault_configs': { limit: pageLimit, 'start_after': startAfter } } - }); + const pageLimit = 5; - if(roverVaultConfigs.length === pageLimit) { - startAfter = roverVaultConfigs[roverVaultConfigs.length - 1].vault; - vaultPagesRemaining = true - } else { - vaultPagesRemaining = false; - } - - await osmosisAddCoinsForVaultsInfoPage(coins, roverVaultConfigs); - } + do { + const assetParams = await queryContract({ + contract: params, + chain, + data: { all_asset_params: { limit: pageLimit, start_after: startAfter } }, + }); - coins.forEach(coin => { - sdk.util.sumSingleBalance(balances, osmosisDenomTransform(coin.denom), coin.amount); - }) -} + if (assetParams.length === pageLimit) startAfter = assetParams[assetParams.length - 1].denom; + else startAfter = null; -async function osmosisAddCoinsForVaultsInfoPage(coins, roverVaultConfigsPage) { - let vaultsMetadata = roverVaultConfigsPage.map(rvi => ({ fieldsVaultInfo: rvi })); - - // query the vault info for the vault contract itself to get the vault's - // base token - await Promise.all(vaultsMetadata.map(async vm => { - let vaultInfo = await queryContract({ - contract: vm.fieldsVaultInfo.addr, - chain: 'osmosis', - data: { 'info': {} } - }); - vm.vaultInfo = vaultInfo; - })); - - // get total vault shares owned by fields for each vault - await Promise.all(vaultsMetadata.map(async vm => { - let vaultShares = await cosmosDenomBalanceStr( - 'osmosis', - vm.vaultInfo.vault_token, - addresses.osmosis.creditManager - ); - vm.vaultShares = vaultShares; - })); - - // convert vault shares to vault base asset - await Promise.all(vaultsMetadata.map( async vm => { - let query = { - contract: vm.fieldsVaultInfo.addr, - chain: 'osmosis', - data: { 'convert_to_assets': { amount: vm.vaultShares } } - }; - let amount = await queryContract(query); - vm.baseTokenAmount = amount; - })); - - // Add coins to then be added to balances - // * For gamm lp tokens compute the share of underlying assets and add those - // * For other assets, add as is - await Promise.all(vaultsMetadata.map( async vm => { - const baseToken = vm.vaultInfo['base_token']; - if (baseToken.startsWith('gamm/pool/')) { - let poolId = baseToken.split('/')[2]; - const url = `osmosis/gamm/v1beta1/pools/${poolId}`; - const query = await cosmosLCDQuery(url, 'osmosis'); - const pool = query.pool; - pool['pool_assets'].forEach(asset => { - const denom = asset.token.denom; - const amount = asset.token.amount * vm.baseTokenAmount / pool['total_shares'].amount; - coins.push({denom, amount}); - }); - } else { - coins.push({denom: baseToken, amount: vm.baseTokenAmount}); - } - })); -} + await addCoinsFromAssetParams(assetParams); + } while (startAfter); -// NEUTRON - -async function neutronTVL() { - let balances = {}; - await addRedBankTvl(balances, 'neutron'); - return balances; -} + do { + const markets = await queryContract({ + contract: contractAddresses[chain].redBank, + chain, + data: { 'markets': { 'limit': pageLimit, 'start_after': startAfter } }, + }); -// HELPERS + if (markets.length === pageLimit) startAfter = markets[markets.length - 1].denom; + else startAfter = null; -async function addRedBankTvl(balances, chain) { - await sumTokens({balances, owners: [addresses[chain].redBank], chain}); -} + await deductCoinsFromMarkets(markets); + } while (startAfter); -async function addCreditManagerTvl(balances, chain) { - await sumTokens({balances, owners: [addresses[chain].creditManager], chain}); -} + async function addCoinsFromAssetParams(assetParams) { + const assetDenoms = assetParams.map((asset) => asset.denom); -function getEndpoint(chain) { - if (!endPoints[chain]) throw new Error('Chain not found: ' + chain); - return endPoints[chain]; -} + // fetch pool infos from the poolsApi based on chain + const poolInfos = await axios.get(poolsApis[chain]); -async function cosmosLCDQuery(url, chain) { - let endpoint = `${getEndpoint(chain)}/${url}`; - let request = await get(endpoint); - return request; -} + // query the deposited amount for each asset and add it to the depositCoins array + await Promise.all( + assetDenoms.map(async (denom) => { + const totalDepositInfo = await queryContract({ + contract: params, + chain, + data: { 'total_deposit': { 'denom': denom } }, + }); + // check if the token is a liquidity pool share (deposited via farm) + // and find it in the api data + const poolInfo = poolInfos.data.find((pool) => pool.lpAddress === denom); + + if (poolInfo) { + // check for the underlying asset and calculate how much underlying assets a pool share holds + const totalShares = poolInfo.poolTotalShare; + const poolAssets = poolInfo.assets; + poolAssets.forEach((asset) => { + const amount = new BigNumber(asset.amount); + const amountPerShare = amount.div(totalShares); + + // add the underlying tokens to the api + api.add(asset.denom, amountPerShare.times(totalDepositInfo.amount).integerValue(BigNumber.ROUND_DOWN).toString()); + }); + } else { + // if the it's a token and not a liquidity pool share, add it to the api + api.add(denom, totalDepositInfo.amount); + } + }), + ); + } -async function cosmosDenomBalanceStr(chain, denom, owner) { - let url = `cosmos/bank/v1beta1/balances/${owner}/by_denom?denom=${denom}`; - let balance = await cosmosLCDQuery(url, chain); - return balance.balance.amount; + async function deductCoinsFromMarkets(markets) { + // query the underlying debt amount from the debt_total_scaled + await Promise.all( + markets.map(async (market) => { + const totalDebt = await queryContract({ + contract: redBank, + chain, + data: { + 'underlying_debt_amount': { + 'denom': market.denom, + 'amount_scaled': market['debt_total_scaled'], + }, + }, + }); + api.add(market.denom, totalDebt * -1); + }), + ); + } } module.exports = { timetravel: false, - methodology: 'For each chain, sum token balances in Red Bank/Credit Manager smart contracts to approximate net deposits, plus vault underlying assets held in Rover', - osmosis: { - tvl: osmosisTVL, - }, - neutron: { - tvl: neutronTVL, - }, + methodology: + "For each chain, sum token balances by querying the total deposit amount for each asset in the chain's params contract.", + osmosis: { tvl }, + neutron: { tvl }, terra: { tvl: () => 0, }, - hallmarks:[ + hallmarks: [ [1651881600, 'UST depeg'], [1675774800, 'Relaunch on Osmosis'], - [1690945200, 'Red Bank launch on Neutron'], - [1696906800, 'Mars V2 launch on Osmosis'], - ] + [1690945200, 'Launch on Neutron'], + [1696906800, 'Mars v2 launch on Osmosis'], + [1724166000, 'Mars v2 launch on Neutron'], + [1734098400, 'Perps launch on Neutron'] + ], }; diff --git a/projects/maskex/index.js b/projects/maskex/index.js index c8de7c1a07..fe02cb33e7 100644 --- a/projects/maskex/index.js +++ b/projects/maskex/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -69,9 +70,7 @@ const config = { ] }, bitcoin: { - owners: [ - '39DUz1NCkLu25GczWiAjjgZBu4mUjKbdNA', // this wallet was collected from https://blog.maskex.com/news/announcements/embracing-transparency-maskex-reveals-wallet-addresses - ] + owners: bitcoinAddressBook.maskex } } diff --git a/projects/matrixdock/index.js b/projects/matrixdock/index.js index 1a1c8b7c05..466547b81d 100644 --- a/projects/matrixdock/index.js +++ b/projects/matrixdock/index.js @@ -1,11 +1,14 @@ -const ADDRESSES = require('../helper/coreAssets.json') +const config = { + ethereum: ['0x530824DA86689C9C17CdC2871Ff29B058345b44a', '0x2103E845C5E135493Bb6c2A4f0B8651956eA8682'], + bsc: ['0x23AE4fd8E7844cdBc97775496eBd0E8248656028'] +} -module.exports = { - misrepresentedTokens: true, - ethereum: { +Object.keys(config).forEach(chain => { + const tokens = config[chain] + module.exports[chain] = { tvl: async (api) => { - const STBT = '0x530824DA86689C9C17CdC2871Ff29B058345b44a' - api.add(ADDRESSES.ethereum.USDT, await api.call({ target: '0xad4A9bED9a5E2c1c9a6E43D35Db53c83873dd901', abi: 'uint256:latestAnswer'}) / 1e12) + const supplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: tokens }) + api.add(tokens, supplies) } } -} \ No newline at end of file +}) \ No newline at end of file diff --git a/projects/maxapy/index.js b/projects/maxapy/index.js new file mode 100644 index 0000000000..72b46a7051 --- /dev/null +++ b/projects/maxapy/index.js @@ -0,0 +1,23 @@ +const { sumERC4626VaultsExport } = require('../helper/erc4626') + +module.exports = { + doublecounted: true, + methodology: "Counts total value locked in ERC4626 vaults", +} + +const config = { + ethereum: [ + "0x9847c14fca377305c8e2d10a760349c667c367d4", + "0x349c996c4a53208b6eb09c103782d86a3f1bb57e", + ], + polygon: [ + "0xe7fe898a1ec421f991b807288851241f91c7e376", + "0xa02aa8774e8c95f5105e33c2f73bdc87ea45bd29", + ] +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: sumERC4626VaultsExport({ vaults: config[chain], isOG4626: true, }) + } +}) diff --git a/projects/maximizer/index.js b/projects/maximizer/index.js index ba02b163b0..96f30b08e1 100644 --- a/projects/maximizer/index.js +++ b/projects/maximizer/index.js @@ -1,232 +1,14 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const BigNumber = require("bignumber.js"); -const { sumTokensAndLPsSharedOwners, unwrapUniswapLPs } = require("../helper/unwrapLPs"); -const sdk = require("@defillama/sdk"); -const allocatorAbi = require("./allocatorAbi.json"); -const pngStakingAbi = require("./stakingRewardsAbi.json"); -const joeStakingAbi = require("./stableJoeStakingAbi.json"); -const veptpAbi = require("./veptpAbi.json"); -const qiTokenAbi = require("./qiTokenAbi.json"); const MaximizerStaking = "0x6d7AD602Ec2EFdF4B7d34A9A53f92F06d27b82B1"; -const Treasury = "0x22cF6c46b4E321913ec30127C2076b7b12aC6d15"; -const Deployer = "0xb2Fe117269292D41c3b5bdD6B600Fc80239AfBeC"; -const PngAllocator = "0x1ff1E60e7af648DFE7B95E025214bfCd6f3D9524"; -const JoeAllocator = "0x7613D00f7b49E514Ce84d6369EA12Cc98219Ed40"; -const BenqiAllocator = '0x1e3834DA9a9B4d4016427554Ef31ff4e1F41d4Ed'; - const MAXI = "0x7C08413cbf02202a1c13643dB173f2694e0F73f0"; -const SMAXI = "0xEcE4D1b3C2020A312Ec41A7271608326894076b4"; -const DAIe = ADDRESSES.avax.DAI; -const USDC = ADDRESSES.avax.USDC; -const USDCe = ADDRESSES.avax.USDC_e; -const WAVAX = ADDRESSES.avax.WAVAX; -const PNG = "0x60781C2586D68229fde47564546784ab3fACA982"; -const QI = "0x8729438EB15e2C8B576fCc6AeCdA6A148776C0F5"; -const JOE = ADDRESSES.avax.JOE; -const XJOE = ADDRESSES.avax.xJOE; -const ISA = "0x3EeFb18003D033661f84e48360eBeCD181A84709"; -const PTP = "0x22d4002028f537599bE9f666d1c4Fa138522f9c8"; -const VEPTP = "0x5857019c749147EEE22b1Fe63500F237F3c1B692"; -const MORE = "0xd9D90f882CDdD6063959A9d837B05Cb748718A05"; -const MONEY = "0x0f577433Bf59560Ef2a79c124E9Ff99fCa258948"; -const HEC = "0xC7f4debC8072e23fe9259A5C0398326d8EfB7f5c"; -const SAVAX = ADDRESSES.avax.SAVAX; -const MAXI_DAI_JLP = "0xfBDC4aa69114AA11Fae65E858e92DC5D013b2EA9"; -const MAXI_WAVAX_PGL = "0xbb700450811a30c5ee0dB80925Cf1BA53dBBd60A"; -const PNG_WAVAX_PGL = "0xd7538cABBf8605BdE1f4901B47B8D42c61DE0367"; -const QI_WAVAX_PGL = "0xE530dC2095Ef5653205CF5ea79F8979a7028065c"; -const JOE_WAVAX_JLP = "0x454E67025631C065d3cFAD6d71E6892f74487a15"; -const ISA_WAVAX_JLP = "0x9155f441FFDfA81b13E385bfAc6b3825C05184Ee"; -const PTP_WAVAX_JLP = "0xCDFD91eEa657cc2701117fe9711C9a4F61FEED23"; -const MORE_WAVAX_JLP = "0xb8361D0E3F3B0fc5e6071f3a3C3271223C49e3d9"; -const HEC_WAVAX_JLP = "0x4dc5291cdc7ad03342994e35d0ccc76de065a566"; -const AVAX_QITOKEN = "0x5C0401e81Bc07Ca70fAD469b451682c0d747Ef1c"; -const QI_QITOKEN = "0x35Bd6aedA81a7E5FC7A7832490e71F757b0cD9Ce"; -const DAI_QITOKEN = "0x835866d37AFB8CB8F8334dCCdaf66cf01832Ff5D"; -const USDC_QITOKEN = "0xB715808a78F6041E46d61Cb123C9B4A27056AE9C"; -const SAVAX_QITOKEN = "0xF362feA9659cf036792c9cb02f8ff8198E21B4cB"; - -const PngStaking = "0x88afdaE1a9F58Da3E68584421937E5F564A0135b"; -const JoeStaking = "0x1a731B2299E22FbAC282E7094EdA41046343Cb51"; - -const Allocators = [ - { allocator: PngAllocator, stakeToken: PNG, yieldToken: PNG, yieldStaking: PngStaking, abi: pngStakingAbi.balanceOf, params: [ PngAllocator ], transformResult: (result) => result.output }, - { allocator: JoeAllocator, stakeToken: JOE, yieldToken: JOE, yieldStaking: JoeStaking, abi: joeStakingAbi.getUserInfo, params: [ JoeAllocator, USDC ], transformResult: (result) => result.output.amount }, -]; -const Allocations = [ - { allocator: PngAllocator, token: PNG_WAVAX_PGL, pid: 0 }, - { allocator: PngAllocator, token: QI_WAVAX_PGL, pid: 19 }, - { allocator: PngAllocator, token: MAXI_WAVAX_PGL, pid: 42 }, - { allocator: JoeAllocator, token: JOE_WAVAX_JLP, pid: 0 }, - { allocator: JoeAllocator, token: ISA_WAVAX_JLP, pid: 36 }, - { allocator: JoeAllocator, token: HEC_WAVAX_JLP, pid: 41 }, - { allocator: JoeAllocator, token: MORE_WAVAX_JLP, pid: 44 }, -]; - -const BenqiMarkets = [ - { qiToken: AVAX_QITOKEN, underlyingToken: WAVAX }, - { qiToken: QI_QITOKEN, underlyingToken: QI }, - { qiToken: DAI_QITOKEN, underlyingToken: DAIe }, - { qiToken: USDC_QITOKEN, underlyingToken: USDC }, - { qiToken: SAVAX_QITOKEN, underlyingToken: SAVAX }, -]; - -const Tokens = [ - [MAXI, false], - [SMAXI, false], - [DAIe, false], - [USDC, false], - [WAVAX, false], - [PNG, false], - [QI, false], - [JOE, false], - [ISA, false], - [PTP, false], - [MORE, false], - [MONEY, false], - [HEC, false], - [MAXI_DAI_JLP, true], - [MAXI_WAVAX_PGL, true], - [PNG_WAVAX_PGL, true], - [QI_WAVAX_PGL, true], - [JOE_WAVAX_JLP, true], - [ISA_WAVAX_JLP, true], - [PTP_WAVAX_JLP, true], - [MORE_WAVAX_JLP, true], - [HEC_WAVAX_JLP, true], -]; - -function compareToIgnoreCase(a, b) { - return a.toLowerCase() === b.toLowerCase(); -} - -const transformAddress = (addr) => { - let resultantAddress = addr; - // sMAXI -> MAXI - if (compareToIgnoreCase(addr, SMAXI)) { - resultantAddress = MAXI; - } - // USDC -> USDC.e - if (compareToIgnoreCase(addr, USDC)) { - resultantAddress = USDCe; - } - // MONEY -> DAI - if (compareToIgnoreCase(addr, MONEY)) { - resultantAddress = DAIe; - } - // xJOE -> JOE - if (compareToIgnoreCase(addr, XJOE)) { - resultantAddress = JOE; - } - return `avax:${resultantAddress.toLowerCase()}`; -}; - -const chainConfig = (chainBlocks) => ({ - block: chainBlocks.avax, - chain: "avax", - transformAddress, -}); - -const staking = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - const stakingBalance = await sdk.api.abi.call({ - abi: "erc20:balanceOf", - target: MAXI, - params: MaximizerStaking, - block: chainBlocks.avax, - chain: "avax", - }); - - sdk.util.sumSingleBalance(balances, "avax:" + MAXI, stakingBalance.output); - - return balances; -}; - -async function tvl(timestamp, block, chainBlocks) { - const config = chainConfig(chainBlocks); - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - Tokens, - [Treasury], - config.block, - config.chain, - config.transformAddress, - ); - - const allocatedLps = await sdk.api.abi.multiCall({ - calls: Allocations.map(allocation => ({ - target: allocation.allocator, - params: [allocation.token] - })), - abi: allocatorAbi.balanceOf, - ...config, - }); - - await unwrapUniswapLPs( - balances, - Allocations.map((allocation, index) => ({ - balance: allocatedLps.output[index].output, - token: allocation.token, - })), - config.block, - config.chain, - config.transformAddress, - ); - - const stakedYieldTokens = (await Promise.all( - Allocators.map(allocator => ( - sdk.api.abi.call({ - target: allocator.yieldStaking, - params: allocator.params, - abi: allocator.abi, - ...config, - }) - )) - )).map((result, index) => Allocators[index].transformResult(result)); - - const pendingYieldTokens = (await sdk.api.abi.multiCall({ - calls: Allocators.map(allocator => ({ - target: allocator.allocator, - })), - abi: allocatorAbi.pending, - ...config, - })).output.map(result => result.output); - - for (const [index, allocator] of Allocators.entries()) { - sdk.util.sumSingleBalance(balances, config.transformAddress(allocator.stakeToken), stakedYieldTokens[index]); - sdk.util.sumSingleBalance(balances, config.transformAddress(allocator.yieldToken), pendingYieldTokens[index]); - } - - for (const market of BenqiMarkets) { - const [balance, exchangeRate] = await Promise.all([ - sdk. - api.abi.call({ target: market.qiToken, abi: qiTokenAbi.balanceOf, params: [BenqiAllocator], ...config }), - sdk.api.abi.call({ target: market.qiToken, abi: qiTokenAbi.exchangeRateStored, params: [], ...config }), - ]); - const underlyingTokenBalance = new BigNumber(balance.output).times(new BigNumber(exchangeRate.output)).div(new BigNumber(1e18)); - sdk.util.sumSingleBalance(balances, config.transformAddress(market.underlyingToken), underlyingTokenBalance.toFixed(0)); - } - - const stakedPtp = (await sdk.api.abi.call({ - target: VEPTP, - abi: veptpAbi.getStakedPtp, - params: [Deployer], - ...config, - })).output; - sdk.util.sumSingleBalance(balances, config.transformAddress(PTP), stakedPtp); - - return balances; -} +const staking = async (api) => api.sumTokens({ owner: MaximizerStaking, token: MAXI }) module.exports = { - avax:{ - tvl, + avax: { + tvl: () => ({}), staking, }, + deadFrom: '2022-06-13', methodology: "Counts MAXI, MAXI LP (MAXI-DAI.e JLP, MAXI-WAVAX PGL), DAI.e, USDC, WAVAX, liquidity tokens (PGL, JLP), single partner tokens on the treasury and allocators", }; diff --git a/projects/mayachain/index.js b/projects/mayachain/index.js index 4880587fd7..92ee702771 100644 --- a/projects/mayachain/index.js +++ b/projects/mayachain/index.js @@ -10,6 +10,7 @@ const chainMapping = { THOR: "thorchain", DASH: "dash", ARB: "arbitrum", + XRD: "radixdlt", }; const tokenGeckoMapping = { @@ -18,6 +19,7 @@ const tokenGeckoMapping = { "ETH.PEPE": "pepe", "ETH.ETH": "ethereum", "ETH.USDC": "usd-coin", + "ETH.MOG":"mog-coin", "KUJI.USK": "usk", "KUJI.KUJI": "kujira", "THOR.RUNE": "thorchain", @@ -37,6 +39,7 @@ const tokenGeckoMapping = { "ARB.USDT": "tether", "ARB.WBTC": "wrapped-bitcoin", "ARB.WSTETH": "wrapped-steth", + "XRD.XRD": "radix", }; const tokenToDecimalMapping = { @@ -45,6 +48,7 @@ const tokenToDecimalMapping = { "ETH.PEPE": 18, "ETH.ETH": 18, "ETH.USDC": 6, + "ETH.MOG":18, "KUJI.USK": 8, "KUJI.KUJI": 8, "THOR.RUNE": 8, @@ -65,6 +69,7 @@ const tokenToDecimalMapping = { "ARB.USDT": 6, "ARB.WBTC": 8, "ARB.WSTETH": 18, + "XRD.XRD": 8, }; async function tvl(api) { @@ -89,9 +94,9 @@ async function tvl(api) { let [baseToken, address] = token.split("-"); if (chain === "ethereum" || chain === "arbitrum") { - assetDepth = - assetDepth * - 10 ** (+tokenToDecimalMapping[chainStr + "." + baseToken] - 8); + let decimal = tokenToDecimalMapping[chainStr + "." + baseToken]; + if (decimal === undefined || isNaN(decimal)) return + assetDepth = assetDepth * 10 ** (+decimal - 8); // e.g. ETH.USDC-0XA0B86991C6218B36C1D19D4A2E9EB0CE3606EB48 address = address && address.includes('-') ? address.split("-")[1] : address @@ -114,7 +119,7 @@ async function tvl(api) { } } else { // e.g KUJI.KUJI - if (chainStr === baseToken) { + if (['KUJI'].includes(baseToken)) { sdk.util.sumSingleBalance(balances, chain, assetDepth / 1e8); } else if (tokenGeckoMapping[pool]) { sdk.util.sumSingleBalance( diff --git a/projects/meanfinance/index.js b/projects/meanfinance/index.js index 3be9d2b6e7..0fa35f6c9d 100644 --- a/projects/meanfinance/index.js +++ b/projects/meanfinance/index.js @@ -67,6 +67,7 @@ module.exports = { moonbeam: getV2TvlObject('moonbeam'), avax: getV2TvlObject('avax'), rsk: getV2TvlObject('rsk'), + base: getV2TvlObject('base'), hallmarks: [ [1650082958, "Protocol is paused due to non-critical vulnerability"], [1654057358, "Deployment on Optimism"], diff --git a/projects/mellow-protocol-v2/index.js b/projects/mellow-protocol-v2/index.js index 471e5df178..d3d2866ef3 100644 --- a/projects/mellow-protocol-v2/index.js +++ b/projects/mellow-protocol-v2/index.js @@ -16,6 +16,9 @@ const config = { '0x3a828C183b3F382d030136C824844Ea30145b4c7', '0x64047dD3288276d70A4F8B5Df54668c8403f877F', '0x7b31F008c48EFb65da78eA0f255EE424af855249', + '0x4f3Cc6359364004b245ad5bE36E6ad4e805dC961', + '0x375A8eE22280076610cA2B4348d37cB1bEEBeba0', + '0xcC36e5272c422BEE9A8144cD2493Ac472082eBaD', ], }, } diff --git a/projects/meme-dollar/index.js b/projects/meme-dollar/index.js index ea585d4dc2..7d1df3a40d 100644 --- a/projects/meme-dollar/index.js +++ b/projects/meme-dollar/index.js @@ -10,7 +10,7 @@ const PINA_MEME_LP_CONTRACT = "0x713afa49478f1a33c3194ff65dbf3c8058406670"; module.exports = { methodology: "counts the number of tokens in Pina pool", - start: 1673928000, + start: '2023-01-17', ethereum: { tvl: () => 0, staking: staking( diff --git a/projects/memebox-fi/index.js b/projects/memebox-fi/index.js new file mode 100644 index 0000000000..f4d3a66990 --- /dev/null +++ b/projects/memebox-fi/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'sonic': '0x079463f811e6EB2E226908E79144CDDB59a7fB71' +}) \ No newline at end of file diff --git a/projects/memecooking/index.js b/projects/memecooking/index.js new file mode 100644 index 0000000000..615d3d10ba --- /dev/null +++ b/projects/memecooking/index.js @@ -0,0 +1,11 @@ +const { addTokenBalances } = require("../helper/chain/near"); + +const MEMECOOKING_CONTRACT = 'meme-cooking.near'; +const FT_NEAR = 'wrap.near' + +module.exports = { + methodology: 'Amount of wNEAR in the MEMECOOKING contract', + near: { + tvl: () => addTokenBalances([FT_NEAR], MEMECOOKING_CONTRACT), + } +}; \ No newline at end of file diff --git a/projects/memejob/index.js b/projects/memejob/index.js new file mode 100644 index 0000000000..4f868c6044 --- /dev/null +++ b/projects/memejob/index.js @@ -0,0 +1,11 @@ + +const { sumTokensExport } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') +const MEMEJOB_CONTRACT = "0x950230ea77Dc168df543609c2349C87dea57e876"; + +module.exports = { + methodology: "TVL is represented by all HBAR held in active bonding curves within MemeJob.", + hedera: { + tvl: sumTokensExport({ owner: MEMEJOB_CONTRACT, tokens: [ADDRESSES.null] }), + }, +}; \ No newline at end of file diff --git a/projects/memeta/index.js b/projects/memeta/index.js new file mode 100644 index 0000000000..ce86a66503 --- /dev/null +++ b/projects/memeta/index.js @@ -0,0 +1,19 @@ +const ADDRESSES = require('../helper/coreAssets.json'); + +async function tvl(api) { + const MEMETA_CONTRACT_ADDRESS = "0xD76A1A03C4873042c50ba77cE455C793C70d1b2d"; + + return api.sumTokens({ + owner: MEMETA_CONTRACT_ADDRESS, + tokens: [ + ADDRESSES.manta.WETH, + ADDRESSES.manta.USDC, + ADDRESSES.manta.USDT, + ADDRESSES.manta.WBTC, + ], + }); +} + +module.exports = { + manta: { tvl }, +}; \ No newline at end of file diff --git a/projects/mento/index.js b/projects/mento/index.js index addb839a4b..b9435c49b4 100644 --- a/projects/mento/index.js +++ b/projects/mento/index.js @@ -1,6 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') const { nullAddress, } = require('../helper/unwrapLPs') const { sumTokensExport, } = require('../helper/sumTokens') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { methodology: 'TVL counts all assets deposited as collateral to mint Mento stablecoins.', @@ -19,6 +20,6 @@ module.exports = { }) }, bitcoin: { - tvl: sumTokensExport({ owners: ['38EPdP4SPshc5CiUCzKcLP9v7Vqo5u1HBL', '3KWX93e2zPPQ2eWCsUwPAB6VhAKKPLACou'], }) + tvl: sumTokensExport({ owners: bitcoinAddressBook.mento }) } } diff --git a/projects/meowfinance/index.js b/projects/meowfinance/index.js index 1c7ba69695..c3a033e077 100644 --- a/projects/meowfinance/index.js +++ b/projects/meowfinance/index.js @@ -1,21 +1,10 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const { pool2Exports } = require("../helper/pool2"); -const { stakingUnknownPricedLP } = require("../helper/staking"); -const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); +const { pool2 } = require("../helper/pool2"); +const { staking } = require("../helper/staking"); const meow = "0x41F4CC9613E31d4E77C428b40D53537Da24264Ee"; const meowMining = "0xba1a3dACa919616aA462E93A80EFbe82753f9087"; const meowFtm = "0x150Aeb5389d56E258c2bbb42c7e67e944EDEE913"; -const treasuryContract = "0x7d25f49C648B2a12B5f530Df929204352cb6080e"; - -const translate = { - [ADDRESSES.fantom.fUSDT]: - ADDRESSES.ethereum.USDT, - [ADDRESSES.fantom.DAI]: - ADDRESSES.ethereum.DAI, -}; const workers = [ "0x5f1D549826e1AE30D653aD17e7277Fb7C6AC7EDD", // SpiritswapWorker_USDC_FTM_Spirit_Worker @@ -37,172 +26,29 @@ const workers = [ "0xC14f48826EB564201Bf7D7111f0b46e2301bF36A", // SpookyswapWorker_fUSDT_FTM_Spooky_Worker ]; -async function calcTvl(block, chain, borrow) { - let balances = {}; - const poolLength = ( - await sdk.api.abi.call({ - target: meowMining, - abi: abi.poolLength, - block, - chain, - }) - ).output; - const poolInfo = ( - await sdk.api.abi.multiCall({ - calls: Array.from({ length: Number(poolLength) }, (_, k) => ({ - target: meowMining, - params: k, - })), - abi: abi.poolInfo, - block, - chain, - }) - ).output; - const symbols = ( - await sdk.api.abi.multiCall({ - calls: poolInfo.map((p) => ({ - target: p.output.stakeToken, - })), - abi: "erc20:symbol", - block, - chain, - }) - ).output; - let ibTokens = []; - symbols.forEach((p) => { - if (p.output.startsWith("ib")) { - ibTokens.push(p.input.target); - } - }); - const underlyingtoken = ( - await sdk.api.abi.multiCall({ - calls: ibTokens.map((p) => ({ - target: p, - })), - abi: abi.token, - block, - chain, - }) - ).output; - const totalToken = ( - await sdk.api.abi.multiCall({ - calls: ibTokens.map((p) => ({ - target: p, - })), - abi: abi.totalToken, - block, - chain, - }) - ).output; - const vaultDebtVal = ( - await sdk.api.abi.multiCall({ - calls: ibTokens.map((p) => ({ - target: p, - })), - abi: abi.vaultDebtVal, - block, - chain, - }) - ).output; - for (let i = 0; i < ibTokens.length; i++) { - let token = underlyingtoken[i].output.toLowerCase(); - let total = Number(totalToken[i].output); - let debt = Number(vaultDebtVal[i].output); - if (translate[token] !== undefined) { - token = translate[token]; - } else { - token = `fantom:${token}`; - } - if (!borrow) { - sdk.util.sumSingleBalance(balances, token, total - debt); - } else { - sdk.util.sumSingleBalance(balances, token, debt); - } - } - return balances; +async function calcTvl(api, borrow) { + if (borrow) return {} + const poolInfos = await api.fetchList({ lengthAbi: abi.poolLength, itemAbi: abi.poolInfo, target: meowMining}) + return api.sumTokens({ owner: meowMining, tokens: poolInfos.map(p => p.stakeToken), blacklistedTokens: [meowFtm] }) } -async function tvl(timestamp, block, chainBlocks) { - let balances = await calcTvl(chainBlocks.fantom, "fantom", false); - const lpTokens = ( - await sdk.api.abi.multiCall({ - calls: workers.map((p) => ({ - target: p, - })), - abi: abi.lpToken, - block: chainBlocks.fantom, - chain: "fantom", - }) - ).output; - const masterchefs = ( - await sdk.api.abi.multiCall({ - calls: workers.map((p) => ({ - target: p, - })), - abi: abi.masterchef, - block: chainBlocks.fantom, - chain: "fantom", - }) - ).output; - const pids = ( - await sdk.api.abi.multiCall({ - calls: workers.map((p) => ({ - target: p, - })), - abi: abi.pid, - block: chainBlocks.fantom, - chain: "fantom", - }) - ).output; - const userInfos = ( - await sdk.api.abi.multiCall({ - calls: Array.from({ length: workers.length }, (_, k) => ({ - target: masterchefs[k].output, - params: [pids[k].output, workers[k]], - })), - abi: abi.userInfo, - block: chainBlocks.fantom, - chain: "fantom", - }) - ).output; - let lpPos = []; - for (let i = 0; i < workers.length; i++) { - if (userInfos[i].output.amount === "0") continue; - lpPos.push({ - token: lpTokens[i].output, - balance: userInfos[i].output.amount, - }); - } - await unwrapUniswapLPs( - balances, - lpPos, - chainBlocks.fantom, - "fantom", - (addr) => `fantom:${addr}` - ); - return balances; +async function tvl(api) { + await calcTvl(api, false); + const lpTokens = await api.multiCall({ abi: abi.lpToken, calls: workers}) + const shares = await api.multiCall({ abi: 'uint256:totalShare', calls: workers}) + const bals = (await api.multiCall({ abi: 'function shareToBalance(uint256) view returns (uint256)', calls: lpTokens.map((lp, i) => ({ target: lp, params: shares[i] })), permitFailure: true})).map(b => b || 0) + api.add(lpTokens, bals) } -async function borrowed(timestamp, block, chainBlocks) { - return await calcTvl(chainBlocks.fantom, "fantom", true); +async function borrowed(api) { + return await calcTvl(api, true); } module.exports = { fantom: { tvl, borrowed, - pool2: pool2Exports( - meowMining, - [meowFtm], - "fantom", - (addr) => `fantom:${addr}` - ), - staking: stakingUnknownPricedLP( - meowMining, - meow, - "fantom", - meowFtm, - (addr) => `fantom:${addr}` - ), + pool2: pool2(meowMining, [meowFtm],), + staking: staking(meowMining, meow,), }, }; diff --git a/projects/merchant/index.js b/projects/merchant/index.js index 67e383e770..bfb0bcb625 100644 --- a/projects/merchant/index.js +++ b/projects/merchant/index.js @@ -1,9 +1,12 @@ const { compoundExports2 } = require("../helper/compound"); + + module.exports = { hallmarks: [ [1720051200,"Rug Pull"] ], + deadFrom: '2024-07-06', methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", merlin: { @@ -12,4 +15,8 @@ module.exports = { linea: { ...compoundExports2({ comptroller: '0xE54F37bbb8b7417EE4e0447DA0F8b922Fc7bb8Fa'}), }, -}; +} + +module.exports.merlin.borrowed = () => ({}) // bad debt +module.exports.linea.borrowed = () => ({}) // bad debt + diff --git a/projects/mercurial.js b/projects/mercurial.js index 7848842675..747ab9a663 100644 --- a/projects/mercurial.js +++ b/projects/mercurial.js @@ -99,7 +99,9 @@ async function tvl() { tokensAndOwners.push([i.tokenAMint, i.aVault]) tokensAndOwners.push([i.tokenBMint, i.bVault]) }) - return sumTokens2({ tokensAndOwners }) + const balances = await sumTokens2({ tokensAndOwners }) + delete balances['solana:AwRErBEFGTnohzfLeRSBH9HddQEy2oeRxnWLrbvFFh95'] + return balances } module.exports = { diff --git a/projects/meridian-lend/index.js b/projects/meridian-lend/index.js index df360e037e..1fe6dcc8ff 100644 --- a/projects/meridian-lend/index.js +++ b/projects/meridian-lend/index.js @@ -17,4 +17,6 @@ module.exports = { meter: v2("meter", "0x64Be9ee529E555860DA0705819138F41247e76E6"), fuse: v2("fuse", "0xbdD3d2f93cc1c6C951342C42Ef0795323CE83719"), taiko: v2("taiko", "0x8Cf3E0e7aE4eB82237d0931388EA72D5649D76e0"), + tara: v2("tara", "0x96a52CdFE64749C146E13F68641073566275433e"), + } \ No newline at end of file diff --git a/projects/meridian/index.js b/projects/meridian/index.js index 9c2d836b9f..a666c742bb 100644 --- a/projects/meridian/index.js +++ b/projects/meridian/index.js @@ -1,8 +1,10 @@ const { getLiquityTvl } = require('../helper/liquity') module.exports = { - methodology: "Deposited ETH and TLOS on the Base and Telos network", + methodology: "Deposited Collateral on Meridian Mint", base: { tvl: getLiquityTvl("0x56a901FdF67FC52e7012eb08Cfb47308490A982C") }, telos: { tvl: getLiquityTvl("0xb1F92104E1Ad5Ed84592666EfB1eB52b946E6e68") }, fuse: { tvl: getLiquityTvl("0xCD413fC3347cE295fc5DB3099839a203d8c2E6D9") }, -}; \ No newline at end of file + tara: { tvl: getLiquityTvl("0xd2ff761A55b17a4Ff811B262403C796668Ff610D") }, +}; + diff --git a/projects/merlin-l2/index.js b/projects/merlin-l2/index.js index e1958dd39a..8d2762206a 100644 --- a/projects/merlin-l2/index.js +++ b/projects/merlin-l2/index.js @@ -2,40 +2,17 @@ const ADDRESSES = require('../helper/coreAssets.json') const sdk = require('@defillama/sdk'); const { sumTokensExport: sumBRC20TokensExport } = require("../helper/chain/brc20"); const { sumTokensExport } = require('../helper/sumTokens'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') // https://medium.com/@merlinchaincrypto/merlins-seal-the-biggest-fair-launch-of-layer2-5614001b2582 // https://bridge.merlinchain.io/api/v1/token_mapping?after=0&size=100 -const owners = [ - "bc1qtu66zfqxj6pam6e0zunwnggh87f5pjr7vdr5cd", - "15zVuow5e9Zwj4nTrxSH3Rvupk32wiKEsr", - "bc1q4gfsheqz7ll2wdgfwjh2l5hhr45ytc4ekgxaex", - "bc1qua5y9yhknpysslxypd4dahagj9jamf90x4v90x", - "bc1qm64dsdz853ntzwleqsrdt5p53w75zfrtnmyzcx", - "1EEU18ZvWrbMxdXEuqdii6goDKbAbaXiA1", - "bc1qptgujmlkez7e6744yctzjgztu0st372mxs6702", - "16LDby5cWxzQqTFJrA1DDmbwABumCQHteG", - "bc1qq3c6kehun66sdek3q0wmu540n3vg0hgrekkjce", - "124SzTv3bBXZVPz2Li9ADs9oz4zCfT3VmM", - "bc1qyqt9zs42qmyf373k7yvy0t3askxd927v304xlv", - "bc1qgxdqf7837dxe8xkhvctgc499kwh5xw7ap3uwhs", // add on 25/02/2024 - "bc1pruhkl5exjt0z824cafauf750f5g08azuvgcjctv0enz5csayaj7ss3j5wc", // add on 25/02/2024 - "bc1q97vmervc8x9hzr4z4yvzn3x4rk74se6e8x8sgy", // add on 25/02/2024 - "bc1q2lzqzjcq472x8v0kgdcn4m5y8cq95ysnxm6vemu0qsuqgzyge06sqmqdal", // add on 25/02/2024 - "bc1qcmj5lkumeycyn35lxc3yr32k3fzue87yrjrna6", //nft_vault_address; - "bc1qq76dy32nnk5sha36etg6pdj94vl5zrskavux2f", // add on 12/05/2024 - "36n825H7orW1u8yWmvR4zs2CWfmkY2rkpK", // add on 12/05/2024 - "bc1p35l88j3ashhktg75tjctt6pacrgpyr93ldt7yw484dm4expq073qk4n0a0", // add on 12/05/2024 - "bc1pahkqca39mfcfay7nueczyhn9v8wq96x7mp4pjxpsdpsnurxzuwuqnhsdg3", // this wallet was provide by merlin team chain on the 14/08/2024 - "1A7oMBdQir24ESgk8LDccM4MUKJx6d2mCw" // this wallet was provide by merlin team chain on the 14/08/2024 -] - module.exports = { methodology: "Staking tokens via BitStable counts as TVL", bitcoin: { tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners }), - sumBRC20TokensExport({ owners }), + sumTokensExport({ owners: bitcoinAddressBook.merlin }), + sumBRC20TokensExport({ owners: bitcoinAddressBook.merlin }), ]), }, ethereum: { diff --git a/projects/merlin/index.js b/projects/merlin/index.js index 26f8863233..b01220edea 100644 --- a/projects/merlin/index.js +++ b/projects/merlin/index.js @@ -1,9 +1,10 @@ module.exports = { - start: 1682899200, + start: '2023-05-01', era: { tvl: () => 0, }, hallmarks: [ [Math.floor(new Date('2023-04-26')/1e3), 'Project Rugged!'], ], + deadFrom: Math.floor(new Date('2023-04-26')/1e3) }; diff --git a/projects/mero/index.js b/projects/mero/index.js index 05888cb2f9..b4c184a157 100644 --- a/projects/mero/index.js +++ b/projects/mero/index.js @@ -1,52 +1,15 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const { createIncrementArray } = require('../helper/utils') - - -const chain = "ethereum" const addressProviders = [ '0x139c15e21b0f6e43fc397face5de5b7d5ae6874a', '0xa298d39715AE492e4CAF3Ccb33cBF57abC5238d7', ] -async function tvl(timestamp, block) { - const balances = {} - const { output: vaultCounts } = await sdk.api.abi.multiCall({ - calls: addressProviders.map(i => ({ target: i })), - abi: abi.poolsCount, - chain, block, - }) - const vaultCallsList = [] - vaultCounts.forEach((j, idx) => { - createIncrementArray(j.output).forEach(i => vaultCallsList.push({ params: i, target: addressProviders[idx] })) - }) - - const { output: vaultsOut } = await sdk.api.abi.multiCall({ - abi: abi.getPoolAtIndex, - calls: vaultCallsList, - chain, block, - }) - - const strategies = vaultsOut.map(i => i.output) - - const { output: tokens } = await sdk.api.abi.multiCall({ - abi: abi.getUnderlying, - calls: strategies.map(i => ({ target: i })), - chain, block, - }) - - const { output: deposits } = await sdk.api.abi.multiCall({ - abi: abi.totalUnderlying, - calls: strategies.map(i => ({ target: i })), - chain, block, - }) - - tokens.forEach((data, i) => { - sdk.util.sumSingleBalance(balances, data.output, deposits[i].output) - }) - - return balances +async function tvl(api) { + const strategies = await api.fetchList({ lengthAbi: abi.poolsCount, itemAbi: abi.getPoolAtIndex, calls: addressProviders}) + const tokens = await api.multiCall({ abi: abi.getUnderlying, calls: strategies}) + const deposits = await api.multiCall({ abi: abi.totalUnderlying, calls: strategies}) + api.add(tokens, deposits) } module.exports = { diff --git a/projects/meso-finance/index.js b/projects/meso-finance/index.js index 1afc27b178..dcf145f8b0 100644 --- a/projects/meso-finance/index.js +++ b/projects/meso-finance/index.js @@ -20,12 +20,12 @@ function getPoolData() { async function getPoolAddresses() { const pools = await function_view({ functionStr: "0x68476f9d437e3f32fd262ba898b5e3ee0a23a1d586a6cf29a28add35f253f6f7::meso::pools" }) - return pools[0]['data'].map(obj => { return { coin: obj.key, poolAddress: obj.value.inner } }) + return pools['data'].map(obj => { return { coin: obj.key, poolAddress: obj.value.inner } }) } async function getPoolInfo(pool) { - const poolInfo = await function_view({ functionStr: "0x68476f9d437e3f32fd262ba898b5e3ee0a23a1d586a6cf29a28add35f253f6f7::lending_pool::pool_info", type_arguments: [], args: [pool.poolAddress] }) - return { coin: pool.coin, poolSupply: poolInfo[0].total_reserves, totalDebt: poolInfo[0].total_debt } + const [poolInfo] = await function_view({ functionStr: "0x68476f9d437e3f32fd262ba898b5e3ee0a23a1d586a6cf29a28add35f253f6f7::lending_pool::pool_info", args: [pool.poolAddress] }) + return { coin: pool.coin, poolSupply: poolInfo.total_reserves, totalDebt: poolInfo.total_debt } } } diff --git a/projects/metapoly/index.js b/projects/metapoly/index.js index 9db34bbe92..fd16f28d7d 100644 --- a/projects/metapoly/index.js +++ b/projects/metapoly/index.js @@ -1,7 +1,4 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const { sumTokens2 } = require('../helper/unwrapLPs') -const { getChainTransform } = require('../helper/portedTokens') const config = { kava: { @@ -17,59 +14,18 @@ const config = { }; module.exports = { - misrepresentedTokens: true, + deadFrom: '2023-07-21', methodology: "We use the totalSupply() method which includes the interest accrued on the deposited USDC.", }; Object.keys(config).forEach((chain) => { module.exports[chain] = { - tvl: async (_, _b, { [chain]: block }) => { + tvl: async (api) => { const vaults = Object.values(config[chain].vaults); - const tokensAndOwners = [] - const { output: underlyingAssets } = await sdk.api.abi.multiCall({ - abi: abi.UNDERLYING_ASSET_ADDRESS, - calls: vaults.map((i) => ({ target: i })), - chain, - block, - }); - underlyingAssets.forEach(i => tokensAndOwners.push([i.output, i.input.target])) - return sumTokens2({ chain, block, tokensAndOwners }) - }, - borrowed: async (_, _b, { [chain]: block }) => { - const vaults = Object.values(config[chain].vaults); - const [ - { output: decimals }, - { output: tokenBalances }, - { output: underlyingAssets }, - ] = await Promise.all([ - 'erc20:decimals', - abi.totalSupply, - abi.UNDERLYING_ASSET_ADDRESS - ].map(abi => sdk.api.abi.multiCall({ abi, calls: vaults.map((i) => ({ target: i })), chain, block, }))) - - const { output: underlyingDecimals } = await sdk.api.abi.multiCall({ - abi: 'erc20:decimals', - calls: underlyingAssets.map((i) => ({ target: i.output })), - chain, - block, - }); - const { output: underlyingBalances } = await sdk.api.abi.multiCall({ - abi: 'erc20:balanceOf', - calls: underlyingAssets.map((i, j) => ({ target: i.output, params: vaults[j] })), - chain, - block, - }); - const transformAddress = await getChainTransform(chain) - const balances = {} - tokenBalances.forEach(({ output: total }, i) => { - const token = transformAddress(underlyingAssets[i].output) - const decimalChange = underlyingDecimals[i].output - decimals[i].output - const amountInPool = underlyingBalances[i].output - const debt = (total * (10 ** decimalChange)) - amountInPool - if (debt > 0) sdk.util.sumSingleBalance(balances, token, Number(debt).toFixed(0)) - }) - return balances; + const tokens = await api.multiCall({ abi: abi.UNDERLYING_ASSET_ADDRESS, calls: vaults}) + return api.sumTokens({ tokensAndOwners2: [tokens, vaults]}) }, + borrowed: () => ({}), }; }); diff --git a/projects/metapool.js b/projects/metapool.js index 92d45bdc3e..6a4680ac69 100644 --- a/projects/metapool.js +++ b/projects/metapool.js @@ -1,9 +1,8 @@ -const utils = require('./helper/utils'); +const utils = require('./helper/utils') const ADDRESSES = require('./helper/coreAssets.json') -const sdk = require("@defillama/sdk") async function tvl() { - const totalTvl = await utils.fetchURL('http://validators.narwallets.com:7000/metrics_json') + const totalTvl = await utils.fetchURL('http://validators.narwallets.com:7000/metrics_json') return { near: totalTvl.data.tvl @@ -11,11 +10,12 @@ async function tvl() { } module.exports = { - methodology: 'TVL counts the NEAR tokens that are staked.', - near: { tvl, }, - aurora: { - tvl: async (_, block, chainBlocks) => ({ - ["aurora:" + ADDRESSES.aurora.AURORA]: (await sdk.api.erc20.totalSupply({ target: "0xb01d35D469703c6dc5B369A1fDfD7D6009cA397F", chain:"aurora", block: chainBlocks.aurora})).output - }) + methodology: 'TVL counts the NEAR tokens that are staked.', + near: { tvl, }, + aurora: { + tvl: async (api) => { + const totalSupply = await api.call({ abi: 'erc20:totalSupply', target: '0xb01d35D469703c6dc5B369A1fDfD7D6009cA397F' }) + api.add(ADDRESSES.aurora.AURORA ,totalSupply) } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/projects/metastreet-v2/index.js b/projects/metastreet-v2/index.js index d8c8c0c05d..67291bb756 100644 --- a/projects/metastreet-v2/index.js +++ b/projects/metastreet-v2/index.js @@ -70,5 +70,4 @@ module.exports = { }, methodology: "TVL is calculated by summing the value of token balances and NFTs across all MetaStreet pools. Total borrowed is calculated by subtracting the tokens available from the total value of all liquidity nodes across all pools.", - start: 17497132, // Block number of PoolFactory creation }; diff --git a/projects/metastreet/index.js b/projects/metastreet/index.js index 7c0b8877d8..46ca4656ae 100644 --- a/projects/metastreet/index.js +++ b/projects/metastreet/index.js @@ -90,5 +90,4 @@ module.exports = { borrowed: getMetaStreetTVL(true), }, methodology: 'TVL is calculated by getting the ERC20 balance of each vault, which counts tokens deposited into contracts for earning yield but not the value of any NFT loan note collateral the vault has purchased. Borrowed tokens are also not counted towards TVL.', - start: 14878205 }; \ No newline at end of file diff --git a/projects/metavault-amm-v2/index.js b/projects/metavault-amm-v2/index.js new file mode 100644 index 0000000000..7245d4eaef --- /dev/null +++ b/projects/metavault-amm-v2/index.js @@ -0,0 +1,7 @@ + +const { uniTvlExports } = require("../helper/unknownTokens"); + +module.exports = uniTvlExports({ + scroll: '0xCc570Ec20eCB62cd9589FA33724514BDBc98DC7E', + linea: '0xCc570Ec20eCB62cd9589FA33724514BDBc98DC7E', +}) diff --git a/projects/metavault.trade/index.js b/projects/metavault.trade/index.js index fa7420216d..9fc38e2375 100644 --- a/projects/metavault.trade/index.js +++ b/projects/metavault.trade/index.js @@ -1,36 +1,19 @@ -const sdk = require("@defillama/sdk") const abi = require('./abi') const { staking } = require("../helper/staking"); -const { sumTokens } = require('../helper/unwrapLPs') -// Polygon const polygonVault = "0x32848E2d3aeCFA7364595609FB050A301050A6B4"; const polygonStaking = "0xE8e2E78D8cA52f238CAf69f020fA961f8A7632e9"; // Staked MVX, sMVX const polygonMVX = "0x2760e46d9bb43dafcbecaad1f64b93207f9f0ed7"; -const chain= 'polygon' +const polygonMvxVester = "0x543e07eb4a260e10310fbcf2403e97c762a8db0b" // New Vester -const polygonTVL = async (timestamp, _block, { [chain]: block}) => { - const calls = [] - const { output: size } = await sdk.api.abi.call({ - target: polygonVault, - abi: abi.allWhitelistedTokensLength, - chain, block, - }) - for (let i = 0;i < +size; i++) - calls.push({params: i}) - const { output: tokens } = await sdk.api.abi.multiCall({ - target: polygonVault, - abi: abi.allWhitelistedTokens, - calls, - chain, block, - }) - const toa = tokens.map(i => [i.output, polygonVault]) - return sumTokens({}, toa, block, chain) +const polygonTVL = async (api) => { + const tokens = await api.fetchList({ lengthAbi: abi.allWhitelistedTokensLength, itemAbi: abi.allWhitelistedTokens, target: polygonVault}) + return api.sumTokens({ tokens, owner: polygonVault }) }; module.exports = { polygon: { - staking: staking(polygonStaking, polygonMVX), + staking: staking([polygonStaking, polygonMvxVester], polygonMVX, ), tvl: polygonTVL, }, }; \ No newline at end of file diff --git a/projects/metavault/index.js b/projects/metavault/index.js index d4f00986ca..49b59edd41 100644 --- a/projects/metavault/index.js +++ b/projects/metavault/index.js @@ -1,16 +1,13 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const readerAbi = require("./reader.json"); const mvlpManagerAbi = require("./mvlpManager.json"); const { staking } = require("../helper/staking"); -const { sumTokens2 } = require('../helper/unwrapLPs'); -const { default: BigNumber } = require("bignumber.js"); +const { sumTokensExport } = require('../helper/unwrapLPs'); const DAI_ADDRESS = ADDRESSES.ethereum.DAI; const USDC_ADDRESS = ADDRESSES.ethereum.USDC; const MVLP_ADDRESS = "0x9F4f8bc00F48663B7C204c96b932C29ccc43A2E8"; -const MVLP_DECIMALS = 18; const REDEEM_CONTRACT = "0xd15C4677A81Ac9d744a01ecaAad684E6d296b8f3"; const GOV_CLUB_CONTRACT = "0x12fc8b560925166c39E85c70E9fD4058Ca9e11c9"; @@ -23,65 +20,41 @@ const READER_CONTRACT = "0x01dd8B434A83cbdDFa24f2ef1fe2D6920ca03734"; // getToke const stakingAddress = "0x42162457006DB4DA3a7af5B53DFee5A891243b4D"; // Governance Staking const stakingTokenAddress = "0x788B6D2B37Aa51D916F2837Ae25b05f0e61339d1"; // MVD -const ADDRESS_ZERO = ADDRESSES.null; -async function getTvl(timestamp, block) { - const toa = [ - [DAI_ADDRESS, REDEEM_CONTRACT,], - [USDC_ADDRESS, GOV_CLUB_CONTRACT,], - ] +const mvdStakingAddressArbitrum = "0xFA69292726A53d62111c9485C03ac551Ba05679b"; // gMVD Staking +const mvdTokenAddressArbitrum = "0x15a808ed3846D25e88AE868DE79F1bcB1Ac382B5"; // MVD - return sumTokens2({ tokensAndOwners: toa, block }) -} +const ADDRESS_ZERO = ADDRESSES.null; -async function polygon(_, _b, { polygon: block }) { - const chain = 'polygon' +async function polygon(api) { // Metavault DAO MVLP Holdings - const aums = ( - await sdk.api.abi.call({ - target: MVLP_MANAGER_CONTRACT, - abi: mvlpManagerAbi.getAums, - chain, block, - }) - ).output; - - const averageAums = (+aums[0] + +aums[1]) / 2 - - const supplies = ( - await sdk.api.abi.call({ - target: READER_CONTRACT, - params: [ADDRESS_ZERO, [MVLP_ADDRESS]], - chain, block, - abi: readerAbi.getTokenBalancesWithSupplies, - }) - ).output; - + const aums = await api.call({ target: MVLP_MANAGER_CONTRACT, abi: mvlpManagerAbi.getAums, }) + const supplies = await api.call({ target: READER_CONTRACT, params: [ADDRESS_ZERO, [MVLP_ADDRESS]], abi: readerAbi.getTokenBalancesWithSupplies, }) + const metavaultDaoMvlpHoldings = await api.call({ abi: 'erc20:balanceOf', target: MVLP_TRACKER_CONTRACT, params: MVD_DAO_MULTI_SIG_WALLET, }) + const mvlpSupply = supplies[1]; - + const averageAums = (+aums[0] + +aums[1]) / 2 const mvlpPrice = averageAums / mvlpSupply - - const metavaultDaoMvlpHoldings = ( - await sdk.api.erc20.balanceOf({ - chain, block, - target: MVLP_TRACKER_CONTRACT, - owner: MVD_DAO_MULTI_SIG_WALLET, - }) - ).output; - - const daoMvlpHoldingsValue = metavaultDaoMvlpHoldings * mvlpPrice; - - const sum = BigNumber(daoMvlpHoldingsValue / 1e24).toFixed(0); - - return { - [USDC_ADDRESS]: sum, - }; + const daoMvlpHoldingsValue = metavaultDaoMvlpHoldings * mvlpPrice / 1e30 + api.addUSDValue(daoMvlpHoldingsValue) } module.exports = { + hallmarks: [ + [1676592000, "Launch on Arbitrum"] + ], misrepresentedTokens: true, + arbitrum: { + staking: staking(mvdStakingAddressArbitrum, mvdTokenAddressArbitrum,), + }, ethereum: { - tvl: getTvl, + tvl: sumTokensExport({ + tokensAndOwners: [ + [DAI_ADDRESS, REDEEM_CONTRACT,], + [USDC_ADDRESS, GOV_CLUB_CONTRACT,], + ] + }), staking: staking(stakingAddress, stakingTokenAddress,), }, polygon: { diff --git a/projects/metf-finance/index.js b/projects/metf-finance/index.js index 5347c8b59c..18295b7d6b 100644 --- a/projects/metf-finance/index.js +++ b/projects/metf-finance/index.js @@ -1,116 +1,10 @@ -const abi = 'function balanceOf(address token) view returns (uint256)' -const pairPrice = 'function getPairPrice(address pair, uint256 amount) view returns (uint256 valueInMMF, uint256 valueInUSD)'; -const valueOfAsset = 'function valueOfAsset(address asset, uint256 amount) view returns (uint256 valueInCRO, uint256 valueInUSD)' -const sdk = require("@defillama/sdk"); -const BigNumber = require("bignumber.js"); -const { pool2 } = require('../helper/pool2') - -const treasury = "0xE25737b093626233877EC0777755c5c4081580be" -const MMF_METF_BOND = "0x127966303484140EF3692C49CfF154eaAe50cEe3" -const calculator = "0xa2B417088D63400d211A4D5EB3C4C5363f834764" - -const ZERO = new BigNumber(0); -const ETHER = new BigNumber(10).pow(18); - -const tokens = ["0x97749c9B61F878a880DfE312d2594AE07AEd7656", - "0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23", - "0x50c0C5bda591bc7e89A342A3eD672FB59b3C46a7"] - -const LPs = ["0xbA452A1c0875D33a440259B1ea4DcA8f5d86D9Ae", - "0xB6E1705BfAFcf1efEE83C135C0F0210653bAB8F0", - // "0xd7385f46FFb877d8c8Fe78E5f5a7c6b2F18C05A7", //moved to pool2 -] - - -async function newTVL(timestamp, block, chainBlocks) { - block = chainBlocks.cronos - const balances = {} - const prices = {} - - let data = await sdk.api.abi.multiCall({ - calls: LPs.map((address) => ({ - target: MMF_METF_BOND, - params: [address, ETHER.toString()], - })), - block, - abi: pairPrice, - chain: "cronos", - }); - - data.output.forEach((call) => { - let value = call && call.output && new BigNumber(call.output.valueInUSD); - if (value) { - prices[call.input.params[0]] = value.dividedBy(ETHER); - } - }); - - let data3 = await sdk.api.abi.multiCall({ - calls: tokens.map((address) => ({ - target: calculator, - params: [address, ETHER.toString()], - })), - block, - abi: valueOfAsset, - chain: "cronos", - }); - data3.output.forEach((call) => { - let value = call && call.output && new BigNumber(call.output.valueInUSD); - if (value) { - prices[call.input.params[0]] = value.dividedBy(ETHER); - } - }); - - - let data2 = await sdk.api.abi.multiCall({ - calls: [...tokens, ...LPs].map((address) => ({ - target: treasury, - params: address, - })), - block, - abi: abi, - chain: "cronos", - }) - - data2.output.forEach((call) => { - let value = call && call.output && new BigNumber(call.output); - if (value) { - if (prices[call.input.params[0]]) { - balances[`cronos:${call.input.params[0]}`] = value.dividedBy(ETHER).multipliedBy(prices[call.input.params[0]]) - } else { - balances[`cronos:${call.input.params[0]}`] = value.dividedBy(ETHER) - } - } - }); - - let tvlall = Object.values(balances).reduce((tvl, bn) => { - return tvl.plus(bn) - }, ZERO) - - return { - tether: tvlall.toNumber(), - }; -} - -async function staking(timestamp, block, chainBlocks) { - block = chainBlocks.cronos - const staked = (await sdk.api.abi.call({ - target: "0xb8df27c687c6af9afe845a2afad2d01e199f4878", - params: "0x1A6aD4bac521a98556A4C0Da5946654c5DC7Ce0A", // masterchef - abi: 'erc20:balanceOf', - block: block, - chain: 'cronos' - })).output - const balances = { - ["cronos:0xb8df27c687c6af9afe845a2afad2d01e199f4878"]: staked - } - return balances -} - +const { pool2 } = require('../helper/pool2'); +const { staking } = require("../helper/staking"); module.exports = { cronos: { - tvl: newTVL, - staking: staking, + tvl: () => ({}), // tvl is 0 for ohm forks + staking: staking('0x1A6aD4bac521a98556A4C0Da5946654c5DC7Ce0A', '0xb8df27c687c6af9afe845a2afad2d01e199f4878'), pool2: pool2("0xE25737b093626233877EC0777755c5c4081580be", "0xd7385f46FFb877d8c8Fe78E5f5a7c6b2F18C05A7") } } \ No newline at end of file diff --git a/projects/methlab-xyz/index.js b/projects/methlab-xyz/index.js index 4867d11164..12dffbc60e 100644 --- a/projects/methlab-xyz/index.js +++ b/projects/methlab-xyz/index.js @@ -1,48 +1,38 @@ -const { getLogs } = require('../helper/cache/getLogs') +const { getLogs2 } = require('../helper/cache/getLogs') const { mergeExports } = require('../helper/utils') const { uniV3Export } = require('../helper/uniswapV3') + + +const abi = { + evt_Strategy: 'event StrategyStatusChange (address indexed strategy, bool status)', + evt_VaultAdded: 'event VaultAdded (address indexed vault)', + evt_LoanAdded: 'event LoanAdded (address indexed vault, address indexed loan, address loanImplUsed)', + strategy_collToken: 'address:collToken', + strategy_borrowToken: 'address:borrowToken' +} + const config = { - mantle: { - factories: [{ target: '0x6Cc0c2D8F9533dFd2276337DdEaBBCEE9dd0747F', fromBlock: 51253051 },], - } + mantle: { factory: '0xB375DfF90F8dafeA50E2EA7a0666B426Ed786C5D', fromBlock: 69177970 } } Object.keys(config).forEach(chain => { - const { factories } = config[chain] + const { factory, fromBlock } = config[chain]; + module.exports[chain] = { tvl: async (api) => { - const vaults = [] - for (const { target, fromBlock, } of factories) { - const logs = await getLogs({ api, target, fromBlock, onlyArgs: true, eventAbi: 'event VaultAdded (address indexed vault)' }) - vaults.push(...logs.map(log => log.vault)) - } - const counters = await api.multiCall({ abi: abi.collectionCounter, calls: vaults }) - const callOwners = [] - const calls = [] - for (let i = 0; i < vaults.length; i++) { - const counter = counters[i] - for (let j = 0; j < +counter; j++) { - calls.push({ target: vaults[i], params: j }) - callOwners.push(vaults[i]) - } - } - const results = await api.multiCall({ abi: abi.collection, calls }) - const tokenSet = new Set() - results.forEach((result, i) => { - tokenSet.add(result.collToken) - tokenSet.add(result.borrowToken) - // tokensAndOwners.push([result.collToken, callOwners[i]]) - // tokensAndOwners.push([result.borrowToken, callOwners[i]]) - }) - return api.sumTokens({ owners: vaults, tokens: Array.from(tokenSet), blacklistedTokens: ['0x401307732d732dd3b05ac1138b8661c0f55830ea'] }) + const logArgs = { api, target: factory, fromBlock }; + + const strategies = (await getLogs2({ ...logArgs, eventAbi: abi.evt_Strategy, extraKey: 'strategy' })).map(log => log.strategy); + const vaults = (await getLogs2({ ...logArgs, eventAbi: abi.evt_VaultAdded, extraKey: 'vault' })).map(log => log.vault); + const loans = (await getLogs2({ ...logArgs, eventAbi: abi.evt_LoanAdded, extraKey: 'loan' })).map(log => log.loan); + + const collTokens = await api.multiCall({ abi: abi.strategy_collToken, calls: strategies }); + const borrowTokens = await api.multiCall({ abi: abi.strategy_borrowToken, calls: strategies }); + const tokens = collTokens.concat(borrowTokens) + return api.sumTokens({ tokens, owners: loans.concat(vaults), blacklistedTokens: ['0x401307732d732dd3b05ac1138b8661c0f55830ea'] }); } } -}) - -const abi = { - "collection": "function collection(uint256 collectionId) view returns ((address collToken, address borrowToken, uint256 minSingleLoanAmt, uint256 maxSingleLoanAmt, uint256 expiresAt, bool isEnabled, (uint256 strikePrice, uint256 interestRate, uint256 duration)[] intents))", - "collectionCounter": "uint256:collectionCounter", -} +}); module.exports = mergeExports([ module.exports, diff --git a/projects/metronome-synth/index.js b/projects/metronome-synth/index.js index b8c57da684..490198487d 100644 --- a/projects/metronome-synth/index.js +++ b/projects/metronome-synth/index.js @@ -34,5 +34,17 @@ module.exports = { "0x539505dde2b9771debe0898a84441c5e7fdf6bc0", ] }), + }, + base: { + tvl: sumTokensExport({ + owner: '0xAeDF96597338FE03E8c07a1077A296df5422320e', + tokens: [ + ADDRESSES.base.USDC, + ADDRESSES.base.WETH, + "0x1e41238aCd3A9fF90b0DCB9ea96Cf45F104e09Ef", + "0x82562507429876486B60AF4F32390ef0947b3d13", + "0x46fb68Eb2b1Fc43654AbaE5691D39D18D933E4b4", + ] + }), } } diff --git a/projects/metronome/index.js b/projects/metronome/index.js index 93f566c8cf..13da3f99cb 100644 --- a/projects/metronome/index.js +++ b/projects/metronome/index.js @@ -5,7 +5,7 @@ const met = '0x2Ebd53d035150f328bd754D6DC66B99B0eDB89aa'; const proceeds = '0x68c4b7d05fae45bcb6192bb93e246c77e98360e1'; module.exports = { - start: 1527076766, // block 5659904 + start: '2018-05-23', // block 5659904 hallmarks: [ [1661257318,"Metronome V1 Sunset"] ], diff --git a/projects/metropolis-exchange-amm/index.js b/projects/metropolis-exchange-amm/index.js new file mode 100644 index 0000000000..fc730ab69c --- /dev/null +++ b/projects/metropolis-exchange-amm/index.js @@ -0,0 +1,5 @@ +const { uniTvlExports } = require('../helper/unknownTokens'); + +module.exports = uniTvlExports({ + sonic: '0x1570300e9cFEC66c9Fb0C8bc14366C86EB170Ad0', +}) diff --git a/projects/metropolis-exchange-dlmm/index.js b/projects/metropolis-exchange-dlmm/index.js new file mode 100644 index 0000000000..32d2b584c8 --- /dev/null +++ b/projects/metropolis-exchange-dlmm/index.js @@ -0,0 +1,5 @@ +const { joeV2Export } = require('../helper/traderJoeV2') + +module.exports = joeV2Export({ + sonic: '0x39D966c1BaFe7D3F1F53dA4845805E15f7D6EE43' +}) diff --git a/projects/mew-fi/index.js b/projects/mew-fi/index.js new file mode 100644 index 0000000000..84a0098e8e --- /dev/null +++ b/projects/mew-fi/index.js @@ -0,0 +1,9 @@ +const { sumTokensExport } = require('../helper/chain/ergo') + +module.exports = { + timetravel: false, + ergo: { + tvl: () => ({}), + staking: sumTokensExport({ owner: '2Czxg7U54ZyGMzjt35EYX9g98H9UjFqteuYWX5CSgGCYWAjg1ng2jgm4BHjA6u1Azeo7EYQsBMVLbhRreNASJu54ho', }) + } +} diff --git a/projects/mexc-cex/index.js b/projects/mexc-cex/index.js index 9c9323c29d..88110da6ad 100644 --- a/projects/mexc-cex/index.js +++ b/projects/mexc-cex/index.js @@ -1,10 +1,9 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { bitcoin: { - owners: [ - "13uZyaPbt4rTwYQ8xWFySVUzWH3pk2P5c7" - ], + owners: bitcoinAddressBook.mexcCex, }, ethereum:{ owners: [ @@ -38,6 +37,11 @@ const config = { owners:[ "0xdf90c9b995a3b10a5b8570a47101e6c6a29eb945", ] + }, + starknet: { + owners:[ + "0x069a7818562b608ce8c5d0039e7f6d1c6ee55f36978f633b151858d85c022d2f", + ] } } diff --git a/projects/microcreditproject/index.js b/projects/microcreditproject/index.js new file mode 100644 index 0000000000..6399d79c0a --- /dev/null +++ b/projects/microcreditproject/index.js @@ -0,0 +1,19 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs') + +const TOKENS = [ + ADDRESSES.functionx.WFX, + ADDRESSES.islm.USDC, +] + +const INVESTMENT_CONTRACT = '0x951d1571C75C519Cc3D09b6B71595C6aCe1c06dB' +const PROFIT_SHARE_CONTRACT = '0x165D74d2DEFe37794371eB63c63999ab5620DBfB' + +module.exports = { + islm: { + tvl: sumTokensExport({ + owners: [INVESTMENT_CONTRACT, PROFIT_SHARE_CONTRACT], + tokens: TOKENS + }), + }, +} diff --git a/projects/microswap/index.js b/projects/microswap/index.js new file mode 100644 index 0000000000..7ab543aad1 --- /dev/null +++ b/projects/microswap/index.js @@ -0,0 +1,22 @@ +const { yieldHelper } = require("../helper/yieldHelper"); + +const abis = { + name: "string:name", + wantLockedTotal: "uint256:wantLockedTotal", + poolInfo: "function poolInfo(uint256) view returns (address want, uint256 allocPoint, uint256 lastRewardTime, address strategy, uint256 earlyWithdrawFee, uint256 earlyWithdrawTime)", +} + +async function getTokenBalances ({ api, poolInfos, }) { + const strategies = poolInfos.map(i => i.strategy) + return api.multiCall({ abi: abis.wantLockedTotal, calls: strategies }) +} + +module.exports = yieldHelper({ + project: 'microswap', + chain: 'cronos_zkevm', + masterchef: '0x19A497E9c034c0D66952366F46f0e4e8b27465a8', + nativeToken: '', + abis, + getTokens: ({ poolInfos, }) => poolInfos.map(i => i.want), + getTokenBalances, +}) diff --git a/projects/midas-capital/index.js b/projects/midas-capital/index.js index eb015c39e4..817abd45a0 100644 --- a/projects/midas-capital/index.js +++ b/projects/midas-capital/index.js @@ -1,10 +1,10 @@ const sdk = require("@defillama/sdk"); -const { compoundExportsWithAsyncTransform } = require("../helper/compound"); +const { compoundExports2 } = require("../helper/compound"); module.exports = { hallmarks: [ - [Math.floor(new Date('2023-06-17')/1e3), 'Protocol was exploited for $600k'], + [Math.floor(new Date('2023-06-17') / 1e3), 'Protocol was exploited for $600k'], ] } @@ -55,39 +55,10 @@ const pools = { function getTvl(chain) { const config = pools[chain] ?? { pools: [] }; - const tvls = config.pools.map((pool) => - compoundExportsWithAsyncTransform(pool, chain, undefined, undefined, { resolveLPs: true }) - ); - let _tvl = sdk.util.sumChainTvls(tvls.map((t) => t.tvl)) - let _borrowed = sdk.util.sumChainTvls(tvls.map((t) => t.borrowed)) - let tvl = _tvl - let borrowed = _borrowed - if (chain === "bsc") { - tvl = resolveHypervisor(_tvl) - borrowed = resolveHypervisor(_borrowed) - } - return { tvl, borrowed }; + const tvls = config.pools.map((comptroller) => compoundExports2({ comptroller })); + let tvl = sdk.util.sumChainTvls(tvls.map((t) => t.tvl)) + let borrowed = sdk.util.sumChainTvls(tvls.map((t) => t.borrowed)) + return { tvl, borrowed } } Object.keys(pools).forEach(chain => module.exports[chain] = getTvl(chain)) - -function resolveHypervisor(tvlFunc) { - return async (...args) => { - const { api } = args[3] - const balances = await tvlFunc(...args) - let bscTokens = Object.keys(balances).filter(t => t.startsWith('bsc:')).map(t => t.slice(4)) - const res = await api.multiCall({ abi: 'function getTotalAmounts() view returns (uint256,uint256)', calls: bscTokens, permitFailure: true }) - const hyperVisorTokens = bscTokens.filter((t, i) => res[i]) - const totalAmounts = res.filter(i => i) - const token0s = await api.multiCall({ abi: 'address:token0', calls: hyperVisorTokens, }) - const token1s = await api.multiCall({ abi: 'address:token1', calls: hyperVisorTokens, }) - const totalSupplies = await api.multiCall({ abi: 'function totalSupply() returns (uint256)', calls: hyperVisorTokens, }) - hyperVisorTokens.forEach((token, i) => { - const bal = balances[`bsc:${token}`] / totalSupplies[i] - delete balances[`bsc:${token}`] - sdk.util.sumSingleBalance(balances, token0s[i], totalAmounts[i][0] * bal, api.chain) - sdk.util.sumSingleBalance(balances, token1s[i], totalAmounts[i][1] * bal, api.chain) - }) - return balances - } -} \ No newline at end of file diff --git a/projects/midas/index.js b/projects/midas/index.js index bf220ae80c..af5e0aa3b6 100644 --- a/projects/midas/index.js +++ b/projects/midas/index.js @@ -1,18 +1,25 @@ -async function tvl(api) { - const MTBILL_TOKEN_CONTRACT = "0xDD629E5241CbC5919847783e6C96B2De4754e438"; - const mtbillSupply = await await api.call({ abi: "erc20:totalSupply", target: MTBILL_TOKEN_CONTRACT, }); - - const rate = await api.call({ - target: "0x32d1463EB53b73C095625719Afa544D5426354cB", // IB01/USD - abi: "function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)", - }); - api.addCGToken('tether', (mtbillSupply / 1e18) * (rate.answer / 1e8)) +const config = { + ethereum: { + mTBILL: '0xDD629E5241CbC5919847783e6C96B2De4754e438', + mBASIS: '0x2a8c22E3b10036f3AEF5875d04f8441d4188b656', + mBTC: '0x007115416AB6c266329a03B09a8aa39aC2eF7d9d' + }, + base: { + mTBILL: '0xDD629E5241CbC5919847783e6C96B2De4754e438', + mBASIS: '0x1C2757c1FeF1038428b5bEF062495ce94BBe92b2', + }, + sapphire: { + mTBILL: '0xDD629E5241CbC5919847783e6C96B2De4754e438', + } } -const chains = ["ethereum"]; +async function tvl(api) { + const tokens = Object.values(config[api.chain]) + const bals = await api.multiCall({ abi: 'uint256:totalSupply', calls: tokens}) + api.add(tokens, bals) +} -chains.forEach((chain) => { - module.exports[chain] = { tvl }; -}); -module.exports.misrepresentedTokens = true \ No newline at end of file +Object.keys(config).forEach((chain) => { + module.exports[chain] = { tvl } +}) \ No newline at end of file diff --git a/projects/milkomeda-djed/config.json b/projects/milkomeda-djed/config.json deleted file mode 100644 index b7e39bcf85..0000000000 --- a/projects/milkomeda-djed/config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "djedAddress": { - "milkomeda": "0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76", - "milkomeda_a1": "0x..." - }, - "reserveTokenAddress": { - "milkomeda": "0xAE83571000aF4499798d1e3b0fA0070EB3A3E3F9", - "milkomeda_a1": "0x..." - } - } \ No newline at end of file diff --git a/projects/milkomeda-djed/index.js b/projects/milkomeda-djed/index.js index c1ed78e7b8..105dc0cfa6 100644 --- a/projects/milkomeda-djed/index.js +++ b/projects/milkomeda-djed/index.js @@ -1,24 +1,14 @@ -const sdk = require('@defillama/sdk'); -const { transformBalances } = require('../helper/portedTokens'); - +const ADDRESSES = require('../helper/coreAssets.json') const abi = require('./abi.json'); -const config = require("./config.json"); - -async function tvl(chain, chainBlocks) { - const balances = {}; - - const reserve = (await sdk.api.abi.call({ - abi: abi.Djed.reserve, chain: chain, target: config.djedAddress[chain], params: [ 0 ], block: chainBlocks[chain], - })).output; - sdk.util.sumSingleBalance(balances, config.reserveTokenAddress[chain], reserve); // Using WADA address instead of mADA - return transformBalances(chain, balances); +async function tvl(api) { + const reserve = await api.call({ abi: abi.Djed.reserve, target:'0x67A30B399F5Ed499C1a6Bc0358FA6e42Ea4BCe76', params: 0 }) + api.add(ADDRESSES.milkomeda.WADA, reserve); // Using WADA address instead of mADA } module.exports = { methodology: 'The TVL of each Djed deployment on Milkomeda C1.', milkomeda: { - start: 10440400, - tvl: (timestamp, block, chainBlocks) => tvl('milkomeda', chainBlocks) + tvl, }, }; diff --git a/projects/milkyway/index.js b/projects/milkyway/index.js index 369279adf4..f88570fc88 100644 --- a/projects/milkyway/index.js +++ b/projects/milkyway/index.js @@ -1,7 +1,10 @@ const { compoundExports } = require("../helper/compound"); module.exports = { + deadFrom: '2023-12-15', timetravel: false, // milkomeda api's for staked coins can't be queried at historical points - start: 1599552000, // 09/08/2020 @ 8:00am (UTC) - milkomeda: compoundExports("0x0Dd4E2B7E0E8a2Cd1258a9023D3a5062381554Cf", "milkomeda"), + start: '2020-09-08', // 09/08/2020 @ 8:00am (UTC) + milkomeda: compoundExports("0x0Dd4E2B7E0E8a2Cd1258a9023D3a5062381554Cf"), }; + +module.exports.milkomeda.borrowed = () => ({}) // bad debt diff --git a/projects/mimas-finance/index.js b/projects/mimas-finance/index.js index f4463ff27d..3b6535801d 100644 --- a/projects/mimas-finance/index.js +++ b/projects/mimas-finance/index.js @@ -1,21 +1,34 @@ -const {compoundExports} = require('../helper/compound') +const ADDRESSES = require('../helper/coreAssets.json'); +const { compoundExports } = require('../helper/compound'); const { stakingUnknownPricedLP } = require("../helper/staking"); const token = "0x10C9284E6094b71D3CE4E38B8bFfc668199da677"; const stakingContract = "0x268E2E1e5a465034Ee5742DA578feb41B228ad7B"; -const wCRO = "0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23"; +const wCRO = ADDRESSES.cronos.WCRO_1; const mmCRO = "0xff024211741059a2540b01f5Be2e75fC0c1b3d82"; +const customCompoundExports = (comptroller, cToken, underlying) => { + const originalExports = compoundExports(comptroller, cToken, underlying); + return { + ...originalExports, + borrowed: async () => 0, // Hard-code borrowed to 0 + }; +}; + module.exports = { cronos: { - ...compoundExports( + ...customCompoundExports( "0xdD8c94211dD19155EFFbd57EAb6D4e0DE31A3b9E", - "cronos", mmCRO, - wCRO, - addr => `cronos:${addr}`, + wCRO + ), + staking: stakingUnknownPricedLP( + stakingContract, + token, + "cronos", + "0xf56FDfeeF0Ba3de23DaB13a85602bd7BF135E80f", + addr => `cronos:${addr}` ), - staking: stakingUnknownPricedLP(stakingContract, token, "cronos", "0xf56FDfeeF0Ba3de23DaB13a85602bd7BF135E80f", addr=>`cronos:${addr}`) - } -} + }, +}; diff --git a/projects/mimo/index.js b/projects/mimo/index.js index 20213b249a..a39a0a9387 100755 --- a/projects/mimo/index.js +++ b/projects/mimo/index.js @@ -1,39 +1,36 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensExport } = require('../helper/unwrapLPs'); const config = { - ethereum: { - vaultCore: ['0x4026BdCD023331D52533e3374983ded99CcBB6d4'], - collaterals: [ - ADDRESSES.ethereum.WETH, //wETH - ADDRESSES.ethereum.WBTC, //wBTC - ADDRESSES.ethereum.USDC, //USDC + ethereum: + { + vaultCore: [ + '0x68E88c802F146eAD2f99F3A91Fb880D1A2509672', //PAR + '0x917b9D8E62739986EC182E0f988C7F938651aFD7', //paUSD ], }, polygon: { - vaultCore: ['0x03175c19cb1d30fa6060331a9ec181e04cac6ab0'], - collaterals: [ - ADDRESSES.polygon.WMATIC_2, //wMATIC - ADDRESSES.polygon.WETH_1, //wETH - ADDRESSES.polygon.WBTC, //wBTC - ADDRESSES.polygon.USDC, //USDC + vaultCore: [ + '0x78C48A7d7Fc69735fDab448fe6068bbA44a920E6', //PAR + '0xc0459Eff90be3dCd1aDA71E1E8BDB7619a16c1A4', //paUSD ], }, fantom: { vaultCore: ['0xB2b4feB22731Ae013344eF63B61f4A0e09fa370e'], - collaterals:[ - ADDRESSES.fantom.WFTM, //wFTM - '0x74b23882a30290451A17c44f4F05243b6b58C76d', //ETH - '0x321162Cd933E2Be498Cd2267a90534A804051b11', //BTC - ADDRESSES.fantom.USDC, //USDC - ], } } -module.exports = {}; Object.keys(config).forEach(chain => { - const { vaultCore: owners, collaterals: tokens } = config[chain] - module.exports[chain] = { - tvl: sumTokensExport({ chain, owners, tokens, }) + const { vaultCore } = config[chain] + module.exports[chain] = { tvl } + + async function tvl(api) { + const ownerTokens = [] + for (const vault of vaultCore) { + const addressProvider = await api.call({ abi: 'address:a', target: vault}) + const config = await api.call({ abi: 'address:config', target: addressProvider}) + const tokenConfig = await api.fetchList({ lengthAbi: 'numCollateralConfigs', itemAbi: "function collateralConfigs(uint256 _id) view returns ((address collateralType, uint256 debtLimit, uint256 liquidationRatio, uint256 minCollateralRatio, uint256 borrowRate, uint256 originationFee, uint256 liquidationBonus, uint256 liquidationFee))", target: config}) + const tokens = tokenConfig.map(t => t.collateralType) + ownerTokens.push([tokens, vault]) + } + return api.sumTokens({ ownerTokens }) } }) \ No newline at end of file diff --git a/projects/mimoswap-v3/index.js b/projects/mimoswap-v3/index.js new file mode 100644 index 0000000000..59d78a216c --- /dev/null +++ b/projects/mimoswap-v3/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +module.exports = uniV3Export({ + iotex: { factory: "0xF36788bF206f75F29f99Aa9d418fD8164b3B8198", fromBlock: 27707694, blacklistedTokens: ['0x95cb18889b968ababb9104f30af5b310bd007fd8'] } +}) \ No newline at end of file diff --git a/projects/mimswap/index.js b/projects/mimswap/index.js index 2a11adf308..3aaae42c05 100644 --- a/projects/mimswap/index.js +++ b/projects/mimswap/index.js @@ -2,6 +2,7 @@ const { getLogs2 } = require('../helper/cache/getLogs') const config = { arbitrum: { factory: '0x8D0Cd3eEf1794F59F2B3a664Ef07fCAD401FEc73', fromBlock: 205217727 }, + ethereum: { factory: '0xDF46F6b1a5F794F21eaD4008C7De4E02Dc045297', fromBlock: 20537337 }, blast: { factory: '0x7E05363E225c1c8096b1cd233B59457104B84908', fromBlock: 1067907 }, kava: { factory: '0x7Ad0e580d8458BbeF71EC6A1755c59651E1EAaa7', fromBlock: 10023543 }, } diff --git a/projects/mindgames/index.js b/projects/mindgames/index.js index baa654776e..875588edae 100644 --- a/projects/mindgames/index.js +++ b/projects/mindgames/index.js @@ -4,7 +4,7 @@ const xCRX = "0x35AfE95662fdf442762a11E4eD5172C81fBceF7e"; const CRX = "0xb21Be1Caf592A5DC1e75e418704d1B6d50B0d083"; const factory = "0x7C7F1c8E2b38d4C06218565BC4C9D8231b0628c0"; -const tvl = getUniTVL({ factory, useDefaultCoreAssets: true, fetchBalances: true }) +const tvl = getUniTVL({ factory, useDefaultCoreAssets: true, }) module.exports = { misrepresentedTokens: true, diff --git a/projects/minerPepe/index.js b/projects/minerPepe/index.js index 60b718f980..e2bf7b8abb 100644 --- a/projects/minerPepe/index.js +++ b/projects/minerPepe/index.js @@ -6,7 +6,6 @@ const TOKENS = ["0x6d306C2C9CD931160763D99376a68C14D33DC954"] module.exports = { methodology: "MinerPepe the first mining PEPE Meme Coin on Binance Smart Chain. Miners enjoy 12% daily returns in BNB and MPEPE tokens", - start: 35011373, bsc: { tvl: sumTokensExport({ tokensAndOwners: [ diff --git a/projects/miningtycoon/index.js b/projects/miningtycoon/index.js index a4fa748146..58c93d9855 100644 --- a/projects/miningtycoon/index.js +++ b/projects/miningtycoon/index.js @@ -1,70 +1,20 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk'); +const ADDRESSES = require('../helper/coreAssets.json'); +const { staking } = require('../helper/staking'); -const tokenFarm = '0xBdfbeecF52bCfF5aa8cc1B8A4B737B2Af3D1BA2F'; const tokenFarm2 = '0x8A6AE8076A1866877e006cC9b4bd0378646A9bD5'; - const NTToken = '0x8b70512b5248e7c1f0f6996e2fde2e952708c4c9'; -const USDTToken = ADDRESSES.heco.USDT; - -const bsc_tokenFarm = '0xA05Cbf21620553Ade9a3368f1b20D81eEe74a1FC'; const bsc_tokenFarm2 = '0x973fEAf394F5E882B0F8a9B5CDC0b3E28AA08926'; - const bsc_NTToken = '0xfbcf80ed90856AF0d6d9655F746331763EfDb22c'; -const bsc_USDTToken = ADDRESSES.bsc.USDT; - -async function tvl(timestamp, ethBlock, chainBlocks) { - let balances = {}; - - const USDTBalance = (await sdk.api.abi.call({ - chain: "heco", - target: USDTToken, - params: [tokenFarm2], - abi: 'erc20:balanceOf', - })).output; - - const bsc_USDTBalance = (await sdk.api.abi.call({ - chain: "bsc", - target: bsc_USDTToken, - params: [bsc_tokenFarm2], - abi: 'erc20:balanceOf', - })).output; - - balances = {}; - balances['heco:'+USDTToken] = USDTBalance; - balances['bsc:'+bsc_USDTToken] = bsc_USDTBalance; - - return balances; -} - -async function staking(timestamp, ethBlock, chainBlocks) { - const NTBalance = (await sdk.api.abi.call({ - chain: "heco", - target: NTToken, - params: [tokenFarm2], - block: chainBlocks.heco, - abi: 'erc20:balanceOf', - })).output; - - const bsc_NTBalance = (await sdk.api.abi.call({ - chain: "bsc", - target: bsc_NTToken, - params: [bsc_tokenFarm2], - block: chainBlocks.bsc, - abi: 'erc20:balanceOf', - })).output; - - return { - ['heco:'+NTToken]: NTBalance, - ['bsc:'+bsc_NTToken]: bsc_NTBalance, - } -} module.exports = { methodology: 'TVL counts USDT staked to earn NT tokens and the staking portion of TVL counts the NT tokens that are staked to earn more NT tokens', bsc:{ - tvl, - staking + tvl: staking(bsc_tokenFarm2, ADDRESSES.bsc.USDT), + staking: staking(bsc_tokenFarm2, bsc_NTToken) + }, + heco:{ + tvl: staking(tokenFarm2, ADDRESSES.heco.USDT), + staking: staking(tokenFarm2, NTToken) }, } \ No newline at end of file diff --git a/projects/minotaur-money/index.js b/projects/minotaur-money/index.js index ea0fd70eaf..70644bf6aa 100644 --- a/projects/minotaur-money/index.js +++ b/projects/minotaur-money/index.js @@ -10,7 +10,7 @@ const tokens = [ ["0xf5a5f547612e95c688971fb68334a80ceb3c542b", true], // MINO-DAI ["0x1c139f4b953ce0c0f6aa1cd1755727ad5aba5080", true], // MINO-WCRO [ADDRESSES.cronos.WBTC, false], // WBTC - ["0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23", false], // WCRO + [ADDRESSES.cronos.WCRO_1, false], // WCRO ["0xe44fd7fcb2b1581822d0c862b68222998a0c299a", false] // WETH ]; diff --git a/projects/mint-chain/index.js b/projects/mint-chain/index.js new file mode 100644 index 0000000000..6bbbe77044 --- /dev/null +++ b/projects/mint-chain/index.js @@ -0,0 +1,16 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + '0x2b3F201543adF73160bA42E1a5b7750024F30420', + '0x59625d1FE0Eeb8114a4d13c863978F39b3471781' + ], + fetchCoValentTokens: true, + permitFailure: true + }), + }, +}; diff --git a/projects/mint-club-v2/index.js b/projects/mint-club-v2/index.js index e9344c7e30..515fcf70c8 100644 --- a/projects/mint-club-v2/index.js +++ b/projects/mint-club-v2/index.js @@ -10,14 +10,16 @@ const V2_BOND_CONTRACTS = { blast: "0x621c335b4BD8f2165E120DC70d3AfcAfc6628681", degen: "0x3bc6B601196752497a68B2625DB4f2205C3b150b", zora: "0xc5a076cad94176c2996B32d8466Be1cE757FAa27", - klaytn: "0xc5a076cad94176c2996B32d8466Be1cE757FAa27" + klaytn: "0xc5a076cad94176c2996B32d8466Be1cE757FAa27", + ham: "0xc5a076cad94176c2996B32d8466Be1cE757FAa27", + shibarium: "0xc5a076cad94176c2996B32d8466Be1cE757FAa27" } const ownTokens = { bsc: ['0x1f3Af095CDa17d63cad238358837321e95FC5915'] } -const chains = ['avax', 'ethereum', 'optimism', 'arbitrum', 'polygon', 'bsc', 'base', 'blast', 'degen', 'zora', 'klaytn'] +const chains = ['avax', 'ethereum', 'optimism', 'arbitrum', 'polygon', 'bsc', 'base', 'blast', 'degen', 'zora', 'klaytn', 'ham', 'shibarium'] chains.forEach(chain => { const BOND_CONTRACT = V2_BOND_CONTRACTS[chain] ?? '0xc5a076cad94176c2996B32d8466Be1cE757FAa27' diff --git a/projects/mira-ly/index.js b/projects/mira-ly/index.js new file mode 100644 index 0000000000..d59f9d69b4 --- /dev/null +++ b/projects/mira-ly/index.js @@ -0,0 +1,19 @@ +const { sumTokens } = require("../helper/chain/fuel") +// const { configPost } = require('../helper/cache') + +async function tvl(api) { + const contractId = '0x2e40f2b244b98ed6b8204b3de0156c6961f98525c8162f80162fcf53eebd90e7' + // const { pools } = await configPost('mira-ly', 'https://prod.api.mira.ly/pools', { "volume_hours": 24, "apr_days": 1 }) + // const tokens = pools.map(i => i.id.split('_').slice(0, 2)).flat() + // const provider = await fuels.Provider.create('https://mainnet.fuel.network/v1/graphql') + // const contract = new fuels.Contract(contractId, abi, provider) + // const { value } = await contract.functions.total_assets().get() + return sumTokens({ api, owner: contractId, }) +} + +module.exports = { + fuel: { tvl }, + timetravel: false, +} + +// https://github.com/mira-amm/mira-v1-ts/blob/main/sway_abis/contracts/mira_amm_contract/release/mira_amm_contract-abi.json diff --git a/projects/mitosis/index.js b/projects/mitosis/index.js index 8cc14608b2..ca0b300a25 100644 --- a/projects/mitosis/index.js +++ b/projects/mitosis/index.js @@ -20,6 +20,55 @@ const UNIETH_ADDRESS = { }, }; +const uniBTC_ADDRESS = { + ethereum: { + asset: "0x004E9C3EF86bc1ca1f0bB5C7662861Ee93350568", + vault: "0xA1eBd23c4364e7491633237A0d9359D82c629182", + }, + arbitrum: { + asset: "0x6B2a01A5f79dEb4c2f3c0eDa7b01DF456FbD726a", + vault: "0x73981B0496fC08e9136BAF74b79d32A4d4F2a007", + }, + optimism: { + asset: "0x93919784C523f39CACaa98Ee0a9d96c3F32b593e", + vault: "0x5616Fe2762687Cd8a9158c27F62aff84E36821Be", + }, + bsc: { + asset: "0x6B2a01A5f79dEb4c2f3c0eDa7b01DF456FbD726a", + vault: "0xaDd58517c5D45c8ed361986f193785F8Ed1ABFc2", + }, +}; + +const cmETH_ADDRESS = { + mantle: { + asset: "0xE6829d9a7eE3040e1276Fa75293Bde931859e8fA", + vault: "0x6FF000453a9c14f7d3bf381925c8cde565DbCe55", + } +}; + +const ezETH_ADDRESS = { + ethereum: { + asset: "0xbf5495Efe5DB9ce00f80364C8B423567e58d2110", + vault: "0x0109e9f292516dAB3E15EfC61811C5e5a7FA5358", + }, + arbitrum: { + asset: ADDRESSES.optimism.ezETH, + vault: "0xbEd575b0FeDa4F84b71144634693DaCc07749471", + }, + blast: { + asset: ADDRESSES.optimism.ezETH, + vault: "0x8506fD66FCeD711c11F9E837EcAEC0F87C3F60A0", + }, + linea: { + asset: ADDRESSES.optimism.ezETH, + vault: "0x96d6cE4e83dB947fF6bD1Ab0B377F23cd5D9ec2D", + }, + mode: { + asset: ADDRESSES.optimism.ezETH, + vault: "0xbEd575b0FeDa4F84b71144634693DaCc07749471" + } +}; + const WEETH_ADDRESS = { ethereum: "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", arbitrum: "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", @@ -88,6 +137,8 @@ module.exports = { { type: 'cap', data: { asset: WEETH_ADDRESS.ethereum, cap: CAP_ADDRESS.ethereum }}, { type: 'vault', data: { asset: VAULT_weETHs.ethereum, vault: vaults.ethereum }}, { type: 'vault', data: UNIETH_ADDRESS.ethereum }, + { type: 'vault', data: uniBTC_ADDRESS.ethereum }, + { type: 'vault', data: ezETH_ADDRESS.ethereum }, ], ), }, @@ -104,6 +155,8 @@ module.exports = { [ { type: 'cap', data: { asset: WEETH_ADDRESS.arbitrum, cap: CAP_ADDRESS.arbitrum }}, { type: 'vault', data: UNIETH_ADDRESS.arbitrum }, + { type: 'vault', data: uniBTC_ADDRESS.arbitrum }, + { type: 'vault', data: ezETH_ADDRESS.arbitrum }, ] ), }, @@ -111,6 +164,7 @@ module.exports = { tvl: chainTVL( [ { type: 'cap', data: { asset: WEETH_ADDRESS.optimism, cap: CAP_ADDRESS.optimism }}, + { type: 'vault', data: uniBTC_ADDRESS.optimism }, ], ), }, @@ -118,6 +172,7 @@ module.exports = { tvl: chainTVL( [ { type: 'cap', data: { asset: WEETH_ADDRESS.mode, cap: CAP_ADDRESS.mode }}, + { type: 'vault', data: ezETH_ADDRESS.mode }, ], ), }, @@ -132,6 +187,7 @@ module.exports = { tvl: chainTVL( [ { type: 'cap', data: { asset: WEETH_ADDRESS.blast, cap: CAP_ADDRESS.blast }}, + { type: 'vault', data: ezETH_ADDRESS.blast }, ], ), }, @@ -140,7 +196,22 @@ module.exports = { [ { type: 'cap', data: { asset: WEETH_ADDRESS.linea, cap: CAP_ADDRESS.linea }}, { type: 'vault', data: UNIETH_ADDRESS.linea }, + { type: 'vault', data: ezETH_ADDRESS.linea }, ], ), }, + bsc: { + tvl: chainTVL( + [ + { type: 'vault', data: uniBTC_ADDRESS.bsc }, + ] + ) + }, + mantle: { + tvl: chainTVL( + [ + { type: 'vault', data: cmETH_ADDRESS.mantle }, + ] + ) + }, }; diff --git a/projects/mm-stableswap/index.js b/projects/mm-stableswap/index.js index 6a9e1175c4..4c1466a82c 100644 --- a/projects/mm-stableswap/index.js +++ b/projects/mm-stableswap/index.js @@ -1,5 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { sumTokensExport } = require("../helper/unwrapLPs"); const MM3BasePool = "0x61bB2F4a4763114268a47fB990e633Cb40f045F8"; @@ -8,29 +8,10 @@ const USDT = ADDRESSES.cronos.USDT; const USDC = ADDRESSES.cronos.USDC; -async function tvl(timestamp, block, chainBlocks) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [USDT, false], - [USDC, false], - [DAI, false], - ], - [MM3BasePool], - chainBlocks["cronos"], - 'cronos', - addr=>`cronos:${addr}`, - ); - - return balances; -} - module.exports = { - doublecounted: true, - cronos:{ - tvl, - }, - methodology: "Counts DAI, USDC, & USDT tokens on the 3MM Base Pool for tvl", + doublecounted: true, + cronos: { + tvl: sumTokensExport({ tokens: [DAI, USDC, USDT], owner: MM3BasePool }), + }, + methodology: "Counts DAI, USDC, & USDT tokens on the 3MM Base Pool for tvl", }; diff --git a/projects/mobius/index.js b/projects/mobius/index.js index dab40934c3..3c5873c7eb 100644 --- a/projects/mobius/index.js +++ b/projects/mobius/index.js @@ -230,6 +230,5 @@ async function tvl(_, _b, {[chain]: block }) { } module.exports = { - start: 8606077, // January 19, 2021 11:51:30 AM celo: { tvl } }; diff --git a/projects/mobiusdex-xyz/index.js b/projects/mobiusdex-xyz/index.js new file mode 100644 index 0000000000..9a590b3294 --- /dev/null +++ b/projects/mobiusdex-xyz/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'sonic': '0x475f2dDfA1A5da19F4a3F282F1305f285E742C45' +}) \ No newline at end of file diff --git a/projects/moby/index.js b/projects/moby/index.js index fb8b241eba..a1862e92b3 100644 --- a/projects/moby/index.js +++ b/projects/moby/index.js @@ -2,6 +2,9 @@ const { sumTokensExport } = require('../helper/unwrapLPs') const ADDRESSES = require('../helper/coreAssets.json') module.exports = { + hallmarks: [ + [1736294400,"Private-key Leak Exploit"] + ], arbitrum: { tvl: sumTokensExport({ owners: [ diff --git a/projects/mobydex/index.js b/projects/mobydex/index.js index 5aac8a274a..adc3beace9 100644 --- a/projects/mobydex/index.js +++ b/projects/mobydex/index.js @@ -5,7 +5,6 @@ module.exports = { tvl: getUniTVL({ factory: "0x9864C78acCe7837Ad1DA8f9BbECcf2dbE562e698", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/modemax-dex/index.js b/projects/modemax-dex/index.js new file mode 100644 index 0000000000..1fa244d491 --- /dev/null +++ b/projects/modemax-dex/index.js @@ -0,0 +1,5 @@ +const {uniTvlExports} = require('../helper/unknownTokens.js') + +module.exports = uniTvlExports({ + mode: '0x423A079C43e4eD7ca561Ef04765eDB796F0Ec6c6' +}) \ No newline at end of file diff --git a/projects/modemax-perp-v2/index.js b/projects/modemax-perp-v2/index.js new file mode 100644 index 0000000000..90d3803716 --- /dev/null +++ b/projects/modemax-perp-v2/index.js @@ -0,0 +1,7 @@ +const { gmxExports } = require('../helper/gmx') + +module.exports = { + mode: { + tvl: gmxExports({ vault: '0xc3d266Af004B2556f2f900e88e9C73Ac42978AE6' }) + }, +}; diff --git a/projects/modemax-perp/index.js b/projects/modemax-perp/index.js new file mode 100644 index 0000000000..4c85a95ab3 --- /dev/null +++ b/projects/modemax-perp/index.js @@ -0,0 +1,7 @@ +const { gmxExportsV2 } = require('../helper/gmx.js') + +module.exports = { + mode: { + tvl: gmxExportsV2({ eventEmitter: '0xd63352120c45378682d705f42a9F085E79E3c888', fromBlock: 25655, }) + } +} diff --git a/projects/mojitoswap/index.js b/projects/mojitoswap/index.js index d8a21cd901..47c140bb5f 100644 --- a/projects/mojitoswap/index.js +++ b/projects/mojitoswap/index.js @@ -13,5 +13,4 @@ module.exports = { tvl: getUniTVL({ useDefaultCoreAssets: true, factory: '0x79855a03426e15ad120df77efa623af87bd54ef3', }), staking: stakings([masterchefAddress, masterchefV2Address], mjtAddress), }, - start: 3000000, }; diff --git a/projects/mole/index.js b/projects/mole/index.js index 3fe52bf72b..acc470cf84 100644 --- a/projects/mole/index.js +++ b/projects/mole/index.js @@ -24,7 +24,7 @@ async function suiTvl() { // run command: node test.js projects/mole/index.js module.exports = { timetravel: false, - start: 1653840000, + start: '2022-05-29', // avax: { // tvl: avaxTvl, // staking: avaxStaking, diff --git a/projects/moneta/index.js b/projects/moneta/index.js new file mode 100644 index 0000000000..5b85850933 --- /dev/null +++ b/projects/moneta/index.js @@ -0,0 +1,21 @@ +const { addressesUtxosAssetAll, getScriptsDatum } = require('../helper/chain/cardano/blockfrost') + +const usdm_count_nft_asset = "e319d8e6629ff7991c8ae4f8aec2e0f10463ebdf29b57d26d34914f65553444d5f434f554e54" +const count_address = "addr1wyl82v9qy06hsz50hqqdy0u6xw9hdewy7twjahgek2tpp7c0qajez" + +async function tvl(api) { + const utxo = (await addressesUtxosAssetAll(count_address, usdm_count_nft_asset))[0] + const datum_hash = utxo.data_hash + const datum = await getScriptsDatum(datum_hash) + const total_value_locked = datum.json_value.fields[0].int / 1_000_000 + api.addUSDValue(total_value_locked) +} + +module.exports = { + timetravel: false, + misrepresentedTokens: true, + methodology: "Gets the total circulating supply of USDM from the datum of the USDM counter UTxO.", + cardano: { + tvl + } +} \ No newline at end of file diff --git a/projects/monox/index.js b/projects/monox/index.js index c67ebfd3fb..3252b85a77 100644 --- a/projects/monox/index.js +++ b/projects/monox/index.js @@ -1,41 +1,31 @@ const ADDRESSES = require('../helper/coreAssets.json') -const {sumTokensSharedOwners} = require('../helper/unwrapLPs') +const { sumTokensExport } = require('../helper/unwrapLPs') -async function eth(timestamp, ethBlock, chainBlocks){ - const block = chainBlocks.ethereum - const balances = {} - await sumTokensSharedOwners(balances, [ +module.exports = { + hallmarks: [ + [1669766400, "swap contract exploit"] + ], + ethereum: { + tvl: sumTokensExport({ + owner: '0x59653E37F8c491C3Be36e5DD4D503Ca32B5ab2f4', tokens: [ "0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3", "0x92e187a03b6cd19cb6af293ba17f2745fd2357d5", ADDRESSES.ethereum.WBTC, ADDRESSES.ethereum.WETH, ADDRESSES.ethereum.USDT, ADDRESSES.ethereum.USDC - ], ["0x59653E37F8c491C3Be36e5DD4D503Ca32B5ab2f4"], ethBlock) - return balances -} - -async function polygon(timestamp, ethBlock, chainBlocks){ - const block = chainBlocks.polygon - const balances = {} - await sumTokensSharedOwners(balances, [ + ] + }) + }, + polygon: { + tvl: sumTokensExport({ + owner: '0x3826367A5563eCE9C164eFf9701146d96cC70AD9', tokens: [ ADDRESSES.polygon.WBTC, ADDRESSES.polygon.USDT, ADDRESSES.polygon.USDC, ADDRESSES.polygon.WETH_1, ADDRESSES.polygon.WMATIC_2, - ], ["0x3826367A5563eCE9C164eFf9701146d96cC70AD9"], block, "polygon") - return balances -} - -module.exports = { - hallmarks: [ - [1669766400, "swap contract exploit"] - ], - ethereum:{ - tvl:eth - }, - polygon:{ - tvl:polygon - } + ] + }) + } } \ No newline at end of file diff --git a/projects/monprotocol/index.js b/projects/monprotocol/index.js new file mode 100644 index 0000000000..a0aa6bdbca --- /dev/null +++ b/projects/monprotocol/index.js @@ -0,0 +1,15 @@ +const { staking } = require('../helper/staking') +const tokenAddress = '0xc555D625828c4527d477e595fF1Dd5801B4a600e'; +const stakingContracts = [ + '0x65A8b32bc4dE5E0156DBa85Ce615d9ef8ea59780', + '0xd0c40b774ecfBc7B0632d23F871Cc0E523aad8F3', + '0xa305A8C63a5305Cc2D4d58c41F1d7C662C95475b', + '0x57136E05e6b1F502bd56B5439fCC1039A8250ED2' +] +module.exports = { + ethereum: { + tvl: () => ({}), + staking: staking(stakingContracts, tokenAddress), + }, + methodology: 'Counts the balance of staked tokens in the staking, claims, and rewards registry.', +}; diff --git a/projects/monroeprotocol/index.js b/projects/monroeprotocol/index.js index 1e80fd1868..33cdc7bd78 100644 --- a/projects/monroeprotocol/index.js +++ b/projects/monroeprotocol/index.js @@ -59,7 +59,7 @@ async function tvl(api) { module.exports = { methodology: "Adds up the total value locked as collateral in Monroe vaults", - start: 1710288000, // March 13, 2024 00:00 GMT + start: '2024-03-13', // March 13, 2024 00:00 GMT hallmarks: [ [1722000000, "V2 Launch"] ], diff --git a/projects/monster/index.js b/projects/monster/index.js index 848b287c27..54c3631c78 100644 --- a/projects/monster/index.js +++ b/projects/monster/index.js @@ -10,7 +10,6 @@ const LP_STAKING_2 = "0xc13926C5CB2636a29381Da874b1e2686163DC226"; module.exports = { methodology: "counts the number of MST tokens in the ve contract and the pairs in the staking pool", - start: 22569995, fantom: { tvl: async () => ({}), pool2: pool2([LP_STAKING_1, LP_STAKING_2], [LP_POOL_1, LP_POOL_2]), diff --git a/projects/monstro-fun/index.js b/projects/monstro-fun/index.js new file mode 100644 index 0000000000..3a3a2b77a5 --- /dev/null +++ b/projects/monstro-fun/index.js @@ -0,0 +1,26 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const BASE_CONTRACT = '0x813303b6F253C74D997020518227f87Ff721F53F'; +// 0xdbe214c863d6b2ecf5d79012e5d03aab09c57e28 +const ABI_GOLEMZ = "function golemzLatestStats() view returns (uint256 totalInvested, uint256 currentTVL, uint256 insurance, uint256 totalPaidOut)"; // 0x07f2a4b640d0c780d52d476ac2b674d8a22bc1b1 +const ABI_POOLZ = "function poolzLatestStats() view returns (uint256 totalInvested, uint256 currentTVL, uint256 insurance, uint256 totalPaidOut)"; // 0x4d0eb0e7e851787065f694b2e12e75bfa97be08e + +async function getInvestedValue(api, contractAddress, abi) { + const response = await api.call({ target: contractAddress, abi, }); + + return api.add(ADDRESSES.base.USDC, response.totalInvested) +} + +async function tvl(api) { + await getInvestedValue(api, BASE_CONTRACT, ABI_GOLEMZ); + await getInvestedValue(api, BASE_CONTRACT, ABI_POOLZ); +} + +module.exports = { + methodology: 'Sums the total invested value from farmz, golemz, and poolz contracts based on their respective latestStats functions.', + hallmarks: [[1734804000, "BSC->Base ecosystem migration"]], + misrepresentedTokens: true, + base: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/moonflowerfarmers/index.js b/projects/moonflowerfarmers/index.js index 57653f28ac..27f8f2bc33 100644 --- a/projects/moonflowerfarmers/index.js +++ b/projects/moonflowerfarmers/index.js @@ -1,42 +1,10 @@ -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const MFF = "0x78b65477bba78fc11735801d559c386611d07529"; const contract = "0xDE707357D10D86aE21373b290eAbBA07360896F6"; -const sdk = require("@defillama/sdk"); -const abi = require("../vexchange/abi.json"); - -async function staking(timestamp, _, {aurora: block}) { - const balances = {}; - const MFFPrice = await getMFFPrice(block); - - await sumTokensAndLPsSharedOwners( - balances, - [[MFF, false]], - [contract], - block, - "aurora", - (addr) => `aurora:${addr}` - ); - - balances.terrausd = (balances[`aurora:${MFF}`] * MFFPrice) / 10 ** 18; - delete balances[`aurora:${MFF}`]; - - return balances; -} -async function getMFFPrice(block) { - const reserves = ( - await sdk.api.abi.call({ - target: "0x3c508FC05C289BA989CF877bb2e3f6e54eF3fc95", - abi: abi.getReserves, - block, - chain: "aurora", - }) - ).output; - return reserves[0] / reserves[1]; -} +const { staking } = require('../helper/staking') module.exports = { aurora: { tvl: () => ({}), - staking, + staking: staking(contract, MFF), }, }; diff --git a/projects/moonswap/index.js b/projects/moonswap/index.js index ba0db0ebce..b23e9ce2bc 100644 --- a/projects/moonswap/index.js +++ b/projects/moonswap/index.js @@ -11,4 +11,4 @@ module.exports = { }) }, misrepresentedTokens: true, -} // node test.js projects/moonswap/index.js \ No newline at end of file +} \ No newline at end of file diff --git a/projects/moonswap/onchain.js b/projects/moonswap/onchain.js deleted file mode 100644 index bc5bace50e..0000000000 --- a/projects/moonswap/onchain.js +++ /dev/null @@ -1,112 +0,0 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const factoryAbi = require("../helper/abis/factory.json"); -const token0 = 'address:token0' -const token1 = 'address:token1' -const getReserves = 'function getReserves() view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast)' - -async function tvl(timestamp, ethBlock, chainBlocks) { - let balances = {}; - let factoryAddress = '0x056973F631A5533470143bB7010C9229C19C04d2' - - // GET NUMBER OF POOLS FROM FACTORY - const pairLength = Number(( - await sdk.api.abi.call({ - target: factoryAddress, - abi: factoryAbi.allPairsLength, - chain: 'moonriver', - block: chainBlocks['moonriver'], - }) - ).output); - const allPairNums = Array.from(Array(pairLength).keys()); - - // GET POOL ADDRESSES - const pairs = await sdk.api.abi.multiCall({ - abi: factoryAbi.allPairs, - chain: 'moonriver', - calls: allPairNums.map((num) => ({ - target: factoryAddress, - params: [num], - })), - }); - const pairAddresses = pairs.output.map(r => r.output.toLowerCase()) - - // FIND TOKEN BALANCES - const [token0Addresses, token1Addresses, reserves] = await Promise.all([ - sdk.api.abi - .multiCall({ - abi: token0, - chain: 'moonriver', - calls: pairAddresses.map((pairAddress) => ({ - target: pairAddress, - })), - block: chainBlocks['moonriver'], - }) - .then(({ output }) => output), - sdk.api.abi - .multiCall({ - abi: token1, - chain: 'moonriver', - calls: pairAddresses.map((pairAddress) => ({ - target: pairAddress, - })), - block: chainBlocks['moonriver'], - }) - .then(({ output }) => output), - sdk.api.abi - .multiCall({ - abi: getReserves, - chain: 'moonriver', - calls: pairAddresses.map((pairAddress) => ({ - target: pairAddress, - })), - block: chainBlocks['moonriver'], - }) - .then(({ output }) => output), - ]); - - // CALCULATE VALUE OF POOLS WRT TOKENS OF KNOWN VALUE - for (let n = 0; n < pairLength; n++) { - const tokenIds = [ - getTokenId(token0Addresses[n].output.toLowerCase()), - getTokenId(token1Addresses[n].output.toLowerCase()) - ]; - - const tokenId = tokenIds[0] ? tokenIds[0] : tokenIds[1]; - const side = tokenIds[0] ? 0 : 1; - - if (!tokenId) { - continue; - } else if (balances[tokenId[0]]) { - balances[tokenId[0]] = Number(balances[tokenId[0]]) - + Number(reserves[n].output[side]) * 2 / 10**tokenId[1]; - } else { - balances[tokenId[0]] = - reserves[n].output[side] * 2 / 10**tokenId[1]; - } - } - return balances; -} - -function getTokenId(address) { - switch(address) { - case '0x98878b06940ae243284ca214f92bb71a2b032b8a': - return ['moonriver', 18] - case [ADDRESSES.moonriver.USDC]: - return ['usd-coin', 6] - case [ADDRESSES.moonriver.USDT]: - return ['tether', 6] - case [ADDRESSES.moonriver.ETH]: - return ['ethereum', 18] - case '0x5d9ab5522c64e1f6ef5e3627eccc093f56167818': - return ['binance-usd', 18] - default: - return false; - } -} -// node test.js projects/moonswap/index.js -module.exports = { - misrepresentedTokens: true, - tvl, - methodology: 'tvl is calculated by summing the value of moonswap pools that contain at least one of MOVR, USDC, USDT, ETH and BUSD. This is read from the blockchain, accounts for most of the value locked in the AMM, and was done because these tokens can be valued on CoinGecko. Currently, staking is not counted due to most moonriver tokens being difficult to value in USD.' - }; \ No newline at end of file diff --git a/projects/moonthat-gg/index.js b/projects/moonthat-gg/index.js new file mode 100644 index 0000000000..4c30d858d7 --- /dev/null +++ b/projects/moonthat-gg/index.js @@ -0,0 +1,22 @@ +const { sumTokens2 } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') +const { getLogs2 } = require('../helper/cache/getLogs') + +const config = { + ethereum: { factory: '0x966983F93309D726a888adff08331ac81b522971', fromBlock: 20815952 }, +} + +Object.keys(config).forEach(chain => { + const { factory, fromBlock } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: 'event CommunityLaunchCreated (address indexed singleton, bytes32 indexed coinId, address indexed proxy)', fromBlock, }) + const proxies = logs.map(log => log.proxy) + await api.sumTokens({ tokens: [ADDRESSES.null], owners: proxies }) // add ETH deposited to initial pool + const tokens = await api.multiCall({ abi: 'address:tokenAddress', calls: proxies }) + const utilities = await api.multiCall({ abi: 'address:MOONTHAT_UNISWAP_V3_UTILITY', calls: proxies }) + const vaults = await api.multiCall({ abi: 'address:moonThatUniswapV3Vault', calls: utilities }) + return sumTokens2({ api, owners: vaults, resolveUniV3: true, blacklistedTokens: tokens }) + } + } +}) \ No newline at end of file diff --git a/projects/moonwell-apollo/index.js b/projects/moonwell-apollo/index.js index ef0aec3475..76e813457d 100644 --- a/projects/moonwell-apollo/index.js +++ b/projects/moonwell-apollo/index.js @@ -1,28 +1,16 @@ -const { usdCompoundExports } = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound') const { staking } = require('../helper/staking') const moonriverConfig = { comptroller: '0x0b7a0EAA884849c6Af7a129e899536dDDcA4905E', - chain: 'moonriver', nativeTokenMarket: '0x6a1A771C7826596652daDC9145fEAaE62b1cd07f', stakingContract: '0xCd76e63f3AbFA864c53b4B98F57c1aA6539FDa3a', stakingTokenAddress: '0xBb8d88bcD9749636BC4D2bE22aaC4Bb3B01A58F1' } -// Moonriver -const moonriverTVL = usdCompoundExports( - moonriverConfig.comptroller, - moonriverConfig.chain, - moonriverConfig.nativeTokenMarket -) - -const moonriverStaking = staking( - moonriverConfig.stakingContract, - moonriverConfig.stakingTokenAddress, - 'moonriver' -) +const moonriverStaking = staking(moonriverConfig.stakingContract, moonriverConfig.stakingTokenAddress) module.exports = { - moonriver: { ...moonriverTVL, staking: moonriverStaking } + moonriver: { ...compoundExports2({ comptroller: moonriverConfig.comptroller, cether: '0x6a1a771c7826596652dadc9145feaae62b1cd07f' }), staking: moonriverStaking } } diff --git a/projects/moonwell/index.js b/projects/moonwell/index.js index 7424e20795..8d1c764eb7 100644 --- a/projects/moonwell/index.js +++ b/projects/moonwell/index.js @@ -1,47 +1,28 @@ -const { usdCompoundExports } = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound') const { staking } = require('../helper/staking'); const moonbeamConfig = { comptroller: '0x8E00D5e02E65A19337Cdba98bbA9F84d4186a180', - chain: 'moonbeam', nativeTokenMarket: '0x091608f4e4a15335145be0A279483C0f8E4c7955', - stakingContract: '0x8568A675384d761f36eC269D695d6Ce4423cfaB1', stakingTokenAddress: '0x511aB53F793683763E5a8829738301368a2411E3' } -// Moonbeam -const moonbeamTVL = usdCompoundExports( - moonbeamConfig.comptroller, - moonbeamConfig.chain, - moonbeamConfig.nativeTokenMarket -) - -const moonbeamStaking = staking( - moonbeamConfig.stakingContract, - moonbeamConfig.stakingTokenAddress, - 'moonbeam' -) +const moonbeamStaking = staking( moonbeamConfig.stakingContract, moonbeamConfig.stakingTokenAddress,) const baseConfig = { comptroller: '0xfBb21d0380beE3312B33c4353c8936a0F13EF26C', - chain: 'base' } -// Moonbeam -const baseTVL = usdCompoundExports(baseConfig.comptroller, baseConfig.chain) - -// Optimism const optimismConfig = { comptroller: '0xCa889f40aae37FFf165BccF69aeF1E82b5C511B9', - chain: 'optimism' } -const optimismTVL = usdCompoundExports(optimismConfig.comptroller, optimismConfig.chain) - module.exports = { - moonbeam: { ...moonbeamTVL, staking: moonbeamStaking }, - base: { ...baseTVL }, - optimism: { ...optimismTVL }, + moonbeam: compoundExports2({ comptroller: moonbeamConfig.comptroller, cether: '0x091608f4e4a15335145be0a279483c0f8e4c7955' }), + base: compoundExports2({ comptroller: baseConfig.comptroller, }), + optimism: compoundExports2({ comptroller: optimismConfig.comptroller, }), hallmarks: [[1659312000, 'Nomad Bridge Exploit']] } + +module.exports.moonbeam.staking = moonbeamStaking \ No newline at end of file diff --git a/projects/more-markets/index.js b/projects/more-markets/index.js new file mode 100644 index 0000000000..8fe40b7574 --- /dev/null +++ b/projects/more-markets/index.js @@ -0,0 +1,51 @@ +const { getLogs2 } = require("../helper/cache/getLogs") +const { sumTokens2 } = require('../helper/unwrapLPs') + +const abi = { + "idToMarketParams": "function idToMarketParams(bytes32 Id) returns (bool isPremiumMarket, address loanToken, address collateralToken, address oracle, address irm, uint256 lltv, address creditAttestationService, uint96 irxMaxLltv, uint256[] categoryLltv)", + "market": "function market(bytes32 input) returns (uint128 totalSupplyAssets, uint128 totalSupplyShares, uint128 totalBorrowAssets, uint128 totalBorrowShares, uint128 lastUpdate, uint128 fee, uint256 premiumFee)" +} + +module.exports = { + methodology: `Collateral (supply minus borrows) in the balance of the MORE Markets contracts`, +}; + +const config = { + flow: { + moreMarkets: "0x94A2a9202EFf6422ab80B6338d41c89014E5DD72", + fromBlock: 2871764, + }, +}; + +Object.keys(config).forEach((chain) => { + const { moreMarkets, fromBlock, } = config[chain]; + module.exports[chain] = { + tvl: async (api) => { + const marketIds = await getMarkets(api); + const tokens = (await api.multiCall({ target: moreMarkets, calls: marketIds, abi: abi.idToMarketParams, })) + .map((i) => [i.collateralToken, i.loanToken]) + .flat(); + return sumTokens2({ api, owner: moreMarkets, tokens, }); + }, + borrowed: async (api) => { + const marketIds = await getMarkets(api); + const marketInfo = await api.multiCall({ target: moreMarkets, calls: marketIds, abi: abi.idToMarketParams, }); + const marketData = await api.multiCall({ target: moreMarkets, calls: marketIds, abi: abi.market, }); + marketData.forEach((i, idx) => { + api.add(marketInfo[idx].loanToken, i.totalBorrowAssets); + }); + return sumTokens2({ api }) + }, + }; + + async function getMarkets(api) { + const logs = await getLogs2({ + api, + target: moreMarkets, + eventAbi: "event CreateMarket(bytes32 indexed id, (bool,address,address,address,address,uint256,address,uint96,uint256[]) marketParams)", + fromBlock, + }); + return logs.map((i) => i.id); + } + +}) \ No newline at end of file diff --git a/projects/moret/index.js b/projects/moret/index.js index 19ab8d9dd6..10751b6868 100644 --- a/projects/moret/index.js +++ b/projects/moret/index.js @@ -13,7 +13,7 @@ const tvlTokens = [ADDRESSES.polygon.WETH_1, // WETH module.exports = { methodology: 'counts all USDC/WBTC/WETH/GHST balances of market contracts.', - start: 1677225600, // 24 Feb 2023 08:00:00 UTC + start: '2023-02-24', // 24 Feb 2023 08:00:00 UTC polygon: { tvl: sumTokensExport({ owners: markets, tokens: tvlTokens, }), } diff --git a/projects/morkie/index.js b/projects/morkie/index.js new file mode 100644 index 0000000000..de3b74d8b4 --- /dev/null +++ b/projects/morkie/index.js @@ -0,0 +1,11 @@ +const { staking } = require('../helper/staking'); + +module.exports = { + polygon: { + tvl: () => ({}), + staking: staking( + '0xee1198CF7575dfb2D5D666964322B6569B23E56b', + '0xAFb755c5f2ea2aadBaE693d3BF2Dc2C35158dC04' + ) + } +}; diff --git a/projects/morph/index.js b/projects/morph/index.js new file mode 100644 index 0000000000..2426de75e0 --- /dev/null +++ b/projects/morph/index.js @@ -0,0 +1,13 @@ +const { getConfig } = require('../helper/cache') +const { nullAddress } = require('../helper/tokenMapping') + +async function tvl(api) { + const { tokens } = await getConfig('morph/bridge', 'https://raw.githubusercontent.com/morph-l2/morph-list/main/src/mainnet/tokenList.json') + const tokensAndOwners = tokens.filter(i => i.chainId === '1').map(i => [i.address, i.gatewayAddress]) + tokensAndOwners.push([nullAddress, '0xDc71366EFFA760804DCFC3EDF87fa2A6f1623304']) + return api.sumTokens({ tokensAndOwners }) +} + +module.exports = { + ethereum: { tvl }, +} \ No newline at end of file diff --git a/projects/morpho-blue/index.js b/projects/morpho-blue/index.js index d6139ec2e2..03b0bac87b 100644 --- a/projects/morpho-blue/index.js +++ b/projects/morpho-blue/index.js @@ -12,12 +12,13 @@ const config = { }, base: { morphoBlue: "0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb", + blackList: ['0x6ee1955afb64146b126162b4ff018db1eb8f08c3'], fromBlock: 13977148, }, }; -Object.keys(config).forEach((chain) => { - const { morphoBlue, fromBlock } = config[chain]; +Object.keys(config).forEach((chain) => { + const { morphoBlue, fromBlock, blackList = [] } = config[chain]; module.exports[chain] = { tvl: async (api) => { const marketIds = await getMarkets(api); @@ -30,7 +31,7 @@ Object.keys(config).forEach((chain) => { ) .map((i) => [i.collateralToken, i.loanToken]) .flat(); - return api.sumTokens({ owner: morphoBlue, tokens }); + return api.sumTokens({ owner: morphoBlue, tokens, blacklistedTokens: blackList }); }, borrowed: async (api) => { const marketIds = await getMarkets(api); diff --git a/projects/mortgageFi/index.js b/projects/mortgageFi/index.js new file mode 100644 index 0000000000..72d359817d --- /dev/null +++ b/projects/mortgageFi/index.js @@ -0,0 +1,17 @@ +const config = { + arbitrum: { pools: ['0x9Be2Cf73E62DD3b5dF4334D9A36888394822A33F'] }, + base: { pools: ['0x1bE87D273d47C3832Ab7853812E9A995A4DE9EEA'] }, +} + +Object.keys(config).forEach(chain => { + const { pools, } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const cTokens = await api.multiCall({ abi: 'address:contractCoin', calls: pools }) + const sTokens = await api.multiCall({ abi: 'address:stablecoin', calls: pools }) + const tokens = cTokens.concat(sTokens) + const owners = pools.concat(pools) + return api.sumTokens({ tokensAndOwners2: [tokens, owners] }) + } + } +}) \ No newline at end of file diff --git a/projects/mosquitos-finance/index.js b/projects/mosquitos-finance/index.js index a5c8a930b5..740d316074 100644 --- a/projects/mosquitos-finance/index.js +++ b/projects/mosquitos-finance/index.js @@ -141,6 +141,7 @@ module.exports = { [1678320000, "Rug Pull"] ], timetravel: false, + deadFrom: 1678320000, aptos: { tvl, staking diff --git a/projects/mountain-protocol/index.js b/projects/mountain-protocol/index.js index c17297e731..644c20547c 100644 --- a/projects/mountain-protocol/index.js +++ b/projects/mountain-protocol/index.js @@ -20,7 +20,6 @@ async function tvl(api) { module.exports = { misrepresentedTokens: true, methodology: "Calculates the total USDM Supply", - start: 16685700, ethereum: { tvl, }, diff --git a/projects/movegpt/index.js b/projects/movegpt/index.js index 75d2ac6e69..26730dbc7c 100644 --- a/projects/movegpt/index.js +++ b/projects/movegpt/index.js @@ -5,14 +5,12 @@ const POOL_2 = "0x9141a7ebbf2c8ab9101d6b657321e1cc78314b71b8e8780508986119660ffe async function get_staking(api) { async function addBalance(pool) { - let [balance] = await function_view( - { - functionStr: - "0xccd92a8a4b4ee351190346bb04de9941b840bf42a2f003372ccec232d2b5bdcf::staking_fix_lock_duration::get_pool_staked_amount", - type_arguments: [MGPT_ADDRESS], - args: [pool] - } - ) + let balance = await function_view({ + functionStr: + "0xccd92a8a4b4ee351190346bb04de9941b840bf42a2f003372ccec232d2b5bdcf::staking_fix_lock_duration::get_pool_staked_amount", + type_arguments: [MGPT_ADDRESS], + args: [pool] + }) api.addCGToken('movegpt', balance / 1e8) } await Promise.all([POOL_1, POOL_2].map(addBalance)) diff --git a/projects/movepump/index.js b/projects/movepump/index.js new file mode 100644 index 0000000000..d0223b9a72 --- /dev/null +++ b/projects/movepump/index.js @@ -0,0 +1,15 @@ +const { getResources } = require('../helper/chain/aptos') +const ADDRESSES = require('../helper/coreAssets.json') + +async function tvl(api) { + const resources = await getResources("0x766ec6a18eed729b6b62f8af38f7a62dbc847b84bec29063c8b0d46830a82401") + resources.forEach((resource) => { + if (resource.type.includes('movepump_launch::Pool<')) { + api.add(ADDRESSES.aptos.APT, resource.data.real_aptos_reserves.value) + } + }) +} + +module.exports = { + aptos: { tvl } +} \ No newline at end of file diff --git a/projects/mover/abi.json b/projects/mover/abi.json deleted file mode 100644 index 2ac8dafd37..0000000000 --- a/projects/mover/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "inceptionLPPriceUSDC": "uint256:inceptionLPPriceUSDC", - "lpTokensBalance": "uint256:lpTokensBalance" -} \ No newline at end of file diff --git a/projects/mover/baseLedgerPoolAbi.json b/projects/mover/baseLedgerPoolAbi.json deleted file mode 100644 index b4c9952f59..0000000000 --- a/projects/mover/baseLedgerPoolAbi.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "totalAssetAmount": "uint256:totalAssetAmount" -} \ No newline at end of file diff --git a/projects/mover/index.js b/projects/mover/index.js index 915a3b7f12..e31fd5ccc9 100644 --- a/projects/mover/index.js +++ b/projects/mover/index.js @@ -1,8 +1,4 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const baseLedgerAbi = require("./baseLedgerPoolAbi.json"); -const savingsPoolAbi = require("./savingsPoolAbi.json"); -const savingsPlusPoolAbi = require("./savingsPlusPoolAbi.json"); const { staking } = require("../helper/staking"); const { pool2 } = require("../helper/pool2"); @@ -13,46 +9,18 @@ const MOVER_WETH_SLP = "0x87b918e76c92818DB0c76a4E174447aeE6E6D23f"; const savingsPool = "0xAF985437DCA19DEFf89e61F83Cd526b272523719"; const savingsPlusPolygonPool = "0x77D5333d97A092cA01A783468E53E550C379dc3C"; -const USDC = ADDRESSES.ethereum.USDC; -const USDCinPolygon = ADDRESSES.polygon.USDC; const baseLedgerPool = '0x1f15F293C1Cd3d05d58d3EdeAf0C72c5A2dfeaFf'; const UBT = '0x8400D94A5cb0fa0D041a3788e395285d61c9ee5e'; -async function tvlEth(timestamp, block) { - const balances = {}; - - let stakedUBT = (await sdk.api.abi.call({ - abi: baseLedgerAbi.totalAssetAmount, - target: baseLedgerPool, - block - })).output; - - sdk.util.sumSingleBalance(balances, UBT, stakedUBT); - - - let savingsStakedUSDC = (await sdk.api.abi.call({ - abi: savingsPoolAbi.totalAssetAmount, - target: savingsPool, - block - })).output; - - sdk.util.sumSingleBalance(balances, USDC, savingsStakedUSDC); - return balances; +async function tvlEth(api) { + const [stakedUBT, savingsStakedUSDC] = await api.multiCall({ abi: "uint256:totalAssetAmount", calls: [baseLedgerPool, savingsPool] }) + api.add(UBT, stakedUBT) + api.add(ADDRESSES.ethereum.USDC, savingsStakedUSDC) } -async function tvlPolygon(timestamp, block, chainBlocks) { - const balances = {}; - const transform = i => `polygon:${i}`; - - let savingsPlusStakedUSDC = (await sdk.api.abi.call({ - chain: "polygon", - abi: savingsPlusPoolAbi.totalAssetAmount, - target: savingsPlusPolygonPool, - block: chainBlocks["polygon"], - })).output; - - sdk.util.sumSingleBalance(balances, transform(USDCinPolygon), savingsPlusStakedUSDC); - return balances; +async function tvlPolygon(api) { + const [savingsStakedUSDC] = await api.multiCall({ abi: "uint256:totalAssetAmount", calls: [savingsPlusPolygonPool] }) + api.add(ADDRESSES.polygon.USDC, savingsStakedUSDC) } module.exports = { diff --git a/projects/mover/savingsPlusPoolAbi.json b/projects/mover/savingsPlusPoolAbi.json deleted file mode 100644 index b4c9952f59..0000000000 --- a/projects/mover/savingsPlusPoolAbi.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "totalAssetAmount": "uint256:totalAssetAmount" -} \ No newline at end of file diff --git a/projects/mover/savingsPoolAbi.json b/projects/mover/savingsPoolAbi.json deleted file mode 100644 index b4c9952f59..0000000000 --- a/projects/mover/savingsPoolAbi.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "totalAssetAmount": "uint256:totalAssetAmount" -} \ No newline at end of file diff --git a/projects/mozaic/index.js b/projects/mozaic/index.js index d46b1e6e47..3e4a2804ba 100644 --- a/projects/mozaic/index.js +++ b/projects/mozaic/index.js @@ -7,7 +7,21 @@ const vaults = { kava: "0x5712ab97A299a8A4544BCc728B7f3E9663965443", } +const theseusVaults = { + arbitrum: { vault: '0x6D8E0Ac94fb79Cd3520f546ce1c23A6F27F16EaC', gmxPlugin: '0xD4497259a3535ae311AB0F6ad68Da43a676919Db' }, +} + async function tvl(api) { + if (theseusVaults[api.chain]) { + const { vault, gmxPlugin } = theseusVaults[api.chain] + const tokens = await api.call({ abi: 'address[]:getAcceptedTokens', target: vault }) + const gmxPoolAbi = "function getPools() view returns ((uint8 poolId, address indexToken, address longToken, address shortToken, address marketToken)[])" + const gmxTokens = await api.call({ abi: gmxPoolAbi, target: gmxPlugin }) + const ownerTokens = [[tokens, vault], [gmxTokens.map(t => t.marketToken), gmxPlugin]] + await api.sumTokens({ ownerTokens }) + } + + const vault = vaults[api.chain]; const tokens = await api.call({ abi: 'function getAcceptingTokens () view returns (address[])', target: vault, }); const bals = await api.multiCall({ abi: 'function getStakedAmountPerToken(address token) view returns (uint256)', calls: tokens, target: vault }) diff --git a/projects/mstable/index.js b/projects/mstable/index.js index 9ddee7f25a..011e5e4526 100644 --- a/projects/mstable/index.js +++ b/projects/mstable/index.js @@ -127,7 +127,7 @@ const ethereumTvl = tvlForChain('ethereum') const polygonTvl = tvlForChain('polygon') module.exports = { - start: 1590624000, // May-28-2020 00:00:00 + start: '2020-05-28', // May-28-2020 00:00:00 polygon: { tvl: polygonTvl, }, diff --git a/projects/mswap/index.js b/projects/mswap/index.js new file mode 100644 index 0000000000..ec7fa7cde4 --- /dev/null +++ b/projects/mswap/index.js @@ -0,0 +1,5 @@ +const { uniTvlExports } = require('../helper/unknownTokens'); + +module.exports = uniTvlExports({ + matchain: '0x338bCC4efd3cA000D123d7352b362Fc6D5B3D829' +}) diff --git a/projects/mt-gox/index.js b/projects/mt-gox/index.js index 9034364802..359462a574 100644 --- a/projects/mt-gox/index.js +++ b/projects/mt-gox/index.js @@ -1,89 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const config = { - bitcoin: { - owners: [ - "17Tf4bVQaCzwWrDWGRPC97RLCHnU4LY8Qr", - "1BzK87zuqidZn489Wb2oLSktrjKrX7TLKe", - "1Drshi4RAuvxk4T6Bkq959ZvLbvy7b1wvD", - "1EiiKCCnFgHjEvPZdu29qqgdBm8zTvpU3U", - "14p4w3TRCd6NMRSnzTmgdvQhNnbrAmzXmy", - "12KkeeRkiNS13GMbg7zos9KRn9ggvZtZgx", - "12T4oSNd4t9ty9fodgNd47TWhK35pAxDYN", - "15kNZcrhxeFZgVVLK2Yjzd69tRidbFdJEZ", - "1LS5EFRRMDgMQusW6zokQUHjzNUfy6HHCQ", - "1FrV9hv1AW34BGJvobJatyzUWYDWB9epRW", - "1HdKXsNQtzDcfB6PGM7DWTgX9vhBWsz1ak", - "1Fu4YgM3Y9CxvioGPqkSzkydAC8MVaPN1D", - "1G23Uzwj55k2A9TRwaTknqGav66oDTkWCu", - "1GkZQcDy8V6pmHFZqUBUBCnN9dc2hoWasD", - "1Hm6XDmhKCHz68wDEYTapN9MEanke8iwUk", - "15SeCwVCFx5cWyrcdD1Zp1D1zxjH2SELPg", - "15U4VsmWG1cdXAtizvQsW4r7iMxzp64Tgu", - "16jZZkMYqjUWUtQ9DfDvHdH5ko5BcnH9XQ", - "16w6sZBDP58yyeyZAcvnxcEGJpwR9amM6g", - "19Cr4zXpKw43xLJhFZW9iv4DDNtQk2TDeB", - "1GyDutntMuYyA2vQGW5HFcKLfx4cbDdbJq", - "17etv2L3nhk6SCcWSNW4eoZkBy84izAm17", - "18ok25NTkdrUzdByFJCNVsqVYkujZ8aP45", - "199Yxz2TJGtND3QKsHTptTJivqSaUZBvku", - "1AZu7TQmKBAes2duNDctYwjAB9nhHczUnA", - "17KcBp8g76Ue8pywgjta4q8Ds6wK4bEKp7", - "1LLc8aA9C9LLULGbYCYSFKXgxKP2DXdCqP", - "1CZsoJfkknbnW5fKrt1oR7N1ALE5WmDGP1", - "1DedUxzgwErg4ipNi988wPgLk5thwciKcc", - "1H4K3dGfNbAN4AUfyUrpkGpjrd83sntDpV", - "13sXfpp2V16nnxYvW9FHHoBdMa3k98uJw8", - "13Wv5hGhubAWgSPWtXYh6s1s7HX2N1psYg", - "14mP6caC5dFhHdVAPCjPKM8Nm36MBDR5pM", - "155FsTtEFq4eGCcBxDseuwLKPbmtWbyHJR", - "156HpsWfgkWYLT63uhTAGUSUF3ZMnB9WWj", - "15QcKCa84ZCHxbsqXDoKhi5XbmQB8jPEAd", - "1EK8vW7UYaYHKiW4TZmYJKtwcZLM14VjvP", - "1Hb8DmmvvtTYv5RBLuGtDxznkZwVpd5Vjy", - "1HuPVqz2xvf1rdNFUqd62vRTyxP3jeX9Ch", - "13xGCc4TPSYY9GYxBGVNox82KxyjkFnxMX", - "13ahgw8sM95EDbugT3tdb8TYoMU46Uw7PX", - "1439q4Na8v88kPBqoyg8F4ueL9SYr8ANWj", - "13dXFMyG22EsUsvaWhCqUo7SXuX7rBPog6", - "14USZ558Rr28AZwdJQyciSQkN4JT1cEoj2", - "1FhRuUkk8Bfx8FJDemtxhKAR4F8GCNKrXG", - "1Mm9brripN4RPTzkGnRrbt5uDWdqbfk2iX", - "1LueUjEuBgc7cQhsWT8zAfTjcWmrNBZXaR", - "1LXi3x7hyt17cxncscGE887WCrC6XDNZ4P", - "19KiFrafXEyJCUDYFEv3B6tBUwyfFo7kNU", - "18YDgRhxsomuBZ1g9d8Y1JuRmxDhF8Bvff", - "18hcZVFPqDNAovJmb9vA6hEJrDz6uWXNGh", - "1BDZBTb4KE5oq6wAgA6EvAe3uCFRrAbPao", - "195HvmjXgoF3M5vFaBC8swZPhwrE7VhxRD", - "18KDS3q6a4YV9Nn8jcyMvNoVPfcrfemeag", - "19c8sUa54yQuRTVDfJa3iDkkCaFkzBJLPB", - "1B6kJM75iu5ty1HAHMMz6tT1HhjoGNTCa9", - "18M1Z337NqLtK9V69bssnQUYsvb7hmfSFS", - "19eihBKk6e5YD2QXAe4SVUsxRLLnTDKsfv", - "1C5aU4Xnpd3txbxehk46UZgiuNB8QdpHCH", - "1BXyJc6BVuTFnHQCcjiWX2xmCPNVfaSZeb", - "1Ar6meJQCkNoC9wnPcyRNNpzX5fBDaGcKd", - "1CRjKZJu8LvTutnSKq4zTJ4yiqrzMAArYW", - "1HweN9p41BY2RBunsPqyVuheEq7gVoxA9u", - "1HX4s3JeFU3x1eQgPNQVAdx6FoCtbb1hr8", - "1HzEPuenagLEWj68igDXBBXrzc293RuR5V", - "1JtgU6Uo1RAt5eiMf34EehyatUezBQP36C", - "1JVmoJT3471FjsX5H4hAeR1RyrDgpkHbpm", - "1JVU43LNKXqa9W5fCh8tppxDDEWgfeNg46", - "1JztCg7eKSkb1vi7NzGJynXpLZmoaFtYud", - "1KFDUSZuapMv7YaDmL6cyrHTQhma1MtFYs", - "1MkyfwJf7uhWTmVGGQXfcT5ip31DoHMxsz", - "1LzwbLgdKd4eFLkpRdeajkH1YJkVCip2zj", - "1MPJJzRaT8vLhowNB4dVyWRxxu79dq7WkB", - "1MvpYtqgBH7CXbTutrSVCTNHPzm9vakuRy", - "1N5X4kcZ56uRh24XrZoztS9Vb8G7j1Joop", - "1Pq7hooZbEAz5y3QMnqFY8C5xqTdrjUwcA", - "1PRXQEoL8vzEzoJJ9hbtAP6NaV2daccAUn", - "1PxGTuJzDx1ceFHx4Z5CHaWuhiPBNovmZD", - "1NA3Tj4b1jtx9eGELe31Jw4DrzTqKP3ayH" //https://www.cryptoground.com/mtgox-cold-wallet-monitor/ - ], - }, -} - +const config = { bitcoin: { owners: bitcoinAddressBook.mtGox } } module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/mugglelink/index.js b/projects/mugglelink/index.js new file mode 100644 index 0000000000..ad522f4716 --- /dev/null +++ b/projects/mugglelink/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require("../helper/coreAssets.json"); + +const muglelinkAddr = "UQCSo48F-bJSIq-DLve3vVNfGFmmIR-qPlKPdZ2De8c_mPbE" + +module.exports = { + methodology: 'Counts MuggleLink address balance as TVL.', + ton: { + tvl: sumTokensExport({ owner: muglelinkAddr, tokens: [ADDRESSES.ton.TON, ADDRESSES.ton.USDT]}), + } +} diff --git a/projects/multex/index.js b/projects/multex/index.js new file mode 100644 index 0000000000..4d88671860 --- /dev/null +++ b/projects/multex/index.js @@ -0,0 +1,3 @@ +const { uniTvlExport } = require('../helper/unknownTokens') + +module.exports = uniTvlExport('shape', '0x74Eac16615ed3b5A8Df2d00d72C72780beDED02A') \ No newline at end of file diff --git a/projects/multibit/index.js b/projects/multibit/index.js index a5b461cea9..b3529a4d97 100644 --- a/projects/multibit/index.js +++ b/projects/multibit/index.js @@ -2,36 +2,33 @@ const abi = require("./abi.json"); const { getConfig } = require('../helper/cache') const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require('../helper/chain/brc20') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const BRIDGE_TOKENS = "https://api.multibit.exchange/support/token"; const config = { // https://app.multibit.exchange/staking - ethereum: { stakingPool: "0x2EDfFbc62C3dfFD2a8FbAE3cd83A986B5bbB5495", tokens: [ADDRESSES.null, ADDRESSES.ethereum.USDT] }, + ethereum: { stakingPool: "0x2EDfFbc62C3dfFD2a8FbAE3cd83A986B5bbB5495", tokens: [ADDRESSES.null, ADDRESSES.ethereum.USDT], chainKey: 'eth' }, bsc: {}, polygon: {}, + bouncebit: { chainKey: 'bb'}, } module.exports = { methodology: `Tokens bridged via MultiBit are counted as TVL`, bitcoin: { tvl: sumTokensExport({ - owners: [ - 'bc1p6r6hx759e3ulvggvd9x3df0rqh27jz59nvfjd2fzmh3wqyt6walq82u38z', // hot wallet - 'bc1pyyms2ssr0hagy5j50r5n689e6ye0626v3c98j5fw0jk6tz3vrgts7nt56g', // cold wallet - 'bc1qmcrpqanjnrw58y0fvq08fqchgxv5aylctew7vxlkalfns3rpedxsx4hxpu', // cold wallet - ], - blacklistedTokens: ['MUBI', 'BSSB'] + owners: bitcoinAddressBook.multibit, + blacklistedTokens: ['MUBI', 'BSSB', 'savm'] // more SAVM is bridged than circulating supply according to coingecko & etherscan }), }, } Object.keys(config).forEach(chain => { - const { stakingPool, tokens = [ADDRESSES.null] } = config[chain] + const { stakingPool, tokens = [ADDRESSES.null], chainKey = chain } = config[chain] module.exports[chain] = { tvl: async (api) => { const data = await getConfig('multibit', BRIDGE_TOKENS) - const key = chain === 'ethereum' ? 'eth': chain - const owner = data.find(v => v.chain === key)?.real?.contract + const owner = data.find(v => v.chain === chainKey)?.real?.contract if (!owner) return {} return api.sumTokens({ owner, tokens, }) } diff --git a/projects/multiplierfinance/index.js b/projects/multiplierfinance/index.js index 2eb0e191d8..d0033b5e01 100644 --- a/projects/multiplierfinance/index.js +++ b/projects/multiplierfinance/index.js @@ -1,109 +1,59 @@ const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const { sumTokens2, nullAddress } = require('../helper/unwrapLPs') -const { getParamCalls } = require('../helper/utils') const YieldContract = "0xE4Baf69B887843aB6A0e82E8BAeA49010fF619af"; const LendingPool = "0xbc3534b076EDB8E8Ef254D81b81DC193c53057F7"; const LendingPoolV2 = "0x503fba251cdc4c06a1eeea4faf89e3fafc5923a6"; -const ethTvl = async (timestamp, block, chainBlocks) => { - const tokens = [nullAddress] - const { output: length } = await sdk.api.abi.call({ - target: YieldContract, - abi: abi.getNoOfErc20s, block, - }) - - const { output } = await sdk.api.abi.multiCall({ - target: YieldContract, - abi: abi.erc20List, - calls: getParamCalls(length), block, - }) - - output.forEach(i => tokens.push(i.output)) - return sumTokens2({ tokens, owner: YieldContract, block, }) +const ethTvl = async (api) => { + const tokens = await api.fetchList({ lengthAbi: abi.getNoOfErc20s, itemAbi: abi.erc20List, target: YieldContract }) + tokens.push(nullAddress) + return sumTokens2({ tokens, owner: YieldContract, }) }; -const chain = 'bsc' - -async function getReservesData(block) { - const { output: tokens } = await sdk.api.abi.call({ - abi: abi.getReserves, - target: LendingPool, - chain, block, - }) - - const { output: reservesData } = await sdk.api.abi.multiCall({ - abi: abi.getReserveData, - target: LendingPool, - calls: tokens.map(i => ({ params: i })), - chain, block, - }) - - return reservesData.map(({ input: { params: [token]}, output}) => { - output.token = token - return output - }) +async function getReservesData(api) { + const tokens = await api.call({ abi: abi.getReserves, target: LendingPool, }) + const res = await api.multiCall({ abi: abi.getReserveData, target: LendingPool, calls: tokens, }) + tokens.map((v, i) => res[i].token = v) + return res } -async function tvl(_, _b, { bsc: block }) { - const data = await getReservesData(block) +async function tvl(api) { + const data = await getReservesData(api) const tokensAndOwners = data.map(i => ([i.token, i.mTokenAddress])) - return sumTokens2({ tokensAndOwners, chain, block, }) + return sumTokens2({ tokensAndOwners, api, }) } -async function borrowed(_, _b, { bsc: block }) { - const balances = {} - const data = await getReservesData(block) - data.forEach(i => sdk.util.sumSingleBalance(balances,'bsc:'+i.token,i.totalBorrowsVariable)) - return balances +async function borrowed(api) { + const data = await getReservesData(api) + data.forEach(i => api.add(i.token, i.totalBorrowsVariable)) + return api.getBalances() } -async function tvlV2(_, _b, { bsc: block }) { - const data = await getReservesDataV2(block) +async function tvlV2(api) { + const data = await getReservesDataV2(api) const tokensAndOwners = data.map(i => ([i.token, i.aTokenAddress])) - return sumTokens2({ tokensAndOwners, chain, block, }) + return sumTokens2({ tokensAndOwners, api, }) } -async function borrowedV2(_, _b, { bsc: block }) { - const balances = {} - const data = await getReservesDataV2(block) - const { output: supplyVariable } = await sdk.api.abi.multiCall({ - abi: 'erc20:totalSupply', - calls: data.map(i => ({ target: i.variableDebtTokenAddress})), - chain, block, - }) - const { output: supplyStable } = await sdk.api.abi.multiCall({ - abi: 'erc20:totalSupply', - calls: data.map(i => ({ target: i.stableDebtTokenAddress})), - chain, block, - }) +async function borrowedV2(api) { + const data = await getReservesDataV2(api) + const supplyVariable = await api.multiCall({ abi: 'erc20:totalSupply', calls: data.map(i => i.variableDebtTokenAddress), }) + const supplyStable = await api.multiCall({ abi: 'erc20:totalSupply', calls: data.map(i => i.stableDebtTokenAddress), }) data.forEach((i, idx) => { - sdk.util.sumSingleBalance(balances,'bsc:'+i.token,supplyVariable[idx].output) - sdk.util.sumSingleBalance(balances,'bsc:'+i.token,supplyStable[idx].output) + api.add(i.token, supplyVariable[idx]) + api.add(i.token, supplyStable[idx]) }) - return balances + return api.getBalances() } -async function getReservesDataV2(block) { - const { output: tokens } = await sdk.api.abi.call({ - abi: abiv2.getReservesList, - target: LendingPoolV2, - chain, block, - }) - - const { output: reservesData } = await sdk.api.abi.multiCall({ - abi: abiv2.getReserveData, - target: LendingPoolV2, - calls: tokens.map(i => ({ params: i })), - chain, block, - }) - - return reservesData.map(({ input: { params: [token]}, output}) => { - output.token = token - return output - }) +async function getReservesDataV2(api) { + const tokens = await api.call({ abi: abiv2.getReservesList, target: LendingPoolV2, }) + const res = await api.multiCall({ abi: abiv2.getReserveData, target: LendingPoolV2, calls: tokens, }) + tokens.map((v, i) => res[i].token = v) + return res } const abiv2 = { @@ -117,6 +67,6 @@ module.exports = { }, bsc: { tvl: sdk.util.sumChainTvls([tvl, tvlV2]), - borrowed: sdk.util.sumChainTvls([borrowed, borrowedV2]), + borrowed: sdk.util.sumChainTvls([borrowedV2, ]), }, }; diff --git a/projects/mutuari/index.js b/projects/mutuari/index.js index e7240c73e3..f79c40a92d 100644 --- a/projects/mutuari/index.js +++ b/projects/mutuari/index.js @@ -1,12 +1,12 @@ const { sumTokens2 } = require("../helper/unwrapLPs") async function tvl(api) { - const pool = await api.call({ target: '0x831fc32221924f8a6d47251327ef67ebcc5cd6dc', abi: "address:mutuariPool" }) + const pool = await api.call({ target: '0x72b674D0546fda0C9B5205178740c98398456EaE', abi: "address:mutuariPool" }) const tokens = await api.call({ target: pool, abi: "address[]:getReserves" }) return sumTokens2({ api, owner: pool, tokens,}) } async function borrowed(api) { - const [_, borrowed] = await api.call({ target: '0x831fc32221924f8a6d47251327ef67ebcc5cd6dc', abi: "function getGeneralInfo() view returns (uint256 totalSupplied, uint256 totalBorrowed)" }) + const [_, borrowed] = await api.call({ target: '0x72b674D0546fda0C9B5205178740c98398456EaE', abi: "function getGeneralInfo() view returns (uint256 totalSupplied, uint256 totalBorrowed)" }) api.addGasToken(borrowed) return sumTokens2({ api }) } diff --git a/projects/mversex/index.js b/projects/mversex/index.js index 7dc4f3812b..64f498af32 100644 --- a/projects/mversex/index.js +++ b/projects/mversex/index.js @@ -2,6 +2,6 @@ const { getUniTVL } = require("../helper/unknownTokens"); module.exports = { misrepresentedTokens: true, kava: { - tvl: getUniTVL({ factory: "0x266F951c525130a4E230bB40F0e3525C6C99B9c5", useDefaultCoreAssets: true, fetchBalances: true, }), + tvl: getUniTVL({ factory: "0x266F951c525130a4E230bB40F0e3525C6C99B9c5", useDefaultCoreAssets: true, }), }, }; diff --git a/projects/myx-finance/index.js b/projects/myx-finance/index.js index 5033e2c8a3..4e491d969b 100644 --- a/projects/myx-finance/index.js +++ b/projects/myx-finance/index.js @@ -4,6 +4,7 @@ const ADDRESSES = require('../helper/coreAssets.json') const config = { arbitrum: { vault: '0x8932aA60A7b5EfEFA8Ec3ee899Fd238D029d10c6', fromBlock: 175954437 }, linea: { vault: '0x03f61a185efEEEFdd3Ba032AFa8A0259337CEd64', fromBlock: 2390784 }, + op_bnb: { vault: '0xCB9724cf580C09f3Cd7391F7fE20b5BF9cC4C428', fromBlock: 35581884 }, } Object.keys(config).forEach((chain) => { diff --git a/projects/nabla/index.js b/projects/nabla/index.js new file mode 100644 index 0000000000..e1fc5d8481 --- /dev/null +++ b/projects/nabla/index.js @@ -0,0 +1,23 @@ + +const { getLogs2 } = require('../helper/cache/getLogs') + +const config = { + base: { factory: '0x791Fee7b66ABeF59630943194aF17B029c6F487B', fromBlock: 19980311 }, + arbitrum: { factory: '0x7bcFc8b8ff61456ad7C5E2be8517D01df006d18d', fromBlock: 240797440 }, +} + +Object.keys(config).forEach(chain => { + const { factory, fromBlock } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: "event SwapPoolRegistered(address indexed sender, address pool, address asset)", fromBlock, }) + const pools = logs.map(log => log.pool) + const tokensAndOwners = logs.map(i => [i.asset, i.pool]) + let backstops = await api.multiCall({ abi: 'address:backstop', calls: pools }) + backstops = [...new Set(backstops)] + const bTokens = await api.multiCall({ abi: 'address:asset', calls: backstops }) + backstops.forEach((backstop, i) => tokensAndOwners.push([bTokens[i], backstop])) + return api.sumTokens({ tokensAndOwners }) + } + } +}) diff --git a/projects/nanoswap/index.js b/projects/nanoswap/index.js index 71ed6df848..8abc026ab4 100644 --- a/projects/nanoswap/index.js +++ b/projects/nanoswap/index.js @@ -1,12 +1,10 @@ const { getUniTVL } = require('../helper/unknownTokens') -const NANO = "0x28f45eA79c50d3ED9e1FA8A41dC8595F636eC34D"; const FACTORY = "0x41726eb94341fD27D5103DF3Cd6C387560c75B70" const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, - fetchBalances: true, }) diff --git a/projects/navi/index.js b/projects/navi/index.js index 24a12baa10..9ec651667a 100644 --- a/projects/navi/index.js +++ b/projects/navi/index.js @@ -1,10 +1,8 @@ -const ADDRESSES = require('../helper/coreAssets.json') const sui = require("../helper/chain/sui") +const { fetchURL } = require('../helper/utils') -const decimalShift = { - [ADDRESSES.sui.USDC]: -3, // USDC - [ADDRESSES.sui.USDT]: -3, // USDT - [ADDRESSES.sui.WETH]: -1, // WETH +function getDecimalShifts(dynamicFields){ + return fetchURL(`https://coins.llama.fi/prices/current/${dynamicFields.map(c=>`sui:0x${c.fields.value.fields.coin_type}`).join(',')}`).then(r=>r.data.coins) } const storageId = "0xbb4e2f4b6205c2e2a2db47aeb4f830796ec7c005f88537ee775986639bc442fe" @@ -14,11 +12,15 @@ async function borrow(api) { const reservesId = storageObject.fields.reserves.fields.id.id const dynamicFields = await sui.getDynamicFieldObjects({ parent: reservesId }) + const decimals = await getDecimalShifts(dynamicFields) + dynamicFields.forEach((data) => { const coin = '0x' + data.fields.value.fields.coin_type const borrowed = data.fields.value.fields.borrow_balance.fields.total_supply * data.fields.value.fields.current_borrow_index / 1e27 - const amount = borrowed * (10 ** (decimalShift[coin] ?? 0)) - api.add(coin, amount) + if(decimals["sui:"+coin]){ + const amount = borrowed * (10 ** (decimals["sui:"+coin].decimals - 9)) + api.add(coin, amount) + } }) } @@ -28,13 +30,16 @@ async function tvl(api) { const reservesId = storageObject.fields.reserves.fields.id.id const dynamicFields = await sui.getDynamicFieldObjects({ parent: reservesId }) + const decimals = await getDecimalShifts(dynamicFields) dynamicFields.forEach(object => { const coin = '0x' + object.fields.value.fields.coin_type const total_supply = object.fields.value.fields.supply_balance.fields.total_supply * object.fields.value.fields.current_supply_index / 1e27 const borrowed = object.fields.value.fields.borrow_balance.fields.total_supply * object.fields.value.fields.current_borrow_index / 1e27 - const amount = (total_supply - borrowed) * (10 ** (decimalShift[coin] ?? 0)) - api.add(coin, amount) + if(decimals["sui:"+coin]){ + const amount = (total_supply - borrowed) * (10 ** (decimals["sui:"+coin].decimals - 9)) + api.add(coin, amount) + } }) } diff --git a/projects/navigator/index.js b/projects/navigator/index.js new file mode 100644 index 0000000000..a01dbabaea --- /dev/null +++ b/projects/navigator/index.js @@ -0,0 +1,25 @@ +const { staking } = require("../helper/staking"); +const { gmxExports } = require("../helper/gmx"); +const { sumTokens2 } = require("../helper/unwrapLPs"); + +// sonic +const sonicVault = "0xe9263682E837eFabb145f8C632B9d2c518D90652"; +const sonicStaking = "0xEF8770E9506a8D1aAE3D599327a39Cf14B6B3dc4"; +const sonicNAVI = "0x6881B80ea7C858E4aEEf63893e18a8A36f3682f3"; + +// sonicV2 +const sonicV2Vault = "0x41cD8CaFc24A771031B9eB9C57cFC94D86045eB6"; +const sonicV2Assets = ["0x29219dd400f2bf60e5a23d13be72b486d4038894"] + +const tvl = async (api) => { + await Promise.all([ + gmxExports({ vault: sonicVault })(api), + sumTokens2({ api, tokens: sonicV2Assets, owner: sonicV2Vault })]) +}; + +module.exports = { + sonic: { + tvl, + staking: staking(sonicStaking, sonicNAVI) + } +} diff --git a/projects/nayms/index.js b/projects/nayms/index.js index 0aeb90282e..f2cf054f71 100644 --- a/projects/nayms/index.js +++ b/projects/nayms/index.js @@ -10,13 +10,23 @@ const tokens = [ ADDRESSES.ethereum.USDM, ]; +const tokensBase = [ + ADDRESSES.base.WETH, + ADDRESSES.base.USDC, + ADDRESSES.ethereum.USDM, +]; + const owner = "0x39e2f550fef9ee15b459d16bD4B243b04b1f60e5"; +const ownerBase = "0x546Fb1621CF8C0e8e3ED8E3508b7c5100ADdBc03"; module.exports = { methodology: "Sum assets on Nayms", - start: 1681990619, // Thu Apr 20 13:36:59 2023 GMT + start: '2023-04-20', // Thu Apr 20 13:36:59 2023 GMT + hallmarks: [[1681990619, "Nayms V3 Launch"]], ethereum: { tvl: sumTokensExport({ owner, tokens }), }, - hallmarks: [[1681990619, "Nayms V3 Launch"]], + base: { + tvl: sumTokensExport({ owner: ownerBase, tokens: tokensBase }), + }, }; diff --git a/projects/nbx/index.js b/projects/nbx/index.js index eb0c922834..055766e16a 100644 --- a/projects/nbx/index.js +++ b/projects/nbx/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -15,10 +16,7 @@ const config = { ] }, bitcoin: { - owners: [ - 'bc1qd79ypayqr03lmvcqc40udn6yuq4mve34ychy6a', - 'bc1qgxrcuzn62qjk3e3echysa9srg87la26x0qn2sa', - ] + owners: bitcoinAddressBook.nbx } } diff --git a/projects/nearpad/index.js b/projects/nearpad/index.js index d4091a13d8..063948ac8a 100644 --- a/projects/nearpad/index.js +++ b/projects/nearpad/index.js @@ -1,26 +1,8 @@ -const ADDRESSES = require('../helper/coreAssets.json') const { getUniTVL } = require('../helper/unknownTokens') -const tokens = [ - "0x885f8CF6E45bdd3fdcDc644efdcd0AC93880c781", - "0xC9BdeEd33CD01541e1eeD10f90519d2C06Fe3feB", - ADDRESSES.aurora.NEAR, - ADDRESSES.aurora.USDT_e, - "0xe3520349F477A5F6EB06107066048508498A291b", - ADDRESSES.aurora.USDC_e, - "0xF4eB217Ba2454613b15dBdea6e5f22276410e89e", - ADDRESSES.aurora.AURORA, - "0xFa94348467f64D5A457F75F8bc40495D33c65aBB", - "0x74974575d2f1668c63036d51ff48dbaa68e52408", - "0xdcD6D4e2B3e1D1E1E6Fa8C21C8A323DcbecfF970", - ADDRESSES.aurora.FRAX, -]; - - module.exports = { misrepresentedTokens: true, aurora: { tvl: getUniTVL({ factory: '0x34484b4E416f5d4B45D4Add0B6eF6Ca08FcED8f1', useDefaultCoreAssets: true }), }, -}; -// node test.js projects/nearpad/index.js +} diff --git a/projects/neby-dex/index.js b/projects/neby-dex/index.js new file mode 100644 index 0000000000..4aa7efb313 --- /dev/null +++ b/projects/neby-dex/index.js @@ -0,0 +1,9 @@ +const { uniV3GraphExport } = require("../helper/uniswapV3"); + +module.exports = { + sapphire: { + tvl: uniV3GraphExport({ + name: 'Neby Dex', graphURL: 'https://api.goldsky.com/api/public/project_clzi4lu67khgw01072ibvekvt/subgraphs/neby-dex-sapphire-mainnet/1.0.0/gn' + }), + } +} diff --git a/projects/neftyblocks/index.js b/projects/neftyblocks/index.js index b6f1fd65f8..252d393477 100644 --- a/projects/neftyblocks/index.js +++ b/projects/neftyblocks/index.js @@ -4,6 +4,7 @@ const tokens = [ ["eosio.token", "WAX", "wax"], ["alien.worlds", "TLM", "alien-worlds"], ["token.nefty", "NEFTY", "nefty"], + ["token.fusion", "LSWAX", "waxfusion-staked-wax"], ]; // NeftyBlocks diff --git a/projects/neku/index.js b/projects/neku/index.js index d53cb04b92..481b15c1bc 100644 --- a/projects/neku/index.js +++ b/projects/neku/index.js @@ -1,9 +1,8 @@ -const { usdCompoundExports } = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound') -const unitroller = "0xD5B649c7d27C13a2b80425daEe8Cb6023015Dc6B" -// node test.js projects/neku/index.js +const comptroller = "0xD5B649c7d27C13a2b80425daEe8Cb6023015Dc6B" module.exports = { - arbitrum:usdCompoundExports(unitroller, "arbitrum", "0xBC4a19345c598D73939b62371cF9891128ecCB8B"), - moonriver:usdCompoundExports(unitroller, "moonriver", "0xBC4a19345c598D73939b62371cF9891128ecCB8B"), - bsc: usdCompoundExports(unitroller, "bsc", "0xBC4a19345c598D73939b62371cF9891128ecCB8B"), + arbitrum: compoundExports2({ comptroller, cether: '0xbc4a19345c598d73939b62371cf9891128eccb8b' }), + moonriver: compoundExports2({ comptroller, cether: '0xbc4a19345c598d73939b62371cf9891128eccb8b' }), + bsc: compoundExports2({ comptroller, cether: '0xbc4a19345c598d73939b62371cf9891128eccb8b' }), } \ No newline at end of file diff --git a/projects/neopin-staking/index.js b/projects/neopin-staking/index.js index 05ca376686..a2f9b78e1d 100644 --- a/projects/neopin-staking/index.js +++ b/projects/neopin-staking/index.js @@ -11,6 +11,7 @@ module.exports = { "0xf9d92BAd7b1410dfFB0a204B7aa418C9fd5A898F", "0xf20816C9bdcb25da3ba79b206e9b7107ae02ae10", "0x489d6d679F1CA4cFE6976C55B54427D1AaDb8057", + "0x184E039D35cce96511E32c1aF85907664fb0e646" ], tokens: [nullAddress], }), diff --git a/projects/neptune-mutual/index.js b/projects/neptune-mutual/index.js index 87fdb23f5b..41dbb0d853 100644 --- a/projects/neptune-mutual/index.js +++ b/projects/neptune-mutual/index.js @@ -39,7 +39,7 @@ async function tvl(api) { module.exports = { methodology: "TVL consists of the total liquidity available in the cover pools", - start: 1667260800, // Nov 01 2022 @ 12:00am (UTC) + start: '2022-11-01', // Nov 01 2022 @ 12:00am (UTC) ethereum: { tvl }, arbitrum: { tvl }, bsc: { tvl }, diff --git a/projects/neptune/index.js b/projects/neptune/index.js new file mode 100644 index 0000000000..f9e3911486 --- /dev/null +++ b/projects/neptune/index.js @@ -0,0 +1,20 @@ +const { getUniTVL } = require('../helper/unknownTokens.js') +const config = { + swellchain: { + factory: '0xD78a40cA54090f4178c9c9212c78e9E0C2722231', + }, +} + +Object.keys(config).forEach(chain => { + const { factory, } = config[chain] + module.exports[chain] = { + tvl: getUniTVL({ + factory, useDefaultCoreAssets: true, fetchBalances: true, abis: { + allPairsLength: 'uint256:allPoolsLength', + allPairs: "function allPools(uint) view returns (address)", + } + }) + } +}) + +module.exports.misrepresentedTokens = true \ No newline at end of file diff --git a/projects/nerve/index.js b/projects/nerve/index.js index 2a3aba64d5..1c1d957045 100644 --- a/projects/nerve/index.js +++ b/projects/nerve/index.js @@ -24,7 +24,7 @@ const ownerTokens = [ module.exports = { misrepresentedTokens: true, - start: 1614556800, // March 1, 2021 00:00 AM (UTC) + start: '2021-03-01', // March 1, 2021 00:00 AM (UTC) bsc:{ tvl: sumTokensExport({ ownerTokens }), staking:staking(xnrvAddress, nrv) diff --git a/projects/nervenetworkbridge/index.js b/projects/nervenetworkbridge/index.js index 633d888b88..afa9e54298 100644 --- a/projects/nervenetworkbridge/index.js +++ b/projects/nervenetworkbridge/index.js @@ -3,6 +3,8 @@ const sdk = require("@defillama/sdk"); const { getConfig } = require('../helper/cache') const { get } = require('../helper/http') const { BigNumber } = require("bignumber.js"); +const { sumTokensExport } = require("../helper/sumTokens"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js'); const getBridgeContract = { 'ethereum': '0xC707E0854DA2d72c90A7453F8dc224Dd937d7E82', @@ -87,6 +89,8 @@ async function tronTvl(api) { module.exports = { methodology: "Assets staked in the pool and trading contracts", + doublecounted: true, + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.nerveNetworkBridge }) }, tron: { tvl: tronTvl }, diff --git a/projects/nest-staking/index.js b/projects/nest-staking/index.js new file mode 100644 index 0000000000..9c9bec13c4 --- /dev/null +++ b/projects/nest-staking/index.js @@ -0,0 +1,17 @@ + +const RWA_STAKING = "0xdbd03d676e1cf3c3b656972f88ed21784372acab" +const RESERVE_STAKING = "0xba0ae7069f94643853fce3b8af7f55acbc11e397" +const SBTC = "0x094c0e36210634c3CfA25DC11B96b562E0b07624" +const STONE = "0x7122985656e38bdc0302db86685bb972b145bd3c" + +async function tvl(api) { + // Get allowed stablecoins from RWA Staking + const stablecoins = await api.call({ target: RWA_STAKING, abi: 'address[]:getAllowedStablecoins', }) + const ownerTokens = [[stablecoins, RWA_STAKING], [[SBTC, STONE], RESERVE_STAKING]] + return api.sumTokens({ ownerTokens}) +} + +module.exports = { + methodology: "Counts total value locked in both RWA Staking (stablecoins) and Reserve Staking (SBTC and STONE) contracts", + ethereum: { tvl } +} \ No newline at end of file diff --git a/projects/nest/index.js b/projects/nest/index.js index a19ee7ba48..0d0d815c4f 100644 --- a/projects/nest/index.js +++ b/projects/nest/index.js @@ -1,56 +1,48 @@ -const sdk = require("@defillama/sdk"); -const { getChainTransform } = require("../helper/portedTokens"); -const { sumTokensSharedOwners } = require("../helper/unwrapLPs"); -const contracts = require('./contracts'); +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs"); -function staking(chain) { - return async (timestamp, block, chainBlocks) => { - return { - [contracts.NEST.ethereum]: - (await sdk.api.abi.multiCall({ - target: contracts.NEST[chain], - calls: contracts.stakingContracts[chain].map(h => ({ - params: h - })), - block: chainBlocks[chain], - abi: 'erc20:balanceOf', - chain - })).output.map(b => b.output) - .reduce((a, b) => Number(a) + Number(b), 0) - }; - }; -} - -function tvl(chain) { - return async (timestamp, block, chainBlocks) => { - const balances = {}; - const transform = await getChainTransform(chain); - - if (!contracts.tvlContracts.hasOwnProperty([chain])) { - return balances; - } +module.exports = { + methodology: "Counts NEST tokens that have been staked in the nest dapp", +}; - await sumTokensSharedOwners( - balances, - contracts.tokens[chain], - contracts.tvlContracts[chain], - chainBlocks[chain], - chain, - transform - ); - return balances; - }; +const config = { + ethereum: { + tvlContracts: ['0xE544cF993C7d477C7ef8E91D28aCA250D135aa03'], + tokens: [ + "0x0316EB71485b0Ab14103307bf65a021042c6d380" + ], + NEST: '0x04abEdA201850aC0124161F037Efd70c74ddC74C', + stakingContracts: [ + "0xaA7A74a46EFE0C58FBfDf5c43Da30216a8aa84eC", + "0x505eFcC134552e34ec67633D1254704B09584227", + "0x9a5C88aC0F209F284E35b4306710fEf83b8f9723", + "0x34B931C7e5Dc45dDc9098A1f588A0EA0dA45025D", + "0xE544cF993C7d477C7ef8E91D28aCA250D135aa03" + ] + }, + bsc: { + tvlContracts: ['0x9484f12044b9d5707AfeaC5BD02b5E0214381801'], + tokens: [ + ADDRESSES.bsc.USDT + ], + NEST: '0x98f8669F6481EbB341B522fCD3663f79A3d1A6A7', + stakingContracts: ["0x09CE0e021195BA2c1CDE62A8B187abf810951540"] + }, + polygon: { + NEST: '0x98f8669F6481EbB341B522fCD3663f79A3d1A6A7', + stakingContracts: ["0x09CE0e021195BA2c1CDE62A8B187abf810951540"] + }, + kcc: { + NEST: '0x98f8669F6481EbB341B522fCD3663f79A3d1A6A7', + stakingContracts: ["0x7DBe94A4D6530F411A1E7337c7eb84185c4396e6"] + }, } -const chainExports = Object.keys(contracts.stakingContracts).reduce((a, chain) => ({ - ...a, [chain]: { - tvl: tvl(chain), - staking: staking(chain) - } -}), {}) - -module.exports = { - methodology: "Counts NEST tokens that have been staked in the nest dapp", - ...chainExports -}; \ No newline at end of file +Object.keys(config).forEach(chain => { + const { NEST: token, stakingContracts = [], tokens = [], tvlContracts = [] } = config[chain] + module.exports[chain] = { + tvl: sumTokensExport({ tokens, owners: tvlContracts }), + staking: token ? sumTokensExport({ token, owners: stakingContracts }) : undefined, + } +}) \ No newline at end of file diff --git a/projects/neuralai/index.js b/projects/neuralai/index.js new file mode 100644 index 0000000000..50b7109824 --- /dev/null +++ b/projects/neuralai/index.js @@ -0,0 +1,14 @@ +const { staking } = require('../helper/staking'); + +const CONTRACT_ADDRESS = "0xbe2cf8DA9887e2AB997Ed53cC49263eBD09B20C3"; +const TOKENS = [ + "0x32B053F2CBA79F80ada5078cb6b305da92BDe6e1", // neural + "0x77E06c9eCCf2E797fd462A92B6D7642EF85b0A44" // wtao +]; + +module.exports = { + ethereum: { + tvl: () => ({}), + staking: staking(CONTRACT_ADDRESS, TOKENS), + }, +}; diff --git a/projects/neutral-trade/constants.js b/projects/neutral-trade/constants.js new file mode 100644 index 0000000000..28ccc53d31 --- /dev/null +++ b/projects/neutral-trade/constants.js @@ -0,0 +1,141 @@ +const DATA_URL = 'https://raw.githubusercontent.com/neutral-trade/vaults-data/main'; + +const START_TIMESTAMP = 1730419200; // 2024-11-01 + + +const TOKENS = { + USDC: { + name: 'USDC', + mint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', + decimals: 6 + }, + SOL: { + name: 'SOL', + mint: 'So11111111111111111111111111111111111111112', + decimals: 9 + }, + WBTC: { + name: 'Wrapped BTC (Wormhole) (WBTC)', + mint: '3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh', + decimals: 8 + }, + WETH: { + name: 'Wrapped ETH (Wormhole) (WETH)', + mint: '7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs', + decimals: 8 + } +}; + +const VAULTS = [ + { + name: "USDC Basis (Perps Basket)", + address: "4cvgasNfbJ36yeMVJSkscgL2Yco9dFGdj52Wrg91fmHv", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/btcethfunding.json` + }, + { + name: "BTC Super Staking", + address: "BVddkVtFJLCihbVrtLo8e3iEd9NftuLunaznAxFFW8vf", + token: TOKENS.WBTC, + dataUrl: `${DATA_URL}/btcjlpnl.json` + }, + { + name: "ETH Super Staking", + address: "ENr5e1BMN5vFUHf4iCCPzR4GjWCKgtHnQcdniRQqMdEL", + token: TOKENS.WETH, + dataUrl: `${DATA_URL}/ethjlpnl.json` + }, + { + name: "USDC Staking (JLP Delta Neutral) v1", + //programId: "9Fcn3Fd4d5ocrb12xCUtEvezxcjFEAyHBPfrZDiPt9Qj", + address: "3Nkctq19AW7gs5hkxixUDjS9UVjmCwcNCo7rqPpub87c", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/jlpdn.json`, + }, + { + name: "USDC Staking (JLP Delta Neutral) v2", + address: "41Y8C4oxk4zgJT1KXyQr35UhZcfsp5mP86Z2G7UUzojU", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/jlpdnv2.json` + }, + { + name: "USDC Staking (JLP Delta Neutral) v3", + address: "7ngzeBygEksaBvKzHEeihqoLpDpWqTNRMVh2wCyb6NP8", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/jlpdnv3.json` + }, + { + name: "USDC Basis (Sanctum-INF)", + address: "CxL8eQmGhN9LKSoHj7bU95JekFPtyZoUc57mbehb5A56", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/solbasis.json` + }, + { + name: "SOL Super Staking", + address: "EuSLjg23BrtwYAk1t4TFe5ArYSXCVXLBqrHRBfWQiTeJ", + token: TOKENS.SOL, + dataUrl: `${DATA_URL}/soljlpnl.json` + }, + { + name: "JLP Traders Print", + address: "85XuR4kE5yxp1hk91WHAawinXZsuJowxy59STYYpM9pK", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/tradersprint.json` + }, + { + name: "JLP Traders Rekt", + address: "2r81MPMDjGSrbmGRwzDg6aqhe3t3vbKcrYfpes5bXckS", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/tradersrekt.json` + }, + { + name: "vip01", + address: "CZU38L2NyL6tqFxzYAGYkmkf2JG98tZfZ2CnUapVgXQe", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/vip01.json` + }, + { + name: "vip02", + address: "DUW6uWcrsjYmsYDjp9iGDN4JdRa2MqznjuxjKVok5Fsj", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/vip02.json` + }, + { + name: "vip03", + address: "Fd3k4c6Dv7m9673ae87P6duQrftY9UVfwiCxngNbJrUQ", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/vip03.json` + }, + // 'vip04', // currently inactive + { + name: "vip05", + address: "9BMEyctGvajEubk5iCRBnM9fkeTXUhrxaweYq34jZdC8", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/vip05.json` + }, + { + name: "vip06", + address: "6DFDj66PbPoTC16Sh51MJijoTTMYCbMCVC85tnc5UfQ3", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/vip06.json` + }, + { + name: "vip07", + address: "HTLvAjqc6Wkzh4i4QNLHhQHZAnrtVvkGyYeyCiUWLe9b", + token: TOKENS.USDC, + dataUrl: `${DATA_URL}/vip07.json` + }, + { + name: "vip08", + address: "CYUyHzu6Z3JyBhfkQpZZwWqa2zpcmzaK1xXS96n8ea1U", + token: TOKENS.SOL, + dataUrl: `${DATA_URL}/vip08.json` + } +]; + +module.exports = { + DATA_URL, + START_TIMESTAMP, + TOKENS, + VAULTS, +}; diff --git a/projects/neutral-trade/index.js b/projects/neutral-trade/index.js new file mode 100644 index 0000000000..6abdd85f65 --- /dev/null +++ b/projects/neutral-trade/index.js @@ -0,0 +1,17 @@ +const { VAULTS, START_TIMESTAMP } = require("./constants") +const { drift: { vaultTvl } } = require("../helper/chain/rpcProxy") + +async function tvl(api) { + for (const vault of VAULTS) { + const token_tvl = await vaultTvl(vault.address, vault.version); + api.add(vault.token.mint, token_tvl); + } +} + + +module.exports = { + start: START_TIMESTAMP, + timetravel: false, + methodology: "The combined TVL and PnL of all public and private vaults.", + solana: { tvl }, +}; diff --git a/projects/newland/index.js b/projects/newland/index.js index 3f979353ef..58cb18ef7d 100644 --- a/projects/newland/index.js +++ b/projects/newland/index.js @@ -3,21 +3,12 @@ const abi = require("./abi.json") const { unwrapLPsAuto, } = require("../helper/unwrapLPs"); const { getChainTransform } = require("../helper/portedTokens"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const BoosterStakingChef_Heco = "0x7970234cDfa8898853Eaa1e2586cE933d9054af8"; const MdexStakingChef_Heco = "0x44aEfA01E92d170C915D87C2AB03D03cA49D5cb5"; const LavaStakingChef_heco = "0x9B948c946BE7F062D2075744142896F08D32a8A5"; const SushiStakingChef_Ethereum = "0x0503866eD9F304Ec564F145d22994F7f11838596"; -const treasuryAddress = "0xB3FC6B9be3AD6b2917d304d4F5645a311bCFd0A8"; -const erc20Tokens = [ - //MDX - "0x25d2e80cb6b86881fd7e07dd263fb79f4abe033c", - //BOO - "0xff96dccf2763d512b6038dc60b7e96d1a9142507", -]; - const calcTvl = async (balances, chain, block, poolInfo, StakingChef, transform) => { const lengthOfPool = ( await sdk.api.abi.call({ @@ -42,14 +33,6 @@ const calcTvl = async (balances, chain, block, poolInfo, StakingChef, transform) }) }; -/*** Treasury ***/ -const Treasury = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - let transformAddress = await getChainTransform('heco') - await sumTokensAndLPsSharedOwners(balances, erc20Tokens.map(t => [t, false]), [treasuryAddress], chainBlocks["heco"], "heco", transformAddress); - return balances; -}; - /*** Heco TVL Portion ***/ const hecoTvl = async (timestamp, ethBlock, { heco: block }) => { const balances = {}; diff --git a/projects/nexon/index.js b/projects/nexon/index.js index 58dc85629c..243ef0fd37 100644 --- a/projects/nexon/index.js +++ b/projects/nexon/index.js @@ -1,16 +1,9 @@ const sdk = require('@defillama/sdk') const { compoundExports, compoundExports2 } = require('../helper/compound'); -const { nullAddress } = require('../helper/tokenMapping'); const comptroller = "0x0171cA5b372eb510245F5FA214F5582911934b3D" -const abis = { - getReservesABI: 'function getReserves() view returns (uint112 _reserve0, uint112 _reserve1)' -} - -const lendingMarket = compoundExports(comptroller, 'era', '0x1BbD33384869b30A323e15868Ce46013C82B86FB', nullAddress, undefined, undefined, { - resolveLPs: true, abis -}) +const lendingMarket = compoundExports(comptroller, '0x1BbD33384869b30A323e15868Ce46013C82B86FB') const lendingMarket2 = compoundExports2({ comptroller: '0xc955d5fa053d88e7338317cc6589635cd5b2cf09', cether: '0x22d8b71599e14f20a49a397b88c1c878c86f5579', blacklistedTokens: [ '0x247b1891c1d04d5972658824dcfbab71b0e9ca1d', diff --git a/projects/nexton/index.js b/projects/nexton/index.js new file mode 100644 index 0000000000..0c5a3dde02 --- /dev/null +++ b/projects/nexton/index.js @@ -0,0 +1,14 @@ +const { call } = require("../helper/chain/ton"); + +const contractAddress = "EQBED_4VLQC-SRdrVCtmcmwO7PtnvdLSRFRYNaGIZBqpaQHQ"; + +const tvl = async (api) => { + const tonStaked = (await call({ target: contractAddress, abi: "tonStaked" }))[0]; + api.addGasToken(tonStaked) +} + +module.exports = { + ton: { + tvl + } +} diff --git a/projects/nexus/index.js b/projects/nexus/index.js index 7a63c3a307..2e46140c93 100644 --- a/projects/nexus/index.js +++ b/projects/nexus/index.js @@ -9,6 +9,6 @@ async function tvl(api) { module.exports = { misrepresentedTokens: true, - start: 1558569600, // 05/23/2019 @ 12:00am (UTC) + start: '2019-05-23', // 05/23/2019 @ 12:00am (UTC) ethereum: { tvl } } diff --git a/projects/nexusbtc/index.js b/projects/nexusbtc/index.js new file mode 100644 index 0000000000..5c9d73b3dc --- /dev/null +++ b/projects/nexusbtc/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require('../helper/sumTokens'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +//https://www.matrixport.com/nexusbtcReserve + +module.exports = { + methodology: 'The total value locked (TVL) is calculated by summing up the balances of BTC wallets specified in the NexusBTC address list within the bitcoin address book', + bitcoin: { + tvl: sumTokensExport({ owners: bitcoinAddressBook.nexusbtc }), + }, +}; \ No newline at end of file diff --git a/projects/nfazone/index.js b/projects/nfazone/index.js new file mode 100644 index 0000000000..af81755201 --- /dev/null +++ b/projects/nfazone/index.js @@ -0,0 +1,21 @@ +const { queryContract, sumTokens } = require("../helper/chain/cosmos"); + +const nfaContract = "neutron1pwjn3tsumm3j7v7clzqhjsaukv4tdjlclhdytawhet68fwlz84fqcrdyf5"; + +async function tvl(api) { + const baseDenoms = await queryContract({ contract: nfaContract, chain: "neutron", data: "{\"get_base_denoms\":{}}" }); + const assets = baseDenoms.map(({ denom }) => denom); + return await sumTokens({ + owners: [nfaContract], + chain: "neutron", + tokens: assets, + api, + }); +} + +module.exports = { + methodology: "Queries the NFA.zone contract to get the supported base assets. The sum of all these base assets held by the contract is returned.", + neutron: { + tvl + } +} \ No newline at end of file diff --git a/projects/nfthive/index.js b/projects/nfthive/index.js new file mode 100644 index 0000000000..8df589effb --- /dev/null +++ b/projects/nfthive/index.js @@ -0,0 +1,27 @@ +const { get_account_tvl } = require("../helper/chain/eos"); + +const tokens = [ + ["eosio.token", "WAX", "wax"], + ["alien.worlds", "TLM", "alien-worlds"], + ["wuffi", "WUF", "wuffi"], +]; + +// NFTHive +// https://nfthive.io +async function wax() { + const accounts = ["nfthivedrops", "nfthivepacks", "nfthivecraft"]; + return await get_account_tvl(accounts, tokens, "wax"); +} + +async function staking() { + const accounts = ["nfthivevault"]; + return await get_account_tvl(accounts, tokens, "wax"); +} + +module.exports = { + methodology: `NFTHive TVL is achieved by querying token balances from NFT market contracts.`, + wax: { + tvl: wax, + staking + }, +} \ No newline at end of file diff --git a/projects/ngad-euclid/index.js b/projects/ngad-euclid/index.js index f0e63e74a7..449c984f18 100644 --- a/projects/ngad-euclid/index.js +++ b/projects/ngad-euclid/index.js @@ -15,6 +15,7 @@ async function tvl(_, _1, _2, {api}) { } module.exports = { + doublecounted: true, ethereum: { tvl } diff --git a/projects/ngmizone/index.js b/projects/ngmizone/index.js new file mode 100644 index 0000000000..732eec07a1 --- /dev/null +++ b/projects/ngmizone/index.js @@ -0,0 +1,23 @@ +const { sumTokens } = require("../helper/chain/cosmos"); + +const ngmiContract = "neutron1xcjn7d2f6p2kjqdxtvm4dzeqay98hcmtts92uugw7efnz4zc05csyhhvq6"; + +const supportedAssets = [ + "untrn", +]; + +async function tvl(api) { + return await sumTokens({ + owners: [ngmiContract], + chain: "neutron", + tokens: supportedAssets, + api, + }); +} + +module.exports = { + methodology: "Totals the $NTRN balance held by the NGMI.zone contract.", + neutron: { + tvl + } +} \ No newline at end of file diff --git a/projects/nightmare/index.js b/projects/nightmare/index.js index c3d3efe515..caa5aff4ca 100644 --- a/projects/nightmare/index.js +++ b/projects/nightmare/index.js @@ -7,4 +7,5 @@ module.exports = masterchefExports({ }) module.exports.hallmarks = [ [1646179200, "Rug Pull"] -] \ No newline at end of file +], +module.exports.deadFrom='2022-03-02' \ No newline at end of file diff --git a/projects/nimbora_lst/erc4626abi.js b/projects/nimbora_lst/erc4626abi.js new file mode 100644 index 0000000000..8da32a0d8c --- /dev/null +++ b/projects/nimbora_lst/erc4626abi.js @@ -0,0 +1,20 @@ +const ERC4626Abi = [ + { + "name": "total_assets", + "type": "function", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view" + } +] + +const ERC4626AbiMap = {} +ERC4626Abi.forEach(i => ERC4626AbiMap[i.name] = i) + +module.exports = { + ERC4626AbiMap +} \ No newline at end of file diff --git a/projects/nimbora_lst/index.js b/projects/nimbora_lst/index.js new file mode 100644 index 0000000000..1a7a7d5010 --- /dev/null +++ b/projects/nimbora_lst/index.js @@ -0,0 +1,24 @@ +const {multiCall} = require("../helper/chain/starknet"); +const ADDRESSES = require('../helper/coreAssets.json'); +const { ERC4626AbiMap } = require('./erc4626abi') + +const LiquidStakingData = [{ + address: "0x076c4b7bb1ce744e4aae2278724adedd4906ab89998623fe1715877ecb583bde", + token: ADDRESSES.starknet.STRK +}] + +async function tvl(api) { + const totalAssets = await multiCall({ + calls: LiquidStakingData.map(c => c.address), + abi: ERC4626AbiMap.total_assets + }); + api.addTokens(LiquidStakingData.map(c => c.token), totalAssets); +} + +module.exports = { + doublecounted: true, + methodology: "The TVL is the total staked STRK managed by Nimbora Lst", + starknet: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/nirvana-v2/index.js b/projects/nirvana-v2/index.js new file mode 100644 index 0000000000..b0b6961e34 --- /dev/null +++ b/projects/nirvana-v2/index.js @@ -0,0 +1,12 @@ +const { sumTokens2 } = require('../helper/solana') + +async function tvl(api) { + return sumTokens2({ tokenAccounts: ['FhTJEGXVwj4M6NQ1tPu9jgDZUXWQ9w2hP89ebZHwrJPS'] }) +} + +module.exports = { + timetravel: false, + solana: { + tvl, + } +} \ No newline at end of file diff --git a/projects/noble/index.js b/projects/noble/index.js index ec6c789752..2b8e8580ed 100644 --- a/projects/noble/index.js +++ b/projects/noble/index.js @@ -1,26 +1,16 @@ const { queryV1Beta1 } = require('../helper/chain/cosmos'); -const { sumTokens2 } = require('../helper/unwrapLPs'); - -const NOBLE_DENOMS_URL = 'bank/v1beta1/denoms_metadata'; -const NOBLE_SUPPLY_URL = 'bank/v1beta1/supply/'; +const NOBLE_SUPPLY_URL = 'bank/v1beta1/supply'; const IGNORE_DENOMS = ['ufrienzies', 'ustake']; async function tvl(api) { - const { metadatas } = await queryV1Beta1({ api, url: NOBLE_DENOMS_URL }); - - for (const metadata of metadatas) { - const baseDenom = metadata.base; - - // ignore invalid denoms - if (IGNORE_DENOMS.includes(baseDenom)) - continue; - - // fetch supply for denom - const { amount } = await queryV1Beta1({ api, url: `${NOBLE_SUPPLY_URL}${baseDenom}` }); - api.add(baseDenom, amount.amount); - } - return sumTokens2({ api }); + let key + do { + const { supply, pagination } = await queryV1Beta1({ api, url: `${NOBLE_SUPPLY_URL}?pagination.key=${key || ''}` }) + key = pagination.next_key + supply.forEach(i => api.add(i.denom, i.amount)) + } while (key); + IGNORE_DENOMS.forEach(denom => api.removeTokenBalance(denom)) } module.exports = { diff --git a/projects/nodo/index.js b/projects/nodo/index.js new file mode 100644 index 0000000000..072549e7c4 --- /dev/null +++ b/projects/nodo/index.js @@ -0,0 +1,58 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') + +const config = { + avax: { + owners: [ + "0xB4623b02A0D9bCf0282600C08E4383c04A0E0AfC", + "0x29Ff7d778890F40ccE8E74de67D082c0e2DCc1Bc" + ], + tokens: [ + "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7" + ] + }, + polygon: { + owners: [ + "0x1e579a1AE5DA042C925902F3Efec1035C9329283", + "0x29Ff7d778890F40ccE8E74de67D082c0e2DCc1Bc", + "0xA4F335B528a24eBDeA10e5CcE14E9750929BBE34" + ], + tokens: [ + "0xc2132D05D31c914a87C6611C10748AEb04B58e8F" + ] + }, + base: { + owners: [ + "0xEcc253aeAeC63bcB2b8eC6A739A0972A817219A3", + "0x29Ff7d778890F40ccE8E74de67D082c0e2DCc1Bc" + ], + tokens: [ + "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" + ] + }, + bsc: { + owners: [ + "0x916A6314e9d8E51BEB18b355ad52b4506262620f", + "0x29Ff7d778890F40ccE8E74de67D082c0e2DCc1Bc" + ], + tokens: [ + "0x55d398326f99059fF775485246999027B3197955" + ] + }, + celo: { + owners: [ + "0x65583D94d848E398dE3ef8382e5827000eb99961", + "0x29Ff7d778890F40ccE8E74de67D082c0e2DCc1Bc" + ], + tokens: [ + "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e" + ] + } +} + +Object.keys(config).forEach(async (chain) => { + const { owners, tokens } = config[chain] + + module.exports[chain] = { + tvl: sumTokensExport({ owners: owners, tokens }) + } +}); \ No newline at end of file diff --git a/projects/nolus/index.js b/projects/nolus/index.js index 3bc9d8ee92..653dab1afb 100644 --- a/projects/nolus/index.js +++ b/projects/nolus/index.js @@ -12,6 +12,26 @@ const osmosisAxlOracleAddr = 'nolus1vjlaegqa7ssm2ygf2nnew6smsj8ref9cmurerc7pzwxq const osmosisAxlLeaserAddr = 'nolus1wn625s4jcmvk0szpl85rj5azkfc6suyvf75q6vrddscjdphtve8s5gg42f' const osmosisAxlLppAddr = 'nolus1qg5ega6dykkxc307y25pecuufrjkxkaggkkxh7nad0vhyhtuhw3sqaa3c5' +// Osmosis stATOM Protocol Contracts (OSMOSIS-OSMOSIS-ST_ATOM) pirin-1 +const osmosisStAtomOracleAddr = 'nolus1mtcv0vhpt94s82mcemj5sc3v94pq3k2g62yfa5p82npfnd3xqx8q2w8c5f' +const osmosisStAtomLeaserAddr = 'nolus1xv0erzdcphnpkf8tr76uynldqx6sspw7782zg9wthz8xpemh7rnsv4nske' +const osmosisStAtomLppAddr = 'nolus1jufcaqm6657xmfltdezzz85quz92rmtd88jk5x0hq9zqseem32ysjdm990' + +// Osmosis allBTC Protocol Contracts (OSMOSIS-OSMOSIS-ALL_BTC) pirin-1 +const osmosisBtcOracleAddr = 'nolus1y0nlrnw25mh2vxhaupamwca4wdvuxs26tq4tnxgjk8pw0gxevwfq5ry07c' +const osmosisBtcLeaserAddr = 'nolus1dzwc9hu9aqlmm7ua4lfs2lyafmy544dd8vefsmjw57qzcanhsvgsf4u3ld' +const osmosisBtcLppAddr = 'nolus1w2yz345pqheuk85f0rj687q6ny79vlj9sd6kxwwex696act6qgkqfz7jy3' + +// Osmosis allSOL Protocol Contracts (OSMOSIS-OSMOSIS-ALL_SOL) pirin-1 +const osmosisSolOracleAddr = 'nolus153kmhl85vavd03r9c7ardw4fgydge6kvvhrx5v2uvec4eyrlwthsejc6ce' +const osmosisSolLeaserAddr = 'nolus1lj3az53avjf8s9pzwvfe86d765kd7cmnhjt76vtqxjvn08xu0c6saumtza' +const osmosisSolLppAddr = 'nolus1qufnnuwj0dcerhkhuxefda6h5m24e64v2hfp9pac5lglwclxz9dsva77wm' + +// Osmosis AKT Protocol Contracts (OSMOSIS-OSMOSIS-AKT) pirin-1 +const osmosisAktOracleAddr = 'nolus12sx0kr60rptp846z2wvuwyxn47spg55dcnzwrhl4f7nfdduzsrxq7rfetn' +const osmosisAktLeaserAddr = 'nolus1shyx34xzu5snjfukng323u5schaqcj4sgepdfcv7lqfnvntmq55sj94hqt' +const osmosisAktLppAddr = 'nolus1lxr7f5xe02jq6cce4puk6540mtu9sg36at2dms5sk69wdtzdrg9qq0t67z' + // Astroport Protocol Contracts (NEUTRON-ASTROPORT-USDC_AXELAR) pirin-1 const astroportOracleAddr = 'nolus1jew4l5nq7m3xhkqzy8j7cc99083m5j8d9w004ayyv8xl3yv4h0dql2dd4e' const astroportLppAddr = 'nolus1qqcr7exupnymvg6m63eqwu8pd4n5x6r5t3pyyxdy7r97rcgajmhqy3gn94' @@ -51,11 +71,20 @@ async function getLppTvl(lppAddresses) { const lpps = await queryManyContracts({ contracts: lppAddresses, chain: 'nolus', data: { 'lpp_balance': [] } }) let totalLpp = 0 + let divisor = _6Zeros; // Default 6 decimals + + // Adjust divisor based on specific addresses for allBTC and allSOL + if (lppAddresses.includes(osmosisBtcLppAddr)) { + divisor = 100000000; // 8 decimals for BTC + } else if (lppAddresses.includes(osmosisSolLppAddr)) { + divisor = 1000000000; // 9 decimals for SOL + } + lpps.forEach(v => { totalLpp += Number(v.balance.amount) }) - return totalLpp / _6Zeros + return totalLpp / divisor; } function sumAssests(balances, leases, currencies) { @@ -103,7 +132,11 @@ module.exports = { tvl: async () => { return { 'axlusdc': await getLppTvl([osmosisAxlLppAddr, astroportLppAddr]), - 'usd-coin': await getLppTvl([osmosisNobleLppAddr, astroportNobleLppAddr]) + 'usd-coin': await getLppTvl([osmosisNobleLppAddr, astroportNobleLppAddr]), + 'stride-staked-atom': await getLppTvl([osmosisStAtomLppAddr]), + 'osmosis-allbtc': await getLppTvl([osmosisBtcLppAddr]), + 'osmosis-allsol': await getLppTvl([osmosisSolLppAddr]), + 'akash-network': await getLppTvl([osmosisAktLppAddr]) } } }, @@ -120,6 +153,10 @@ module.exports = { return await tvl([ { leaser: osmosisNobleLeaserAddr, oracle: osmosisNobleOracleAddr }, { leaser: osmosisAxlLeaserAddr, oracle: osmosisAxlOracleAddr }, + { leaser: osmosisStAtomLeaserAddr, oracle: osmosisStAtomOracleAddr }, + { leaser: osmosisBtcLeaserAddr, oracle: osmosisBtcOracleAddr }, + { leaser: osmosisSolLeaserAddr, oracle: osmosisSolOracleAddr }, + { leaser: osmosisAktLeaserAddr, oracle: osmosisAktOracleAddr } ]) } } diff --git a/projects/nomad/index.js b/projects/nomad/index.js index a9b18f894b..6c7b0dfc7f 100644 --- a/projects/nomad/index.js +++ b/projects/nomad/index.js @@ -87,6 +87,5 @@ module.exports = { [1659312000,"trusted root exploit"] ], methodology: 'counts the total amount of assets locked in the Nomad token bridge.', - start: 13983843, ...chainExports(tvl, Object.keys(HOME_CHAINS)) }; diff --git a/projects/nonkyc/index.js b/projects/nonkyc/index.js index 3715eed480..160c768d6a 100644 --- a/projects/nonkyc/index.js +++ b/projects/nonkyc/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { /* @@ -30,9 +31,7 @@ const config = { }, /* bitcoin: { - owners: [ - 'bc1qy8xx8fcsmdlc447ls4wzw2tn3y6c6cy64wckhz', - ] + owners: bitcoinAddressBook.nonkyc }, // remove it for now /* bitcoincash: { diff --git a/projects/nostra/index.js b/projects/nostra/index.js index e8034e051c..f10eb98de4 100644 --- a/projects/nostra/index.js +++ b/projects/nostra/index.js @@ -62,6 +62,26 @@ const supplyTokens = [ "0x036e722e04ef2ccadb9229b5415272353aaeb9554c989b83d4d932dba8dbe8f9", "0x065bde349f553cf4bdd873e54cd48317eda0542764ebe5ba46984cedd940a5e4", "0x000215cbd38a1e765cfd2c60bcb291c9d0b0bb7e7f56f682f0d3501303586185", + // EKUBO + "0x45863a5605ea7e77f2b043888a9efb1ff6e6b0fb9e62790ff987b2e084ca1f6", + "0x6b1063a4d5c32fef3486bf29d1719eb09481b52d31f7d86a50c64b0b8d5defb", + "0x06fd4a9efd0c884e0b29506169dd2fcad6b284d5bdbd46ede424abc26d71164", + "0x2360bd006d42c1a17d23ebe7ae246a0764dea4ac86201884514f86754ccc7b8", + // xSTRK + "0x6878fd475d5cea090934d690ecbe4ad78503124e4f80380a2e45eb417aafb9c", + "0x1b8d8e31f9dd1bde7dc878dd871225504837c78c40ff01cbf03a255e2154bf0", + "0x4d1125a716f547a0b69413c0098e811da3b799d173429c95da4290a00c139f7", + "0x257afe480da9255a026127cd3a295a580ef316b297a69be22b89729ae8c1d2a", + // BROTHER + "0x674d79e17ae51cbf3b49d443266460dce15215277d9c3aedd7e1733112e9e52", + "0x296f271f5ec4f45c93c1fd351bd44117795f5ef80c5134137d7dc9fce3dc364", + "0xf7c7bf6267b4c19d531ccd959cc4fb6ca39bc04af8b173f8255567b5688636", + "0x21bb27bc057be40e31752c53e7e8867b6d1b155ce46ae32454619adff0be777", + // sSTRK + "0x271f97bd18cdb2e7aff148db683be36891b0dbbffcd42024237a849ef7ad6cd", + "0x1dd8cab616528ba64689a2b7f10bad1acd6bb4e2de3f4f5dab1839f7a89a82e", + "0x24fbb2888e04b47f1bc1f3232528dcfc1ddf69d150b19241628e6d42b3545c6", + "0x1fb33831f458b0786e1a041ac2e9df7603635a7caa88aa4ed30c23a787d4e3a", ]; const debtTokens = [ "0x0491480f21299223b9ce770f23a2c383437f9fbf57abc2ac952e9af8cdb12c97", @@ -76,6 +96,10 @@ const debtTokens = [ "0x4b036839a8769c04144cc47415c64b083a2b26e4a7daa53c07f6042a0d35792", "0x3e0576565c1b51fcac3b402eb002447f21e97abb5da7011c0a2e0b465136814", "0x06726ec97bae4e28efa8993a8e0853bd4bad0bd71de44c23a1cd651b026b00e7", + "0x73fa792a8ad45303db3651c34176dc419bee98bfe45791ab12f884201a90ae2", + "0x424638c9060d08b4820aabbb28347fc7234e2b7aadab58ad0f101e2412ea42d", + "0x25a079284c3cd58bbed989250a169e7e52929070b4bcefaf8f0b9b7be77e5b1", + "0x4349ca3d519e1b1da9da5da3cf19e2039b1776a9fe98c529f95ead7964fe0d", ]; function* chunks(arr, n) { diff --git a/projects/notional/index.js b/projects/notional/index.js index 9bdcd28300..ac2292616b 100644 --- a/projects/notional/index.js +++ b/projects/notional/index.js @@ -17,5 +17,7 @@ async function tvl(api) { } module.exports = { + deadFrom: '2024-08-22', + hallmarks: [[1724284800, "End of Deprecation process for migrating from Notional V2 to Notional V3"]], ethereum: { tvl }, }; \ No newline at end of file diff --git a/projects/novation/index.js b/projects/novation/index.js index aeb46c5239..43c94998ca 100644 --- a/projects/novation/index.js +++ b/projects/novation/index.js @@ -6,7 +6,7 @@ const config = { Object.keys(config).forEach(chain => { const comptroller = config[chain] module.exports[chain] = compoundExports2({ - comptroller, fetchBalances: true, abis: { + comptroller, abis: { getAllMarkets: "address[]:allMarkets", totalBorrows: "uint256:totalBorrow", }, diff --git a/projects/nsure/index.js b/projects/nsure/index.js index 7c2172a23d..5f6fcc9ef8 100644 --- a/projects/nsure/index.js +++ b/projects/nsure/index.js @@ -101,7 +101,7 @@ async function tvl(timestamp, block) { } module.exports = { - start: 1619081169, // Thu Apr 22 2021 16:46:35 + start: '2021-04-22', // Thu Apr 22 2021 16:46:35 ethereum: { tvl } }; diff --git a/projects/nucleus/index.js b/projects/nucleus/index.js new file mode 100644 index 0000000000..83a30e462c --- /dev/null +++ b/projects/nucleus/index.js @@ -0,0 +1,25 @@ +const { getConfig } = require("../helper/cache"); + +async function getMarkets() { + return getConfig('nucleus-vaults', "https://backend.nucleusearn.io/v1/protocol/markets"); +} + +async function getTokens() { + return getConfig('nucleus-tokens', "https://backend.nucleusearn.io/v1/protocol/tokens"); +} + + +const tvl = async (api) => { + + const vaultMap = await getMarkets(); + const owners = Object.keys(vaultMap); + const tokens = await getTokens(); + + return api.sumTokens({ owners, tokens }) + }; + +module.exports = { + ethereum: { + tvl, + }, + }; \ No newline at end of file diff --git a/projects/nxfi/index.js b/projects/nxfi/index.js index 041e5deb22..93990ef65d 100644 --- a/projects/nxfi/index.js +++ b/projects/nxfi/index.js @@ -1,22 +1,8 @@ const { Program } = require("@project-serum/anchor"); -const { getProvider, sumTokens2, } = require("../helper/solana"); +const { getProvider, sumTokens2, i80f48ToNumber, } = require("../helper/solana"); const idl = require('./idl') -function i80f48ToNumber(i80f48) { - if (i80f48.value) i80f48 = i80f48.value - // Create a mask with the lower 48 bits set to 1 - const mask = BigInt((1n << 48n) - 1n) - - // Shift right by 48 bits to get the integer part - const integerPart = BigInt(i80f48) >> BigInt(48) - - // Use bitwise AND to get the fractional part - const fractionalPart = BigInt(i80f48) & mask - - // Convert to regular numbers and add together - return Number(integerPart) + Number(fractionalPart) / Number(1n << 48n) -} async function tvl() { const provider = getProvider() @@ -24,11 +10,12 @@ async function tvl() { const reserves = await program.account.reserve.all() return sumTokens2({ tokenAccounts: reserves.map(r => r.account.tokenInfo.tokenAccount.toString()) }); } + async function borrowed(api) { const provider = getProvider() const program = new Program(idl, 'NxFiv1eeKtKT6dQEP2erBwz2DSKCTdb8WSsxVDwVGJ1', provider) const reserves = await program.account.reserve.all() - reserves.map(r=>{ + reserves.map(r => { const amount = i80f48ToNumber(r.account.creditDebit.debtNtokenRatio) * i80f48ToNumber(r.account.creditDebit.reserveDebtNtokenAmount) const mint = r.account.tokenMint.toString() api.add(mint, amount) @@ -37,5 +24,5 @@ async function borrowed(api) { module.exports = { timetravel: false, - solana: { tvl,borrowed }, + solana: { tvl, borrowed }, } diff --git a/projects/oas-jumbo/index.js b/projects/oas-jumbo/index.js new file mode 100644 index 0000000000..7dc07a7ae8 --- /dev/null +++ b/projects/oas-jumbo/index.js @@ -0,0 +1,29 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const CONTRACT_ADDRESSES = { + environmentContract: ADDRESSES.findora.FRA, // Environment contract address + stakesManagerContract: "0x0000000000000000000000000000000000001001", // Stakes manager contract address + oasJumboStaking: "0x7e6347ddC55dF19B94C9FE893bf551CFc8C2208b", // OAS Jumbo staking contract address +}; + +const contractAbis = { + getStakerStakes: { + abi: "function getStakerStakes(address staker, uint256 epoch, uint256 cursor,uint256 howMany) returns (address[] memory validators, uint256[] memory oasStakes, uint256[] memory woasStakes, uint256[] memory soasStakes, uint256 newCursor)", + }, +}; + +module.exports = { + oas: { + tvl: async (api) => { + // Fetch current epoch + const epoch = await api.call({ abi: 'uint256:epoch', target: CONTRACT_ADDRESSES.environmentContract, }); + + // Fetch staker stakes + const { oasStakes } = await api.call({ + abi: contractAbis.getStakerStakes.abi, + target: CONTRACT_ADDRESSES.stakesManagerContract, + params: [CONTRACT_ADDRESSES.oasJumboStaking, epoch, 12, 1], + }); + api.addGasToken(oasStakes) + } + }, +}; diff --git a/projects/obelisk/index.js b/projects/obelisk/index.js new file mode 100644 index 0000000000..c1788b0cbb --- /dev/null +++ b/projects/obelisk/index.js @@ -0,0 +1,21 @@ +const { sumTokens } = require('../helper/chain/bitcoin') +const sdk = require('@defillama/sdk') + +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const abi = { + getCustodyAddrInfo: "function getCustodyAddrInfo() view returns (tuple(string mark, string btcAddr)[])" +} + +async function tvl() { + const api = new sdk.ChainApi({ chain: 'ethereum' }) + const addrInfos = await api.call({abi: abi.getCustodyAddrInfo, target: '0x9F836f8A27F1579258388BFab16ab16E278B1a2C' }) + const btcAddresses = addrInfos.map(info => info.btcAddr) + btcAddresses.forEach(addr => bitcoinAddressBook.obelisk.push(addr)) + return sumTokens({ owners: bitcoinAddressBook.obelisk }) +} + +module.exports = { + timetravel: false, + bitcoin: { tvl } +} \ No newline at end of file diff --git a/projects/oceanpoint/index.js b/projects/oceanpoint/index.js new file mode 100644 index 0000000000..faa9d512b5 --- /dev/null +++ b/projects/oceanpoint/index.js @@ -0,0 +1,20 @@ +const { staking } = require('../helper/staking'); + +const CONTRACTS = [ + "0x13299657e662894b933Bb3Ee73F7f8dA94b55451", + "0x1802f66868d0649687a7a6bc9b8a4292e148daec", + "0x6f1e92fb8a685aaa0710bad194d7b1aa839f7f8a", + "0x57ba886442d248C2E7a3a5826F2b183A22eCc73e" +]; + +const ERC20_TOKENS = [ + "0x509A38b7a1cC0dcd83Aa9d06214663D9eC7c7F4a" +]; + +module.exports = { + ethereum: { + tvl: () => ({}), + pool2: staking(CONTRACTS, '0x0E85fB1be698E777F2185350b4A52E5eE8DF51A6'), + staking: staking(CONTRACTS, ERC20_TOKENS), + } +}; diff --git a/projects/oceanus/index.js b/projects/oceanus/index.js index cba3392edf..58baa650b7 100644 --- a/projects/oceanus/index.js +++ b/projects/oceanus/index.js @@ -1,8 +1,5 @@ -const { staking } = require("../helper/staking"); -const { pool2Exports } = require("../helper/pool2"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); - -const treasuryContract = "0xF29EEC2563b1E6a1ed87ff7DDfB164474d1Ecb50"; +const { pool2 } = require("../helper/pool2"); +const { sumTokensExport } = require("../helper/unwrapLPs"); const OShareRewardPool = "0xc4a5b1CdCcD8CF80aC7cB5B86Fe5a8D64DBA9D0F"; const lpPool2Addresses = [ @@ -18,30 +15,13 @@ const stakingContracts = [ const OSHARE = "0x28100159d8b2acc4e45ec7ebdb875265bb752385"; const SEA = "0x41607272ce6f2a42732ae382f00f8f9ce68d78f3"; -async function Staking(timestamp, chainBlocks) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [SEA, false], - [OSHARE, false], - ], - stakingContracts, - chainBlocks["metis"], - "metis", - (addr) => `metis:${addr}` - ); - - return balances; -} module.exports = { misrepresentedTokens: true, metis: { - tvl: (async) => ({}), - staking: Staking, - pool2: pool2Exports(OShareRewardPool, lpPool2Addresses, "metis"), + tvl: () => ({}), + staking: sumTokensExport(stakingContracts, [SEA, OSHARE], ), + pool2: pool2(OShareRewardPool, lpPool2Addresses,), }, methodology: "Counts liquidity on the Pool2s and Staking parts", }; diff --git a/projects/ocelex-v1/index.js b/projects/ocelex-v1/index.js new file mode 100644 index 0000000000..a061c1757b --- /dev/null +++ b/projects/ocelex-v1/index.js @@ -0,0 +1,6 @@ +const { uniTvlExport } = require("../helper/unknownTokens"); + +module.exports = uniTvlExport("zircuit", "0xdd018347c29a27088eb2d0bf0637d9a05b30666c", { + hasStablePools: true, + useDefaultCoreAssets: true, +}); diff --git a/projects/ocelex/index.js b/projects/ocelex/index.js new file mode 100644 index 0000000000..01e0e7e3b4 --- /dev/null +++ b/projects/ocelex/index.js @@ -0,0 +1,9 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +module.exports = uniV3Export({ + zircuit: { + factory: "0x03057ae6294292b299a1863420edD65e0197AFEf", + fromBlock: 3709368, + isAlgebra: true, + }, +}) \ No newline at end of file diff --git a/projects/octopus-finance/index.js b/projects/octopus-finance/index.js new file mode 100644 index 0000000000..c7e73156ba --- /dev/null +++ b/projects/octopus-finance/index.js @@ -0,0 +1,16 @@ +const { yieldHelper, } = require("../helper/yieldHelper") +const { mergeExports } = require("../helper/utils") +const vault = '0xf561349868e5E8b633cfA524796150085Be1950A' +const oc = '0x057153eb8ad87BD483Ff9EC4E411B8C3BcE90FF0' +const abis = { + poolInfo: 'function poolInfo(uint256) view returns (address want, uint256, uint256, uint256, uint256, uint256, uint256, uint256 amount, uint256, address strat)', + poolLength: 'function poolLength() view returns (uint256)', +} +const octopus = yieldHelper({ + project: 'octopus-finance', + chain: 'arbitrum', + masterchef: vault, + nativeToken: oc, + abis, +}) +module.exports = mergeExports([octopus]) diff --git a/projects/oddz/index.js b/projects/oddz/index.js index f180e07082..d6328c6bdb 100644 --- a/projects/oddz/index.js +++ b/projects/oddz/index.js @@ -1,115 +1,20 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -async function getTotalCollateral(pools, chain, block) { - const balances = {}; - await Promise.all( - pools.map((pool) => - sdk.api.erc20 - .balanceOf({ - target: pool[1], - owner: pool[0], - chain, - block, - }) - .then((result) => - sdk.util.sumSingleBalance(balances, pool[2], result.output) - ) - ) - ); - return balances; -} -const bscPools = [ - // pool, token, representation - [ - "0x99f29c537c70897f60c9774d3f13bd081D423467", - ADDRESSES.bsc.USDC, - "bsc:" + ADDRESSES.bsc.USDC, - ], // oUSD -]; - -const bscStakingPool = [ - [ - "0x636f9d2Bb973D2E54d2577b9976DedFDc21E6672", - "0xcd40f2670cf58720b694968698a5514e924f742d", - "bsc:0xcd40f2670cf58720b694968698a5514e924f742d", - ], // sODDZ -]; - -const bscPool2 = [ - [ - "0x3c2c77353E2F6AC1578807b6b2336Bf3a3CbB014", - "0xcd40f2670cf58720b694968698a5514e924f742d", - "bsc:0xcd40f2670cf58720b694968698a5514e924f742d", - ], // sODDZ - [ - "0x3c2c77353E2F6AC1578807b6b2336Bf3a3CbB014", - ADDRESSES.bsc.WBNB, - "bsc:" + ADDRESSES.bsc.WBNB, - ], // ODDZ-BNB -]; - - -const avaxPools = [ - // pool, token, representation - [ - "0x6a165bA195D9d331b2A1C9648328d409aA599465", - ADDRESSES.avax.USDC_e, - "avax:" + ADDRESSES.avax.USDC_e, - ], // oUSD -]; - -const avaxStakingPool = [ - [ - "0xd0A145aF8F200Fc8e4d118c6e4d4a77eE1ba8E2e", - "0xB0a6e056B587D0a85640b39b1cB44086F7a26A1E", - "avax:0xB0a6e056B587D0a85640b39b1cB44086F7a26A1E", - ], // sODDZ -]; - -const avaxPool2 = [ - [ - "0xBAe8Ee2D95Aa5c68Fe8373Cd0208227E94075D5d", - "0xb0a6e056b587d0a85640b39b1cb44086f7a26a1e", - "avax:0xb0a6e056b587d0a85640b39b1cb44086f7a26a1e", - ], // sODDZ - [ - "0x3c2c77353E2F6AC1578807b6b2336Bf3a3CbB014", - ADDRESSES.avax.WAVAX, - "avax:" + ADDRESSES.avax.WAVAX, - ], // ODDZ-AVAX -]; - - -async function bsc(_timestamp, block, chainBlocks) { - return getTotalCollateral(bscPools, "bsc", chainBlocks["bsc"]); -} -async function pool2(timestamp, block, chainBlocks) { - return getTotalCollateral(bscPool2, "bsc", chainBlocks["bsc"]); -} -async function bscStaking(timestamp, block, chainBlocks) { - return getTotalCollateral(bscStakingPool, "bsc", chainBlocks["bsc"]); -} - -async function avax(_timestamp, block, chainBlocks) { - return getTotalCollateral(avaxPools, "avax", chainBlocks["avax"]); -} -async function pool3(timestamp, block, chainBlocks) { - return getTotalCollateral(avaxPool2, "avax", chainBlocks["avax"]); -} -async function avaxStaking(timestamp, block, chainBlocks) { - return getTotalCollateral(avaxStakingPool, "avax", chainBlocks["avax"]); -} - - -module.exports = { +const { sumTokensExport } = require('../helper/unwrapLPs') +const config = { bsc: { - tvl: bsc, - pool2, - staking: bscStaking, + tvl: { tokensAndOwners: [[ADDRESSES.bsc.USDC, "0x99f29c537c70897f60c9774d3f13bd081D423467"]] }, + staking: { tokensAndOwners: [["0xcd40f2670cf58720b694968698a5514e924f742d", "0x636f9d2Bb973D2E54d2577b9976DedFDc21E6672",]] }, + pool2: { tokensAndOwners: [["0x3c2c77353E2F6AC1578807b6b2336Bf3a3CbB014", "0xA3Fc4F2D307d8202468a223f35Bba978114A994C",],], resolveLP: true }, }, avax: { - tvl: avax, - pool2: pool2, - staking: avaxStaking, + tvl: { tokensAndOwners: [[ADDRESSES.avax.USDC_e, "0x6a165bA195D9d331b2A1C9648328d409aA599465"]] }, + staking: { tokensAndOwners: [["0xB0a6e056B587D0a85640b39b1cB44086F7a26A1E", "0xd0A145aF8F200Fc8e4d118c6e4d4a77eE1ba8E2e",]] }, + pool2: { tokensAndOwners: [["0xBAe8Ee2D95Aa5c68Fe8373Cd0208227E94075D5d", "0x8fD9f9AEd3a1a823693580CCcf482A04Db2Ad4f3",],], resolveLP: true }, }, -}; \ No newline at end of file +} + +Object.keys(config).forEach(chain => { + const _config = config[chain] + module.exports[chain] = {} + Object.keys(_config).forEach(key => module.exports[chain][key] = sumTokensExport(_config[key])) +}) diff --git a/projects/oh-finance/abi.json b/projects/oh-finance/abi.json deleted file mode 100644 index 81c99ed36f..0000000000 --- a/projects/oh-finance/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "virtualBalance": "uint256:virtualBalance", - "underlying": "address:underlying" -} \ No newline at end of file diff --git a/projects/oh-finance/index.js b/projects/oh-finance/index.js index 5f3915a3d8..260b5ee737 100644 --- a/projects/oh-finance/index.js +++ b/projects/oh-finance/index.js @@ -1,39 +1,47 @@ -const sdk = require('@defillama/sdk'); -const abi = require('./abi.json') +const CONFIG = { + ethereum: [ + "0xa528639aae2e765351dcd1e0c2dd299d6279db52", // usdc + ], + avax: [ + "0x8B1Be96dc17875ee01cC1984e389507Bb227CaAB", // usdc.e + "0xd96AbEcf6AA022735CFa9CB512d63645b0834720", // usdt.e + "0xF74303DD14E511CCD90219594e8069d36Da01DCD", // dai.e + "0xe001DeCc1763F8BadBbc1b10c2D6db0900f9B928", // usdc + "0xB3ce618F43b53Cdc12077FB937f9fF465BcE1f60", // usdt + ], + moonriver: [ + "0x4C211F45876d8EC7bAb54CAc0e32AAD15095358A", // usdc + "0xdeA7Ff1D84B7E54587b434C1A585718857CF61d1", // usdt + ], + metis: [ + "0x4C211F45876d8EC7bAb54CAc0e32AAD15095358A", // m.usdc + "0xc53bC2517Fceff56308b492AFad4A53d96d16ed8", // m.usdt + ], +}; + +const abi = { + virtualBalance: "uint256:virtualBalance", + underlying: "address:underlying", +}; + +async function getBankTvl(api, vaults) { + const [investeds, underlyings] = await Promise.all([ + api.multiCall({ calls: vaults, abi: abi.virtualBalance, permitFailure: true }), + api.multiCall({ calls: vaults, abi: abi.underlying, permitFailure: true }), + ]); + + vaults.forEach((_vault, i) => { + const invested = investeds[i] + const underlying = underlyings[i] + if (!invested || !underlying ) return + api.add(underlying, invested) + }) -function getBankTvl(bankAddress, chain){ - return async (time, ethBlock, {[chain]: block})=>{ - const invested = await sdk.api.abi.call({target: bankAddress, block, chain, abi:abi.virtualBalance}) - const underlying = await sdk.api.abi.call({target: bankAddress, block, chain, abi:abi.underlying}) - return { - [chain+":"+underlying.output]: invested.output - } - } } -module.exports={ - ethereum:{ - tvl: getBankTvl("0xa528639aae2e765351dcd1e0c2dd299d6279db52", "ethereum"), // usdc - }, - avax:{ - tvl: sdk.util.sumChainTvls([ - getBankTvl("0x8B1Be96dc17875ee01cC1984e389507Bb227CaAB", "avax"), // usdc.e - getBankTvl("0xd96AbEcf6AA022735CFa9CB512d63645b0834720", "avax"), // usdt.e - getBankTvl("0xF74303DD14E511CCD90219594e8069d36Da01DCD", "avax"), // dai.e - getBankTvl("0xe001DeCc1763F8BadBbc1b10c2D6db0900f9B928", "avax"), // usdc - getBankTvl("0xB3ce618F43b53Cdc12077FB937f9fF465BcE1f60", "avax"), // usdt - ]) - }, - moonriver: { - tvl: sdk.util.sumChainTvls([ - getBankTvl("0x4C211F45876d8EC7bAb54CAc0e32AAD15095358A","moonriver"), // usdc - getBankTvl("0xdeA7Ff1D84B7E54587b434C1A585718857CF61d1","moonriver"), // usdt - ]) - }, - metis: { - tvl: sdk.util.sumChainTvls([ - getBankTvl("0x4C211F45876d8EC7bAb54CAc0e32AAD15095358A", "metis"), // m.usdc - getBankTvl("0xc53bC2517Fceff56308b492AFad4A53d96d16ed8", "metis"), // m.usdt - ]) - } -} \ No newline at end of file +Object.keys(CONFIG).forEach((chain) => { + const vaults = CONFIG[chain]; + module.exports[chain] = { + tvl: (api) => getBankTvl(api, vaults), + }; +}); diff --git a/projects/ohmw/index.js b/projects/ohmw/index.js index 15fa36da81..e25c32f5dc 100644 --- a/projects/ohmw/index.js +++ b/projects/ohmw/index.js @@ -1,7 +1,10 @@ +const { deadFrom } = require("../mosquitos-finance"); + module.exports= { hallmarks: [ [1670457600, "Rug Pull"] ], + deadFrom: 1670457600, ethpow: { tvl: () => ({}), } diff --git a/projects/okcoin/index.js b/projects/okcoin/index.js index c3ec17a84c..bc7d9f051b 100644 --- a/projects/okcoin/index.js +++ b/projects/okcoin/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -13,10 +14,7 @@ const config = { ], }, bitcoin: { - owners: [ - // we only added wallets with more than 0.1 BTC - "bc1q2s3rjwvam9dt2ftt4sqxqjf3twav0gdx0k0q2etxflx38c3x8tnssdmnjq", - ] + owners: bitcoinAddressBook.okcoin }, tron: { owners: [ diff --git a/projects/okex/index.js b/projects/okex/index.js index 0c715e9c57..497d554ac6 100644 --- a/projects/okex/index.js +++ b/projects/okex/index.js @@ -1,194 +1,9 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { - bitcoin: { - owners: [ - '1LnoZawVFFQihU8d8ntxLMpYheZUfyeVAK', - '1JQULE6yHr9UaitLr4wahTwJN7DaMX7W1Z', - '1DcT5Wij5tfb3oVViF8mA8p4WrG98ahZPT', - '1CY7fykRLWXeSbKB885Kr4KjQxmDdvW923', - 'bc1quhruqrghgcca950rvhtrg7cpd7u8k6svpzgzmrjy8xyukacl5lkq0r8l2d', - '16rF2zwSJ9goQ9fZfYoti5LsUqqegb5RnA', - '1FY6RL8Ju9b6CGsHTK68yYEcnzUasufyCe', - '1MbNM3jwxMjRzeA9xyHbMyePN68MY4Jxb', - '1Lj2mCPJYbbC2X6oYwV6sXnE8CZ4heK5UD', - '178E8tYZ5WJ6PpADdpmmZd67Se7uPhJCLX', - '1BsdDaJtgFZrLfzEXvh6cD4VhtHHSHhMea', - '14kHu26yWkVD8qAnBfcFXHXxgquNoSpKum', - '1AumBaQDRaCC3cKKQVRHeyvoSPWNdDzsKP', - '1DnHx95d2t5URq2SYvVk6kxGryvTEbTnTs', - '13rCGm4Z3PDeYwo5a7GTT4jFYnRFBZbKr1', - '15Exz1BAVan4Eweagy1rcPJnfyc6KJ4GvL', - '18QUDxjDZAqAJorr4jkSEWHUDGLBF9uRCc', - '1M6E6vPaYsuCb34mDNS2aepu2aJyL6xBG4', - '1CE8chGD6Nu8qjcDF2uR1wMKyoWb8Kyxwz', - '1FTgXfXZRxMQcKSNeuFvWYVPsNgurTJ7BZ', - '13jTtHxBPFwZkaCdm6BwJMMJkqvTpBZccw', - '1FfgXrQUjX5nQ4zsiLBWjvFwW61jQHCqn', - '1DVTB9YKi4KNjyEbAHPp17T8R1Pp17nSmA', - '162z6mSSHzfTqb2Sn3NUk5r1Y2oGoCMCoM', - '3KbDzhb8B5pUU7Wk1y26J8D4cxYLmxJsca', - '3A8tCFwWyHQey1npTAWYTtrjLPKLXpSpLd', - '33a278YeJBRvQuemSo6yeugafqdS4x98TM', - 'bc1qc3g2dx3fn9s27v92n555r2tzhkxhad2wc0wm0ahlgpmhsr325mpssz80s6', - '3ABQAsnVgK8gDCBtWeEuoRvG3zdgABrDHQ', - '3AWGaggM87Nnhit5DwYYfXyvzW1NYutCw2', - '3QLVSDvh1r9u28PDWUDyg3nR7HqxrUZ4jA', - '3QFtYbR22en2AizTb7JVFA9bL2rf1fbNJr', - 'bc1qrp6msfnqxrl2gp4phmq6mcz995xc6m8n6fn8nygjfg8p63ncy4gsp3xn0e', - '31qq3eDdNyvyoDGrNYAAN5GU2BagDNANFf', - '3BdEq8vnX1o1J4Zpwj6wkPh5FxrgxLAibr', - '3AVMfb3vJi9CbQEGyoHmpgptgbJioyKykQ', - '3MYUxfT4mx8imVz7R8bVs71NisrYnmjUbT', - '3FS1EFCqZM7KEhsVoiNu7NC8658Kq4oCiY', - '3BiWZUFxpjJN6W93Fz3aCcCPBTrpYWwyoS', - '3NiufwUuJZnUHmgSopESaeLBJkALzJMcgk', - '3JcWcMPtxGaCuhKeucTMe1V865t7UhrNnT', - 'bc1qh0w73elagqvhfkkulrah0s2epdp922d3e6r8w43uz0e8ujafcjeqcz8lwa', - '3MWakirPr7MnizUAtWuDJmt919PZciSBvi', - '3LEV2xDk8D7uy4PVEGFZUm9fcT6XvCvHen', - '3FR7ZCHv26jaWWzv7EBPAXGgBpFuVFUnH3', - '38X48VjATu2AHowPzHefNqVvKyheGzVv8k', - '3AgGgHDcqd9sxYiagskZH3EPswwqza1TXd', - '3CGKuMZrkQQd4zj8FsTmDhineKACFpQBZX', - '32hhwGNtGTZ4J1LLz7p6o55Kxm7mzgREJ4', - '3E9GBso3ipQb2fbT3PNbeqgj8RkgJcR4X5', - '34MdsKf8zE6NeAy98TS1yxUTEoBkDT2ZwZ', - '3J7F1pczapCk1sRef6Hmvh9NfU6QiV3w55', - 'bc1qdk55vq5vrzt44pn93t9e3rwecw2dy4pcwc5gwugdjm3sh9xuqu3qzcwt4h', - '3PDMVx1YRhySaPEtCV2AT1aEq9DwgPU4uq', - '33j5fuJc14aff3Z6vHZBxaHEKMdNmKbRxQ', - 'bc1qvg6drx4rdcv85pteka94eskh740wrtgulg3tp7gcmm43vgund4sss4vzyq', - '3QUyiuBQF46KAMM7wdnDnu8GKVQYieRQ1N', - '35D2tNKFmqiVrvXan6tdxgatZoCBimASmZ', - '35Wvz1krBwzgQ7REXS7iJp3Qz7k3rmFNNF', - '3LMYZ3jPoKW2jscuT8fj8Nh4d66W3uX8us', - 'bc1q37nz0uheu4997ufs84efw7jw248mk9v83sgpmvsr6nawhaadx5lq2hclpt', - '3Mkfqxh6BuYCAiKxuvVWKn64N2xvReB3wM', - '3ANAufFoSaVJefhAZ7h9qViqdfJKoCWvbC', - 'bc1qnw79hhts8r84gykqkctyhu3j4gckll9gqxktzqgx5a54m347zf7qxhcyn8', - '3MYrRpUhNWxB8Ydk9gvMou5yZNtXNynxcT', - '3LFcssbNQRmRCCEUSbpDA5yzhsFH5waDoe', - '3NEwT3x6nrab6Wxddwb7jbWY8KYqJkewGA', - '35uFYLvWLQuEo6GxSGHT8JigaoUyqmNJjE', - '3DWvnsbAJJTLufQ4AhQY7LsVQrKoLjEHXQ', - '3PdNS2nqeE6G7cTcVmGjAVjz6HaPcX2FGj', - 'bc1qwkkedj4nzep7dw05s335x6n23520eq955mpcwypftn5q4n9japmqejkxlp', - '3Qae3YK3eKSoM57jpVYjvWkS7E2KnPFHSU', - '34HVDP9RFA9MpopGQ4TutLLVMFhhJFM9AX', - '39ZEaLMDxWi5EWx9cQ2W3ixDP8rWHhz8GY', - '39XwkmkcMAakYG9E564F6RZcp1RSMhUw8X', - '3QpVtFcEdVPTWqZbo8cSZwRgbHMbSEDoeP', - '3PHu7Z1dtRYbeum2SNWFCA4Fmq8r3UeXdQ', - '39AabFsw5ew4QcAC7zpeNkuk58FoZnJkvy', - '3NXxvFdsXK8DPRuGKbhNsvtP5FoL1s6hzF', - '3Jg623UZuqvvFLYbBsqqYiBCAyWUQUDG8k', - '3DgW9QH2GoVVoqwJd3paooAScy2vusEJDu', - 'bc1q8nne4amt4wjdaa0yxuzyw949xjd7fh2w9whh4uvh6haf6c5n2kvswnxk0e', - '38jFY6wBwBpFHtM4L88jF5o155SRVvr2wT', - '3CtTopUBx6QZomCjQDvbW65RtgsWn8g9LS', - '3KPPCAsWf6dxamkMBTeH2svaTVS7xgeL9q', - '3HoEwvrqYRnrizFN7gTg5ouSbV3Tek9pab', - '33yFzhVfaY9phULdN8kBfz2UfyUVZhFHNH', - '3Akts59LQNb7GU3gtHQcxh2r9zDfyUE2FJ', - '3EdYLLYiYpoLt9sEQ9KQQ3LbF56YRoiFPw', - '3GGLdxjaqvaguzTX9z4UTYaCoeu6sUyvNi', - '3M8Xbr9vobCoxMCWwxsS9doTP6HNQvx3op', - '3LcquVjVeDpFn1oJBs6mu2H5cc3EVCcJ2i', - '34Nr2xntQYxtnBARQmzswbuB1hNhnKvkoV', - '373oyKosqPkcYEsF7ipbw13WwDmvoNGgpG', - '34dhaAMB9sCBidT1LpjpbmZjkecsDpGhxH', - '3NRgSpzcsGA5mkjKinjTgBzfBYc9CBGXwW', - '3FMAKm9fEXfNXYtb6qBGaJvG3DRKtvPy5E', - '365S7mJV4MVqBfutYw65KuURCiohnMhzWh', - '3JJ4LULa6VtcVVxZC9tsNN9JM693mcrCeE', - '3CB7RwASFyWfYNCSWrri8crPhfK6yynMQ9', - '3HzYEwURshSeJZJn1ak5ioHKQV5rfZPXY8', - 'bc1qvusjx72vh3qkvw36jdqvl6sdye8ne8hfdaveejprj6xc24mpd8wsrf6w07', - '36U5xAL6FzFetzebPNT1ZQnANEk1TurVJr', - '3LkDsn4LZgYnMqZF2wAXCVs6kc72xpNLLz', - '3Gmt31zvMb52fJRRvLV3Pr3XTeDvVjGHAr', - '3DdCY3f5Ky92nSen5M2M2bzbBLUhMWafG6', - 'bc1qck2mvm6wp8xqxlk98eyl89kgwtmgw02cgqwsjstkg4uerqpqclxq6se9wu', - '3BexyYLsJQuN96qDRsnrU9yACnUSxxjWXx', - 'bc1qt5t0qhww0w7uaczxn9du7yu2l2hgpnen06r42u98du3cs6tqvezqatj38e', - '36PCQLrcXhNG3BZPeaND3zCW7cHgzDVYp3', - '3KGGtqwaQahxaN4GovThCyNdg6THK17Lrv', - '3FLnTqeKpK8CXiEA39b77pCT85sVWJXzN5', - '3AL5dD3jvpDHu8Qn7yZxGdpztWxieKxF4R', - '3G7e21FgygBmWDRMykauLANpuBK8iKqXpJ', - '3Kg2JcNnBczmHSX3udTfrKdqDy1gkrVZak', - '3QJBNEMY6TezfEBXGoc5PUKoLSCcWUd1Y5', - '3QQ8Cotsxbs9qrAyqLKaPjofzvcy5qipCY', - '34SG5K1QrntsigARCZJxNv8NwfSmQxPsDi', - '37Pd5nJZyXwjoGSwKW3ivWfeaW8VSjCey4', - '39J18vgfymGnJ2EYp6fb13rHNKBASbuMtf', - '3JwZq9s3yBhi8FikgYu2RvhjyBAhnSiLgy', - '3H4T7yRpphtyzpDUEiwBTtBa3fBMvHaKUZ', - 'bc1qrysu5ykl5pdlk7d9j0z5rwak5h9rus6cx2udc0s9tqhf5842nqgsdtgtly', - '3JqwqaLxqnDqXuJuKKp41UFSiFR1CuqznP', - '3JqzTCvFxye7nrVWGTBH2CNqZ7bbFppBww', - '3KWKbaAsf5qmbyBHXnVH6YqBgP4ZcNkUsc', - '3FbmQz3WvASHgCQUz3C2JmGdkd1gQFLdC2', - '3FMrfjg6zD3CTXSHLAiRcn3RFyBR8MMFR9', - '3KeFqqpbJawWvAudsi4q8Zx9Lewponyyht', - '32G39DN4kb9Sd6hk8RKySDf1QVFmQeAwtU', - '3BqZtfY5wZk7qHQaQJ4gBmqGLnakH8ybRy', - '3K1WNLse7M28jbowGsZmNaMV9FsM9yW3fE', - '351qZH3E9rwXg5ZDY3tgvsYhkm9CnYV25N', - '321DUXbk9gEEKG72DU2TcADDyfZXkX3fHP', - '3E5jAXsSi5x7oj6GQuM6WQPuVZaXeYd3sU', - '3HEBzhigBkmhVf7kx1KFXif42AqQWr8KH6', - '39smXTQdqD2W767ipLishHV4diSV4xNFxA', - '3GQ4DGB2tfS6YrwfVg9MF7KBRCLWkugLWR', - '3AEKc9AokfB1nBvsdS8LVFJysZSQBJRrny', - '3G3Sis7s9Jjex2Pcaerh17HvSJ19qHNuMg', - '33YfoFAdobotJkMPUqSh2ms9frvRRfRzpu', - '3G38Zn3mvixfamrKJJtsubiEL5gCQAGnSo', - '3KTFyMGHcjWjWE1UqZRM3T4WnHuQt95iRo', - '3JQmpJYkZrVczaNDCyQoLe6JXV3vGFY8ce', - '36EMwG1FHCrp2MLm474CnE9rTQDWFF1uTF', - '392Bq5jWV8NWUTdV59VCqoYviY5KP9q9Ee', - '3G1no1sZwQuNYd5H3m6seWw9oy4E4Yu1pP', - '3K376tvxysV4XDtTTEUF47Xc8LHdjof6kR', - '39ciFiDp9yj1vLSxHh6c13DiVFhcBab7NT', - '3DUGtYyorAm9vhpo3KbMURMiR2CByP6BoM', - '3DeCWk98Wp6bG9apmqCCqTfRc8uVdQ1vyw', - 'bc1qpkgxexfg8ah0j0ffk3ge3d4para29r8ugx02ch7daja3s8u4247qw2d2jq', - '3BnCzXEqQi7VDMfCaGY9zbSySuy5uQUaRp', - '3GkiKw8DBm3nSqjL1mZLJdp4yq6WEkkyoR', - '3LTvYTkSk2jq4a6mPVMadJ9vzv1V6RMDGq', - '34Fg3q75hcnjyCoL5FLPKaDM1bewFCPKsv', - '357DauGAnsbGpMgAApUqTFHCgyE2kXA9SD', - '3K1sq7TwuVEbvyADV2oNz6DYX2EhWSrVxC', - '3LWHs1HvAF362RHUc6MKL4jUPWcTw382pj', - '35oBhEfzDyCMz4KY6j49iu8xjtbHQ9GL7H', - '3CZTmeG25AXcjYurJ59mcFR3BvS4onF61M', - '3C766rkZjRvmvhGmyGeH2x33ciUrZHarvE', - '3DXZB5fAv4ujHv3dfBPnU6qaDR4HDUEuwY', - '3LnMEFH8kYMeZ8d524cj4RgXMVmniHaBSF', - 'bc1q2gp7s58gf75sg5g8v6ah8z90ghk8dqksa62u27gmz850cnaclshsfjvlr0', - '3Ca537VX1HufiVRfKVogWcD85RV3iuFs53', - '3BxyyKih6788xBQKk8aMg1cD3qP1x7Gqgr', - '3LceSbWiDHYvy59BW2swjiEQZkqvaijcsz', - '3MjPfBpz8oDcEJZphpBuiwRnvCAASFsgT1', - '3DdvsQoGp4wtvCAbyNBEZjCoWoWQL6TssG', - '32ZB86r6jT4DkAtnYYSHP99xtcai8LePLP', - '36yNiwCxiEtubUpzBLGPeSBCbubCy9i3QW', - '3GQUyZH3EPoaHFzjWr5peAKSQFNGxxmVw1', - '37wL3HQgir55T4o2Lv4Ygrsgat5W7iPnnd', - '38qt6S3zQKizRnafitwEdz4dTj1fx72dgY', - '3EqD1B8pMgdRE9iPEgUXAzpcyxihW4tbgA', - '3P7a4wgoTDKn8F2g2VB62pHiV22XzJGGbd', - '3FyaksZvXsZxEShwdpNMK7awgDE4kBuKmN', - '36CVsC2nLzvFejTuBXvCFnt3p5QsKaGzwh', - '3BjsuL5pVVWBFSMtoB9cg2d2hsJzJFpo3B', - '34w5Da4HJ54AWTZVo8JrujhV1v8iRZho3e', - '3DuUe32HgxGg8RQ5sFk9drcKRVmwNCAHhV', - '3MoQyLh75Niz1s573waSP8pc95sqQcdJXd', - '3Bvj92ASRnTnqj9kdABSgXJgrBDy6XEgzq', - ],//BTC DONE - }, + bitcoin: { owners: bitcoinAddressBook.okex }, ethereum: { owners: [ '0x03ae1a796dfe0400439211133d065bda774b9d3e', @@ -566,7 +381,12 @@ const config = { owners: [ '0x834d639b10d20dcb894728aa4b9b572b2ea2d97073b10eacb111f338b20ea5d7' ] - }// + }, + starknet:{ + owners: [ + '0x0269ea391a9c99cb6cee43ff589169f547cbc48d7554fdfbbfa7f97f516da700' + ] + } } module.exports = cexExports(config) diff --git a/projects/olafinance/index.js b/projects/olafinance/index.js index 4b62fa2992..d4246edb8d 100644 --- a/projects/olafinance/index.js +++ b/projects/olafinance/index.js @@ -1,13 +1,5 @@ -const {usdCompoundExports} = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound') -const unitroller_fantom = "0x892701d128d63c9856A9Eb5d967982F78FD3F2AE" - -const abis = { - oracle: "address:getRegistry", - underlyingPrice: "function getPriceForUnderling(address cToken) view returns (uint256)", - } - - -module.exports={ - fantom:usdCompoundExports(unitroller_fantom, "fantom", "0xed8F2C964b47D4d607a429D4eeA972B186E6f111", abis) +module.exports = { + fantom: compoundExports2({ comptroller: '0x892701d128d63c9856A9Eb5d967982F78FD3F2AE'}) } \ No newline at end of file diff --git a/projects/olympus/index.js b/projects/olympus/index.js index f3713bd1ac..de65a9e05e 100644 --- a/projects/olympus/index.js +++ b/projects/olympus/index.js @@ -158,12 +158,13 @@ function buildTvl(isOwnTokensMode = false){ const tokens = tokensToBalances.map(i => i.tokenAddress) - const decimals = await api.multiCall({ abi: 'erc20:decimals', calls: tokens }) + const decimals = await api.multiCall({ abi: 'erc20:decimals', calls: tokens, permitFailure: true, }) const ownTokens = new Set(olympusTokens.map(i => i.toLowerCase())) tokensToBalances.map(async (token, i) => { if (ownTokens.has(token.tokenAddress.toLowerCase())) { if (!isOwnTokensMode) return; } else if (isOwnTokensMode) return; + if (!decimals[i]) return; api.add(token.tokenAddress, token.balance * 10 ** decimals[i]) }) return await sumTokens2({ api, resolveLP: true, }) @@ -176,7 +177,7 @@ async function ownTokens(api) { } module.exports = { - start: 1616569200, // March 24th, 2021 + start: '2021-03-24', // March 24th, 2021 timetravel: false, methodology: "TVL is the sum of the value of all assets held by the treasury (excluding pTokens). Please visit https://app.olympusdao.finance/#/dashboard for more info.", diff --git a/projects/omega/index.js b/projects/omega/index.js new file mode 100644 index 0000000000..7c44ac0719 --- /dev/null +++ b/projects/omega/index.js @@ -0,0 +1,74 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokens2 } = require("../helper/unwrapLPs"); + +const CONTRACTS = [ + { + asset: ADDRESSES.mantle.mETH, + lendingPool: "0x68F108F6bDbe14b77f5d042b1b43bb36c60F8580", + collateralManager: "0xb092b9543B2C18D0857C3e81fACAE8c0CC08e079", + }, + { + asset: ADDRESSES.mantle.cmETH, + lendingPool: "0x0819EC86Bf7278547B6962392f49Fa0e88A04b7b", + collateralManager: "0xd2698b234b23966258578e0539a5d5aAb8d49893", + }, + { + asset: ADDRESSES.mantle.WETH, + lendingPool: "0x1B69264CA6E951B14db2Cf330dE2744524A22040", + collateralManager: "0x911A9E6b1C1FA4A8CEc88153c4C841f579899308", + }, + { + asset: ADDRESSES.mantle.WMNT, + lendingPool: "0xA49C0FA50768c4560feD129e90D3734a12711E8A", + collateralManager: "0x5181F0Ed157CA00ab3D899e131D424d456884078", + }, + { + asset: ADDRESSES.mantle.USDT, + lendingPool: "0x5dad97d4973B60870AAe284eF3EC6d74Bffc011D", + collateralManager: "0x709a5B78980b17E7f7C20b59f5a3e4E744e4590f", + }, + { + asset: ADDRESSES.mantle.USDe, + lendingPool: "0xa803861Ae852Cb34A4fD8F1b756C0cE3b29A2928", + collateralManager: "0x382c41175ebC9c906Fb52148AFFD7aFB5158ECcf", + }, + { + asset: ADDRESSES.mantle.AUSD, + lendingPool: "0x55A31051066bA19b765f2B8D49FE68367C2094ef", + collateralManager: "0x99845253B0d208f977f14756Fa5C93B73ca73CA6", + }, + { + asset: ADDRESSES.mantle.sUSDe, + lendingPool: "0x768f82Ca2055A7068FeA33f22b5a3cC8681598Ef", + collateralManager: "0xa7C81aA29409Fd2a4D26b3ea4529a4413dc6a352", + }, + { + asset: ADDRESSES.mantle.FBTC, + lendingPool: "0x72c7d27320e042417506e594697324dB5Fbf334C", + collateralManager: "0x0e27103CD0002ED9694E8865BEfd6e2167132BA9", + }, +]; + +async function tvl(api) { + const lendingPoolTvls = await api.multiCall({ + abi: "uint256:getTotalSupply", + calls: CONTRACTS.map((contract) => contract.lendingPool), + }); + + for (const [index, lendingPoolTvl] of lendingPoolTvls.entries()) { + api.add(CONTRACTS[index].asset, lendingPoolTvl); + } + + await sumTokens2({ + api, + tokensAndOwners: [ + ...CONTRACTS.map((contract) => [contract.asset, contract.collateralManager,]), + ], + }); +} + +module.exports = { + mantle: { + tvl, + }, +}; diff --git a/projects/omniprotocol/index.js b/projects/omniprotocol/index.js index 8ba29232f9..f06775fd7a 100644 --- a/projects/omniprotocol/index.js +++ b/projects/omniprotocol/index.js @@ -14,4 +14,7 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2022-07-10')/1e3), 'reentrancy hack'], ], -}; \ No newline at end of file + deadFrom: '2022-07-10', +}; + +module.exports.ethereum.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/ondofinance/index.js b/projects/ondofinance/index.js index 5db659f803..2b4705d921 100644 --- a/projects/ondofinance/index.js +++ b/projects/ondofinance/index.js @@ -1,4 +1,5 @@ -const { getTokenSupply } = require("../helper/solana"); +const ADDRESSES = require('../helper/coreAssets.json') +const { getTokenSupplies } = require("../helper/solana"); const sui = require("../helper/chain/sui"); const { aQuery } = require("../helper/chain/aptos"); const { get } = require("../helper/http"); @@ -30,7 +31,10 @@ const config = { USDY: "0xcfea864b32833f157f042618bd845145256b1bf4c0da34a7013b76e42daa53cc", }, noble: { - USDY: "ausdy", + USDY: ADDRESSES.noble.USDY, + }, + arbitrum: { + USDY: "0x35e050d3C0eC2d29D269a8EcEa763a183bDF9A9D", }, }; @@ -49,14 +53,8 @@ Object.keys(config).forEach((chain) => { tvl: async (api) => { let supplies; if (chain === "solana") { - supplies = await Promise.all(fundAddresses.map(getTokenSupply)).catch( - (error) => { - throw error; - } - ); - - const scaledSupplies = supplies.map((supply) => supply * 1_000_000); - api.addTokens(fundAddresses, scaledSupplies); + supplies = await getTokenSupplies(fundAddresses) + api.addTokens(Object.keys(supplies), Object.values(supplies)); } else if (chain === "sui") { let usdySupply = await getUSDYTotalSupplySUI(); api.addTokens(fundAddresses, [usdySupply]); @@ -72,25 +70,12 @@ Object.keys(config).forEach((chain) => { api.addTokens(config.ethereum.USDY, aptosSupply * 1e18, { skipChain: true, }); } else if (chain === "noble") { - const res = await get(`https://noble-api.polkachu.com/cosmos/bank/v1beta1/supply/${config.noble.USDY}`); + const res = await get(`https://rest.cosmos.directory/noble/cosmos/bank/v1beta1/supply/by_denom?denom=ausdy`); api.addTokens(config.ethereum.USDY, parseInt(res.amount.amount), { skipChain: true, }); } else { - supplies = await api.multiCall({ - abi: "erc20:totalSupply", - calls: fundAddresses, - }); - if (chain === "ethereum") { - const usdycIndex = fundAddresses.indexOf(config.ethereum.USDYc); - const usdyIndex = fundAddresses.indexOf(config.ethereum.USDY); - // add USDYc supply to USDY supply - supplies[usdyIndex] = - parseInt(supplies[usdyIndex]) + parseInt(supplies[usdycIndex]); - fundAddresses.splice(usdycIndex, 1); - supplies.splice(usdycIndex, 1); - } + supplies = await api.multiCall({ abi: "erc20:totalSupply", calls: fundAddresses, }) api.addTokens(fundAddresses, supplies); } - return api.getBalances(); }, }; }); diff --git a/projects/onedex/index.js b/projects/onedex/index.js index 0270cd2bcb..67e89282ab 100644 --- a/projects/onedex/index.js +++ b/projects/onedex/index.js @@ -5,6 +5,7 @@ module.exports = { elrond: { tvl: sumTokensExport({ owner: "erd1qqqqqqqqqqqqqpgqqz6vp9y50ep867vnr296mqf3dduh6guvmvlsu3sujc", + blacklistedTokens: ['GROK-f2a62f'] }), staking: sumTokensExport({ owners: ["erd1qqqqqqqqqqqqqpgql9z9vm8d599ya2r9seklpkcas6qmude4mvlsgrj7hv", "erd1qqqqqqqqqqqqqpgq8nlmvjm8gum6y2kqe0v296kgu8cm4jlemvlsays3ku"] diff --git a/projects/onsenswap/index.js b/projects/onsenswap/index.js index a5ca229177..3aa9ea655a 100644 --- a/projects/onsenswap/index.js +++ b/projects/onsenswap/index.js @@ -2,12 +2,11 @@ const { getUniTVL } = require("../helper/unknownTokens"); module.exports = { misrepresentedTokens: true, - start: 1682168400, + start: '2023-04-22', era: { tvl: getUniTVL({ factory: "0x0E15a1a03bD356B17F576c50d23BF7FC00305590", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/onyx-v2/index.js b/projects/onyx-v2/index.js new file mode 100644 index 0000000000..2af4a93b41 --- /dev/null +++ b/projects/onyx-v2/index.js @@ -0,0 +1,5 @@ +const { compoundExports2 } = require('../helper/compound'); + +module.exports = { + ethereum: compoundExports2({ comptroller: "0xcC53F8fF403824a350885A345ED4dA649e060369", cether: "0x2ccb7d00a9e10d0c3408b5eefb67011abfacb075"}), +}; diff --git a/projects/opbanana/index.js b/projects/opbanana/index.js index a6cadaa2b9..e4b677f9e5 100644 --- a/projects/opbanana/index.js +++ b/projects/opbanana/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - op_bnb: { tvl: getUniTVL({ factory: '0xdF9161aa1D60f129E185D43e2862BD4826E88Aa8', useDefaultCoreAssets: true, fetchBalances: true, }), }, + op_bnb: { tvl: getUniTVL({ factory: '0xdF9161aa1D60f129E185D43e2862BD4826E88Aa8', useDefaultCoreAssets: true, }), }, } \ No newline at end of file diff --git a/projects/opendao/abi.json b/projects/opendao/abi.json deleted file mode 100644 index b6ed2c1803..0000000000 --- a/projects/opendao/abi.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "getAllMarkets": "address[]:getAllMarkets", - "getCash": "uint256:getCash", - "underlying": "address:underlying", - "symbol": "string:symbol", - "totalBorrows": "uint256:totalBorrows", - "poolInfo": "function poolInfo(uint256) view returns (address lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accSushiPerShare)", - "poolLength": "uint256:poolLength", - "cash": "address:cash" -} \ No newline at end of file diff --git a/projects/opendao/index.js b/projects/opendao/index.js index ddd0cb7f80..82a65c0023 100644 --- a/projects/opendao/index.js +++ b/projects/opendao/index.js @@ -1,13 +1,8 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json") const { pool2s } = require("../helper/pool2"); -const { unwrapUniswapLPs } = require('../helper/unwrapLPs'); +const { compoundExports2 } = require('../helper/compound'); -/*** Ethereum Addresses ***/ const comptroller = "0x959Fb43EF08F415da0AeA39BEEf92D96f41E41b3"; -const farmContract = "0x9C3c5a058B83CBbE3Aa0a8a8711c2BD5080ccCa7"; - const farmContractsBSC = [ // Farm ID 41 "0x92702dcCD53022831edd3FCBfEabbBA31BC29bB6", @@ -38,113 +33,6 @@ const pool2LpsBSC = [ "0x507d84fe072Fe62A5F2e1F917Be8Cc58BdC53eF8" ]; -const calc = async (balances, balance, comptroller, chain = "ethereum") => { - let chainBlocks = {}; - - const allMarkets = ( - await sdk.api.abi.call({ - abi: abi.getAllMarkets, - target: comptroller, - chain: chain, - block: chainBlocks[chain] - }) - ).output; - - const getBalance = ( - await sdk.api.abi.multiCall({ - abi: balance, - calls: allMarkets.map(markets => ({ - target: markets, - })), - chain: chain, - block: chainBlocks[chain] - }) - ).output.map(bal => bal.output); - - const underlyings = ( - await sdk.api.abi.multiCall({ - abi: abi.underlying, - calls: allMarkets.map(markets => ({ - target: markets, - })), - chain: chain, - block: chainBlocks[chain] - }) - ).output.map(under => under.output); - - const symbols = ( - await sdk.api.abi.multiCall({ - abi: abi.symbol, - calls: underlyings.map(underlying => ({ - target: underlying, - })), - chain: chain, - block: chainBlocks[chain] - }) - ).output.map(symbol => symbol.output); - - const lpPositions = []; - underlyings.forEach((underlying, idx) => { - if (symbols[idx] == 'UNI-V2') { - lpPositions.push({ - token: underlying, - balance: getBalance[idx] - }) - } else { - sdk.util.sumSingleBalance(balances, `${chain}:${underlying}`, getBalance[idx]); - } - }); - - await unwrapUniswapLPs( - balances, - lpPositions, - chainBlocks[chain], - chain, - addr => `${chain}:${addr}` - ); -}; - -const ethTvl = async () => { - const balances = {}; - - await calc(balances, abi.getCash, comptroller); - - const poolLength = ( - await sdk.api.abi.call({ - abi: abi.poolLength, - target: farmContract, - }) - ).output; - - for (let i = 0; i < poolLength; i++) { - const lpFarm = ( - await sdk.api.abi.call({ - abi: abi.poolInfo, - target: farmContract, - params: i - }) - ).output.lpToken; - - const cashAddress = ( - await sdk.api.abi.call({ - abi: abi.cash, - target: lpFarm, - }) - ).output; - - const balance = ( - await sdk.api.erc20.balanceOf({ - target: cashAddress, - owner: lpFarm - }) - ).output; - - sdk.util.sumSingleBalance(balances, cashAddress, balance); - } - - return balances; -}; - const vaults = [ "0x0a234ef34614a4eed1c1430a23b46f95df5f4257", // pOPEN "0xfff0cc78a7e7ce5d6ba60f23628ff9a63beee87f", // OCP @@ -153,44 +41,22 @@ const vaults = [ "0xcfefc606c4c010c242431f60a7afc13461df399c", // ROSEN ]; -async function bscTvl(timestamp, block, chainBlocks) { - let balances = {}; - let underlying = ( - await sdk.api.abi.multiCall({ - calls: vaults.map((p) => ({ - target: p, - })), - abi: abi.underlying, - block: chainBlocks.bsc, - chain: "bsc", - }) - ).output; - let underlyingBalances = ( - await sdk.api.abi.multiCall({ - calls: underlying.map((p) => ({ - target: p.output, - params: p.input.target, - })), - abi: "erc20:balanceOf", - block: chainBlocks.bsc, - chain: "bsc", - }) - ).output; - underlyingBalances.forEach((p) => { - sdk.util.sumSingleBalance(balances, `bsc:${p.input.target}`, p.output); - }); - return balances; +async function bscTvl(api) { + const tokens = await api.multiCall({ abi: 'address:underlying', calls: vaults}) + return api.sumTokens({ tokensAndOwners2: [tokens, vaults]}) } module.exports = { misrepresentedTokens: true, ethereum: { pool2: pool2s(farmContractsBSC, pool2LpsBSC), - tvl: ethTvl + ...compoundExports2({ comptroller }) }, bsc: { tvl: bscTvl, }, methodology: "We count liquidity on the Markets same as compound, and we export Borrowing part too", -} \ No newline at end of file +} + +delete module.exports.ethereum.borrowed \ No newline at end of file diff --git a/projects/opendelta/index.js b/projects/opendelta/index.js new file mode 100644 index 0000000000..e721a8efa4 --- /dev/null +++ b/projects/opendelta/index.js @@ -0,0 +1,38 @@ +const { PublicKey, } = require("@solana/web3.js") +const { getConnection, } = require("../helper/solana") + +const OPB_MINT_ADDRESS = "opbrKSFxFXRHNg75xjpEAbJ5R6e6GYZ6QKEqdvcBq7c" + +async function tvl(api) { + const connection = getConnection() + const { value: { data: { parsed: { info: { supply, decimals, extensions }}}}} = await connection.getParsedAccountInfo(new PublicKey(OPB_MINT_ADDRESS)) + const { state } = extensions.find(e => e.extension === 'interestBearingConfig') + api.addUSDValue(computeSupply(supply, state, decimals)) + + function computeSupply(supply, extensionData, decimals) { + // Compute the supply based on the interest-bearing extension + const { currentRate, initializationTimestamp, preUpdateAverageRate, lastUpdateTimestamp, } = extensionData + + const currentTimestamp = Math.floor(Date.now() / 1000) + const timeElapsed = lastUpdateTimestamp - initializationTimestamp + const timeElapsedSinceLastUpdate = currentTimestamp - lastUpdateTimestamp + const interestRate = currentRate / 1e4 + const interestRatePre = preUpdateAverageRate / 1e4 + const ONE_YEAR = 365.24 * 24 * 60 * 60 + const interestAccruedCurrent = Math.exp(interestRate * timeElapsedSinceLastUpdate / ONE_YEAR) + const interestAccruedPre = Math.exp(interestRatePre * timeElapsed / ONE_YEAR) + + const computedSupply = supply * (interestAccruedCurrent * interestAccruedPre) + return computedSupply / Math.pow(10, decimals) + } + +} + +module.exports = { + timetravel: false, + misrepresentedTokens: true, + methodology: "TVL is calculated by multiplying the OPB token supply by the current USD value of 1.0 OPB. Initially worth $1.0, 1.0 OPB now reflects its increased value from accrued interest, derived using amountToUiAmount approach of Solana Token2022 Interest Bearing extension.", + solana: { + tvl, + }, +} diff --git a/projects/openeden-tbill/index.js b/projects/openeden-tbill/index.js index a14084e080..60db9f3ded 100644 --- a/projects/openeden-tbill/index.js +++ b/projects/openeden-tbill/index.js @@ -1,5 +1,11 @@ -async function tvl(api) { - let contract = '0xdd50C053C096CB04A3e3362E2b622529EC5f2e8a' +const { getTokenSupplies } = require('../helper/solana') +const { ripple } = require('../helper/chain/rpcProxy') + +const tbill = "0xdd50C053C096CB04A3e3362E2b622529EC5f2e8a" +const solTbill = '4MmJVdwYN8LwvbGeCowYjSx7KoEi6BJWg8XXnW4fDDp6' + +async function evmTvl(api) { + let contract = tbill if (api.chain === 'arbitrum') contract = '0xF84D28A8D28292842dD73D1c5F99476A80b6666A' const [bal, token] = await api.batchCall([ { abi: 'uint256:totalAssets', target: contract }, @@ -8,7 +14,24 @@ async function tvl(api) { api.add(token, bal) } +async function solTvl (api) { + const res = await getTokenSupplies([solTbill]) + Object.entries(res).forEach(([token, balance]) => { + api.add(token, balance) + }) +} + +async function ripplTvl (api) { + const issuerAddress = "rJNE2NNz83GJYtWVLwMvchDWEon3huWnFn"; + const subscriptionOperatorAddress = "rB56JZWRKvpWNeyqM3QYfZwW4fS9YEyPWM"; + + const data = await ripple.gatewayBalances({ account: issuerAddress, hotwallet: subscriptionOperatorAddress }) + api.add(tbill, Number(data.obligations?.TBL) * 1e6, { skipChain: true }) +} + module.exports = { - ethereum: { tvl }, - arbitrum: { tvl }, + ethereum: { tvl: evmTvl }, + arbitrum: { tvl: evmTvl }, + ripple: { tvl: ripplTvl }, + solana: { tvl: solTvl } } \ No newline at end of file diff --git a/projects/opengpu/index.js b/projects/opengpu/index.js new file mode 100644 index 0000000000..e60c3d05f4 --- /dev/null +++ b/projects/opengpu/index.js @@ -0,0 +1,20 @@ +const { staking } = require('../helper/staking'); +const { sumTokensExport } = require("../helper/unwrapLPs"); +const coreAssets = require("../helper/coreAssets.json"); + +const CONTRACTS = [ + '0x3C9634620A626b7e9a3fB74A8f800d67cdaF2A5B', + '0x695a9c59cd823cbb2cd8331a835d1eb7982b170a' +]; + +const oGPU = '0x067Def80D66fB69C276e53b641f37ff7525162f6'; + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + owners: CONTRACTS, + token: coreAssets.null + }), + staking: staking(CONTRACTS, oGPU), + }, +}; \ No newline at end of file diff --git a/projects/opentrade/index.js b/projects/opentrade/index.js new file mode 100644 index 0000000000..2e1a034024 --- /dev/null +++ b/projects/opentrade/index.js @@ -0,0 +1,27 @@ +const CONFIG = { + ethereum: [ + '0x3ee320c9f73a84d1717557af00695a34b26d1f1d', // XEVT + '0x0bbc2be1333575f00ed9db96f013a31fdb12a5eb', // TBV1 + '0x30c3115dca6370c185d5d06407f29d3ddbc4cfc4', // TBV2 + '0x7bfb97fe849172608895fd4c62237cb42a8607d2', // TBV3 + '0xa65446265517a29f7427abb1279165eb61624dd0', // TBV4 + '0x0f8cbdc544dc1d4bd1bdafe0039be07b825af82a', // XTBT + ], + avax: [ + '0xbb9360d57f68075e98d022784c12f2fda082316b', // XRV1 + '0xad6605f4987031fd2d6d6816be53eb7c5b764bf7', // XTBT + ] +} + + +const tvl = async (api, tokens) => { + const [assets, balances] = await Promise.all([ + api.multiCall({ calls: tokens, abi: 'address:liquidityAssetAddr' }), + api.multiCall({ calls: tokens, abi: 'uint256:totalAssets' }), + ]) + api.add(assets, balances) +} + +Object.entries(CONFIG).forEach(([chain, tokens]) => { + module.exports[chain] = { tvl: async (api) => tvl(api, tokens) } +}) \ No newline at end of file diff --git a/projects/optidoge/index.js b/projects/optidoge/index.js index 5952b44af6..f624917a68 100644 --- a/projects/optidoge/index.js +++ b/projects/optidoge/index.js @@ -1,6 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const sdk = require('@defillama/sdk') -const {pool2Exports} = require("../helper/pool2") +const {pool2} = require("../helper/pool2") const {stakingUnknownPricedLP} = require("../helper/staking") const weth = ADDRESSES.ethereum.WETH @@ -18,7 +18,7 @@ async function tvl(time, _ethBlock, {optimism: block}){ module.exports = { optimism: { tvl, - pool2: pool2Exports("0x7Dbe3714371bB9FF72369AFc88703AbD2694E322", ["0x91d62ac270e5bb371a25f81c9e74f16b53448efd"], "optimism"), + pool2: pool2("0x7Dbe3714371bB9FF72369AFc88703AbD2694E322", ["0x91d62ac270e5bb371a25f81c9e74f16b53448efd"], "optimism"), staking: stakingUnknownPricedLP("0x015C4b2250F7aAC41274FeB95eFf00016C0CE08c", "0x93d97dbb1bb5290c78c23885e8026047dc8998a8", "optimism", "0x91d62ac270e5bb371a25f81c9e74f16b53448efd", addr=>`optimism:${addr}`) } } diff --git a/projects/optionBlitz/index.js b/projects/optionBlitz/index.js index 6d58fb2e7b..c17184fb24 100644 --- a/projects/optionBlitz/index.js +++ b/projects/optionBlitz/index.js @@ -6,7 +6,6 @@ const BLX = "0x220251092F8B63efD0341F69f6ca907Bd6f271Bf"; // BLX const assets = [nullAddress, ADDRESSES.arbitrum.USDC_CIRCLE] // ETH, USDC module.exports = { - start: 194784191, arbitrum: { tvl: sumTokensExport({ owners: [treasury], tokens: assets }), staking: sumTokensExport({ owners: [treasury], tokens: [BLX] }), diff --git a/projects/opulous/index.js b/projects/opulous/index.js index 1148a46c88..677c89f7fd 100644 --- a/projects/opulous/index.js +++ b/projects/opulous/index.js @@ -33,7 +33,7 @@ const arbitrumTVL = async (api) => { } module.exports = { - // // start: 1660827158, + // // start: '2022-08-18', methodology: `Counts the number of OPUL tokens locked in the staking pool.`, algorand: { tvl: () => ({}), diff --git a/projects/opus/index.js b/projects/opus/index.js index 5f101278cf..56c6c5c5e6 100644 --- a/projects/opus/index.js +++ b/projects/opus/index.js @@ -7,6 +7,8 @@ const tokensAndOwners = [ [ADDRESSES.starknet.STRK, "0x031a96fe18fe3fdab28822c82c81471f1802800723c8f3e209f1d9da53bc637d"], [ADDRESSES.starknet.WBTC, "0x05bc1c8a78667fac3bf9617903dbf2c1bfe3937e1d37ada3d8b86bf70fb7926e"], [ADDRESSES.starknet.WSTETH, "0x02d1e95661e7726022071c06a95cdae092595954096c373cde24a34bb3984cbf"], + [ADDRESSES.starknet.XSTRK, "0x04a3e7dffd8e74a706be9abe6474e07fbbcf41e1be71387514c4977d54dbc428"], + [ADDRESSES.starknet.SSTRK, "0x03b709f3ab9bc072a195b907fb2c27688723b6e4abb812a8941def819f929bd8"], // Transmuters [ADDRESSES.starknet.USDC, "0x03878595db449e1af7de4fb0c99ddb01cac5f23f9eb921254f4b0723a64a23cb"], ] diff --git a/projects/oraclefreedollar/index.js b/projects/oraclefreedollar/index.js new file mode 100644 index 0000000000..b04e5093e0 --- /dev/null +++ b/projects/oraclefreedollar/index.js @@ -0,0 +1,22 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +const config = { + bsc: { + factoryV1: '0xFe00054AF44E24f0B4bd49b1A2d2984C4264aabE', fromBlockV1: 37882077, + factoryV2: '0x70e318f5066597868a9026ecccC0e04D693d0fbD', fromBlockV2: 45094649, + }, +} +const USDTBridge = ["0x55d398326f99059fF775485246999027B3197955", "0xAEaF85C740C7a6ee94183E848d0e557cB7FbeA47"]; + +Object.keys(config).forEach(chain => { + const { factoryV1, factoryV2, fromBlockV1, fromBlockV2 } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const tokensAndOwners = [USDTBridge] + const logsV1 = await getLogs2({ api, factory: factoryV1, eventAbi: 'event PositionOpened (address indexed owner, address indexed position, address ofd, address collateral, uint256 price)', fromBlock: fromBlockV1 }) + const logsV2 = await getLogs2({ api, factory: factoryV2, eventAbi: 'event PositionOpened(address indexed owner, address indexed position, address original, address collateral)', fromBlock: fromBlockV2 }) + logsV1.concat(logsV2).forEach(log => tokensAndOwners.push([log.collateral, log.position])) + return api.sumTokens({ tokensAndOwners }) + } + } +}) diff --git a/projects/orange-finance/index.js b/projects/orange-finance/index.js index 110b87f8f8..2bd434f325 100644 --- a/projects/orange-finance/index.js +++ b/projects/orange-finance/index.js @@ -23,7 +23,6 @@ async function tvl(api) { module.exports = { doublecounted: true, - start: 154577707, arbitrum: { tvl, }, diff --git a/projects/oraprotocol/index.js b/projects/oraprotocol/index.js new file mode 100644 index 0000000000..72f3df35ff --- /dev/null +++ b/projects/oraprotocol/index.js @@ -0,0 +1,29 @@ +const contracts = [ + "0xc0b2FdA4EDb0f7995651B05B179596b112aBE0Ff", + "0x0a7Df7BC7a01A4b6C9889d5994196C1600D4244a", + "0x5982241e50Cb4C42cb51D06e74A97EAaCa3a8CE2", + "0xDF03600C34cacE7496A0A8Ef102B4bCe718958a2", + "0x3e0598fee8a73d09c06b3de3e205ba7ff8edb004" +]; + + +module.exports = { + ethereum: { + tvl, staking, + } +}; + +async function tvl(api) { + const tokens = await api.multiCall({ abi: 'address:stakingTokenAddress', calls: contracts }) + return api.sumTokens({ tokensAndOwners2: [tokens, contracts] }) +} + +async function staking(api) { + + const contracts = [ + "0x07b022bd57e22c8c5abc577535cf25e483dae3df", + "0x4f5e12233ed7ca1699894174fcbd77c7ed60b03d", + ]; + const tokens = await api.multiCall({ abi: 'address:stakingTokenAddress', calls: contracts }) + return api.sumTokens({ tokensAndOwners2: [tokens, contracts] }) +} \ No newline at end of file diff --git a/projects/orbiter-one/index.js b/projects/orbiter-one/index.js index e142370c62..2aa7a99264 100644 --- a/projects/orbiter-one/index.js +++ b/projects/orbiter-one/index.js @@ -3,7 +3,6 @@ const { compoundExports2 } = require('../helper/compound') const moonbeamConfig = { comptroller: "0x27DC3DAdBfb40ADc677A2D5ef192d40aD7c4c97D", cether: "0xCc444ca6bba3764Fc55BeEFe4FFA27435cF6c259", - fetchBalances: true, } module.exports = { diff --git a/projects/orbs/index.js b/projects/orbs/index.js new file mode 100644 index 0000000000..924664ef4f --- /dev/null +++ b/projects/orbs/index.js @@ -0,0 +1,11 @@ +const { staking } = require('../helper/staking'); + +module.exports = { + ethereum: { + tvl: () => ({}), + staking: staking( + '0x01d59af68e2dcb44e04c50e05f62e7043f2656c3', + '0xff56Cc6b1E6dEd347aA0B7676C85AB0B3D08B0FA' + ), + }, +}; diff --git a/projects/orca/index.js b/projects/orca/index.js index a3c21e323d..2f25675e57 100644 --- a/projects/orca/index.js +++ b/projects/orca/index.js @@ -2,13 +2,13 @@ const { getProvider, sumTokens2, exportDexTVL, } = require('../helper/solana') const { Program, } = require("@project-serum/anchor"); const sdk = require('@defillama/sdk') -async function tvl() { - const provider = getProvider() +async function tvl(api) { + const provider = getProvider(api.chain) const programId = 'whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc' const program = new Program(whirpoolIDL, programId, provider) const whirlpools = await program.account.whirlpool.all() - const tokenAccounts = whirlpools.map(({ account}) => [account.tokenVaultA, account.tokenVaultB]).flat() - return sumTokens2({ tokenAccounts, }) + const tokenAccounts = whirlpools.map(({ account }) => [account.tokenVaultA, account.tokenVaultB]).flat() + return sumTokens2({ tokenAccounts, api, }) } /* async function orcaPoolTvlViaConfig() { @@ -22,14 +22,15 @@ async function tvl() { return sumTokens2({ tokenAccounts, blacklistedTokens, }) } */ -const orcaV1Tvl = exportDexTVL('DjVE6JNiYqPL2QXyCUUh8rNjHrbz9hXHNYt99MQ59qw1') -const orcaV2Tvl = exportDexTVL('9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP') +const orcaV1Tvl = exportDexTVL('DjVE6JNiYqPL2QXyCUUh8rNjHrbz9hXHNYt99MQ59qw1') +const orcaV2Tvl = exportDexTVL('9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP') module.exports = { timetravel: false, solana: { tvl: sdk.util.sumChainTvls([orcaV1Tvl, orcaV2Tvl, tvl]) }, + eclipse: { tvl }, hallmarks: [ [1628565707, "Token+LM launch"], [1667865600, "FTX collapse"] diff --git a/projects/orcadao/index.js b/projects/orcadao/index.js index 61f59d0746..58a98b746a 100644 --- a/projects/orcadao/index.js +++ b/projects/orcadao/index.js @@ -1,10 +1,8 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); -const {pool2Exports} = require("../helper/pool2"); -const { sumTokensAndLPsSharedOwners, sumTokens } = require("../helper/unwrapLPs"); -const {staking} = require("../helper/staking"); +const { pool2 } = require("../helper/pool2"); +const { staking } = require("../helper/staking"); +const { sumTokens2 } = require('../helper/unwrapLPs'); const orca = "0x8b1d98a91f853218ddbb066f20b8c63e782e2430"; const podLeader = "0x111E1E97435b57467E79d4930acc4B7EB3d478ad"; @@ -16,64 +14,33 @@ const pool2LPs = [ // [[Collateral, Bank]] const banksAndCollateral = [ - ["0x330cc45c8f60fef7f9d271a7512542b3d201a48d","0x64D56b4B6C844015EC07e52A1267D5d5d4F4E5BD"], // YAK BENQI WBTC - ["0x9669fe1ea0d8883661289461b90a10b71ae400ee","0xEa03cDCdD912522400d21Ee89A5bC46Bffe11AC3"], // YAK BENQI DAI - ["0x07b0e11d80ccf75cb390c9be6c27f329c119095a","0xAf8d16500A58b868C34be9106d674b820d67C979"], // YAK BENQI USDT - [ADDRESSES.avax.WAVAX,"0xC029713E92383426C9b387b124C0BF6271d08b80"], // AVAX - ["0x8b414448de8b609e96bd63dcf2a8adbd5ddf7fdd","0x2b583646EC93245562Fd08A3b5f44Aa55417766B"], // YAK BENQI AVAX - ["0x0eac97a78a93b75549d49145df41dbe9cd520874","0xd694F97dd5874fA4e712FDFB781231D93642D29b"], // YAK BENQI USDC - ["0x957ca4a4aa7cdc866cf430bb140753f04e273bc0","0x8aee038726715d78C49dFb2f12e76DE70C2F48eC"], // YAK AAVE AVAX - ["0x4084f32a91f4d8636ca08386efe70c6e302f1d84","0x22a86D96b26308ba1971F8080AAD965884061076"], // YAK BENQI LINK - ["0x7d2d076000611e44740d636843384412399e31b9","0xc59b6794e5DeE450d264669f34e7849A90083774"], // YAK BENQI WETH - ["0xb634a71a54d3382ff6896eb22244b4a4e54c0a82","0x8b61488Ca2D727826c7Afe4eDbF810159F17D398"], // YAK AAVE WETH - ["0x3a91a592a06390ca7884c4d9dd4cba2b4b7f36d1","0xa1A34E32c24911daA45e338dB9D785c1b323F280"], // YAK JOE - ["0x0f7f48d4b66bf5a53d4f21fa6ffca45f70cef770","0x18419976Ba05dd9cE44544B8d91590704aFA4a29"], // YAK AAVE WBTC - ["0xbf5bffbf7d94d3b29abe6eb20089b8a9e3d229f7","0xC09caDDA753c54292BeB1D10429bD175556b8b5E"], // YAK QI - [ADDRESSES.avax.WETH_e,"0x4805D6563B36a02C5012c11d6e15552f50066d58"], // WETH - [ADDRESSES.avax.WBTC_e,"0x1eA60d781376C06693dFB21d7e5951cAEc13F7E4"], // WBTC + ["0x330cc45c8f60fef7f9d271a7512542b3d201a48d", "0x64D56b4B6C844015EC07e52A1267D5d5d4F4E5BD"], // YAK BENQI WBTC + ["0x9669fe1ea0d8883661289461b90a10b71ae400ee", "0xEa03cDCdD912522400d21Ee89A5bC46Bffe11AC3"], // YAK BENQI DAI + ["0x07b0e11d80ccf75cb390c9be6c27f329c119095a", "0xAf8d16500A58b868C34be9106d674b820d67C979"], // YAK BENQI USDT + [ADDRESSES.avax.WAVAX, "0xC029713E92383426C9b387b124C0BF6271d08b80"], // AVAX + ["0x8b414448de8b609e96bd63dcf2a8adbd5ddf7fdd", "0x2b583646EC93245562Fd08A3b5f44Aa55417766B"], // YAK BENQI AVAX + ["0x0eac97a78a93b75549d49145df41dbe9cd520874", "0xd694F97dd5874fA4e712FDFB781231D93642D29b"], // YAK BENQI USDC + ["0x957ca4a4aa7cdc866cf430bb140753f04e273bc0", "0x8aee038726715d78C49dFb2f12e76DE70C2F48eC"], // YAK AAVE AVAX + ["0x4084f32a91f4d8636ca08386efe70c6e302f1d84", "0x22a86D96b26308ba1971F8080AAD965884061076"], // YAK BENQI LINK + ["0x7d2d076000611e44740d636843384412399e31b9", "0xc59b6794e5DeE450d264669f34e7849A90083774"], // YAK BENQI WETH + ["0xb634a71a54d3382ff6896eb22244b4a4e54c0a82", "0x8b61488Ca2D727826c7Afe4eDbF810159F17D398"], // YAK AAVE WETH + ["0x3a91a592a06390ca7884c4d9dd4cba2b4b7f36d1", "0xa1A34E32c24911daA45e338dB9D785c1b323F280"], // YAK JOE + ["0x0f7f48d4b66bf5a53d4f21fa6ffca45f70cef770", "0x18419976Ba05dd9cE44544B8d91590704aFA4a29"], // YAK AAVE WBTC + ["0xbf5bffbf7d94d3b29abe6eb20089b8a9e3d229f7", "0xC09caDDA753c54292BeB1D10429bD175556b8b5E"], // YAK QI + [ADDRESSES.avax.WETH_e, "0x4805D6563B36a02C5012c11d6e15552f50066d58"], // WETH + [ADDRESSES.avax.WBTC_e, "0x1eA60d781376C06693dFB21d7e5951cAEc13F7E4"], // WBTC ] -const translateToken = { - "0x957ca4a4aa7cdc866cf430bb140753f04e273bc0": "avax:" + ADDRESSES.avax.WAVAX, - "0x0f7f48d4b66bf5a53d4f21fa6ffca45f70cef770": "avax:" + ADDRESSES.avax.WBTC_e, - "0xb634a71a54d3382ff6896eb22244b4a4e54c0a82": "avax:" + ADDRESSES.avax.WETH_e, - "0x3a91a592a06390ca7884c4d9dd4cba2b4b7f36d1": "avax:" + ADDRESSES.avax.JOE, - "0x8b414448de8b609e96bd63dcf2a8adbd5ddf7fdd": "avax:0x8729438eb15e2c8b576fcc6aecda6a148776c0f5", - "0x4084f32a91f4d8636ca08386efe70c6e302f1d84": "avax:0x5947bb275c521040051d82396192181b413227a3", - "0x9669fe1ea0d8883661289461b90a10b71ae400ee": "avax:" + ADDRESSES.avax.DAI, - "0x330cc45c8f60fef7f9d271a7512542b3d201a48d": "avax:" + ADDRESSES.avax.WBTC_e, - "0x07b0e11d80ccf75cb390c9be6c27f329c119095a": "avax:" + ADDRESSES.avax.USDt, - "0x0eac97a78a93b75549d49145df41dbe9cd520874": "avax:" + ADDRESSES.avax.USDC_e, - "0x7d2d076000611e44740d636843384412399e31b9": "avax:" + ADDRESSES.avax.WETH_e, - "0xbf5bffbf7d94d3b29abe6eb20089b8a9e3d229f7": "avax:0x8729438eb15e2c8b576fcc6aecda6a148776c0f5" +async function tvl(api) { + return api.sumTokens({ tokensAndOwners: banksAndCollateral }) } -async function tvl(timestamp, block, chainBlocks) { - let balances = {}; - await sumTokens(balances, banksAndCollateral, chainBlocks.avax, "avax", addr=> { - addr = addr.toLowerCase(); - if (translateToken[addr] !== undefined) { - return translateToken[addr]; - } - return `avax:${addr}`; - }); - return balances; -} - -async function borrowed(timestamp, block, chainBlocks) { - let balances = {}; - const debt = (await sdk.api.abi.multiCall({ - calls: banksAndCollateral.map(p => ({ - target: p[1] - })), - abi: abi.totalDebt, - block: chainBlocks.avax, - chain: "avax" - })).output; - debt.forEach(p => { - sdk.util.sumSingleBalance(balances, `avax:0xd586e7f844cea2f87f50152665bcbc2c279d8d70`, p.output) - }); - return balances; +async function borrowed(api) { + const debt = await api.multiCall({ + calls: banksAndCollateral.map(p => p[1]), + abi: "uint256:totalDebt", + }) + api.add(ADDRESSES.avax.DAI, debt) } const treasuryContract = "0x10131d4f3193a59A46d3ab57D765f2604e77B4E3"; @@ -81,24 +48,24 @@ const usdc = ADDRESSES.avax.USDC_e const ocraAvaiPGL = "0x1A9Bd67c82C0e8E47C3ad2FA772FCb9B7A831A37"; const orcaWavaxPGL = "0x73e6CB72a79dEa7ed75EF5eD6f8cFf86C9128eF5"; const avaiUsdc = "0xeD7a2B4054757Cfdb632Af15Ad528624F0fFf3B0"; -async function treasury (timestamp, block, chainBlocks) { - let balances = {}; - await sumTokensAndLPsSharedOwners(balances, [ - [usdc, false], - [orca, false], - [ocraAvaiPGL, true], - [orcaWavaxPGL, true], - [avaiUsdc, true] - ], [treasuryContract], chainBlocks.avax, "avax", addr=>`avax:${addr}`); - return balances; +async function treasury(api) { + return sumTokens2({ + api, owner: treasuryContract, tokens: [ + usdc, + orca, + ocraAvaiPGL, + orcaWavaxPGL, + avaiUsdc, + ], resolveLP: true, + }) } module.exports = { - avax:{ + avax: { methodology: "Tokens locked in as collateral is counted as TVL", tvl, borrowed, - pool2: pool2Exports(podLeader, pool2LPs, "avax", addr=>`avax:${addr}`), + pool2: pool2(podLeader, pool2LPs, "avax", addr => `avax:${addr}`), treasury, staking: staking(podLeader, orca) } diff --git a/projects/orderly-network/index.js b/projects/orderly-network/index.js index 134328ecb1..961147687c 100644 --- a/projects/orderly-network/index.js +++ b/projects/orderly-network/index.js @@ -11,6 +11,10 @@ const owner = '0x816f722424b49cf1275cc86da9840fbd5a6167e9' const tokenAddress = { arbitrum: ADDRESSES.arbitrum.USDC_CIRCLE, optimism: ADDRESSES.optimism.USDC_CIRCLE, + base: ADDRESSES.base.USDC, + mantle: ADDRESSES.mantle.USDC, + polygon: ADDRESSES.polygon.USDC_CIRCLE, + ethereum: ADDRESSES.ethereum.USDC } async function tvl() { @@ -37,5 +41,17 @@ module.exports = { optimism: { tvl: sumTokensExport({ owner, tokens: [tokenAddress.optimism] }), }, + base: { + tvl: sumTokensExport({ owner, tokens: [tokenAddress.base] }), + }, + mantle: { + tvl: sumTokensExport({ owner, tokens: [tokenAddress.mantle] }), + }, + polygon: { + tvl: sumTokensExport({ owner, tokens: [tokenAddress.polygon] }), + }, + ethereum: { + tvl: sumTokensExport({ owner, tokens: [tokenAddress.ethereum] }), + }, methodology: 'All the tokens deposited into Orderly Network by chain' }; diff --git a/projects/origami/index.js b/projects/origami/index.js index 22e1c67a61..2401bcb86a 100644 --- a/projects/origami/index.js +++ b/projects/origami/index.js @@ -2,31 +2,63 @@ const sdk = require("@defillama/sdk"); const { cachedGraphQuery } = require('../helper/cache') const GRAPH_URLS = { - ethereum: sdk.graph.modifyEndpoint('GGN8RoYQBiw2Ui6wUeaKcHsBBSrQzQoryYi2feoTKwPX'), // ethereum - arbitrum: sdk.graph.modifyEndpoint('AHT1ffJhw7NWdeH3XYbWzMmy5USbB22K3ecVDu8azGuF'), // arbitrum + ethereum: sdk.graph.modifyEndpoint('https://subgraph.satsuma-prod.com/a912521dd162/templedao/origami-mainnet/api'), // ethereum + arbitrum: sdk.graph.modifyEndpoint('https://subgraph.satsuma-prod.com/a912521dd162/templedao/origami-arbitrum/api'), // arbitrum } +const osUSDS = '0x0f90a6962e86b5587b4c11ba2b9697dc3ba84800' + module.exports = { doublecounted: true, } Object.keys(GRAPH_URLS).forEach(chain => { - const endpoint = GRAPH_URLS[chain] - module.exports[chain] = { - tvl: async (api) => { - const { metrics: [{ investmentVaults }] } = await cachedGraphQuery('origami/' + chain, endpoint, '{ metrics { investmentVaults { id } } }') - console.log(investmentVaults) - const vaults = investmentVaults.map(vault => vault.id) - let tokens = await api.multiCall({ abi: 'address:reserveToken', calls: vaults }) - if (chain === 'arbitrum') - tokens = await api.multiCall({ abi: 'address:baseToken', calls: tokens }) - - const decimals = await api.multiCall({ abi: 'uint8:decimals', calls: vaults }) - const supplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: vaults }) - const reserves = await api.multiCall({ abi: 'uint256:reservesPerShare', calls: vaults }) - const bals = reserves.map((reserve, i) => reserve * supplies[i] / 10 ** decimals[i]) - console.log(tokens, bals, vaults, api.chain) - api.add(tokens, bals) - } - } + module.exports[chain] = { tvl } }) + +async function tvl(api) { + const { metrics: [{ investmentVaults }] } = await cachedGraphQuery('origami/' + api.chain, GRAPH_URLS[api.chain], '{ metrics { investmentVaults { id kinds } } }') + + const isLeveraged = vault => !!vault.kinds.find(v => v === 'Leverage') + const levVaults = investmentVaults.filter(isLeveraged).map(v => v.id) + const nonLevVaults = investmentVaults.filter(v => !isLeveraged(v)).map(v => v.id) + + const [decimals, supplies, reserves, rawNonLevTokens] = await Promise.all([ + api.multiCall({ abi: 'uint8:decimals', calls: nonLevVaults, permitFailure: true }), + api.multiCall({ abi: 'uint256:totalSupply', calls: nonLevVaults, permitFailure: true }), + api.multiCall({ abi: 'uint256:reservesPerShare', calls: nonLevVaults, permitFailure: true }), + api.multiCall({ abi: 'address:reserveToken', calls: nonLevVaults, permitFailure: true }) + ]) + + await Promise.all(nonLevVaults.map(async (_vault, i) => { + const decimal = decimals[i] + const supply = supplies[i] + const reserve = reserves[i] + const rawNonLevToken = rawNonLevTokens[i] + if (!decimals || !supply || !reserve || !rawNonLevToken) return + const nonLevToken = await api.call({ abi: 'address:baseToken', target: rawNonLevToken }) + const bal = reserve * supply / 10 ** decimal + api.add(nonLevToken, bal) + })) + + const [levReserveTokens, assetsAndLiabilities] = await Promise.all([ + api.multiCall({ calls: levVaults, abi: 'address:reserveToken', permitFailure: true }), + api.multiCall({ abi: 'function assetsAndLiabilities() external view returns (uint256 assets,uint256 liabilities,uint256 ratio)', calls: levVaults, permitFailure: true }) + ]) + + levVaults.forEach((_vault, i) => { + const levReserveToken = levReserveTokens[i] + const assetsAndLiability = assetsAndLiabilities[i] + if(!levReserveToken || !assetsAndLiability) return + const levBal = assetsAndLiability.assets - assetsAndLiability.liabilities + api.add(levReserveToken, levBal) + }) + + if (api.chain ==='ethereum') { + const [asset, totalAssets] = await Promise.all([ + api.call({ target: osUSDS, abi: 'address:asset' }), + api.call({ target: osUSDS, abi: 'uint256:totalAssets' }) + ]) + api.add(asset, totalAssets) + } +} diff --git a/projects/originarm/index.js b/projects/originarm/index.js new file mode 100644 index 0000000000..87afd109f1 --- /dev/null +++ b/projects/originarm/index.js @@ -0,0 +1,12 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +module.exports = { + ethereum: { + tvl: async (api) => { + const originLidoArm = "0x85b78aca6deae198fbf201c82daf6ca21942acc6"; + const outstandingSteth = await api.call({abi: 'uint256:lidoWithdrawalQueueAmount', target: originLidoArm }) + api.add(ADDRESSES.ethereum.STETH, outstandingSteth) + return api.sumTokens({ owner: originLidoArm, tokens: [ADDRESSES.ethereum.WETH, ADDRESSES.ethereum.STETH] }) + }, + }, +}; diff --git a/projects/origindollar/index.js b/projects/origindollar/index.js index 17a994be45..71d75c6913 100644 --- a/projects/origindollar/index.js +++ b/projects/origindollar/index.js @@ -1,35 +1,12 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const { staking, stakings } = require("../helper/staking"); +const { stakings } = require("../helper/staking"); const vault = "0xE75D77B1865Ae93c7eaa3040B038D7aA7BC02F70"; -const ethTvl = async (timestamp, ethBlock) => { - const balances = {}; - - // Account DAI, USDT and USDC backing up the minted OUSD - const stablecoins = ( - await sdk.api.abi.call({ - abi: abi.getAllAssets, - target: vault, - block: ethBlock, - }) - ).output; - - for (let i = 0; i < stablecoins.length; i++) { - const balance_stablecoin = ( - await sdk.api.abi.call({ - abi: abi.checkBalance, - target: vault, - params: stablecoins[i], - block: ethBlock, - }) - ).output; - - sdk.util.sumSingleBalance(balances, stablecoins[i], balance_stablecoin); - } - - return balances; +const ethTvl = async (api) => { + const tokens = await api.call({ abi: abi.getAllAssets, target: vault}) + const bals = await api.multiCall({ abi: abi.checkBalance, calls: tokens, target: vault}) + api.add(tokens, bals) }; module.exports = { diff --git a/projects/originether/index.js b/projects/originether/index.js index ceea8da769..2bba3ade3d 100644 --- a/projects/originether/index.js +++ b/projects/originether/index.js @@ -1,38 +1,46 @@ -const sdk = require("@defillama/sdk"); +const ADDRESSES = require('../helper/coreAssets.json') const abi = require("../origindollar/abi.json"); -const vault = "0x39254033945aa2e4809cc2977e7087bee48bd7ab"; - -const ethTvl = async (timestamp, ethBlock) => { - const balances = {}; - - // Account WETH, rETH, frxETH and stETH backing up the minted OUSD - const backingAssets = ( - await sdk.api.abi.call({ - abi: abi.getAllAssets, - target: vault, - block: ethBlock, - }) - ).output; - - for (let i = 0; i < backingAssets.length; i++) { - const backingAssetBalance = ( - await sdk.api.abi.call({ - abi: abi.checkBalance, - target: vault, - params: backingAssets[i], - block: ethBlock, - }) - ).output; - - sdk.util.sumSingleBalance(balances, backingAssets[i], backingAssetBalance); - } - - return balances; -}; + +const ethTvl = async (api) => { + const vault = "0x39254033945aa2e4809cc2977e7087bee48bd7ab"; + const nativeStaking = '0x34eDb2ee25751eE67F68A45813B22811687C0238' + const nativeStaking2 = '0x4685dB8bF2Df743c861d71E6cFb5347222992076' + const stakingBalance1 = await api.call({ abi: abi.checkBalance, target: nativeStaking, params: ADDRESSES.ethereum.WETH }) + api.add(ADDRESSES.ethereum.WETH, stakingBalance1) + const stakingBalance2 = await api.call({ abi: abi.checkBalance, target: nativeStaking2, params: ADDRESSES.ethereum.WETH }) + api.add(ADDRESSES.ethereum.WETH, stakingBalance2) + + // add ETH part of curve LP + const convexStrategy = '0x1827F9eA98E0bf96550b2FC20F7233277FcD7E63' + const lp = await api.call({ abi: 'address:curvePool', target: convexStrategy}) + const ethIndex = await api.call({ abi: 'uint128:ethCoinIndex', target: convexStrategy}) + const lpBalance = await api.call({ abi: abi.checkBalance, target: convexStrategy, params: ADDRESSES.ethereum.WETH}) + const lpSupply = await api.call({ abi: 'erc20:totalSupply', target: lp}) + const ethInPool = await api.call({ abi: 'function balances(uint256) view returns (uint256)', target: lp, params: ethIndex}) + const ethLPBalance = (lpBalance / lpSupply) * ethInPool + api.add(ADDRESSES.ethereum.WETH, ethLPBalance) + + + return api.sumTokens({ owner: vault, tokens: [ADDRESSES.ethereum.WETH] }) +} + +async function baseTvl(api) { + const vault = '0x98a0CbeF61bD2D21435f433bE4CD42B56B38CC93' + const aeroAMO = '0xF611cC500eEE7E4e4763A05FE623E2363c86d2Af' + const dripper = await api.call({ target: vault, abi: 'function dripper() view returns (address)' }) + const [amountWeth, _amountOETH] = await api.call({ abi: 'function getPositionPrincipal() view returns (uint256, uint256)', target: aeroAMO }) + api.add(ADDRESSES.base.WETH, amountWeth) + return api.sumTokens({ owners: [vault], tokens: [ADDRESSES.base.WETH] }) + +} + module.exports = { ethereum: { tvl: ethTvl, }, + base: { + tvl: baseTvl, + }, }; diff --git a/projects/osmosis-ibc/index.js b/projects/osmosis-ibc/index.js new file mode 100644 index 0000000000..17df9eda62 --- /dev/null +++ b/projects/osmosis-ibc/index.js @@ -0,0 +1,21 @@ +const { get } = require('../helper/http') +const { PromisePool } = require('@supercharge/promise-pool') + +async function tvl(api) { + const res = await get( + `https://raw.githubusercontent.com/osmosis-labs/assetlists/main/osmosis-1/generated/chain_registry/assetlist.json` + ) + + await PromisePool.withConcurrency(10) + .for(res.assets) + .process(async (c) => { + const { base: address } = c; + if (!address.startsWith("ibc/")) return; + const res = await get(`https://lcd.osmosis.zone/cosmos/bank/v1beta1/supply/by_denom?denom=${address}`) + if (res && res.amount) api.add(address, res.amount.amount, { skipChain: true }) + }) +} + +module.exports = { + cosmos: { tvl } +} diff --git a/projects/ostium/index.js b/projects/ostium/index.js index 84cb47d2ab..1427ac341b 100644 --- a/projects/ostium/index.js +++ b/projects/ostium/index.js @@ -2,7 +2,10 @@ const ADDRESSES = require('../helper/coreAssets.json'); const { sumTokensExport } = require('../helper/unwrapLPs'); const owners = [ + // OLP vault '0x20D419a8e12C45f88fDA7c5760bb6923Cee27F98', + // Trading collateral + '0xcCd5891083A8acD2074690F65d3024E7D13d66E7', ]; const tokens = [ diff --git a/projects/ottopia/index.js b/projects/ottopia/index.js index 0a07f498cd..d64ddc6c0e 100644 --- a/projects/ottopia/index.js +++ b/projects/ottopia/index.js @@ -1,38 +1,33 @@ const sdk = require("@defillama/sdk"); -const { GraphQLClient, gql } = require("graphql-request"); +const { request, gql } = require("graphql-request"); const { staking } = require("../helper/staking"); const CLAM = "0xC250e9987A032ACAC293d838726C511E6E1C029d"; const PearlBank = "0x845EB7730a8D37e8D190Fb8bb9c582038331B48a"; -async function tvl({timestamp}, block, chainBlocks) { - let endpoint = sdk.graph.modifyEndpoint('CejrrsnSQAxHJBpkgiBrLHQZ7h2MkK9QArM8bJvN9GuQ'); - let graphQLClient = new GraphQLClient(endpoint); - let query = gql` - query tvl($start: BigInt!, $end: BigInt!) { - protocolMetrics( - where: { timestamp_gte: $start, timestamp_lt: $end } - orderBy: timestamp - orderDirection: desc - first: 1 - ) { - treasuryMarketValue - timestamp - } +const endpoint = sdk.graph.modifyEndpoint('CejrrsnSQAxHJBpkgiBrLHQZ7h2MkK9QArM8bJvN9GuQ') + +const query = gql` + query tvl { + protocolMetrics( + first: 1 + orderBy: timestamp + orderDirection: desc + ) { + treasuryMarketValue + timestamp } - `; - const results = await graphQLClient.request(query, { - start: timestamp - 2 * 60 * 60 * 1000, - end: timestamp, - }) - return { - usd: parseFloat(results.protocolMetrics[0].treasuryMarketValue), - }; + } +`; + +async function tvl(api) { + const results = await request(endpoint, query) + return api.addUSDValue(parseFloat(results.protocolMetrics[0].treasuryMarketValue)) } module.exports = { - methodology: "This adapter uses otterclam's subgraph to fetch tvl data.", - start: 30711580, + deadFrom: '2024-08-14', + methodology: "This adapter uses otterclam's subgraph to fetch tvl data.", polygon: { tvl, staking: staking(PearlBank, CLAM), diff --git a/projects/ourbit/index.js b/projects/ourbit/index.js new file mode 100644 index 0000000000..7253f71ac5 --- /dev/null +++ b/projects/ourbit/index.js @@ -0,0 +1,50 @@ +const { cexExports } = require('../helper/cex') + +const config = { + ethereum: { + owners: [ + "0xf81b45b1663b7ea8716c74796d99bbe4ea26f488", + "0x18D080B89570e4B996EB17fA1F0206F0CE35d604", + ], + }, + tron: { + owners: [ + "TApNqy5BNx11TiNa7oibbBUV63BY5a2sNE", + "TJP6zoGwWwUmANvMdrtqYq9iWA8qMAAY4q" + ], + }, + bsc: { + owners: [ + "0xdbf7122c0b7af893580df087eabac0b3be3e9483", + "0x6c6EC4beeAa53171a0ce0691D5c9A5FaAF509a8A" + ], + }, + optimism: { + owners: [ + "0x944d6b4c2bf808f9324ca0675f1d7e0e92a35436", + ], + }, + avax: { + owners: [ + "0x8fc27c899fb2c1044608516450e385378195639d", + ], + }, + arbitrum: { + owners: [ + "0x040432c11ee833bdcaac2495329b65bee7cca6d9", + ], + }, + solana: { + owners: [ + "7UhjbynicBP8rqcobwsAJDfRMjwgHSgdxcYNJmLwxfms", + "3pjwKq9yuzpVYfD4h5jMZLLfV8oSd8YiwpoAaB5oZS3H" + ], + }, + bitcoin: { + owners: [ + "bc1q2cvpg2c74puqke4py0ufr0aauj4m5vdeaqpjxv", + ], + }, +} + +module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/owna/index.js b/projects/owna/index.js index 6410e55c5c..aec21d0ed7 100644 --- a/projects/owna/index.js +++ b/projects/owna/index.js @@ -87,9 +87,13 @@ config.chains.forEach(async chainInfo => { }; } + module.exports.deadFrom='2023-11-16', module.exports[chain] = { tvl: sumTokensExport({ chain, tokens, owners: [lendingContract] }), - borrowed: totalBorrowed, - offers: totalOffers, + borrowed: () => ({}) // bad debt totalBorrowed, + //offers: totalOffers, } }) + + + diff --git a/projects/oxiswap/index.js b/projects/oxiswap/index.js new file mode 100644 index 0000000000..86eb48f42d --- /dev/null +++ b/projects/oxiswap/index.js @@ -0,0 +1,12 @@ +const { sumTokens } = require("../helper/chain/fuel") + +async function tvl(api) { + const pairContract = '0x0da1be8528c8f546521ba9507d334cdb06cbc8b8842b3c0a871b1b4195635363'; + return sumTokens({ api, owners: [pairContract] }); +} + +module.exports = { + methodology: "TVL is calculated by summing the value of all tokens held in the pair contract.", + fuel: { tvl }, + timetravel: false, +}; \ No newline at end of file diff --git a/projects/p2pb2b/index.js b/projects/p2pb2b/index.js new file mode 100644 index 0000000000..87281e64a0 --- /dev/null +++ b/projects/p2pb2b/index.js @@ -0,0 +1,30 @@ +const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const config = { + bitcoin: { + owners: bitcoinAddressBook.p2pb2b, + }, + ethereum: { + owners: [ + '0xcfed1443a1ed773119ed1a41a39b3b66f0ffde0f', + '0x302f4d246fc1E283AF3239311B8B84bD5a1c7736', + '0x03feA254cfA7434004E8d495725bCbB7cCc40454', + '0x7a2556e23ce7bc1ADFBDCa650130390A10C05f63' + ], + }, + bsc: { + owners: [ + '0x83455d6c365dcbac10855c623da884b552aaefdd', + '0x03feA254cfA7434004E8d495725bCbB7cCc40454' + ] + }, + polygon: { + owners: [ + '0x302f4d246fc1E283AF3239311B8B84bD5a1c7736' + ] + } +} + +module.exports = cexExports(config) +module.exports.methodology = 'We are only tracking part of their cold wallets for P2PB2B, more information here https://coinmarketcap.com/exchanges/p2b/' diff --git a/projects/pairex/index.js b/projects/pairex/index.js index 03e88224b0..d13fdb5d8d 100644 --- a/projects/pairex/index.js +++ b/projects/pairex/index.js @@ -16,7 +16,7 @@ const tokens = [ ] module.exports = { - start: 1678852800, // 15/03/2023 @ 04:00am (UTC) + start: '2023-03-15', // 15/03/2023 @ 04:00am (UTC) arbitrum: { tvl: sumTokensExport({ tokens, owners: contracts }), }, diff --git a/projects/paladinfinance-dullahan/index.js b/projects/paladinfinance-dullahan/index.js index 8002d64096..4d39425d90 100644 --- a/projects/paladinfinance-dullahan/index.js +++ b/projects/paladinfinance-dullahan/index.js @@ -12,5 +12,4 @@ module.exports = { ethereum: { tvl, }, - start: 17824291 }; diff --git a/projects/paladinfinance-warlord/index.js b/projects/paladinfinance-warlord/index.js index e95d489818..f3719aa0e4 100644 --- a/projects/paladinfinance-warlord/index.js +++ b/projects/paladinfinance-warlord/index.js @@ -40,5 +40,4 @@ module.exports = { ethereum: { tvl: ethTvl, }, - start: 17368026 }; diff --git a/projects/palmaswap/index.js b/projects/palmaswap/index.js index 6cacfa927a..784385db04 100644 --- a/projects/palmaswap/index.js +++ b/projects/palmaswap/index.js @@ -11,6 +11,7 @@ module.exports = { hallmarks: [ [1679356800, "Rug Pull"] ], + deadFrom: '2023-03-21', core: { tvl: sdk.util.sumChainTvls([uniTvl, staking({ owners: [masterchef], diff --git a/projects/pancake-swap-stableswap/index.js b/projects/pancake-swap-stableswap/index.js index 6b32638f1a..b389701e6f 100644 --- a/projects/pancake-swap-stableswap/index.js +++ b/projects/pancake-swap-stableswap/index.js @@ -9,6 +9,7 @@ module.exports = { const config = { bsc: [{ target: '0x25a55f9f2279a54951133d503490342b50e5cd15', fromBlock: 25535459, token3: true, },], + ethereum: [{ target: '0xD173bf0851D2803177CC3928CF52F7b6bd29D054', fromBlock: 20362671, token3: true, },], arbitrum: [{ target: '0x5D5fBB19572c4A89846198c3DBEdB2B6eF58a77a', fromBlock: 169319653, token3: true, },], } diff --git a/projects/pangolin/index.js b/projects/pangolin/index.js index 5bd5ebe240..2efca3ea2b 100644 --- a/projects/pangolin/index.js +++ b/projects/pangolin/index.js @@ -56,5 +56,5 @@ module.exports = { return toUSDTBalances(data.pangolinFactory.totalLiquidityUSD) } }, - start: 1612715300, // 7th-Feb-2021 + start: '2021-02-07', // 7th-Feb-2021 }; diff --git a/projects/panko/index.js b/projects/panko/index.js new file mode 100644 index 0000000000..a6cdfbbe50 --- /dev/null +++ b/projects/panko/index.js @@ -0,0 +1,31 @@ +const { uniV3Export } = require("../helper/uniswapV3") +const { getLogs2 } = require('../helper/cache/getLogs') +const { mergeExports } = require("../helper/utils") +const { nullAddress } = require("../helper/unwrapLPs") + +const uniTvl = uniV3Export({ + taiko: { factory: '0x99960D7076297a1E0C86f3cc60FfA5d6f2B507B5', fromBlock: 433329 } +}) + +const stableswapConfig = { + taiko: { factory: '0x542E849ff47da056c127F35710b01242A59705d2', fromBlock: 433341 } +} +const stableTvl = {} + +Object.keys(stableswapConfig).forEach(chain => { + const { factory, fromBlock, } = stableswapConfig[chain] + stableTvl[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ + api, + factory, + eventAbi: 'event NewStableSwapPair(address indexed swapContract, address tokenA, address tokenB, address tokenC, address LP)', + fromBlock, + }) + const ownerTokens = logs.map(i => [[i.tokenA, i.tokenB, i.tokenC].filter(i => i !== nullAddress), i.swapContract]) + return api.sumTokens({ ownerTokens }) + } + } +}) + +module.exports = mergeExports([uniTvl, stableTvl]) \ No newline at end of file diff --git a/projects/panoptic/index.js b/projects/panoptic/index.js new file mode 100644 index 0000000000..494beaa0a5 --- /dev/null +++ b/projects/panoptic/index.js @@ -0,0 +1,77 @@ +const { getLogs2 } = require('../helper/cache/getLogs') +const { cachedGraphQuery } = require("../helper/cache"); +const { addUniV3LikePosition } = require('../helper/unwrapLPs'); + +const FACTORY = '0x000000000000010a1DEc6c46371A28A071F8bb01' +const SFPM = '0x0000000000000DEdEDdD16227aA3D836C5753194' + + +const SFPMChunksQuery = ` +query SFPMChunks($lastId: ID, $block: Int) { + chunks(first: 1000 + block: {number: $block} + where: {and: [{id_gt: $lastId}, { netLiquidity_gt: 100}]} + ) { + netLiquidity + tickLower + tickUpper + id + pool { id } + } +}` + +const abi = { + "PoolDeployed": "event PoolDeployed(address indexed poolAddress, address indexed uniswapPool, address collateralTracker0, address collateralTracker1)", + "PoolInitialized": "event PoolInitialized(address indexed uniswapPool, uint64 poolId, int24 minEnforcedTick, int24 maxEnforcedTick)", +} + +const config = { + ethereum: { + graphUrl: 'https://api.goldsky.com/api/public/project_cl9gc21q105380hxuh8ks53k3/subgraphs/panoptic-subgraph-mainnet/1.0.2/gn', + startBlock: 21389983, + safeBlockLimit: 50 + } +} + + +async function tvl(api) { + const chain = api.chain + const { startBlock, graphUrl, safeBlockLimit } = config[chain] + + const poolDeployedLogs = await getLogs2({ api, target: FACTORY, fromBlock: startBlock, eventAbi: abi.PoolDeployed, }) + const uniPools = poolDeployedLogs.map(log => log.uniswapPool.toLowerCase()) + const token0s = await api.multiCall({ abi: 'address:token0', calls: uniPools }) + const token1s = await api.multiCall({ abi: 'address:token1', calls: uniPools }) + const slot0s = await api.multiCall({ abi: 'function slot0() view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked)', calls: uniPools }) + + const poolData = {} + const ownerTokens = [] + uniPools.forEach((pool, i) => { + // to compte tokens locked in panoptic pools + ownerTokens.push([[token0s[i], token1s[i]], poolDeployedLogs[i].poolAddress]) + + // to compute value locked in uni v3 pools + poolData[pool] = { + token0: token0s[i], + token1: token1s[i], + tick: slot0s[i].tick, + } + }) + + await api.sumTokens({ ownerTokens }) + + const chunks = await cachedGraphQuery(`panoptic/sfpm-chunks`, graphUrl, SFPMChunksQuery, { api, useBlock: true, fetchById: true, safeBlockLimit, }) + chunks.forEach(chunk => { + const { token0, token1, tick, } = poolData[chunk.pool.id.toLowerCase()] ?? {} + if (!tick) return; + addUniV3LikePosition({ api, token0, token1, tick, liquidity: chunk.netLiquidity, tickUpper: chunk.tickUpper, tickLower: chunk.tickLower, }) + }) +} + +module.exports = { + ethereum: { + tvl, + methodology: 'This adapter counts tokens held by all PanopticPool contracts created by the PanopticFactory, as well as the token composition of all Uniswap liquidity held by the SemiFungiblePositionManager (which is used by every PanopticPool to manage liquidity).', + start: 1734049991, + }, +} \ No newline at end of file diff --git a/projects/paperdao/index.js b/projects/paperdao/index.js index b3ef80894e..68b7a9d4da 100644 --- a/projects/paperdao/index.js +++ b/projects/paperdao/index.js @@ -11,5 +11,8 @@ const blacklist = [ module.exports = { methodology, - ethpow: compoundExports("0x5e496e7F241B13c514A78B7E840bc3cC744D7215", "ethpow", "0xb9e008f2C039fB994C8adD806F8aF709899aA95e", ADDRESSES.ethereum.WETH, undefined, undefined, { blacklistedTokens: blacklist }) -} \ No newline at end of file + ethpow: compoundExports("0x5e496e7F241B13c514A78B7E840bc3cC744D7215", "0xb9e008f2C039fB994C8adD806F8aF709899aA95e", ADDRESSES.ethereum.WETH, { blacklistedTokens: blacklist }) +} + +module.exports.deadFrom='2023-05-01', +module.exports.ethpow.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/papparico-finance/index.js b/projects/papparico-finance/index.js new file mode 100644 index 0000000000..1b8ba46e9b --- /dev/null +++ b/projects/papparico-finance/index.js @@ -0,0 +1,31 @@ +const { sumTokensExport } = require("../helper/unknownTokens"); + +const PPFT_TOKEN_CONTRACT = "0x59BAfb7168972EcCA5e395F7dA88e71eCe47a260"; +const PPFT_MAIN_LP = "0xb036145476Ad16782eC05C7EC340D7e3cE6D09b7"; + +const STAKING_CONTRACT = "0x535503d5c23bCA9896383003A46A8AD6c9CB2fe2"; +const SINGLE_STAKING_CONTRACT = "0xFc8d5d6B280BF5E8d8DB12d0fF8a0f7d1A6ECf78"; +const VAULTS_CONTRACT = "0x828CC5D75594e4d0D072566cC07F64E863A0d11E"; +const LP_MINING_CONTRACT = "0x3E35810A663c7eE28a0A6f6A0984146CbB163c6c"; + +const XPPFT_TOKEN = "0x961105dD9bE34B64A27251d72B6D8F086847bc1c"; +const XPPFT_LP = "0xA99F134FC1e922Bc78Aa78c5897ce1eeF925b179"; +const LP_MINING_CONTRACT_V2 = "0x2490AFBf1609119bB76E5e936f4ce4cBed815947"; +const lps = [PPFT_MAIN_LP, XPPFT_LP]; + +module.exports = { + cronos: { + tvl: () => ({}), + staking: sumTokensExport({ + owners: [STAKING_CONTRACT, SINGLE_STAKING_CONTRACT, VAULTS_CONTRACT,], + tokens: [PPFT_TOKEN_CONTRACT, XPPFT_TOKEN], + lps, + useDefaultCoreAssets: true, + }), + pool2: sumTokensExport({ + owners: [LP_MINING_CONTRACT, LP_MINING_CONTRACT_V2], + tokens: lps, + useDefaultCoreAssets: true, + }), + } +}; \ No newline at end of file diff --git a/projects/papyrusswap/index.js b/projects/papyrusswap/index.js index 6edf5fb367..988ab5d123 100644 --- a/projects/papyrusswap/index.js +++ b/projects/papyrusswap/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('scroll', '0xD5f3D3fb72210bfe71a59c05e0b8D72973baa2a6', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('scroll', '0xD5f3D3fb72210bfe71a59c05e0b8D72973baa2a6') \ No newline at end of file diff --git a/projects/parallel-lending/index.js b/projects/parallel-lending/index.js index ca94319312..2c365e77b3 100644 --- a/projects/parallel-lending/index.js +++ b/projects/parallel-lending/index.js @@ -1,7 +1,13 @@ const { getExports } = require('../helper/heroku-api') module.exports = { + // deadFrom: '2024-08-17', timetravel: false, misrepresentedTokens: true, ...getExports("parallel-lending", ['heiko', 'parallel'], ['borrowed']), -} \ No newline at end of file +} + +const chains = ['heiko', 'parallel'] +chains.forEach(chain => { + Object.keys(module.exports[chain]).forEach(key => module.exports[chain][key] = () => ({})) +}) \ No newline at end of file diff --git a/projects/parallel-staking/index.js b/projects/parallel-staking/index.js index c49199a2b0..8a64eb93ca 100644 --- a/projects/parallel-staking/index.js +++ b/projects/parallel-staking/index.js @@ -1,6 +1,12 @@ const { getExports } = require('../helper/heroku-api') module.exports = { + // deadFrom: '2024-08-17', timetravel: false, ...getExports("parallel-staking", ['heiko', 'parallel']), -} \ No newline at end of file +} + +const chains = ['heiko', 'parallel'] +chains.forEach(chain => { + Object.keys(module.exports[chain]).forEach(key => module.exports[chain][key] = () => ({})) +}) \ No newline at end of file diff --git a/projects/parallel-stream/index.js b/projects/parallel-stream/index.js index bb1791d842..45c848afe2 100644 --- a/projects/parallel-stream/index.js +++ b/projects/parallel-stream/index.js @@ -1,7 +1,13 @@ const { getExports } = require('../helper/heroku-api') module.exports = { + // deadFrom: '2024-08-17', timetravel: false, misrepresentedTokens: true, ...getExports("parallel-stream", ['heiko', 'parallel']), -} \ No newline at end of file +} + +const chains = ['heiko', 'parallel'] +chains.forEach(chain => { + Object.keys(module.exports[chain]).forEach(key => module.exports[chain][key] = () => ({})) +}) \ No newline at end of file diff --git a/projects/parallel.js b/projects/parallel.js index b9eb689f5c..d216a1336d 100644 --- a/projects/parallel.js +++ b/projects/parallel.js @@ -1,6 +1,12 @@ const { getExports } = require('./helper/heroku-api') module.exports = { + // deadFrom: '2024-08-17', timetravel: false, ...getExports("parallel-crowdloan", ['heiko', 'parallel']), -} \ No newline at end of file +} + +const chains = ['heiko', 'parallel'] +chains.forEach(chain => { + Object.keys(module.exports[chain]).forEach(key => module.exports[chain][key] = () => ({})) +}) \ No newline at end of file diff --git a/projects/parallelamm/index.js b/projects/parallelamm/index.js index 24412eac1a..9fd270af21 100644 --- a/projects/parallelamm/index.js +++ b/projects/parallelamm/index.js @@ -1,7 +1,13 @@ const { getExports } = require('../helper/heroku-api') module.exports = { + // deadFrom: '2024-08-17', timetravel: false, misrepresentedTokens: true, ...getExports("parallelamm", ['heiko', 'parallel']), -} \ No newline at end of file +} + +const chains = ['heiko', 'parallel'] +chains.forEach(chain => { + Object.keys(module.exports[chain]).forEach(key => module.exports[chain][key] = () => ({})) +}) diff --git a/projects/parraton/index.js b/projects/parraton/index.js new file mode 100644 index 0000000000..56b7d866a5 --- /dev/null +++ b/projects/parraton/index.js @@ -0,0 +1,28 @@ +const { get } = require('../helper/http') +const ADDRESSES = require("../helper/coreAssets.json"); + +async function tvl(api) { + const vaults = await get('https://api.parraton.com/v1/vaults') + const tvl =vaults.reduce((acc, vault) => { + acc += Number(vault.tvlUsd) + return acc + }, 0) + api.add(ADDRESSES.ton.USDT, tvl * 1e6) +} + +module.exports = { + misrepresentedTokens: true, + timetravel: false, + methodology: ` +The methodology for calculating TVL includes both the TON balance and LP token +data for each vault. We convert the TON balance to its USD equivalent and add it +to the value of DeDust LP tokens, which is calculated using on-chain data +(reserve0, reserve1, total LP supply). The value of LP tokens is determined by +their share of pool reserves, adjusted to USD. The total TVL is the sum of these +values across all vaults. The calculation is performed on the Parraton API side. + `.trim(), + + ton: { + tvl + } +} \ No newline at end of file diff --git a/projects/paxo-finance/index.js b/projects/paxo-finance/index.js index 099a49b8c1..c7a7964b2b 100644 --- a/projects/paxo-finance/index.js +++ b/projects/paxo-finance/index.js @@ -3,10 +3,10 @@ const { lendingMarket } = require('../helper/methodologies') const { staking } = require("../helper/staking"); module.exports = { - polygon: compoundExports('0x1eDf64B621F17dc45c82a65E1312E8df988A94D3', 'polygon'), - xdc: compoundExports('0x301C76e7b60e9824E32991B8F29e1c4a03B4F65b', 'xdc'), - linea: compoundExports('0x301C76e7b60e9824E32991B8F29e1c4a03B4F65b', 'linea'), - boba: compoundExports('0x301C76e7b60e9824E32991B8F29e1c4a03B4F65b', 'boba'), + polygon: compoundExports('0x1eDf64B621F17dc45c82a65E1312E8df988A94D3'), + xdc: compoundExports('0x301C76e7b60e9824E32991B8F29e1c4a03B4F65b'), + linea: compoundExports('0x301C76e7b60e9824E32991B8F29e1c4a03B4F65b'), + boba: compoundExports('0x301C76e7b60e9824E32991B8F29e1c4a03B4F65b'), methodology: `${lendingMarket}. TVL is calculated by getting the market addresses from comptroller and calling the getCash() on-chain method to get the amount of tokens locked in each of these addresses.`, } diff --git a/projects/peakdefi/index.js b/projects/peakdefi/index.js index 620d169217..00aa69d40c 100644 --- a/projects/peakdefi/index.js +++ b/projects/peakdefi/index.js @@ -23,7 +23,7 @@ async function tvl(api) { return sumTokens2({ api, owners: Object.values(funds), tokens }) } module.exports = { - start: 1607405152, // Dec-08-2020 05:25:52 PM +UTC + start: '2020-12-08', // Dec-08-2020 05:25:52 PM +UTC bsc: { staking: staking(stakingContracts.bsc, peakAddress, "bsc", peakAddress), }, diff --git a/projects/peardao/index.js b/projects/peardao/index.js index 60be1953c5..c3e34d0038 100644 --- a/projects/peardao/index.js +++ b/projects/peardao/index.js @@ -22,7 +22,6 @@ const tokens = [ module.exports = { methodology: 'Counts the value of LP tokens and PEX tokens in the staking contracts, assets locked in the P2P escrow contract, and assets in the treasury contract.', - start: 15966251, // Mar-11-2022 01:00:01 PM +UTC bsc: { tvl: sumTokensExport({ tokens, owner: DOTC_CONTRACT, }), staking: stakings([TREASURY_ADDRESS, PEX_STAKING_POOL_CONTRACT], PEX_TOKEN_CONTRACT), diff --git a/projects/pearl-v1-5/index.js b/projects/pearl-v1-5/index.js new file mode 100644 index 0000000000..081aea6645 --- /dev/null +++ b/projects/pearl-v1-5/index.js @@ -0,0 +1,10 @@ +const { getUniTVL } = require('../helper/unknownTokens') + +module.exports = { + misrepresentedTokens: true, + 'real': { + tvl: getUniTVL({ + factory: '0xAed0A784f357BE9C3f8113BB227a7517a3444Efe', useDefaultCoreAssets: true, hasStablePools: true + }) + } +}; \ No newline at end of file diff --git a/projects/pearl-v2/index.js b/projects/pearl-v2/index.js index cb27a24cc6..d1a1ed5c33 100644 --- a/projects/pearl-v2/index.js +++ b/projects/pearl-v2/index.js @@ -1,11 +1,8 @@ const { uniV3Export } = require('../helper/uniswapV3') - -const ownTokens = [ - '0xaec9e50e3397f9ddc635c6c429c8c7eca418a143', - '0x4644066f535ead0cde82d209df78d94572fcbf14', - '0x25ea98ac87a38142561ea70143fd44c4772a16b6', -] +const { staking } = require('../helper/staking') module.exports = uniV3Export({ - 'real': { factory: '0xeF0b0a33815146b599A8D4d3215B18447F2A8101', fromBlock: 33062, blacklistedTokens: ownTokens,} -}) \ No newline at end of file + 'real': { factory: '0xeF0b0a33815146b599A8D4d3215B18447F2A8101', fromBlock: 33062, }, +}) + +module.exports.real.staking = staking('0x7f8F92C2446E044af45DCf15476Bc931Fd1d0020', '0xB08F026f8a096E6d92eb5BcbE102c273A7a2d51C') \ No newline at end of file diff --git a/projects/pegasusdao.js b/projects/pegasusdao.js index a0f7909118..89b3fb8a1a 100644 --- a/projects/pegasusdao.js +++ b/projects/pegasusdao.js @@ -14,7 +14,7 @@ const lps = [ const shareLps = "0x72c1f5fb7e5513a07e1ff663ad861554887a0a0a"; const genesisPool = "0x64bfCBe4480B53E8234Ca258a96720F29fe6A6fB"; const genesisTokens = [ - "0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23", + ADDRESSES.cronos.WCRO_1, ADDRESSES.cronos.USDC, "0x97749c9b61f878a880dfe312d2594ae07aed7656", "0xb8df27c687c6af9afe845a2afad2d01e199f4878", diff --git a/projects/pell/index.js b/projects/pell/index.js index 5caac463b1..5ec2b56909 100644 --- a/projects/pell/index.js +++ b/projects/pell/index.js @@ -1,7 +1,7 @@ const { sumTokens2 } = require('../helper/unwrapLPs') const { getConfig } = require('../helper/cache') -const chains = ['ethereum', 'arbitrum', 'merlin', 'bouncebit', 'btr', 'bsc', 'bsquared', 'core', 'bevm', 'mantle', 'scroll', 'bob'] +const chains = ['ethereum', 'arbitrum', 'merlin', 'bouncebit', 'btr', 'bsc', 'base', 'bsquared', 'core', 'bevm', 'mantle', 'scroll', 'bob', 'ailayer', 'iotex', 'rsk'] chains.forEach(chain => { module.exports[chain] = { diff --git a/projects/pendle/v1.js b/projects/pendle/v1.js index 2ab549e92e..ea0aa7f361 100644 --- a/projects/pendle/v1.js +++ b/projects/pendle/v1.js @@ -1,8 +1,3 @@ -const { - sumTokensAndLPsSharedOwners, - unwrapUniswapLPs -} = require("../helper/unwrapLPs"); -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const contracts = require("./contracts"); const { staking } = require("../helper/staking"); @@ -18,125 +13,82 @@ const avaxFundedContracts = Object.keys(contracts.v1.avax.funded); const avaxOtTokens = Object.keys(contracts.v1.avax.otTokens); const avaxPool2Contracts = Object.keys(contracts.v1.avax.pool2); -async function ethTvl(timestamp, block) { - const balances = {}; - let lpBalances = []; +async function ethTvl(api) { const masterChefContract = "0xc2edad668740f1aa35e4d8f227fb8e17dca888cd"; - const masterChefDeposits = await sdk.api.abi.call({ + const masterChefDeposits = await api.call({ target: masterChefContract, abi: abi.userInfo, params: [1, ethFundedContracts[4]], - block: block }); - lpBalances.push({ - token: ethTokens.SLP_ETHUSDC, - balance: masterChefDeposits.output.amount - }); - await unwrapUniswapLPs(balances, lpBalances, block); - - await sumTokensAndLPsSharedOwners( - balances, - [ - [ethTokens.USDC, false], - [ethTokens.aUSDC, false], - [ethTokens.cDAI, false], - [ethTokens.SLP_ETHUSDC, false], - [ethTokens.SLP_PENDLEETH, false], - [ethTokens.SUSHI, false], - [ethTokens.COMP, false], - [ethTokens.wxBTRFLY, false], - [ethTokens.SLP_OT_aUSDC_21, false], - [ethTokens.SLP_OT_aUSDC_22, false], - [ethTokens.SLP_OT_cDAI_21, false], - [ethTokens.SLP_OT_cDAI_22, false], - [ethTokens.SLP_OT_ETHUSDC_22, false], - [ethTokens.SLP_OT_wxBTRFLY_22, false] - ], - ethFundedContracts, - block - ); - for (let token of ethOtTokens) { - delete balances[token.toLowerCase()]; - } - delete balances[ethTokens.PENDLE]; - - return balances; + api.add(ethTokens.SLP_ETHUSDC, masterChefDeposits.amount); + await api.sumTokens({ + owners: ethFundedContracts, tokens: [ + ethTokens.USDC, + ethTokens.aUSDC, + ethTokens.cDAI, + ethTokens.SLP_ETHUSDC, + ethTokens.SLP_PENDLEETH, + ethTokens.SUSHI, + ethTokens.COMP, + ethTokens.wxBTRFLY, + ethTokens.SLP_OT_aUSDC_21, + ethTokens.SLP_OT_aUSDC_22, + ethTokens.SLP_OT_cDAI_21, + ethTokens.SLP_OT_cDAI_22, + ethTokens.SLP_OT_ETHUSDC_22, + ethTokens.SLP_OT_wxBTRFLY_22, + ] + }) + + ethOtTokens.push(ethTokens.PENDLE); + + ethOtTokens.map(i => api.removeTokenBalance(i)) + return api.getBalances() } -async function avaxTvl(timestamp, _, { avax: block }) { - const transform = addr => 'avax:'+addr - const balances = {}; - +async function avaxTvl(api) { const masterChefContract = "0xd6a4F121CA35509aF06A0Be99093d08462f53052"; - const TIME = "avax:0xb54f16fb19478766a268f172c9480f8da1a7c9c3"; - balances[transform(avaxTokens.xJOE)] = (await sdk.api.abi.call({ + const xJOEBalance = (await api.call({ target: masterChefContract, abi: abi.userInfo, params: [24, avaxFundedContracts[0]], - block: block, - chain: "avax" - })).output.amount; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [avaxTokens.USDC, false], - [avaxTokens.qiAVAX, false], - [avaxTokens.qiUSDC, false], - [avaxTokens.xJOE, false], - [avaxTokens.JLP_PENDLEAVAX, false], - [avaxTokens.WAVAX, false], - [avaxTokens.JOE, false], - [avaxTokens.QI, false], - [avaxTokens.MIM, false], - [avaxTokens.wMEMO, false], - [avaxTokens.JLP_OT_PAP, false], - [avaxTokens.JLP_OT_qiUSDC, false], - [avaxTokens.JLP_OT_qiAVAX, false], - [avaxTokens.JLP_OT_xJOE, false], - [avaxTokens.JLP_OT_wMEMO, false] - ], - avaxFundedContracts, - block, - "avax", - transform - ); - - balances[TIME] = (await sdk.api.abi.call({ - target: avaxTokens.wMEMO, - abi: abi.wMEMOToMEMO, - params: [balances[`avax:${avaxTokens.wMEMO}`]], - block: block, - chain: "avax" - })).output; - delete balances[`avax:${avaxTokens.wMEMO}`]; - - for (let token of avaxOtTokens) { - delete balances[`avax:${token.toLowerCase()}`]; - } - - return balances; + })).amount + api.add(avaxTokens.xJOE, xJOEBalance); + await api.sumTokens({ + owners: avaxFundedContracts, tokens: [ + avaxTokens.USDC, + avaxTokens.qiAVAX, + avaxTokens.qiUSDC, + avaxTokens.xJOE, + avaxTokens.JLP_PENDLEAVAX, + avaxTokens.WAVAX, + avaxTokens.JOE, + avaxTokens.QI, + avaxTokens.MIM, + avaxTokens.wMEMO, + avaxTokens.JLP_OT_PAP, + avaxTokens.JLP_OT_qiUSDC, + avaxTokens.JLP_OT_qiAVAX, + avaxTokens.JLP_OT_xJOE, + avaxTokens.JLP_OT_wMEMO, + ] + }) + + avaxOtTokens.map(i => api.removeTokenBalance(i)) + return api.getBalances() } -async function avaxPool2(timestamp, _, { avax: block }) { - const transform = addr => 'avax:'+addr - const pool2 = {}; - - await sumTokensAndLPsSharedOwners( - pool2, - [ - [avaxTokens.JLP_PENDLEAVAX, false], - [avaxTokens.PENDLE, false], - [avaxTokens.JOE, false] - ], - avaxPool2Contracts, - block, - "avax", - transform - ); - return pool2; +async function avaxPool2(api) { + await api.sumTokens({ + owners: avaxPool2Contracts, tokens: [ + avaxTokens.JLP_PENDLEAVAX, + avaxTokens.PENDLE, + avaxTokens.JOE, + ] + }) + return api.getBalances() } module.exports = { diff --git a/projects/pendle/v2.js b/projects/pendle/v2.js index 93db46e334..209b052a69 100644 --- a/projects/pendle/v2.js +++ b/projects/pendle/v2.js @@ -36,6 +36,8 @@ const config = { "0x5ec2ae0afdec891e7702344dc2a31c636b3627eb", "0x70c1138b54ba212776d3a9d29b6160c54c31cd5d", "0x04eb6b56ff53f457c8e857ca8d4fbc8d9a531c0c", + "0x541b5eeac7d4434c8f87e2d32019d67611179606", + "0x5d1735b8e33bae069708cea245066de1a12cd38d" ], }, optimism: { @@ -54,6 +56,11 @@ const config = { { factory: "0xcb02435716b0143d4ac1bdf370302d619e714126", fromBlock: 67661738 }, // v5 ], }, + base: { + factories: [ + { factory: "0x59968008a703dC13E6beaECed644bdCe4ee45d13", fromBlock: 22350352 }, // v3 + ], + } }; module.exports = {}; @@ -118,10 +125,16 @@ Object.keys(config).forEach((chain) => { }); data.forEach((v, i) => { - let value = supply[i] * 10 ** (v.decimals - decimals[i]); + let value = supply[i] * 10 ** (v.decimals - + (sy[i].toLowerCase() == '0x7b5a43070bd97c2814f0d8b3b31ed53450375c19' // case for vbnb + ? 18 : decimals[i])); let index = tokenAssetTypeSy.indexOf(sy[i]); if (index !== -1) { - value = (value * exchangeRates[index]) / 10 ** 18; + value = (value * exchangeRates[index]) / 10 ** ([ + '0x141ec2d606f12ff959d7d07cde6811e5fdff2831', + '0xec30e55b51d9518cfcf5e870bcf89c73f5708f72', + '0xd5cf704dc17403343965b4f9cd4d7b5e9b20cc52' + ].includes(sy[i].toLowerCase()) ? v.decimals : 18); } api.add(v.uAsset.toLowerCase(), value); }); @@ -149,4 +162,4 @@ async function filterWhitelistedSY(api, sys) { module.exports.ethereum.staking = staking( contracts.v2.vePENDLE, contracts.v2.PENDLE -); +); \ No newline at end of file diff --git a/projects/penpie/index.js b/projects/penpie/index.js index 6a4d98f2f1..6c6d6534de 100644 --- a/projects/penpie/index.js +++ b/projects/penpie/index.js @@ -3,19 +3,17 @@ const config = require("./config"); const { staking } = require('../helper/staking') async function tvl(api) { - const { masterPenpie, vlPNP } = config[api.chain]; + const { masterPenpie, vlPNP, pendleStaking, mPENDLE, } = config[api.chain]; const poolTokens = await api.fetchList({ lengthAbi: MasterMagpieAbi.poolLength, itemAbi: MasterMagpieAbi.registeredToken, target: masterPenpie, }); - const poolInfos = await api.multiCall({ abi: 'function getPoolInfo(address) view returns ( uint256 emission, uint256 allocpoint, uint256 sizeOfPool, uint256 totalPoint)', calls: poolTokens, target: masterPenpie, }) - poolTokens.forEach((token, i) => { - api.add(token, poolInfos[i].sizeOfPool) - }) - if (vlPNP) - api.removeTokenBalance(vlPNP) + const blacklistedTokens = [] + if (vlPNP) blacklistedTokens.push(vlPNP) + if (mPENDLE && masterPenpie) await api.sumTokens({ tokens: [mPENDLE], owner: masterPenpie }) + return api.sumTokens({ tokens: poolTokens, owner: pendleStaking, blacklistedTokens }) } Object.keys(config).forEach((chain) => { diff --git a/projects/pepedex/index.js b/projects/pepedex/index.js index ef089cbf8f..6e4f3674ca 100644 --- a/projects/pepedex/index.js +++ b/projects/pepedex/index.js @@ -4,7 +4,6 @@ module.exports = { misrepresentedTokens: true, ethereum: { tvl: getUniTVL({ - fetchBalances: true, useDefaultCoreAssets: true, factory: '0x460b2005b3318982feADA99f7ebF13e1D6f6eFfE', }) diff --git a/projects/percent/index.js b/projects/percent/index.js index 47443768f6..02fa8ec81b 100644 --- a/projects/percent/index.js +++ b/projects/percent/index.js @@ -1,12 +1,9 @@ -const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const { stakings } = require("../helper/staking"); -const { getCompoundV2Tvl } = require("../helper/compound"); +const { compoundExports2 } = require("../helper/compound"); const comptroller = "0xf47dD16553A934064509C40DC5466BBfB999528B"; -const pETH = "0x45F157b3d3d7C415a0e40012D64465e3a0402C64"; -const pETHEquivalent = ADDRESSES.ethereum.WETH; const pool2Contract = "0x23b53026187626Ed8488e119767ACB2Fe5F8de4e"; const lpOfPool2 = "0xEB85B2E12320a123d447Ca0dA26B49E666b799dB"; @@ -69,26 +66,11 @@ module.exports = { ethereum: { staking: stakings(stakingContracts, PCT), pool2: pool2, - borrowed: getCompoundV2Tvl( - comptroller, - "ethereum", - (addr) => addr, - pETH, - pETHEquivalent, - true - ), - tvl: sdk.util.sumChainTvls([ - getCompoundV2Tvl( - comptroller, - "ethereum", - (addr) => addr, - pETH, - pETHEquivalent - ), - ethTvl, - ]), - }, + ...compoundExports2({ comptroller, cether: '0x45f157b3d3d7c415a0e40012d64465e3a0402c64' }), + }, methodology: "Same as compound, we get all the liquidity and the borrowed part on the lending markets", }; + +module.exports.ethereum.tvl = sdk.util.sumChainTvls([module.exports.ethereum.tvl, ethTvl]) \ No newline at end of file diff --git a/projects/perfect-pool/index.js b/projects/perfect-pool/index.js new file mode 100644 index 0000000000..712c80696b --- /dev/null +++ b/projects/perfect-pool/index.js @@ -0,0 +1,14 @@ +const { sumTokensExport } = require("../helper/unwrapLPs") +const ADDRESSES = require('../helper/coreAssets.json') + +const NFT_ACE8 = '0x21F3ea812734b6492D88D268622CF068e9E6D596' +const NFT_ACE16 = '0x70A254c8201adbD88d88D17937d5e8aBb8B8095F' + +module.exports = { + start: '2024-09-02', + base: { + tvl: sumTokensExport( + { owners: [NFT_ACE8, NFT_ACE16], token: ADDRESSES.base.USDC }, + ), + } +} \ No newline at end of file diff --git a/projects/perifinance/abi.json b/projects/perifinance/abi.json deleted file mode 100644 index 4870780e86..0000000000 --- a/projects/perifinance/abi.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "totalIssuedPynths": "function totalIssuedPynths(bytes32 currencyKey) view returns (uint256 totalIssued)" -} \ No newline at end of file diff --git a/projects/perifinance/index.js b/projects/perifinance/index.js index 9daf0fe4d5..1810f4bbd6 100644 --- a/projects/perifinance/index.js +++ b/projects/perifinance/index.js @@ -1,97 +1,17 @@ -const sdk = require("@defillama/sdk"); -const { totalIssuedPynths } = require("./abi.json"); - -const BigNumber = require("bignumber.js"); - -const ethereum = "ethereum"; -const polygon = "polygon"; -const bsc = "bsc"; - const periFinanceContract = { - ethereum: "0x3a9a93A04eFB22e632632Ab584fF45DEB7321aC8", - polygon: "0x7C4cE79655Ac1e84400bC5962b4B75c2b86Bd974", - bsc: "0x82995a4170318f5E26CA6b650A337738dcc8114c", -}; - -const pUSD = "pUSD"; -const tokenKey = "usd-coin"; - -const totalIssuedPynthByChain = async (chain) => { - const currencyKey = rightPad(asciiToHex(pUSD), 64); - - const { output: totalIssuedPynth } = await sdk.api.abi.call({ - abi: totalIssuedPynths, - params: currencyKey, - target: periFinanceContract[chain], - chain, - }); - return totalIssuedPynth; -}; - -const getTVL = (totalIssuedPynths) => { - return BigNumber(totalIssuedPynths) - .div(10 ** 18) - .times(4); -}; - -const tvlByChain = (chain) => async (timestamp, block) => { - const totalIssuedPynth = await totalIssuedPynthByChain(chain); - - const tvl = getTVL(totalIssuedPynth); - - // toFixed(0) just converts the numbers into strings - return { - [tokenKey]: tvl.toFixed(0), - }; -}; - -module.exports = { - ethereum: { - tvl: tvlByChain(ethereum), - }, - bsc: { - tvl: tvlByChain(bsc), - }, - polygon: { - tvl: tvlByChain(polygon), - }, -}; - - -/** - * Should be called to get hex representation (prefixed by 0x) of ascii string - * - * @method asciiToHex - * @param {String} str - * @returns {String} hex representation of input string - */ - function asciiToHex (str) { - if(!str) - return "0x00"; - var hex = ""; - for(var i = 0; i < str.length; i++) { - var code = str.charCodeAt(i); - var n = code.toString(16); - hex += n.length < 2 ? '0' + n : n; - } - - return "0x" + hex; + ethereum: "0x0207157a7c154bFdEAD22751474c68660A4a540b", + polygon: "0x8f151e700772d6e8Dc7dA8B260c9e0C3eCbF4174", + bsc: "0x2Da103C31c4A80f828ea4158bD090e926003e8ad", + base: "0x0f2Af7246e1FcbEC5e334092B1F0D91BDA924faD", + moonriver: "0xB2f5Cd646Aab5f887150945576d51a8B5902F288", + moonbeam: "0x0f2Af7246e1FcbEC5e334092B1F0D91BDA924faD", } -/** - * Should be called to pad string to expected length - * - * @method rightPad - * @param {String} string to be padded - * @param {Number} chars that result string should have - * @param {String} sign, by default 0 - * @returns {String} right aligned string - */ -function rightPad(string, chars, sign) { - var hasPrefix = /^0x/i.test(string) || typeof string === 'number'; - string = string.toString(16).replace(/^0x/i,''); +Object.keys(periFinanceContract).forEach(chain => module.exports[chain] = { tvl }) - var padding = (chars - string.length + 1 >= 0) ? chars - string.length + 1 : 0; - - return (hasPrefix ? '0x' : '') + string + (new Array(padding).join(sign ? sign : "0")); -} \ No newline at end of file +async function tvl(api) { + const contract = periFinanceContract[api.chain]; + const pUSD = await api.call({ abi: 'function pUSD() view returns (bytes32)', target: contract}) + const totalIssued = await api.call({ abi: "function totalIssuedPynths(bytes32 currencyKey) view returns (uint256 totalIssued)", target: contract, params: pUSD}) + api.addCGToken("usd-coin", totalIssued * 4 / 1e18) +} diff --git a/projects/perlinx/index.js b/projects/perlinx/index.js index caf7253f5c..3ae833fcdd 100644 --- a/projects/perlinx/index.js +++ b/projects/perlinx/index.js @@ -97,6 +97,6 @@ async function tvl(timestamp, block) { ==================================================*/ module.exports = { - start: 1600905600, + start: '2020-09-24', ethereum: { tvl } } diff --git a/projects/perp88/index.js b/projects/perp88/index.js index 58521b33fa..4864b7cab5 100644 --- a/projects/perp88/index.js +++ b/projects/perp88/index.js @@ -20,7 +20,7 @@ async function blastTvl(api) { } module.exports = { - start: 1668684025, + start: '2022-11-17', polygon: { tvl: sumTokensExport({ owner: POOL_DIAMOND_CONTRACT, diff --git a/projects/perseid-finance/index.js b/projects/perseid-finance/index.js index fe2325cb81..ac8fe91978 100644 --- a/projects/perseid-finance/index.js +++ b/projects/perseid-finance/index.js @@ -38,6 +38,7 @@ module.exports = { hallmarks: [ [1699578000,"Rug Pull"] ], + deadFrom: '2023-11-10', scroll: { tvl: getTvl(false), staking: getTvl(true), diff --git a/projects/pheasantswap/index.js b/projects/pheasantswap/index.js index 4941297bcf..0b83580755 100644 --- a/projects/pheasantswap/index.js +++ b/projects/pheasantswap/index.js @@ -1,5 +1,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { - enuls: { tvl: getUniTVL({ factory: '0x7bf960B15Cbd9976042257Be3F6Bb2361E107384', useDefaultCoreAssets: true, fetchBalances: true }), }, + enuls: { tvl: getUniTVL({ factory: '0x7bf960B15Cbd9976042257Be3F6Bb2361E107384', useDefaultCoreAssets: true,}), }, } diff --git a/projects/phemex/index.js b/projects/phemex/index.js index 8aaad51c99..c5f73f5b1c 100644 --- a/projects/phemex/index.js +++ b/projects/phemex/index.js @@ -1,14 +1,85 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { bitcoin: { - owners: [ - '3PiGxVdpMjWSsH8X8BypdwcsmPW5cmE4Ta', - ] + owners: bitcoinAddressBook.phemex }, ethereum: { owners: [ - '0xf7D13C7dBec85ff86Ee815f6dCbb3DEDAc78ca49' + '0xf7D13C7dBec85ff86Ee815f6dCbb3DEDAc78ca49', + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + bsc: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + base: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + avax: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + fantom: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + arbitrum: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + optimism: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + polygon: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + era: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + linea: { + owners: [ + '0x50be13b54f3eebbe415d20250598d81280e56772' + ], + }, + ripple: { + owners: [ + 'rQKKvBvEfXbTThkqrtqaY3sAKuW6iqcMzX', + 'rLMAAuqJowC5yMccaPnappeLM8vDfdiDTg', + ], + }, + sui: { + owners: [ + '0x51fc8f63faf7b22d401623f9c3ae5183e564d701741770f12ad1851c6c45a0c8', + ], + }, + tron: { + owners: [ + 'THAABzWrhp84Nr7gxss7qhtzA5mp3d1qUo' + ], + }, + solana: { + owners: [ + 'EWSHJzKpzjpwz9GuNKkXWMHXAiwtB7obSGhdFKu5QZku' + ], + }, + polkadot: { + owners: [ + '15hTaSogYFyGyRJhXdpQWRR1J9oya5nj4nFppi4XgUVMCvmP' ], }, } diff --git a/projects/phission-finance/index.js b/projects/phission-finance/index.js index af8f50d528..ff14977390 100644 --- a/projects/phission-finance/index.js +++ b/projects/phission-finance/index.js @@ -8,7 +8,7 @@ const STAKING_CONTRACT = '0x569a157eac744b87a42314e8fc03a2e648ea33a2' module.exports = { methodology: 'Total amount of WETH split, plus the value of Pool2', - start: 1661851416, + start: '2022-08-30', ethereum: { tvl: sumTokensExport({ owner: SPLIT_CONTRACT, tokens: [WETH] }), pool2: sumTokensExport({ owner: STAKING_CONTRACT, tokens: [GOV_POOL], useDefaultCoreAssets: true }), diff --git a/projects/phoenix/index.js b/projects/phoenix/index.js index 21c4ed56d5..91dafc430e 100644 --- a/projects/phoenix/index.js +++ b/projects/phoenix/index.js @@ -1,7 +1,7 @@ const tvl = () => ({}) module.exports = { - start: 1631376000, // beijing time 2021-9-11 0:0: + start: '2021-09-11', // beijing time 2021-9-11 0:0: deadFrom: '2022-09-15', hallmarks: [ [Math.floor(new Date('2022-09-15')/1e3), 'Project is dead: https://twitter.com/Phoenix__PHX/status/1570389804734640129'], diff --git a/projects/photon-protocol/index.js b/projects/photon-protocol/index.js index 0028dd3dab..c5d25c1aea 100644 --- a/projects/photon-protocol/index.js +++ b/projects/photon-protocol/index.js @@ -1,24 +1,15 @@ const ADDRESSES = require('../helper/coreAssets.json') const { stakingUnknownPricedLP } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { sumTokensExport } = require("../helper/unwrapLPs"); const photon = "0x2F1305F0619ADa14688A4291953bd7d284f9C2a5"; const stakingContract = "0x81177472Ce36A9b1AB573804CD215C72cEb76F36"; const photonbusd = "0xEBAa17dA7D5C616441290669E9D2c982c8B1Da25"; //PHOTON-BUSD const treasury = "0x0f90591b01DE6F832e8B8E4ec3525efD423BCaD1"; -const treasuryTokens = [ - [ADDRESSES.bsc.BUSD, false], // BUSD -]; - -async function tvl (timestamp, block, chainBlocks) { - let balances = {}; - await sumTokensAndLPsSharedOwners(balances, treasuryTokens, [treasury], chainBlocks.bsc, "bsc", addr=>`bsc:${addr}`); - return balances; -} module.exports = { - bsc: { - tvl, - staking: stakingUnknownPricedLP(stakingContract, photon, "bsc", photonbusd, addr=>`bsc:${addr}`) - } + bsc: { + tvl: sumTokensExport({ tokens: [ADDRESSES.bsc.BUSD], owner: treasury }), + staking: stakingUnknownPricedLP(stakingContract, photon, "bsc", photonbusd, addr => `bsc:${addr}`) + } } \ No newline at end of file diff --git a/projects/phuture/index.js b/projects/phuture/index.js index 59f633ace7..5fef08de28 100644 --- a/projects/phuture/index.js +++ b/projects/phuture/index.js @@ -71,19 +71,19 @@ const indexTvl = (chain) => async (timestamp, block, chainBlocks) => { const savingsVaultTvl = (chain) => async (api) => { const calls = networks[chain]["savingsVaults"] - const assets = await api.multiCall({ - abi: savingsVaultAbi.asset, calls, - }) - const totalAssets = await api.multiCall({ - abi: savingsVaultAbi.totalAssets, calls, - }) - const balances = {} + const [assets, totalAssets] = await Promise.all([ + api.multiCall({ abi: savingsVaultAbi.asset, calls }), + api.multiCall({ abi: savingsVaultAbi.totalAssets, calls, permitFailure: true }) + ]) - totalAssets.forEach((bal, i) => { - const token = assets[i] - if (!bal && calls[i].toLowerCase() === '0x6bad6a9bcfda3fd60da6834ace5f93b8cfed9598') return; - sdk.util.sumSingleBalance(balances, token, bal, chain) + const balances = {}; + calls.forEach((call, i) => { + const asset = assets[i] + const bal = totalAssets[i] + if(!bal) return; + sdk.util.sumSingleBalance(balances, asset, bal, chain) }) + return balances }; diff --git a/projects/piggy/index.js b/projects/piggy/index.js index de62d6ac68..0045af8317 100644 --- a/projects/piggy/index.js +++ b/projects/piggy/index.js @@ -4,7 +4,7 @@ const TROVE_MANAGER_ADDRESS = "0xb283466d09177c5C6507785d600caFDFa538C65C"; module.exports = { deadFrom: 1648765747, - start: 1623145388, + start: '2021-06-08', bsc: { tvl: getLiquityTvl(TROVE_MANAGER_ADDRESS) }, diff --git a/projects/piggybankdao/index.js b/projects/piggybankdao/index.js index 35ae276032..fa5a36a6a6 100644 --- a/projects/piggybankdao/index.js +++ b/projects/piggybankdao/index.js @@ -1,33 +1,17 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const {sumTokensAndLPsSharedOwners, sumLPWithOnlyOneToken} = require('../helper/unwrapLPs') const { stakingPricedLP } = require('../helper/staking') -const treasury = "0x6687379035822ee15e2164f9C1280fBEAd0D7627"; const PB_TOKEN = "0x0E75CDb914DdCcA683357dD94d26Caa39BC14B16" const LP_TOKEN = "0xd3a6eebbe6f6d9197a7fc2aaaf94d8b0ec51f8a8"; const STAKING_ADDRESS = "0xE4738791690AF507C8C7Bf5981ef541568C7C312" const COREASSETNAME = "magic-internet-money"; const CHAIN = "avax"; -const MIM = "0x130966628846bfd36ff31a822705796e8cb8c18d" - - -async function avaxTvl(time, ethBlock, chainBlocks){ - const balances = {} - const transform = addr => 'avax:'+addr - await sumLPWithOnlyOneToken(balances, "0xd3a6eebbe6f6d9197a7fc2aaaf94d8b0ec51f8a8", treasury, MIM, chainBlocks.avax, "avax", transform) - await sumTokensAndLPsSharedOwners(balances, [ - [MIM, false], - [ADDRESSES.avax.WBTC_e, false] - ], [treasury], chainBlocks.avax, "avax", transform) - return balances -} module.exports={ deadFrom: 1648765747, misrepresentedTokens: true, avax:{ - tvl: avaxTvl, + tvl: () => ({}), staking: stakingPricedLP(STAKING_ADDRESS, PB_TOKEN, CHAIN, LP_TOKEN, COREASSETNAME, true), } } diff --git a/projects/pingu/index.js b/projects/pingu/index.js index a766ef060e..c2ae572bd8 100644 --- a/projects/pingu/index.js +++ b/projects/pingu/index.js @@ -6,7 +6,7 @@ const PINGU = "0x83E60B9F7f4DB5cDb0877659b1740E73c662c55B"; // PINGU const assets = [nullAddress, ADDRESSES.arbitrum.USDC_CIRCLE] // ETH, USDC module.exports = { - start: 1704844800, + start: '2024-01-10', arbitrum: { tvl: sumTokensExport({ owners: [fundStore], tokens: assets }), staking: sumTokensExport({ owners: [fundStore], tokens: [PINGU] }), diff --git a/projects/pionex-cex/index.js b/projects/pionex-cex/index.js new file mode 100644 index 0000000000..6ef048c5df --- /dev/null +++ b/projects/pionex-cex/index.js @@ -0,0 +1,68 @@ +const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +const config = { + ethereum: { + owners: [ + "0xf6d4e5a7c5215f91f59a95065190cca24bf64554", + "0x2a8a276019d3ec549ae657c945ef60aab4e33c9b", + "0xa008dc1281aa6bff98b2c253ee8fd759ba918103", + "0x28410a70acc5f01e4efe892bcc38b70f3bcf014b", + "0x4608fbf5fd78879ba0a75c6c0b0f5e53e188d3e2", + "0x5e483d7803a8b39f0d6792a0431176a91fde6e31", + "0x7175a01564ac4a83dd396e288a2707dee86caf63", + "0x4998cb57364531560f4048213ba9b529ec27f14f", + "0x02104cae462af17739cc4315ef9ac710a9ed22a7", + "0x3c22c17501047d862b3a98e296079966aefd8df7", + "0xbbb72ba600d8493fea284d5fe44919f7b60d53f5", + "0x67be8ce27ef8158d51d8593bb5b26eafacc955d9", + ], + }, + bitcoin: { + owners: bitcoinAddressBook.pionexCex, + }, + tron: { + owners: [ + "TYULGbfdheMSQBv7skFxNbgo7mbNjsWSrF", + "TDr8tDBgYLtrfPmC4erXp7eRgvVNM32EKp", + "TQZPjLBwG8JW7J8LJ3vBbXU6UxAyxH1367", + "TDe3wqxhTSPimeQkJVKNBkCjRnUj839MKj", + "TGMX4ipWLrjqZq7yM4cGVNr124BFrRYtWz", + "TJZj4RS6v6U3HCpTSJ7CwNycRcoi7BREGx", + "TLK8GVBqJNmcyaN5mpSPSzQfTjsSxb7sC9", + "TGgMNPxdyUgdYwMSbMkpTPvaSkrRakKqcK", + "TAA7sxJ259JgstGPjanb5sB6ZJuCPtCobs", + "TKRksVBKDBATKcifm4FXFHcD1FmJQ2bp3x" + ], + }, + solana: { + owners:[ + "DGFW1Effv88XzXkgfgyoFfmefzEU5Pp9zWJACBmCSh8K", + "FXv8hUveo3Di254W5vycvouxrmTJG4oQ5QMm1tLhY3NF" + ] + }, + bsc: { + owners:[ + "0xF6D4E5a7c5215F91f59a95065190CCa24bf64554", + "0x67be8ce27ef8158d51d8593bb5b26eafacc955d9" + ] + }, + optimism:{ + owners: [ + "0xF6D4E5a7c5215F91f59a95065190CCa24bf64554" + ] + }, + arbitrum: { + owners: [ + "0xF6D4E5a7c5215F91f59a95065190CCa24bf64554", + "0x67be8ce27ef8158d51d8593bb5b26eafacc955d9" + ] + }, + avax: { + owners: [ + "0xF6D4E5a7c5215F91f59a95065190CCa24bf64554", + ] + }, +} + +module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/pit/index.js b/projects/pit/index.js new file mode 100644 index 0000000000..dc7bf29106 --- /dev/null +++ b/projects/pit/index.js @@ -0,0 +1,37 @@ +const { sumTokens2, nullAddress } = require('../helper/unwrapLPs') +const { getConfig } = require('../helper/cache') + +async function tvl(api) { + let data = await getConfig('pit/' + api.chain, `https://ydaemon.pit.finance/vaults/all?chainids=${api.chainId}&limit=100000`) + let strategies = data.map(v => v.strategies ?? []).flat().map(v => v.address.toLowerCase()) + let vaults = data.filter(i => i.tvl.tvl > 0).map(v => v.address.toLowerCase()).filter(i => !strategies.includes(i)) + const bals = await api.multiCall({ abi: 'uint256:totalAssets', calls: vaults }) + const calls = [...vaults] + bals.forEach((bal, i) => { + if (+bal === 0) + calls[i] = nullAddress // skip empty vaults + }) + const tokens = await api.multiCall({ abi: 'address:token', calls, permitFailure: true }) + + tokens.forEach((token, i) => { + if (token) + calls[i] = nullAddress // skip vaults that have a token + }) + const tokensAlt = await api.multiCall({ abi: 'address:asset', calls, permitFailure: true }) + bals.forEach((bal, i) => { + const token = tokens[i] || tokensAlt[i] + if (token) api.add(token, bal) + }) + return sumTokens2({ api, resolveLP: true, }) +} + + +module.exports = { + doublecounted: true +} + +const chains = ['sei'] + +chains.forEach(chain => { + module.exports[chain] = { tvl } +}) diff --git a/projects/pixel-swap/index.js b/projects/pixel-swap/index.js new file mode 100644 index 0000000000..291dfbf3e7 --- /dev/null +++ b/projects/pixel-swap/index.js @@ -0,0 +1,14 @@ +const { get } = require('../helper/http') + +async function tvl (api) { + const res = await get("https://api.pixelswap.io/apis/tokens"); + + res.data.tokens.forEach(({ address, tokenBalance }) => { + if (!tokenBalance) return; + api.addTokens(address, tokenBalance) + }) + } + + module.exports = { + ton: { tvl } + }; diff --git a/projects/pixelswap/index.js b/projects/pixelswap/index.js index c193fcdc75..f974b5fa5b 100644 --- a/projects/pixelswap/index.js +++ b/projects/pixelswap/index.js @@ -1,7 +1,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const FACTORY = "0xD07739a9E9C46D3DedeD97c0edC49cea8BAB1Bb9" const ZKSYNC_FACTORY = "0x8435bd22e705DCeFCf6EF8b921E6dB534a4E9902" -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true, }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true,}) module.exports = { misrepresentedTokens: true, @@ -22,7 +22,6 @@ module.exports = { tvl: getUniTVL({ factory: ZKSYNC_FACTORY, useDefaultCoreAssets: true, - fetchBalances: true, }) }, scroll: { diff --git a/projects/pizzax/index.js b/projects/pizzax/index.js index 13dcd1e112..e99bf60085 100644 --- a/projects/pizzax/index.js +++ b/projects/pizzax/index.js @@ -6,7 +6,6 @@ const TOKENS = ["0x488739D593DC2BC13Fd738CBaa35498bad5F8556"] module.exports = { methodology: "PizzaX is a Defi Miners. A fun platform to generate 15%/Day ROI for Lifetime — Pool as a Service (PAAS)", - start: 35011373, bsc: { tvl: sumTokensExport({ tokensAndOwners: [ diff --git a/projects/planar-finance/index.js b/projects/planar-finance/index.js index 85b8755899..f565087795 100644 --- a/projects/planar-finance/index.js +++ b/projects/planar-finance/index.js @@ -2,7 +2,7 @@ const { getUniTVL } = require("../helper/unknownTokens"); module.exports = { misrepresentedTokens: true, - start: 1715328951, + start: '2024-05-10', blast: { tvl: getUniTVL({ factory: '0xdC401B87Ee940F5050f6a17f49763635653eb496', useDefaultCoreAssets: true,}), } diff --git a/projects/planet-green/index.js b/projects/planet-green/index.js index a03e367105..af9a019760 100644 --- a/projects/planet-green/index.js +++ b/projects/planet-green/index.js @@ -1,21 +1,14 @@ -const ADDRESSES = require('../helper/coreAssets.json') const { compoundExports, methodology, } = require("../helper/compound"); const { mergeExports } = require("../helper/utils"); - - const compoundTVL1 = compoundExports( '0xF54f9e7070A1584532572A6F640F09c606bb9A83', - 'bsc', '0x24664791B015659fcb71aB2c9C0d56996462082F', - ADDRESSES.bsc.WBNB ) const compoundTVL2 = compoundExports( '0x1e0C9D09F9995B95Ec4175aaA18b49f49f6165A3', - 'bsc', '0x190354707Ad8221bE30bF5f097fa51C9b1EbdB29', - ADDRESSES.bsc.WBNB ) // node test.js projects/planet-green/index.js diff --git a/projects/plantbaseswap/index.js b/projects/plantbaseswap/index.js index 86bf38a600..390f6a6c65 100644 --- a/projects/plantbaseswap/index.js +++ b/projects/plantbaseswap/index.js @@ -3,7 +3,7 @@ const PLANT = "0x23082Dd85355b51BAe42248C961E7F83486e7694"; const FACTORY = "0xA081Ce40F079A381b59893b4Dc0abf8B1817af70" -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, }) module.exports = { diff --git a/projects/platypus-finance/index.js b/projects/platypus-finance/index.js index cf16de413e..829b2a02dd 100644 --- a/projects/platypus-finance/index.js +++ b/projects/platypus-finance/index.js @@ -15,7 +15,6 @@ const query = `{ async function tvl(api) { if (api.timestamp > +new Date("2023-02-17") / 1e3) blacklistedTokens.push("0xdaCDe03d7Ab4D81fEDdc3a20fAA89aBAc9072CE2") // USP was hacked const { pools } = await cachedGraphQuery("platypus-finance", sdk.graph.modifyEndpoint('Bu5QPRWGnZB6NxU4S7kAKQZJpY4pHmAq3TV69V1W2Qqw'), query) - console.log(pools) const tokensAndOwners = pools.map(i => i.assetsList.map(v => [v.token.id, v.id])).flat() return sumTokens2({ api, tokensAndOwners, blacklistedTokens }); } diff --git a/projects/plenty/index.js b/projects/plenty/index.js index a7b90f1d52..612b82c307 100644 --- a/projects/plenty/index.js +++ b/projects/plenty/index.js @@ -1,20 +1,16 @@ const { sumTokens2, } = require('../helper/chain/tezos') const { getConfig } = require("../helper/cache") -async function tvl() { - return sumTokens2({ owners: await getDexes(), includeTezos: true, }) -} +const API_URL = 'https://config.mainnet.plenty.network/pools' -async function getDexes() { - const data = await getConfig('tezos/plenty', "https://config.mainnet.plenty.network/pools") - return Object.keys(data) +const tvl = async () => { + const data = await getConfig('tezos/plenty', API_URL) + return sumTokens2({ owners: Object.keys(data), includeTezos: true, }) } module.exports = { timetravel: false, misrepresentedTokens: true, - start: 1672531200, - tezos: { - tvl, - }, + start: '2023-01-01', + tezos: { tvl }, } \ No newline at end of file diff --git a/projects/plunderswap-v3/index.js b/projects/plunderswap-v3/index.js new file mode 100644 index 0000000000..6cedf4d7d7 --- /dev/null +++ b/projects/plunderswap-v3/index.js @@ -0,0 +1,14 @@ +const { getConfig } = require('../helper/cache') +const { sumTokens2 } = require('../helper/unwrapLPs') + +async function tvl(api) { + const data = await getConfig('plunderswap', 'https://static.plunderswap.com/PlunderswapPoolPrices.json') + const v3Pairs = data.filter(pair => pair.version === 'V3').map(pair => pair.address) + const token0s = await api.multiCall({ abi: 'address:token0', calls: v3Pairs }) + const token1s = await api.multiCall({ abi: 'address:token1', calls: v3Pairs }) + return sumTokens2({ api, tokensAndOwners2: [token0s.concat(token1s), v3Pairs.concat(v3Pairs)] }) +} + +module.exports = { + zilliqa: { tvl } +} \ No newline at end of file diff --git a/projects/pluto-so/idl.json b/projects/pluto-so/idl.json new file mode 100644 index 0000000000..cb5ca018fb --- /dev/null +++ b/projects/pluto-so/idl.json @@ -0,0 +1,117 @@ +{ + "address": "5UFYdXHgXLMsDzHyv6pQW9zv3fNkRSNqHwhR7UPnkhzy", + "metadata": {"name": "pluto", "version": "0.1.0", "spec": "0.1.0", "description": "Created with Anchor"}, + "instructions": [], + "accounts": [ + {"name": "vaultEarn", "discriminator": [255, 18, 25, 189, 255, 106, 176, 136]}, + {"name": "vaultLeverage", "discriminator": [135, 160, 136, 66, 119, 36, 19, 115]} + ], + "events": [], + "errors": [], + "types": [ + { + "name": "vaultEarn", + "serialization": "bytemuckunsafe", + "repr": {"kind": "c"}, + "type": { + "kind": "struct", + "fields": [ + {"name": "isInitialized", "type": "bool"}, + {"name": "version", "type": "u8"}, + {"name": "bump", "type": "u8"}, + {"name": "align0", "type": {"array": ["u8", 5]}}, + {"name": "protocol", "type": "pubkey"}, + {"name": "earnStats", "type": "pubkey"}, + {"name": "creator", "type": "pubkey"}, + {"name": "authority", "type": "pubkey"}, + {"name": "earnConfig", "type": "pubkey"}, + {"name": "vaultLiquidity", "type": "pubkey"}, + {"name": "priceOracle", "type": "pubkey"}, + {"name": "priceFeed", "type": {"array": ["u8", 64]}}, + {"name": "tokenProgram", "type": "pubkey"}, + {"name": "tokenMint", "type": "pubkey"}, + {"name": "tokenDecimal", "type": "u8"}, + {"name": "align1", "type": {"array": ["u8", 7]}}, + {"name": "lastUpdated", "type": "i64"}, + {"name": "unitSupply", "type": "u128"}, + {"name": "unitBorrowed", "type": "u128"}, + {"name": "unitLent", "type": "u128"}, + {"name": "unitLeverage", "type": "u128"}, + {"name": "index", "type": "u128"}, + {"name": "lastIndexUpdated", "type": "i64"}, + {"name": "apy", "type": {"defined": {"name": "rate"}}}, + {"name": "padding1", "type": {"array": ["u64", 64]}} + ] + } + }, + { + "name": "rate", + "serialization": "bytemuckunsafe", + "repr": {"kind": "c"}, + "type": { + "kind": "struct", + "fields": [ + {"name": "lastUpdated", "type": "i64"}, + {"name": "lastValue", "type": "u32"}, + {"name": "align0", "type": {"array": ["u8", 4]}}, + {"name": "lastEmaHourUpdated", "type": "i64"}, + {"name": "emaHourly", "type": "u32"}, + {"name": "align1", "type": {"array": ["u8", 4]}}, + {"name": "lastEmaDayUpdated", "type": "i64"}, + {"name": "ema3d", "type": "u32"}, + {"name": "ema7d", "type": "u32"}, + {"name": "ema14d", "type": "u32"}, + {"name": "ema30d", "type": "u32"}, + {"name": "ema90d", "type": "u32"}, + {"name": "ema180d", "type": "u32"}, + {"name": "ema365d", "type": "u32"}, + {"name": "align2", "type": {"array": ["u8", 4]}}, + {"name": "padding1", "type": {"array": ["u64", 7]}} + ] + } + }, + { + "name": "vaultLeverage", + "serialization": "bytemuckunsafe", + "repr": {"kind": "c"}, + "type": { + "kind": "struct", + "fields": [ + {"name": "isInitialized", "type": "bool"}, + {"name": "version", "type": "u8"}, + {"name": "bump", "type": "u8"}, + {"name": "align0", "type": {"array": ["u8", 5]}}, + {"name": "protocol", "type": "pubkey"}, + {"name": "leverageStats", "type": "pubkey"}, + {"name": "creator", "type": "pubkey"}, + {"name": "authority", "type": "pubkey"}, + {"name": "leverageConfig", "type": "pubkey"}, + {"name": "borrowVault", "type": "pubkey"}, + {"name": "tokenCollateralPriceOracle", "type": "pubkey"}, + {"name": "tokenCollateralPriceFeed", "type": {"array": ["u8", 64]}}, + {"name": "tokenCollateralTokenProgram", "type": "pubkey"}, + {"name": "tokenCollateralTokenMint", "type": "pubkey"}, + {"name": "tokenCollateralVaultLiquidity", "type": "pubkey"}, + {"name": "tokenCollateralTokenDecimal", "type": "u8"}, + {"name": "align1", "type": {"array": ["u8", 7]}}, + {"name": "nativeCollateralPriceOracle", "type": "pubkey"}, + {"name": "nativeCollateralPriceFeed", "type": {"array": ["u8", 64]}}, + {"name": "nativeCollateralTokenProgram", "type": "pubkey"}, + {"name": "nativeCollateralTokenMint", "type": "pubkey"}, + {"name": "nativeCollateralVaultLiquidity", "type": "pubkey"}, + {"name": "nativeCollateralTokenDecimal", "type": "u8"}, + {"name": "align2", "type": {"array": ["u8", 7]}}, + {"name": "lastUpdated", "type": "i64"}, + {"name": "borrowingUnitSupply", "type": "u128"}, + {"name": "borrowingIndex", "type": "u128"}, + {"name": "unitSupply", "type": "u128"}, + {"name": "index", "type": "u128"}, + {"name": "lastIndexUpdated", "type": "i64"}, + {"name": "borrowingApy", "type": {"defined": {"name": "rate"}}}, + {"name": "apy", "type": {"defined": {"name": "rate"}}}, + {"name": "padding1", "type": {"array": ["u64", 64]}} + ] + } + } + ] +} \ No newline at end of file diff --git a/projects/pluto-so/index.js b/projects/pluto-so/index.js new file mode 100644 index 0000000000..0fa02757e8 --- /dev/null +++ b/projects/pluto-so/index.js @@ -0,0 +1,75 @@ +const { getProvider } = require("../helper/solana"); +const { Program } = require("@coral-xyz/anchor"); +const PlutosoIDL = require("./idl.json"); + +let program + +function getProgram() { + if (!program) { + program = new Program(PlutosoIDL, getProvider()); + } + return program; +} + +async function tvl(api) { + await earnTvl(api) + await leverageTvl(api) +} + +async function borrowed(api) { + return leverageTvl(api, true) +} + +const HNST_VAULT = 'C5uSiUij9P6nWUQBDF8CeJQnYQMeKJWhANRDirGHHD28' + +async function staking(api) { + const pluto = getProgram() + + const earnHnst = await pluto.account.vaultEarn.fetch(HNST_VAULT) + + let unitHnst = earnHnst.unitSupply.toString() / 1e8 + let indexHnst = earnHnst.index.toString() / 1e12 + let amountHnst = unitHnst * indexHnst + + api.add(earnHnst.tokenMint.toString(), amountHnst * (10 ** earnHnst.tokenDecimal)); +} + +async function earnTvl(api) { + const pluto = getProgram() + const vaultData = await pluto.account.vaultEarn.all() + vaultData.forEach(({ publicKey, account }) => { + if (publicKey.toString() === HNST_VAULT) return; + let unit = (account.unitSupply.toNumber() - account.unitBorrowed.toNumber()) / 1e8 + let index = account.index.toString() / 1e12 + let amount = unit * index + api.add(account.tokenMint.toString(), amount * (10 ** account.tokenDecimal)); + }) +} + +async function leverageTvl(api, isBorrow = false) { + const pluto = getProgram() + const vaultData = await pluto.account.vaultLeverage.all() + vaultData.forEach(({ account }) => { + if (isBorrow) { + let unit = account.borrowingUnitSupply.toString() / 1e8 + let index = account.borrowingIndex.toString() / 1e12 + let amount = unit * index + api.add(account.tokenCollateralTokenMint.toString(), amount * (10 ** account.tokenCollateralTokenDecimal)); + } else { + let unit = account.unitSupply.toString() / 1e8 + let index = account.index.toString() / 1e12 + let amount = unit * index + api.add(account.nativeCollateralTokenMint.toString(), amount * (10 ** account.nativeCollateralTokenDecimal)); + } + }) +} + +module.exports = { + timetravel: false, + methodology: "The Total Value Locked (TVL) is calculated as the sum of leveraged position assets and the available assets deposited in Earn Vaults.", + solana: { + staking, + tvl, + // borrowed, + }, +}; diff --git a/projects/pocm-staking/index.js b/projects/pocm-staking/index.js index cc5ff2e551..5203531f7d 100644 --- a/projects/pocm-staking/index.js +++ b/projects/pocm-staking/index.js @@ -1,12 +1,15 @@ const http = require("../helper/http"); async function staking() { + const data = (await http.get("https://pocm.nuls.io/api/pocm/info")).data; return { - 'nuls': Number((await http.get("https://pocm.nuls.io/api/pocm/info")).data.totalStaking).toFixed(0) + 'nuls': Number(data.totalStaking).toFixed(0), + 'bitcoin': Number(data.totalStakingBTC).toFixed(8) }; } module.exports = { + doublecounted: true, timetravel: false, nuls: { tvl: async ()=> ({}), diff --git a/projects/polter/index.js b/projects/polter/index.js index ccd8038611..50d421564c 100644 --- a/projects/polter/index.js +++ b/projects/polter/index.js @@ -1,12 +1,28 @@ const { aaveV2Export } = require('../helper/aave') const { sumTokensExport } = require("../helper/unknownTokens") -const POLTER_CONTRACT = '0x5c725631FD299703D0A74C23F89a55c6B9A0C52F' -const MULTIFEE_CONTRACT = '0xb0F8fe472422Ae582a535b5418C82Ff0F9fa9267' -const POLTER_LP_CONTRACT = '0x44C85D45EB17C8A6b241807BE5c9c48201F91837' +const fantom = { + POLTER_CONTRACT: '0x5c725631FD299703D0A74C23F89a55c6B9A0C52F', + MULTIFEE_CONTRACT: '0xb0F8fe472422Ae582a535b5418C82Ff0F9fa9267', + POLTER_LP_CONTRACT: '0x44C85D45EB17C8A6b241807BE5c9c48201F91837', + POLTER_LENDINGPOOL_CONTRACT: '0x867fAa51b3A437B4E2e699945590Ef4f2be2a6d5' +} + +const base = { + POLTER_CONTRACT: '0xA0820613976B441E2c6A90E4877E2fb5f7D72552', + MULTIFEE_CONTRACT: '0x0B7B45A920Ae54f066b6c013fEdF27C37840dE38', + POLTER_LP_CONTRACT: '0xee7ef14845c466b30f7f4a41f5491df8824cb64e', + POLTER_LENDINGPOOL_CONTRACT: '0x33CA62504cebAB919f0FCa94562413ee121A9798' +} + module.exports = { - fantom: aaveV2Export('0x867fAa51b3A437B4E2e699945590Ef4f2be2a6d5'), + hallmarks: [ + [1731715200,"Price Oracle Exploit"] + ], + fantom: aaveV2Export(fantom.POLTER_LENDINGPOOL_CONTRACT), + base: aaveV2Export(base.POLTER_LENDINGPOOL_CONTRACT), } -module.exports.fantom.staking = sumTokensExport({ owner: MULTIFEE_CONTRACT, tokens: [POLTER_CONTRACT], lps: [POLTER_LP_CONTRACT], useDefaultCoreAssets: true, }) \ No newline at end of file +module.exports.fantom.staking = sumTokensExport({ owner: fantom.MULTIFEE_CONTRACT, tokens: [fantom.POLTER_CONTRACT], lps: [fantom.POLTER_LP_CONTRACT], useDefaultCoreAssets: true, }) +module.exports.base.staking = sumTokensExport({ owner: base.MULTIFEE_CONTRACT, tokens: [base.POLTER_CONTRACT], lps: [base.POLTER_LP_CONTRACT], useDefaultCoreAssets: true, }) diff --git a/projects/polygon/index.js b/projects/polygon/index.js index 4af516fc7f..51ec3af37d 100644 --- a/projects/polygon/index.js +++ b/projects/polygon/index.js @@ -90,7 +90,7 @@ async function tvl(_, block, _c) { } module.exports = { - start: 1590824836, // Sat May 30 13:17:16 2020 + start: '2020-05-30', // Sat May 30 13:17:16 2020 polygon: { tvl } diff --git a/projects/polylend/index.js b/projects/polylend/index.js index 9ba41447cc..6244eecce6 100644 --- a/projects/polylend/index.js +++ b/projects/polylend/index.js @@ -1,7 +1,10 @@ const { aaveExports } = require("../helper/aave"); module.exports = { + deadFrom: '2023-11-23', polygon_zkevm: aaveExports("polygon_zkevm", undefined, undefined, [ "0x27268393Fb8CD0556A62C749C9E70aA537910acc", ]), }; + +module.exports.polygon_zkevm.borrowed = () => ({}) // bad debt diff --git a/projects/polynetwork/index.js b/projects/polynetwork/index.js index 17c1ddff42..ec5b0ff631 100644 --- a/projects/polynetwork/index.js +++ b/projects/polynetwork/index.js @@ -21,7 +21,7 @@ const blockchainEndpoints = { okexchain: 'getTVLOKC', neo3: 'getTVLNeo3', polygon: 'getTVLPolygon', - palette: 'getTVLPalette', + //palette: 'getTVLPalette', arbitrum: 'getTVLArbitrum', xdai: 'getTVLGnosisChain', zilliqa: 'getTVLZilliqa', diff --git a/projects/polynomial-bridge/index.js b/projects/polynomial-bridge/index.js new file mode 100644 index 0000000000..0823b48f2d --- /dev/null +++ b/projects/polynomial-bridge/index.js @@ -0,0 +1,48 @@ +const { sumTokens2, nullAddress } = require("../helper/unwrapLPs"); +const ADDRESSES = require('../helper/coreAssets.json') + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + "0xDE1617Ddb7C8A250A409D986930001985cfad76F", // usdc vault + ADDRESSES.polynomial.SDAI, // sdai vault + "0xC6cfb996A7CFEB89813A68CD13942CD75553032b", // susde vault + "0x034cbb620d1e0e4C2E29845229bEAc57083b04eC" // eth bridge + ], + tokens: [ADDRESSES.ethereum.USDC, ADDRESSES.ethereum.SDAI, ADDRESSES.ethereum.sUSDe, nullAddress], + }), + }, + optimism: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + "0xc374967634133F5Ed1DF5050276e5B33986625D3", // usdc vault + ], + tokens: [ADDRESSES.optimism.USDC_CIRCLE], + }), + }, + base: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + "0x038bc0f438C6b46FaCc5C83475925F4Dc111d79F", // usdc vault + ], + tokens: [ADDRESSES.base.USDC], + }), + }, + arbitrum: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + ADDRESSES.polynomial.SDAI, // usdc vault + ], + tokens: [ADDRESSES.arbitrum.USDC_CIRCLE], + }), + }, +}; diff --git a/projects/polynomial-liquidity-layer/index.js b/projects/polynomial-liquidity-layer/index.js new file mode 100644 index 0000000000..50c406bcf8 --- /dev/null +++ b/projects/polynomial-liquidity-layer/index.js @@ -0,0 +1,9 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs') + + +module.exports = { + polynomial: { + tvl: sumTokensExport({ owner: '0xc133983D6d9140923b5eaE52664221d9099cf119', tokens: [ADDRESSES.polynomial.fxUSDC,ADDRESSES.polynomial.SDAI, ADDRESSES.polynomial.sUSDe, ADDRESSES.polynomial.USD0]}) + } +} \ No newline at end of file diff --git a/projects/polynomial-trade/index.js b/projects/polynomial-trade/index.js index 31dfb2e3a1..14eae14d24 100644 --- a/projects/polynomial-trade/index.js +++ b/projects/polynomial-trade/index.js @@ -4,18 +4,31 @@ const { get } = require('../helper/http'); // api const BASE_URL = "https://perps-v2-mainnet.polynomial.fi/snx-perps/tvl"; -async function tvl (timestamp, ethBlock) { +const BASE_URL_POLYNOMIAL_CHAIN = "https://perps-api-mainnet.polynomial.finance/core/portfolio/tvl"; + +async function tvl_optimism_chain (timestamp, ethBlock) { const perpApi = await get(BASE_URL); return { [`ethereum:${ADDRESSES.ethereum.sUSD}`]: perpApi.tvl * 1e18 }; } +async function tvl_polynomial_chain(timestamp, ethBlock) { + const perpApi = await get(BASE_URL_POLYNOMIAL_CHAIN); + return { + [`ethereum:${ADDRESSES.ethereum.USDC}`]: perpApi.tvl * 1e6 + }; +} + module.exports = { optimism: { - tvl + tvl:tvl_optimism_chain + }, + polynomial: { + tvl: tvl_polynomial_chain }, hallmarks:[ - [1679918400, "Trade Launch"] + [1679918400, "Trade Launch"], + [1724248800, "Polynomial Trade Launch"] ] } \ No newline at end of file diff --git a/projects/polyo-exchange/index.js b/projects/polyo-exchange/index.js index 3d98b3c4fc..88ef0ce628 100644 --- a/projects/polyo-exchange/index.js +++ b/projects/polyo-exchange/index.js @@ -1,5 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokens2 } = require('../helper/unwrapLPs') +const { sumTokens2 } = require('../helper/unwrapLPs'); +const { deadFrom } = require('../mosquitos-finance'); // polyo Asset Address const Asset_P01_BUSD = "0xC72e6f8041183EaD6f85839bD463F7aD0f14A40D"; @@ -31,5 +32,6 @@ module.exports = { }, hallmarks: [ [1662842254, "Rug pull"], - ] + ], + deadFrom: 1662842254 }; diff --git a/projects/polytrade/index.js b/projects/polytrade/index.js index a9701231e6..1f335e9916 100644 --- a/projects/polytrade/index.js +++ b/projects/polytrade/index.js @@ -5,7 +5,7 @@ const chain = 'polygon' module.exports = { methodology: 'gets the amount in liquidity pool', - start: 1657074185, + start: '2022-07-06', polygon: { tvl: async (_,_b , {polygon: block}) => { const strategy = await sdk.api2.abi.call({ diff --git a/projects/ponyswap/index.js b/projects/ponyswap/index.js index a7edc1e19a..f887d0f8c9 100644 --- a/projects/ponyswap/index.js +++ b/projects/ponyswap/index.js @@ -1,6 +1,6 @@ const { uniTvlExport } = require("../helper/calculateUniTvl"); module.exports = { - start: 1678790700, + start: '2023-03-14', arbitrum: { tvl: uniTvlExport("0x66020547Ce3c861dec7632495D86e1b93dA6542c", "arbitrum", true), }, diff --git a/projects/pooltogether-v5/index.js b/projects/pooltogether-v5/index.js index 879280fd6d..914ca37adf 100644 --- a/projects/pooltogether-v5/index.js +++ b/projects/pooltogether-v5/index.js @@ -1,6 +1,6 @@ const { tvl } = require('../pooltogether/v5.js') -const chains = ['optimism', 'base', 'arbitrum'] +const chains = ['optimism', 'base', 'arbitrum', 'ethereum', 'scroll', 'xdai'] module.exports = { doublecounted: true, diff --git a/projects/pooltogether/index.js b/projects/pooltogether/index.js index a85f118868..8762e66ea9 100644 --- a/projects/pooltogether/index.js +++ b/projects/pooltogether/index.js @@ -6,9 +6,9 @@ module.exports = { doublecounted: true, hallmarks: [ [1_634_320_800, 'V4 Launch'], - [1_658_872_800, 'V4 OP Rewards Begin'], - [1_669_615_200, 'V4 OP Rewards Extended'], - [1_697_738_400, 'V5 Launch'] + [1_693_453_300, 'V5 Beta Launch'], + [1_697_738_400, 'V5 Canary Launch'], + [1_713_399_300, 'V5 Launch'] ], methodology: `TVL is the total tokens deposited in PoolTogether` } diff --git a/projects/pooltogether/v5.js b/projects/pooltogether/v5.js index b69a502a81..514d2c3765 100644 --- a/projects/pooltogether/v5.js +++ b/projects/pooltogether/v5.js @@ -2,9 +2,21 @@ const abi = require('./abi.json') const { sumTokens2 } = require('../helper/unwrapLPs') const V5_VAULT_FACTORIES = { - optimism: ['0xF65FA202907D6046D1eF33C521889B54BdE08081', '0x6B17EE3a95BcCd605340454c5919e693Ef8EfF0E', '0xF0F151494658baE060034c8f4f199F74910ea806', '0x0C379e9b71ba7079084aDa0D1c1Aeb85d24dFD39'], - base: ['0xE32F6344875494ca3643198d87524519Dc396DDf'], - arbitrum: ['0x44Be003E55e7cE8a2e0ECC3266f8a9A9de2c07BC'] + optimism: ['0xF65FA202907D6046D1eF33C521889B54BdE08081', '0x6B17EE3a95BcCd605340454c5919e693Ef8EfF0E', '0xF0F151494658baE060034c8f4f199F74910ea806', '0x0C379e9b71ba7079084aDa0D1c1Aeb85d24dFD39', '0xec9f59bd06465b105e719c0b0483a4ed6a656775'], + base: ['0xE32F6344875494ca3643198d87524519Dc396DDf', '0xa55a74A457D8a24D68DdA0b5d1E0341746d444Bf'], + arbitrum: ['0x44Be003E55e7cE8a2e0ECC3266f8a9A9de2c07BC', '0x8020Fb37b21E0eF1707aDa7A914baf44F9045E52'], + ethereum: ['0x29c102109D6cb2D866CFEc380E0E10E9a287A75f', '0xd499CcF3e93F4cfb335Ac388E3C896D59cdDe7c3'], + scroll: ['0x3fdd8bFdF2F589c10C58457CDAE989C7943A30A5'], + xdai: ['0xc3aE3FE36A2645a93b2Fe350D81E80A14831e2A6'] +} + +const V5_NON_FACTORY_VAULTS = { + optimism: ['0xa52e38a9147f5ea9e0c5547376c21c9e3f3e5e1f'], + base: [], + arbitrum: [], + ethereum: [], + scroll: [], + xdai: [] } async function tvl(api) { @@ -15,6 +27,7 @@ async function tvl(api) { const _vaults = await api.fetchList({ lengthAbi: abi.totalVaults, itemAbi: abi.allVaults, target: factory }) vaults.push(..._vaults) } + vaults.push(...V5_NON_FACTORY_VAULTS[api.chain]) const tokens = await api.multiCall({ abi: abi.asset, calls: vaults }) const bals = await api.multiCall({ abi: abi.totalAssets, calls: vaults }) api.addTokens(tokens, bals) diff --git a/projects/popcorn/index.js b/projects/popcorn/index.js index ea9224672b..29eefa6808 100644 --- a/projects/popcorn/index.js +++ b/projects/popcorn/index.js @@ -2,7 +2,7 @@ const sdk = require('@defillama/sdk'); const { getConfig } = require('../helper/cache') const { addFraxVaultToTVL } = require("./fraxVault"); -const { staking } = require("../helper/staking"); +const { stakings } = require("../helper/staking"); const { sumTokens2 } = require('../helper/unwrapLPs'); const getVaultsAbi = 'address[]:getRegisteredAddresses'; @@ -16,16 +16,22 @@ const fraxLockVaultsNotRegistered = [ "0x1F0a3bF1e4Ea8f27449AFa0a3A27eFc3817431fc", "0xDc5Ed7b972710594082479AF498B1dA02d03a273", ]; + async function tvl(api) { let balances = {}; - const data = await getConfig('popcorn/' + api.chain, `https://raw.githubusercontent.com/Popcorn-Limited/defi-db/main/archive/vaults/${api.getChainId()}.json`); + const data = await getConfig('popcorn/' + api.chain, `https://raw.githubusercontent.com/Popcorn-Limited/defi-db/main/vaults/${api.getChainId()}.json`); let vaultAddresses = Object.keys(data); + if (api.chain === "arbitrum") { let fraxLockVaults = await api.call({ target: "0x25172C73958064f9ABc757ffc63EB859D7dc2219", abi: getVaultsAbi }); fraxLockVaults = fraxLockVaults.concat(fraxLockVaultsNotRegistered); vaultAddresses = vaultAddresses.filter((address) => !fraxLockVaults.includes(address)); await addFraxVaultToTVL(balances, api); } + + if (api.chain === 'ethereum') + vaultAddresses = vaultAddresses.filter(i => !['0xcF9273BA04b875F94E4A9D8914bbD6b3C1f08EDb'].includes(i)) + const assets = await api.multiCall({ abi: getAssetAbi, calls: vaultAddresses, }); const totalAssets = await api.multiCall({ abi: getTotalAssets, calls: vaultAddresses, }); @@ -36,11 +42,12 @@ async function tvl(api) { const veVCX = "0x0aB4bC35Ef33089B9082Ca7BB8657D7c4E819a1A"; const WETH_VCX_BAL_LP_TOKEN = "0x577A7f7EE659Aa14Dc16FD384B3F8078E23F1920"; +const stVCX = "0xE5d383FC43F6c370DdD3975cf9e363Ad42367697"; +const VCX = "0xce246eea10988c495b4a90a905ee9237a0f91543"; module.exports = { ethereum: { - start: 12237585, - staking: staking(veVCX, WETH_VCX_BAL_LP_TOKEN), + staking: stakings([stVCX, veVCX], [VCX, WETH_VCX_BAL_LP_TOKEN]), tvl, }, bsc: { tvl, }, diff --git a/projects/poseidollar/index.js b/projects/poseidollar/index.js index 900db73c08..4304969b4d 100644 --- a/projects/poseidollar/index.js +++ b/projects/poseidollar/index.js @@ -93,8 +93,8 @@ async function suiTVL(api) { "0x3cfad71fc1f65addbadc0d4056fbd1106aa6b9a219e3ea1f5356a2f500d13182" ); - //TVL on PSH Earn - for (let i = 0; i < poolShareInfo.length; i++) { + //TVL on PSH Earn - ignoring pool 0, it is returning absurd value + for (let i = 1; i < poolShareInfo.length; i++) { api.add(poolShareInfo[i].coinX, poolShareInfo[i].coinXStaked) if (poolShareInfo[i].coinY) diff --git a/projects/powerindex/index.js b/projects/powerindex/index.js index 124247dac2..faa31c0c47 100644 --- a/projects/powerindex/index.js +++ b/projects/powerindex/index.js @@ -45,7 +45,7 @@ async function eth(api) { } module.exports = { - start: 1606768668, // 11/30/2021 @ 08:37am (UTC) + start: '2020-11-30', // 11/30/2021 @ 08:37am (UTC) bsc:{ tvl: getBscTvl, }, diff --git a/projects/powpeg/index.js b/projects/powpeg/index.js new file mode 100644 index 0000000000..e15c669a63 --- /dev/null +++ b/projects/powpeg/index.js @@ -0,0 +1,8 @@ +const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs') + +module.exports = { + rsk: { + // Powpeg (flyover) fast mod protocol + tvl: sumTokensExport({ owner: '0xAa9caf1e3967600578727f975F283446a3dA6612', tokens: [nullAddress] }) + } +} \ No newline at end of file diff --git a/projects/prdt/index.js b/projects/prdt/index.js index e7100be91e..14134bd4ef 100644 --- a/projects/prdt/index.js +++ b/projects/prdt/index.js @@ -1,5 +1,7 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensExport, } = require("../helper/unwrapLPs"); +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokensExport } = require("../helper/unwrapLPs"); +const { sumTokensExport: solExports } = require("../helper/solana"); + const config = { ethereum: { @@ -14,7 +16,11 @@ const config = { predictionPROV2: "0x062EB9830D1f1f0C64ac598eC7921f0cbD6d4841", predictionPROV3: "0xe2ca0a434effea151d5b2c649b754acd3c8a20f0", }), - tokens: [ADDRESSES.null, ADDRESSES.arbitrum.USDT, ADDRESSES.arbitrum.USDC_CIRCLE], + tokens: [ + ADDRESSES.null, + ADDRESSES.arbitrum.USDT, + ADDRESSES.arbitrum.USDC_CIRCLE, + ], }, bsc: { owners: Object.values({ @@ -26,7 +32,12 @@ const config = { predictionclassicV3: "0x00199E444155f6a06d74CF36315419d39b874f5c", predictionPROV3: "0x49eFb44831aD88A9cFFB183d48C0c60bF4028da8", }), - tokens: [ADDRESSES.null, ADDRESSES.bsc.USDT, ADDRESSES.bsc.USDC, ADDRESSES.bsc.ETH], + tokens: [ + ADDRESSES.null, + ADDRESSES.bsc.USDT, + ADDRESSES.bsc.USDC, + ADDRESSES.bsc.ETH, + ], }, polygon: { owners: Object.values({ @@ -37,11 +48,21 @@ const config = { predictionclassicv3: "0x9f9564BE7b566dfE4B091a83a591752102aF3F33", predictionPROV3: "0x0b9c8c0a04354f41b985c10daf7db30bc66998f5", }), - tokens: [ADDRESSES.null, ADDRESSES.polygon.USDT, ADDRESSES.polygon.USDC_CIRCLE, ADDRESSES.polygon.WETH], + tokens: [ + ADDRESSES.null, + ADDRESSES.polygon.USDT, + ADDRESSES.polygon.USDC_CIRCLE, + ADDRESSES.polygon.WETH, + ], }, + solana: {}, }; +Object.keys(config).forEach((chain) => { + module.exports[chain] = { tvl: sumTokensExport(config[chain]) }; +}); -Object.keys(config).forEach(chain => { - module.exports[chain] = { tvl: sumTokensExport(config[chain]) } -}) +const solOwners = ["CcccPbvfmpNE5q4JFS5qU3mszP8obUy5Fp2BQ6Hm9Mnp"] +module.exports.solana = { + tvl: solExports({ owners: solOwners, solOwners }) +} \ No newline at end of file diff --git a/projects/predict-fun/index.js b/projects/predict-fun/index.js new file mode 100644 index 0000000000..a4d1d1f4d8 --- /dev/null +++ b/projects/predict-fun/index.js @@ -0,0 +1,12 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/unwrapLPs'); + +module.exports = { + blast: { + tvl: sumTokensExport({ owners: [ + '0xE1A2E68C401378050fdba9704FA8BCb1f72b98f4', + '0x8F9C9f888A4268Ab0E2DDa03A291769479bAc285' + ], tokens: [ADDRESSES.blast.USDB]}) + }, + methodology: `TVL is the total quantity of USDB held in the conditional tokens contract as well as USDB collateral submitted to every predict.fun market ever opened - once the markets resolve, participants are able to withdraw their share given the redemption rate and their input stake.` +} diff --git a/projects/predx/index.js b/projects/predx/index.js index cde2245fe8..3233e6c110 100644 --- a/projects/predx/index.js +++ b/projects/predx/index.js @@ -4,13 +4,13 @@ const { sumTokensExport } = require('../helper/unwrapLPs') module.exports = { zklink: { tvl: sumTokensExport({ - owners: ["0x986Ca3A4F05AA7EA5733d81Da6649043f43cB9A8"], + owners: ["0x21855483F45ab1801CbE4248b9a2F178320c444B"], tokens: [ADDRESSES.zklink.USDT] }), }, base: { tvl: sumTokensExport({ - owners: ["0xa6368fd44e699f6bca2ab3a02C44beFCA7257cF4"], + owners: ["0x10dE7F398C76341B5a5C33693C930609863F692C"], tokens: [ADDRESSES.base.USDC] }), }, @@ -22,26 +22,26 @@ module.exports = { }, linea: { tvl: sumTokensExport({ - owners: ["0xF9AD26Bb325f4C82F26bF2549b65e6f9a4a04a78"], + owners: ["0x3F8D22db689A9c6F0560baCE255cdD854Ab84Ca5"], tokens: [ADDRESSES.linea.USDC] }), }, bsc: { tvl: sumTokensExport({ - owners: ["0x38Db024F8EA400A57c15C25D1DC46aE868C08a2F"], + owners: ["0x2e8c67E73883e787A164cD9FeA592d0AcDbC61D4"], tokens: [ADDRESSES.bsc.USDT] }), }, mantle: { tvl: sumTokensExport({ - owners: ["0x38Db024F8EA400A57c15C25D1DC46aE868C08a2F"], + owners: ["0x8D2DB5B86b7C079FF8F7190D788766EeB789F104"], tokens: [ADDRESSES.mantle.USDC] }), }, btr: { tvl: sumTokensExport({ - owners: ["0x92CdC3a149A6bc3f39136eF4A94292cDC2Cc4b9b"], - tokens: ["0x9827431e8b77e87c9894bd50b055d6be56be0030"] + owners: ["0x8E4fb0169aECB4768220d97aA1D0106322716678"], + tokens: ["0xf8C374CE88A3BE3d374e8888349C7768B607c755"] }), }, } diff --git a/projects/preon/index.js b/projects/preon/index.js index 98fa079306..44425b980c 100644 --- a/projects/preon/index.js +++ b/projects/preon/index.js @@ -1,3 +1,4 @@ +//preon const ADDRESSES = require('../helper/coreAssets.json') const { sumTokens2 } = require("../helper/unwrapLPs"); @@ -16,6 +17,11 @@ const config = { [["0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE"], "0xdc4552609a3f673f0b72958f678d4a48d0e94ebd"], // aPolDAI ], }, + base: { + ownerTokens: [ + [[ADDRESSES.base.WETH], "0xEfaA597277Ce531e52018d42224aB579Bbe31a04"], // aeroAMO + ], + }, }; const extraConfig = { @@ -48,12 +54,25 @@ async function customTvl(api) { } } +async function baseTvl(api) { + const aeroAMO = '0xEfaA597277Ce531e52018d42224aB579Bbe31a04' + const [amountWeth, _amountOETH] = await api.call({ + abi: 'function getPositionPrincipal() view returns (uint256, uint256)', + target: aeroAMO + }) + api.add(ADDRESSES.base.USDC, amountWeth) + return api.getBalances() +} + async function tvl(api) { + if (api.chain === 'base') { + return baseTvl(api) + } await Promise.all([tokenTvl, customTvl].map((fn) => fn(api))); } module.exports = { - methodology: "Adds up the total value locked as collateral on the Preon Finance", + methodology: "Adds up the total value locked as collateral, as well as the AMO positions on Preon Finance", }; Object.keys(config).forEach((chain) => { diff --git a/projects/prime-staked/index.js b/projects/prime-staked/index.js index 9e35749857..0fffd6deec 100644 --- a/projects/prime-staked/index.js +++ b/projects/prime-staked/index.js @@ -12,7 +12,6 @@ module.exports = { doublecounted: true, methodology: "Returns the total assets owned by primeETH", - start: 19128047, ethereum: { tvl, }, diff --git a/projects/primestaking-xyz/index.js b/projects/primestaking-xyz/index.js new file mode 100644 index 0000000000..5511d341e5 --- /dev/null +++ b/projects/primestaking-xyz/index.js @@ -0,0 +1,10 @@ +const xdcStakeRewardTokenAddress = '0x7f115F68A789F819047b94EFA0114AA9829b83d8' + +const tvl = async (api) => { + const totalSupply = await api.call({ abi: 'erc20:totalSupply', target: xdcStakeRewardTokenAddress, }) + api.addGasToken(totalSupply) +} + +module.exports = { + xdc: { tvl } +} \ No newline at end of file diff --git a/projects/primex-finance/index.js b/projects/primex-finance/index.js index 78d3fb750c..2065b18db1 100644 --- a/projects/primex-finance/index.js +++ b/projects/primex-finance/index.js @@ -5,6 +5,7 @@ const { abi } = require('./abi') const config = { polygon: { bucketsFactory: '0x7E6915D307F434E4171cCee90e180f5021c60089', + bucketsFactoryv2: '0x9649CfDCfAa9c80907e63dD9Cb161cBA2033F3A0', positionManager: '0x02bcaA4633E466d151b34112608f60A82a4F6035', traderBalanceVault: '0x0801896C67CF024606BcC92bd788d6Eb077CC74F', defaultTokens: { @@ -30,7 +31,13 @@ const config = { GHST: "0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7", AVAX: "0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b", CRV: "0x172370d5cd63279efa6d502dab29171933a610af", - SUSHI: "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a" + SUSHI: "0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a", + SOL: "0x7dff46370e9ea5f0bad3c4e29711ad50062ea7a4", + PAXG: "0x553d3d295e0f695b9228246232edf400ed3560b5", + WSTETH: ADDRESSES.polygon.WSTETH, + LDO: "0xC3C7d422809852031b44ab29EEC9F1EfF2A58756", + FRAX: ADDRESSES.polygon.FRAX, + FXS: "0x1a3acf6d19267e2d3e7f898f42803e90c9219062" }, aaveTokens: { [ADDRESSES.polygon.WETH_1]: "0xe50fA9b3c56FfB159cB0FCA61F5c9D750e8128c8", @@ -42,6 +49,7 @@ const config = { }, arbitrum: { bucketsFactory: '0x4e6f7372bCE4083c779c17B240A94dc2EA57AE67', + bucketsFactoryv2: '0xB4d3A9f10D3D687FaF3b05b9aa3054856A1d7be8', positionManager: '0x86890E30cE9E1e13Db5560BbEb435c55567Af1cd', traderBalanceVault: '0xc08FFBBA8c5f42beb7e6dd29142cC61855a3076B', defaultTokens: { @@ -72,6 +80,20 @@ const config = { FXS: "0x9d2F299715D94d8A7E6F5eaa8E654E8c74a988A7", TIA: "0xD56734d7f9979dD94FAE3d67C7e928234e71cD4C", RPL: "0xB766039cc6DB368759C1E56B79AFfE831d0Cc507", + AAVE: "0xba5DdD1f9d7F570dc94a51479a000E3BCE967196", + WSTETH: ADDRESSES.arbitrum.WSTETH, + RETH: "0xEC70Dcb4A1EFa46b8F2D97C310C9c4790ba5ffA8", + WEETH: "0x35751007a407ca6feffe80b3cb397736d2cf4dbe", + ETHFI: "0x7189fb5B6504bbfF6a852B13B7B82a3c118fDc27", + EZETH: ADDRESSES.optimism.ezETH, + RSETH: "0x4186bfc76e2e237523cbc30fd220fe055156b41f", + USDE: ADDRESSES.arbitrum.USDe, + CBETH: "0x1debd73e752beaf79865fd6446b0c970eae7732f", + USDY: "0x35e050d3C0eC2d29D269a8EcEa763a183bDF9A9D", + TBTC: "0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40", + FRAX: ADDRESSES.arbitrum.FRAX, + FRXETH: "0x178412e79c25968a32e89b11f63b33f733770c2a", + SFRXETH: "0x95ab45875cffdba1e5f451b950bc2e42c0053f39" }, aaveTokens: { [ADDRESSES.arbitrum.DAI]: "0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE", @@ -84,6 +106,7 @@ const config = { }, ethereum: { bucketsFactory: '0x7dE8607157124c894Ba9F18dd6138B5E8AAd5890', + bucketsFactoryv2: '0x55120da310A0c5fd81Fd3bb8C177F6649bE30ACc', positionManager: '0x99d63fEA4b3Ef6ca77941df3C5740dAd1586f0B8', traderBalanceVault: '0x156e2fC8e1906507412BEeEB6640Bf999a1Ea76b', defaultTokens: { @@ -103,7 +126,30 @@ const config = { COMP: "0xc00e94cb662c3520282e6f5717214004a7f26888", CRV: ADDRESSES.ethereum.CRV, ['1INCH']: '0x111111111117dC0aa78b770fA6A738034120C302', - EPMX: "0xA533f744B179F2431f5395978e391107DC76e103" + EPMX: "0xA533f744B179F2431f5395978e391107DC76e103", + POL: "0x455e53cbb86018ac2b8092fdcd39d8444affc3f6", + PAXG: "0x45804880de22913dafe09f4980848ece6ecbaf78", + WSTETH: ADDRESSES.ethereum.WSTETH, + RETH: ADDRESSES.ethereum.RETH, + SDAI: ADDRESSES.ethereum.SDAI, + WEETH: "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + ETHFI: "0xfe0c30065b384f05761f15d0cc899d4f9f9cc0eb", + LDO: ADDRESSES.ethereum.LIDO, + EZETH: "0xbf5495efe5db9ce00f80364c8b423567e58d2110", + RSETH: "0xa1290d69c65a6fe4df752f95823fae25cb99e5a7", + RSWETH: "0xfae103dc9cf190ed75350761e95403b7b8afa6c0", + USDE: ADDRESSES.ethereum.USDe, + SUSDE: ADDRESSES.ethereum.sUSDe, + PUFETH: "0xd9a442856c234a39a81a089c06451ebaa4306a72", + CDETH: ADDRESSES.ethereum.cbETH, + USDP: "0x8e870d67f660d95d5be530380d0ec0bd388289e1", + PYUSD: "0x6c3ea9036406852006290770bedfcaba0e23a0e8", + ONDO: "0xfaba6f8e4a5e8ab82f62fe7c39859fa577269be3", + TBTC: ADDRESSES.ethereum.tBTC, + FRAX: ADDRESSES.ethereum.FRAX, + FXS: ADDRESSES.ethereum.FXS, + FRXETH: "0x5e8422345238f34275888049021821e8e08caa1f", + SFRXETH: ADDRESSES.ethereum.sfrxETH }, aaveTokens: { [ADDRESSES.ethereum.WETH]: "0x4d5F47FA6A74757f35C14fD3a6Ef8E3C9BC514E8", @@ -120,19 +166,25 @@ const config = { module.exports = {} Object.keys(config).forEach(chain => { - const { bucketsFactory, positionManager, traderBalanceVault, defaultTokens, aaveTokens } = config[chain] + const { bucketsFactory, bucketsFactoryv2, positionManager, traderBalanceVault, defaultTokens, aaveTokens } = config[chain] module.exports[chain] = { tvl: async (api) => { const buckets = await api.call({ target: bucketsFactory, abi: abi.allBuckets }) const borrowedTokensAddresses = await api.multiCall({ abi: abi.borrowedAsset, calls: buckets }) + const bucketsv2 = await api.call({ target: bucketsFactoryv2, abi: abi.allBuckets }) + const borrowedTokensAddressesv2 = await api.multiCall({ abi: abi.borrowedAsset, calls: bucketsv2 }) + const tokensAndOwnersBucketsv2 = bucketsv2.map((b, i) => [borrowedTokensAddressesv2[i], b]) + const aTokensAndOwnersBucketsv2 = bucketsv2.map((b, i) => [aaveTokens[borrowedTokensAddressesv2[i].toLowerCase()], b]).filter((p) => p[0]) + const tokensAndOwnersBuckets = buckets.map((b, i) => [borrowedTokensAddresses[i], b]) const aTokensAndOwnersBuckets = buckets.map((b, i) => [aaveTokens[borrowedTokensAddresses[i].toLowerCase()], b]).filter((p) => p[0]) + const tokensAndOwnersPM = Object.values(defaultTokens).map(t => [t, positionManager]) const tokensAndOwnersTBV = Object.values(defaultTokens).map(t => [t, traderBalanceVault]) - const tokensAndOwners = tokensAndOwnersBuckets.concat(aTokensAndOwnersBuckets, tokensAndOwnersPM, tokensAndOwnersTBV) + const tokensAndOwners = tokensAndOwnersBuckets.concat(tokensAndOwnersBucketsv2, aTokensAndOwnersBuckets, aTokensAndOwnersBucketsv2, tokensAndOwnersPM, tokensAndOwnersTBV) return sumTokens2({ api, tokensAndOwners }) } diff --git a/projects/primitive/index.js b/projects/primitive/index.js index 92c9ae42a1..52bd9b6b09 100644 --- a/projects/primitive/index.js +++ b/projects/primitive/index.js @@ -4,7 +4,7 @@ const v1TVL = require('./v1') module.exports = { ethereum: { - start: 1647932400, // unix timestamp (utc 0) specifying when the project began, or where live data begins + start: '2022-03-22', // unix timestamp (utc 0) specifying when the project began, or where live data begins tvl: sdk.util.sumChainTvls([rmmTVL, v1TVL, ]), // }, } \ No newline at end of file diff --git a/projects/printerfinancial/helper.js b/projects/printerfinancial/helper.js index 70070cafba..29a2c3c2c3 100644 --- a/projects/printerfinancial/helper.js +++ b/projects/printerfinancial/helper.js @@ -1,5 +1,5 @@ const { staking, stakingUnknownPricedLP } = require("../helper/staking"); -const { pool2Exports } = require("../helper/pool2"); +const { pool2 } = require("../helper/pool2"); const sdk = require("@defillama/sdk"); const token0Abi = 'address:token0' const token1Abi = 'address:token1' @@ -12,7 +12,7 @@ function printerTvl(token, share, rewardPool, masonry, pool2LPs, chain = "ethere [chain]: { tvl: async () => ({}), staking: staking(masonry, share, chain), - pool2: pool2Exports(rewardPool, pool2LPs, chain, transform) + pool2: pool2(rewardPool, pool2LPs, chain, transform) } } } diff --git a/projects/probit/index.js b/projects/probit/index.js index 7777210d33..70ae054863 100644 --- a/projects/probit/index.js +++ b/projects/probit/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -16,11 +17,7 @@ const config = { ], }, bitcoin: { - owners: [ - "19EgVpboqNjortWyhJSDAGRvHDtduqiSfr", - "19AtrEvJv7UY75tvWkXMxLUAYibxpZhFfN", - "17PpCEuQUT7xxP1ocfhvFdwQyrB5dG1dQP" - ], + owners: bitcoinAddressBook.probit, }, fantom: { owners: [ diff --git a/projects/promethium/index.js b/projects/promethium/index.js index 01082b6a95..a0a1e30102 100644 --- a/projects/promethium/index.js +++ b/projects/promethium/index.js @@ -25,7 +25,7 @@ async function tvl(api) { module.exports = { methodology: "TVL displays the total amount of assets stored in the Promethium contracts, excluding not claimed fees.", - start: 1696164866, + start: '2023-10-01', arbitrum: { tvl }, hallmarks: [[1696164866, "Profitable pools deployment"]], }; diff --git a/projects/proton-loan/index.js b/projects/proton-loan/index.js index 47df70645e..6a44573062 100644 --- a/projects/proton-loan/index.js +++ b/projects/proton-loan/index.js @@ -74,11 +74,13 @@ async function getTotalStaking() { } module.exports = { + deadFrom: '2024-09-09', misrepresentedTokens: true, methodology: `Proton Loan TVL is the sum of all lending deposits in the Proton Loan smart contract and single-side staked LOAN.`, proton: { tvl: getLendingTvl(false), - borrowed: getLendingTvl(true), + borrowed: () => ({}), // bad debt getLendingTvl(true), staking: getTotalStaking }, -} \ No newline at end of file +} + diff --git a/projects/pryzm-liquid-staking/index.js b/projects/pryzm-liquid-staking/index.js new file mode 100644 index 0000000000..f758f6b2c7 --- /dev/null +++ b/projects/pryzm-liquid-staking/index.js @@ -0,0 +1,53 @@ +const { get } = require('../helper/http') +const { endPoints, } = require('../helper/chain/cosmos'); + +const host_chains = { + cosmos: { + hostChainId: "uatom", + coinGeckoId: "cosmos", + decimals: 1e6, + }, + + injective: { + hostChainId: "inj", + coinGeckoId: "injective-protocol", + decimals: 1e18, + }, + + osmosis: { + hostChainId: "uosmo", + coinGeckoId: "osmosis", + decimals: 1e6, + }, + + terra2: { + hostChainId: "uluna", + coinGeckoId: "terra-luna-2", + decimals: 1e6, + }, + + celestia: { + hostChainId: "utia", + coinGeckoId: "celestia", + decimals: 1e6, + }, +}; + +const endpoint = endPoints["pryzm"] + +function tvlOnChain(chain) { + return async (api) => { + const [{ amount: coin }, { host_chain_state: state }] = + await Promise.all([ + await get(`${endpoint}/cosmos/bank/v1beta1/supply/by_denom?denom=c:${chain.hostChainId}`), + await get(`${endpoint}/pryzm/icstaking/v1/host_chain_state/${chain.hostChainId}`), + ]); + + const balance = coin.amount * state.exchange_rate / chain.decimals + api.addCGToken(chain.coinGeckoId, balance) + }; +} + +for (const chainName of Object.keys(host_chains)) { + module.exports[chainName] = { tvl: tvlOnChain(host_chains[chainName]) }; +} \ No newline at end of file diff --git a/projects/pryzm-protocol/index.js b/projects/pryzm-protocol/index.js new file mode 100644 index 0000000000..4408583e66 --- /dev/null +++ b/projects/pryzm-protocol/index.js @@ -0,0 +1,36 @@ +const { get } = require('../helper/http') +const { endPoints, } = require('../helper/chain/cosmos'); +const { concat } = require("ethers"); + +const endpoint = endPoints["pryzm"] +const amm_vault_address = "pryzm1y7d08j5uy7kgurnv4pwag8h34m2cgptcwe75wn"; +const refractor_vault_address = "pryzm1xtnrr4e6553hap0zuveautjstc3w2sxmf2zph3"; + +async function tvl(api) { + const [{ balances: amm_balances }, { balances: refractor_balances }] = + await Promise.all([ + await get(`${endpoint}/cosmos/bank/v1beta1/balances/${amm_vault_address}?pagination.limit=1000`), + await get(`${endpoint}/cosmos/bank/v1beta1/balances/${refractor_vault_address}?pagination.limit=1000`) + ]); + + let all_balances = amm_balances.concat(refractor_balances); + for (const { denom, amount } of all_balances) { + if (denom.startsWith("p:") || + denom.startsWith("y:") || + denom.startsWith("lp:") + ) { + continue + } + if (denom === 'ibc/B8AF5D92165F35AB31F3FC7C7B444B9D240760FA5D406C49D24862BD0284E395') + api.addCGToken('terra-luna-2', amount/1e6) + else + api.add(denom, amount); + } +} + +module.exports = { + methodology: "Counts the liquidity on the refractor module and all AMM pools", + pryzm: { + tvl + }, +}; diff --git a/projects/pstake-btc/index.js b/projects/pstake-btc/index.js index 6079a8ee24..3afcdbefe2 100644 --- a/projects/pstake-btc/index.js +++ b/projects/pstake-btc/index.js @@ -1,11 +1,8 @@ const { sumTokensExport } = require("../helper/sumTokens"); -const sdk = require("@defillama/sdk"); - -const owner = ["bc1qajcp935tuvqakut95f0sc9qm09hxjj6egexl9d", "bc1pzq0ve6e7j6jt4ckx8uzdjyddrfda9ew8dxvrjmkxmfnj9yz68zeqgqh9cl", "bc1pjp9pg0d6wcejlg576st4s8d424zx443mdumdhvjcxx5ehnfk4xcqyru7ay"]; +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { - methodology: `Total amount of BTC in ${owner}.`, - bitcoin: { - tvl: sdk.util.sumChainTvls([sumTokensExport({ owner })]), - }, -}; \ No newline at end of file + methodology: `Total amount of BTC restaked on babylon`, + doublecounted:true, + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.pstakeBTC }) }, +}; diff --git a/projects/psy/index.js b/projects/psy/index.js index 654c5997cd..4ad1141bcd 100644 --- a/projects/psy/index.js +++ b/projects/psy/index.js @@ -13,7 +13,7 @@ async function tvl(api) { module.exports = { methodology: "Adds up the total value locked as collateral on the Gravita platform", - start: 1689519600, // Sun Jul 16 2023 15:00:00 GMT+0000 + start: '2023-07-16', // Sun Jul 16 2023 15:00:00 GMT+0000 arbitrum: { tvl, }, diff --git a/projects/puffer/index.js b/projects/puffer/index.js index f246b75efd..db4fa93879 100644 --- a/projects/puffer/index.js +++ b/projects/puffer/index.js @@ -7,7 +7,6 @@ async function tvl(api) { module.exports = { doublecounted: true, methodology: 'Returns the total assets owned by the Puffer Vault on Ethereum.', - start: 19128047, ethereum: { tvl, } diff --git a/projects/pulsechain/index.js b/projects/pulsechain/index.js new file mode 100644 index 0000000000..133c1ce524 --- /dev/null +++ b/projects/pulsechain/index.js @@ -0,0 +1,13 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owner: '0x1715a3E4A142d8b698131108995174F37aEBA10D', + fetchCoValentTokens: true, + permitFailure: true + }), + }, +}; diff --git a/projects/pulserate/index.js b/projects/pulserate/index.js index feca6b1e78..aa0ade5215 100644 --- a/projects/pulserate/index.js +++ b/projects/pulserate/index.js @@ -8,7 +8,6 @@ module.exports = { tvl: getUniTVL({ factory: "0xE2332E5297b18a21DcE0E6ac461e821C353A00cA", useDefaultCoreAssets: true, - fetchBalances: true, }), staking: sumTokensExport({ owners: ["0xD7A2F5A72079654E7997C615cC07A1b92D850b32"], diff --git a/projects/pumpbtc/index.js b/projects/pumpbtc/index.js index f49afeaa69..cab2120c9c 100644 --- a/projects/pumpbtc/index.js +++ b/projects/pumpbtc/index.js @@ -1,17 +1,47 @@ -const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokens } = require('../helper/sumTokens'); +const utils = require('../helper/utils'); +const { getConfig } = require('../helper/cache'); +const bitcoinBook = require('../helper/bitcoin-book'); +const { sumTokens2 } = require('../helper/unwrapLPs'); module.exports = { methodology: 'TVL for pumpBTC is calculated based on the total value of WBTC, FBTC, BTCB held in the contract that were utilized in the minting process of pumpBTC.', } -const config = { - ethereum: { owners: ['0x1fCca65fb6Ae3b2758b9b2B394CB227eAE404e1E', '0x3d9bCcA8Bc7D438a4c5171435f41a0AF5d5E6083'], tokens: ['0xC96dE26018A54D51c097160568752c4E3BD6C364', ADDRESSES.ethereum.WBTC], }, - bsc: { owners: ['0x2Ee808F769AB697C477E0aF8357315069b66bCBb'], tokens: [ADDRESSES.bsc.BTCB], }, - mantle: { owners: ['0xd6Ab15B2458B6EC3E94cE210174d860FdBdd6b96'], tokens: ['0xC96dE26018A54D51c097160568752c4E3BD6C364'], }, + +async function getStakingAddresses() { + let res = await utils.fetchURL('https://dashboard.pumpbtc.xyz/api/dashboard/asset/tokenowners') + + const btcAddresses = res.data.data || {} + return btcAddresses +} + +async function bitcoinTvl(api) { + const owners = await bitcoinBook.pumpBTC() + return sumTokens({ api, owners }) +} + +async function otherTvl(api) { + const addresses = await getConfig('pumpbtc/v2-other', undefined, { fetcher: getStakingAddresses }) + + if (!addresses[api.chain]) { + return; + } + + const { owners, tokens } = addresses[api.chain] + return sumTokens2({ api, owners, tokens }) } -Object.keys(config).forEach(chain => { - const { owners, tokens, } = config[chain] - module.exports[chain] = { - tvl: async (api) => api.sumTokens({ owners, tokens }) +module.exports.isHeavyProtocol = true; +module.exports.doublecounted = true; + +['bitcoin', 'ethereum', 'bsc', 'mantle', 'base', 'arbitrum', 'bob'].forEach(chain => { + if (chain == 'bitcoin') { + module.exports[chain] = { + tvl: bitcoinTvl, + } + } else { + module.exports[chain] = { + tvl: otherTvl + } } -}) +}) \ No newline at end of file diff --git a/projects/pumpxy/index.js b/projects/pumpxy/index.js new file mode 100644 index 0000000000..7e6d27d2a7 --- /dev/null +++ b/projects/pumpxy/index.js @@ -0,0 +1,15 @@ +const { sumTokens2, nullAddress } = require('../helper/unwrapLPs') + +module.exports = { + methodology: "TVL is calculated by retrieving the ETH balance of all meme coin contracts deployed by the Zircuit factory contract. The factory contract dynamically manages meme coins, and their ETH holdings are summed up to calculate the total TVL.", + start: '2024-09-11', + zircuit: { + tvl, + }, +} + +async function tvl(api) { + const factory = '0x2FB9FbFF266CED68FCfEEC850e3ce9c58BB68Ec3'; + const memeCoins = await api.fetchList({ lengthAbi: 'allMemecoinsCount', itemAbi: 'allMemecoins', target: factory }) + return sumTokens2({ api, owners: memeCoins, token: nullAddress}) +} diff --git a/projects/purefi/index.js b/projects/purefi/index.js index 39cf6f11ba..d5d9fd7cd1 100644 --- a/projects/purefi/index.js +++ b/projects/purefi/index.js @@ -1,5 +1,4 @@ const { staking, stakings } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); /*** Ethereum Addresses ***/ const UFI = "0xcDa4e840411C00a614aD9205CAEC807c7458a0E3"; @@ -51,23 +50,8 @@ const farmingStakingContracts_polygon = [ "0xF1a44C75E4D92f4DA737485f96b0c2a1327d91b2", ]; -const polygonTvl = async (chainBlocks) => { - const balances = {}; - - let transformAddress = i => `polygon:${i}`; - await sumTokensAndLPsSharedOwners( - balances, - [ - [SAFLE_polygon, false], - [SCA_polygon, false], - ], - farmingStakingContracts_polygon, - chainBlocks["polygon"], - "polygon", - transformAddress - ); - - return balances; +const polygonTvl = async (api) => { + return api.sumTokens({ owners: farmingStakingContracts_polygon, tokens: [SAFLE_polygon, SCA_polygon,] }); }; module.exports = { @@ -82,6 +66,5 @@ module.exports = { staking: stakings(farmingStakingContracts_polygon, UFI_polygon), tvl: polygonTvl, }, - //tvl: (tvl) => ({}), methodology: "Counts tvl of the assets staked on the Farming seccion thgough Farming Contracts", }; diff --git a/projects/pv01/index.js b/projects/pv01/index.js new file mode 100644 index 0000000000..caa377dcf8 --- /dev/null +++ b/projects/pv01/index.js @@ -0,0 +1,20 @@ +const PV01_VAULT_FACTORY_ETHEREUM = '0x7eB37F9326E2474D5178Fd5224bc35E30A5398B5'; +const abi = { + getVaults: "function getVaults(string type_) view returns (address[])" +}; + +async function tvl(api) { + // Fetch the list of vaults from the factory + const vaults = await api.call({ abi: abi.getVaults, target: PV01_VAULT_FACTORY_ETHEREUM, params: ['BondPerpetualVault'] }); + // Fetch total supply for each vault + const supplies = await api.multiCall({ abi: "erc20:totalSupply", calls: vaults, }); + api.add(vaults, supplies) +} + +module.exports = { + methodology: + "Counts the total supply of rTBL (Rolling T-bill) tokens across all PV01 perpetual bond vaults.", + ethereum: { + tvl, + }, +}; diff --git a/projects/pwn/index.js b/projects/pwn/index.js index b4f34810cd..84e885ceff 100644 --- a/projects/pwn/index.js +++ b/projects/pwn/index.js @@ -14,6 +14,8 @@ const PWN_BUNDLER_BSC = "0x4A75a527E97d853109aA6998a2B9E45a87A31e9f"; const PWN_V1_SIMPLE_LOAN = "0x50160ff9c19fbE2B5643449e1A321cAc15af2b2C"; const PWN_V1_1_SIMPLE_LOAN_A = "0x57c88D78f6D08b5c88b4A3b7BbB0C1AA34c3280A"; // Mainnet, Polygon, Arbitrum, BSC const PWN_V1_1_SIMPLE_LOAN_B = "0x4188C513fd94B0458715287570c832d9560bc08a"; // Cronos, Base, Optimism +const PWN_V1_2_SIMPLE_LOAN = "0x9A93AE395F09C6F350E3306aec592763c517072e"; +const PWN_V1_2_2_SIMPLE_LOAN = "0x0773d5F2f7b3264a9Eb285F085aCCcC53d5aAa4F"; module.exports = { misrepresentedTokens: true, @@ -26,6 +28,8 @@ module.exports = { PWN_BUNDLER_MAINNET, PWN_V1_SIMPLE_LOAN, PWN_V1_1_SIMPLE_LOAN_A, + PWN_V1_2_SIMPLE_LOAN, + PWN_V1_2_2_SIMPLE_LOAN, ], resolveNFTs: true, resolveArtBlocks: true, @@ -40,6 +44,8 @@ module.exports = { PWN_BUNDLER_POLYGON, PWN_V1_SIMPLE_LOAN, PWN_V1_1_SIMPLE_LOAN_A, + PWN_V1_2_SIMPLE_LOAN, + PWN_V1_2_2_SIMPLE_LOAN, ], fetchCoValentTokens: true, }), @@ -51,22 +57,32 @@ module.exports = { }, base: { tvl: sumTokensExport({ - owners: [PWN_BUNDLER_BASE, PWN_V1_1_SIMPLE_LOAN_B], fetchCoValentTokens: true, + owners: [PWN_BUNDLER_BASE, PWN_V1_1_SIMPLE_LOAN_B, PWN_V1_2_SIMPLE_LOAN, PWN_V1_2_2_SIMPLE_LOAN], fetchCoValentTokens: true, }), }, arbitrum: { tvl: sumTokensExport({ - owners: [PWN_BUNDLER_ARBITRUM, PWN_V1_1_SIMPLE_LOAN_A], fetchCoValentTokens: true, + owners: [PWN_BUNDLER_ARBITRUM, PWN_V1_1_SIMPLE_LOAN_A, PWN_V1_2_SIMPLE_LOAN, PWN_V1_2_2_SIMPLE_LOAN], fetchCoValentTokens: true, }), }, optimism: { tvl: sumTokensExport({ - owners: [PWN_BUNDLER_OPTIMISM, PWN_V1_1_SIMPLE_LOAN_B], fetchCoValentTokens: true, + owners: [PWN_BUNDLER_OPTIMISM, PWN_V1_1_SIMPLE_LOAN_B, PWN_V1_2_SIMPLE_LOAN, PWN_V1_2_2_SIMPLE_LOAN], fetchCoValentTokens: true, }), }, bsc: { tvl: sumTokensExport({ - owners: [PWN_BUNDLER_BSC, PWN_V1_1_SIMPLE_LOAN_A], fetchCoValentTokens: true, + owners: [PWN_BUNDLER_BSC, PWN_V1_1_SIMPLE_LOAN_A, PWN_V1_2_SIMPLE_LOAN, PWN_V1_2_2_SIMPLE_LOAN], fetchCoValentTokens: true, + }), + }, + linea: { + tvl: sumTokensExport({ + owners: [PWN_V1_2_SIMPLE_LOAN, PWN_V1_2_2_SIMPLE_LOAN], fetchCoValentTokens: true, + }), + }, + xdai: { + tvl: sumTokensExport({ + owners: [PWN_V1_2_SIMPLE_LOAN, PWN_V1_2_2_SIMPLE_LOAN], fetchCoValentTokens: true, }), }, mantle: { tvl: () => ({}) }, diff --git a/projects/pyswap/index.js b/projects/pyswap/index.js index 3f98df1283..f0198fb439 100644 --- a/projects/pyswap/index.js +++ b/projects/pyswap/index.js @@ -15,7 +15,7 @@ const assets = [ let owners = [native_staking_contract_pool1, native_staking_contract_pool2, pys_staking_contract] let TVL_STAKING = sumTokensExport({ owners, tokens: assets }) -let TVL_AMM_DEX = getUniTVL({factory: "0x1434575AbB43103cFb40fd8147FB1e0B2ec3e2A1", useDefaultCoreAssets: true, fetchBalances: true,}) +let TVL_AMM_DEX = getUniTVL({factory: "0x1434575AbB43103cFb40fd8147FB1e0B2ec3e2A1", useDefaultCoreAssets: true,}) module.exports = { op_bnb: { diff --git a/projects/qian/index.js b/projects/qian/index.js index 976713a687..4567ff4bf0 100644 --- a/projects/qian/index.js +++ b/projects/qian/index.js @@ -9,6 +9,6 @@ async function tvl(api) { } module.exports = { - start: 1513566671, // 2020/10/21 6:34:47 (+UTC) + start: '2017-12-18', // 2020/10/21 6:34:47 (+UTC) ethereum: { tvl }, }; diff --git a/projects/qomswap/index.js b/projects/qomswap/index.js new file mode 100644 index 0000000000..f45ad0177c --- /dev/null +++ b/projects/qomswap/index.js @@ -0,0 +1,4 @@ +const { uniTvlExport } = require('../helper/unknownTokens') + +module.exports = uniTvlExport('qom', '0x475f361993D6FAcBF32fB82B66be0fB40f3d974C') + diff --git a/projects/quadrat/index.js b/projects/quadrat/index.js index 703470dfbe..5bae25dfad 100644 --- a/projects/quadrat/index.js +++ b/projects/quadrat/index.js @@ -4,7 +4,7 @@ const sdk = require('@defillama/sdk') module.exports = { doublecounted: true, methodology: 'Counts the tokens locked in Strategy Vaults in Uniswap v3 Pools.', - start: 1667197843, // Mon Oct 31 2022 06:30:43 GMT+0000 + start: '2022-10-31', // Mon Oct 31 2022 06:30:43 GMT+0000 }; const config = { diff --git a/projects/quantoswap/index.js b/projects/quantoswap/index.js index d8d0f06721..e8083dc529 100644 --- a/projects/quantoswap/index.js +++ b/projects/quantoswap/index.js @@ -11,6 +11,6 @@ module.exports = { misrepresentedTokens: true, ethereum: { staking: stakings(pools, QNS,), - tvl: getUniTVL({ useDefaultCoreAssets: true, factory, fetchBalances: true }) + tvl: getUniTVL({ useDefaultCoreAssets: true, factory}) }, }; \ No newline at end of file diff --git a/projects/quartzdefi/index.js b/projects/quartzdefi/index.js index ecb96cb184..2823f30fca 100644 --- a/projects/quartzdefi/index.js +++ b/projects/quartzdefi/index.js @@ -1,4 +1,4 @@ -const { pool2Exports } = require("../helper/pool2"); +const { pool2 } = require("../helper/pool2"); const { staking } = require("../helper/staking"); const sdk = require("@defillama/sdk"); const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); @@ -59,54 +59,17 @@ async function harmonyPool2(timestamp, block, chainBlocks) { return balances; } -async function harmonyStaking(timestamp, block, chainBlocks) { - let balances = {}; - const chain = "harmony"; - block = chainBlocks.harmony; - - const tokenBalances = (await sdk.api.abi.multiCall({ - calls: [ - { - target: qshare, - params: qshareboardroom - }, - { - target: quartz, - params: singleQuartzFarm - }, - { - target: quartz, - params: xquartz - } - ], - abi: "erc20:balanceOf", - block, - chain - })).output; - - tokenBalances.forEach(p => { - sdk.util.sumSingleBalance(balances, `harmony:${p.input.target}`, p.output); - }) - - return balances; -} module.exports = { misrepresentedTokens: true, harmony: { tvl: async () => ({}), - staking: harmonyStaking, + staking: staking([qshareboardroom, singleQuartzFarm, xquartz], [quartz]), pool2: harmonyPool2 }, bsc: { tvl: async () => ({}), staking: staking(aShareBoardroomAddress, ashareTokenAddress), - pool2: pool2Exports(ashareRewardPool, BSCLPTokens, "bsc", addr=> { - addr = addr.toLowerCase(); - if (addr === "0x36d53ed6380313f3823eed2f44dddb6d1d52f656") { - return "harmony:0xfa4b16b0f63f5a6d0651592620d585d308f749a4" - } - return `bsc:${addr}`; - }) + pool2: pool2(ashareRewardPool, BSCLPTokens) } } \ No newline at end of file diff --git a/projects/quasar/index.js b/projects/quasar/index.js index 2de7391a09..9846b1be33 100644 --- a/projects/quasar/index.js +++ b/projects/quasar/index.js @@ -1,7 +1,7 @@ const { queryContract } = require('../helper/chain/cosmos') const { getConfig } = require('../helper/cache') -async function tvl(api) { +async function tvlOsmosis(api) { const data = await getConfig('quasar-vaults', 'https://api.quasar.fi/vaults') const vaults = data.filter(i => i.chainId === 'osmosis-1').map(i => i.address) for (const vault of vaults) { @@ -11,10 +11,22 @@ async function tvl(api) { return api.getBalances() } +async function tvlEthereum(api) { + const data = await getConfig('quasar-vaults', 'https://api.quasar.fi/vaults') + const vaults = data.filter(i => i.chainId === 1).map(i => i.address) + const tvlRes = await api.multiCall({ abi: 'function underlyingTvl() view returns (address[] tokens, uint256[] bals)', calls: vaults }) + tvlRes.forEach(({ tokens, bals }) => { + api.add(tokens, bals) + }) +} + module.exports = { timetravel: false, methodology: 'Total TVL on vaults', osmosis: { - tvl, + tvl: tvlOsmosis, }, -} \ No newline at end of file + ethereum: { + tvl: tvlEthereum + } +} diff --git a/projects/quenta/index.js b/projects/quenta/index.js new file mode 100644 index 0000000000..cda0b9e9dd --- /dev/null +++ b/projects/quenta/index.js @@ -0,0 +1,11 @@ + +const { sumTokensExport } = require("../helper/unwrapLPs"); + +const ioUSDC = '0x3b2bf2b523f54c4e454f08aa286d03115aff326c' +const ioUSDT = '0x6fbcdc1169b5130c59e72e51ed68a84841c98cd1' +const USDQ = '0xEE43369197F78CFDF0D8fc48D296964C50AC7B57' + +module.exports = { + iotex: { tvl: sumTokensExport({ owner: USDQ, tokens: [ioUSDC, ioUSDT], })}, + methodology: `The calculation method for Quenta's TVL is the total value of all stablecoins (ioUSDC, ioUSDT) staked in the USDQ contract.`, +}; diff --git a/projects/quicksilver/index.js b/projects/quicksilver/index.js index 8e135e4c82..6abfdf1e42 100644 --- a/projects/quicksilver/index.js +++ b/projects/quicksilver/index.js @@ -12,36 +12,24 @@ const coinGeckoIds = { ustars: "stargaze", usaga: "saga-2", ubld: "agoric", + utia: "celestia", + aarch: "archway", + ppica: "picasso", + uflix: "omniflix-network", + inj: "injective", }; async function tvl() { const balances = {}; + const { zones } = await get(endPoints.quicksilver + "/quicksilver/interchainstaking/v1/zones"); + const { supply } = await get(endPoints.quicksilver + "/cosmos/bank/v1beta1/supply"); - const { zones } = await get( - endPoints.quicksilver + "/quicksilver/interchainstaking/v1/zones" - ); - const { supply } = await get( - endPoints.quicksilver + "/cosmos/bank/v1beta1/supply" - ); - - zones.map((zone) => { - const balance = supply.find((coin) => { - return coin.denom === zone.local_denom; - }); - let amount = balance.amount / 1e6; - if (zone.base_denom === "adydx") - amount = balance.amount / 1e18 - + zones.forEach((zone) => { + const balance = supply.find((coin) => coin.denom === zone.local_denom); + if (!balance) return + const amount = balance.amount / Math.pow(10, zone.decimals) const id = coinGeckoIds[zone.base_denom] - if (!id) { - throw new Error("Missing CoinGecko ID for denom " + zone.base_denom); - } - - sdk.util.sumSingleBalance( - balances, - id, - amount * zone.redemption_rate - ); + sdk.util.sumSingleBalance(balances, id, amount * zone.redemption_rate); }); return balances; @@ -50,7 +38,5 @@ async function tvl() { module.exports = { timetravel: false, methodology: "Sum of all the tokens that are liquid staked on Quicksilver", - quicksilver: { - tvl, - }, -}; // node test.js projects/quicksilver/index.js + quicksilver: { tvl }, +}; diff --git a/projects/quickswap-hydra/index.js b/projects/quickswap-hydra/index.js new file mode 100644 index 0000000000..7cb1af7a74 --- /dev/null +++ b/projects/quickswap-hydra/index.js @@ -0,0 +1,14 @@ +const config = { + polygon_zkevm: '0x14c8FEA10fdc2d1357410f473e2CAa035a872517', + manta: '0x443Cf165B72e4b4331C0101A10553269972Ed4B8' +} + +Object.keys(config).forEach(chain => { + const target = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const tokens= await api.call({ abi: 'address[]:getAssetList', target}) + return api.sumTokens({ owner: target, tokens }) + } + } +}) \ No newline at end of file diff --git a/projects/quickswap-lending/index.js b/projects/quickswap-lending/index.js index cccbdb19a3..8e0b872df9 100644 --- a/projects/quickswap-lending/index.js +++ b/projects/quickswap-lending/index.js @@ -11,7 +11,7 @@ const unitroller2 = "0x627742AaFe82EB5129DD33D237FF318eF5F76CBC" const unitroller3 = "0x1eD65DbBE52553A02b4bb4bF70aCD99e29af09f8" const cExports = [unitroller1, unitroller2, unitroller3, ].map(i => ({ - polygon: compoundExports(i, 'polygon') + polygon: compoundExports(i) })) module.exports = mergeExports([{ diff --git a/projects/quillswap/index.js b/projects/quillswap/index.js index 53b450e1c0..df73f2b7f4 100644 --- a/projects/quillswap/index.js +++ b/projects/quillswap/index.js @@ -1,6 +1,6 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('scroll', '0xab8aEfe85faD683A6bDE16EeD04C3420C713324b', { fetchBalances: true, }) +module.exports = uniTvlExport('scroll', '0xab8aEfe85faD683A6bDE16EeD04C3420C713324b') module.exports.hallmarks = [ [1698144638,"Liquidity Removed"], ] \ No newline at end of file diff --git a/projects/quoll/index.js b/projects/quoll/index.js index 98a1ea6543..2e8555f44a 100644 --- a/projects/quoll/index.js +++ b/projects/quoll/index.js @@ -1,5 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { staking } = require("../helper/staking"); +const { stakings } = require("../helper/staking"); const abi = require('./abi.json'); const voterProxy = '0xe96c48C5FddC0DC1Df5Cf21d68A3D8b3aba68046'; const masterWombat = '0x489833311676B566f888119c29bd997Dc6C95830'; @@ -39,6 +39,7 @@ async function voterProxyBalances(api) { } async function tvl(api) { + api.add("0xf4c8e32eadec4bfe97e0f595add0f4450a863a11", await api.call({ abi: 'function balanceOfNFT(uint256) returns (uint256)', target: "0xfbbf371c9b0b994eebfcc977cef603f7f31c070d", params: [16274], })) api.add(wom, await api.call({ abi: 'erc20:balanceOf', target: veWom, params: [voterProxy], })) await voterProxyBalances(api) } @@ -48,8 +49,8 @@ module.exports = { "TVL of Quoll Finance consists of Wombat LP tokens staked in MasterWombat, WOM tokens locked in veWOM, and Quoll tokens locked in QUO Vote Lock contract.", bsc: { tvl, - staking: staking( - quoLocker, + staking: stakings( + [quoLocker, "0xc634c0A24BFF88c015Ff32145CE0F8d578B02F60"], quo, chain ), diff --git a/projects/rabbitswap-v3/index.js b/projects/rabbitswap-v3/index.js new file mode 100644 index 0000000000..33614fd56b --- /dev/null +++ b/projects/rabbitswap-v3/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + tomochain: { factory: '0x1F09b50e8cbAed8A157fEe28716d13AfE36A77E7', fromBlock: 86787787, isAlgebra: false }, +}) diff --git a/projects/rabbitx/index.js b/projects/rabbitx/index.js index 85f877326d..3d667aa5c3 100644 --- a/projects/rabbitx/index.js +++ b/projects/rabbitx/index.js @@ -4,7 +4,11 @@ const { staking } = require('../helper/staking') module.exports = { ethereum: { - tvl: sumTokensExport({ owners: ['0xFc7f884DE22a59c0009C91733196b012Aecb8F41', '0x3b8F6D6970a24A58b52374C539297ae02A3c4Ae4', '0x7fAb440A0251dA67B316d2c0431E3Ccf4520Cd42',], tokens: [ADDRESSES.ethereum.USDT]}), + tvl: sumTokensExport({ owners: ['0xFc7f884DE22a59c0009C91733196b012Aecb8F41', '0x3b8F6D6970a24A58b52374C539297ae02A3c4Ae4', '0x7fAb440A0251dA67B316d2c0431E3Ccf4520Cd42','0x1171651A1917C7DE22cF2047D1D7Cb9d97039811',], tokens: [ADDRESSES.ethereum.USDT]}), staking: staking('0x0c378FB17E87B180256a87e3f671cd83Bf3236DB', '0x3Ba925fdeAe6B46d0BB4d424D829982Cb2F7309e'), }, + blast: { + tvl: sumTokensExport({ owners: ['0x3Ba925fdeAe6B46d0BB4d424D829982Cb2F7309e', '0x212f3a03b0e67f2d0afc7bca138707cf9fd6a0e6'], tokens: [ADDRESSES.blast.USDB, ADDRESSES.blast.WETH]}), + staking: staking('0x67dBA61709D78806395acDBa3EF9Df686aF5dc24', '0x236bb48fcF61ce996B2C8C196a9258c176100c7d'), + }, } diff --git a/projects/racoon/index.js b/projects/racoon/index.js index e72eb0711e..969e3c014f 100644 --- a/projects/racoon/index.js +++ b/projects/racoon/index.js @@ -1,5 +1,6 @@ module.exports = { base: { tvl: () => ({}) }, + deadFrom: 1693180800, hallmarks: [ [1693180800, "Rug Pull"] ] diff --git a/projects/radiant-v2/index.js b/projects/radiant-v2/index.js index 42906dfcbd..a02299a4b6 100644 --- a/projects/radiant-v2/index.js +++ b/projects/radiant-v2/index.js @@ -1,10 +1,13 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { staking } = require("../helper/staking"); -const { sumTokensExport } = require("../helper/unknownTokens"); +const { sumTokensExport } = require("../helper/unwrapLPs"); const { aaveExports, methodology, } = require("../helper/aave"); + module.exports = { hallmarks: [ - [1704178500,"flash loan exploit"] + [1704178500,"flash loan exploit"], + [Math.floor(new Date('2024-10-16')/1e3), 'Multisig was compromised'], ], methodology, arbitrum: { @@ -28,3 +31,56 @@ module.exports = { pool2: staking("0xD87F8a52a91680c993ece968B281bf92505A3741", "0x8a76639fe8e390ed16ea88f87beb46d6a5328254") }, }; + +const config = { + bsc: {aTokens: [ + '0x34d4F4459c1b529BEbE1c426F1e584151BE2C1e5', + '0x4Ff2DD7c6435789E0BB56B0553142Ad00878a004', + '0x89d763e8532D256a3e3e60c1C218Ac71E71cF664', + '0x3bDCEf9e656fD9D03eA98605946b4fbF362C342b', + '0x455a281D508B4e34d55b31AC2e4579BD9b77cA8E', + '0x58b0BB56CFDfc5192989461dD43568bcfB2797Db', + '0x6350e53461c7C95964D699cfa4e84cec993eebb1' + ] , tokens: [ + ADDRESSES.bsc.BTCB, + ADDRESSES.bsc.USDT, + ADDRESSES.bsc.BUSD, + ADDRESSES.bsc.USDC, + ADDRESSES.bsc.ETH, + ADDRESSES.bsc.WBNB, + '0xa2E3356610840701BDf5611a53974510Ae27E2e1' + ]}, + arbitrum: {aTokens: [ + '0x727354712BDFcd8596a3852Fd2065b3C34F4F770', + '0xd69D402D1bDB9A2b8c3d88D98b9CEaf9e4Cd72d9', + '0x48a29E756CC1C097388f3B2f3b570ED270423b3d', + '0x0D914606f3424804FA1BbBE56CCC3416733acEC6', + '0x0dF5dfd95966753f01cb80E76dc20EA958238C46', + '0x42C248D137512907048021B30d9dA17f48B5b7B2', + '0x2dADe5b7df9DA3a7e1c9748d169Cd6dFf77e3d01', + '0x3a2d44e354f2d88EF6DA7A5A4646fd70182A7F55', + '0xb11A56DA177c5532D5E29cC8363d145bD0822c81', + '0x876F38f474e48A104c4af4F06cA488099C436C93', + '0xd15a6568Dc891Fd04Aa2f64aF56C66C2bede59d6', + '0x19f0bE6a603967c72bE32a30915a38d52cA31Ae2' + ] , tokens: [ + ADDRESSES.arbitrum.WBTC, + ADDRESSES.arbitrum.USDT, + ADDRESSES.arbitrum.USDC, + ADDRESSES.optimism.DAI, + ADDRESSES.arbitrum.WETH, + ADDRESSES.arbitrum.WSTETH, + ADDRESSES.arbitrum.ARB, + ADDRESSES.arbitrum.USDC_CIRCLE, + '0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe', + '0x47c031236e19d024b42f8AE6780E44A573170703', + '0x70d95587d40A2caf56bd97485aB3Eec10Bee6336', + ADDRESSES.arbitrum.USDe + ]}, +} + +Object.keys(config).forEach(chain => { + const {aTokens, tokens,} = config[chain] + module.exports[chain].tvl = sumTokensExport({ tokensAndOwners2: [tokens, aTokens], }) + module.exports[chain].borrowed = () => ({}) +}) \ No newline at end of file diff --git a/projects/radlock/index.js b/projects/radlock/index.js new file mode 100644 index 0000000000..582eddf4ba --- /dev/null +++ b/projects/radlock/index.js @@ -0,0 +1,13 @@ +const { get } = require('../helper/http') + +async function tvl(api) { + const tokensLockedInXrdList = await get('https://api.radlock.io/token/locked?format=list&lpOnly=true') + return { + 'radix': tokensLockedInXrdList.reduce((acc, token) => acc + +token.xrd, 0) + } +} + +module.exports = { + timetravel: false, + radixdlt: { tvl } +} diff --git a/projects/raindex/index.js b/projects/raindex/index.js new file mode 100644 index 0000000000..f67d3f26e1 --- /dev/null +++ b/projects/raindex/index.js @@ -0,0 +1,96 @@ +const { sumTokens2 } = require("../helper/unwrapLPs") + +const orderbooks = { + arbitrum: { + v3: [ + { address: "0x90caf23ea7e507bb722647b0674e50d8d6468234", start: 1710573200 }, + ], + v4: [ + { address: "0x550878091b2b1506069f61ae59e3a5484bca9166", start: 1727110056 }, + ] + }, + base: { + v3: [ + { address: "0x2aee87d75cd000583daec7a28db103b1c0c18b76", start: 1710593051 }, + ], + v4: [ + { address: "0xd2938e7c9fe3597f78832ce780feb61945c377d7", start: 1724856007 }, + { address: "0xa2f56f8f74b7d04d61f281be6576b6155581dcba", start: 1719934425 }, + { address: "0x32aCbdF51abe567C91b7a5cd5E52024a5Ca56844", start: 1724451937 }, + { address: "0x80DE00e3cA96AE0569426A1bb1Ae22CD4181dE6F", start: 1724168357 }, + { address: "0x7A44459893F99b9d9a92d488eb5d16E4090f0545", start: 1723404441 }, + ], + }, + bsc: { + v3: [ + { address: "0xb1d6d10561d4e1792a7c6b336b0529e4bfb5ea8f", start: 1710592564 }, + ], + v4: [ + { address: "0xd2938e7c9fe3597f78832ce780feb61945c377d7", start: 1727110200 }, + ] + }, + ethereum: { + v3: [ + { address: "0xf1224a483ad7f1e9aa46a8ce41229f32d7549a74", start: 1707183011 }, + ], + v4: [ + { address: "0x0eA6d458488d1cf51695e1D6e4744e6FB715d37C", start: 1729850783 }, + ] + }, + flare: { + v3: [ + { address: "0xb06202aA3Fe7d85171fB7aA5f17011d17E63f382", start: 1712406628 }, + ], + v4: [ + { address: "0xcee8cd002f151a536394e564b84076c41bbbcd4d", start: 1725430973 }, + { address: "0xaa3b14Af0e29E3854E4148f43321C4410db002bC", start: 1724097373 }, + { address: "0xA2Ac77b982A9c0999472c1De378A81d7363d926F", start: 1724079109 }, + { address: "0x582d9e838FE6cD9F8147C66A8f56A3FBE513a6A2", start: 1720717267 }, + ] + }, + linea: { + v3: [], + v4: [ + { address: "0x22410e2a46261a1b1e3899a072f303022801c764", start: 1727718941 }, + { address: "0xF97DE1c2d864d90851aDBcbEe0A38260440B8D90", start: 1722282647 }, + ] + }, + // matchain: { + // v3: [], + // v4: [ + // { address: "0x40312EDAB8Fe65091354172ad79e9459f21094E2", start: 1725285390 }, + // ] + // }, + polygon: { + v3: [ + { address: "0xde5abe2837bc042397d80e37fb7b2c850a8d5a6c", start: 1705929922 }, + { address: "0x34200e026fbac0c902a0ff18e77a49265ca6ac99", start: 1691086795 }, + { address: "0xd3edafeb9eaa454ce26e60a66ccda73939c343a4", start: 1698953082 }, + { address: "0xc95a5f8efe14d7a20bd2e5bafec4e71f8ce0b9a6", start: 1710528345 }, + { address: "0x95c9bf235435b660aa69f519904c3f175aab393d", start: 1698859456 }, + { address: "0xdcdee0e7a58bba7e305db3abc42f4887ce8ef729", start: 1701659318 }, + { address: "0x16d518706d666c549da7bd31110623b09ef23abb", start: 1702067640 }, + ], + v4: [ + { address: "0x7d2f700b1f6fd75734824ea4578960747bdf269a", start: 1726792922 }, + { address: "0x2f209e5b67a33b8fe96e28f24628df6da301c8eb", start: 1721758591 }, + { address: "0xb8CD71e3b4339c8B718D982358cB32Ed272e4174", start: 1723733415 }, + { address: "0x001B302095D66b777C04cd4d64b86CCe16de55A1", start: 1723728017 }, + { address: "0xAfD94467d2eC43D9aD39f835BA758b61b2f41A0E", start: 1721746069 }, + ] + }, +} + +async function tvl(api) { + const { v3 = [], v4 = [] } = orderbooks[api.chain] + const owners = v3.concat(v4).map(orderbook => orderbook.address) + return sumTokens2({ api, owners, fetchCoValentTokens: true, permitFailure: true }) +} + +module.exports = { + methodology: 'Balance of tokens held by Rain Orderbook contract.', +} + +Object.keys(orderbooks).forEach(chain => { + module.exports[chain] = { tvl } +}) diff --git a/projects/ram.js b/projects/ram.js index d6f67cd28f..f458c05fb4 100644 --- a/projects/ram.js +++ b/projects/ram.js @@ -1,9 +1,5 @@ -const ADDRESSES = require('./helper/coreAssets.json') -const {usdCompoundExports} = require("./helper/compound"); - -const controllerAddress = "0x0d4fe8832857Bb557d8CFCf3737cbFc8aE784106"; +const { compoundExports2 } = require("./helper/compound"); module.exports = { - timetravel: true, // but we don't have a thundercore archive node atm - thundercore: usdCompoundExports(controllerAddress, "thundercore", "0xeF5A0CE54a519B1Db3F350EB902C4cFbf7671D88", undefined, { cetheEquivalent: ADDRESSES.thundercore.WTT }) -}; + thundercore: compoundExports2({ comptroller: '0x0d4fe8832857Bb557d8CFCf3737cbFc8aE784106', cether: '0xef5a0ce54a519b1db3f350eb902c4cfbf7671d88' }) +} \ No newline at end of file diff --git a/projects/range/index.js b/projects/range/index.js index f9f28e581c..22e3e82055 100644 --- a/projects/range/index.js +++ b/projects/range/index.js @@ -51,7 +51,7 @@ const config ={ module.exports = { methodology: 'assets deployed on DEX as LP + asset balance of vaults', doublecounted: true, - start: 1683965157, + start: '2023-05-13', }; // vaults that were deployed through factory but are uninitialized and unused diff --git a/projects/rari/api.js b/projects/rari/api.js deleted file mode 100644 index 9b4d078af5..0000000000 --- a/projects/rari/api.js +++ /dev/null @@ -1,11 +0,0 @@ -const { get } = require("../helper/http"); - -async function fetch() { - const { tvl } = await get("https://app.rari.capital/api/stats") - - return parseFloat(tvl); -} - -module.exports = { - fetch, -}; diff --git a/projects/rari/index.js b/projects/rari/index.js index 09a0a1f054..5e10de9ff7 100644 --- a/projects/rari/index.js +++ b/projects/rari/index.js @@ -1,12 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { requery } = require("../helper/requery"); const abi = require("./abi"); -const { default: BigNumber } = require("bignumber.js"); -const { getCompoundV2Tvl } = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound') const { pool2 } = require('../helper/pool2'); -const { getBlock } = require("../helper/http"); -const { sliceIntoChunks } = require("../helper/utils"); const { sumTokens2 } = require("../helper/unwrapLPs"); const earnETHPoolFundControllerAddressesIncludingLegacy = [ @@ -16,23 +11,13 @@ const earnETHPoolFundControllerAddressesIncludingLegacy = [ ] const earnDAIPoolControllerAddressesIncludingLegacy = [ '0x7C332FeA58056D1EF6aB2B2016ce4900773DC399', - // '0x3F579F097F2CE8696Ae8C417582CfAFdE9Ec9966' ] const earnStablePoolAddressesIncludingLegacy = [ '0x4a785fa6fcd2e0845a24847beb7bddd26f996d4d', - // '0x27C4E34163b5FD2122cE43a40e3eaa4d58eEbeaF', - // '0x318cfd99b60a63d265d2291a4ab982073fbf245d', - // '0xb6b79D857858004BF475e4A57D4A446DA4884866', - // '0xD4be7E211680e12c08bbE9054F0dA0D646c45228', - // '0xB202cAd3965997f2F5E67B349B2C5df036b9792e', - // '0xe4deE94233dd4d7c2504744eE6d34f3875b3B439' ] -const fusePoolLensAddress = '0x8dA38681826f4ABBe089643D2B3fE4C6e4730493' const fusePoolDirectoryAddress = '0x835482FE0532f169024d5E9410199369aAD5C77E' const rariGovernanceTokenUniswapDistributorAddress = '0x1FA69a416bCF8572577d3949b742fBB0a9CD98c7' const RGTETHSushiLPTokenAddress = '0x18a797c7c70c1bf22fdee1c09062aba709cacf04' -const ETHAddress = ADDRESSES.null -const bigNumZero = BigNumber('0') const tokenMapWithKeysAsSymbol = { 'DAI': ADDRESSES.ethereum.DAI, @@ -44,144 +29,25 @@ const tokenMapWithKeysAsSymbol = { 'MUSD': '0xe2f2a5c287993345a840db3b0845fbc70f5935a5' } -const fusePoolData = {} -async function getFusePoolData(pools, block) { - const data = { output: [] } - const chunks = sliceIntoChunks(pools.map(i => ({ params: i.comptroller })), 25) - for (const chunk of chunks) { - const items = await sdk.api2.abi.multiCall({ - target: fusePoolLensAddress, - abi: abi['getPoolSummary'], - block, - calls: chunk - }) - data.output.push(...items.output) - } - return data -} - -async function getFusePools(timestamp, block, balances, borrowed) { - const fusePoolsAll = (await sdk.api.abi.call({ - target: fusePoolDirectoryAddress, - block, - abi: abi['getPublicPools'] - })) - - const fusePools = fusePoolsAll.output['1'] - - if (!fusePoolData[block]) - fusePoolData[block] = getFusePoolData(fusePools, block) - - const poolSummaries = await fusePoolData[block] - - for (let summaryResult of poolSummaries.output) { - if (summaryResult.success) { - const summary = summaryResult.output - // https://docs.rari.capital/fuse/#get-pools-by-account-with-data - let amount; - if (borrowed) { - amount = BigNumber(summary['1']) - } else { - amount = BigNumber(summary['0']).minus(summary['1']) - } - sdk.util.sumSingleBalance(balances, ETHAddress, amount.toFixed(0)) - } else { - const newBalances = await getCompoundV2Tvl(summaryResult.input.params[0], 'ethereum', id => id, undefined, undefined, borrowed)(timestamp, block, { ethereum: block }) - Object.entries(newBalances).forEach(entry => sdk.util.sumSingleBalance(balances, entry[0], entry[1])) - } - } -} - -async function borrowed(timestamp, block) { - if (block > 14684686) { - return {} // after fei hack - } - const balances = {} - await getFusePools(timestamp, block, balances, true) - return balances -} - -async function tvl(timestamp, block) { - const balances = {} - block = await getBlock(timestamp, 'ethereum', { ethereum: block }) - - const getEarnYieldProxyAddressAsArray = (block) => { - if (block <= 11306334) { - return ['0x35DDEFa2a30474E64314aAA7370abE14c042C6e8'] - } else if (block > 11306334 && block <= 11252873) { - return ['0x6dd8e1Df9F366e6494c2601e515813e0f9219A88'] - } else { - return ['0x35DDEFa2a30474E64314aAA7370abE14c042C6e8'] - } - } +async function tvl(api) { - const updateBalance = (token, amount) => { - token = token.toLowerCase() - sdk.util.sumSingleBalance(balances, token, amount.toFixed(0)) - } const getBalancesFromEarnPool = async (addresses) => { - const earnPoolData = (await sdk.api.abi.multiCall({ - calls: addresses.map((address) => ({ - target: address - })), - block, - abi: abi['getRawFundBalancesAndPrices'] - })).output.map((resp) => resp.output) - for (let j = 0; j < earnPoolData.length; j++) { - const poolData = earnPoolData[j] && earnPoolData[j]['0'] - for (let i = 0; poolData && i < poolData.length; i++) { - const tokenSymbol = poolData[i].toUpperCase() - const tokenContractAddress = tokenMapWithKeysAsSymbol[tokenSymbol] - if (tokenContractAddress) { - const tokenAmount = BigNumber(earnPoolData[j]['1'][i]) - if (tokenAmount.isGreaterThan(bigNumZero)) { - updateBalance(tokenContractAddress, tokenAmount) - } - const pools = earnPoolData[j]['2'][i] - const poolBalances = earnPoolData[j]['3'][i] - if (pools && poolBalances && pools.length === poolBalances.length) { - for (let k = 0; k < pools.length; k++) { - const poolBalance = BigNumber(poolBalances[k]) - if (poolBalance.isGreaterThan(bigNumZero)) { - updateBalance(tokenContractAddress, poolBalance) - } - } - } - } - } - } + const earnPoolData = (await api.multiCall({ calls: addresses, abi: abi['getRawFundBalancesAndPrices'], permitFailure: true, })) + earnPoolData.filter(i => i).forEach(([tokens, bals] = []) => { + tokens.forEach((token, i) => { + const mapped = tokenMapWithKeysAsSymbol[token.toUpperCase()] + if (mapped) api.add(mapped, bals[i]) + else console.log('unmapped', token, bals[i]) + }) + }) } // Earn yield pool - const earnYieldProxyAddress = getEarnYieldProxyAddressAsArray(block) + const earnYieldProxyAddress = ['0x35DDEFa2a30474E64314aAA7370abE14c042C6e8'].concat(earnETHPoolFundControllerAddressesIncludingLegacy).concat(earnDAIPoolControllerAddressesIncludingLegacy).concat(earnStablePoolAddressesIncludingLegacy) await getBalancesFromEarnPool(earnYieldProxyAddress) - //Earn ETH pool - const ethPoolData = (await sdk.api.abi.multiCall({ - block, - abi: abi['getRawFundBalances'], - calls: earnETHPoolFundControllerAddressesIncludingLegacy.map((address) => ({ - target: address - })) - })).output.map((resp) => resp.output).flat() - for (let i = 0; i < ethPoolData.length; i++) { - const ethAmount = BigNumber(ethPoolData[i]['0']) - if (ethAmount.isGreaterThan(bigNumZero)) { - updateBalance(ETHAddress, ethAmount) - } - } - - // Earn DAI pool - await getBalancesFromEarnPool(earnDAIPoolControllerAddressesIncludingLegacy) - - // Earn stable pool - await getBalancesFromEarnPool(earnStablePoolAddressesIncludingLegacy) - - // Fuse - // await getFusePools(timestamp, block, balances, false) - - return balances + await fuseTvl(api) } async function fuseTvl(api) { @@ -191,30 +57,15 @@ async function fuseTvl(api) { const tokens = await api.multiCall({ abi: 'address:underlying', calls: markets }) return sumTokens2({api , tokensAndOwners2: [tokens, markets]}) } -async function fuseBorrowed(api) { - - const [_, pools] = (await api.call({ target: fusePoolDirectoryAddress, abi: abi['getPublicPools'] })) - const markets = (await api.multiCall({ abi: 'address[]:getAllMarkets', calls: pools.map(i => i.comptroller) })).flat() - const tokens = await api.multiCall({ abi: 'address:underlying', calls: markets }) - const bals = await api.multiCall({ abi: 'uint256:totalBorrows', calls: markets }) - api.addTokens(tokens, bals) - return api.getBalances() -} module.exports = { - misrepresentedTokens: true, doublecounted: true, - start: 1596236058, // July 14, 2020 + start: '2020-08-01', // July 14, 2020 ethereum: { - tvl: sdk.util.sumChainTvls([tvl, fuseTvl]), + tvl, pool2: pool2(rariGovernanceTokenUniswapDistributorAddress, RGTETHSushiLPTokenAddress), - borrowed, - }, - arbitrum: { - // Borrowing is disabled, and Tetranode's locker is the only pool with significant tvl, so counting only that - tvl: getCompoundV2Tvl('0xC7D021BD813F3b4BB801A4361Fbcf3703ed61716', 'arbitrum', undefined, undefined, undefined, false), - borrowed: getCompoundV2Tvl('0xC7D021BD813F3b4BB801A4361Fbcf3703ed61716', 'arbitrum', undefined, undefined, undefined, true), }, + arbitrum: compoundExports2({ comptroller: '0xC7D021BD813F3b4BB801A4361Fbcf3703ed61716' }), hallmarks: [ [1651276800, "FEI hack"], [1649548800, "ICHI sell-off"], @@ -222,3 +73,6 @@ module.exports = { [1654905600, "Bhavnani's announcement"] ] } + +module.exports.arbitrum.borrowed = () => ({}) +module.exports.ethereum.borrowed = () => ({}) diff --git a/projects/rate-x/index.js b/projects/rate-x/index.js new file mode 100644 index 0000000000..b87ba3a325 --- /dev/null +++ b/projects/rate-x/index.js @@ -0,0 +1,29 @@ +const { sumTokens2 } = require("../helper/solana"); +const { PublicKey } = require("@solana/web3.js"); +const { getConnection } = require("../helper/solana"); + +async function tvl(api) { + const connection = getConnection(); + const lookupTableAddress = new PublicKey("eP8LuPmLaF1wavSbaB4gbDAZ8vENqfWCL5KaJ2BRVyV"); + + const lookupTableAccount = ( + await connection.getAddressLookupTable(lookupTableAddress) + ).value; + + const tokenAccounts = [] + for (let i = 0; i < lookupTableAccount.state.addresses.length; i++) { + const address = lookupTableAccount.state.addresses[i]; + tokenAccounts.push(address.toBase58()); + } + + return sumTokens2({ + tokenAccounts, + balances: api.getBalances() + }) +} + +module.exports = { + timetravel: false, + methodology: "TVL is calculated by summing the value of the traders' vault, LP vault, and earn vault.", + solana: { tvl }, +}; diff --git a/projects/ray/index.js b/projects/ray/index.js index 0dffad302e..382c9afb81 100644 --- a/projects/ray/index.js +++ b/projects/ray/index.js @@ -51,7 +51,7 @@ const allPortfolioManagers = [ owners.push(allPortfolioManagers[0].address) module.exports = { - start: 1568274392, // 09/12/2019 @ 7:46am (UTC) + start: '2019-09-12', // 09/12/2019 @ 7:46am (UTC) ethereum: { tvl: sumTokensExport({ owners, diff --git a/projects/raydium/api.js b/projects/raydium/api.js index 01ea1e8f65..f03307d7d0 100644 --- a/projects/raydium/api.js +++ b/projects/raydium/api.js @@ -3,6 +3,7 @@ const { sumTokens2 } = require('../helper/solana') module.exports = { timetravel: false, + isHeavyProtocol: true, } const { solana: { tvl } } = getExports("raydium", ['solana']) @@ -14,6 +15,8 @@ module.exports.solana = { async function tvlWithCheck(api) { const balances = await tvl(api) api.addBalances(balances) + api.removeTokenBalance('DS4QiZfkp39PsHXYCRV3NkyDUKV9SpTczp2qnAUg6Nt6') // ZMB + api.removeTokenBalance('HDa3zJc12ahykSsBRvgiWzr6WLEByf36yzKKbVvy4gnF') // SOS const usdValue = await api.getUSDValue() // for some godforsaken reason, the TVL is sometimes reported as 60M, we fail in that case rather than report a wrong number if (usdValue < 2e8) throw new Error('TVL is too low :' + usdValue / 1e6 + 'M') diff --git a/projects/raydium/index.js b/projects/raydium/index.js index 816005d17f..ce47ced0ff 100644 --- a/projects/raydium/index.js +++ b/projects/raydium/index.js @@ -154,8 +154,10 @@ async function combinedTvl(api) { module.exports = { timetravel: false, + isHeavyProtocol: true, misrepresentedTokens: true, hallmarks: [[1667865600, "FTX collapse"]], + solana: { tvl: combinedTvl, staking: () => sumTokens2({ tokenAccounts: ['8tnpAECxAT9nHBqR1Ba494Ar5dQMPGhL31MmPJz1zZvY'] }) diff --git a/projects/real-veRWA/index.js b/projects/real-veRWA/index.js index e86393a001..a7e76b780e 100644 --- a/projects/real-veRWA/index.js +++ b/projects/real-veRWA/index.js @@ -1,5 +1,6 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { staking } = require('../helper/staking') -const RWAToken = '0x4644066f535Ead0cde82D209dF78d94572fCbf14' +const RWAToken = ADDRESSES.real.RWA const veRWA = '0xa7B4E29BdFf073641991b44B283FD77be9D7c0F4' module.exports = { diff --git a/projects/realt.js b/projects/realt.js index 49e477d2be..faa866891c 100644 --- a/projects/realt.js +++ b/projects/realt.js @@ -4,7 +4,7 @@ const { get } = require('./helper/http') // Loop through all RealT tokens listed by realt.community API and accumulate tokenprice * supply, where supply is biggest of xdai or mainnet // See https://api.realt.community/ for reference async function xdaiTvl(api) { - let realt_tokens = await get('https://api.realt.community/v1/token') + let realt_tokens = await get('https://api.realtoken.community/v1/token') // Filter out deprecated contracts realt_tokens = realt_tokens.filter(t => !t['fullName'].startsWith('OLD-')).filter(t => t.xDaiContract && +t.tokenPrice) diff --git a/projects/rebalance/index.js b/projects/rebalance/index.js index e3a7ab1ac1..d30421003a 100644 --- a/projects/rebalance/index.js +++ b/projects/rebalance/index.js @@ -1,21 +1,32 @@ -const { sumERC4626VaultsExport } = require('../helper/erc4626') const config = { arbitrum: [ - '0x4DdbCB86FCa5B4678Bd132085C818b07cd5716D1', // rUSDT - '0xD430e22c3a0F8Ebd6813411084a5cb26937f6661', // rUSDC.e - '0x46cbC1397710e177810B84028F4bf6F8B75B6F71', // rWETH - '0x52952120EAd486EC7cdd4CA93EA13f2abA44cC20', // rFRAX - '0xD77B4AdfF67108f7Ea3155ce1fB67c5345ee89C8', // rDAI - ] -} + "0xCF86c768E5b8bcc823aC1D825F56f37c533d32F9", // rUSDT + "0x6eAFd6Ae0B766BAd90e9226627285685b2d702aB", // rUSDC + "0xa8aae282ab2e57B8E39ad2e70DA3566d315348A9", // rUSDC.e + "0xcd5357A4F48823ebC86D17205C12B0B268d292a7", // rWETH + "0x5A0F7b7Ea13eDee7AD76744c5A6b92163e51a99a", // rDAI + "0x3BCa6513BF284026b4237880b4e4D60cC94F686c", // rFRAX + ], +}; + +const abi = "function getDepositBalance(address user, address vault) view returns (uint256 balance)"; module.exports = { - methodology: - 'TVL displays the total amount of assets stored in the REBALANCE vault contracts.', - start: 1712143874, - hallmarks: [[1712143874, 'Profitable vaults deployment']], + methodology: "TVL displays the total amount of assets stored in the REBALANCE vault contracts.", + start: '2024-04-03', + hallmarks: [[1712143874, "Profitable vaults deployment"]], }; -Object.keys(config).forEach(chain => { - module.exports[chain] = { tvl: sumERC4626VaultsExport({ vaults: config[chain], isOG4626: true, }) } -}) \ No newline at end of file +Object.keys(config).forEach((chain) => { + module.exports[chain] = { tvl: (api) => tvl(api, config[chain]) }; +}); + +const tvl = async (api, vaults) => { + const [providers, assets] = await Promise.all([ + api.multiCall({ calls: vaults, abi: "address:activeProvider" }), + api.multiCall({ calls: vaults, abi: "address:asset" }), + ]); + + const balances = await api.multiCall({ calls: vaults.map((vault, i) => ({ target: providers[i], params: [vault, vault] })), abi }) + api.add(assets, balances) +}; diff --git a/projects/redacted/index.js b/projects/redacted/index.js index fdb21318ca..58c73dfb67 100644 --- a/projects/redacted/index.js +++ b/projects/redacted/index.js @@ -1,6 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensAndLPsSharedOwners, sumTokens2, genericUnwrapCvx } = require('../helper/unwrapLPs') -const sdk = require('@defillama/sdk') +const { sumTokens2, genericUnwrapCvx } = require('../helper/unwrapLPs') const treasuries = ["0xa52fd396891e7a74b641a2cb1a6999fcf56b077e", "0x086c98855df3c78c6b481b6e1d47bef42e9ac36b"] @@ -20,110 +19,72 @@ const BTRFLYV2 = '0xc55126051B22eBb829D00368f4B12Bde432de5Da' const cvxCRVPool = '0x0392321e86F42C2F94FBb0c6853052487db521F0' const rlBTRFLYAbi = { - lockedSupply: "uint256:lockedSupply", -} - -async function tvl(timestamp, block, chainBlocks){ - const balances = {} - - //Add tokens/curve LPs in wallet - await sumTokensAndLPsSharedOwners(balances, [ - [CVX, false], - [cvxCRV, false], - [FXS, false], - [CRV, false], - [AURA, false], - // BTRFLY/ETH Curve LP - ['0x7483Dd57f6488b0e194A151C57Df6Ec85C00aCE9', false], - [ADDRESSES.ethereum.USDC, false], - [ADDRESSES.ethereum.FRAX, false], - ], treasuries, block) - - //Add UniswapV3 LPs - await sumTokens2({ balances, owners: treasuries, block, resolveUniV3: true, }) - - //Add convex deposited curve LPs - await genericUnwrapCvx(balances, treasuries[0], cvxCRVPool, block, 'ethereum') - - //This causes an error and not sure why - //await genericUnwrapCvx(balances, treasuries[0], cvxFXSPool, block, 'ethereum') - - //Add vlCVX as CVX - const vlCVXBalance = await sdk.api.erc20.balanceOf({ - target: ADDRESSES.ethereum.vlCVX, - owner: treasuries[0], - chain: 'ethereum', - block: chainBlocks['ethereum'] - }).then(result => result.output) - sdk.util.sumSingleBalance(balances, CVX, vlCVXBalance) + lockedSupply: "uint256:lockedSupply", +} - //Add vlAURA as AURA - const vlAURABalance = await sdk.api.erc20.balanceOf({ - target: AURALocker, - owner: treasuries[0], - chain: 'ethereum', - block: chainBlocks['ethereum'] - }).then(result => result.output) - sdk.util.sumSingleBalance(balances, AURA, vlAURABalance) +async function tvl(api) { + const block = api.block + const balances = api.getBalances() + const tokens = [ + CVX, + cvxCRV, + FXS, + CRV, + AURA, + // BTRFLY/ETH Curve LP + '0x7483Dd57f6488b0e194A151C57Df6Ec85C00aCE9', + ADDRESSES.ethereum.USDC, + ADDRESSES.ethereum.FRAX, + ] - //Add staked cvxCRV as cvxCRV - const cvxCRVStakedBalance = await sdk.api.erc20.balanceOf({ - target: cvxCRVStaking, - owner: treasuries[0], - chain: 'ethereum', - block: chainBlocks['ethereum'] - }).then(result => result.output) - sdk.util.sumSingleBalance(balances, cvxCRV, cvxCRVStakedBalance) + //Add tokens/curve LPs in wallet + await api.sumTokens({ owners: treasuries, tokens }) - //Add veFXS as 1/4 FXS since locked for 4 years - const veFXSBalance = await sdk.api.erc20.balanceOf({ - target: veFXS, - owner: treasuries[0], - chain: 'ethereum', - block: chainBlocks['ethereum'] - }).then(result => result.output) - sdk.util.sumSingleBalance(balances, FXS, veFXSBalance/4) + //Add UniswapV3 LPs + await sumTokens2({ api, owners: treasuries, resolveUniV3: true, }) - //Add veCRV as 1 CRV since locked for 4 years - const veCRVBalance = await sdk.api.erc20.balanceOf({ - target: veCRV, - owner: treasuries[0], - chain: 'ethereum', - block: chainBlocks['ethereum'] - }).then(result => result.output) - sdk.util.sumSingleBalance(balances, CRV, veCRVBalance) + //Add convex deposited curve LPs + await genericUnwrapCvx(balances, treasuries[0], cvxCRVPool, block) - //Add sOHM as OHM since 1:1 - const sOHMBalance = await sdk.api.erc20.balanceOf({ - target: sOHM, - owner: treasuries[1], - chain: 'ethereum', - block: chainBlocks['ethereum'] - }).then(result => result.output) - sdk.util.sumSingleBalance(balances, OHM, sOHMBalance) + //This causes an error and not sure why + //await genericUnwrapCvx(balances, treasuries[0], cvxFXSPool, block, 'ethereum') - return balances + //Add vlCVX as CVX + const [vlCVXBalance, vlAURABalance, cvxCRVStakedBalance, veFXSBalance, veCRVBalance, sOHMBalance] = await api.multiCall({ + abi: 'erc20:balanceOf', + calls: [ + { target: ADDRESSES.ethereum.vlCVX, params: treasuries[0] }, + { target: AURALocker, params: treasuries[0] }, + { target: cvxCRVStaking, params: treasuries[0] }, + { target: veFXS, params: treasuries[0] }, + { target: veCRV, params: treasuries[0] }, + { target: sOHM, params: treasuries[1] }, + ] + }) + api.add(CVX, vlCVXBalance) + api.add(AURA, vlAURABalance) + api.add(cvxCRV, cvxCRVStakedBalance) + api.add(CRV, veCRVBalance) + api.add(OHM, sOHMBalance) + api.add(FXS, veFXSBalance / 4) + //Add vlAURA as AURA + //Add staked cvxCRV as cvxCRV + //Add veFXS as 1/4 FXS since locked for 4 years + //Add veCRV as 1 CRV since locked for 4 years + //Add sOHM as OHM since 1:1 } -async function staking(timestamp, block, chainBlocks) { - const balances = {} - - //Adding locked BTRFLY - const lockedBTRFLY = await sdk.api.abi.call({ - abi: rlBTRFLYAbi.lockedSupply, - target: rlBTRFLY, - chain: 'ethereum', - block: chainBlocks['ethereum'], - }).then(result => result.output) - sdk.util.sumSingleBalance(balances, BTRFLYV2, lockedBTRFLY) - - return balances +async function staking(api) { + + //Adding locked BTRFLY + const lockedBTRFLY = await api.call({ abi: rlBTRFLYAbi.lockedSupply, target: rlBTRFLY, }) + api.add(BTRFLYV2, lockedBTRFLY) } module.exports = { - methodology: "tvl = Treasury assets (bonding). staking = rlBTRFLY (locked tokens)", - ethereum:{ - tvl, - staking - }, + methodology: "tvl = Treasury assets (bonding). staking = rlBTRFLY (locked tokens)", + ethereum: { + tvl, + staking + }, } \ No newline at end of file diff --git a/projects/reddex/index.js b/projects/reddex/index.js new file mode 100644 index 0000000000..19ad1e6c34 --- /dev/null +++ b/projects/reddex/index.js @@ -0,0 +1,7 @@ +const { uniTvlExports } = require('../helper/unknownTokens') + +module.exports = uniTvlExports({ + ethereum: '0xBC7D212939FBe696e514226F3FAfA3697B96Bf59', + bsc: '0x6D642253B6fD96d9D155279b57B8039675E49D8e', + rbn: '0x2E592dF6c56a8720E46bB00D17f8FaB391BF97c8', +}) diff --git a/projects/reffinance.js b/projects/reffinance.js index 1222b44a21..4e41da809c 100644 --- a/projects/reffinance.js +++ b/projects/reffinance.js @@ -1,21 +1,27 @@ +const { default: BigNumber } = require('bignumber.js') const { call, sumSingleBalance, } = require('./helper/chain/near') const PROJECT_CONTRACT = 'v2.ref-finance.near' - +const PROJECT_DCL_CONTRACT = 'dclv2.ref-labs.near' async function tvl() { const balances = {} let poolIndex = 0 const numberOfPools = await call(PROJECT_CONTRACT, 'get_number_of_pools', {}) - + const allDclPools = await call(PROJECT_DCL_CONTRACT, 'list_pools', {}); + allDclPools.forEach((dclPoolDetail) => { + const { token_x, token_y, total_order_x, total_order_y, total_x, total_y } = dclPoolDetail; + sumSingleBalance(balances, token_x, BigNumber(total_order_x).plus(total_x).toFixed()); + sumSingleBalance(balances, token_y, BigNumber(total_order_y).plus(total_y).toFixed()); + }) do { const pools = await call(PROJECT_CONTRACT, 'get_pools', { from_index: poolIndex, limit: 500 }) pools .filter(({ shares_total_supply }) => +shares_total_supply > 0) // Token pair must have some liquidity .map(({ token_account_ids, pool_kind, amounts }) => { - if (!['SIMPLE_POOL', 'STABLE_SWAP', "RATED_SWAP"].includes(pool_kind)) throw new Error('Unknown pool kind.') + // if (!['SIMPLE_POOL', 'STABLE_SWAP', "RATED_SWAP"].includes(pool_kind)) throw new Error('Unknown pool kind.') token_account_ids.forEach((token, index) => { sumSingleBalance(balances, token, amounts[index]) }) diff --git a/projects/reflexer/index.js b/projects/reflexer/index.js index 8c696fd367..6765cd88cf 100644 --- a/projects/reflexer/index.js +++ b/projects/reflexer/index.js @@ -32,6 +32,6 @@ async function tvl(timestamp, block) { ==================================================*/ module.exports = { - start: 1613520000, + start: '2021-02-17', ethereum: { tvl }, }; diff --git a/projects/reform/index.js b/projects/reform/index.js new file mode 100644 index 0000000000..8a59d884b9 --- /dev/null +++ b/projects/reform/index.js @@ -0,0 +1,9 @@ +const { staking } = require('../helper/staking') + +module.exports = { + ethereum: { + tvl: () => ({}), + staking: staking('0x74ef3b69e8c475df8450eddda5dabd9b6dd17972', '0xea3eed8616877F5d3c4aEbf5A799F2e8D6DE9A5E'), + pool2: staking('0x74ef3b69e8c475df8450eddda5dabd9b6dd17972', '0xf4e14a7766a3316d6cefbaec614c714f2d4965d8') + } +} diff --git a/projects/relayChain/index.js b/projects/relayChain/index.js index b2ac00eb58..15829e7bc8 100644 --- a/projects/relayChain/index.js +++ b/projects/relayChain/index.js @@ -104,7 +104,7 @@ const wbtcCronos = ADDRESSES.cronos.WBTC; const wethCronos = "0xe44fd7fcb2b1581822d0c862b68222998a0c299a"; const relayCronos = "0x9C29650a1B273A031A35F3121914aae882B144A4"; const busdCronos = ADDRESSES.oasis.USDT; -const wCronos = "0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23"; +const wCronos = ADDRESSES.cronos.WCRO_1; diff --git a/projects/ren/index.js b/projects/ren/index.js index e52debcd52..a7aa4ac429 100644 --- a/projects/ren/index.js +++ b/projects/ren/index.js @@ -1,7 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const { request, gql } = require("graphql-request"); const sdk = require("@defillama/sdk"); -const { getTokenSupply } = require('../helper/solana') const ethGraphUrl = sdk.graph.modifyEndpoint('AJaQdD8DUunuwHCbAsZk5h62AfyNG1etRtK9EcDH7gwH'); const bscGraphUrl = @@ -152,20 +151,17 @@ async function solana() { ["renLUNA", "8wv2KAykQstNAj2oW6AHANGBiFKVFhvMiyyzzjhkmGvE"], ] const balances = {} - await Promise.all(tokens.map(async token => { - balances[symbol(token[0])] = await getTokenSupply(token[1]) - })) return balances } module.exports = { - solana: { + solana: { tvl: solana }, ethereum: { tvl: eth, }, - avax:{ + avax: { tvl: avax, }, bsc: { @@ -187,3 +183,6 @@ module.exports = { tvl: optimism }, }; + + +Object.values(module.exports).forEach(chainExports => chainExports.tvl = () => ({})) diff --git a/projects/renec-lend/index.js b/projects/renec-lend/index.js new file mode 100644 index 0000000000..0258572a8b --- /dev/null +++ b/projects/renec-lend/index.js @@ -0,0 +1,55 @@ +const { sumTokens2, decodeAccount, getMultipleAccounts, getConnection, } = require("../helper/solana"); +const { PublicKey } = require("@solana/web3.js"); + +const RENEC_LEND_SOLANA_PROGRAM_ID = new PublicKey("9L193MV4yakKcgNT2tN4Kvf1ypn9c1sVMvsRn1Amw2Au"); +const RENEC_LEND_RENEC_PROGRAM_ID = new PublicKey("AqR1WSUwNeVsz66ayH2J8iTyiGMgouRwPqzzMaxx49ba"); + +const getProgram = (api) => api.chain === 'solana' ? RENEC_LEND_SOLANA_PROGRAM_ID : RENEC_LEND_RENEC_PROGRAM_ID; + +async function borrowed(api) { + const connection = await getConnection(api.chain); + const programId = getProgram(api); + const reserves = await connection.getProgramAccounts( + programId, + { + filters: [{ + dataSize: 619, + }], + } + ); + const reserveAddresses = reserves.map((account) => account.pubkey.toBase58()); + + const infos = await getMultipleAccounts(reserveAddresses, { api }) + infos.forEach(i => { + const decoded = decodeAccount('reserve', i); + if (decoded === null) return; + const { info: { liquidity } } = decoded; + const amount = liquidity.borrowedAmountWads.toString() / 1e18 + api.add(liquidity.mintPubkey.toString(), amount) + }) +} + +async function tvl(api) { + const connection = await getConnection(api.chain); + const programId = getProgram(api); + + const marketAccounts = await connection.getProgramAccounts( + programId, + { + filters: [{ + dataSize: 290, + }], + } + ); + const marketAuthorities = marketAccounts.map((account) => PublicKey.findProgramAddressSync([account.pubkey.toBytes()], programId)[0]); + return sumTokens2({ owners: marketAuthorities, api }); +} + +module.exports = { + timetravel: false, + solana: { tvl, borrowed, }, + renec: { tvl, borrowed, }, + methodology: + "TVL consists of deposits made to the protocol and like other lending protocols, borrowed tokens are not counted. Coingecko is used to price tokens.", +}; + diff --git a/projects/renegade-fi/index.js b/projects/renegade-fi/index.js new file mode 100644 index 0000000000..5b3503635a --- /dev/null +++ b/projects/renegade-fi/index.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/unwrapLPs") + +const config = { + arbitrum: { owners: ['0x30bD8eAb29181F790D7e495786d4B96d7AfDC518']} +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: sumTokensExport({ ...config[chain], fetchCoValentTokens: true}) + } +}) \ No newline at end of file diff --git a/projects/renzo/index.js b/projects/renzo/index.js index 94b80e7611..4ba6f3fdcd 100644 --- a/projects/renzo/index.js +++ b/projects/renzo/index.js @@ -1,13 +1,15 @@ const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokens2 } = require("../helper/solana"); const L1_EZ_ETH_ADDRESS = "0xbf5495Efe5DB9ce00f80364C8B423567e58d2110"; const L2_EZ_ETH_ADDRESS = ADDRESSES.blast.ezETH; const L1_LOCKBOX_ADDRESS = "0xC8140dA31E6bCa19b287cC35531c2212763C2059"; const L1_PZ_ETH_ADDRESS = "0x8c9532a60E0E7C6BbD2B2c1303F63aCE1c3E9811"; +const SEI_EZ_ETH_ADDRESS = "0x6DCfbF4729890043DFd34A93A2694E5303BA2703"; async function L2Tvl(api) { - return { - [L1_EZ_ETH_ADDRESS]: await api.call({ target: L2_EZ_ETH_ADDRESS, abi: "erc20:totalSupply" }) - } + const targetAddress = api.chain === "sei" ? SEI_EZ_ETH_ADDRESS : L2_EZ_ETH_ADDRESS; + const supply = await api.call({ target: targetAddress, abi: "erc20:totalSupply" }); + return { [L1_EZ_ETH_ADDRESS]: supply }; } async function ethTvl(api) { @@ -18,15 +20,29 @@ async function ethTvl(api) { api.add(L1_PZ_ETH_ADDRESS, pzEthBalance); } -const chains = ["mode", "blast", "bsc", "linea", "arbitrum", "base"] +async function solanaTvl() { + return sumTokens2( + { + tokenAccounts: [ + "9VBi7unB9Sz5eBNUdvQH2xzUENXvNsaiEkP9p2Cabvsy" + ] + } + ) +} + +const chains = ["mode", "blast", "bsc", "linea", "arbitrum", "base", "optimism", "fraxtal","zircuit","sei" ] module.exports = { doublecounted: true, ethereum: { - tvl: ethTvl, + tvl: ethTvl + }, + solana: { + tvl: solanaTvl } } chains.forEach(chain => { module.exports[chain] = { tvl: L2Tvl } -}) \ No newline at end of file +}) + diff --git a/projects/reserve/index.js b/projects/reserve/index.js index 04f20a8752..7880018261 100644 --- a/projects/reserve/index.js +++ b/projects/reserve/index.js @@ -1,8 +1,6 @@ const ADDRESSES = require("../helper/coreAssets.json"); const { sumTokens2, - genericUnwrapCvxDeposit, - unwrapCreamTokens, } = require("../helper/unwrapLPs.js"); const { getStargateLpValues, @@ -15,21 +13,34 @@ const chainConfigs = { deployerAddresses: [ "0xFd6CC4F251eaE6d02f9F7B41D1e80464D3d2F377", "0x5c46b718Cd79F2BBA6869A3BeC13401b9a4B69bB", + "0x1bd20253c49515d348dad1af70ff2c0473fea358", "0x15480f5b5ed98a94e1d36b52dd20e9a35453a38e", "0x43587CAA7dE69C3c2aD0fb73D4C9da67A8E35b0b", + "0x2204ec97d31e2c9ee62ead9e6e2d5f7712d3f1bf" ], rsr: "0x320623b8E4fF03373931769A31Fc52A4E78B5d70", vault: "0xaedcfcdd80573c2a312d15d6bb9d921a01e4fb0f", fromBlock: 16680995, erc4626Wrapped: ["0xaa91d24c2f7dbb6487f61869cd8cd8afd5c5cab2"], + subgraph_url: "https://subgraph.satsuma-prod.com/327d6f1d3de6/reserve/reserve-mainnet/api", }, base: { deployerAddresses: [ "0xf1B06c2305445E34CF0147466352249724c2EAC1", "0x9C75314AFD011F22648ca9C655b61674e27bA4AC", + "0xfd18ba9b2f9241ce40cde14079c1cda1502a8d0a", ], rsr: "0xab36452dbac151be02b16ca17d8919826072f64a", fromBlock: 5000000, + subgraph_url: "https://subgraph.satsuma-prod.com/327d6f1d3de6/reserve/reserve-base/api", + }, + arbitrum: { + deployerAddresses: [ + "0xfd7eb6b208e1fa7b14e26a1fb10ffc17cf695d68" + ], + rsr: "0xCa5Ca9083702c56b481D1eec86F1776FDbd2e594", + fromBlock: 64464546, + subgraph_url: "https://subgraph.satsuma-prod.com/327d6f1d3de6/reserve/reserve-arbitrum/api", }, }; @@ -152,13 +163,8 @@ async function tvl(api) { ); } - await Promise.all( - convexTokensAndOwners.map(([token, owner]) => - genericUnwrapCvxDeposit({ api, token, owner }) - ) - ); - - await unwrapCreamTokens(api.getBalances(), fluxListWithOwner, api.block); + await genericUnwrapCvxDeposit(api, convexTokensAndOwners) + await unwrapCreamTokens(api, fluxListWithOwner); await sumTokens2({ api, ownerTokens, blacklistedTokens }); } @@ -180,5 +186,62 @@ module.exports = { tvl, staking, }, + arbitrum: { + tvl, + staking, + }, methodology: `TVL accounts for the underlying ERC20 collateral which back RTokens.`, }; + + +async function unwrapCreamTokens(api, tokensAndOwners,) { + const [balanceOfTokens, exchangeRates, underlyingTokens] = await Promise.all([ + api.multiCall({ + calls: tokensAndOwners.map(t => ({ + target: t[0], + params: t[1] + })), + abi: 'erc20:balanceOf', + }), + api.multiCall({ + calls: tokensAndOwners.map(t => ({ + target: t[0], + })), + abi: "uint256:exchangeRateStored", + }), + api.multiCall({ + calls: tokensAndOwners.map(t => ({ + target: t[0], + })), + abi: "address:underlying", + }) + ]) + balanceOfTokens.forEach((balanceCall, i) => { + api.add(underlyingTokens[i], balanceCall * exchangeRates[i] / 1e18) + }) +} + +async function genericUnwrapCvxDeposit(api, tokensAndOwners) { + if (!tokensAndOwners.length) return; + const tokens = [...new Set(tokensAndOwners.map((t) => t[0]))]; + const uTokens = await api.multiCall({ abi: "address:curveToken", calls: tokens, permitFailure: true }); + const tokenMapping = {}; + tokens.forEach((token, i) => { + if (uTokens[i]) { + tokenMapping[token] = uTokens[i]; + } + }); + // Filter out tokens without curveToken + const validTokensAndOwners = tokensAndOwners.filter((t) => tokenMapping[t[0]]); + const balances = await api.multiCall({ + calls: validTokensAndOwners.map((t) => ({ + target: t[0], + params: t[1], + })), + abi: "erc20:balanceOf", + }); + balances.forEach((balance, i) => { + const token = validTokensAndOwners[i][0]; + api.add(tokenMapping[token], balance); + }); +} \ No newline at end of file diff --git a/projects/reservoir-protocol/index.js b/projects/reservoir-protocol/index.js new file mode 100644 index 0000000000..c6691b1af9 --- /dev/null +++ b/projects/reservoir-protocol/index.js @@ -0,0 +1,27 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const config = { + ethereum: [ + // https://docs.reservoir.xyz/products/proof-of-reserves + '0x0c7e4342534e6e8783311dCF17828a2aa0951CC7', + '0x9BB2c38F57883E5285b7c296c66B9eEA4769eF80', + '0x99A95a9E38e927486fC878f41Ff8b118Eb632b10', + // '0x31Eae643b679A84b37E3d0B4Bd4f5dA90fB04a61', - exluded RUSD because it is project's own token + ] +} + +Object.keys(config).forEach(chain => { + const funds = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const tokens = await api.multiCall({ abi: 'address:underlying', calls: funds }) + const bals = await api.multiCall({ abi: 'uint256:totalValue', calls: funds }) + const decimals = await api.multiCall({ abi: 'uint8:decimals', calls: tokens }) + bals.forEach((v, i) => bals[i] = v * 10 ** (decimals[i] - 18)) + api.add(tokens, bals) + return api.sumTokens({ + owner: '0x4809010926aec940b550D34a46A52739f996D75D', token: ADDRESSES.ethereum.USDC + }) + } + } +}) \ No newline at end of file diff --git a/projects/resolv-usr/index.js b/projects/resolv-usr/index.js new file mode 100644 index 0000000000..a44f7f9e76 --- /dev/null +++ b/projects/resolv-usr/index.js @@ -0,0 +1,15 @@ +const USR = "0x66a1E37c9b0eAddca17d3662D6c05F4DECf3e110"; + +const erc20 = { + "totalSupply": "uint256:totalSupply" +}; + +async function ethTvl(api) { + api.add(USR, await api.call({ abi: erc20.totalSupply, target: USR })); +} + +module.exports = { + ethereum: { + tvl: ethTvl + } +}; \ No newline at end of file diff --git a/projects/resolv/index.js b/projects/resolv/index.js index 95ba4c2387..705a1cb9bb 100644 --- a/projects/resolv/index.js +++ b/projects/resolv/index.js @@ -1,4 +1,3 @@ -const USR = "0x66a1E37c9b0eAddca17d3662D6c05F4DECf3e110"; const RLP = "0x4956b52aE2fF65D74CA2d61207523288e4528f96"; const erc20 = { @@ -6,7 +5,6 @@ const erc20 = { }; async function ethTvl(api) { - api.add(USR, await api.call({ abi: erc20.totalSupply, target: USR })); api.add(RLP, await api.call({ abi: erc20.totalSupply, target: RLP })); } diff --git a/projects/retrodefi/index.js b/projects/retrodefi/index.js index 46b98b9e7d..92f5bb7852 100644 --- a/projects/retrodefi/index.js +++ b/projects/retrodefi/index.js @@ -1,9 +1,7 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const { staking } = require("../helper/staking"); const { pool2s } = require("../helper/pool2"); -const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { sumTokens2 } = require("../helper/unwrapLPs"); // --- BSC Addresses --- const masterChefContractBsc = "0x738600B15B2b6845d7Fe5B6C7Cb911332Fb89949"; @@ -57,153 +55,24 @@ const pool2StratsPolygon = ["0xB045Ea272229f9c0c94ca36C1e805226c9C8c034"]; const excludePool2Polygon = ["0x312D2eAb1c01C0c3d74f41a3B7Dd5772aD9F3Ca2"]; -const calcTvl = async ( - balances, - chain, - block, - masterchef, - transformAddress, - excludePool2 -) => { - const poolLength = ( - await sdk.api.abi.call({ - abi: abi.poolLength, - target: masterchef, - chain, - block, - }) - ).output; - - const lpPositions = []; - - for (let index = 0; index < poolLength; index++) { - const strat = ( - await sdk.api.abi.call({ - abi: abi.poolInfo, - target: masterchef, - params: index, - chain, - block, - }) - ).output.strat; - - const want = ( - await sdk.api.abi.call({ - abi: abi.poolInfo, - target: masterchef, - params: index, - chain, - block, - }) - ).output.want; - - const strat_bal = ( - await sdk.api.abi.call({ - abi: 'erc20:balanceOf', - target: want, - params: strat, - chain, - block, - }) - ).output; - - const symbol = ( - await sdk.api.abi.call({ - abi: abi.symbol, - target: want, - chain, - block, - }) - ).output; - - if ( - excludePool2.some((addr) => addr.toLowerCase() === want.toLowerCase()) || - symbol.includes("RCUBE") || - symbol.includes("QBERT") || - symbol.includes("pQBERT") - ) { - continue - } else if (symbol.includes("LP")) { - lpPositions.push({ - token: want, - balance: strat_bal, - }); - } else { - sdk.util.sumSingleBalance(balances, `${chain}:${want}`, strat_bal); - } - } - - await unwrapUniswapLPs(balances, lpPositions, block, chain, transformAddress); -}; - -const bscStaking = async (chainBlocks) => { - const balances = {}; - - const transformAddress = i => `bsc:${i}`; - for (const token of stakingTokensBsc) { - await sumTokensAndLPsSharedOwners( - balances, - [[token, false]], - retroStakingsBsc, - chainBlocks["bsc"], - "bsc", - transformAddress - ); - } - - return balances; -}; - -const polygonStaking = async (...params) => { - for (const stakingContract of retroStakingsPolygon) { - return staking(stakingContract, pQBERT)(...params); - } -}; - -const bscTvl = async (chainBlocks) => { - const balances = {}; - - const transformAddress = i => `bsc:${i}`; - - await calcTvl( - balances, - "bsc", - chainBlocks["bsc"], - masterChefContractBsc, - transformAddress, - excludePool2Bsc - ); - - return balances; -}; - -const polygonTvl = async (chainBlocks) => { - const balances = {}; - - const transformAddress = i => `polygon:${i}`; - - await calcTvl( - balances, - "polygon", - chainBlocks["polygon"], - masterChefContractPolygon, - transformAddress, - excludePool2Polygon - ); - - return balances; -}; +async function tvl(api) { + const masterchef = api.chain === "bsc" ? masterChefContractBsc : masterChefContractPolygon; + const blacklistedTokens = excludePool2Bsc.concat(excludePool2Polygon).concat([pQBERT]) + const poolInfos = await api.fetchList({ lengthAbi: abi.poolLength , itemAbi: abi.poolInfo, target: masterchef}) + const tokensAndOwners = poolInfos.map(poolInfo => [poolInfo.want, poolInfo.strat]) + return sumTokens2({ api, tokensAndOwners, blacklistedTokens, }) +} module.exports = { misrepresentedTokens: true, bsc: { - tvl: bscTvl, - staking: bscStaking, + tvl, + staking: staking(retroStakingsBsc, stakingTokensBsc), pool2: pool2s(pool2StratsBsc, excludePool2Bsc), }, polygon: { - tvl: polygonTvl, - staking: polygonStaking, + tvl, + staking: staking(retroStakingsPolygon, pQBERT), pool2: pool2s(pool2StratsPolygon, excludePool2Polygon), }, methodology: diff --git a/projects/return-finance/index.js b/projects/return-finance/index.js index 3efa30dd64..4e3068cd6e 100644 --- a/projects/return-finance/index.js +++ b/projects/return-finance/index.js @@ -10,13 +10,17 @@ const config = { "0xe5c26497D9492AD2328DFEE7dcA240e55cff1779", "0xc2d4d9070236bA4ffefd7cf565eb98d11bFeB8E1", "0x2C2f0FFbFA1B8b9C85400f1726e1bc0892e63D9F", + "0xb41C4126bb6145E8582946E2990ae61ab5b73b76" ], avax: [ "0x0271A46c049293448C2d4794bCD51f953Bf742e8", "0x3A3dAdbca3ec5a815431f45eca33EF1520388Ef2", ], polygon: ["0x0271A46c049293448C2d4794bCD51f953Bf742e8"], - base: ["0xd99d6D4EA1CDa97cC8eaE2A21007C47D3ae54d5F"], + base: [ + "0xd99d6D4EA1CDa97cC8eaE2A21007C47D3ae54d5F", + "0x4d95d8A4705Ca23D6679F6E2974b37CC0e89f632" + ], }; diff --git a/projects/revault/index.js b/projects/revault/index.js index 3806a085a7..3417ee4d61 100644 --- a/projects/revault/index.js +++ b/projects/revault/index.js @@ -10,7 +10,7 @@ async function tvl(api) { } module.exports = { - start: 1634150000, // 13th of October, 2021 + start: '2021-10-13', // 13th of October, 2021 bsc: { tvl, }, diff --git a/projects/reya-bridge/index.js b/projects/reya-bridge/index.js index 759eab1cbe..39287b0152 100644 --- a/projects/reya-bridge/index.js +++ b/projects/reya-bridge/index.js @@ -20,8 +20,9 @@ module.exports = { owners: [ "0x9239609eED7c40C6DDcEC25D247Ef205103590B6", // usdc vault "0xAd7bdD85fdA879fe7771A2546939972F202C1BaE", // eth vault + "0xCbEcd69ceFA64F55b72F8ac288FC5c452819B608" // usdc vault 2 ], - tokens: [ADDRESSES.optimism.USDC, ADDRESSES.optimism.WETH], + tokens: [ADDRESSES.optimism.USDC, ADDRESSES.optimism.WETH, ADDRESSES.optimism.USDC_CIRCLE], }), }, polygon: { @@ -31,8 +32,9 @@ module.exports = { owners: [ "0xC0acBb471465FCf848746D1837d8358aB891546c", // usdc vault "0x72384be7092144cD9a57526B486827E4eA632351", // eth vault + "0xBC31ec84bd7BC2c97B9413F6E473cE96Be153a25" // usdc vault 2 ], - tokens: [ADDRESSES.polygon.USDC, ADDRESSES.polygon.WETH], + tokens: [ADDRESSES.polygon.USDC, ADDRESSES.polygon.WETH, ADDRESSES.polygon.USDC_CIRCLE], }), }, base: { @@ -40,10 +42,11 @@ module.exports = { sumTokens2({ api, owners: [ - "0x77e61C6fcAEe80CA578B818DD583d2b78f99289C", // usdc vault + "0x77e61C6fcAEe80CA578B818DD583d2b78f99289C", // dai vault "0x2b3A8ABa1E055e879594cB2767259e80441E0497", // eth vault + "0xd71629697b71e2df26b4194f43f6eaed3b367ac0", //usdc real vault ], - tokens: [ADDRESSES.base.USDC, ADDRESSES.base.WETH], + tokens: [ADDRESSES.base.USDC, ADDRESSES.base.WETH, ADDRESSES.base.DAI], }), }, arbitrum: { @@ -53,8 +56,9 @@ module.exports = { owners: [ "0xa0E9B6DA89BD0303A8163B81B8702388bE0Fde77", // usdc vault "0xD7BBE2f6D1B52A27D2dAC28298DE3974a3d13047", // eth vault + "0x11B3a7E08Eb2FdEa2745e4CB64648b10B28524A8" // usdc vault 2 ], - tokens: [ADDRESSES.arbitrum.USDC, ADDRESSES.arbitrum.WETH], + tokens: [ADDRESSES.arbitrum.USDC, ADDRESSES.arbitrum.WETH, ADDRESSES.arbitrum.USDC_CIRCLE], }), }, }; diff --git a/projects/reya-perp/index.js b/projects/reya-perp/index.js index 88906971ed..f6a84884be 100644 --- a/projects/reya-perp/index.js +++ b/projects/reya-perp/index.js @@ -2,5 +2,5 @@ const { sumTokensExport } = require('../helper/unwrapLPs') const ADDRESSES = require('../helper/coreAssets.json') module.exports = { - reya: { tvl: sumTokensExport({ owner: '0xA763B6a5E09378434406C003daE6487FbbDc1a80', tokens: [ADDRESSES.reya.RUSD]})} + reya: { tvl: sumTokensExport({ owner: '0xA763B6a5E09378434406C003daE6487FbbDc1a80', tokens: [ADDRESSES.reya.RUSD, "0x4D3fEB76ab1C7eF40388Cd7a2066edacE1a2237D", "0x809B99df4DDd6fA90F2CF305E2cDC310C6AD3C2c", "0x2339D41f410EA761F346a14c184385d15f7266c4", "0xAAB18B45467eCe5e47F85CA6d3dc4DF2a350fd42", ADDRESSES.reya.WETH]})} } \ No newline at end of file diff --git a/projects/reyield-finance/index.js b/projects/reyield-finance/index.js index 41e228a59a..cc74e32241 100644 --- a/projects/reyield-finance/index.js +++ b/projects/reyield-finance/index.js @@ -41,7 +41,7 @@ const chains = [ ] module.exports = { - start: 1695873578, // Sep-28-2023 03:59:38 AM +UTC + start: '2023-09-28', // Sep-28-2023 03:59:38 AM +UTC doublecounted: true, methodology: "TVL is equal to users' running positions' liquidity value plus uncollected fees.", }; diff --git a/projects/rfx-exchange/index.js b/projects/rfx-exchange/index.js new file mode 100644 index 0000000000..ed5b20d6e6 --- /dev/null +++ b/projects/rfx-exchange/index.js @@ -0,0 +1,7 @@ +const { gmxExportsV2 } = require("../helper/gmx"); + +module.exports = { + era: { + tvl: gmxExportsV2({ eventEmitter: '0x9f006f3a4177e645fc872b911cf544e890c82b1a', fromBlock: 46545081 }), + }, +}; diff --git a/projects/rhombus/index.js b/projects/rhombus/index.js new file mode 100644 index 0000000000..b8539b33fc --- /dev/null +++ b/projects/rhombus/index.js @@ -0,0 +1,5 @@ +const { aaveExports } = require("../helper/aave"); + +module.exports = { + klaytn: aaveExports(undefined, undefined, undefined, ['0x3eFC37753ec2501b406F3443cFD8D406B52abEa6'], { v3: true }) +} diff --git a/projects/rikkei-finance/index.js b/projects/rikkei-finance/index.js index 9ce99e76ab..f7438f7513 100644 --- a/projects/rikkei-finance/index.js +++ b/projects/rikkei-finance/index.js @@ -2,12 +2,9 @@ const ADDRESSES = require('../helper/coreAssets.json') const { compoundExports } = require("../helper/compound"); module.exports = { - bsc: { - ...compoundExports( - '0x4f3e801Bd57dC3D641E72f2774280b21d31F64e4', - 'bsc', - '0x157822aC5fa0Efe98daa4b0A55450f4a182C10cA', - ADDRESSES.bsc.WBNB - ) - } + bsc: compoundExports( + '0x4f3e801Bd57dC3D641E72f2774280b21d31F64e4', + '0x157822aC5fa0Efe98daa4b0A55450f4a182C10cA', + ADDRESSES.bsc.WBNB + ) }; \ No newline at end of file diff --git a/projects/rings/index.js b/projects/rings/index.js new file mode 100644 index 0000000000..09362c7d70 --- /dev/null +++ b/projects/rings/index.js @@ -0,0 +1,50 @@ +const sdk = require("@defillama/sdk"); +const { sumTokensExport } = require("../helper/unwrapLPs"); + +module.exports = { + methodology: 'TVL counts the tokens deposited in the boring vaults.', + start: 1733726867 +} + +const config = { + ethereum: { + vaults: [ + '0xd3DCe716f3eF535C5Ff8d041c1A41C3bd89b97aE', + '0x3bcE5CB273F0F148010BbEa2470e7b5df84C7812', + ], + supportedAssets: [ + '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC + '0x98C23E9d8f34FEFb1B7BD6a91B7FF122F4e16F5c', // AAVEUSDC + '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT + '0x23878914EFE38d27C4D67Ab83ed1b93A74D4086a', // AAVEUSDT + '0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f', // GHO + '0x1a88Df1cFe15Af22B3c4c783D4e6F7F9e0C1885d', // STKGHO + '0x6B175474E89094C44Da98b954EedeAC495271d0F', // DAI + '0x83F20F44975D03b1b09e64809B757c47f942BEeA', // SDAI + '0xdC035D45d973E3EC169d2276DDab16f1e407384F', // USDS + '0xa3931d71877C0E7a3148CB7Eb4463524FEc27fbD', // SUSDS + '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', // WETH + '0x4d5F47FA6A74757f35C14fD3a6Ef8E3C9BC514E8', // AAVEWETH + '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', // WSTETH + '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee', // WEETH + '0xd63070114470f685b75B74D60EEc7c1113d33a3D' // USDO MORPHO + ] + }, + sonic: { + vaults: [ + '0xd3DCe716f3eF535C5Ff8d041c1A41C3bd89b97aE', + '0x3bcE5CB273F0F148010BbEa2470e7b5df84C7812' + ], + supportedAssets: [ + '0x29219dd400f2Bf60E5a23d13Be72B486D4038894', // USDC + '0x50c42dEAcD8Fc9773493ED674b675bE577f2634b', // WETH + ] + }, +} + +Object.keys(config).forEach(chain => { + const { vaults, supportedAssets } = config[chain] + module.exports[chain] = { + tvl: sumTokensExport({ owners: vaults, tokens: supportedAssets}) + } +}) \ No newline at end of file diff --git a/projects/risq.js b/projects/risq.js index dd250a7dae..cf25fdac0b 100644 --- a/projects/risq.js +++ b/projects/risq.js @@ -32,7 +32,6 @@ async function tvl(api) { } module.exports = { - start: 10340221, // Aug-25-2021 03:12:42 PM +UTC bsc: { tvl, } diff --git a/projects/rivusdao/index.js b/projects/rivusdao/index.js index 2c901fc67d..618151ac4c 100644 --- a/projects/rivusdao/index.js +++ b/projects/rivusdao/index.js @@ -1,18 +1,23 @@ const rTokens = [ - '0x5e17abe30f0b804730c4e4db0ad217d8c29d05a0', // rsTAO - '0xcD7D22146ea9F26d0208848B6a1A9d1Bb538245A', // rsCOMAI + // '0x5e17abe30f0b804730c4e4db0ad217d8c29d05a0', // rsTAO + // '0xcD7D22146ea9F26d0208848B6a1A9d1Bb538245A', // rsCOMAI '0x3d8ede6231243d56e7896477789a450ce7fd2ad3' // rsNMT - ] +] async function tvl(api) { - const tokens = await api.multiCall({ abi: 'address:wrappedToken', calls: rTokens}) - const supplies = await api.multiCall({ abi: 'erc20:totalSupply', calls: rTokens}) - api.add(tokens, supplies) + const tokens = await api.multiCall({ abi: 'address:wrappedToken', calls: rTokens }) + const supplies = await api.multiCall({ abi: 'erc20:totalSupply', calls: rTokens }) + // const mintedBal = await api.call({ abi: 'erc20:balanceOf', target: rTokens[1], params: '0xA47F6159Ed855Ed7E9ec3Ca339b1B7491777d08E' }) + api.add(tokens, supplies) + // api.add(tokens[1], mintedBal * -1) } module.exports = { methodology: "TVL is calculated as the sum of the total supplies of rsTAO, rsCOMAI and rsNMT tokens.", ethereum: { tvl, - } + }, + hallmarks: [ + [Math.floor(new Date('2024-09-16')/1e3), 'Migration contract was hacked'], + ], }; diff --git a/projects/rize/index.js b/projects/rize/index.js index e5aacc1733..386369069e 100644 --- a/projects/rize/index.js +++ b/projects/rize/index.js @@ -104,7 +104,7 @@ async function naviSui(coinSymbol) { } module.exports = { - start: 1716599207, + start: '2024-05-25', timetravel: false, ethereum: { tvl diff --git a/projects/rlyfun/index.js b/projects/rlyfun/index.js new file mode 100644 index 0000000000..21071e2932 --- /dev/null +++ b/projects/rlyfun/index.js @@ -0,0 +1,14 @@ + +const { get } = require('../helper/http') + +async function tvl(api) { + const { tvl } = await get('https://api.radlock.io/tvl/rlyfun') + return { + 'radix': tvl + } +} + +module.exports = { + timetravel: false, + radixdlt: { tvl } +} diff --git a/projects/robinhood/index.js b/projects/robinhood/index.js index 4f5d002ceb..15a5911755 100644 --- a/projects/robinhood/index.js +++ b/projects/robinhood/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -8,11 +9,7 @@ const config = { ], }, bitcoin: { - owners: [ - "bc1qprdf80adfz7aekh5nejjfrp3jksc8r929svpxk", - "bc1qmxcagqze2n4hr5rwflyfu35q90y22raxdgcp4p", - "bc1ql49ydapnjafl5t2cp9zqpjwe6pdgmxy98859v2" - ], + owners: bitcoinAddressBook.robinhood, }, polygon: { owners: [ diff --git a/projects/rocketpool/abi.json b/projects/rocketpool/abi.json deleted file mode 100644 index e62ad39639..0000000000 --- a/projects/rocketpool/abi.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "rocketNodeStaking.getNodeEffectiveRPLStake": "function getNodeEffectiveRPLStake(address _nodeAddress) view returns (uint256)", - "rocketNodeStaking.getTotalRPLStake": "uint256:getTotalRPLStake", - "rocketNetworkBalances.getTotalETHBalance": "uint256:getTotalETHBalance", - "rocketMinipoolQueue.getTotalLength": "uint256:getTotalLength", - "rocketMinipoolQueue.getTotalCapacity": "uint256:getTotalCapacity", - "rocketDepositPool.getBalance": "uint256:getBalance", - "rocketMinipoolManager.getMinipoolCountPerStatus": "function getMinipoolCountPerStatus(uint256 offset, uint256 limit) view returns (uint256 initialisedCount, uint256 prelaunchCount, uint256 stakingCount, uint256 withdrawableCount, uint256 dissolvedCount)", - "rocketMinipoolManager.getActiveMinipoolCount": "uint256:getActiveMinipoolCount", - "rocketMinipoolManager.getStakingMinipoolCount": "uint256:getStakingMinipoolCount", - "rocketVault.balanceOfToken": "function balanceOfToken(string _networkContractName, address _tokenAddress) view returns (uint256)", - "rocketVault.balanceOf": "function balanceOf(string _networkContractName) view returns (uint256)" -} \ No newline at end of file diff --git a/projects/rocketpool/index.js b/projects/rocketpool/index.js index b62bdf1b73..8b5631eb23 100644 --- a/projects/rocketpool/index.js +++ b/projects/rocketpool/index.js @@ -1,156 +1,101 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk") -const abi = require('./abi.json') +const sdk = require('@defillama/sdk') -const rocketMinipoolManager = '0x6293B8abC1F36aFB22406Be5f96D893072A8cF3a' +const ETH = ADDRESSES.null +const RPL = '0xd33526068d116ce69f19a9ee46f0bd304f21a51f' +const rocketNodeManager = '0x2b52479F6ea009907e46fc43e91064D1b92Fdc86' const rocketVault = '0x3bDC69C4E5e13E52A65f5583c23EFB9636b469d6' -const rocketNodeStaking_contract = '0x3019227b2b8493e45Bf5d25302139c9a2713BF15' - -const weth = ADDRESSES.ethereum.WETH -const rpl = '0xd33526068d116ce69f19a9ee46f0bd304f21a51f' - -async function tvl(timestamp, ethBlock, chainBlocks) { - // Get ETH staked for rETH, which is given by users and Node Operators - // Also get RPL staked by Node Operators to spin up a node - - // Get minipool count per status - let offset = 0 - const limit = 400, statusesCount = 5 - let minipool_count_per_status = new Array(statusesCount).fill(0); - while (true) { // eslint-disable-line - const {output: activeMinipoolCount} = await sdk.api.abi.call({ - target: rocketMinipoolManager, - params: [offset, limit], - abi: abi['rocketMinipoolManager.getMinipoolCountPerStatus'], - block: ethBlock, - chain: 'ethereum' - }) - const activeMinipoolCount_arr = [...Array(statusesCount).keys()].map(i => activeMinipoolCount[i.toString()]) - minipool_count_per_status = minipool_count_per_status.map((sum, idx) => sum + parseInt(activeMinipoolCount[idx])) - if (activeMinipoolCount_arr.reduce((a, b)=> a + parseInt(b), 0) < limit) { break; } - offset += limit +const rocketRewardsPool = '0xEE4d2A71cF479e0D3d0c3c2C923dbfEB57E73111' +const trustedNodeManager = '0xb8e783882b11Ff4f6Cef3C501EA0f4b960152cc9' +const rocketNodeStaking = '0xF18Dc176C10Ff6D8b5A17974126D43301F8EEB95' +const backfill_node_first_block = 21060563 + +const abi = { + getNodeCount: "function getNodeCount() view returns (uint256)", + getNodeAddresses: "function getNodeAddresses(uint256 _offset, uint256 _limit) view returns (address[])", + getNodeDetails: "function getNodeDetails(address _nodeAddress) view returns ((bool exists, uint256 registrationTime, string timezoneLocation, bool feeDistributorInitialised, address feeDistributorAddress, uint256 rewardNetwork, uint256 rplStake, uint256 effectiveRPLStake, uint256 minimumRPLStake, uint256 maximumRPLStake, uint256 ethMatched, uint256 ethMatchedLimit, uint256 minipoolCount, uint256 balanceETH, uint256 balanceRETH, uint256 balanceRPL, uint256 balanceOldRPL, uint256 depositCreditBalance, uint256 distributorBalanceUserETH, uint256 distributorBalanceNodeETH, address withdrawalAddress, address pendingWithdrawalAddress, bool smoothingPoolRegistrationState, uint256 smoothingPoolRegistrationChanged, address nodeAddress))", + getPendingETHRewards: "function getPendingETHRewards() view returns (uint256)", + balanceOf: "function balanceOf(string _networkContractName) view returns (uint256)", + balanceOfToken: "function balanceOfToken(string _networkContractName, address _tokenAddress) view returns (uint256)", + getMemberAt: "function getMemberAt(uint256 _index) view returns (address)", + getMemberCount: "function getMemberCount() view returns (uint256)", + getMemberRPLBondAmount: "function getMemberRPLBondAmount(address _nodeAddress) view returns (uint256)", + getNodeETHProvided: "function getNodeETHProvided(address _nodeAddress) view returns (uint256)", +}; + +const nodeBalances = async (api) => { + /** + Small hack for backfilling: the following code uses a recent contract deployed just 180 days ago. It allows retrieving all the nodeAddresses, + even those prior to this date. If the backfill api's timestamp is earlier than the contract's creation date, we use the creation date as the limit + to continue making calls. We'll then apply a filter to exclude nodeAddresses with registrationTime > api.timestamp + */ + + const block = await api.getBlock() < backfill_node_first_block ? backfill_node_first_block : await api.getBlock() + const nodeApi = new sdk.ChainApi({ chain: api.chain, block }) + const nodeLength = await nodeApi.call({ target: rocketNodeManager, abi: abi.getNodeCount }) + const addresses = await nodeApi.call({ target: rocketNodeManager, abi: abi.getNodeAddresses, params: [0, nodeLength] }); + + const batchSize = 100; + const batchedAddresses = []; + for (let i = 0; i < addresses.length; i += batchSize) { + batchedAddresses.push(addresses.slice(i, i + batchSize)); } - - // Get ETH and RPL balance of multiple rocketpool contracts as well as RPL staked - const [ - {output: rocketDepositPoolBalance}, - {output: rocketTokenRETHBalance}, - {output: totalRPLStake}, - {output: rocketDAONodeTrustedActions_rplBalance}, - {output: rocketAuctionManager_rplBalance} - ] = await Promise.all([ - sdk.api.abi.call({ - target: rocketVault, - params: ['rocketDepositPool'], - abi: abi['rocketVault.balanceOf'], - block: ethBlock, - chain: 'ethereum' - }), - sdk.api.abi.call({ - target: rocketVault, - params: ['rocketTokenRETH'], - abi: abi['rocketVault.balanceOf'], - block: ethBlock, - chain: 'ethereum' - }), - sdk.api.abi.call({ - target: rocketNodeStaking_contract, - abi: abi['rocketNodeStaking.getTotalRPLStake'], - block: ethBlock, - chain: 'ethereum' - }), - sdk.api.abi.call({ - target: rocketVault, - params: ['rocketDAONodeTrustedActions', rpl], - abi: abi['rocketVault.balanceOfToken'], - block: ethBlock, - chain: 'ethereum' - }), - sdk.api.abi.call({ - target: rocketVault, - params: ['rocketAuctionManager', rpl], - abi: abi['rocketVault.balanceOfToken'], - block: ethBlock, - chain: 'ethereum' - }), - ]) - - // ETH staked in Rocketpool pools - const unmatched_minipools = minipool_count_per_status[0] * 16 // Unmatched minipools - const pending_minipools = minipool_count_per_status[1] * 32 // Pending minipools (matched but not staking yet) - const staking_minipools = minipool_count_per_status[2] * 32 // Staking minipools - const withdrawable_minipools = minipool_count_per_status[3] * 32 // Withdrawable minipools - // Deposit pool balance - // rocketDepositPool_balance = solidity.to_float(rp.call("rocketDepositPool.getBalance")) - // rETH collateral from withdrawn minipools - // rETH_collateral_from_withdrawn_minipools = solidity.to_float(w3.eth.getBalance(rp.get_address_by_name("rocketTokenRETH"))) - const ETH_TVL = staking_minipools - + pending_minipools - + unmatched_minipools - + withdrawable_minipools - + parseFloat(rocketDepositPoolBalance) / 1e18 - + parseFloat(rocketTokenRETHBalance) / 1e18 - - // RPL staked - // rpl_tvl += "rocketNodeStaking.getTotalRPLStake")) // RPL staked by Node Operators - // rpl_tvl += solidity.to_float(rp.call("rocketVault.balanceOfToken", "rocketDAONodeTrustedActions", rpl)) // RPL bonded by the oDAO - // rpl_tvl += solidity.to_float(rp.call("rocketVault.balanceOfToken", "rocketAuctionManager", rpl)) // slashed RPL that hasn't been auctioned off yet - const RPL_tvl = parseFloat(totalRPLStake) + parseFloat(rocketDAONodeTrustedActions_rplBalance) + parseFloat(rocketAuctionManager_rplBalance) - -// pending_minipools: ${pending_minipools} -// unmatched_minipools: ${unmatched_minipools} -// withdrawable_minipools: ${withdrawable_minipools} -// rocketDepositPoolBalance: ${rocketDepositPoolBalance / 1e18} -// rocketTokenRETHBalance: ${rocketTokenRETHBalance / 1e18} -// = ETH_TVL: ${ETH_TVL}\n -// rocketNodeStaking.getTotalRPLStake: ${totalRPLStake/1e18} -// rocketDAONodeTrustedActions_rplBalance: ${rocketDAONodeTrustedActions_rplBalance/1e18} -// rocketAuctionManager_rplBalance: ${rocketAuctionManager_rplBalance/1e18} -// = RPL_tvl: ${RPL_tvl/1e18}\n`) - - const balances = { - [weth]: ETH_TVL * 1e18, - [rpl]: RPL_tvl + const results = []; + for (const batch of batchedAddresses) { + const details = await nodeApi.multiCall({ calls: batch.map((address) => ({ target: rocketNodeManager, params: [address] })), abi: abi.getNodeDetails, permitFailure: true }); + const ethProvided = await nodeApi.multiCall({ calls: batch.map((address) => ({ target: rocketNodeStaking, params: [address] })), abi: abi.getNodeETHProvided, permitFailure: true }); + + const filteredResults = []; + if (details) { + for (let i = 0; i < details.length; i++) { + const detail = details[i]; + if (detail && detail.exists && detail.registrationTime <= api.timestamp) { + filteredResults.push({ + detail, + ethProvided: ethProvided[i] || 0, + }); + } + } + } + + results.push({ + details: filteredResults.map((result) => result.detail), + ethProvided: filteredResults.map((result) => result.ethProvided), + }); } - return balances + + const flattenedDetails = results.flatMap((result) => result.details); + const flattenedEthProvided = results.flatMap((result) => result.ethProvided); + + const { minipoolCount, ethMatched, nodeEthProvided} = flattenedDetails.reduce( + (acc, curr, index) => { + if (!curr) return acc; + acc.minipoolCount += Number(curr.minipoolCount) || 0; + acc.ethMatched += Number(curr.ethMatched) || 0; + acc.nodeEthProvided += Number(flattenedEthProvided[index]) || 0; + return acc; + }, + { minipoolCount: 0, ethMatched: 0, nodeEthProvided: 0} + ); + + api.add(ETH, [ethMatched, nodeEthProvided]) } -module.exports = { - methodology: "Rocketpool TVL is ethereum staked by the users and node operators - collateral provided against rETH - staked on beacon chain 32 * activeMinipoolCount + RPL staked by Node Operators to operate a node.", - ethereum: { - tvl, - }, +const tvl = async (api) => { + await nodeBalances(api) + const depositPoolBalance = await api.call({ target: rocketVault, abi: abi.balanceOf, params: ['rocketDepositPool'] }) + api.add(ETH, depositPoolBalance) } -/* -New Rocketpool TVL computation from tvl bot -minipool_count_per_status = call mulitple times rp.call("rocketMinipoolManager.getMinipoolCountPerStatus", offset, limit) - -# staking minipools -eth_tvl += minipool_count_per_status[2] * 32 -# pending minipools (matched but not staking yet) -eth_tvl += minipool_count_per_status[1] * 32 -# unmatched minipools -eth_tvl += minipool_count_per_status[0] * 16 -# withdrawable minipools -eth_tvl += minipool_count_per_status[3] * 32 -# deposit pool balance -eth_tvl += solidity.to_float(rp.call("rocketDepositPool.getBalance")) -# rETH collateral from withdrawn minipools -eth_tvl += solidity.to_float(w3.eth.getBalance(rp.get_address_by_name("rocketTokenRETH"))) - -# staked RPL -rpl_tvl += solidity.to_float(rp.call("rocketNodeStaking.getTotalRPLStake"))) -# RPL bonded by the oDAO -rpl_tvl += solidity.to_float(rp.call("rocketVault.balanceOfToken", "rocketDAONodeTrustedActions", rpl_address)) -# slashed RPL that hasn't been auctioned off yet -rpl_tvl += solidity.to_float(rp.call("rocketVault.balanceOfToken", "rocketAuctionManager", rpl_address)) - -// rocketDAONodeTrustedActions is RPL bonded by the oDAO Member. Rocketpool team considers them users, as they are independent entities. These Bonds can be slashed if the oDAO Member miss behaves. rocketAuctionManager is slashed RPL that hasn't been sold by the protocol yet. They consider it TVL because its RPL that will be sold for ETH and kept as additional rETH collateral - +const staking = async (api) => { + const trustedNodes = await api.fetchList({ target: trustedNodeManager, lengthAbi: abi.getMemberCount, itemAbi: abi.getMemberAt }) + api.add(RPL, await api.multiCall({ calls: trustedNodes.map((node) => ({ target: trustedNodeManager, params: [node] })), abi: abi.getMemberRPLBondAmount })) + return api.sumTokens({ owner: rocketVault, tokens: [RPL] }) +} -Previous incomplete simpler TVL: - - ETH locked in the deposit contract, which would be 32 * rocketMinipoolManager.getActiveMinipoolCount - - RPL locked by Node Operators rocketNodeStaking.getTotalRPLStake -*/ +module.exports = { + start: 1633046400, + methodology: 'TVL represents the total ETH from the minipools', + ethereum: { tvl, staking } +} \ No newline at end of file diff --git a/projects/rockswap/index.js b/projects/rockswap/index.js index 07a9daa14e..dd9f3edd99 100644 --- a/projects/rockswap/index.js +++ b/projects/rockswap/index.js @@ -2,6 +2,6 @@ const { getUniTVL } = require('../helper/unknownTokens'); module.exports = { bitrock: { - tvl: getUniTVL({ factory: '0x02c73ecb9B82e545E32665eDc42Ae903F8AA86a9', useDefaultCoreAssets: true, fetchBalances: true }), + tvl: getUniTVL({ factory: '0x02c73ecb9B82e545E32665eDc42Ae903F8AA86a9', useDefaultCoreAssets: true}), } } diff --git a/projects/rollspace/index.js b/projects/rollspace/index.js index 82f3cb7aa0..5a38b0cdf8 100644 --- a/projects/rollspace/index.js +++ b/projects/rollspace/index.js @@ -1,9 +1,9 @@ const { nullAddress } = require("../helper/tokenMapping"); const { sumTokensExport } = require("../helper/unwrapLPs"); -const BSC_POOL_CONTRACT = '0xB1FcDb8Ed3c2Bc572440b08a5A93984f366BBf3C'; -const BLAST_POOL_CONTRACT = '0x4E927c4bc1432dc7608d2199a77e630cc1676eD7'; -const BASE_POOL_CONTRACT = '0x35a7E7f5A8ECe30585364c28EE5974E3ECe375DC'; +const BSC_POOL_CONTRACT = '0x011b1b59Dac73AA584546dD05bbF300c9D4ecdA0'; +const BLAST_POOL_CONTRACT = '0x7b0DDc2BD91Cf1a7d4e026ebdEcd575Ef760D9B8'; +const BASE_POOL_CONTRACT = '0x0994c10372BB1d994a6EcCcF81E1225da589A010'; const MODE_POOL_CONTRACT = '0xbADaC8BDFdC6Ef7be408e94AbE3ddC6bec783E59'; module.exports = { diff --git a/projects/root-finance/index.js b/projects/root-finance/index.js new file mode 100644 index 0000000000..f78a347648 --- /dev/null +++ b/projects/root-finance/index.js @@ -0,0 +1,70 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const { queryAddresses, sumTokens } = require('../helper/chain/radixdlt'); + +const pools = [ + { + pool: 'component_rdx1cqasw720453g8pr2jc3nxq2h9rrv9cvfjy35q6jhskukqqs0t7qcky', + resource: ADDRESSES.radixdlt.XRD, + }, + { + pool: 'component_rdx1cqz0f5znwhyy2d4q2rhncetm5tfpvu2c73kvfertktkw33drxcawk8', + resource: 'resource_rdx1thrvr3xfs2tarm2dl9emvs26vjqxu6mqvfgvqjne940jv0lnrrg7rw', + }, + { + pool: 'component_rdx1cp5hd3a2daw4vuzx0hywn56ur2pmat7nnytl5v3pv36xky5hkpr84y', + resource: 'resource_rdx1t580qxc7upat7lww4l2c4jckacafjeudxj5wpjrrct0p3e82sq4y75', + }, + { + pool: 'component_rdx1cr87dx5laxnffdkyv4fsrwms3m62vexgye9x9xpxyrv63gzpgwt97d', + resource: ADDRESSES.radixdlt.WETH, + }, + { + pool: 'component_rdx1czuk76y4vhgd44sxly0un2tqegws670dqp0usl2tlsgfkhmdl8dad3', + resource: 'resource_rdx1t5kmyj54jt85malva7fxdrnpvgfgs623yt7ywdaval25vrdlmnwe97', + }, + { + pool: 'component_rdx1cqlfmwmhdmp0ln4gaera4skn3yz30p4k5ssv7lqflgh0rjeakwzs9f', + resource: 'resource_rdx1t4upr78guuapv5ept7d7ptekk9mqhy605zgms33mcszen8l9fac8vf', + }, + // Adding the LSULP Pool + { + pool: 'component_rdx1czmq3me09q7p7g7hgsyaqctfw3he4hl6ypg6em2h7nyd2umk0dhhnq', + resource: 'resource_rdx1thksg5ng70g9mmy9ne7wz0sc7auzrrwy7fmgcxzel2gvp8pj0xxfmf', + }, + // Adding WOWO Pool + { + pool: 'component_rdx1crsgd3yqvfh49599yrfpw08ezjwjuns04970mz2l4dnyxxhwzuecy5', + resource: 'resource_rdx1t4kc5ljyrwlxvg54s6gnctt7nwwgx89h9r2gvrpm369s23yhzyyzlx', + }, + // Adding EARLY Pool + { + pool: 'component_rdx1cr0pr68zxqvmfq2whn4nh22qcg2q5skdm7lt3qwvm6nfr2ccaryjsz', + resource: 'resource_rdx1t5xv44c0u99z096q00mv74emwmxwjw26m98lwlzq6ddlpe9f5cuc7s', + } +]; + +async function fetchData(addresses) { + return await queryAddresses({ addresses }); +} + +async function tvl(api) { + return sumTokens({ api, owners: pools.map((item) => item.pool) }); +} + +async function borrowed(api) { + const [poolData,] = await Promise.all([ + fetchData(pools.map((item) => item.pool)), + ]); + + + pools.forEach((pool, i) => { + const { details } = poolData.find((item) => item.address === pool.pool); + api.add(pools[i].resource, Number(details.state.fields[1].value)); + }); +} + +module.exports = { + radixdlt: { tvl, borrowed }, + timetravel: false, +}; diff --git a/projects/rootstock-collective/index.js b/projects/rootstock-collective/index.js new file mode 100644 index 0000000000..74288207b1 --- /dev/null +++ b/projects/rootstock-collective/index.js @@ -0,0 +1,8 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') + +module.exports = { + rsk: { + tvl: () => ({}), + staking: sumTokensExport({ owner: '0x5db91e24BD32059584bbDb831A901f1199f3d459', tokens: ['0x2aCc95758f8b5F583470bA265Eb685a8f45fC9D5']}) + } +} diff --git a/projects/rosen-bridge/index.js b/projects/rosen-bridge/index.js index 35fbc3262e..b2805905b4 100644 --- a/projects/rosen-bridge/index.js +++ b/projects/rosen-bridge/index.js @@ -1,5 +1,6 @@ const { sumTokensExport } = require("../helper/sumTokens"); const ADDRESSES = require('../helper/coreAssets.json'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { timetravel: false, @@ -40,6 +41,6 @@ module.exports = { }), }, bitcoin: { - tvl: sumTokensExport({ owners: ['bc1qs0852en99dfctv0egj2qxnmc79mhjgn9ap975t']}) + tvl: sumTokensExport({ owners: bitcoinAddressBook.rosenBridge }) } }; diff --git a/projects/rosy-burnt-steak/index.js b/projects/rosy-burnt-steak/index.js index bdbfad1d95..47462e0e9f 100644 --- a/projects/rosy-burnt-steak/index.js +++ b/projects/rosy-burnt-steak/index.js @@ -5,7 +5,7 @@ const STEAK_CONTRACT = '0x3e7ab819878bEcaC57Bd655Ab547C8e128e5b208'; module.exports = { methodology: 'counts the number of ROSY tokens in the Steak contract.', - start: 1711020000, + start: '2024-03-21', sapphire: { tvl: () => ({}), staking: staking(STEAK_CONTRACT, ROSY_TOKEN_CONTRACT) diff --git a/projects/roup/index.js b/projects/roup/index.js index 0d424ca959..edb7374867 100644 --- a/projects/roup/index.js +++ b/projects/roup/index.js @@ -1,16 +1,12 @@ const { sumTokensExport } = require("../helper/sumTokens"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { timetravel: false, methodology: `Tokens bridged via ROUP are counted as TVL`, bitcoin: { tvl: sumTokensExport({ - owners: [ - 'bc1pv5lu5aklz64sye9f4zmnjkfg8j6s2tllu3fem4cs9t0hcrnz5e7qy0qw6e', - 'bc1p2tncs8egnj8e6qt46np3qla70mfx4telu92v4c9hp3pg8khqp37s9lvmfx', - 'bc1phnxqw4gfq349wm2xcqgqk77544ssqwa6ycuhjh7hdxks4mtjg33qrfenw5', - 'bc1pfsu3ts4equ7rdy63dgt7shkqlu2n5kw8p0z7p7c8lsrh2yqg40fsvz4ev3' - ], + owners: bitcoinAddressBook.roup, includeBRC20: true, blacklistedTokens: ['roup'], }), diff --git a/projects/routerprotocol/index.js b/projects/routerprotocol/index.js index c8fafab9c4..0433aa984d 100644 --- a/projects/routerprotocol/index.js +++ b/projects/routerprotocol/index.js @@ -97,7 +97,7 @@ const config = { contractAddress: "0x6e14f48576265272B6CAA3A7cC500a26050Be64E", tokens: [ { name: "usd-coin", address: ADDRESSES.cronos.USDC, decimals: 6 }, - { name: "wrapped-cro", address: "0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23", decimals: 18 }, + { name: "wrapped-cro", address: ADDRESSES.cronos.WCRO_1, decimals: 18 }, { name: "wmatic", address: "0xad79AC3c5a5c15C6B9194F5568e451b3fc3C2B40", decimals: 18 }, { name: "wbnb", address: ADDRESSES.telos.ETH, decimals: 18 }, { name: "wrapped-avax", address: ADDRESSES.shiden.ETH, decimals: 18 }, diff --git a/projects/royco/index.js b/projects/royco/index.js new file mode 100644 index 0000000000..75aa36731e --- /dev/null +++ b/projects/royco/index.js @@ -0,0 +1,19 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +const config = { + ethereum: { factory: '0x75e502644284edf34421f9c355d75db79e343bca', fromBlock: 21244948 }, + arbitrum: { factory: '0x75e502644284edf34421f9c355d75db79e343bca', fromBlock: 277208990 }, + base: { factory: '0x75e502644284edf34421f9c355d75db79e343bca', fromBlock: 22754606 }, +} + +Object.keys(config).forEach(chain => { + const { factory, fromBlock } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: 'event WrappedVaultCreated (address indexed underlyingVaultAddress, address indexed incentivizedVaultAddress, address owner, address inputToken, uint256 frontendFee, string name, string vaultSymbol)', fromBlock, }) + const tokensAndOwners = logs.map(log => [log.underlyingVaultAddress, log.incentivizedVaultAddress]) + return api.sumTokens({ tokensAndOwners }) + + } + } +}) diff --git a/projects/rumi/index.js b/projects/rumi/index.js index 737b047b64..6837416e2b 100644 --- a/projects/rumi/index.js +++ b/projects/rumi/index.js @@ -16,7 +16,6 @@ async function tvl(api) { module.exports = { methodology: 'Total asset value held in the Rumi lend vault and Rumi strategies', - start: 143884813, arbitrum: { tvl: () => ({}), }, diff --git a/projects/rumpel/index.js b/projects/rumpel/index.js new file mode 100644 index 0000000000..f35ddd91be --- /dev/null +++ b/projects/rumpel/index.js @@ -0,0 +1,164 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { getLogs2 } = require("../helper/cache/getLogs") + +const CONTRACTS = { + RUMEPL_POINT_TOKENIZATION_VAULT: "0xe47F9Dbbfe98d6930562017ee212C1A1Ae45ba61", + RUMPEL_WALLET_FACTORY: "0x5774abcf415f34592514698eb075051e97db2937", + ETHENA_LP_STAKING: "0x8707f238936c12c309bfc2B9959C35828AcFc512", + MORPHO_BLUE: "0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb", + ZIRCUIT_RESTAKING_POOL: "0xF047ab4c75cebf0eB9ed34Ae2c186f3611aEAfa6", + FLUID_POSITION_RESOLVER: "0x3E3dae4F30347782089d398D462546eb5276801C", +}; + +const DEPLOYMENT = { + RUMPEL_WALLET_FACTORY: { + block: 20696108, + timestamp: 1725680627000, + }, +}; + +const TOKENS = { + AGETH: "0xe1B4d34E8754600962Cd944B535180Bd758E6c2e", + SUSDE: ADDRESSES.ethereum.sUSDe, + USDE: ADDRESSES.ethereum.USDe, + WSTETH: ADDRESSES.ethereum.WSTETH, + WBTC: ADDRESSES.ethereum.WBTC, + AMPHRETH:"0x5fD13359Ba15A84B76f7F87568309040176167cd", + WEETH: "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee", + WEETHS: "0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88", + MSTETH: "0x49446A0874197839D15395B908328a74ccc96Bc0", + STETH: ADDRESSES.ethereum.STETH, + RSUSDE: "0x82f5104b23FF2FA54C2345F821dAc9369e9E0B26", + RSTETH: "0x7a4effd87c2f3c55ca251080b1343b605f327e3a", + RE7LRT: "0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a", + RE7RWBTC: "0x7F43fDe12A40dE708d908Fb3b9BFB8540d9Ce444", + KUSDE: "0xBE3cA34D0E877A1Fc889BD5231D65477779AFf4e", + KWEETH: "0x2DABcea55a12d73191AeCe59F508b191Fb68AdaC", + DC_WSTETH_COLLATERAL: "0xC329400492c6ff2438472D4651Ad17389fCb843a", + DC_SUSDE_COLLATERAL: "0x19d0D8e6294B7a04a2733FE433444704B791939A", + DC_LBTC_COLLATERAL: "0x9C0823D3A1172F9DdF672d438dec79c39a64f448", + YT_EBTC: "0xeB993B610b68F2631f70CA1cf4Fe651dB81f368e", + YT_WEETHK: "0x7B64b99A1fd80b6c012E354a14ADb352b5916CE1", + YT_AGETH: "0x3568f1d2e8058F6D99Daa17051Cb4a2930C83978", + YT_WEETHS: "0x719B51Dd92B7809A80A2E8c91D89367BF58f1D7A", + YT_SUSDE: "0xbE05538f48D76504953c5d1068898C6642937427", + YT_USDE: "0x5D8B3cd632c58D5CE75C2141C1C8b3b0C209b3ed", + YT_RE7LRT: "0x89E7f4E5210A77Ac0f20511389Df71eC98ce9971", + YT_RSTETH: "0x11CCff2F748a0100dBd457FF7170A54e12064Aba", + YT_AMPHRETH: "0x5dB8a2391a72F1114BbaE30eFc9CD89f4a29F988", +}; + +const FLUID_VAULTS = [ + { VAULT: "0xeAEf563015634a9d0EE6CF1357A3b205C35e028D", TOKEN: TOKENS.WEETH }, + { VAULT: "0x1c6068eC051f0Ac1688cA1FE76810FA9c8644278", TOKEN: TOKENS.WEETHS }, + { VAULT: "0x3996464c0fCCa8183e13ea5E5e74375e2c8744Dd", TOKEN: TOKENS.SUSDE }, + { VAULT: "0xBc345229C1b52e4c30530C614BB487323BA38Da5", TOKEN: TOKENS.SUSDE }, + { VAULT: "0xe210d8ded13Abe836a10E8Aa956dd424658d0034", TOKEN: TOKENS.SUSDE }, +] + +const MORPHO_SUSDE_MARKET_ID = + "0x39d11026eae1c6ec02aa4c0910778664089cdd97c3fd23f68f7cd05e2e95af48"; + +async function tvl(api) { + const owners = await getOwners(api); + + await Promise.all([sumBaseTokens, handleLockedUSDE, handleMorphoSuppliedSUSDE, handleZircuitAssets, handleStrategyTokenBalances, handleFluidPositions].map(async (fn) => fn())); + + async function sumBaseTokens() { + return api.sumTokens({ + owners, tokens: [TOKENS.AGETH, TOKENS.WEETH, TOKENS.USDE, TOKENS.SUSDE, TOKENS.MSTETH, TOKENS.WSTETH, TOKENS.STETH,TOKENS.WBTC,] + }) + } + + + async function handleLockedUSDE() { + const stakes = await api.multiCall({ + target: CONTRACTS.ETHENA_LP_STAKING, + abi: "function stakes(address,address) view returns (uint256 amount,uint152,uint104)", + calls: owners.map((owner) => ({ params: [owner, TOKENS.USDE] })), + }); + api.add(TOKENS.USDE, stakes.map(i => i.amount)) + } + + async function handleMorphoSuppliedSUSDE() { + const positions = await api.multiCall({ + target: CONTRACTS.MORPHO_BLUE, + abi: "function position(bytes32,address) view returns (uint256,uint128,uint128 amount)", + calls: owners.map((owner) => ({ params: [MORPHO_SUSDE_MARKET_ID, owner] })), + }); + api.add(TOKENS.USDE, positions.map(i => i.amount)) + } + + async function handleFluidPositions() { + const positions = await api.multiCall({ + target: CONTRACTS.FLUID_POSITION_RESOLVER, + abi: "function getAllVaultPositions(address) view returns ((uint256,address owner,uint256 supply,uint256)[])", + calls: FLUID_VAULTS.map(({ VAULT }) => ({ params: [VAULT] })), + }); + + for (let i = 0; i < positions.length; i++) { + const rumpelPositions = positions[i].filter(i => owners.includes(i.owner)); + api.add(FLUID_VAULTS[i].TOKEN, rumpelPositions.map(i => i.supply)) + } + } + + async function handleZircuitAssets() { + const assets = [TOKENS.WEETH, TOKENS.WEETHS, TOKENS.USDE, TOKENS.MSTETH, TOKENS.AMPHRETH] + const calls = [] + for (const asset of assets) + for (const owner of owners) + calls.push({ params: [asset, owner] }) + const tokens = calls.map(i => i.params[0]) + const bals = await api.multiCall({ target: CONTRACTS.ZIRCUIT_RESTAKING_POOL, abi: "function balance(address,address) view returns (uint256)", calls, }); + api.add(tokens, bals) + } + + async function handleStrategyTokenBalances() { + const tokens = [ + TOKENS.KWEETH, + TOKENS.KUSDE, + TOKENS.DC_WSTETH_COLLATERAL, + TOKENS.DC_SUSDE_COLLATERAL, + TOKENS.MSTETH, + TOKENS.RSUSDE, + TOKENS.RSTETH, + TOKENS.RE7LRT, + TOKENS.RE7RWBTC, + TOKENS.YT_EBTC, + TOKENS.YT_WEETHK, + TOKENS.YT_AGETH, + TOKENS.YT_WEETHS, + TOKENS.YT_SUSDE, + TOKENS.YT_USDE, + TOKENS.YT_RE7LRT, + TOKENS.YT_RSTETH, + TOKENS.YT_AMPHRETH, + ] + return api.sumTokens({ owners, tokens }) + } +} + +async function getOwners(api) { + const logs = await getLogs2({ + api, + target: CONTRACTS.RUMPEL_WALLET_FACTORY, + topic: "SafeCreated(address,address[],uint256)", + eventAbi: + "event SafeCreated(address indexed safe, address[] indexed owners, uint256 threshold)", + fromBlock: DEPLOYMENT.RUMPEL_WALLET_FACTORY.block, + }); + return logs + .map((log) => log.safe) + .concat(CONTRACTS.RUMEPL_POINT_TOKENIZATION_VAULT); +} + + + +module.exports = { + methodology: + "Sums up the supported tokens in Rumpel Wallets + Deposits in the Rumpel Point Tokenization Vault", + start: DEPLOYMENT.RUMPEL_WALLET_FACTORY.timestamp, + ethereum: { + tvl, + }, +}; diff --git a/projects/run-money/index.js b/projects/run-money/index.js new file mode 100644 index 0000000000..87ebfbc70c --- /dev/null +++ b/projects/run-money/index.js @@ -0,0 +1,32 @@ +const TRACKED_TOKENS = { + aUSDC: '0x4e65fE4DbA92790696d040ac24Aa414708F5c0AB', // Aave USDC on Base + aETH: '0xD4a0e0b9149BCee3C920d2E00b5dE09138fd8bb7' // Aave ETH on Base +}; + +// ClubPool contract address +const CONTRACT_ADDRESS = '0x1089db83561d4c9b68350e1c292279817ac6c8da'; + +async function tvl(api) { + const tokens = Object.values(TRACKED_TOKENS); + + const balances = await api.multiCall({ + abi: 'erc20:balanceOf', + calls: tokens.map(token => ({ + target: token, + params: [CONTRACT_ADDRESS] + })) + }); + + api.addTokens( + tokens, + balances + ); +} + +module.exports = { + methodology: "Measures TVL of Run Money by tracking aUSDC and aETH balances in the ClubPool contract.", + start: 21942754, // Deployment block of ClubPool + base: { + tvl + } +}; \ No newline at end of file diff --git a/projects/ruscet/index.js b/projects/ruscet/index.js new file mode 100644 index 0000000000..c555ed73f5 --- /dev/null +++ b/projects/ruscet/index.js @@ -0,0 +1,11 @@ +const { sumTokens } = require("../helper/chain/fuel") + +async function tvl(api) { + const contractId = '0x8002f2e86302ef9421558d0ae25a68cdfdbec5d27915cc2db49eded220799ecc' + return sumTokens({ api, owner: contractId }) +} + +module.exports = { + fuel: { tvl }, + timetravel: false, +} diff --git a/projects/sablier/index.js b/projects/sablier-legacy/index.js similarity index 90% rename from projects/sablier/index.js rename to projects/sablier-legacy/index.js index 853d27aa1a..f5260b3156 100644 --- a/projects/sablier/index.js +++ b/projects/sablier-legacy/index.js @@ -11,6 +11,20 @@ const blacklistedTokens = [ ADDRESSES.ethereum.MKR, ] +const config = { + ethereum: { + owners: [ + "0xA4fc358455Febe425536fd1878bE67FfDBDEC59a", // v1.0.0 + "0xCD18eAa163733Da39c232722cBC4E8940b1D8888", // v1.1.0 + ] + }, + arbitrum: { owners: ['0xaDB944B478818d95659067E70D2e5Fc43Fa3eDe9'], }, + avax: { owners: ['0x73f503fad13203C87889c3D5c567550b2d41D7a4'], }, + bsc: { owners: ['0x05BC7f5fb7F248d44d38703e5C921A8c16825161'], }, + optimism: { owners: ['0x6C5927c0679e6d857E87367bb635decbcB20F31c'], }, + polygon: { owners: ['0xAC18EAB6592F5fF6F9aCf5E0DCE0Df8E49124C06'], }, +} + 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) @@ -20,8 +34,11 @@ async function getTokens(api, owners, isVesting) { 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); + // Filter vesting tokens + const whitelistedTokens = validTokens.filter(token => { + return isWhitelistedToken(token.symbol, token.token, isVesting); + }); + return whitelistedTokens.map(token => token.token); } async function tvl(api) { @@ -40,7 +57,7 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2022-10-03') / 1e3), 'Vesting tokens are not included in tvl'], ], - start: 1573582731, + start: '2019-11-12', timetravel: false, ronin: { tvl: sumTokensExport({ @@ -54,20 +71,6 @@ module.exports = { } }; -const config = { - ethereum: { - owners: [ - "0xA4fc358455Febe425536fd1878bE67FfDBDEC59a", // v1.0.0 - "0xCD18eAa163733Da39c232722cBC4E8940b1D8888", // v1.1.0 - ] - }, - arbitrum: { owners: ['0xaDB944B478818d95659067E70D2e5Fc43Fa3eDe9'], }, - avax: { owners: ['0x73f503fad13203C87889c3D5c567550b2d41D7a4'], }, - bsc: { owners: ['0x05BC7f5fb7F248d44d38703e5C921A8c16825161'], }, - optimism: { owners: ['0x6C5927c0679e6d857E87367bb635decbcB20F31c'], }, - polygon: { owners: ['0xAC18EAB6592F5fF6F9aCf5E0DCE0Df8E49124C06'], }, -} - Object.keys(config).forEach(chain => { module.exports[chain] = { tvl, vesting } }) \ No newline at end of file diff --git a/projects/sablier-v2/index.js b/projects/sablier-lockup/index.js similarity index 88% rename from projects/sablier-v2/index.js rename to projects/sablier-lockup/index.js index 5f99693128..557bcd413a 100644 --- a/projects/sablier-v2/index.js +++ b/projects/sablier-lockup/index.js @@ -1,6 +1,24 @@ const { isWhitelistedToken } = require('../helper/streamingHelper') const { cachedGraphQuery } = require('../helper/cache') +const config = { + arbitrum: { endpoints: ['8BnGPBojHycDxVo83LP468pUo4xDyCQbtTpHGZXR6SiB'], }, + base: { endpoints: ['3pxjsW9rbDjmZpoQWzc5CAo4vzcyYE9YQyTghntmnb1K'], }, + blast: { endpoints: ['BXoC2ToMZXnTmCjWftQRPh9zMyM7ysijMN54Nxzb2CEY'], }, + avax: { endpoints: ['FdVwZuMV43yCb1nPmjnLQwmzS58wvKuLMPzcZ4UWgWAc'], }, + era: { endpoints: ['GY2fGozmfZiZ3xF2MfevohLR4YGnyxGxAyxzi9zmU5bY'], }, + bsc: { endpoints: ['BVyi15zcH5eUg5PPKfRDDesezMezh6cAkn8LPvh7MVAF'], }, + ethereum: { endpoints: ['5EgaXheiBXZBCkepyGUYAu8pN31Dkbh7bpGtnLPqaT5m'], }, + linea: { endpoints: ['FoJnatzCZKyp9XjZyUBaw1juTb5ydnFvJvWUxS3oRCHZ'], }, + mode: { endpoints: ['5ezGnVwNucVTW45WCb91VBiKBEdiqT4ceHDhh1KGigYG'], }, + optimism: { endpoints: ['6e6Dvs1yDpsWDDREZRqxGi54SVdvTNzUdKpKJxniKVrp'], }, + polygon: { endpoints: ['CsDNYv9XPUMP8vufuwDVKQrVhsxhzzRHezjLFFKZZbrx'], }, + scroll: { endpoints: ['HVcngokCByfveLwguuafrBC34xB65Ne6tpGrXHmqDSrh'], }, + xdai: { endpoints: ['EXhNLbhCbsewJPx4jx5tutNXpxwdgng2kmX1J7w1bFyu'], }, + chz: { endpoints: ['HKvzAuGjrEiza11W48waJy5csbhKpkMLF688arwHhT5f'], }, +} + + async function getTokensConfig(api, isVesting) { const ownerTokens = [] const { endpoints } = config[api.chain] @@ -14,6 +32,7 @@ async function getTokensConfig(api, isVesting) { const owners = contracts.map(i => i.address) let tokens = assets.map(i => i.id) const symbols = assets.map(i => i.symbol) + // Filter vesting tokens tokens = tokens.filter((v, i) => isWhitelistedToken(symbols[i], v, isVesting)) owners.forEach(owner => ownerTokens.push([tokens, owner])) } @@ -29,20 +48,6 @@ async function vesting(api) { return api.sumTokens(await getTokensConfig(api, true)) } -const config = { - ethereum: { endpoints: ['5EgaXheiBXZBCkepyGUYAu8pN31Dkbh7bpGtnLPqaT5m'], }, - arbitrum: { endpoints: ['8BnGPBojHycDxVo83LP468pUo4xDyCQbtTpHGZXR6SiB'], }, - bsc: { endpoints: ['BVyi15zcH5eUg5PPKfRDDesezMezh6cAkn8LPvh7MVAF'], }, - xdai: { endpoints: ['EXhNLbhCbsewJPx4jx5tutNXpxwdgng2kmX1J7w1bFyu'], }, - optimism: { endpoints: ['6e6Dvs1yDpsWDDREZRqxGi54SVdvTNzUdKpKJxniKVrp'], }, - polygon: { endpoints: ['CsDNYv9XPUMP8vufuwDVKQrVhsxhzzRHezjLFFKZZbrx'], }, - avax: { endpoints: ['FdVwZuMV43yCb1nPmjnLQwmzS58wvKuLMPzcZ4UWgWAc'], }, - base: { endpoints: ['3pxjsW9rbDjmZpoQWzc5CAo4vzcyYE9YQyTghntmnb1K'], }, - blast: { endpoints: ['BXoC2ToMZXnTmCjWftQRPh9zMyM7ysijMN54Nxzb2CEY'], }, - scroll: { endpoints: ['HVcngokCByfveLwguuafrBC34xB65Ne6tpGrXHmqDSrh'], }, - era: { endpoints: ['GY2fGozmfZiZ3xF2MfevohLR4YGnyxGxAyxzi9zmU5bY'], }, -} - Object.keys(config).forEach(chain => { module.exports[chain] = { tvl, vesting } }) diff --git a/projects/sacra/index.js b/projects/sacra/index.js new file mode 100644 index 0000000000..363a05c0ee --- /dev/null +++ b/projects/sacra/index.js @@ -0,0 +1,31 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') + +// fantom contracts +const controllerFantom = '0xE5365c31c08d6ee44fdd33394ba279b85557c449'; +const tresuryFantom = "0x146dd6E8f9076dfEE7bE0b115bb165d62874d110"; +const rewardPoolFantom = '0x8E629C4301871d2A07f76366FE421e86855DC690'; + +// real contracts +const controllerReal = '0x6ce857d3037e87465b003aCbA264DDF2Cec6D5E4'; +const tresuryReal = '0xd0C1378c177E961D96c06b0E8F6E7841476C81Ef'; +const rewardPoolReal = '0xb35E67FD20070C3d3dC5EEa29D62e95b707471cA'; + +// sonic contracts +const controllerSonic = '0x75e1e98650c119c4E3dCE3070CE6A5397Ed70c6a'; +const tresurySonic = '0x3bDbd2Ed1A214Ca4ba4421ddD7236ccA3EF088b6'; +const rewardPoolSonic = '0xda08F7DE9923acEe24CE292Ec2b20D45b1522Cb6'; + + +module.exports = { + methodology: `We count the WFTM, USDC and wS on treasuty, reward pool and controller contracts`, + fantom: { + tvl: sumTokensExport({ token: ADDRESSES.fantom.WFTM, owners: [controllerFantom, tresuryFantom, rewardPoolFantom] }) + }, + real: { + tvl: sumTokensExport({ token: ADDRESSES.real.USDC, owners: [controllerReal, tresuryReal, rewardPoolReal] }) + }, + sonic: { + tvl: sumTokensExport({ token: ADDRESSES.sonic.wS, owners: [controllerSonic, tresurySonic, rewardPoolSonic] }) + } +} \ No newline at end of file diff --git a/projects/sailing-portfolios/index.js b/projects/sailing-portfolios/index.js index 40fab41fd1..c07de05ebb 100644 --- a/projects/sailing-portfolios/index.js +++ b/projects/sailing-portfolios/index.js @@ -10,7 +10,7 @@ async function tvl(api) { }) const tokens = await api.multiCall({ abi: 'address[]:getPortfolioAssets', calls: portfolios}) const ownerTokens = portfolios.map((portfolio, i) => [tokens[i], portfolio]) - return api.sumTokens({ ownerTokens, blacklistedTokens: ['0x47a663C082926d0d913cAcB89240c3f4bc409a88'] }) + return api.sumTokens({ ownerTokens, blacklistedTokens: ['0x47a663C082926d0d913cAcB89240c3f4bc409a88','0x2d519b9308aeb0c57921030dd5de4e88c44cec7c'] }) } module.exports = { diff --git a/projects/sailingprotocol/index.js b/projects/sailingprotocol/index.js index 9148042624..c413968e21 100644 --- a/projects/sailingprotocol/index.js +++ b/projects/sailingprotocol/index.js @@ -68,11 +68,6 @@ const tokens = [ "ticker": "QQQ", "sufficientLiquidityForDefiLlamaIndexer": false, }, - { - "address": "0xBa5c32915e2303EA41d1986f5B3AAd0a98B4Fd80", - "ticker": "ETHE", - "sufficientLiquidityForDefiLlamaIndexer": false, - }, { "address": "0xA78Fb2b64Ce2Fb8bBe46968cf961C5Be6eB12924", "ticker": "AAAU", diff --git a/projects/saltyio/index.js b/projects/saltyio/index.js index 5e93dfba86..db13807632 100644 --- a/projects/saltyio/index.js +++ b/projects/saltyio/index.js @@ -10,7 +10,7 @@ const SALT_CONTRACT = '0x0110B0c3391584Ba24Dbf8017Bf462e9f78A6d9F' const STAKING_CONTRACT = '0x7c6f5E73210080b093E724fbdB3EF7bcdd6D468b' module.exports = { - start: 1713700739, + start: '2024-04-21', } Object.keys(config).forEach(chain => { diff --git a/projects/salvor/index.js b/projects/salvor/index.js index ca1f4c2d30..8cc83ddd6e 100644 --- a/projects/salvor/index.js +++ b/projects/salvor/index.js @@ -3,11 +3,45 @@ const { sumTokensExport, nullAddress } = require("../helper/unwrapLPs"); const { staking } = require("../helper/staking"); module.exports.avax = { - start: 1683411200, + start: '2023-05-07', hallmarks: [ [1702501200, "Salvor Lending Launch"] ], - methodology: 'TVL counts AVAX coins in the Salvor Pool address:0xab4fe2d136efd7f8dfce3259a5e3c5e4c0130c80', + methodology: 'TVL counts AVAX coins in the Salvor Pool address:0xab4fe2d136efd7f8dfce3259a5e3c5e4c0130c80 and ERC20 assets in the Salvor Lending Pool address: 0x22e229d14dc80a1ea7ca7637173e8c6c36d60fe8', staking: staking("0x72b73fa1569dF9fF1aE9b29CD5b164Af6c02EbaA", "0xF99516BC189AF00FF8EfFD5A1f2295B67d70a90e"), - tvl: sumTokensExport({ owners: ["0xab4fe2d136efd7f8dfce3259a5e3c5e4c0130c80"], tokens: [ADDRESSES.avax.WAVAX, nullAddress] }), + tvl: sumTokensExport({ + owners: ["0xab4fe2d136efd7f8dfce3259a5e3c5e4c0130c80", "0x22e229d14dc80a1ea7ca7637173e8c6c36d60fe8"], + tokens: [ + ADDRESSES.avax.WAVAX, + ADDRESSES.avax.USDC, + ADDRESSES.avax.USDt, + ADDRESSES.avax.JOE, + "0x420FcA0121DC28039145009570975747295f2329", + "0xAcFb898Cff266E53278cC0124fC2C7C94C8cB9a5", + "0xB8d7710f7d8349A506b75dD184F05777c82dAd0C", + "0x184ff13B3EBCB25Be44e860163A5D8391Dd568c1", + "0x5Ac04b69bDE6f67C0bd5D6bA6fD5D816548b066a", + "0xAAAB9D12A30504559b0C5a9A5977fEE4A6081c6b", + "0x60781C2586D68229fde47564546784ab3fACA982", + "0xec3492a2508DDf4FDc0cD76F31f340b30d1793e6", + "0x8aD25B0083C9879942A64f00F20a70D3278f6187", + "0xE8385CECb013561b69bEb63FF59f4d10734881f3", + "0x65378b697853568da9ff8eab60c13e1ee9f4a654", + "0x4f94b8aef08c92fefe416af073f1df1e284438ec", + "0x201d04f88bc9b3bdacdf0519a95e117f25062d38", + "0x46b9144771cb3195d66e4eda643a7493fadcaf9d", + "0xebb5d4959b2fba6318fbda7d03cd44ae771fc999", + "0x18e3605b13f10016901eac609b9e188cf7c18973", + "0x4d6ec47118f807ace03d3b3a4ee6aa96cb2ab677", + "0x694200a68b18232916353250955be220e88c5cbb", + "0x03f77458e1eb9fa72b8186b573e40b106442f155", + "0x6ec18092ee47fcc8f1fe15899156ff20c64ab3d7", + "0x4a5bb433132b7e7f75d6a9a3e4136bb85ce6e4d5", + "0x8f56421dc48dcce052d9afc80b696291ddaa832a", + "0x56b9f5e181550b40472fd8c10a34e4ee6009c304", + "0xc8e7fb72b53d08c4f95b93b390ed3f132d03f2d5", + "0x7a842a6f4580edd3df41c1f31e0395044de6bc75", + nullAddress + ] + }), }; diff --git a/projects/sanctuary/index.js b/projects/sanctuary/index.js index b65ad97b15..112bb98823 100644 --- a/projects/sanctuary/index.js +++ b/projects/sanctuary/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('scroll', '0xAD71e466d6E9c5CbAC804dBF60dE2543d58B4b5B', { fetchBalances: true, }) +module.exports = uniTvlExport('scroll', '0xAD71e466d6E9c5CbAC804dBF60dE2543d58B4b5B', { }) diff --git a/projects/sandclock/index.js b/projects/sandclock/index.js index 985f49fa9c..8e1aff64ce 100644 --- a/projects/sandclock/index.js +++ b/projects/sandclock/index.js @@ -62,7 +62,6 @@ async function tvl(api) { module.exports = { methodology: 'add underlying asset balances in all the vaults together.', doublecounted: true, - start: 15308000, // The first vault YEARN_VAULT was deployed ethereum: { tvl, staking: staking("0x0a36f9565c6fb862509ad8d148941968344a55d8", "0xba8a621b4a54e61c442f5ec623687e2a942225ef") diff --git a/projects/saru/index.js b/projects/saru/index.js new file mode 100644 index 0000000000..c334269529 --- /dev/null +++ b/projects/saru/index.js @@ -0,0 +1,8 @@ +const { getUniTVL } = require("../helper/unknownTokens") + +module.exports = { + misrepresentedTokens: true, + apechain: { + tvl: getUniTVL({ factory: '0x57bfFa72db682f7eb6C132DAE03FF36bBEB0c459', useDefaultCoreAssets: true }) + } +}; \ No newline at end of file diff --git a/projects/sashimidao/index.js b/projects/sashimidao/index.js index 4c9606bee1..36e3949a2a 100644 --- a/projects/sashimidao/index.js +++ b/projects/sashimidao/index.js @@ -1,6 +1,5 @@ const { stakings } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const sashimidaoStakings = [ "0x7dCb04c9e60B52E23f0F46FE2E5D00B234402dAA", @@ -8,41 +7,15 @@ const sashimidaoStakings = [ ]; const SASHI = "0xb88e3edb378ed7ddef10b86962d97fa0b8defb6d"; // SASHI is not on coingecko yet!!! -const treasuryAddress = "0xD4a23b563019cd148Dc148e69a84535cf8368282"; -const MIM = "0x130966628846bfd36ff31a822705796e8cb8c18d"; -const SASHI_MIM_JLP = "0x71f8DF8A958D5a09694312a79355655F44310084"; - -/*** Bonds TVL Portion (Treasury) *** - * Treasury TVL consists of MIM and Trisolaris JLP balances - ***/ -async function avaxTvl(timestamp, chainBlocks) { - const balances = {}; - - let transformAddress = addr => 'avax:'+addr - - await sumTokensAndLPsSharedOwners( - balances, - [ - [MIM, false], - [SASHI_MIM_JLP, true], - ], - [treasuryAddress], - chainBlocks["avax"], - "avax", - transformAddress - ); - - return balances; -} - module.exports = { hallmarks: [ [1642464000, "Rug Pull"] ], + deadFrom: 1642464000, misrepresentedTokens: true, avax: { staking: stakings(sashimidaoStakings, SASHI), - tvl: avaxTvl, + tvl: () => ({}), }, methodology: "Counts MIM and TLP (SASHI-MIM) on the treasury", }; diff --git a/projects/satlayer/index.js b/projects/satlayer/index.js new file mode 100644 index 0000000000..0cfc17c3c9 --- /dev/null +++ b/projects/satlayer/index.js @@ -0,0 +1,26 @@ + + +const { getLogs2 } = require('../helper/cache/getLogs') +const { getUniqueAddresses } = require('../helper/tokenMapping') +const factory = '0x42a856dbEBB97AbC1269EAB32f3bb40C15102819' + +module.exports = { + methodology: 'Total amount of BTC staked and restaked on SatLayer.' +} + +const config = { + ethereum: { factory, fromBlock: 20564864 }, + bsc: { factory, fromBlock: 42094094 }, + btr: { factory: "0x2E3c78576735802eD94e52B7e71830e9E44a9a1C", fromBlock: 4532898 }, +} + +Object.keys(config).forEach(chain => { + const { factory, fromBlock } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: "event CapChanged(address token, uint256 cap)", fromBlock, }) + const tokens = getUniqueAddresses(logs.map(log => log.token)) + return api.sumTokens({ owner: factory, tokens }) + } + } +}) \ No newline at end of file diff --git a/projects/satori/index.js b/projects/satori/index.js index 585ac7c448..190b1e3c74 100644 --- a/projects/satori/index.js +++ b/projects/satori/index.js @@ -1,21 +1,22 @@ const ADDRESSES = require("../helper/coreAssets.json"); const { sumTokensExport } = require("../helper/unwrapLPs"); +const { sumTokensExport: sumTokensExportOfTon } = require("../helper/chain/ton"); + +const ethereum_LBTC = "0x8236a87084f8B84306f72007F36F2618A5634494"; +const ethereum_PumpBTC = "0xF469fBD2abcd6B9de8E169d128226C0Fc90a012e"; +const base_PumpBTC = "0x23dA5F2d509cb43A59d43C108a43eDf34510eff1"; +const stBTC = "0xf6718b2701D4a6498eF77D7c152b2137Ab28b8A3"; -const USDT_TOKEN_CONTRACT = ADDRESSES.astarzk.USDT; -const EZETH_BASE = ADDRESSES.blast.ezETH; -const EZETH_LINEA = ADDRESSES.blast.ezETH; -const ZK = "0x5A7d6b2F92C77FAD6CCaBd7EE0624E64907Eaf3E"; -const WALLET_ADDR = [ - "0x62e724cB4d6C6C7317e2FADe4A03001Fe7856940", - "0xA59a2365D555b24491B19A5093D3c99b119c2aBb", -]; module.exports = { methodology: - "TVL includes the total token value inside the protocol's liquidity pools.", + "Counts Satori smartcontract balance as TVL..", polygon_zkevm: { tvl: sumTokensExport({ - owners: WALLET_ADDR, - tokens: [USDT_TOKEN_CONTRACT], + owners: [ + "0x62e724cB4d6C6C7317e2FADe4A03001Fe7856940", + "0xA59a2365D555b24491B19A5093D3c99b119c2aBb", + ], + tokens: [ADDRESSES.astarzk.USDT], }), }, era: { @@ -24,7 +25,7 @@ module.exports = { "0x0842b33529516abe86CA8EA771aC4c84FDd0eeE0", "0x48756b37Fd643bB40F669804730024F02900C476", ], - tokens: [ADDRESSES.era.USDC, ZK], + tokens: [ADDRESSES.era.USDC, ADDRESSES.era.ZK], }), }, linea: { @@ -33,7 +34,7 @@ module.exports = { "0xfb371E70eEB32f4054F40514924e77213ca18425", "0xF96116e124eB3F62Ddc6a9cfbdc58d7F8A37c50A", ], - tokens: [ADDRESSES.linea.USDC, EZETH_LINEA], + tokens: [ADDRESSES.linea.USDC, ADDRESSES.blast.ezETH], }), }, scroll: { @@ -51,7 +52,7 @@ module.exports = { "0x668a9711b8d04362876dc5b6177ed362084d5aed", "0x5f075a6a11B2e25DF664Ce7419c274943017B595", ], - tokens: [ADDRESSES.base.USDC, EZETH_BASE], + tokens: [ADDRESSES.base.USDC, ADDRESSES.blast.ezETH,base_PumpBTC], }), }, xlayer: { @@ -72,4 +73,30 @@ module.exports = { tokens: [ADDRESSES.arbitrum.USDC_CIRCLE], }), }, + ton:{ + tvl: sumTokensExportOfTon({ + owners: [ + "EQDrGCJ3V8cMw92Gg8Tf9nfq3piaT_iI3EkCGVF0OUG0vWEh", + ], + tokens: [ADDRESSES.ton.USDT], + }), + }, + bsc:{ + tvl: sumTokensExport({ + owners: [ + "0x3b6F3f7F0e3e8cCa7bC11dFA4a8567A6479Ece54", + "0xD2F244164cd09e5cBb6360c4a17aAF976a34562a" + ], + tokens: [ADDRESSES.bsc.USDC,stBTC], + }), + }, + ethereum:{ + tvl: sumTokensExport({ + owners: [ + "0x0857f8a6e41e1c71f4065daebfe7ddb825cbffde", + "0xA394080628F175472Fee9eB316BD104fAB63FE40" + ], + tokens: [ADDRESSES.ethereum.USDC,ethereum_LBTC,stBTC,ethereum_PumpBTC], + }), + } }; diff --git a/projects/satoshi-perps/index.js b/projects/satoshi-perps/index.js new file mode 100644 index 0000000000..fed2628d8e --- /dev/null +++ b/projects/satoshi-perps/index.js @@ -0,0 +1,7 @@ +const { gmxExports } = require('../helper/gmx') + +module.exports = { + core: { + tvl: gmxExports({ vault: '0x736Cad071Fdb5ce7B17F35bB22f68Ad53F55C207', fromBlock: 20537386, }), + }, +} \ No newline at end of file diff --git a/projects/satoshi-protocol/index.js b/projects/satoshi-protocol/index.js index 93a7a9af2c..8a7f017523 100644 --- a/projects/satoshi-protocol/index.js +++ b/projects/satoshi-protocol/index.js @@ -1,23 +1,27 @@ const { sumTokens2 } = require("../helper/unwrapLPs") const { getLogs } = require("../helper/cache/getLogs"); const AssetConfigSettingEventABI = "event AssetConfigSetting(address asset,uint256 feeIn,uint256 feeOut,uint256 debtTokenMintCap,uint256 dailyMintCap,address oracle,bool isUsingOracle,uint256 swapWaitingPeriod,uint256 maxPrice,uint256 minPrice)"; +const VaultTokenStrategySetEventABI = "event TokenStrategySet(address token, address strategy)"; function createExports({ troveList, nymInformation, // { address, fromBlock } + aaveStrategyVaults, // { address, asset, aToken }[] + pellStrategyVaults, // { address, asset }[] + pellStrategyVaultsV2, // { address, fromBlock }[] }) { return { tvl: async (api) => { const tokens = []; const owners = []; - if(troveList) { + if (troveList) { owners.push(...troveList); const collaterals = await getCollateralsFromTrove(api, troveList); tokens.push(...collaterals); } - if(nymInformation) { + if (nymInformation) { const assetList = await getAssetListFromNymContract(api, nymInformation.address, nymInformation.fromBlock); assetList.forEach(asset => { owners.push(nymInformation.address); @@ -25,6 +29,38 @@ function createExports({ }) } + if (aaveStrategyVaults) { + const calls = [] + const tokens = [] + for (let index = 0; index < aaveStrategyVaults.length; index++) { + const { address: vault, aToken, asset } = aaveStrategyVaults[index]; + tokens.push(asset) + calls.push({ target: aToken, params: vault }) + } + const bals = await api.multiCall({ abi: 'erc20:balanceOf', calls }) + api.add(tokens, bals) + } + + if (pellStrategyVaults) { + const vaults = pellStrategyVaults.map(i => i.address) + const tokens = pellStrategyVaults.map(i => i.asset) + const strategies = await api.multiCall({ abi: 'address:pellStrategy', calls: vaults }) + const calls2 = strategies.map((v, i) => ({ target: v, params: vaults[i] })) + const bals = await api.multiCall({ abi: "function userUnderlyingView(address) external view returns (uint256)", calls: calls2 }) + api.add(tokens, bals) + } + + if (pellStrategyVaultsV2) { + for(let i = 0; i < pellStrategyVaultsV2.length; i++) { + const { address: vaultAddress, fromBlock } = pellStrategyVaultsV2[i]; + const logs = await getLogs({ api, target: vaultAddress, fromBlock, eventAbi: VaultTokenStrategySetEventABI, onlyArgs: true }); + const assets = logs.map(item => item.token); + const calls = assets.map((asset) => ({ target: vaultAddress, params: asset })) + const assetAmounts = await api.multiCall({ abi: "function getPosition(address) external view returns (uint256)", calls: calls }) + api.add(assets, assetAmounts) + } + } + return sumTokens2({ api, tokensAndOwners2: [tokens, owners] }) }, } @@ -36,7 +72,7 @@ async function getCollateralsFromTrove(api, troveList) { } async function getAssetListFromNymContract(api, nymContractAddress, fromBlock) { - const logs = await getLogs({api, target: nymContractAddress, fromBlock, eventAbi: AssetConfigSettingEventABI, onlyArgs: true}); + const logs = await getLogs({ api, target: nymContractAddress, fromBlock, eventAbi: AssetConfigSettingEventABI, onlyArgs: true }); const assetList = logs.map(item => item.asset); return assetList; } @@ -65,10 +101,37 @@ module.exports = { '0xc50D117C21054455aE9602237d3d17ca5Fa91288', // BOB WETH Collateral '0xBDFedF992128CbF10974DC935976116e10665Cc9', // BOB WBTC Collateral '0x8FAE9D3dBeE1c66b84E90df21A1DbdBab9262843', // BOB tBTC Collateral + '0xFFFE50D535aaA9B16499D2fDb3BbD94144ca5336', // BOB SolvBTC Collateral + '0xa0B2325BB635679cCFbf50570edd0C6F3D7dA81e', // BOB SolvBTC.BBN Collateral ], nymInformation: { address: '0x7253493c3259137431a120752e410b38d0c715C2', fromBlock: 4614620, - } + }, + aaveStrategyVaults: [ + { + address: '0x713dD0E14376a6d34D0Fde2783dca52c9fD852bA', + aToken: '0xd6890176e8d912142AC489e8B5D8D93F8dE74D60', // aBOBWBTC + asset: '0x03C7054BCB39f7b2e5B2c7AcB37583e32D70Cfa3', // BOB WBTC + } + ], + pellStrategyVaults: [ + { + address: '0x04485140d6618be431D8841de4365510717df4fd', + asset: '0x03C7054BCB39f7b2e5B2c7AcB37583e32D70Cfa3', // BOB WBTC + } + ], }), -} + bsquared: createExports({ + troveList: [ + '0xa79241206c3008bE4EB4B62A48A4F98303060D4f', // BSquare WBTC Collateral + '0xc6F361db5eC432E95D0A08A9Fbe0d7412971cE6c', // BSquare uBTC Collateral + ], + pellStrategyVaultsV2: [ + { + address: '0x1F745AEC91A7349E4F846Ae1D94915ec4f6cF053', + fromBlock: 11581100, + } + ] + }), +} \ No newline at end of file diff --git a/projects/sboomfi/index.js b/projects/sboomfi/index.js new file mode 100644 index 0000000000..08f9002788 --- /dev/null +++ b/projects/sboomfi/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + sonic: '0x3638Ca700D67D560Be2A2d0DD471640957564829' +}) \ No newline at end of file diff --git a/projects/scallop/index.js b/projects/scallop/index.js index c81835e12b..e665812cdb 100644 --- a/projects/scallop/index.js +++ b/projects/scallop/index.js @@ -30,7 +30,9 @@ async function suiTvl(api) { balanceSheets.forEach((e) => { const coinType = '0x' + e.fields.name.fields.name - const amount = new BigNumber(e.fields.value.fields.cash).toString() + const amount = new BigNumber(e.fields.value.fields.cash) + .minus(e.fields.value.fields.revenue) + .toString() api.add(coinType, amount) }) diff --git a/projects/scientixfinance/index.js b/projects/scientixfinance/index.js index 3d79d2528c..12013268de 100644 --- a/projects/scientixfinance/index.js +++ b/projects/scientixfinance/index.js @@ -15,7 +15,6 @@ const ScixBusd = "0xe8Efb51E051B08614DF535EE192B0672627BDbF9"; const scUsdBusd = "0x53085B02955CFD2F884c58D19B8a35ef5095E8aE"; module.exports = { - start: 10880500, // 09/16/2020 @ 12:00am (UTC+8) bsc: { tvl, staking: staking(VotingEscrow, SCIX), diff --git a/projects/scoreplay/index.js b/projects/scoreplay/index.js index 1ddddeb1a6..b10b7d1d5b 100644 --- a/projects/scoreplay/index.js +++ b/projects/scoreplay/index.js @@ -2,6 +2,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require('../helper/unwrapLPs') module.exports = { - start: 1717958404, + start: '2024-06-09', base: { tvl: sumTokensExport({ owner: '0xFcab8B765FB0BCB05407d16173941e2d1F09DE12', tokens: [ADDRESSES.base.WETH] }) }, } \ No newline at end of file diff --git a/projects/scream/index.js b/projects/scream/index.js index 7ad0fd5a1b..7a683d429c 100644 --- a/projects/scream/index.js +++ b/projects/scream/index.js @@ -1,19 +1,6 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { getCompoundV2Tvl } = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound') const { staking } = require('../helper/staking') -function lending(borrowed) { - return async (...params) => { - const transformAdress = i => `fantom:${i}` - const balances = await getCompoundV2Tvl("0x260e596dabe3afc463e75b6cc05d8c46acacfb09", "fantom", addr => { - if (addr === "0xAd84341756Bf337f5a0164515b1f6F993D194E1f") { - return ADDRESSES.ethereum.TUSD - } - return transformAdress(addr) - }, undefined, undefined, borrowed)(...params) - return Object.fromEntries(Object.entries(balances).filter(b => Number(b[1]) > 1)) - } -} module.exports = { hallmarks: [ @@ -22,7 +9,6 @@ module.exports = { methodology: "Same as compound, we just get all the collateral (not borrowed money) on the lending markets. fUSD is returned as TUSD", fantom: { staking: staking("0xe3d17c7e840ec140a7a51aca351a482231760824", "0xe0654C8e6fd4D733349ac7E09f6f23DA256bF475"), - tvl: lending(false), - borrowed: lending(true), + ...compoundExports2({ comptroller: "0x260e596dabe3afc463e75b6cc05d8c46acacfb09", }), } } diff --git a/projects/scribeswap/index.js b/projects/scribeswap/index.js index 8310f4499a..7278fc49fd 100644 --- a/projects/scribeswap/index.js +++ b/projects/scribeswap/index.js @@ -2,5 +2,5 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { misrepresentedTokens: true, - scroll: { tvl: getUniTVL({ factory: '0xb11826635f9253Bae9C426862b0f100950a71f8f', useDefaultCoreAssets: true, fetchBalances: true, }), }, + scroll: { tvl: getUniTVL({ factory: '0xb11826635f9253Bae9C426862b0f100950a71f8f', useDefaultCoreAssets: true, }), }, } \ No newline at end of file diff --git a/projects/scrollswap/index.js b/projects/scrollswap/index.js index 524ceeeb69..acb846de39 100644 --- a/projects/scrollswap/index.js +++ b/projects/scrollswap/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('scroll', '0x0082123Cf29a85f48Cd977D3000aec145A3B452F', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('scroll', '0x0082123Cf29a85f48Cd977D3000aec145A3B452F', { }) \ No newline at end of file diff --git a/projects/scrollswapfinance/index.js b/projects/scrollswapfinance/index.js index ad28d8a552..5a0d316356 100644 --- a/projects/scrollswapfinance/index.js +++ b/projects/scrollswapfinance/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('scroll', '0xaA4b3b63B0A828dc28b2De7Be6115198B080De09', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('scroll', '0xaA4b3b63B0A828dc28b2De7Be6115198B080De09') \ No newline at end of file diff --git a/projects/seashell/index.js b/projects/seashell/index.js index e78ce92610..82d85d1232 100644 --- a/projects/seashell/index.js +++ b/projects/seashell/index.js @@ -6,7 +6,6 @@ const BLUEBERRY_GLP_COMPOUNDER_CONTRACT = module.exports = { methodology: "Total assets in Seashell's Blueberry GLP Compounder contract", - start: 66190371, arbitrum: { tvl: sumTokensExport({ owner: BLUEBERRY_GLP_COMPOUNDER_CONTRACT, tokens: [SGLP_TOKEN]}), }, diff --git a/projects/securitize/index.js b/projects/securitize/index.js index 97790fae5b..3a8e1b807e 100644 --- a/projects/securitize/index.js +++ b/projects/securitize/index.js @@ -1,15 +1,23 @@ -const ADDRESSES = require('../helper/coreAssets.json') +const CONFIG = { + ethereum: [ + '0x7712c34205737192402172409a8f7ccef8aa2aec', // BUIDL + '0x6a9DA2D710BB9B700acde7Cb81F10F1fF8C89041' // BUIDL-I + ], + polygon: ['0x2893ef551b6dd69f661ac00f11d93e5dc5dc0e99'], // BUIDL + avax: ['0x53fc82f14f009009b440a706e31c9021e1196a2f'], // BUIDL + optimism: ['0xa1cdab15bba75a80df4089cafba013e376957cf5'], // BUIDL + arbitrum: ['0xa6525ae43edcd03dc08e775774dcabd3bb925872'], // BUIDL +} -const BUIDL = "0x7712c34205737192402172409a8f7ccef8aa2aec" +const tvl = async (api) => { + const tokens = CONFIG[api.chain] + const supplies = await api.multiCall({ calls: tokens, abi: 'erc20:totalSupply' }) -module.exports = { - ethereum: { - tvl: async (api) => { - const totalSupply = await api.call({ - target: BUIDL, - abi: 'erc20:totalSupply' - }) - return api.add(ADDRESSES.ethereum.USDC, totalSupply) - } - } -} \ No newline at end of file + supplies.forEach((supply) => { + api.addUSDValue(supply / 1e6) + }) +} + +Object.keys(CONFIG).forEach((chain) => { + module.exports[chain] = { tvl } +}) \ No newline at end of file diff --git a/projects/seer/index.js b/projects/seer/index.js new file mode 100644 index 0000000000..e5fc7b982c --- /dev/null +++ b/projects/seer/index.js @@ -0,0 +1,118 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const config = { + 'ethereum': { + marketFactory: ['0x1F728c2fD6a3008935c1446a965a313E657b7904'], + marketView: '0xAb797C4C6022A401c31543E316D3cd04c67a87fC', + collateralToken: ADDRESSES.ethereum.SDAI + }, + 'xdai': { + marketFactory: ['0x83183DA839Ce8228E31Ae41222EaD9EDBb5cDcf1'], + marketView: '0x995dC9c89B6605a1E8cc028B37cb8e568e27626f', + collateralToken: ADDRESSES.xdai.SDAI + }, +} + +const MARKET_VIEW_ABI = + 'function getMarket(address marketFactory, address market) public view returns (tuple(address id, string marketName, string[] outcomes, address parentMarket, uint256 parentOutcome, address[] wrappedTokens, uint256 outcomesSupply, uint256 lowerBound, uint256 upperBound, bytes32 parentCollectionId, bytes32 conditionId, bytes32 questionId, uint256 templateId, tuple(bytes32 content_hash, address arbitrator, uint32 opening_ts, uint32 timeout, uint32 finalize_ts, bool is_pending_arbitration, uint256 bounty, bytes32 best_answer, bytes32 history_hash, uint256 bond, uint256 min_bond)[] questions, bytes32[] questionsIds, string[] encodedQuestions,bool payoutReported) memory)' + +async function tvl(api) { + const { marketFactory, marketView, collateralToken } = config[api.chain] + // get all markets + const markets = await api.multiCall({ abi: 'address[]:allMarkets', calls: marketFactory }) + const dataCalls = markets.map((v, i) => { + return v.map(val => ({ params: [marketFactory[i], val] })) + }).flat() + + /* + * marketsData is an array of objects with the following structure: + * - id + * - parentMarket + * - parentOutcome + * - wrappedTokens + * - outcomesSupply + */ + const marketsData = (await api.multiCall({ abi: MARKET_VIEW_ABI, calls: dataCalls, target: marketView })).map(market => ({ + id: market.id, + parentMarket: market.parentMarket, + parentOutcome: market.parentOutcome, + wrappedTokens: market.wrappedTokens, + outcomesSupply: (market.wrappedTokens ?? []).map(_ => 0), + })) + + const idIndexMapping = [] + const supplyCalls = [] + marketsData.forEach((marketData, index) => { + marketData.wrappedTokens.forEach((outcomeToken, idx2) => { + idIndexMapping.push([index, idx2]) + supplyCalls.push(outcomeToken) + }) + }) + + const supplies = await api.multiCall({ abi: 'erc20:totalSupply', calls: supplyCalls }) + supplies.forEach((supply, i) => { + const [marketIndex, outcomeIndex] = idIndexMapping[i] + marketsData[marketIndex].outcomesSupply[outcomeIndex] = +supply + }) + + const totalSupply = calculateTotalSupply(marketsData); + + api.add(collateralToken, totalSupply); +} + +/** + * When a child market is created, the parent market's supply is decreased by the amount used to mint the child market. + * This function calculates the total supply of parent markets by merging child market supplies into parent markets + * and summing up the unique supplies. These unique supplies represent the TVL of sDAI backing the parent markets. + */ +function calculateTotalSupply(marketsData) { + const marketSupplies = new Map(); + const processedTokens = new Set(); + + marketsData.forEach((market, index) => { + const supply = market.outcomesSupply + const uniqueSupply = [] + let i = 0 + for (const token of market.wrappedTokens) { + if (!processedTokens.has(token)) { + uniqueSupply.push(supply[i]) + processedTokens.add(token) + } + i++ + } + + marketSupplies.set(market.id, uniqueSupply); + }); + + // Merge child market supplies into parent markets + marketsData.forEach((market) => { + if (market.parentMarket !== ADDRESSES.null) { + const parentSupply = marketSupplies.get(market.parentMarket); + const childSupply = marketSupplies.get(market.id); + + if (parentSupply && childSupply) { + // Add child market supply to the corresponding parent outcome + parentSupply[market.parentOutcome] = (parentSupply[market.parentOutcome] || 0) + childSupply.reduce((a, b) => a > b ? a : b, 0); + marketSupplies.set(market.parentMarket, parentSupply); + } + } + }); + + // Calculate total supply of parent markets (parent markets are backed by sDAI) + let totalSupply = 0; + marketsData.forEach((market) => { + if (market.parentMarket === ADDRESSES.null) { + const marketSupply = marketSupplies.get(market.id); + if (marketSupply) { + totalSupply += marketSupply.reduce((a, b) => a > b ? a : b, 0); + } + } + }); + + return totalSupply; +} + +module.exports = { + ethereum: { tvl }, + xdai: { tvl }, + methodology: 'TVL represents the total quantity of sDAI held in the conditional tokens contract. The sDAI is withdrawn when the participants merge or redeem their tokens.', +} diff --git a/projects/segment-finance/index.js b/projects/segment-finance/index.js index e2c25c3dad..69aa565b7d 100644 --- a/projects/segment-finance/index.js +++ b/projects/segment-finance/index.js @@ -1,5 +1,4 @@ const { compoundExports2 } = require("../helper/compound"); -const { staking } = require("../helper/staking"); module.exports = { methodology: "Same as Compound Finance, we just count all the tokens supplied (not borrowed money) on the lending markets", @@ -8,14 +7,10 @@ module.exports = { ...compoundExports2({ comptroller: "0x57E09c96DAEE58B77dc771B017de015C38060173", cether: "0x5fcea94b96858048433359bb5278a402363328c3", - }), - staking: staking( - [ - "0xC6BcBe182b0F85dBfF6b49DC81CecEe02A16fE57", - ], - "0x5de40c1152c990492eaeaeecc4ecaab788bbc4fd", - "bsc", - ), + }) }, - bob: compoundExports2({ comptroller: "0xcD7C4F508652f33295F0aEd075936Cd95A4D2911", cether: '0xd7c6cc5aef7396182c5d7ebdac66ff674f3ddcf4' }) + bob: compoundExports2({ comptroller: "0xcD7C4F508652f33295F0aEd075936Cd95A4D2911", cether: '0xd7c6cc5aef7396182c5d7ebdac66ff674f3ddcf4' }), + rsk: compoundExports2({ comptroller: "0x2eea8fbA494d5008ba72f80E0091Cc74dB5f9926", cether: '0x8F9958ec0FeeccCf0feC871B7bBB3D8d0B7A4D3c' }), + core: compoundExports2({ comptroller: "0xaba65b87eBEdB2D753b37AeCECD1E168341eE0DD", cether: '0xb57A4b3ccE8d999A1e6B0357c0a31C3808401B42' }), + bsquared: compoundExports2({ comptroller: "0x69a6B3B96b26a15A588081Df17F46d61f625741c", cether: '0xEff5cD04B461247F5008b35074F45Ba0f0b11eFf' }), }; diff --git a/projects/sensi/index.js b/projects/sensi/index.js new file mode 100644 index 0000000000..f8afeaaf7e --- /dev/null +++ b/projects/sensi/index.js @@ -0,0 +1,24 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { staking } = require('../helper/staking') +const SENSI_TOKEN_CONTRACT = '0x63e77cf206801782239d4f126cfa22b517fb4edb' +const SENSI_LOCKING_CONTRACT = '0xc13Aff57B67145012Ef3a4604bDB3f3dA17E114f' +const SENSI_SY_CONTRACT = '0x21B656d3818A1dD07B800c1FE728fB81921af3A3' + +const SY_ABI = { + "getSYPortfolio": "function getSYPortfolio() view returns ((uint256 totalPayToken, uint256 totalBuyInToken, uint256 rewardsInPool, uint256 rewardsLastRun, uint256 lockingLastRun, uint256 SENSICirculatingSupply, uint256 SYNFTCirculatingSupply, uint256 lastMintedSYNFTID, uint256 totalVaults, uint256 totalActiveVaults) SY_Portfolio)" +} + +async function tvl(api) { + const balance_of_SY = await api.call({ abi: SY_ABI.getSYPortfolio, target: SENSI_SY_CONTRACT }) + + const balance_of_SY_TVL = balance_of_SY.totalPayToken + api.add(ADDRESSES.null, balance_of_SY_TVL) +} + +module.exports = { + methodology: 'Counts how many tokens are in Sensi Locks and in SmartYield', + bsc: { + tvl, + staking: staking(SENSI_LOCKING_CONTRACT, SENSI_TOKEN_CONTRACT), + } +} \ No newline at end of file diff --git a/projects/set-protocol/index.js b/projects/set-protocol/index.js index c92c8e6a0b..c6c5dd8474 100644 --- a/projects/set-protocol/index.js +++ b/projects/set-protocol/index.js @@ -25,6 +25,6 @@ } module.exports = { - start: 1554848955, // 04/09/2019 @ 10:29pm (UTC) + start: '2019-04-10', // 04/09/2019 @ 10:29pm (UTC) ethereum: { tvl } } diff --git a/projects/settleton/index.js b/projects/settleton/index.js new file mode 100644 index 0000000000..2411e2d8f4 --- /dev/null +++ b/projects/settleton/index.js @@ -0,0 +1,25 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { fetchURL } = require('../helper/utils'); + +async function fetchTvl(api) { + const response = await fetchURL("https://settleton.finance/apiV2/vaults") + for (const pool of response.data) { + api.add(ADDRESSES.ton.TON, pool.tvl * 1e9) + } +} + + +module.exports = { + methodology: ` + The methodology for calculating the total TVL is based on analyzing liquidity pool data and LP token balances. +For each Vaults we iterate through all LP tokens and calculate their price based on following onchain data: (reserve0, reserve1, total_lp_supply) +For each pool, a calculation is performed to determine the equivalent amount of TON based on the current pool reserves and the share of LP tokens held. +This calculation takes into account the reserve ratios and adjusts the token value to TON. +For multi-indices, the TVL of all pools is summed up, while for single indices, the value of the sole pool is used. The final TVL is represented in TON, and the index price is calculated by dividing the TVL by the total supply of the index. + `.trim(), + timetravel: false, + doublecounted: true, + ton: { + tvl: fetchTvl + } +} diff --git a/projects/sfinance/index.js b/projects/sfinance/index.js index 284e9d3dcb..48e8d9fbfe 100644 --- a/projects/sfinance/index.js +++ b/projects/sfinance/index.js @@ -109,10 +109,10 @@ module.exports = { // #1 susdv2 pool started - // start: 1600758000, // 09/22/2020 @ 03:00:00pm +UTC + // start: '2020-09-22', // 09/22/2020 @ 03:00:00pm +UTC // #2 dfi pool started - // start: 1602345600, // 10/10/2020 @ 04:00:00pm +UTC - start: 1602374400, // 10/11/2020 @ 00:00:00am +UTC + // start: '2020-10-10', // 10/10/2020 @ 04:00:00pm +UTC + start: '2020-10-11', // 10/11/2020 @ 00:00:00am +UTC ethereum: { tvl } diff --git a/projects/shadeprotocol-lend/index.js b/projects/shadeprotocol-lend/index.js index 16ee7d06a8..3a83ae9401 100644 --- a/projects/shadeprotocol-lend/index.js +++ b/projects/shadeprotocol-lend/index.js @@ -1,24 +1,26 @@ -const { get } = require("../helper/http") +const { post } = require("../helper/http") -// Total Collateral Deposited in Vaults -async function tvl(api) { - const data = await get('https://ruvzuawwz7.execute-api.us-east-1.amazonaws.com/prod-analytics-v1/lend') - - let totalValue = 0; +async function getData(api) { + const isoTimestamp = new Date((api.timestamp - 5 * 60 * 60) * 1000).toISOString() + const { data: { lendStatsHistories } } = await post('https://prodv1.securesecrets.org/graphql', { "operationName": "getLendHistory", "variables": { "intervalIso": isoTimestamp }, "query": "query getLendHistory($intervalIso: String!) {\n lendStatsHistories(\n query: {where: {time: {gte: $intervalIso}}, orderBy: {time: \"desc\"}}\n ) {\n averageLtv\n collateralUsd\n debtAmount\n debtUsd\n time\n __typename\n }\n}" }) + return lendStatsHistories[0] +} - for (let i = 0; i < data.collaterals.length; i++) { - // Add the value of each collateral to the total value - totalValue += data.collaterals[i].value; - } +async function tvl(api) { + const data = await getData(api) + api.addUSDValue(data.collateralUsd - data.debtUsd) +} - return { - tether: totalValue - } +async function borrowed(api) { + const data = await getData(api) + api.addUSDValue(data.debtUsd) } + module.exports = { misrepresentedTokens: true, secret: { - tvl + tvl, + borrowed, } } diff --git a/projects/shadow-cl/index.js b/projects/shadow-cl/index.js new file mode 100644 index 0000000000..04f951dc51 --- /dev/null +++ b/projects/shadow-cl/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + sonic: { factory: '0xcD2d0637c94fe77C2896BbCBB174cefFb08DE6d7', fromBlock: 1705910, }, +}) \ No newline at end of file diff --git a/projects/shape/index.js b/projects/shape/index.js new file mode 100644 index 0000000000..cded2dc164 --- /dev/null +++ b/projects/shape/index.js @@ -0,0 +1,15 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + "0x62Edd5f4930Ea92dCa3fB81689bDD9b9d076b57B", + '0xEB06fFa16011B5628BaB98E29776361c83741dd3' + ], + fetchCoValentTokens: true, + }), + }, +}; diff --git a/projects/shardingdao/index.js b/projects/shardingdao/index.js new file mode 100644 index 0000000000..c54a721939 --- /dev/null +++ b/projects/shardingdao/index.js @@ -0,0 +1,14 @@ +const { sumTokensExport } = require("../helper/unwrapLPs"); +const coreAssets = require("../helper/coreAssets.json"); + +const tokens = [ + coreAssets.null, + coreAssets.ethereum.WBTC +]; + +module.exports = { + ethereum: { + tvl: sumTokensExport({ owner: "0x0feCcB11C5B61B3922C511d0f002c0b72D770dCE", tokens: tokens }) + }, + methodology: "Currently TVL is calculated as the sum of the assets locked inside the staking pool, including WBTC and native Ethereum on the contract." +}; diff --git a/projects/sharelock/index.js b/projects/sharelock/index.js index d3810ed4ab..2e200275fd 100644 --- a/projects/sharelock/index.js +++ b/projects/sharelock/index.js @@ -2,6 +2,6 @@ const { getUniTVL} = require("../helper/unknownTokens") module.exports = { era: { - tvl: getUniTVL({ factory: '0xea51CE8A1f9C1Cbbf5B89D9B1dA4A94fB1557866', fetchBalances: true, }) + tvl: getUniTVL({ factory: '0xea51CE8A1f9C1Cbbf5B89D9B1dA4A94fB1557866', }) }, } diff --git a/projects/sharkswap-finance/index.js b/projects/sharkswap-finance/index.js index 50caca0357..5389b3231d 100644 --- a/projects/sharkswap-finance/index.js +++ b/projects/sharkswap-finance/index.js @@ -1,7 +1,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const FACTORY = "0x57592D44eb60011500961EF177BFf8D8691D5a8B" -const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, fetchBalances: true }) +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true }) module.exports = { misrepresentedTokens: true, diff --git a/projects/shekelswap/index.js b/projects/shekelswap/index.js index 90ba666ee6..eaede3fee1 100644 --- a/projects/shekelswap/index.js +++ b/projects/shekelswap/index.js @@ -1,2 +1,2 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('arbitrum', '0xd78BA83aD495695940E97889E7191F717AfaC8E0', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('arbitrum', '0xd78BA83aD495695940E97889E7191F717AfaC8E0', { }) \ No newline at end of file diff --git a/projects/shell/index.js b/projects/shell/index.js index acfc263df7..10fa59cdf3 100644 --- a/projects/shell/index.js +++ b/projects/shell/index.js @@ -21,7 +21,6 @@ const TOKEN_CONTRACTS = [ module.exports = { methodology: 'Sums up the value of all tokens wrapped into Shell v2', - start: 24142587, arbitrum: { tvl: sumTokensExport({ owner: OCEAN_CONTRACT, tokens: TOKEN_CONTRACTS}) }, diff --git a/projects/sherlock/index.js b/projects/sherlock/index.js index 7c11bbbd08..f64a94533d 100644 --- a/projects/sherlock/index.js +++ b/projects/sherlock/index.js @@ -34,6 +34,6 @@ async function tvl(timestamp, block) { module.exports = { methodology: 'We count USDC that has been staked into the contracts (staking pool). Periodically USDC is swept into Aave, so we also count the aUSDC that is held (in a separate contract from the main contract).', - start: 1632861292, // 9/28/2020 @ 8:00pm (UTC) + start: '2021-09-28', // 9/28/2020 @ 8:00pm (UTC) ethereum: { tvl } // tvl adapter } diff --git a/projects/shibaswap/index.js b/projects/shibaswap/index.js index 772fb8ccf3..7502a85dc6 100644 --- a/projects/shibaswap/index.js +++ b/projects/shibaswap/index.js @@ -1,12 +1,13 @@ -const {getUniTVL} = require('../helper/unknownTokens') +const { getUniTVL } = require('../helper/unknownTokens'); -const FACTORY = '0x115934131916c8b277dd010ee02de363c09d037c'; +const FACTORY_ETHEREUM = '0x115934131916c8b277dd010ee02de363c09d037c'; +const FACTORY_SHIBARIUM = '0xc2b4218F137e3A5A9B98ab3AE804108F0D312CBC'; module.exports = { misrepresentedTokens: true, ethereum: { tvl: getUniTVL({ - factory: FACTORY, + factory: FACTORY_ETHEREUM, useDefaultCoreAssets: true, blacklist: [ '0x6ADb2E268de2aA1aBF6578E4a8119b960E02928F', @@ -17,5 +18,11 @@ module.exports = { '0xC1bfcCd4c29813eDe019D00D2179Eea838a67703' ], }) + }, + shibarium: { + tvl: getUniTVL({ + factory: FACTORY_SHIBARIUM, + useDefaultCoreAssets: true, + }) } -}; \ No newline at end of file +}; diff --git a/projects/shibbex/index.js b/projects/shibbex/index.js index 1550053513..d93bb5ae4d 100644 --- a/projects/shibbex/index.js +++ b/projects/shibbex/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport('shibarium', '0x6369e8dFaD8DB8378179D74C187f1D5DEa47Fa9F', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('shibarium', '0x6369e8dFaD8DB8378179D74C187f1D5DEa47Fa9F', { }) \ No newline at end of file diff --git a/projects/shibui/index.js b/projects/shibui/index.js index 5f2242bb84..81d51e4c56 100644 --- a/projects/shibui/index.js +++ b/projects/shibui/index.js @@ -1,58 +1,19 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const { staking } = require("../helper/staking"); const { pool2s } = require("../helper/pool2"); -const CHAINS = ["boba"]; const Boba_SHIBUI = "0xf08ad7c3f6b1c6843ba027ad54ed8ddb6d71169b"; -const Boba_BOBA = ADDRESSES.boba.BOBA; -const Boba_USDT = ADDRESSES.boba.USDT; -const Boba_SHIBUI_WETH = "0xcE9F38532B3d1e00a88e1f3347601dBC632E7a82"; const Boba_SHIBUI_USDT = "0x3f714fe1380ee2204ca499d1d8a171cbdfc39eaa"; -const Boba_4Koyo = "0xDAb3Fc342A242AdD09504bea790f9b026Aa1e709"; -const CHAIN_ORGANISED_DATA = { - boba: () => { - return [ - { - treasuryTokens: [ - [Boba_BOBA, false], - [Boba_USDT, false], - [Boba_SHIBUI_WETH, true], - [Boba_SHIBUI_USDT, true], - ], - treasuryKoyoTokens: [Boba_4Koyo], - treasuryAddresses: [ - "0x9596E01Ad72d2B0fF13fe473cfcc48D3e4BB0f70", // Hot treasury - ], - gaugeTokens: [Boba_SHIBUI_USDT], - gaugeAddresses: [ - "0x6b8f4Fa6E44e923f5A995A87e4d79B3Bb9f8aaa3", // SHIBUI-USDT<>WAGMIv3 - ], - }, - true, - ]; - }, -}; module.exports = { - start: 394825, - boba: { tvl: () => ({}), - pool2: (() => { - const chain = CHAINS[0]; - const [data] = CHAIN_ORGANISED_DATA[chain](); - - return pool2s(data.gaugeAddresses, data.gaugeTokens, chain); - })(), - staking: staking( - "0xabAF0A59Bd6E937F852aC38264fda35EC239De82", - Boba_SHIBUI, - CHAINS[0] - ), + pool2: pool2s([ + "0x6b8f4Fa6E44e923f5A995A87e4d79B3Bb9f8aaa3", // SHIBUI-USDT<>WAGMIv3 + ], [Boba_SHIBUI_USDT]), + staking: staking("0xabAF0A59Bd6E937F852aC38264fda35EC239De82", Boba_SHIBUI), }, } diff --git a/projects/shido-dex/index.js b/projects/shido-dex/index.js new file mode 100644 index 0000000000..5300e5c457 --- /dev/null +++ b/projects/shido-dex/index.js @@ -0,0 +1,4 @@ +const { uniV3GraphExport } = require('../helper/uniswapV3') +module.exports = { + shido: { tvl: uniV3GraphExport({ graphURL: 'https://ljd1t705przomdjt11587.cleavr.xyz/subgraphs/name/shido/mainnet', name: 'shido-dex' }) } +} \ No newline at end of file diff --git a/projects/shield/index.js b/projects/shield/index.js index 526c871f47..9b1b1ac074 100644 --- a/projects/shield/index.js +++ b/projects/shield/index.js @@ -1,19 +1,13 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokens2 } = require('../helper/unwrapLPs') -const USDT = ADDRESSES.bsc.USDT; +const { sumTokensExport } = require('../helper/unwrapLPs') const publicPool = "0x65081C21228dc943f47b1Cdb394Eb8db022bc744"; const privatePool = "0xFa4e13EfAf2C90D6Eaf5033A4f3cB189ee4eF189"; const pools = [publicPool, privatePool]; -async function tvl(timestamp, _, { bsc: block }) { - return sumTokens2({ chain: 'bsc', block, owners: pools, tokens: [USDT]}) -} - module.exports = { methodology: 'Dual liquidity pool is an innovation by Shield that allows the private pool to hedge the market making risk, while the low-risk public pool can accommodate liquidity to guarantee abundant liquidity on the market. TVL on Shield should combine liquidity from both public pool and private pool.', - start: 11160281, // Sep-23-2021 08:37:45 AM +UTC bsc: { - tvl, + tvl: sumTokensExport({ owners: pools, token: ADDRESSES.bsc.USDT}), }, } diff --git a/projects/shoebillFinance-v2/index.js b/projects/shoebillFinance-v2/index.js index 720f27cd0e..61421cb7fe 100644 --- a/projects/shoebillFinance-v2/index.js +++ b/projects/shoebillFinance-v2/index.js @@ -1,5 +1,6 @@ const { compoundExports2 } = require("../helper/compound"); const { mergeExports } = require("../helper/utils"); +const { aaveExports } = require("../helper/aave"); module.exports = mergeExports([ { @@ -87,4 +88,8 @@ module.exports = mergeExports([ cether: "0x4dA697a89ea1D166881362b56E6863294820eC97", }), }, + { + zeta: aaveExports(undefined, undefined, undefined, ['0x2B6647f63f6Fab5c73e96FBf974f4ed2AB8a4308'], { v3: true }) + } + ]); diff --git a/projects/shprd/index.js b/projects/shprd/index.js index 843600e621..a3073bf829 100644 --- a/projects/shprd/index.js +++ b/projects/shprd/index.js @@ -21,7 +21,7 @@ async function tvl(api) { module.exports = { - start: 1688162400, + start: '2023-07-01', hallmarks: [ [1695396647, "Fees distribution #1"], [1705582439, "Fees distribution #2"], diff --git a/projects/sigmao/index.js b/projects/sigmao/index.js index 01cf185e77..ac0acd04b5 100644 --- a/projects/sigmao/index.js +++ b/projects/sigmao/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { sumTokensExport } = require('../helper/sumTokens') module.exports = { diff --git a/projects/sigmausd/index.js b/projects/sigmausd/index.js index 81e46d3f51..e191e5297d 100644 --- a/projects/sigmausd/index.js +++ b/projects/sigmausd/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { nullAddress } = require('../helper/tokenMapping') const { sumTokensExport } = require('../helper/chain/ergo') diff --git a/projects/silkroad-fbifunds/index.js b/projects/silkroad-fbifunds/index.js index 3adb8f9224..8107e70c84 100644 --- a/projects/silkroad-fbifunds/index.js +++ b/projects/silkroad-fbifunds/index.js @@ -1,14 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const config = { - bitcoin: { - owners: [ - "bc1qa5wkgaew2dkv56kfvj49j0av5nml45x9ek9hz6", //https://www.reddit.com/r/CryptoCurrency/comments/li1fw7/btc_silkroad_stash_seized_nov_2020_by_the_feds/ - 'bc1qmxjefnuy06v345v6vhwpwt05dztztmx4g3y7wp', - 'bc1qf2yvj48mzkj7uf8lc2a9sa7w983qe256l5c8fs', - 'bc1qe7nk2nlnjewghgw4sgm0r89zkjzsurda7z4rdg' - ], - }, -} - +const config = { bitcoin: { owners: bitcoinAddressBook.silkroad } } module.exports = cexExports(config) \ No newline at end of file diff --git a/projects/silo-v2/index.js b/projects/silo-v2/index.js new file mode 100644 index 0000000000..14659c27db --- /dev/null +++ b/projects/silo-v2/index.js @@ -0,0 +1,110 @@ +const sdk = require('@defillama/sdk') +const { sumTokens2 } = require('../helper/unwrapLPs') +const { getLogs } = require('../helper/cache/getLogs') + +const XAI = '0xd7c9f0e536dc865ae858b0c0453fe76d13c3beac' +const blacklistedSilos = ["0x6543ee07cf5dd7ad17aeecf22ba75860ef3bbaaa",]; + +const getAssetAbiV2 = "address:asset"; +const getAssetStateAbiV2 = 'function getTotalAssetsStorage(uint8 _assetType) external view returns (uint256 totalAssetsByType)'; + +const configV2 = { + sonic: { + factories: [ + { + START_BLOCK: 2672166, + SILO_FACTORY: '0xa42001d6d2237d2c74108fe360403c4b796b7170', // Silo V2 Sonic (Main) + } + ] + }, + arbitrum: { + factories: [ + { + START_BLOCK: 291201890, + SILO_FACTORY: '0xf7dc975C96B434D436b9bF45E7a45c95F0521442', // Silo V2 Arbitrum (Main) + } + ] + } +} + +async function tvl(api) { + // Handle V2 silos + let toaV2 = []; + if(configV2[api.chain]) { + const siloArrayV2 = await getSilosV2(api); + const assetsV2 = await api.multiCall({ + abi: getAssetAbiV2, + calls: siloArrayV2.map(i => ({ target: i })), + }); + toaV2 = assetsV2.map((asset, i) => [[asset], siloArrayV2[i]]); + } + + return sumTokens2({ api, ownerTokens: toaV2, blacklistedTokens: [XAI], }); +} + +async function borrowed(api) { + if(configV2[api.chain]) { + // Handle V2 silos + const siloArrayV2 = await getSilosV2(api); + + // Get asset address for each silo + const siloAssets = await api.multiCall({ + abi: getAssetAbiV2, + calls: siloArrayV2.map(i => ({ target: i })), + }); + + // Get total borrow amount for each silo (AssetType.DEBT = 2) + const borrowAmounts = await api.multiCall({ + abi: getAssetStateAbiV2, + calls: siloArrayV2.map(i => ({ target: i, params: [2] })), + }); + + // Add borrow amounts for V2 silos + siloAssets.forEach((asset, index) => { + if (asset.toLowerCase() === XAI) return; + return api.add(asset, borrowAmounts[index]) + }); + } +} + +async function getSilosV2(api) { + const chain = api.chain; + let logs = []; + let siloAddresses = []; + if(configV2[chain]) { + for(let factory of configV2[chain].factories) { + const { SILO_FACTORY, START_BLOCK } = factory; + let logChunk = await getLogs({ + api, + target: SILO_FACTORY, + fromBlock: START_BLOCK, + eventAbi: 'event NewSilo(address indexed implementation, address indexed token0, address indexed token1, address silo0, address silo1, address siloConfig)', + }); + logs = [...logs, ...logChunk]; + } + + siloAddresses = logs.flatMap((log) => { + + let silo0 = log.args[3]; + let silo1 = log.args[4]; + + return [silo0, silo1].filter( + (address) => blacklistedSilos.indexOf(address.toLowerCase()) === -1 + ); + }); + + } + + return siloAddresses; +} + + +module.exports = { + methodology: `We calculate TVL by interacting with Silo Factory smart contracts on Ethereum, Arbitrum, Base & Optimism. For Ethereum, it queries Silo(Main-V2)(0xa42001d6d2237d2c74108fe360403c4b796b7170). On Arbitrum, we query the Silo Arbitrum factory (Main-V2)(0xf7dc975C96B434D436b9bF45E7a45c95F0521442), we query the factories to obtain the addresses of Silos, retrieve the assets of each Silo, and then calculate the sum of the deposited tokens, borrowed amounts are calculated separately from TVL.`, + // ethereum: { tvl, borrowed, }, + arbitrum: { tvl, borrowed, }, + // optimism: { tvl, borrowed, }, + // base: { tvl, borrowed, }, + sonic: { tvl, borrowed, }, + hallmarks: [] +} \ No newline at end of file diff --git a/projects/silo/index.js b/projects/silo/index.js index d2d47ae58f..31ddacc418 100644 --- a/projects/silo/index.js +++ b/projects/silo/index.js @@ -1,16 +1,19 @@ const sdk = require('@defillama/sdk') const { sumTokens2 } = require('../helper/unwrapLPs') const { getLogs } = require('../helper/cache/getLogs') -const getAssetsAbi = "address[]:getAssets" -const getAssetStateAbi = 'function getAssetsWithState() view returns (address[] assets, tuple(address collateralToken, address collateralOnlyToken, address debtToken, uint256 totalDeposits, uint256 collateralOnlyDeposits, uint256 totalBorrowAmount)[] assetsStorage)' +const XAI = '0xd7c9f0e536dc865ae858b0c0453fe76d13c3beac' +const blacklistedSilos = ["0x6543ee07cf5dd7ad17aeecf22ba75860ef3bbaaa",]; + +const getAssetsAbiV1 = "address[]:getAssets" +const getAssetStateAbiV1 = 'function getAssetsWithState() view returns (address[] assets, tuple(address collateralToken, address collateralOnlyToken, address debtToken, uint256 totalDeposits, uint256 collateralOnlyDeposits, uint256 totalBorrowAmount)[] assetsStorage)' -const config = { +const configV1 = { ethereum: { factories: [ { START_BLOCK: 15307294, - SILO_FACTORY: '0x4D919CEcfD4793c0D47866C8d0a02a0950737589', // Silo Ethereum (Original) + SILO_FACTORY: '0x4D919CEcfD4793c0D47866C8d0a02a0950737589', // Silo Ethereum (Legacy) }, { START_BLOCK: 17391885, @@ -19,6 +22,10 @@ const config = { { START_BLOCK: 17782576, SILO_FACTORY: '0x2c0fA05281730EFd3ef71172d8992500B36b56eA' // Silo Ethereum (LLAMA Edition) + }, + { + START_BLOCK: 20367992, + SILO_FACTORY: '0xB7d391192080674281bAAB8B3083154a5f64cd0a', // Silo Ethereum (Main) } ] }, @@ -26,7 +33,7 @@ const config = { factories: [ { START_BLOCK: 51894508, - SILO_FACTORY: '0x4166487056A922D784b073d4d928a516B074b719', // Silo Arbitrum (Original) + SILO_FACTORY: '0x4166487056A922D784b073d4d928a516B074b719', // Silo Arbitrum (Main) } ] }, @@ -34,45 +41,57 @@ const config = { factories: [ { START_BLOCK: 120480601, - SILO_FACTORY: '0x6B14c4450a29Dd9562c20259eBFF67a577b540b9', // Silo Optimism (Original) + SILO_FACTORY: '0x6B14c4450a29Dd9562c20259eBFF67a577b540b9', // Silo Optimism (Main) + } + ] + }, + base: { + factories: [ + { + START_BLOCK: 16262586, + SILO_FACTORY: '0x408822E4E8682413666809b0655161093cd36f2b', // Silo Base (Main) } ] }, } -const XAI = '0xd7c9f0e536dc865ae858b0c0453fe76d13c3beac' -const fallbackBlacklist = ["0x6543ee07cf5dd7ad17aeecf22ba75860ef3bbaaa",]; - async function tvl(api) { - const siloArray = await getSilos(api) - const assets = await api.multiCall({ - abi: getAssetsAbi, - calls: siloArray, - }) + // Handle V1 silos + let toaV1 = []; + if(configV1[api.chain]) { + const siloArray = await getSilosV1(api); + const assets = await api.multiCall({ + abi: getAssetsAbiV1, + calls: siloArray, + }); + toaV1 = assets.map((v, i) => ([v, siloArray[i]])); + } - const toa = assets.map((v, i) => ([v, siloArray[i]])) - return sumTokens2({ api, ownerTokens: toa, blacklistedTokens: [XAI], }) + return sumTokens2({ api, ownerTokens: toaV1, blacklistedTokens: [XAI], }); } async function borrowed(api) { - const siloArray = await getSilos(api) - const assetStates = await api.multiCall({ - abi: getAssetStateAbi, - calls: siloArray.map(i => ({ target: i })), - }); - assetStates.forEach(({ assets, assetsStorage }) => { - assetsStorage - .forEach((i, j) => { - if (assets[j].toLowerCase() === XAI) return; - return api.add(assets[j], i.totalBorrowAmount) - }) - }) + // Handle V1 silos + if(configV1[api.chain]) { + const siloArray = await getSilosV1(api); + const assetStates = await api.multiCall({ + abi: getAssetStateAbiV1, + calls: siloArray.map(i => ({ target: i })), + }); + assetStates.forEach(({ assets, assetsStorage }) => { + assetsStorage + .forEach((i, j) => { + if (assets[j].toLowerCase() === XAI) return; + return api.add(assets[j], i.totalBorrowAmount) + }) + }) + } } -async function getSilos(api) { +async function getSilosV1(api) { const chain = api.chain let logs = []; - for(let factory of config[chain].factories) { + for(let factory of configV1[chain].factories) { const { SILO_FACTORY, START_BLOCK, } = factory; let logChunk = await getLogs({ api, @@ -83,16 +102,18 @@ async function getSilos(api) { logs = [...logs, ...logChunk]; } - return logs.map((log) => `0x${log.topics[1].substring(26)}`).filter((address) => fallbackBlacklist.indexOf(address.toLowerCase()) === -1); + return logs.map((log) => `0x${log.topics[1].substring(26)}`).filter((address) => blacklistedSilos.indexOf(address.toLowerCase()) === -1); } module.exports = { - methodology: `We calculate TVL by interacting with Silo Factory smart contracts on Ethereum and Arbitrum. For Ethereum, it queries Silo(Original)(0x4D919CEcfD4793c0D47866C8d0a02a0950737589), (Convex Factory)(0x6d4A256695586F61b77B09bc3D28333A91114d5a), and (LLAMA Edition)(0x2c0fA05281730EFd3ef71172d8992500B36b56eA). On Arbitrum, we query the Silo Arbitrum factory(0x4166487056A922D784b073d4d928a516B074b719) to obtain the addresses of Silos, retrieve the assets of each Silo, and then calculates the sum of the deposited tokens, borrowed amount are exported separately`, + methodology: `We calculate TVL by interacting with Silo Factory smart contracts on Ethereum, Arbitrum, Base & Optimism. For Ethereum, it queries (Main-V1)(0xB7d391192080674281bAAB8B3083154a5f64cd0a), (Legacy-V1)(0x4D919CEcfD4793c0D47866C8d0a02a0950737589), (Convex Factory-V1)(0x6d4A256695586F61b77B09bc3D28333A91114d5a), and (LLAMA Edition-V1)(0x2c0fA05281730EFd3ef71172d8992500B36b56eA). On Arbitrum, we query the Silo Arbitrum factory (Main-V1)(0x4166487056A922D784b073d4d928a516B074b719), On Optimism, we query the Silo Optimism factory (Main-V1)(0x6B14c4450a29Dd9562c20259eBFF67a577b540b9), On Base, we query the Silo Base factory (Main-V1)(0x408822E4E8682413666809b0655161093cd36f2b), we query the to obtain the addresses of Silos, retrieve the assets of each Silo, and then calculates the sum of the deposited tokens, borrowed amount are exported separately.`, ethereum: { tvl, borrowed, }, arbitrum: { tvl, borrowed, }, optimism: { tvl, borrowed, }, + base: { tvl, borrowed, }, + sonic: { tvl, borrowed, }, hallmarks: [ [1692968400, "Launch CRV market"] ] -} +} \ No newline at end of file diff --git a/projects/silostake/index.js b/projects/silostake/index.js index 101c07d4d9..0a54e7cfa7 100644 --- a/projects/silostake/index.js +++ b/projects/silostake/index.js @@ -36,7 +36,7 @@ Object.keys(config).forEach(chain => { // Logic for calculating TVL - just get total ustake. let state = await getState(chain, hub); - let total_ustake = state['total_ustake']; + let total_ustake = state['total_utoken']; api.add(coinGeckoId, total_ustake / 10 ** 6, { skipChain: true }); diff --git a/projects/silverswap/index.js b/projects/silverswap/index.js new file mode 100644 index 0000000000..a8882973d8 --- /dev/null +++ b/projects/silverswap/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + sonic: { factory: '0xb860200BD68dc39cEAfd6ebb82883f189f4CdA76', fromBlock: 186117, isAlgebra: true, } +}) diff --git a/projects/single/index.js b/projects/single/index.js index 54da257086..b573175c5f 100644 --- a/projects/single/index.js +++ b/projects/single/index.js @@ -101,7 +101,7 @@ const getHelpers = (chain) => { } module.exports = { - start: 1643186078, + start: '2022-01-26', // if we can backfill data with your adapter. Most SDK adapters will allow this, but not all. For example, if you fetch a list of live contracts from an API before querying data on-chain, timetravel should be 'false'. //if you have used token substitutions at any point in the adapter this should be 'true'. misrepresentedTokens: true, diff --git a/projects/singularityDAO/index.js b/projects/singularityDAO/index.js index b21c601368..ab355cf205 100644 --- a/projects/singularityDAO/index.js +++ b/projects/singularityDAO/index.js @@ -1,10 +1,8 @@ const ADDRESSES = require('../helper/coreAssets.json') const abi = require("./abi.json"); const { cachedGraphQuery } = require('../helper/cache') -const sdk = require("@defillama/sdk"); const { sumTokens2 } = require("../helper/unwrapLPs"); -const { getParamCalls } = require("../helper/utils"); const AGIX_TOKEN = "0x5B7533812759B45C2B44C19e320ba2cD2681b542"; const NUNET_TOKEN = "0xF0d33BeDa4d734C72684b5f9abBEbf715D0a7935"; @@ -27,7 +25,7 @@ const graphEndpoint = "https://singularitydao.ai/api/dynaset-server/api/graphql"; -async function tvl(_, block) { +async function tvl(api) { const blacklistedTokens = [ SDAO_TOKEN, LP_TOKEN_SDAO_ETH, @@ -38,63 +36,26 @@ async function tvl(_, block) { const response = await cachedGraphQuery('singularity-dao', graphEndpoint, getDynasetQuery); const dynasets = response.dynaset.map((d) => d.address).flat(); - const { output: tokens } = await sdk.api.abi.multiCall({ - calls: dynasets.map((addr) => ({ target: addr })), - abi: abi.getCurrentTokens, - block, - permitFailure: true, - }); - const tokensAndOwners = []; - tokens - .filter((t) => t.output) - .map((t, index) => - t.output.forEach((token) => - tokensAndOwners.push([token, dynasets[index]]) - ) - ); - - let { output: forgetCount } = await sdk.api.abi.multiCall({ - abi: abis.totalForges, - calls: DYNASET_FORGES.map((i) => ({ target: i })), - block, - }); - - const calls = []; - forgetCount = forgetCount.map(({ input: { target }, output }) => { - let arry = getParamCalls(output); - arry.forEach((i) => (i.target = target)); - calls.push(...arry); - }); - - let { output: tokenInfo } = await sdk.api.abi.multiCall({ - abi: abis.forgeInfo, - calls, - block, - }); - - tokenInfo.forEach(({ input: { target }, output }) => { - tokensAndOwners.push([output.contributionToken, target]); - }); - - return sumTokens2({ tokensAndOwners, block, blacklistedTokens }); -} + const tokens = await api.multiCall({ calls: dynasets, abi: abi.getCurrentTokens, permitFailure: true, }); + const ownerTokens = []; + tokens.map((t, index) => t && ownerTokens.push([t, dynasets[index]])) + + const tokenInfos = await api.fetchList({ lengthAbi: abis.totalForges, itemAbi: abis.forgeInfo, targets: DYNASET_FORGES, groupedByInput: true }) + tokenInfos.forEach((info, i) => ownerTokens.push([info.map(i => i.contributionToken), DYNASET_FORGES[i]])) -// LP Pools ERC -// Staked LP tokens where one side of the market is the platform's own governance token. + return sumTokens2({ ownerTokens, api, blacklistedTokens }); +} -async function pool2(ts, block) { +async function pool2(api) { const tokensAndOwners = [ [LP_TOKEN_SDAO_ETH, "0xfB85B9Ec50560e302Ab106F1E2857d95132120D0"], // Unbonded [LP_TOKEN_SDAO_USDT, "0xfB85B9Ec50560e302Ab106F1E2857d95132120D0"], // Bonded 6M ]; - return sumTokens2({ tokensAndOwners, block, resolveLP: true }); + return sumTokens2({ tokensAndOwners, api, resolveLP: true }); } -// Staking pools ERC -// The platform's own tokens - -async function staking(ts, block) { +async function staking(api) { const tokensAndOwners = [ [SDAO_TOKEN, "0xfB85B9Ec50560e302Ab106F1E2857d95132120D0"], // Unbonded [SDAO_TOKEN, "0x74641ed232dbB8CBD9847484dD020d44453F0368"], // Bonded 6M @@ -105,16 +66,10 @@ async function staking(ts, block) { [AGIX_TOKEN, "0xfB85B9Ec50560e302Ab106F1E2857d95132120D0"], [AGIX_TOKEN, "0xb267deaace0b8c5fcb2bb04801a364e7af7da3f4"], ]; - return sumTokens2({ tokensAndOwners, block }); + return sumTokens2({ tokensAndOwners, api }); } -////////////////////////////////// -////// BNB CHAIN //////////////// -//////////////////////////////// - -// DYNASET BNB CHAIN - -async function tvlBNB(ts, EthBlock, { bsc: block }) { +async function tvlBNB(api) { const tokensAndOwners = [ [ADDRESSES.bsc.WBNB, DYNASETSBNB], // BNB [ADDRESSES.bsc.BUSD, DYNASETSBNB], // BUSD @@ -127,22 +82,18 @@ async function tvlBNB(ts, EthBlock, { bsc: block }) { ["0xCC42724C6683B7E57334c4E856f4c9965ED682bD", DYNASETSBNB], // BMATIC ["0xfA54fF1a158B5189Ebba6ae130CEd6bbd3aEA76e", DYNASETSBNB], // BSOL ]; - return sumTokens2({ tokensAndOwners, block, chain: "bsc" }); + return sumTokens2({ tokensAndOwners, api }); } -// Staking pools BNB - -async function stakingBNB(ts, EthBlock, { bsc: block }) { +async function stakingBNB(api) { const tokensAndOwners = [ [SDAO_TOKEN_BNB, "0x79292c62f593e08d9b850b790b07e7a0903fd007"], // Unbonded [SDAO_TOKEN_BNB, "0x17de46760F4c18C26eEc36117C23793299F564A8"], // Bonded ]; - return sumTokens2({ tokensAndOwners, block, chain: "bsc" }); + return sumTokens2({ tokensAndOwners, api }); } -// LP Pools BNB - -async function pool2BNB(ts, EthBlock, { bsc: block }) { +async function pool2BNB(api) { const tokensAndOwners = [ [ "0x6c805d2077025eaaa42fae7f764e61df42aadb14", @@ -157,7 +108,7 @@ async function pool2BNB(ts, EthBlock, { bsc: block }) { "0x79292c62f593e08d9b850b790b07e7a0903fd007", ], ]; - return sumTokens2({ tokensAndOwners, block, chain: "bsc", resolveLP: true }); + return sumTokens2({ tokensAndOwners, api, resolveLP: true }); } module.exports = { diff --git a/projects/singularx/index.js b/projects/singularx/index.js index 4d26f2eaa7..fe58897ede 100644 --- a/projects/singularx/index.js +++ b/projects/singularx/index.js @@ -17,6 +17,6 @@ const ethereumTokens = [ ]; module.exports = { - start: 1685817000, + start: '2023-06-03', ethereum: { tvl: sumTokensExport({ owners: ethereumContracts, tokens: ethereumTokens, }) }, }; \ No newline at end of file diff --git a/projects/sirius-finance/index.js b/projects/sirius-finance/index.js index 2255055245..26479ea7ae 100644 --- a/projects/sirius-finance/index.js +++ b/projects/sirius-finance/index.js @@ -26,7 +26,7 @@ module.exports = { misrepresentedTokens: true, methodology: "All locked tokens includes stable and crypto assets in Sirius's pools.", astar: { - start: 1650117600, // 2022/04/16 14:00 UTC + start: '2022-04-16', // 2022/04/16 14:00 UTC tvl, // tvl adapter staking: staking(VotingEscrow, SRS, Chain, CoinGeckoID, 18), }, diff --git a/projects/size-credit/index.js b/projects/size-credit/index.js index 24b220db46..e2f29e7fc5 100644 --- a/projects/size-credit/index.js +++ b/projects/size-credit/index.js @@ -1,23 +1,53 @@ -const { sumTokensExport } = require('../helper/unwrapLPs') -const ADDRESSES = require('../helper/coreAssets.json') +const config = { + base: '0x330Dc31dB45672c1F565cf3EC91F9a01f8f3DF0b', + ethereum: '0x3A9C05c3Da48E6E26f39928653258D7D4Eb594C1' +} + +const abis = { + SizeFactory: { + getMarkets: 'function getMarkets() view returns (address[])', + }, + Size: { + data: 'function data() view returns (uint256 nextDebtPositionId,uint256 nextCreditPositionId,address underlyingCollateralToken,address underlyingBorrowToken,address collateralToken,address borrowAToken,address debtToken,address variablePool)', + }, + Pool: { + getReserveData: 'function getReserveData(address asset) view returns (uint256 configuration,uint128 liquidityIndex,uint128 currentLiquidityRate,uint128 variableBorrowIndex,uint128 currentVariableBorrowRate,uint128 currentStableBorrowRate,uint40 lastUpdateTimestamp,uint16 id,address aTokenAddress,address stableDebtTokenAddress,address variableDebtTokenAddress,address interestRateStrategyAddress,uint128 accruedToTreasury,uint128 unbacked,uint128 isolationModeTotalDebt)' + } +} + +async function tvl(api) { + const markets = await api.call({ abi: abis.SizeFactory.getMarkets, target: config[api.chain] }) + const datas = await api.multiCall({ abi: abis.Size.data, calls: markets }) + + const borrowATokens = datas.map(data => data.borrowAToken) + const variablePools = datas.map(data => data.variablePool) + const underlyingBorrowTokens = datas.map(data => data.underlyingBorrowToken) + const underlyingCollateralTokens = datas.map(data => data.underlyingCollateralToken) -const AUSDC_CONTRACT = '0x4e65fe4dba92790696d040ac24aa414708f5c0ab' -const SZDEBT_CONTRACT = '0xb0a00c4b3d77c896f46dc6b204695e22de7a185d' -const SIZE_PROXY_CONTRACT = '0xC2a429681CAd7C1ce36442fbf7A4a68B11eFF940' -const tokens = [ - ADDRESSES.base.WETH, - AUSDC_CONTRACT, -] + const getReserveDatas = await api.multiCall({ abi: abis.Pool.getReserveData, calls: variablePools.map((variablePool, i) => ({ target: variablePool, params: underlyingBorrowTokens[i] })) }) + + const aTokens = getReserveDatas.map(data => data.aTokenAddress) + + return api.sumTokens({ + owners: [...borrowATokens, ...markets], + tokens: [...aTokens, ...underlyingCollateralTokens] + }) +} async function borrowed(api) { - const totalDebt = await api.call({ abi: 'erc20:totalSupply', target: SZDEBT_CONTRACT, }); + const markets = await api.call({ abi: abis.SizeFactory.getMarkets, target: config[api.chain] }) + const datas = await api.multiCall({ abi: abis.Size.data, calls: markets }) - return api.add(ADDRESSES.base.USDbC, totalDebt) + const debtTokens = datas.map(data => data.debtToken) + + const underlyingBorrowTokens = datas.map(data => data.underlyingBorrowToken) + const totalDebts = await api.multiCall({ abi: 'erc20:totalSupply', calls: debtTokens }); + + return api.add(underlyingBorrowTokens, totalDebts) } -module.exports = { - base: { - tvl: sumTokensExport({ tokens, owner: SIZE_PROXY_CONTRACT }), - borrowed +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl, borrowed, } -} +}) diff --git a/projects/skale/index.js b/projects/skale/index.js new file mode 100644 index 0000000000..d689547762 --- /dev/null +++ b/projects/skale/index.js @@ -0,0 +1,39 @@ +const { sumTokens2 } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') + +const depositBoxETH = '0x49F583d263e4Ef938b9E09772D3394c71605Df94'; +const depositBoxERC20 = '0x8fB1A35bB6fB9c47Fb5065BE5062cB8dC1687669'; + +module.exports = { + start: '2021-07-19', // Mon July 19 06:38:20 PM UTC 2021 + ethereum: { + tvl, + } +} + +async function tvl(api) { + const ownerTokens = [[[ADDRESSES.null], depositBoxETH]] + const chains = ["elated-tan-skat"] + let tokens = [] + for (const chain of chains) { + const tokenCount = await api.call({ abi: abi.getSchainToAllERC20Length, target: depositBoxERC20, params: chain }) + + for (let i = 0; i < tokenCount; i += 10) { + let remainingTokens = tokenCount - i; + const res = await api.call({ + abi: abi.getSchainToAllERC20, + target: depositBoxERC20, + params: [chain, i, remainingTokens >= 10 ? i + 10 : i + remainingTokens], + }); + + tokens.push(...res); + } + } + ownerTokens.push([tokens, depositBoxERC20]) + return sumTokens2({ api, ownerTokens }) +} + +const abi = { + "getSchainToAllERC20Length": "function getSchainToAllERC20Length(string schainName) view returns (uint256)", + "getSchainToAllERC20": "function getSchainToAllERC20(string schainName, uint256 from, uint256 to) view returns (address[])" +} \ No newline at end of file diff --git a/projects/skcs/index.js b/projects/skcs/index.js index 34cf3944b0..e7d1d478a4 100644 --- a/projects/skcs/index.js +++ b/projects/skcs/index.js @@ -16,7 +16,6 @@ async function tvl(timestamp, ethBlock, {kcc: block}) { module.exports = { methodology: 'Staked token and staking rewards are counted as TVL', - start: 12145436, kcc:{ tvl:tvl, } diff --git a/projects/slsd/index.js b/projects/slsd/index.js index 021ba9014f..965083da50 100644 --- a/projects/slsd/index.js +++ b/projects/slsd/index.js @@ -24,7 +24,6 @@ async function tvl(api) { } module.exports = { - start: 17142918, ethereum: { tvl, pool2: staking('0xBE13DC5235a64d090E9c62952654DBF3c65199d9', SLSD_LP) diff --git a/projects/smbswap/index.js b/projects/smbswap/index.js index 4b7503b6b3..101e2d460b 100644 --- a/projects/smbswap/index.js +++ b/projects/smbswap/index.js @@ -6,5 +6,5 @@ module.exports = { bsc: { tvl: getUniTVL({ factory: '0x2Af5c23798FEc8E433E11cce4A8822d95cD90565', useDefaultCoreAssets: true }), }, - start: 1645285089, // Sat Feb 19 2022 15:38:09 + start: '2022-02-19', // Sat Feb 19 2022 15:38:09 }; diff --git a/projects/smilee-finance/index.js b/projects/smilee-finance/index.js index 4c61403965..733958cdfe 100644 --- a/projects/smilee-finance/index.js +++ b/projects/smilee-finance/index.js @@ -1,6 +1,5 @@ module.exports = { methodology: 'Sum of balances from vault contracts associated with each DVP retrieved by the registry.', - start: 190367425, } const config = { diff --git a/projects/snai-finance/index.js b/projects/snai-finance/index.js index c24c61d4ee..4b6525e670 100644 --- a/projects/snai-finance/index.js +++ b/projects/snai-finance/index.js @@ -1,6 +1,9 @@ const { methodology, compoundExports2 } = require("../helper/compound"); module.exports = { + deadFrom: '2024-06-15', base: compoundExports2({ comptroller: '0x784E1507193c060bC88e6699adC7c796Ebe0E14e', cether: '0x9649Eb0f03C7e85615cFDC7927c7E6B775Ef284d' }), methodology, -} \ No newline at end of file +} + +module.exports.base.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/snowflake/index.js b/projects/snowflake/index.js index 4f9d577377..32a2562645 100644 --- a/projects/snowflake/index.js +++ b/projects/snowflake/index.js @@ -1,52 +1,30 @@ -const sdk = require("@defillama/sdk") const { staking } = require("../helper/staking"); -const { sumTokens2 } = require('../helper/unwrapLPs') const assetsAbi = require("./abi") const asssetsContract = "0x2c326AbbE089B786E7170da84e39F3d0c6650653" const bscAsssetsContract = "0xEaEC4e680F5D534772e888fbD558b3b29e1F2E89" -const chain = "polygon" -const chain2 = "bsc" - -async function tvl(timestamp, ethereumBlock, chainBlocks) { - const block = chainBlocks[chain]; - const { output: toa } = await sdk.api.abi.call({ - target: asssetsContract, - abi: assetsAbi.getAssets, - chain, block, - }) - return sumTokens2({ chain: chain, block, tokensAndOwners: toa, }) +async function tvl(api) { + const tokensAndOwners = await api.call({ target: asssetsContract, abi: assetsAbi.getAssets, }) + return api.sumTokens({ tokensAndOwners }) } -async function bscTvl(timestamp, ethereumBlock, chainBlocks) { - const block = chainBlocks[chain2]; - const { output: toa } = await sdk.api.abi.call({ - target: bscAsssetsContract, - abi: assetsAbi.getAssets, - chain: chain2, block, - }) - return sumTokens2({ chain: chain2, block, tokensAndOwners: toa, }) +async function bscTvl(api) { + const tokensAndOwners = await api.call({ target: bscAsssetsContract, abi: assetsAbi.getAssets, }) + return api.sumTokens({ tokensAndOwners }) } module.exports = { hallmarks: [ - [1672448400,"Rug Pull"] + [1672448400, "Rug Pull"] ], - polygon:{ - tvl, - staking: staking( - "0xfD5D4caDe98366d0b09c03cB3cEe7D244c8b6146", //ve - "0xE0f463832295ADf63eB6CA053413a3f9cd8bf685", //snow - "polygon" - ), + // deadFrom: 1672448400, + polygon: { + tvl: () => ({}), + staking: () => ({}), }, bsc: { - tvl: bscTvl, - staking: staking( - "0xfD5D4caDe98366d0b09c03cB3cEe7D244c8b6146", //ve - "0xE0f463832295ADf63eB6CA053413a3f9cd8bf685", //snow - "bsc" - ), + tvl: () => ({}), + staking: () => ({}), } }; diff --git a/projects/sns/index.js b/projects/sns/index.js index 345445aaaa..5cc53a5c9f 100644 --- a/projects/sns/index.js +++ b/projects/sns/index.js @@ -1,35 +1,19 @@ -const { get } = require('../helper/http') +const axios = require ("axios") -const SNS_URL = "https://sns-api.internetcomputer.org/api/v1/snses/" -const ICP_URL = "https://ledger-api.internetcomputer.org/accounts/" +const SNS_URL = "https://sns-api.internetcomputer.org/api/v1/snses" +const ICP_URL = "https://ledger-api.internetcomputer.org/accounts" async function tvl(api) { - let offset = 0; - const limit = 100; - var icp_balance = 0; - const a = true - while (a) { - let data = await get(SNS_URL + `?offset=${offset}&limit=${limit}&sort_by=name`); - let snses = data.data; - if (snses.length == undefined || snses.length == 0) { - break; - } + const { data } = await axios.get(SNS_URL) - for (let i = 0; i < snses.length; i++) { - let sns = snses[i]; - let root_canister_id = sns.root_canister_id; - let root_canister = await get( - SNS_URL + `${root_canister_id}`); - - let icp_ledger_treasury_accountidentifier = root_canister.icp_treasury_account; - let icp_ledger = await get( - ICP_URL + `${icp_ledger_treasury_accountidentifier}`); - icp_balance += parseInt(icp_ledger.balance); - } - offset += limit; + for (const sns of data.data) { + const root_canister_id = sns.root_canister_id + const root_canister = await axios.get(SNS_URL + `/${root_canister_id}`) + const icp_ledger_treasury_accountidentifier = root_canister.data.icp_treasury_account + const icp_ledger = await axios.get(ICP_URL + `/${icp_ledger_treasury_accountidentifier}`) + const icp_balance = parseInt(icp_ledger.data.balance) + api.addCGToken('internet-computer', icp_balance / 1e8) } - - api.addCGToken('internet-computer', icp_balance / 1e8) } module.exports = { diff --git a/projects/sofa-org/index.js b/projects/sofa-org/index.js index 488e83224e..6b788102d7 100644 --- a/projects/sofa-org/index.js +++ b/projects/sofa-org/index.js @@ -39,6 +39,32 @@ const config = { '0x8F9259a355933737F8F11f95d32460eCd5ED0706', '0x3AbC7053ec29e26c1429195fd971F280422ecA80', '0x071E0C2BE2b16c8B00173c6535eF8331b8e1feeD', + // okx + '0xe483d580664cd72B0A8cae0D65EFfA6587bd2263', + '0x21f759Bcb31739032A00b37e3560a216AE52eFDC', + '0x3191a0008415dEB5c5161C4B394Ec46C8C703f8c', + '0xC9Aa266e2E50EC2474cD881566845480F8daE931', + ], + // scrvusd + crvtokens: [ + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367', + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367', + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367', + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367', + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367', + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367', + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367', + '0x0655977FEb2f289A4aB78af67BAB0d17aAb84367' + ], + crvUSDVaults: [ + '0xF5BF8aa4b571FF2Be9905289bfcEbC1D46408D9F', + '0x9832e7E40d5a1495cA7bdbCd6A5C0A90D28F6cFA', + '0x99595455Ba95b286F8e2614470b865e34f034Aa1', + '0xf421B050647CF6eB757dE873F212e04a5e324487', + "0x267adC3E106b72ce3b0F2BbDb6c638A12110CF8C", + "0x31D22b4afEC06e67A37AF38A62a6ec9546c1bF8A", + "0x5e5E689284a614127Af9deA546b8D943B8b80e5c", + "0x4A1Bc9d8B2eD7BF9B9C1979037992Cff064E4F40", ], }, arbitrum: { @@ -79,20 +105,68 @@ const config = { '0xfA49f859a012e8b1795A81B23b21Db0bD40e7770', '0x94Fe821E8Adde08aB97530D432Ff34A724FD7830', '0x4a5B4049a4aFae31278d36768704872f73dA67D1', - '0x08c57aE48a89b6876A76dC618972Ef1602da7ED8',], + '0x08c57aE48a89b6876A76dC618972Ef1602da7ED8', + // automator + '0x986Fa0383C39dBdA1B3A29Ac536fe5Df354Ed160', + '0x770f7fcEce69C68B208B80bBc4e3d1Bf8f9c0672', + '0x1e5A684d263F42BaC1f2bAd6fB379277D4D6c28C', + '0xBF898C0C2E7d415dE8FCcc78d1200D029a060560', + ], + crvtokens: [ + ], + crvUSDVaults: [ + ], + }, + bsc: { + vaults: [ + ], + aVaults: [ + // aBnbUSDT + '0x89c82D1B7616B0a465311FF077db6Bc21d43eA22', + '0x842E97BaA96cFE1534F1A50Da112C7800134656A', + '0x5DcEFCa5207c58dCbcf41eF017D1D0EB42d83701', + '0x4573382A9d101EB6DFa1C4B448f939c41fF3e81d', + '0x40144BC227f78A288FE9Ae6F4C7389C92C5aD9CF', + '0x41Df07a5E58D551164fCAEaD4c1ee67B77a84776', + '0xD0fb7977df47d7Fe946A21679DAbCe877f7A3a05', + '0xab08fF5dd91636fE556f692825Cadd7bA04A4c97', + ], + crvtokens: [ + ], + crvUSDVaults: [ + ], + }, + polygon: { + vaults: [ + ], + aVaults: [ + // aBnbUSDT + '0x4FD90c6B2a81d65a10E366dC5051D4D1A2A1c021', + '0x89c82D1B7616B0a465311FF077db6Bc21d43eA22', + '0x842E97BaA96cFE1534F1A50Da112C7800134656A', + '0x46706780749bC41E7Ab99D13BC1B2a74Df40A7DA', + '0x53b4b7312e543435f77f25648Fa9B269d0918bc5', + '0x40144BC227f78A288FE9Ae6F4C7389C92C5aD9CF', + '0x41Df07a5E58D551164fCAEaD4c1ee67B77a84776', + '0xD0fb7977df47d7Fe946A21679DAbCe877f7A3a05', + ], + crvtokens: [ + ], + crvUSDVaults: [ + ], } - } Object.keys(config).forEach(chain => { - const { vaults = [], aVaults = [] } = config[chain] + const { vaults = [], aVaults = [], crvtokens = [], crvUSDVaults = [] } = config[chain] module.exports[chain] = { tvl: async (api) => { const tokens = await api.multiCall({ abi: 'address:collateral', calls: vaults }) const tokens2 = await api.multiCall({ abi: 'address:collateral', calls: aVaults }) const atokens = await api.multiCall({ abi: 'address:aToken', calls: aVaults }) - return api.sumTokens({ tokensAndOwners2: [[tokens, tokens2, atokens].flat(), [vaults, aVaults, aVaults].flat()] }) + + return api.sumTokens({ tokensAndOwners2: [[tokens, tokens2, atokens, crvtokens].flat(), [vaults, aVaults, aVaults, crvUSDVaults].flat()] }) } } }) @@ -104,4 +178,5 @@ module.exports.ethereum.staking = staking([ '0x94Fe821E8Adde08aB97530D432Ff34A724FD7830', '0x4a5B4049a4aFae31278d36768704872f73dA67D1', '0x08c57aE48a89b6876A76dC618972Ef1602da7ED8', + '0x2B9aeA129B85F51A468274e7271434A83c3BB6b4', // StRCH ], '0x57b96d4af698605563a4653d882635da59bf11af') diff --git a/projects/sohei/index.js b/projects/sohei/index.js index 4882d9f116..1814816d79 100644 --- a/projects/sohei/index.js +++ b/projects/sohei/index.js @@ -2,11 +2,15 @@ const {compoundExports} = require('../helper/compound'); const { nullAddress } = require('../helper/tokenMapping'); const ceth = "0x685d1f1a83ff64e75fe882e7818e4ad9173342ca"; -const chain = "arbitrum"; + + module.exports = { hallmarks: [ [1680480000, "Team out of funds announced"] ], - arbitrum: compoundExports('0x9f750cf10034f3d7a18221aec0bddab7fc6f32ba', chain, ceth, nullAddress, undefined, undefined, { blacklistedTokens: ['0x6e002cb9bf8c17409eeb6c593ef6548faddd2985']}), -}; \ No newline at end of file + deadFrom: '2023-04-20', + arbitrum: compoundExports('0x9f750cf10034f3d7a18221aec0bddab7fc6f32ba', ceth, nullAddress, { blacklistedTokens: ['0x6e002cb9bf8c17409eeb6c593ef6548faddd2985']}), +} + +module.exports.arbitrum.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/solanahub-sol/index.js b/projects/solanahub-sol/index.js new file mode 100644 index 0000000000..c874fd186b --- /dev/null +++ b/projects/solanahub-sol/index.js @@ -0,0 +1,12 @@ +const { getSolBalanceFromStakePool } = require('../helper/solana') + +async function tvl(api) { + await getSolBalanceFromStakePool('ECRqn7gaNASuvTyC5xfCUjehWZCSowMXstZiM5DNweyB', api) +} + +module.exports ={ + timetravel: false, + doublecounted: true, + methodology: "SolanaHub Staked SOL (hubSOL) is a tokenized representation on your staked SOL + stake rewards", + solana: { tvl }, +}; \ No newline at end of file diff --git a/projects/solar-studios/index.js b/projects/solar-studios/index.js new file mode 100644 index 0000000000..d82c37f8b9 --- /dev/null +++ b/projects/solar-studios/index.js @@ -0,0 +1,19 @@ +const { getProvider, sumTokens2 } = require("../helper/solana"); +const { Program, } = require("@project-serum/anchor"); + + +async function tvl(api) { + + const provider = getProvider(api.chain) + const programId = 'sooGfQwJ6enHfLTPfasFZtFR7DgobkJD77maDNEqGkD' + const idl = await Program.fetchIdl(programId, provider) + const program = new Program(idl, programId, provider) + const data = await program.account.poolState.all() + const tokenAccounts = data.map(({ account: { token0Vault, token1Vault }}) => ([token0Vault, token1Vault,])).flat() + return sumTokens2({ tokenAccounts, api, }) +} + +module.exports = { + timetravel: false, + eclipse: { tvl, }, +} diff --git a/projects/solayer-ssol/index.js b/projects/solayer-ssol/index.js new file mode 100644 index 0000000000..9ebc1a0a63 --- /dev/null +++ b/projects/solayer-ssol/index.js @@ -0,0 +1,44 @@ +const { sumTokens2, getConnection, getAssociatedTokenAddress, } = require("../helper/solana"); +const { PublicKey } = require("@solana/web3.js"); +const ADDRESSES = require('../helper/coreAssets.json') + +async function tvl(api) { + const connection = getConnection(); + + // add native SOL staking + const stakeAccount = await connection.getAccountInfo(new PublicKey('po1osKDWYF9oiVEGmzKA4eTs8eMveFRMox3bUKazGN2')) + api.add(ADDRESSES.solana.SOL, Number(stakeAccount.data.readBigUint64LE(258))) + + // get LST details + const data = await connection.getProgramAccounts(new PublicKey('sSo1iU21jBrU9VaJ8PJib1MtorefUV4fzC9GURa2KNn'), { + filters: [{ dataSize: 74, },], + }) + + // Build list of token accounts by deriving ATAs for each LST-vault pair + const tokenAccounts = data.map((i) => { + const offset = 8 + const lstMint = new PublicKey(i.account.data.slice(offset + 0, offset + 32)); + const vaultPubkey = new PublicKey(i.pubkey.toString()); + + // Derive the ATA for this LST and vault + const ata = getAssociatedTokenAddress(lstMint, vaultPubkey); + + return ata.toString() + }); + + + return sumTokens2({ + api, + tokenAccounts, + blacklistedTokens: [ + 'sSo1wxKKr6zW2hqf5hZrp2CawLibcwi1pMBqk5bg2G4', + 'testqcAoCvfFpuFNtdmrBnBMSfFoXKkSTJ3ky6cPKjx', + ] + }) +} + +module.exports = { + timetravel: false, + methodology: "TVL is calculated by summing all re-staked assets.", + solana: { tvl }, +}; diff --git a/projects/solayer-susd/index.js b/projects/solayer-susd/index.js new file mode 100644 index 0000000000..685aaf1439 --- /dev/null +++ b/projects/solayer-susd/index.js @@ -0,0 +1,19 @@ +const { sumTokens2 } = require("../helper/solana"); +const ADDRESSES = require('../helper/coreAssets.json') + +async function tvl() { + // Sum up assets in sUSD pool + return sumTokens2({ + tokensAndOwners: [ + ['4MmJVdwYN8LwvbGeCowYjSx7KoEi6BJWg8XXnW4fDDp6', 'FhVcYNEe58SMtxpZGnTu2kpYJrTu2vwCZDGpPLqbd2yG'], + [ADDRESSES.solana.USDC, 'FhVcYNEe58SMtxpZGnTu2kpYJrTu2vwCZDGpPLqbd2yG'], + ] + }) +} + +module.exports = { + timetravel: false, + doublecounted: true, + methodology: "sUSD TVL is calculated by summing all assets backing the stablecoin", + solana: { tvl }, +}; \ No newline at end of file diff --git a/projects/solayer/index.js b/projects/solayer/index.js index 6e4b7d6a45..589a239dfb 100644 --- a/projects/solayer/index.js +++ b/projects/solayer/index.js @@ -1,17 +1,35 @@ -const { sumTokens2, getSolBalanceFromStakePool } = require("../helper/solana"); +const { sumTokens2, getConnection, } = require("../helper/solana"); +const { PublicKey } = require("@solana/web3.js"); +const ADDRESSES = require('../helper/coreAssets.json') async function tvl(api) { - await getSolBalanceFromStakePool('po1osKDWYF9oiVEGmzKA4eTs8eMveFRMox3bUKazGN2', api) + const connection = getConnection(); + + // add SOL staking + const stakeAccount = await connection.getAccountInfo(new PublicKey('po1osKDWYF9oiVEGmzKA4eTs8eMveFRMox3bUKazGN2')) + api.add(ADDRESSES.solana.SOL, Number(stakeAccount.data.readBigUint64LE(258))) + + // get LST details + const data = await connection.getProgramAccounts(new PublicKey('sSo1iU21jBrU9VaJ8PJib1MtorefUV4fzC9GURa2KNn'), { + filters: [{ dataSize: 74, },], + }) + const tokensAndOwners = data.map((i) => { + const offset = 8 + const lstMint = new PublicKey(i.account.data.slice(offset + 0, offset + 32)); + return [lstMint.toString(), i.pubkey.toString()] + }) + + // add SUSD Backing + tokensAndOwners.push( + ['4MmJVdwYN8LwvbGeCowYjSx7KoEi6BJWg8XXnW4fDDp6', 'FhVcYNEe58SMtxpZGnTu2kpYJrTu2vwCZDGpPLqbd2yG'], + [ADDRESSES.solana.USDC, 'FhVcYNEe58SMtxpZGnTu2kpYJrTu2vwCZDGpPLqbd2yG'], + ) + return sumTokens2({ - tokenAccounts: [ - 'AGuwBAj91dgz1fhaK4qgYcH7SohyZEMK1VXTizFsWjq7', - 'Q75n2KgZp7insTKkavJWftWWuGDDUuHMquosQ5hbn7G', - 'HBjQ1jF2ynYFpwx46qiZsKE3rmvgEcxnkhvKeGP6omUd', - '6eLZQKhbiBNmR4PiDFJgE6TZAoH3BwR6ceVwc3K1YjBZ', - 'HNw9tA7sWvjDH4cDCykj23Q4ifkKZerr6MbMfFXgyp62', - 'Gwa3a4VJbAyorLhn6TEeWLbQ4tWyup4E6oL3WjAga7tx', - ], - balances: api.getBalances() + balances: api.getBalances(), tokensAndOwners, blacklistedTokens: [ + 'sSo1wxKKr6zW2hqf5hZrp2CawLibcwi1pMBqk5bg2G4', + 'testqcAoCvfFpuFNtdmrBnBMSfFoXKkSTJ3ky6cPKjx', + ] }) } diff --git a/projects/solbank-finance/index.js b/projects/solbank-finance/index.js new file mode 100644 index 0000000000..bae3e57047 --- /dev/null +++ b/projects/solbank-finance/index.js @@ -0,0 +1,10 @@ +const { sumTokensExport } = require('../helper/solana'); + +const contractAddress = '3Q3pE1izgCeAtTR23eufZy5vCEGtpWLBQcGD2HGd1cbU'; + +module.exports = { + solana: { + tvl: sumTokensExport({ owners: [contractAddress], blacklistedTokens: ['8twuNzMszqWeFbDErwtf4gw13E6MUS4Hsdx5mi3aqXAM'] }), + staking: sumTokensExport({ owners: [contractAddress], tokens: ['8twuNzMszqWeFbDErwtf4gw13E6MUS4Hsdx5mi3aqXAM'] }), + }, +}; \ No newline at end of file diff --git a/projects/solend/index.js b/projects/solend/index.js index d8c495f05e..9670d6dda5 100644 --- a/projects/solend/index.js +++ b/projects/solend/index.js @@ -21,7 +21,11 @@ async function borrowed(api) { async function tvl() { const markets = (await getConfig('solend', solendConfigEndpoint)) - return sumTokens2({ owners: markets.map(i => i.authorityAddress)}); + return sumTokens2({ owners: markets.map(i => i.authorityAddress) }); +} + +async function eclipseTvl(api) { + return sumTokens2({ api, owners: ['5Gk1kTdDqqacmA2UF3UbNhM7eEhVFvF3p8nd9p3HbXxk'] }); } module.exports = { @@ -30,6 +34,7 @@ module.exports = { tvl, borrowed, }, + eclipse: { tvl: eclipseTvl }, methodology: "TVL consists of deposits made to the protocol and like other lending protocols, borrowed tokens are not counted. Coingecko is used to price tokens.", hallmarks: [ diff --git a/projects/solfarm.js b/projects/solfarm.js index 687f1e8d1c..50bf77972e 100644 --- a/projects/solfarm.js +++ b/projects/solfarm.js @@ -1,9 +1,7 @@ -const { get } = require('./helper/http') +const { sumTokens2 } = require('./helper/solana') -async function fetch() { - var response = await get('https://api.tulip.garden/tvl') - - return response.total; +async function tvl() { + return sumTokens2({ owner: '8gEGZbUfVE1poBq71VHKX9LU7ca4x8wTUyZgcbyQe51s'}) } module.exports = { @@ -11,5 +9,5 @@ module.exports = { [1667865600, "FTX collapse"] ], timetravel: false, - fetch + solana: { tvl } } diff --git a/projects/solid-world/index.js b/projects/solid-world/index.js index c3160daef4..5383c2e4a1 100644 --- a/projects/solid-world/index.js +++ b/projects/solid-world/index.js @@ -47,7 +47,7 @@ async function pool2(api) { } module.exports = { - start: 1684477800, // Fri May 19 2023 06:30:00 GMT+0000 + start: '2023-05-19', // Fri May 19 2023 06:30:00 GMT+0000 methodology: `TVL is a measure of the health of the Solid World ecosystem. The TVL can be looked at from 2 perspectives. The 1st perspective, "RWA" valuation, represents the total value of the tokenized forward carbon credits, and is computed as the present value of the on-chain forward credits (ERC1155), based on their exchange rate to CRISP tokens (ERC20) and subsequent USDC value, summed-up.The 2nd perspective, "pool2", represents the total value locked up in our staking contract, and it's calculated by adding up the value of all the LP tokens that are staked. The LP tokens represent the amount of liquidity that has been provided to the Solid World platform.`, polygon: { tvl, diff --git a/projects/solidblast/index.js b/projects/solidblast/index.js index c8d28e993a..a2a1b9960b 100644 --- a/projects/solidblast/index.js +++ b/projects/solidblast/index.js @@ -6,7 +6,6 @@ module.exports = { blast: { tvl: getUniTVL({ factory: "0x5a79cC04Ad1494A8Ec04cE5C1E25bB50A10111eA", - fetchBalances: true, useDefaultCoreAssets: true, }), }, diff --git a/projects/solidex/index.js b/projects/solidex/index.js index f5ba9f164a..6458e9471a 100644 --- a/projects/solidex/index.js +++ b/projects/solidex/index.js @@ -1,60 +1,21 @@ -const sdk = require("@defillama/sdk"); -const { unwrapUniswapLPs, sumTokens } = require('../helper/unwrapLPs'); const abis = require("./abis.json"); const SOLID = '0x888EF71766ca594DED1F0FA3AE64eD2941740A20'; - -async function tvl(timestamp, block, chainBlocks) { - const balances = {}; - - const noPairs = (await sdk.api.abi.call({ - target: '0x3fAaB499b519fdC5819e3D7ed0C26111904cbc28', - abi: abis.allPairsLength, - block: chainBlocks.fantom, - chain: 'fantom' - })).output; - - const pairAddresses = (await sdk.api.abi.multiCall({ - target: '0x3fAaB499b519fdC5819e3D7ed0C26111904cbc28', - calls: Array.from({ length: Number(noPairs) }, (_, k) => ({ - params: k, - })), - abi: abis.allPairs, - block: chainBlocks.fantom, - chain: 'fantom' - })).output; - - let pairTokens = (await sdk.api.abi.multiCall({ - calls: pairAddresses.map(a => ({ - target: a.output - })), - abi: abis.tokens, - block: chainBlocks.fantom, - chain: 'fantom' - })).output; - - let tokensAndOwners = []; - for (let i = 0; i < pairTokens.length; i++) { - const owner = pairTokens[i].input.target; - (pairTokens[i].output || []).forEach(token => tokensAndOwners.push([token, owner])) - } - - await sumTokens(balances, tokensAndOwners, chainBlocks.fantom, 'fantom',); - - return balances; +async function tvl(api) { + const pairs = await api.fetchList({ lengthAbi: abis.allPairsLength, itemAbi: abis.allPairs, target: '0x3fAaB499b519fdC5819e3D7ed0C26111904cbc28' }) + const tokens = await api.multiCall({ abi: abis.tokens, calls: pairs}) + const ownerTokens = tokens.map((t, i) => [t, pairs[i]]) + return api.sumTokens({ ownerTokens }) } -async function staking(ts, _block, chainBlocks) { - const balances = {}; - balances[`fantom:${SOLID}`] = (await sdk.api.abi.call({ +async function staking(api) { + const { amount } = await api.call({ target: '0xcbd8fea77c2452255f59743f55a3ea9d83b3c72b', abi: abis.locked, params: [8], - block: chainBlocks.fantom, - chain: 'fantom' - })).output.amount - return balances + }) + api.add(SOLID, amount) } module.exports = { diff --git a/projects/solidly-v3/index.js b/projects/solidly-v3/index.js index 24181e4bee..11689338ab 100644 --- a/projects/solidly-v3/index.js +++ b/projects/solidly-v3/index.js @@ -7,6 +7,7 @@ module.exports = uniV3Export({ base: { factory: "0x70fe4a44ea505cfa3a57b95cf2862d4fd5f0f687", fromBlock: 9672720, permitFailure: true }, arbitrum: { factory: "0x70fe4a44ea505cfa3a57b95cf2862d4fd5f0f687", fromBlock: 173576189, permitFailure: true, }, fantom: { factory: "0x70fe4a44ea505cfa3a57b95cf2862d4fd5f0f687", fromBlock: 73057898, permitFailure: true, }, + sonic: { factory: "0x777fAca731b17E8847eBF175c94DbE9d81A8f630", fromBlock: 514659, permitFailure: true, }, }); module.exports.hallmarks = [ [1693699200, "Solidly V3 launch"], diff --git a/projects/solv-btc-lst/index.js b/projects/solv-btc-lst/index.js new file mode 100644 index 0000000000..3db1b19351 --- /dev/null +++ b/projects/solv-btc-lst/index.js @@ -0,0 +1,28 @@ +const { sumTokens } = require('../helper/chain/bitcoin'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js'); +const { getConfig } = require('../helper/cache.js'); + +async function tvl() { + return sumTokens({ owners: await bitcoinAddressBook.solvBTC() }) +} + + +const solvbtclstListUrl = 'https://raw.githubusercontent.com/solv-finance/solv-protocol-defillama/refs/heads/main/solvbtc-lst.json'; + +async function evmTVL(api) { + let solvbtclst = await getConfig('solv-protocol/solv-btc-lst-evm', solvbtclstListUrl) + let { depositAddress: owners, tokens } = solvbtclst[api.chain]?.otherDeposit ?? {} + return api.sumTokens({ owners, tokens }) +} + +module.exports = { + methodology: 'Staked tokens via Babylon and Core are counted towards TVL, as they represent the underlying BTC assets securing their respective networks.', + doublecounted: true, + timetravel: false, + bitcoin: { tvl } +} + +const chains = ['ethereum'] +chains.forEach(chain => { + module.exports[chain] = { tvl: evmTVL } +}) \ No newline at end of file diff --git a/projects/solv-protocol-funds/index.js b/projects/solv-protocol-funds/index.js index c086c8a4c7..717b6b53d3 100644 --- a/projects/solv-protocol-funds/index.js +++ b/projects/solv-protocol-funds/index.js @@ -14,9 +14,9 @@ const graphUrlList = { merlin: 'http://solv-subgraph-server-alb-694489734.us-west-1.elb.amazonaws.com:8000/subgraphs/name/solv-payable-factory-merlin', } -const slotListUrl = 'https://raw.githubusercontent.com/solv-finance-dev/solv-protocol-rwa-slot/main/slot.json'; +const slotListUrl = 'https://raw.githubusercontent.com/solv-finance/solv-protocol-defillama/refs/heads/main/solv-rwa-slot.json'; -const addressUrl = 'https://raw.githubusercontent.com/solv-finance-dev/slov-protocol-defillama/main/solv-funds.json'; +const addressUrl = 'https://raw.githubusercontent.com/solv-finance/solv-protocol-defillama/refs/heads/main/solv-funds.json'; async function tvl(api) { const address = (await getConfig('solv-protocol/funds', addressUrl)); @@ -30,103 +30,24 @@ async function tvl(api) { await vaultBalance(api, graphData); await otherDeposit(api, address); await ceffuBalance(api, address, graphData); - - return api.getBalances(); } -async function borrowed(api) { - const network = api.chain; - - const graphData = await getGraphData(api.timestamp, network, api); - if (graphData.pools.length > 0) { - const poolLists = graphData.pools; - - let address = (await getConfig('solv-protocol/funds', addressUrl)); - const depositAddress = filterDepositAddress(network, address); - - let fofFundPoolId = []; - if (address[network] && address[network]["fofFund"]) { - fofFundPoolId = address[network]["fofFund"]; - } - - let pools = []; - for (const pool of poolLists) { - if (depositAddress.length == 0 && depositAddress.indexOf(pool.vault) == -1 && fofFundPoolId.indexOf(pool.poolId) == -1) { - pools.push(pool); - } - } - - const poolConcretes = await concrete(pools, api); - const nav = await api.multiCall({ - abi: abi.getSubscribeNav, - calls: pools.map((index) => ({ - target: index.navOracle, - params: [index.poolId, api.timestamp * 1000] - })), - }) - - const poolTotalValues = await api.multiCall({ - abi: abi.slotTotalValue, - calls: pools.map((index) => ({ - target: poolConcretes[index.contractAddress], - params: [index.openFundShareSlot] - })), - }) - - const poolBaseInfos = await api.multiCall({ - abi: abi.slotBaseInfo, - calls: pools.map((index) => ({ - target: poolConcretes[index.contractAddress], - params: [index.openFundShareSlot] - })), - }) - - const poolDecimalList = await api.multiCall({ - abi: abi.decimals, - calls: poolBaseInfos.map(i => i[1]), - }) - - let vaults = {}; - for (const key in pools) { - if (poolBaseInfos[key][1] && pools[key]["vault"]) { - vaults[`${pools[key]["vault"].toLowerCase()}-${poolBaseInfos[key][1].toLowerCase()}`] = [poolBaseInfos[key][1], pools[key]["vault"]] - } - } - - const symbols = await api.multiCall({ - abi: abi.symbol, - calls: poolBaseInfos.map((index) => ({ - target: index[1] - })), - }) - - const balances = await api.multiCall({ - abi: abi.balanceOf, - calls: Object.values(vaults).map((index) => ({ - target: index[0], - params: [index[1]] - })), - }) +const solvbtcListUrl = 'https://raw.githubusercontent.com/solv-finance/solv-protocol-defillama/refs/heads/main/solvbtc.json'; +async function getSolvBTCVAddresses(api) { + let solvbtc = (await getConfig('solv-protocol/solvbtc', solvbtcListUrl)); - let vaultbalances = {}; - for (let i = 0; i < Object.keys(vaults).length; i++) { - vaultbalances[Object.keys(vaults)[i]] = balances[i]; - } - for (let i = 0; i < poolTotalValues.length; i++) { - const decimals = poolDecimalList[i]; - let balance = BigNumber(poolTotalValues[i]).div(BigNumber(10).pow(18 - decimals)).times(BigNumber(nav[i].nav_).div(BigNumber(10).pow(decimals))).toNumber(); - if (pools[i]['vault'] && poolBaseInfos[i][1] && vaultbalances[`${pools[i]['vault'].toLowerCase()}-${poolBaseInfos[i][1].toLowerCase()}`]) { - balance = BigNumber(balance).minus(vaultbalances[`${pools[i]['vault'].toLowerCase()}-${poolBaseInfos[i][1].toLowerCase()}`]).toNumber(); - vaultbalances[`${pools[i]['vault'].toLowerCase()}-${poolBaseInfos[i][1].toLowerCase()}`] = undefined - } - if (balance > 0) { - if (symbols[i] !== "SolvBTC") { - api.add(poolBaseInfos[i][1], balance) - } - } + const blacklisted = {} + if (!solvbtc[api.chain] || !solvbtc[api.chain]["otherDeposit"]) { + return blacklisted + } + let otherDeposit = solvbtc[api.chain]["otherDeposit"]; + for (const deposit of otherDeposit["depositAddress"]) { + for (const tokenAddress of otherDeposit["tokens"]) { + const key = `${tokenAddress}-${deposit}`.toLowerCase() + blacklisted[key] = true } } - return api.getBalances() + return blacklisted } async function otherDeposit(api, address) { @@ -300,7 +221,6 @@ async function lendle(api, address) { async function vaultBalance(api, graphData) { const network = api.chain; - const solvbtcListUrl = 'https://raw.githubusercontent.com/solv-finance-dev/slov-protocol-defillama/main/solvbtc.json'; let solvbtc = (await getConfig('solv-protocol/solvbtc', solvbtcListUrl)); if (graphData.pools.length > 0) { const poolLists = graphData.pools; @@ -328,27 +248,17 @@ async function vaultBalance(api, graphData) { vaults[`${poolBaseInfos[key][1].toLowerCase()}-${poolLists[key]["vault"].toLowerCase()}`] = [poolBaseInfos[key][1], poolLists[key]["vault"]] } } - - const symbols = await api.multiCall({ - abi: abi.symbol, - calls: Object.values(vaults).map((index) => ({ - target: index[0] - })), + const tokens = Object.values(vaults).map(([token]) => token) + + const symbols = await api.multiCall({ abi: abi.symbol, calls: tokens, }) + const blacklisted = await getSolvBTCVAddresses(api) + const blacklistedTokens = tokens.filter((token, i) => symbols[i].toLowerCase().includes('solvbtc')) + const tokensAndOwners = Object.values(vaults).filter(([token, owner]) => { + const key = `${token}-${owner}`.toLowerCase() + return !blacklisted[key] && !blacklistedTokens.includes(token) }) - - const balances = await api.multiCall({ - abi: abi.balanceOf, - calls: Object.values(vaults).map((index) => ({ - target: index[0], - params: [index[1]] - })), - }) - - for (const key in balances) { - if (symbols[key] !== "SolvBTC") { - api.add(Object.values(vaults)[key][0], balances[key]) - } - } + + return api.sumTokens({ tokensAndOwners, blacklistedTokens, }) } } @@ -357,7 +267,7 @@ async function ceffuBalance(api, address, graphData) { return; } let ceffuData = address[api.chain]["ceffu"]; - + let pools = []; for (const graph of graphData.pools) { if (graph['openFundShareSlot'] == ceffuData['slot']) { @@ -479,40 +389,10 @@ async function getGraphData(timestamp, chain, api) { }; } -function filterDepositAddress(network, address) { - let depositAddresses = []; - if (address[network]) { - if (address[network]["gm"]) { - for (let depositAddress of address[network]["gm"]["depositAddress"]) { - depositAddresses.push(depositAddress.toLowerCase()) - } - } - if (address[network]["mux"]) { - depositAddresses.push(address[network]["mux"]["account"].toLowerCase()) - } - if (address[network]["klp"]) { - for (let poolAddress of address[network]["klp"]["klpPool"]) { - depositAddresses.push(poolAddress.toLowerCase()) - } - } - if (address[network]["iziswap"]) { - for (let owner of address[network]["iziswap"]["owner"]) { - depositAddresses.push(owner.toLowerCase()) - } - } - if (address[network]["lendle"]) { - depositAddresses.push(address[network]["lendle"]["account"]["user"].toLowerCase()) - } - } - - return depositAddresses; -} - // node test.js projects/solv-protocol-funds ['ethereum', 'bsc', 'polygon', 'arbitrum', 'mantle', 'merlin'].forEach(chain => { module.exports[chain] = { - tvl, - borrowed + tvl } }) diff --git a/projects/solv-protocol-rwa/index.js b/projects/solv-protocol-rwa/index.js index 25d703b28e..be2cf40b9f 100644 --- a/projects/solv-protocol-rwa/index.js +++ b/projects/solv-protocol-rwa/index.js @@ -8,7 +8,7 @@ const graphUrlList = { mantle: 'https://api.0xgraph.xyz/api/public/65c5cf65-bd77-4da0-b41c-cb6d237e7e2f/subgraphs/solv-payable-factory-mantle/-/gn', } -const slotListUrl = 'https://cdn.jsdelivr.net/gh/solv-finance-dev/solv-protocol-rwa-slot/slot.json'; +const slotListUrl = 'https://raw.githubusercontent.com/solv-finance/solv-protocol-defillama/refs/heads/main/solv-rwa-slot.json'; async function tvl(api) { diff --git a/projects/solvbtc/index.js b/projects/solvbtc/index.js index 1c35f29559..e8cfcd1456 100644 --- a/projects/solvbtc/index.js +++ b/projects/solvbtc/index.js @@ -1,43 +1,22 @@ -const abi = require("./abi.json"); const { getConfig } = require("../helper/cache"); -const { cachedGraphQuery } = require("../helper/cache"); const { sumTokens2, } = require("../helper/unwrapLPs"); +const { sumTokens } = require("../helper/chain/bitcoin"); -// The Graph -const graphUrlList = { - ethereum: 'https://api.studio.thegraph.com/query/40045/solv-payable-factory-prod/version/latest', - bsc: 'https://api.studio.thegraph.com/query/40045/solv-payable-factory-bsc/version/latest', - arbitrum: 'https://api.studio.thegraph.com/query/40045/solv-payable-factory-arbitrum/version/latest', - mantle: 'https://api.0xgraph.xyz/api/public/65c5cf65-bd77-4da0-b41c-cb6d237e7e2f/subgraphs/solv-payable-factory-mantle/-/gn', - merlin: 'http://solv-subgraph-server-alb-694489734.us-west-1.elb.amazonaws.com:8000/subgraphs/name/solv-payable-factory-merlin', -} - -const solvbtcListUrl = 'https://raw.githubusercontent.com/solv-finance-dev/slov-protocol-defillama/main/solvbtc.json'; +const solvbtcListUrl = 'https://raw.githubusercontent.com/solv-finance/solv-protocol-defillama/refs/heads/main/solvbtc.json'; -async function tvl(api) { +async function bitcoinTvl(api) { let solvbtc = (await getConfig('solv-protocol/solvbtc', solvbtcListUrl)); - - await gm(api, solvbtc) - await vaultBalance(api, solvbtc); - await otherDeposit(api, solvbtc); - - return api.getBalances(); -} - -async function gm(api, solvbtc) { - if (!solvbtc[api.chain] || !solvbtc[api.chain]["gm"]) { + if (!solvbtc[api.chain]) { return; } - let gm = solvbtc[api.chain]["gm"]; - let tokens = [] - for (const pool of gm["depositAddress"]) { - for (const address of gm["gmTokens"]) { - tokens.push({ address, pool }) - } - } + return sumTokens({ owners: solvbtc[api.chain] }) +} - await sumTokens2({ api, tokensAndOwners: tokens.map(i => [i.address, i.pool]), permitFailure: true }); +async function tvl(api) { + let solvbtc = (await getConfig('solv-protocol/solvbtc', solvbtcListUrl)); + + await otherDeposit(api, solvbtc); } async function otherDeposit(api, solvbtc) { @@ -46,112 +25,25 @@ async function otherDeposit(api, solvbtc) { } let otherDeposit = solvbtc[api.chain]["otherDeposit"]; - let tokens = [] + let tokensAndOwners = [] for (const deposit of otherDeposit["depositAddress"]) { for (const tokenAddress of otherDeposit["tokens"]) { - tokens.push({ tokenAddress, deposit }) + tokensAndOwners.push([tokenAddress, deposit]) } } - await sumTokens2({ api, tokensAndOwners: tokens.map(i => [i.tokenAddress, i.deposit]), permitFailure: true }); -} - -async function concrete(slots, api) { - var slotsList = []; - var only = {}; - for (var i = 0; i < slots.length; i++) { - if (!only[slots[i].contractAddress]) { - slotsList.push(slots[i]); - only[slots[i].contractAddress] = true; - } - } - - const concreteLists = await api.multiCall({ - calls: slotsList.map((index) => index.contractAddress), - abi: abi.concrete, - }) - - let concretes = {}; - for (var k = 0; k < concreteLists.length; k++) { - concretes[slotsList[k].contractAddress] = concreteLists[k]; - } - - return concretes; + await sumTokens2({ api, tokensAndOwners, permitFailure: true }); } -async function vaultBalance(api, solvbtc) { - if (!solvbtc[api.chain] || !solvbtc[api.chain]["slot"]) { - return; - } - let slot = solvbtc[api.chain]["slot"]; - - const graphData = await getGraphData(api.timestamp, api.chain, api, slot); - if (graphData.pools.length > 0) { - const poolLists = graphData.pools; - - const poolConcretes = await concrete(poolLists, api); - - const poolBaseInfos = await api.multiCall({ - abi: abi.slotBaseInfo, - calls: poolLists.map((index) => ({ - target: poolConcretes[index.contractAddress], - params: [index.openFundShareSlot] - })), - }) - - let vaults = {}; - for (const key in poolLists) { - if (poolBaseInfos[key][1] && poolLists[key]["vault"]) { - vaults[`${poolBaseInfos[key][1].toLowerCase()}-${poolLists[key]["vault"].toLowerCase()}`] = [poolBaseInfos[key][1], poolLists[key]["vault"]] - } +// node test.js projects/solvbtc +['bitcoin', 'ethereum', 'bsc', 'polygon', 'arbitrum', 'mantle', 'merlin', 'avax', 'bob', 'base'].forEach(chain => { + if (chain == 'bitcoin') { + module.exports[chain] = { + tvl: bitcoinTvl, } - - const balances = await api.multiCall({ - abi: abi.balanceOf, - calls: Object.values(vaults).map((index) => ({ - target: index[0], - params: [index[1]] - })), - }) - - for (const key in balances) { - api.add(Object.values(vaults)[key][0], balances[key]) + } else { + module.exports[chain] = { + tvl } } -} - - -async function getGraphData(timestamp, chain, api, slot) { - - const slotDataQuery = `query PoolOrderInfos { - poolOrderInfos(first: 1000 where:{fundraisingEndTime_gt:${timestamp}, openFundShareSlot_in: ${JSON.stringify(slot)}}) { - marketContractAddress - contractAddress - navOracle - poolId - vault - openFundShareSlot - } - }`; - - let data; - if (graphUrlList[chain]) { - data = (await cachedGraphQuery(`solv-protocol/funds-graph-data/${chain}`, graphUrlList[chain], slotDataQuery, { api, })); - } - - let poolList = []; - if (data != undefined && data.poolOrderInfos != undefined) { - poolList = data.poolOrderInfos; - } - - return { - pools: poolList - }; -} - -// node test.js projects/solvbtc -['ethereum', 'bsc', 'polygon', 'arbitrum', 'mantle', 'merlin'].forEach(chain => { - module.exports[chain] = { - tvl - } }) diff --git a/projects/sommelier/index.js b/projects/sommelier/index.js index 33421b9bf4..84e3a658cd 100644 --- a/projects/sommelier/index.js +++ b/projects/sommelier/index.js @@ -65,7 +65,7 @@ function filterActiveCellars(cellars, block) { module.exports = { methodology: "TVL is calculated as the sum of deposits invested into the strategy, deposits waiting to be invested, and yield waiting to be reinvested or redistributed across all Cellars.", - start: 1656652494, + start: '2022-07-01', ["ethereum"]: { tvl: ethereum_tvl }, ["arbitrum"]: { tvl: arbitrum_tvl }, ["optimism"]: { tvl: optimism_tvl }, diff --git a/projects/sonic-market-amm/index.js b/projects/sonic-market-amm/index.js new file mode 100644 index 0000000000..aaef76582b --- /dev/null +++ b/projects/sonic-market-amm/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'sonic': '0x01D6747dD2d65dDD90FAEC2C84727c2706ee28E2' +}) \ No newline at end of file diff --git a/projects/sonic-market-orderbook/index.js b/projects/sonic-market-orderbook/index.js new file mode 100644 index 0000000000..aba82ce753 --- /dev/null +++ b/projects/sonic-market-orderbook/index.js @@ -0,0 +1,33 @@ +const { getLogs2 } = require('../helper/cache/getLogs') +const { sumTokens2 } = require('../helper/unwrapLPs') +const { getUniqueAddresses } = require('../helper/utils') + +const abi = { + openEvent: 'event Open(uint192 indexed id, address indexed base, address indexed quote, uint64 unitSize, uint24 makerPolicy, uint24 takerPolicy, address hooks)', +} + +const config = { + sonic: { factory: '0xD4aD5Ed9E1436904624b6dB8B1BE31f36317C636', fromBlock: 297198, }, +} + +function customCacheFunction({ cache, logs }) { + if (!cache.logs) cache.logs = [] + const tokens = logs.map(({ base, quote }) => [base, quote]).flat() + cache.logs.push(...tokens) + cache.logs = getUniqueAddresses(cache.logs) + return cache +} + +async function tvl(api) { + const { factory, fromBlock } = config[api.chain] + const tokens = await getLogs2({ api, factory, eventAbi: abi.openEvent, fromBlock, extraKey: 'open-address', customCacheFunction, skipCacheRead: true }) + return sumTokens2({ api, owner: factory, tokens, permitFailure: true }) +} + +module.exports = { + methodology: "TVL consists of assets deposited into the Sonic Market Book Manager contract", +}; + +Object.keys(config).forEach(chain => { + module.exports[chain] = { tvl } +}) \ No newline at end of file diff --git a/projects/sophon/index.js b/projects/sophon/index.js new file mode 100644 index 0000000000..7c557c4be8 --- /dev/null +++ b/projects/sophon/index.js @@ -0,0 +1,7 @@ +const getTvl = require("../txBridge/util") + +module.exports = { + ethereum: { + tvl: async (api) => getTvl(api, { chainId: 50104, }), + }, +} diff --git a/projects/sorbetfinance/abi.json b/projects/sorbetfinance/abi.json deleted file mode 100644 index a3f879f2f9..0000000000 --- a/projects/sorbetfinance/abi.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "getDeployers": "address[]:getDeployers", - "getPools": "function getPools(address deployer) view returns (address[])", - "token0": "address:token0", - "token1": "address:token1", - "getUnderlyingBalances": "function getUnderlyingBalances() view returns (uint256 amount0Current, uint256 amount1Current)" -} \ No newline at end of file diff --git a/projects/sorbetfinance/index.js b/projects/sorbetfinance/index.js index a6e0f7ee33..cfe8a07a34 100644 --- a/projects/sorbetfinance/index.js +++ b/projects/sorbetfinance/index.js @@ -1,85 +1,16 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); +const abi = { + "getPools": "function getPools(address deployer) view returns (address[])", + "getUnderlyingBalances": "function getUnderlyingBalances() view returns (uint256 amount0Current, uint256 amount1Current)" +} -const chainTvl = (chain, G_UNI_Factory) => async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - const block = chainBlocks[chain] - - const getAllDeplores = ( - await sdk.api.abi.call({ - abi: abi.getDeployers, - target: G_UNI_Factory, - block, - chain, - }) - ).output; - - const getAllPools = ( - await sdk.api.abi.multiCall({ - abi: abi.getPools, - calls: getAllDeplores.map((deployer) => ({ - target: G_UNI_Factory, - params: deployer, - })), - block, - chain, - }) - ).output.map((pool) => pool.output); - - const allGelatoPools = [].concat.apply([], getAllPools); - - const token0 = ( - await sdk.api.abi.multiCall({ - abi: abi.token0, - calls: allGelatoPools.map((pool) => ({ - target: pool, - })), - block, - chain - }) - ).output.map((t0) => t0.output); - - const token1 = ( - await sdk.api.abi.multiCall({ - abi: abi.token1, - calls: allGelatoPools.map((pool) => ({ - target: pool, - })), - block, - chain, - }) - ).output.map((t1) => t1.output); - - const balanceOfPools = ( - await sdk.api.abi.multiCall({ - abi: abi.getUnderlyingBalances, - calls: allGelatoPools.map((pool) => ({ - target: pool, - })), - block, - chain - }) - ).output.map((bal) => bal.output); - - for (let i = 0; i < allGelatoPools.length; i++) { - sdk.util.sumSingleBalance(balances, `${chain}:${token0[i]}`, balanceOfPools[i].amount0Current); - sdk.util.sumSingleBalance(balances, `${chain}:${token1[i]}`, balanceOfPools[i].amount1Current); - } - - return balances; -}; +const config = { + ethereum: '0xEA1aFf9dbFfD1580F6b81A3ad3589E66652dB7D9', + optimism: '0x2845c6929d621e32B7596520C8a1E5a37e616F09', + polygon: '0x37265A834e95D11c36527451c7844eF346dC342a' +} module.exports = { doublecounted: true, - ethereum: { - tvl: chainTvl("ethereum", "0xEA1aFf9dbFfD1580F6b81A3ad3589E66652dB7D9"), - }, - optimism: { - tvl: chainTvl("optimism", "0x2845c6929d621e32B7596520C8a1E5a37e616F09"), - }, - polygon: { - tvl: chainTvl("polygon", "0x37265A834e95D11c36527451c7844eF346dC342a") - }, methodology: "Counts TVL that's on all the Pools through G-UNI Factory Contract", hallmarks:[ @@ -87,3 +18,20 @@ module.exports = { [1643056020, "Maker GUNI Cap to 500M"], ], }; + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + const G_UNI_Factory = config[chain] + const deployers = await api.call({ abi: "address[]:getDeployers", target: G_UNI_Factory}) + const pools = (await api.multiCall({ abi: abi.getPools, calls: deployers, target: G_UNI_Factory})).flat() + const token0s = await api.multiCall({ abi: "address:token0", calls: pools }) + const token1s = await api.multiCall({ abi: "address:token1", calls: pools }) + const bals = await api.multiCall({ abi: abi.getUnderlyingBalances, calls: pools }) + bals.forEach((bal, i) => { + api.add(token0s[i], bal.amount0Current) + api.add(token1s[i], bal.amount1Current) + }) + } + } +}) \ No newline at end of file diff --git a/projects/spacewhale/index.js b/projects/spacewhale/index.js index 4d71132704..0d5c8a4e23 100644 --- a/projects/spacewhale/index.js +++ b/projects/spacewhale/index.js @@ -6,7 +6,7 @@ const SPACEWHALE = "0xf5961a2441fC68E38300cd8ae8d6a172b12D7E7A"; // SPACEWHALE const assets = [nullAddress, ADDRESSES.arbitrum.USDC_CIRCLE] // ETH, USDC module.exports = { - start: 1712109600, + start: '2024-04-03', arbitrum: { tvl: sumTokensExport({ owners: [fundStore], tokens: assets }), staking: sumTokensExport({ owners: [fundStore], tokens: [SPACEWHALE] }), diff --git a/projects/spadefinance/index.js b/projects/spadefinance/index.js index ddaece14bd..d5ab771e59 100644 --- a/projects/spadefinance/index.js +++ b/projects/spadefinance/index.js @@ -8,4 +8,5 @@ module.exports = masterchefExports({ module.exports.hallmarks = [ [1647734400, "Rug Pull"] - ] + ], +module.exports.deadFrom='2022-03-20' diff --git a/projects/spark-fi/index.js b/projects/spark-fi/index.js index 62f0098512..1771aae1c1 100644 --- a/projects/spark-fi/index.js +++ b/projects/spark-fi/index.js @@ -1,8 +1,11 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { aaveExports } = require('../helper/aave'); +const { aaveExports, aaveChainTvl } = require('../helper/aave'); module.exports = { - ethereum: aaveExports('ethereum', '0x03cFa0C4622FF84E50E75062683F44c9587e6Cc1', undefined, ["0xFc21d6d146E6086B8359705C8b28512a983db0cb"], { v3: true, blacklistedTokens: [ADDRESSES.ethereum.DAI]}), + ethereum: { + tvl: aaveChainTvl('ethereum', '0x03cFa0C4622FF84E50E75062683F44c9587e6Cc1', undefined, ["0xFc21d6d146E6086B8359705C8b28512a983db0cb"], false, true, { blacklistedTokens: [ADDRESSES.ethereum.DAI] }), + borrowed: aaveChainTvl('ethereum', '0x03cFa0C4622FF84E50E75062683F44c9587e6Cc1', undefined, ["0xFc21d6d146E6086B8359705C8b28512a983db0cb"], true, true, {}) + }, xdai: aaveExports('xdai', '0xA98DaCB3fC964A6A0d2ce3B77294241585EAbA6d', undefined, ["0x2a002054A06546bB5a264D57A81347e23Af91D18"], { v3: true}) }; \ No newline at end of file diff --git a/projects/spark/index.js b/projects/spark/index.js new file mode 100644 index 0000000000..bf9c171e10 --- /dev/null +++ b/projects/spark/index.js @@ -0,0 +1,14 @@ +const { sumTokens } = require("../helper/chain/fuel"); + +module.exports = { + fuel: { + tvl: (api) => + sumTokens({ + api, owners: [ + '0xfe2c524ad8e088f33d232a45dbea43e792861640b71aa1814b30506bf8430ee5', + '0xdafe498b31f24ea5577055e86bf77e96bcba2c39a7ae47abaa819c303a45a352', + '0x81e83f73530c262b0dbf5414649a875c48a48144de3c08ff68cb9d54b36f2eaa', + ] + }) + } +} \ No newline at end of file diff --git a/projects/sparkdex-perps/index.js b/projects/sparkdex-perps/index.js new file mode 100644 index 0000000000..9ff7cbf5d1 --- /dev/null +++ b/projects/sparkdex-perps/index.js @@ -0,0 +1,15 @@ +const { nullAddress } = require("../helper/unwrapLPs"); + +const FlareUSDCe="0xFbDa5F676cB37624f28265A144A48B0d6e87d3b6"; + +async function FlareTvl(api) { + const tokens = [nullAddress, FlareUSDCe]; + const owners = ["0xF59b51cB430736E0F344b0101b23981DEaE10968"]; + return api.sumTokens({ owners, tokens }); +} + +module.exports = { + flare: { + tvl: FlareTvl, + }, +}; diff --git a/projects/sparkdex-v2/index.js b/projects/sparkdex-v2/index.js index 15b857585c..1427df73c2 100644 --- a/projects/sparkdex-v2/index.js +++ b/projects/sparkdex-v2/index.js @@ -6,7 +6,6 @@ module.exports = { tvl: getUniTVL({ factory: "0x16b619B04c961E8f4F06C10B42FDAbb328980A89", useDefaultCoreAssets: true, - fetchBalances: true, }), }, }; diff --git a/projects/sparkdex-v3-1/index.js b/projects/sparkdex-v3-1/index.js new file mode 100644 index 0000000000..0b7f09c0ce --- /dev/null +++ b/projects/sparkdex-v3-1/index.js @@ -0,0 +1,6 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +module.exports = uniV3Export({ + flare: { factory: '0x8A2578d23d4C532cC9A98FaD91C0523f5efDE652', fromBlock: + 30717263, }, +}) diff --git a/projects/sparkswap/index.js b/projects/sparkswap/index.js index 154c1ac9e5..f1aa9de984 100644 --- a/projects/sparkswap/index.js +++ b/projects/sparkswap/index.js @@ -1,3 +1,4 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { getUniTVL } = require("../helper/unknownTokens"); const { sumTokensExport, @@ -10,7 +11,7 @@ const pendleAbi = require("../pendle/abi.json"); const FACTORY = "0x955219A87eB0C6754fd247266af970F7d16906CD"; const SPARK_TOKEN = "0x6386704cD6f7A584EA9D23cccA66aF7EBA5a727e"; const SPARK_LP = "0x33208439e1B28B1d6fCfbB6334e9950027Ee3B52"; -const SDAI_TOKEN = "0x30FCB23A906493371b1721C8feb8815804808D74"; +const SDAI_TOKEN = ADDRESSES.pulse.sDAI; const SDAI_DAI_LP = "0xf32B9398a7277609772F328Fc2005D7DA5420E77"; const SDAI_SPARK_LP = "0x9095D464A29Abd1B840C1C5205FB602ae5b011FF"; const MASTERCHEF = "0x63c2a0083861F8C496A0A29BD8BA223E1180664e"; diff --git a/projects/spartan-protocol/abis/PoolFactory.json b/projects/spartan-protocol/abis/PoolFactory.json deleted file mode 100644 index 6e638c83f7..0000000000 --- a/projects/spartan-protocol/abis/PoolFactory.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "getPool": "function getPool(address token) view returns (address pool)", - "getTokenAssets": "address[]:getTokenAssets" -} \ No newline at end of file diff --git a/projects/spartan-protocol/index.js b/projects/spartan-protocol/index.js index 05c0ee3a4e..104cf4f6db 100644 --- a/projects/spartan-protocol/index.js +++ b/projects/spartan-protocol/index.js @@ -1,48 +1,16 @@ -const sdk = require("@defillama/sdk"); - -const factoryAbi = require("./abis/PoolFactory.json"); +const factoryAbi = { + "getPool": "function getPool(address token) view returns (address pool)", + "getTokenAssets": "address[]:getTokenAssets" +} const factory = "0x2C577706579E08A88bd30df0Fd7A5778A707c3AD"; const sparta = "0x3910db0600eA925F63C36DdB1351aB6E2c6eb102"; -async function tvl(timestamp, ethBlock, chainBlocks) { - let tokens = await sdk.api.abi.call({ - target: factory, - abi: factoryAbi["getTokenAssets"], - block: chainBlocks.bsc, - params: [], - chain: "bsc", - }); // Get listed token array - tokens = tokens.output; - - let balances = {}; // Setup the balances object - for (let i = 0; i < tokens.length; i++) { - const poolAddress = sdk.api.abi.call({ - target: factory, - abi: factoryAbi["getPool"], - block: chainBlocks.bsc, - params: [tokens[i]], - chain: "bsc", - }); // PoolFactory.getPool(tokenAddr) - - const tokenBal = sdk.api.erc20.balanceOf({ - target: tokens[i], - owner: (await poolAddress).output, - chain: "bsc", - block: chainBlocks.bsc, - }); // Pool's token balance - const spartaBal = sdk.api.erc20.balanceOf({ - target: sparta, - owner: (await poolAddress).output, - chain: "bsc", - block: chainBlocks.bsc, - }); // Pool's sparta balance - - sdk.util.sumSingleBalance(balances, `bsc:${tokens[i]}`, (await tokenBal).output) - sdk.util.sumSingleBalance(balances, `bsc:${sparta}`, (await spartaBal).output) - } - - return balances; +async function tvl(api) { + let tokens = await api.call({ target: factory, abi: factoryAbi["getTokenAssets"], }) + const pools = await api.multiCall({ abi: factoryAbi.getPool, target: factory, calls: tokens }) + const ownerTokens = pools.map((pool, i) => [[tokens[i], sparta], pool]) + return api.sumTokens({ ownerTokens }) } module.exports = { diff --git a/projects/spectra/index.js b/projects/spectra/index.js index a0dfa4546a..1b6a71bb2f 100644 --- a/projects/spectra/index.js +++ b/projects/spectra/index.js @@ -2,9 +2,17 @@ const { getLogs } = require("../helper/cache/getLogs"); const abi = require("./abi.json"); const config = require("./config.json"); const sdk = require("@defillama/sdk"); +const { staking } = require("../helper/staking.js") + +// staking - SPECTRA token +const SPECTRA = "0x64fcc3a02eeeba05ef701b7eed066c6ebd5d4e51" +const veSPECTRA = "0x6a89228055c7c28430692e342f149f37462b478b" module.exports = { methodology: `All deposited underlying in Spectra Principal Tokens and all underlying supplied as liquidity in Spectra Markets`, + hallmarks: [ + [1717074000, "V2 Launch"] + ], }; const curvePoolDeployedTopic = @@ -118,3 +126,5 @@ Object.keys(config).forEach((chain) => { return logs.map((i) => i.pt); } }); + +module.exports.base.staking = staking(veSPECTRA, SPECTRA) \ No newline at end of file diff --git a/projects/sperax-demeter-v2/index.js b/projects/sperax-demeter-v2/index.js new file mode 100644 index 0000000000..2c04b1014c --- /dev/null +++ b/projects/sperax-demeter-v2/index.js @@ -0,0 +1,9 @@ +async function tvl(api) { + const farms = await api.call({ target: '0x45bC6B44107837E7aBB21E2CaCbe7612Fce222e0', abi: 'address[]:getFarmList', }) + const tokensAndBals = await api.multiCall({ calls: farms, abi: 'function getTokenAmounts() view returns (address[], uint256[])', }) + tokensAndBals.forEach(([t, b]) => api.add(t, b)) +} + +module.exports = { + arbitrum: { tvl }, +} \ No newline at end of file diff --git a/projects/spherium/abi.json b/projects/spherium/abi.json deleted file mode 100644 index 8c892f3b37..0000000000 --- a/projects/spherium/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "getAllWhitelistedTokenNames": "string[]:getAllWhitelistedTokenNames", - "whitelistedTokenAddress": "function whitelistedTokenAddress(string) view returns (address)" -} \ No newline at end of file diff --git a/projects/spherium/constants.js b/projects/spherium/constants.js deleted file mode 100644 index 93e1e20f38..0000000000 --- a/projects/spherium/constants.js +++ /dev/null @@ -1,20 +0,0 @@ -const bridgeAddr = "0x0b8c93c6aaeabfdf7845786188727aa04100cb61"; -const supportedChains = [ - "ethereum", - "bsc", - "polygon", - "avax", - "fantom", - "arbitrum", - "cronos", - "moonriver", - "moonbeam", - "optimism", - "aurora", - "okexchain", - "kcc", -]; -module.exports = { - bridgeAddr, - supportedChains, -}; diff --git a/projects/spherium/index.js b/projects/spherium/index.js index 770a55c88b..629630b861 100644 --- a/projects/spherium/index.js +++ b/projects/spherium/index.js @@ -1,35 +1,33 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); -const { supportedChains, bridgeAddr } = require("./constants"); -const { sumTokens2 } = require('../helper/unwrapLPs') +const abi = { + "getAllWhitelistedTokenNames": "string[]:getAllWhitelistedTokenNames", + "whitelistedTokenAddress": "function whitelistedTokenAddress(string) view returns (address)" +} +const bridgeAddr = "0x0b8c93c6aaeabfdf7845786188727aa04100cb61"; +const supportedChains = [ + "ethereum", + "bsc", + "polygon", + "avax", + "fantom", + "arbitrum", + "cronos", + "moonriver", + "moonbeam", + "optimism", + "aurora", + "okexchain", + "kcc", +]; const blackList = new Set(["SPHRI"]); -function chainTvl(chain) { - return async (_timestamp, _block, {[chain]: block}) => { - const tokens = await getTokens(chain, block) - return sumTokens2({ chain, block, owner: bridgeAddr, tokens, }) - }; -} - -async function getTokens(chain, block) { - let { output: tokenNames } = await sdk.api.abi.call({ - target: bridgeAddr, - abi: abi.getAllWhitelistedTokenNames, - chain, block, - }) +const tvl = async (api) => { + let tokenNames = await api.call({ target: bridgeAddr, abi: abi.getAllWhitelistedTokenNames, }) tokenNames = tokenNames.filter(i => !blackList.has(i)) - const { output: tokens } = await sdk.api.abi.multiCall({ - target: bridgeAddr, - abi: abi.whitelistedTokenAddress, - calls: tokenNames.map(i => ({ params: i})), - chain, block, - }) - return tokens.map(i => i.output) -} - -module.exports = {} + const tokens = await api.multiCall({ target: bridgeAddr, abi: abi.whitelistedTokenAddress, calls: tokenNames }) + return api.sumTokens({ owner: bridgeAddr, tokens, }) +}; supportedChains.forEach((chain) => { - module.exports[chain] = { tvl: chainTvl(chain) }; + module.exports[chain] = { tvl }; }); \ No newline at end of file diff --git a/projects/spiko/index.js b/projects/spiko/index.js index 969fbee11a..648318b20f 100644 --- a/projects/spiko/index.js +++ b/projects/spiko/index.js @@ -1,21 +1,49 @@ -const assets = { - polygon: [ - '0xe4880249745eAc5F1eD9d8F7DF844792D560e750', - '0xa0769f7A8fC65e47dE93797b4e21C073c117Fc80' - ], - ethereum: [ - '0xe4880249745eAc5F1eD9d8F7DF844792D560e750', - '0xa0769f7A8fC65e47dE93797b4e21C073c117Fc80' - ] +const { multiCall } = require('../helper/chain/starknet') +const { sumTokens2 } = require('../helper/unwrapLPs') + +const config = { + polygon: [ + '0xe4880249745eAc5F1eD9d8F7DF844792D560e750', + '0xa0769f7A8fC65e47dE93797b4e21C073c117Fc80' + ], + ethereum: [ + '0xe4880249745eAc5F1eD9d8F7DF844792D560e750', + '0xa0769f7A8fC65e47dE93797b4e21C073c117Fc80' + ], + arbitrum: [ + '0x021289588cd81dC1AC87ea91e91607eEF68303F5', + '0xcbeb19549054cc0a6257a77736fc78c367216ce7' + ], + starknet: [ + '0x20ff2f6021ada9edbceaf31b96f9f67b746662a6e6b2bc9d30c0d3e290a71f6', + '0x4f5e0de717daa6aa8de63b1bf2e8d7823ec5b21a88461b1519d9dbc956fb7f2' + ] } -module.exports = {} +const totalSupplyAbi = { + "name": "totalSupply", + "type": "function", + "inputs": [], + "outputs": [ + { + "name": "totalSupply", + "type": "uint256" + } + ], + "stateMutability": "view", +} -Object.keys(assets).forEach(chain => { - module.exports[chain] = { - tvl: (api) => api.multiCall({ - abi: 'erc20:totalSupply', - calls: assets[api.chain].map(target => ({ target })) - }).then(supplies => api.add(assets[api.chain], supplies)) +Object.keys(config).forEach(chain => { + const assets = config[chain] + module.exports[chain] = { + tvl: async (api) => { + let supplies + if (chain === 'starknet') + supplies = await multiCall({ abi: totalSupplyAbi, calls: assets }) + else + supplies = await api.multiCall({ abi: 'erc20:totalSupply', calls: assets }) + api.add(assets, supplies) + return sumTokens2({ api }) } + } }) \ No newline at end of file diff --git a/projects/spiral-dao/index.js b/projects/spiral-dao/index.js index 31eb0be0df..6e6da8c314 100644 --- a/projects/spiral-dao/index.js +++ b/projects/spiral-dao/index.js @@ -19,7 +19,6 @@ async function tvl(api) { module.exports = { methodology: 'Information is retrieved from both the blockchain and the SpiralDAO API. "https://api.spiral.farm".', - start: 16991020, ethereum: { tvl, staking: staking(STAKING, COIL), diff --git a/projects/spiritswap-lending/index.js b/projects/spiritswap-lending/index.js index d2d37e7143..c1471d9c59 100644 --- a/projects/spiritswap-lending/index.js +++ b/projects/spiritswap-lending/index.js @@ -1,20 +1,8 @@ -const {usdCompoundExports} = require('../helper/compound') - -const abis = { - oracle: "address:getRegistry", - underlyingPrice: "function getPriceForUnderling(address cToken) view returns (uint256)", -} - -const unitroller_fantom = "0x892701d128d63c9856A9Eb5d967982F78FD3F2AE" - -const olalending = usdCompoundExports(unitroller_fantom, "fantom", "0xed8F2C964b47D4d607a429D4eeA972B186E6f111", abis) +const { compoundExports2 } = require('../helper/compound') module.exports = { hallmarks: [ [1693526400, "Lending Network deprecated"] ], - fantom:{ - tvl: olalending.tvl, - borrowed: olalending.borrowed - }, + fantom: compoundExports2({ comptroller: '0x892701d128d63c9856A9Eb5d967982F78FD3F2AE' }), } \ No newline at end of file diff --git a/projects/spl-governance/index.js b/projects/spl-governance/index.js index f68ef0c49f..1abdbfd465 100644 --- a/projects/spl-governance/index.js +++ b/projects/spl-governance/index.js @@ -1,22 +1,36 @@ -const { getCache } = require('../helper/http') -const url = 'https://api.realms.today/stats/tvl' +const { PublicKey } = require('@solana/web3.js') +const { get } = require('../helper/http') +const { getConnection } = require('../helper/solana') +const { sliceIntoChunks } = require('../helper/utils') -async function tvl() { - const { tvl } = await getCache(url) - return tvlObject(tvl) -} +const url = 'https://realms-tvl.vercel.app/tvl/latest' -async function staking() { - const { ownTokens } = await getCache(url) - return tvlObject(ownTokens) -} +const isSolOrStable = (token) => ['sol', 'usd', 'btc', 'eth'].some(i => token.token_symbol.toLowerCase().includes(i)) + +async function tvl(api, isStaking = false) { + // const connnection = getConnection() + let { totalValueUsd: { tokens } } = await get(url) + const filterFn = isStaking ? i => !isSolOrStable(i) : isSolOrStable + tokens = tokens.filter(filterFn) + tokens.forEach(i => api.addUSDValue(i.value)) + /* const decimalsMap = {} + const _tokens = tokens.map(i => i.token) + const chunks = sliceIntoChunks(_tokens, 99) + + for (const chunk of chunks) { + const { value } = await connnection.getMultipleParsedAccounts(chunk.map(i => new PublicKey(i))) + value.forEach((val, i) => { + decimalsMap[chunk[i]] = val.data.parsed.info.decimals + }) + } -function tvlObject(obj) { - return Object.fromEntries(Object.entries(obj).filter(([_, i]) => +i > 1).map(([a, b]) => ['solana:'+a, b])) + for (const token of tokens) + api.add(token.token, +token.balance * 10 ** decimalsMap[token.token]) */ } module.exports = { - methodology: 'SOL token and stables held in the contracts are counted under tvl, gov tokens are counted under staking', + misrepresentedTokens: true, + methodology: 'SOL token and stables held in the contracts are counted under tvl, gov tokens are counted under staking', timetravel: false, - solana: { tvl, staking, } + solana: { tvl: api => tvl(api), staking: api => tvl(api, true), } } diff --git a/projects/spookyswap-v3/index.js b/projects/spookyswap-v3/index.js new file mode 100644 index 0000000000..130009168b --- /dev/null +++ b/projects/spookyswap-v3/index.js @@ -0,0 +1,12 @@ +const { uniV3Export } = require("../helper/uniswapV3"); + +const factory = "0x7928a2c48754501f3a8064765ECaE541daE5c3E6"; +const factory_bttc = "0xE12b00681dD2e90f51d9Edf55CE1A7D171338165"; +const factory_sonic = "0x3D91B700252e0E3eE7805d12e048a988Ab69C8ad"; + +module.exports = uniV3Export({ + fantom: { factory, fromBlock: 70992836, blacklistedTokens:['0x6e5e3ce13e2c7d4de000f93c4909164d0aa59f0b'] }, + //eon: { factory, fromBlock: 679684 }, + bittorrent: { factory: factory_bttc, fromBlock: 26441276 }, + sonic: { factory: factory_sonic, fromBlock: 286535 }, +}) diff --git a/projects/spookyswap/index.js b/projects/spookyswap/index.js index cd7b2c9190..dd2a206e91 100644 --- a/projects/spookyswap/index.js +++ b/projects/spookyswap/index.js @@ -9,5 +9,8 @@ module.exports={ }, bittorrent: { tvl: getUniTVL({ useDefaultCoreAssets: true, factory: '0xee4bc42157cf65291ba2fe839ae127e3cc76f741' }), + }, +sonic: { + tvl: getUniTVL({ useDefaultCoreAssets: true, factory: '0xEE4bC42157cf65291Ba2FE839AE127e3Cc76f741' }), } -} \ No newline at end of file +} diff --git a/projects/springsui-ecosystem/index.js b/projects/springsui-ecosystem/index.js new file mode 100644 index 0000000000..0a924af559 --- /dev/null +++ b/projects/springsui-ecosystem/index.js @@ -0,0 +1,32 @@ +const sui = require('../helper/chain/sui') + +const CREATE_EVENT_TYPE = '0xb0575765166030556a6eafd3b1b970eba8183ff748860680245b9edd41c716e7::events::Event<0xb0575765166030556a6eafd3b1b970eba8183ff748860680245b9edd41c716e7::liquid_staking::CreateEvent>'; +const EXCLUDE_POOL_IDS = [ + '0x15eda7330c8f99c30e430b4d82fd7ab2af3ead4ae17046fcb224aa9bad394f6b', +] + +async function tvl() { + const poolIds = (await sui.queryEvents({ + eventType: CREATE_EVENT_TYPE, + transform: (i) => i.event.liquid_staking_info_id, + })).filter((id) => !EXCLUDE_POOL_IDS.includes(id)); + + let suiAmount = 0; + const data = await sui.getObjects(poolIds); + + data.forEach((pool) => { + if (!pool) return; + suiAmount += pool.fields.storage.fields.total_sui_supply / 10 ** 9; + }); + return { + sui: suiAmount, + } +} + + +module.exports = { + methodology: "Calculates the amount of SUI staked in ecosystem SpringSui LSTs.", + sui: { + tvl, + } +} diff --git a/projects/springsui/index.js b/projects/springsui/index.js new file mode 100644 index 0000000000..72797930af --- /dev/null +++ b/projects/springsui/index.js @@ -0,0 +1,16 @@ +const sui = require('../helper/chain/sui') + +async function tvl() { + const pool = await sui.getObject('0x15eda7330c8f99c30e430b4d82fd7ab2af3ead4ae17046fcb224aa9bad394f6b'); + const suiAmount = pool.fields.storage.fields.total_sui_supply / 10 ** 9 + return { + sui: suiAmount, + } +} + +module.exports = { + methodology: "Calculates the amount of SUI staked in SpringSui liquid staking contracts.", + sui: { + tvl, + } +} diff --git a/projects/squid-defi/index.js b/projects/squid-defi/index.js index 35a500bfef..d05e6a3752 100644 --- a/projects/squid-defi/index.js +++ b/projects/squid-defi/index.js @@ -1,118 +1,28 @@ -const sdk = require("@defillama/sdk"); const abi = require("../helper/abis/masterchef.json"); -const {unwrapUniswapLPs} = require("../helper/unwrapLPs.js"); +const { sumTokens2 } = require("../helper/unwrapLPs.js"); +const { pool2 } = require('../helper/pool2') +const { staking } = require('../helper/staking') const token = "0xd86Be84feC60Fedf263059BB1581e00d2168e19D"; const masterchef = "0x1610374513e989Fc263A5741A053fa023A6f212A"; const pool2LPs = [ - "0xeA3998615d2Bfe793E84318d5fE9D3Aa3d0F2F3f", - "0x628C669511C4be30DA1c3C7Da4725eCD074c1c8B", - "0x961C853477cAc8B9cfef953312331a2bE0C31C67", - "0x7815A02bf54aa25039cC40Ac63daA84D876D130C" + "0xeA3998615d2Bfe793E84318d5fE9D3Aa3d0F2F3f", + "0x628C669511C4be30DA1c3C7Da4725eCD074c1c8B", + "0x961C853477cAc8B9cfef953312331a2bE0C31C67", + "0x7815A02bf54aa25039cC40Ac63daA84D876D130C" ] -async function tvl(timestamp, block, chainBlocks) { - let balances = {}; - - let { output: poolLength } = await sdk.api.abi.call({ - target: masterchef, - abi: abi["poolLength"], - block: chainBlocks.fantom, - chain: "fantom" - }); - - let { output: poolInfo } = await sdk.api.abi.multiCall({ - calls: Array.from({length: Number(poolLength)}, (v, k) => ({ - target: masterchef, - params: k - })), - abi: abi["poolInfo"], - block: chainBlocks.fantom, - chain: "fantom" - }); - - let { output: symbols } = await sdk.api.abi.multiCall({ - calls: poolInfo.map(pool => ({ - target: pool.output.lpToken - })), - abi: "erc20:symbol", - block: chainBlocks.fantom, - chain: "fantom" - }); - - let {output: balance } = await sdk.api.abi.multiCall({ - calls: poolInfo.map(pool => ({ - target: pool.output.lpToken, - params: masterchef - })), - abi: "erc20:balanceOf", - block: chainBlocks.fantom, - chain: "fantom" - }); - - let lpPositions = []; - for (let i = 0; i < Number(poolLength); i++) { - if (balance[i].output === null || poolInfo[i].output.lpToken === token) { - continue; - } - if (symbols[i].output.endsWith("LP")) { - lpPositions.push({ - balance: balance[i].output, - token: poolInfo[i].output.lpToken - }) - } else { - sdk.util.sumSingleBalance(balances, `fantom:${poolInfo[i].output.lpToken}`, balance[i].output); - } - } - - await unwrapUniswapLPs(balances, lpPositions, chainBlocks.fantom, "fantom", addr=>`fantom:${addr}`, [token]); - - return balances; -} - -async function pool2(timestamp, block, chainBlocks) { - let balances = {}; - - let {output: balance} = await sdk.api.abi.multiCall({ - calls: pool2LPs.map(pool => ({ - target: pool, - params: masterchef - })), - abi: "erc20:balanceOf", - block: chainBlocks.fantom, - chain: "fantom" - }); - - let lpPositions = Array.from({length: pool2LPs.length}, (v, k) => ({ - balance: balance[k].output, - token: pool2LPs[k] - })); - - await unwrapUniswapLPs(balances, lpPositions, chainBlocks.fantom, "fantom", addr=>`fantom:${addr}`); - - return balances; -} - -async function staking(timestamp, block, chainBlocks) { - let balances = {} - - let {output: balance} = await sdk.api.erc20.balanceOf({ - target: token, - owner: masterchef, - block: chainBlocks.fantom, - chain: "fantom" - }); - - sdk.util.sumSingleBalance(balances, token, balance); - - return balances; +async function tvl(api) { + const poolInfos = await api.fetchList({ lengthAbi: abi.poolLength, itemAbi: abi.poolInfo, target: masterchef }) + const tokens = poolInfos.map(pool => pool.lpToken) + return sumTokens2({ api, owner: masterchef, tokens, blacklistedTokens: [...pool2LPs, token], resolveLP: true }) } module.exports = { - fantom: { - tvl, - pool2, - staking - }, + fantom: { + tvl, + pool2: pool2(masterchef, pool2LPs), + staking: staking(masterchef, token) + }, } \ No newline at end of file diff --git a/projects/stCelo/index.js b/projects/stCelo/index.js index 5fd621a142..bdf3c8e18a 100644 --- a/projects/stCelo/index.js +++ b/projects/stCelo/index.js @@ -31,7 +31,6 @@ async function tvl(timestamp, ethBlock, chainBlocks) { module.exports = { methodology: 'TVL counts Celo staked by the protocol.', - start: 14330000, celo: { tvl } diff --git a/projects/stab-protocol/index.js b/projects/stab-protocol/index.js new file mode 100644 index 0000000000..679b44f4d5 --- /dev/null +++ b/projects/stab-protocol/index.js @@ -0,0 +1,16 @@ +const { sumTokensExport } = require('../helper/chain/radixdlt'); + +const STAB_COMPONENT = "component_rdx1cq70cjajtvllgk9z9wm9l8v6w8hsgtlw530cdgpraxprn4yevg89kf"; +const STAB_XRD_POOL = "pool_rdx1c4jj8lklg7edacflhk0tl202dzgawkujly4kqf0jfehyqd8watxw0r" + +module.exports = { + methodology: 'Calculates TVL using the amount of collateral locked to borrow STAB using CDPs, and amount of STAB and XRD locked in the protocol-native STAB/XRD pool.', + radixdlt: { + //get the token amounts of collaterals used in the STAB Protocol and tokens locked in STAB/XRD pool + tvl: sumTokensExport({ + owners: [STAB_COMPONENT, STAB_XRD_POOL], + blacklistedTokens: ['resource_rdx1t40lchq8k38eu4ztgve5svdpt0uxqmkvpy4a2ghnjcxjtdxttj9uam'] + }) + }, + timetravel: false, +}; diff --git a/projects/stability/index.js b/projects/stability/index.js index b2c1d60017..4e6ab6c3b8 100644 --- a/projects/stability/index.js +++ b/projects/stability/index.js @@ -8,6 +8,15 @@ const config = { polygon: { vaultManager: '0x6008b366058B42792A2497972A3312274DC5e1A8', }, + base: { + vaultManager: '0x2ba8C6A519CEDB6d1C35cEb14E8642625E91F77C', + }, + real: { + vaultManager: '0x7146efaab12A083b9826c66162062c21eC70fe3c', + }, + sonic: { + vaultManager: '0x589a504f2ee9d054b483c700fa814863d639381e', + }, } Object.keys(config).forEach(chain => { diff --git a/projects/stabl-v2/index.js b/projects/stabl-v2/index.js index e013ecb186..d5d81924cc 100644 --- a/projects/stabl-v2/index.js +++ b/projects/stabl-v2/index.js @@ -1,39 +1,15 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); const vault = "0x2D62f6D8288994c7900e9C359F8a72e84D17bfba"; -const polygonTvl = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - const stablecoins = ( - await sdk.api.abi.call({ - abi: abi.getAllAssets, - target: vault, - block: chainBlocks['polygon'], - chain: 'polygon' - }) - ).output; - - for (let i = 0; i < stablecoins.length; i++) { - const balance_stablecoin = ( - await sdk.api.abi.call({ - abi: abi.checkBalance, - target: vault, - params: stablecoins[i], - block: chainBlocks['polygon'], - chain: 'polygon' - }) - ).output; - - sdk.util.sumSingleBalance(balances, stablecoins[i], balance_stablecoin,'polygon'); - } - - return balances; -}; +async function tvl(api) { + const tokens = await api.call({ abi: abi.getAllAssets, target: vault }) + const bals = await api.multiCall({ abi: abi.checkBalance, target: vault, calls: tokens }) + api.add(tokens, bals) +} module.exports = { polygon: { - tvl: polygonTvl, + tvl, }, }; diff --git a/projects/stabl/index.js b/projects/stabl/index.js index fdfba33a84..e9dda7454f 100644 --- a/projects/stabl/index.js +++ b/projects/stabl/index.js @@ -1,5 +1,4 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const vaults = { polygon: "0xd1bb7d35db39954d43e16f65f09dd0766a772cff", @@ -17,12 +16,10 @@ module.exports = { Object.keys(vaults).forEach(chain => { module.exports[chain] = { - tvl: async (_, _b, {[chain]: block}) => { - const { output } = await sdk.api.abi.call({ chain, block, abi, target: vaults[chain]}) - return { - // refilling wont work because at mar 26th the decimals used by checkBalance() changed - [`${chain}:${assets[chain]}`]: output/100 - } + tvl: async (api) => { + const bal = await api.call({ abi, target: vaults[chain]}) + // refilling wont work because at mar 26th the decimals used by checkBalance() changed + api.add(assets[chain], bal/100) } } }) diff --git a/projects/stabledoin/index.js b/projects/stabledoin/index.js index cc886e818d..a2059c5cd3 100644 --- a/projects/stabledoin/index.js +++ b/projects/stabledoin/index.js @@ -8,6 +8,7 @@ module.exports = { hallmarks: [ [1666656000, "Rug Pull"] ], + deadFrom: 1666656000, dogechain: { tvl: sdk.util.sumChainTvls([ getUniTVL({ factory, useDefaultCoreAssets: true, }), diff --git a/projects/stacker/index.js b/projects/stacker/index.js index b882d291df..3174e77fed 100644 --- a/projects/stacker/index.js +++ b/projects/stacker/index.js @@ -1,27 +1,17 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk'); - const vaults = [ - // farm, token used - ['0x067b9FE006E16f52BBf647aB6799f87566480D2c', ADDRESSES.ethereum.USDC], // USDC - ['0x70e51DFc7A9FC391995C2B2f027BC49D4fe01577', ADDRESSES.ethereum.WETH], // WETH - ['0x17E9ed51feD2F190D50f5bd4f1a8C9CbCd36162A', ADDRESSES.ethereum.WBTC], // WBTC + '0x067b9FE006E16f52BBf647aB6799f87566480D2c', + '0x70e51DFc7A9FC391995C2B2f027BC49D4fe01577', + '0x17E9ed51feD2F190D50f5bd4f1a8C9CbCd36162A', ] -async function tvl(timestamp, block, chainBlocks) { - const balances = {} - await Promise.all(vaults.map(async vault=>{ - const supply = await sdk.api.erc20.totalSupply({ - target: vault[0], - block - }) - sdk.util.sumSingleBalance(balances, vault[1], supply.output) - })) - return balances +async function tvl(api) { + const tokens = await api.multiCall({ abi: 'address:underlyingContract', calls: vaults}) + const bals = await api.multiCall({ abi: 'uint256:totalUnderlying', calls: vaults}) + api.add(tokens, bals) } module.exports = { - ethereum:{ + ethereum: { tvl, }, } \ No newline at end of file diff --git a/projects/stacks-sbtc/index.js b/projects/stacks-sbtc/index.js new file mode 100644 index 0000000000..d6fee86510 --- /dev/null +++ b/projects/stacks-sbtc/index.js @@ -0,0 +1,9 @@ +const { sumTokensExport } = require('../helper/sumTokens'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + + +module.exports = { + bitcoin: { + tvl: sumTokensExport({ owners: bitcoinAddressBook.stacksSBTC }), + }, +}; diff --git a/projects/stader/index.js b/projects/stader/index.js index 617a0aef1d..c308d5ed19 100644 --- a/projects/stader/index.js +++ b/projects/stader/index.js @@ -1,66 +1,44 @@ const { nullAddress, sumTokens2 } = require("../helper/unwrapLPs"); const { get } = require("../helper/http"); + +const headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' }; let _res; async function getData() { - if (!_res) _res = get("https://universe.staderlabs.com/common/tvl"); + if (!_res) _res = await get('https://universe.staderlabs.com/common/tvl', { headers }) return _res; } async function hbarTvl() { - const res = await get("https://universe.staderlabs.com/common/tvl"); - return { - "hedera-hashgraph": res.hedera.native, - }; + const res = await get('https://universe.staderlabs.com/common/tvl', { headers }) + return { "hedera-hashgraph": res.hedera.native }; } async function maticTvl() { const res = await getData(); - return { - "matic-network": res.polygon.native, - }; + return { "matic-network": res.polygon.native }; } async function bscTvl() { const res = await getData(); - return { - binancecoin: res.bnb.native, - }; + return { binancecoin: res.bnb.native }; } async function ethTvl(api) { - return await api.call({ - abi: "uint256:totalAssets", - target: "0xcf5ea1b38380f6af39068375516daf40ed70d299", - }); + return await api.call({ abi: "uint256:totalAssets", target: "0xcf5ea1b38380f6af39068375516daf40ed70d299" }); } module.exports = { timetravel: false, - methodology: - "We aggregated the assets staked across Stader staking protocols", - /*terra: { - tvl, - },*/ - hedera: { - tvl: hbarTvl, - }, + methodology: "We aggregated the assets staked across Stader staking protocols", + /*terra: { tvl },*/ + hedera: { tvl: hbarTvl }, // its on ethereum because funds are locked there - /* ethereum: { - tvl: maticTvl - }, */ - fantom: { - tvl: () => ({}), - }, - terra2: { - tvl: () => ({}), - }, - bsc: { - tvl: bscTvl, - }, - near: { - tvl: () => ({}), - }, + // ethereum: { tvl: maticTvl }, + fantom: { tvl: () => ({}) }, + terra2: { tvl: () => ({}) }, + bsc: { tvl: bscTvl }, + near: { tvl: () => ({}) }, ethereum: { tvl: async (api) => { const res = await getData(); diff --git a/projects/stake-ly/index.js b/projects/stake-ly/index.js index 6f0f46927c..9fe6de935c 100644 --- a/projects/stake-ly/index.js +++ b/projects/stake-ly/index.js @@ -1,25 +1,13 @@ -const sdk = require("@defillama/sdk"); - -async function tvl(timestamp, _ethBlock, {klaytn: block}) { - const chain = "klaytn"; +async function tvl(api) { const stKlayAddress = "0xF80F2b22932fCEC6189b9153aA18662b15CC9C00" - - const pooledKlay = await sdk.api.abi.call({ - block, - chain, - target: stKlayAddress, - abi: "uint256:totalStaking", - }); - - return { - "klay-token": Number(pooledKlay.output) / 1e18, - }; + const pooledKlay = await api.call({ abi: 'uint256:totalStaking', target: stKlayAddress }) + api.addGasToken(pooledKlay) } module.exports = { - methodology: + methodology: "TVL is KLAY staked by the users and rewards accrued from node staking", - start: 1663585837, + start: '2022-09-19', klaytn: { tvl, }, diff --git a/projects/stake1/abi.json b/projects/stake1/abi.json deleted file mode 100644 index 02e2ecaf6f..0000000000 --- a/projects/stake1/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "see_s1ftm_circ": "uint256:see_s1ftm_circ", - "see_s1tomb_circ": "uint256:see_s1tomb_circ" -} \ No newline at end of file diff --git a/projects/stake1/contracts.json b/projects/stake1/contracts.json deleted file mode 100644 index cd3fd57c28..0000000000 --- a/projects/stake1/contracts.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "ftmVault": "0x3d2fa78f5e1aa2e7f29c965d0e22b32b8d5f14a9", - "tombVault": "0xA222fb9D2A811FAb3B334a5a9FA573C11fee73c1", - "avaxVault": "0x1689D5C5866909569a98B35da6A24090e4931C17", - "ethVault": "0xf9448f9a932474B5cAd9F05b86EA12376f2Fd770", - "Collateral": "0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E", - "FTM": "fantom:0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83", - "AVAX": "fantom:0x511D35c52a3C244E7b8bd92c0C297755FbD89212", - "TOMB": "fantom:0x6c021ae822bea943b2e66552bde1d2696a53fbb7", - "WETH": "fantom:0x74b23882a30290451A17c44f4F05243b6b58C76d", - "DAI": "fantom:0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E", - "pool2": "0x56995c729296c634cA367F8F3e5E5dEFF30D4511", - "daiPool2": "0x629670EAA62952990dd5b0658Ab6c6296fE2111b", - "ftmPool2": "0x4bd9B32677821939937FaDaEb30858806578339c" -} diff --git a/projects/stake1/index.js b/projects/stake1/index.js index e2dff31978..57d2b22512 100644 --- a/projects/stake1/index.js +++ b/projects/stake1/index.js @@ -1,70 +1,29 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); -const contracts = require("./contracts.json"); -const { staking } = require("../helper/staking"); - -async function vaultTvl(balances, block, abi, target, coin) { - const ftmStaked = ((await sdk.api.abi.call({ - chain: 'fantom', - block, - target, - abi, - })).output); - - sdk.util.sumSingleBalance(balances, coin, ftmStaked); +const ADDRESSES = require('../helper/coreAssets.json') +const contracts = { + "ftmVault": "0x3d2fa78f5e1aa2e7f29c965d0e22b32b8d5f14a9", + "tombVault": "0xA222fb9D2A811FAb3B334a5a9FA573C11fee73c1", + "avaxVault": "0x1689D5C5866909569a98B35da6A24090e4931C17", + "ethVault": "0xf9448f9a932474B5cAd9F05b86EA12376f2Fd770", + "pool2": "0x56995c729296c634cA367F8F3e5E5dEFF30D4511", + "daiPool2": "0x629670EAA62952990dd5b0658Ab6c6296fE2111b", + "ftmPool2": "0x4bd9B32677821939937FaDaEb30858806578339c" } -async function tvl(timestamp, block, chainBlocks) { - const balances = {}; - await vaultTvl( - balances, - chainBlocks.fantom, - abi.see_s1ftm_circ, - contracts.ftmVault, - contracts.FTM - ); - await vaultTvl( - balances, - chainBlocks.fantom, - abi.see_s1ftm_circ, - contracts.ethVault, - contracts.WETH - ); - await vaultTvl( - balances, - chainBlocks.fantom, - abi.see_s1tomb_circ, - contracts.avaxVault, - contracts.AVAX - ); - await vaultTvl( - balances, - chainBlocks.fantom, - abi.see_s1tomb_circ, - contracts.tombVault, - contracts.TOMB - ); - - const daiBalances = (await sdk.api.abi.multiCall({ - chain: 'fantom', - block: chainBlocks.fantom, - calls: [ - contracts.ftmVault, - contracts.ethVault, - contracts.avaxVault, - contracts.tombVault - ].map((v) => ({ - target: contracts.Collateral, - params: [v], - })), - abi: 'erc20:balanceOf' - })).output - .map(b => b.output) - .reduce((acc, el) => Number(acc) + Number(el), 0); - - sdk.util.sumSingleBalance(balances, contracts.DAI, daiBalances); +const { staking } = require("../helper/staking"); - return balances; +async function tvl(api) { + return api.sumTokens({ + tokensAndOwners: [ + [ADDRESSES.fantom.WFTM, contracts.ftmVault], + ['0x74b23882a30290451A17c44f4F05243b6b58C76d', contracts.ethVault], + ['0x511D35c52a3C244E7b8bd92c0C297755FbD89212', contracts.avaxVault], + ['0x6c021ae822bea943b2e66552bde1d2696a53fbb7', contracts.tombVault], + [ADDRESSES.fantom.DAI, contracts.ftmVault], + [ADDRESSES.fantom.DAI, contracts.ethVault], + [ADDRESSES.fantom.DAI, contracts.avaxVault], + [ADDRESSES.fantom.DAI, contracts.tombVault], + ] + }) } module.exports = { @@ -72,9 +31,8 @@ module.exports = { tvl, // hitting pool2 staking contract twice while stake1 isnt on coingecko pool2: staking( - [contracts.pool2, contracts.pool2], + [contracts.pool2], [contracts.daiPool2, contracts.ftmPool2], - 'fantom' ) } }; // node test.js projects/stake1/index.js diff --git a/projects/stakedotlink/index.js b/projects/stakedotlink/index.js index 29c957dca0..107c8aa202 100644 --- a/projects/stakedotlink/index.js +++ b/projects/stakedotlink/index.js @@ -24,7 +24,7 @@ async function staking(api) { module.exports = { methodology: "Queries LINK staking/priority pools and SDL staking pool for the total amount of tokens staked", - start: 1670337984, + start: '2022-12-06', ethereum: { tvl, staking, diff --git a/projects/stakeease/index.js b/projects/stakeease/index.js new file mode 100644 index 0000000000..9c914a3e6e --- /dev/null +++ b/projects/stakeease/index.js @@ -0,0 +1,16 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs") + +const SX_ETH_VAULT = "0x466B447D68112090ea46a98E15f22da44f87AF7F" + +module.exports = { + ethereum: { + tvl: sumTokensExport({ owner: SX_ETH_VAULT, tokens: [ + ADDRESSES.ethereum.WETH, + ADDRESSES.ethereum.EETH, + '0xbf5495Efe5DB9ce00f80364C8B423567e58d2110', + '0xFAe103DC9cf190eD75350761e95403b7b8aFa6c0', + '0xA1290d69c65A6Fe4DF752f95823fae25cB99e5A7', + ]}), + } +}; diff --git a/projects/stakestone-berastone/index.js b/projects/stakestone-berastone/index.js new file mode 100644 index 0000000000..d23640a24e --- /dev/null +++ b/projects/stakestone-berastone/index.js @@ -0,0 +1,26 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const vaultABI = { + "getUnderlyings": "function getUnderlyings() external view returns (address[])", + "assetsBorrowed": "function assetsBorrowed() external view returns (uint256)" +} + +const ETHVault = '0x8f88aE3798E8fF3D0e0DE7465A0863C9bbB577f0'; +const BTCVault = '0xf401Cc9f467c7046796D9A8b44b0c1348b4DEec7'; + +const tvl = async (api) => { + // to include assets moved to boyco vault + const usedTVL = await api.call({ abi: vaultABI.assetsBorrowed, target: ETHVault }) + api.add(ADDRESSES.ethereum.STONE, usedTVL); + + const vaults = [ETHVault, BTCVault]; + const tokens = await api.multiCall({ abi: vaultABI.getUnderlyings, calls: vaults}) + return api.sumTokens({ ownerTokens: tokens.map((t, i) => [t, vaults[i]]) }) +} + +module.exports = { + doublecounted: true, + ethereum: { + tvl, + } +} \ No newline at end of file diff --git a/projects/stakestone-btc/index.js b/projects/stakestone-btc/index.js new file mode 100644 index 0000000000..bec2f20850 --- /dev/null +++ b/projects/stakestone-btc/index.js @@ -0,0 +1,26 @@ +const vaultABI = { + "getDepositAmounts": "function getDepositAmounts() view returns (address[], uint256[])" +} + +const VaultBSC = '0x3aa0670E24Cb122e1d5307Ed74b0c44d619aFF9b'; +const VaultETH = '0x7dBAC0aA440A25D7FB43951f7b178FF7A809108D'; + +const bscTvl = async (api) => { + const [btclist] = await api.call({ abi: vaultABI.getDepositAmounts, target: VaultBSC }) + return api.sumTokens({ owner: VaultBSC, tokens: btclist }) +} + +const ethTvl = async (api) => { + const [btclist] = await api.call({ abi: vaultABI.getDepositAmounts, target: VaultETH }) + return api.sumTokens({ owner: VaultETH, tokens: btclist }) +} + +module.exports = { + bsc: { + tvl: bscTvl, + }, + ethereum: { + tvl: ethTvl, + } +} +module.exports.doublecounted = true; \ No newline at end of file diff --git a/projects/stakestone-stonebtc/index.js b/projects/stakestone-stonebtc/index.js new file mode 100644 index 0000000000..389449b041 --- /dev/null +++ b/projects/stakestone-stonebtc/index.js @@ -0,0 +1,16 @@ +const vaultABI = { + "getUnderlyings": "function getUnderlyings() external view returns (address[])" +} + +const Vault = '0x1fC603779DC6b4866769A58067777D2C52628226'; + +const Tvl = async (api) => { + const btclist = await api.call({ abi: vaultABI.getUnderlyings, target: Vault }) + return api.sumTokens({ owner: Vault, tokens: btclist }) +} + +module.exports = { + ethereum: { + tvl: Tvl, + } +} diff --git a/projects/stakestone/index.js b/projects/stakestone/index.js index 224ba93e6d..fa19277070 100644 --- a/projects/stakestone/index.js +++ b/projects/stakestone/index.js @@ -18,7 +18,6 @@ const mantaTvl = async (api) => { } module.exports = { - start: 18182242, ethereum: { tvl: ethTvl }, diff --git a/projects/stakewise/index.js b/projects/stakewise/index.js index a02caf9924..5ec1858c23 100644 --- a/projects/stakewise/index.js +++ b/projects/stakewise/index.js @@ -1,52 +1,50 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk'); const { getLogs } = require('../helper/cache/getLogs') -async function tvl(api) { - const lsBals = await api.multiCall({ abi: 'erc20:totalSupply', calls: ['0x20BC832ca081b91433ff6c17f85701B6e92486c5', '0xFe2e637202056d30016725477c5da089Ab0A043A']}) +const CONFIG = { + ethereum: { + rETH2: '0x20BC832ca081b91433ff6c17f85701B6e92486c5', + sETH2: '0xFe2e637202056d30016725477c5da089Ab0A043A', + validator: '0xEadCBA8BF9ACA93F627F31fB05470F5A0686CEca', + factory: '0x3a0008a588772446f6e656133c2d5029cc4fc20e', + blacklist: ['0x09e84205df7c68907e619d07afd90143c5763605'] + }, + xdai: { + GNO: ADDRESSES.xdai.GNO, + sGNO: '0xA4eF9Da5BA71Cc0D2e5E877a910A37eC43420445' + } +} - const solosValidators = await getLogs({ - target: '0xEadCBA8BF9ACA93F627F31fB05470F5A0686CEca', - topic: 'ValidatorRegistered(bytes32,bytes,uint256,address)', - fromBlock: 11726299, - api - }) +const topic = { + validatorRegistered: 'ValidatorRegistered(bytes32,bytes,uint256,address)', + vaultAdded: 'VaultAdded(address,address)' +} + +const ethTvl = async (api) => { + const { rETH2, sETH2, validator, factory, blacklist } = CONFIG[api.chain] + const lsBals = await api.multiCall({ abi: 'erc20:totalSupply', calls: [rETH2, sETH2]}) + const solosValidators = await getLogs({ api, target: validator, topic: topic.validatorRegistered, fromBlock: 11726299 }) lsBals.push(solosValidators.length * 32e18) - const vaults = await getLogs({ - target: '0x3a0008a588772446f6e656133c2d5029cc4fc20e', - topic: 'VaultAdded(address,address)', - fromBlock: 18470078, - api - }) + const vaults = await getLogs({ api, target: factory, topic: topic.vaultAdded, fromBlock: 18470078 }) + const assets = await api.multiCall({ - calls: vaults.map(v=>({target:"0x"+v.topics[2].slice(26)})), + calls: vaults + .map(v => ({ target: "0x" + v.topics[2].slice(26) })) + .filter(call => !blacklist.includes(call.target.toLowerCase())), abi: "uint256:totalAssets" }) api.add(ADDRESSES.ethereum.WETH, assets.concat(lsBals)) } -async function xdaiTvl(timestamp, ethBlock, { xdai: block }) { - const chain = "xdai" - const supply = await sdk.api.erc20.totalSupply({ - target: '0xA4eF9Da5BA71Cc0D2e5E877a910A37eC43420445', - block, - chain - }) - - return { - [ADDRESSES.ethereum.GNO]: supply.output - } +const xdaiTvl = async (api) => { + const { GNO, sGNO } = CONFIG[api.chain] + const supply = await api.call({ target: sGNO, abi: 'erc20:totalSupply' }) + api.add(GNO, supply) } - - module.exports = { methodology: 'Counts ETH staked', - ethereum: { - tvl, - }, - xdai:{ - tvl: xdaiTvl - } -} + ethereum: { tvl: ethTvl }, + xdai: { tvl: xdaiTvl } +} \ No newline at end of file diff --git a/projects/standcash/index.js b/projects/standcash/index.js index 62665eeb70..d152d50ce0 100644 --- a/projects/standcash/index.js +++ b/projects/standcash/index.js @@ -1,6 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const { stakings } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { sumTokens2 } = require("../helper/unwrapLPs"); const boardroomContracts = "0x7F28D5a90b3A0BE2e34accDEF255eC13cf695b1e"; const SAS = "0x4c38d0e726b6c86f64c1b281348e725973542043"; @@ -52,29 +52,8 @@ const tokenAddresses = [ "0xE95A203B1a91a908F9B9CE46459d101078c2c3cb", ]; -async function pool2() { - const balances = {}; - - for (let i = 0; i < lpStakingContracts.length; i++) { - await sumTokensAndLPsSharedOwners( - balances, - [[lpAddresses[i], true]], - [lpStakingContracts[i]] - ); - } - - for (let i = 0; i < poolContracts.length; i++) { - await sumTokensAndLPsSharedOwners( - balances, - [ - [tokenAddresses[i], false], - [SAC, false], - ], - [poolContracts[i]] - ); - } - - return balances; +async function pool2(api) { + return sumTokens2({ api, owners: poolContracts.concat(lpStakingContracts), tokens: [...tokenAddresses, SAC, ...lpAddresses], resolveLP: true }) } module.exports = { @@ -82,7 +61,7 @@ module.exports = { ethereum: { staking: stakings(stakingContracts, SAS), pool2: pool2, - tvl: (tvl) => ({}), + tvl: () => ({}), }, methodology: "Counts liquidty on the Staking and Pool2 Only", }; diff --git a/projects/stargatefinance/index.js b/projects/stargatefinance/index.js index 3abc684a85..273babb7ad 100644 --- a/projects/stargatefinance/index.js +++ b/projects/stargatefinance/index.js @@ -63,11 +63,12 @@ const CONFIG = { module.exports = { goerli: { - tvl: async (api) => { - return { - [ADDRESSES.ethereum.WETH]: await api.call({ abi: 'erc20:balanceOf', target: '0xdD69DB25F6D620A7baD3023c5d32761D353D3De9', params: ['0x88124ef4a9ec47e691f254f2e8e348fd1e341e9b'], }), - } - }, + tvl: () => ({}) + // tvl: async (api) => { + // return { + // [ADDRESSES.ethereum.WETH]: await api.call({ abi: 'erc20:balanceOf', target: '0xdD69DB25F6D620A7baD3023c5d32761D353D3De9', params: ['0x88124ef4a9ec47e691f254f2e8e348fd1e341e9b'], }), + // } + // }, }, } diff --git a/projects/steakHut/index.js b/projects/steakHut/index.js index a2f6e7f8d4..5f2678b7bf 100644 --- a/projects/steakHut/index.js +++ b/projects/steakHut/index.js @@ -12,7 +12,6 @@ async function tvl(api) { const steakToken = "0xb279f8DD152B99Ec1D84A489D32c35bC0C7F5674" module.exports = { - start: 14003811, methodology: 'Counts the value of JLP tokens staked into SteakMasterChef.', avax: { tvl, diff --git a/projects/steakbank/abis.json b/projects/steakbank/abis.json deleted file mode 100644 index 7396c21e80..0000000000 --- a/projects/steakbank/abis.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "lbnbMarketCapacityCountByBNB": "uint256:lbnbMarketCapacityCountByBNB" -} \ No newline at end of file diff --git a/projects/steakbank/index.js b/projects/steakbank/index.js index 9a4f7c52c8..c7a004d2cd 100644 --- a/projects/steakbank/index.js +++ b/projects/steakbank/index.js @@ -1,20 +1,8 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk') -const abis = require('./abis.json') - const stakingContract = "0x79DB0dAa012F4b98F332A9D45c80A1A3FFaa6f9a" -const wbnb = "bsc:" + ADDRESSES.bsc.WBNB -async function tvl(timestamp, ethBlock, chainBlocks){ - const stakedBNB = await sdk.api.abi.call({ - target: stakingContract, - abi: abis.lbnbMarketCapacityCountByBNB, - block: chainBlocks['bsc'], - chain: 'bsc' - }) - return { - [wbnb]:stakedBNB.output - } +async function tvl(api){ + const staked = await api.call({ abi: "uint256:lbnbMarketCapacityCountByBNB", target: stakingContract}) + api.addGasToken(staked) } module.exports = { diff --git a/projects/stealthpad/index.js b/projects/stealthpad/index.js index ccf9e75aa0..459476d093 100644 --- a/projects/stealthpad/index.js +++ b/projects/stealthpad/index.js @@ -3,7 +3,6 @@ const abi = require('./abi.js') module.exports = { misrepresentedTokens: true, - start: 17996063, methodology: `Counts liquidity in lp lock contracts`, } diff --git a/projects/steer/index.js b/projects/steer/index.js index 0c0f7c24a1..fdaa8dca14 100644 --- a/projects/steer/index.js +++ b/projects/steer/index.js @@ -160,15 +160,66 @@ const supportedChains = [ chainId: 14, identifier: 'flare' }, + { + name: 'ApeChain', + subgraphEndpoint: 'https://api.goldsky.com/api/public/project_clohj3ta78ok12nzs5m8yag0b/subgraphs/steer-protocol-apechain/1.1.1/gn', + chainId: 33139, + identifier: 'apechain' + }, + // { + // name: 'Bittorrent', + // subgraphEndpoint: 'https://api.goldsky.com/api/public/project_clohj3ta78ok12nzs5m8yag0b/subgraphs/steer-protocol-btt/1.1.1/gn', + // chainId: 199, + // identifier: 'bittorrent' + // }, + { + name: 'Filecoin', + subgraphEndpoint: 'https://fil.subgraph.laconic.com/v1/steer-protocol/iRoheeEh2g6CdZ9OnunLwNCFHG8a7TAdtIYNNxboRSKVxgZfjq', + chainId: 314, + identifier: 'filecoin' + }, + { + name: 'Zircuit', + subgraphEndpoint: 'https://app.sentio.xyz/api/v1/graphql/rakesh/steer-protocol-zircuit', + headers: {'api-key': 'yu0Dep8seTmFjvlmAXN1ILNggARnx74MB'}, + chainId: 48900, + identifier: 'zircuit' + }, + { + name: 'Sonic', + subgraphEndpoint: 'https://api.0xgraph.xyz/api/public/803c8c8c-be12-4188-8523-b9853e23051d/subgraphs/steer-protocol-sonic/prod/gn', + chainId: 146, + identifier: 'sonic' + }, + { + name: 'Moonbeam', + subgraphEndpoint: 'https://api.goldsky.com/api/public/project_clohj3ta78ok12nzs5m8yag0b/subgraphs/steer-protocol-moonbeam/prod/gn', + chainId: 1284, + identifier: 'moonbeam' + }, + // { + // name: 'Sei', + // subgraphEndpoint: 'https://api.goldsky.com/api/public/project_clu1fg6ajhsho01x7ajld3f5a/subgraphs/dragonswap-v3-prod/1.0.5/gn', + // chainId: 1, // null? + // identifier: 'sei' // sei-network + // }, + { + name: 'Taiko', + subgraphEndpoint: 'https://api.goldsky.com/api/public/project_clohj3ta78ok12nzs5m8yag0b/subgraphs/steer-protocol-taiko/1.1.1/gn', + chainId: 167000, + identifier: 'taiko' + }, ] // Fetch active vaults and associated data @todo limited to 1000 per chain const query = `{vaults(first: 1000, where: {totalLPTokensIssued_not: "0", lastSnapshot_not: "0"}) {id}}` +const z_query = `{ vaults(first: 1000, where: {lastSnapshot_gte: "0", totalLPTokensIssued_gt: "0"}) { id }}` supportedChains.forEach(chain => { module.exports[chain.identifier] = { tvl: async (api) => { - const data = await cachedGraphQuery('steer/' + chain.identifier, chain.subgraphEndpoint, query,) + let _query = api.chain === 'zircuit' ? z_query : query + const data = await cachedGraphQuery('steer/' + chain.identifier, chain.subgraphEndpoint, _query, { headers: chain.headers }) const vaults = data.vaults.map((vault) => vault.id) const bals = await api.multiCall({ abi: "function getTotalAmounts() view returns (uint256 total0, uint256 total1)", calls: vaults, permitFailure: true, }) @@ -194,7 +245,8 @@ module.exports.arbitrum.staking = stakings( "0xaCdC6fC8F84fbA26f065489a7bf5837D7CDf546F", "0xff46e1B60dD9De89Aa04902D5c3c5ca01f8576A4", "0x1E6a358a1721e0D2B84f39FD328FC03A1b6e863B", - "0x3338B85fB1607C519962571B67061e02408475Bb" + "0x3338B85fB1607C519962571B67061e02408475Bb", + "0x6519A921d0E6F06524eff5DF976abc9A3ABF36cF" ], "0x1C43D05be7E5b54D506e3DdB6f0305e8A66CD04e", "arbitrum" diff --git a/projects/ston/index.js b/projects/ston/index.js index ea4db669f8..88664defbd 100644 --- a/projects/ston/index.js +++ b/projects/ston/index.js @@ -1,4 +1,4 @@ -const { post } = require('../helper/http') +const { get } = require('../helper/http') const { transformDexBalances } = require('../helper/portedTokens') const sdk = require('@defillama/sdk') @@ -7,12 +7,11 @@ module.exports = { timetravel: false, ton: { tvl: async () => { - const { result: {pools}} = await post('https://app.ston.fi/rpc', {"jsonrpc":"2.0","id":2,"method":"pool.list","params":{}}) - sdk.log(pools.length) + const result = await get("https://api.ston.fi/v1/pools?dex_v2=true") return transformDexBalances({ chain: 'ton', - data: pools.map(i => ({ + data: result.pool_list.map(i => ({ token0: i.token0_address, token1: i.token1_address, token0Bal: i.reserve0, diff --git a/projects/strategyx-finance/index.js b/projects/strategyx-finance/index.js index d097ce4f19..f0da70c8f1 100644 --- a/projects/strategyx-finance/index.js +++ b/projects/strategyx-finance/index.js @@ -6,4 +6,5 @@ module.exports = { hallmarks: [ [1658370720, "Rug pull"] ], + deadFrom: 1658370720 }; diff --git a/projects/stream/index.js b/projects/stream/index.js index b873277d15..844ab5c3cb 100644 --- a/projects/stream/index.js +++ b/projects/stream/index.js @@ -31,7 +31,6 @@ async function tvl(api) { module.exports = { misrepresentedTokens: true, methodology: "Calculates the TVL of all Stream vaults", - start: 16685700, ethereum: { tvl, }, diff --git a/projects/strike/index.js b/projects/strike/index.js index 40f8308780..680fd0ef71 100644 --- a/projects/strike/index.js +++ b/projects/strike/index.js @@ -1,6 +1,3 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const {fullCoumpoundExports} = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound'); -const comptroller = "0xe2e17b2CBbf48211FA7eB8A875360e5e39bA2602" - -module.exports=fullCoumpoundExports(comptroller, "ethereum", "0xbEe9Cf658702527b0AcB2719c1FAA29EdC006a92", ADDRESSES.ethereum.WETH) \ No newline at end of file +module.exports.ethereum = compoundExports2({ comptroller: '0xe2e17b2CBbf48211FA7eB8A875360e5e39bA2602', cether: '0xbee9cf658702527b0acb2719c1faa29edc006a92' }) diff --git a/projects/strkfarm/index.js b/projects/strkfarm/index.js index e2f767cd6b..40145a0d99 100644 --- a/projects/strkfarm/index.js +++ b/projects/strkfarm/index.js @@ -24,6 +24,14 @@ const STRATEGIES = { address: "0x04937b58e05a3a2477402d1f74e66686f58a61a5070fcc6f694fb9a0b3bae422", token: ADDRESSES.starknet.USDC, // USDC Sensei zToken: '0x047ad51726d891f972e74e4ad858a261b43869f7126ce7436ee0b2529a98f486' + }, { + address: "0x9d23d9b1fa0db8c9d75a1df924c3820e594fc4ab1475695889286f3f6df250", + token: ADDRESSES.starknet.ETH, // ETH Sensei + zToken: '0x1b5bd713e72fdc5d63ffd83762f81297f6175a5e0a4771cdadbc1dd5fe72cb1' + }, { + address: "0x9140757f8fb5748379be582be39d6daf704cc3a0408882c0d57981a885eed9", + token: ADDRESSES.starknet.ETH, // ETH Sensei XL + zToken: '0x057146f6409deb4c9fa12866915dd952aa07c1eb2752e451d7f3b042086bdeb8' }] } diff --git a/projects/strudel.js b/projects/strudel.js index 5a2896b567..98b70a04e9 100644 --- a/projects/strudel.js +++ b/projects/strudel.js @@ -1,9 +1,4 @@ -async function tvl(api) { - const BTC = '0xe1406825186D63980fd6e2eC61888f7B91C4bAe4' - const supply = await api.call({ abi: 'erc20:totalSupply', target: BTC }) - api.addCGToken('bitcoin', supply/1e18) -} - module.exports = { - ethereum: { tvl }, + ethereum: { tvl: () => ({}) }, + // deadFrom: "2022-02-31", } diff --git a/projects/suibridge/index.js b/projects/suibridge/index.js new file mode 100644 index 0000000000..ba97a7bc16 --- /dev/null +++ b/projects/suibridge/index.js @@ -0,0 +1,12 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owner: "0x312e67b47A2A29AE200184949093D92369F80B53", + fetchCoValentTokens: true, + permitFailure: true + }), + }, +}; \ No newline at end of file diff --git a/projects/suidollar/index.js b/projects/suidollar/index.js new file mode 100644 index 0000000000..5802b948d0 --- /dev/null +++ b/projects/suidollar/index.js @@ -0,0 +1,57 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const sui = require("../helper/chain/sui"); + +const EVENT_TYPES = { + DEPOSIT: "0xe8087c2b86351ce15e8d72e83a39c5772c0b1d054015ae9671305e686cef5034::suidollar::Deposit", + WITHDRAW: "0xe8087c2b86351ce15e8d72e83a39c5772c0b1d054015ae9671305e686cef5034::suidollar::Withdraw" +}; + +async function getAllEvents(eventType) { + let hasMore = true; + let cursor = null; + let allEvents = []; + + while (hasMore) { + const events = await sui.queryEvents({ + eventType, + transform: i => i, + cursor, + limit: 50 + }); + + if (Array.isArray(events) && events.length > 0) { + allEvents = allEvents.concat(events); + } + + if (events.hasNextPage && events.nextCursor) { + cursor = events.nextCursor; + } else { + hasMore = false; + } + } + + return allEvents.map(event => eventType === EVENT_TYPES.DEPOSIT ? event.deposit_amount : event.amount) + .filter(amount => amount !== undefined); +} + +async function tvl(api) { + const deposits = await getAllEvents(EVENT_TYPES.DEPOSIT); + const withdraws = await getAllEvents(EVENT_TYPES.WITHDRAW); + + let totalBalance = 0n; + + deposits.forEach(amount => amount && (totalBalance += BigInt(amount))); + withdraws.forEach(amount => amount && (totalBalance -= BigInt(amount))); + + api.add(ADDRESSES.sui.USDC_CIRCLE, totalBalance); + + return api.getBalances(); +} + +module.exports = { + timetravel: false, + sui: { + tvl + }, + methodology: "Calculates TVL by tracking deposit and withdrawal events" +} \ No newline at end of file diff --git a/projects/suilend/index.js b/projects/suilend/index.js index 3104286932..6a57dddf1f 100644 --- a/projects/suilend/index.js +++ b/projects/suilend/index.js @@ -1,23 +1,64 @@ +const ADDRESSES = require('../helper/coreAssets.json') const sui = require("../helper/chain/sui"); const SUILEND_LENDING_MARKET_ID = "0x84030d26d85eaa7035084a057f2f11f701b7e2e4eda87551becbc7c97505ece1"; +const LST_CREATE_EVENT_TYPE = '0xb0575765166030556a6eafd3b1b970eba8183ff748860680245b9edd41c716e7::events::Event<0xb0575765166030556a6eafd3b1b970eba8183ff748860680245b9edd41c716e7::liquid_staking::CreateEvent>'; +const SUI_COIN_TYPE = '0x0000000000000000000000000000000000000000000000000000000000000002::sui::SUI' +const SPRINGSUI_COIN_TYPE = '0x83556891f4a0f233ce7b05cfe7f957d4020492a34f5405b2cb9377d060bef4bf::spring_sui::SPRING_SUI'; async function tvl(api) { + const redemptionRates = await getRedemtionRates() const object = await sui.getObject(SUILEND_LENDING_MARKET_ID) + for (const reserve of object.fields.reserves) { const coinType = '0x' + reserve.fields.coin_type.fields.name; - api.add(coinType, reserve.fields.available_amount) + if (redemptionRates[coinType]) { + api.add(SUI_COIN_TYPE, redemptionRates[coinType] * reserve.fields.available_amount) + } else { + api.add(coinType, reserve.fields.available_amount) + } } } async function borrowed(api) { + const redemptionRates = await getRedemtionRates() const object = await sui.getObject(SUILEND_LENDING_MARKET_ID) for (const reserve of object.fields.reserves) { const coinType = '0x' + reserve.fields.coin_type.fields.name; - api.add(coinType, reserve.fields.borrowed_amount.fields.value / 1e18) + if (redemptionRates[coinType]) { + api.add(SUI_COIN_TYPE, redemptionRates[coinType] * reserve.fields.borrowed_amount.fields.value / 1e18) + } else { + api.add(coinType, reserve.fields.borrowed_amount.fields.value / 1e18) + } } } + +async function getRedemtionRates() { + const events = (await sui.queryEvents({ + eventType: LST_CREATE_EVENT_TYPE, + })) + const coinTypeToRate = {}; + for (const event of events) { + const coinType = '0x' + event.event.typename.name; + if (coinType === SPRINGSUI_COIN_TYPE) { + continue; + } + try { + const poolId = event.event.liquid_staking_info_id; + const data = await sui.getObject(poolId) + const totalSupply = parseInt(data.fields.lst_treasury_cap.fields.total_supply.fields.value) + const stakedSui = parseInt(data.fields.storage.fields.total_sui_supply); + coinTypeToRate[coinType] = stakedSui / totalSupply; + } catch(e) { + continue + } + } + return coinTypeToRate; +} + + + module.exports = { timetravel: false, sui: { diff --git a/projects/suimarket/index.js b/projects/suimarket/index.js new file mode 100644 index 0000000000..23879551e9 --- /dev/null +++ b/projects/suimarket/index.js @@ -0,0 +1,20 @@ +const { queryEventsByType, getObjects, } = require('../helper/chain/sui') + +async function tvl(api) { + const eventType = '0xb61e324fa43746f5c24b2db3362afb382b644b32bce39a53f1f796a0109828e0::suimarket::EventCreated' + let events = await queryEventsByType({ eventType, transform: i => i.event_id }) + events = await getObjects(events) + + events.forEach(object => { + const coin = object.type.split('<')[1].replace('>', '') + const amount = object.fields.total_base_coin + api.add(coin, amount) + }) +} + +module.exports = { + timetravel: false, + sui: { + tvl + }, +} diff --git a/projects/sumer/index.js b/projects/sumer/index.js index 797a3d92bd..703277d01b 100644 --- a/projects/sumer/index.js +++ b/projects/sumer/index.js @@ -5,5 +5,8 @@ module.exports = { base: compoundExports2({ comptroller: '0x611375907733D9576907E125Fb29704712F0BAfA' }), arbitrum: compoundExports2({ comptroller: '0xBfb69860C91A22A2287df1Ff3Cdf0476c5aab24A' }), ethereum: compoundExports2({ comptroller: '0x60A4570bE892fb41280eDFE9DB75e1a62C70456F' }), - zklink: compoundExports2({ comptroller: '0xe6099D924efEf37845867D45E3362731EaF8A98D' }) + zklink: compoundExports2({ comptroller: '0xe6099D924efEf37845867D45E3362731EaF8A98D' }), + bsquared: compoundExports2({ comptroller: '0xdD9C863197df28f47721107f94eb031b548B5e48' }), + core: compoundExports2({ comptroller: '0x7f5a7aE2688A7ba6a9B36141335044c058a08b3E' }), + bsc: compoundExports2({ comptroller: '0x15B5220024c3242F7D61177D6ff715cfac4909eD' }), } \ No newline at end of file diff --git a/projects/summitdefi/abi.json b/projects/summitdefi/abi.json deleted file mode 100644 index 8c164f4dfb..0000000000 --- a/projects/summitdefi/abi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "getPools": "address[]:getPools", - "tokensWithAllocation": "address[]:tokensWithAllocation", - "supply": "function supply(address _token) view returns (uint256)", - "getVault": "address:getVault", - "getPoolId": "function getPoolId() view returns (bytes32)", - "getPoolTokens": "function getPoolTokens(bytes32 poolId) view returns (address[] tokens, uint256[] balances, uint256 lastChangeBlock)" -} \ No newline at end of file diff --git a/projects/summitdefi/index.js b/projects/summitdefi/index.js index 2d3b40002b..e9aa08a5c2 100644 --- a/projects/summitdefi/index.js +++ b/projects/summitdefi/index.js @@ -1,8 +1,13 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { unwrapUniswapLPs } = require("../helper/unwrapLPs"); -const abi = require("./abi.json"); -const { BigNumber } = require("bignumber.js"); +const abi = { + "getPools": "address[]:getPools", + "tokensWithAllocation": "address[]:tokensWithAllocation", + "supply": "function supply(address _token) view returns (uint256)", + "getVault": "address:getVault", + "getPoolId": "function getPoolId() view returns (bytes32)", + "getPoolTokens": "function getPoolTokens(bytes32 poolId) view returns (address[] tokens, uint256[] balances, uint256 lastChangeBlock)" +} +const { staking } = require('../helper/staking'); +const { sumTokens2 } = require('../helper/unwrapLPs'); const summit = "0x0ddb88e14494546d07fcd94c3f0ef6d3296b1cd7"; const everest = "0xc687806cfd11b5330d7c3ae6f18b18dc71e1083e"; @@ -11,157 +16,28 @@ const cartplains = "0x1805922e7f82fc9dbad8e2435c146ba605c4a25d"; const cartmesa = "0x64f8a1dbc20f132159605ad8d7111e75ea702358"; const cartsummit = "0x93af6a3882aaf4112fc404e30277b39452f44cf6"; -const beethovenAddresses = [ - "0xcde5a11a4acb4ee4c805352cec57e236bdbc3837", - "0xd47d2791d3b46f9452709fa41855a045304d6f9d", - "0xcdf68a4d525ba2e90fe959c74330430a5a6b8226", - "0x9af1f0e9ac9c844a4a4439d446c1437807183075" -] - -async function getCarttvl(balances, block, cart) { - const chain = "fantom"; - cart = cart.toLowerCase(); - - const getPools = (await sdk.api.abi.call({ - target: cart, - abi: abi["getPools"], - block, - chain - })).output; - - const symbols = (await sdk.api.abi.multiCall({ - calls: getPools.map(p => ({ - target: p - })), - abi: "erc20:symbol", - block, - chain - })).output; - - const poolSupply = (await sdk.api.abi.multiCall({ - calls: getPools.map(p => ({ - target: cart, - params: p - })), - abi: abi["supply"], - block, - chain - })).output; - - let lps = []; - let beethovenBals = []; - - for (let i = 0; i < getPools.length; i++) { - const token = getPools[i].toLowerCase(); - const symbol = symbols[i].output; - const balance = poolSupply[i].output; - if (token === summit || token === everest) continue; - if (beethovenAddresses.includes(token)) { - beethovenBals.push(balance); - continue; - } - if (symbol.endsWith("LP")) { - lps.push({ - token, - balance - }); - continue; - } - sdk.util.sumSingleBalance(balances, `fantom:${token}`, balance); - } - - await unwrapUniswapLPs(balances, lps, block, chain, addr=>`fantom:${addr}`); - - const beetTotalSupply = (await sdk.api.abi.multiCall({ - calls: beethovenAddresses.map(p => ({ - target: p - })), - abi: "erc20:totalSupply", - block, - chain - })).output; - - const beetVaults = (await sdk.api.abi.multiCall({ - calls: beethovenAddresses.map(p => ({ - target: p - })), - abi: abi["getVault"], - block, - chain - })).output; - - const beetIds = (await sdk.api.abi.multiCall({ - calls: beethovenAddresses.map(p => ({ - target:p - })), - abi: abi["getPoolId"], - block, - chain - })).output; - - let poolTokenCall = []; - for (let i = 0; i < beetVaults.length; i++) { - poolTokenCall.push({ - target: beetVaults[i].output, - params: beetIds[i].output - }); - } - - const beetPoolTokens = (await sdk.api.abi.multiCall({ - calls: poolTokenCall, - abi: abi["getPoolTokens"], - block, - chain - })).output; - - for (let i = 0; i < beetPoolTokens.length; i++) { - const tokens = beetPoolTokens[i].output.tokens; - const bals = beetPoolTokens[i].output.balances; - const ratio = Number(beethovenBals[i]) / beetTotalSupply[i].output; - for (let j = 0; j < tokens.length; j++) { - sdk.util.sumSingleBalance(balances, `fantom:${tokens[j]}`, BigNumber(bals[j]).times(ratio).toFixed(0)); - } - } +async function getCarttvl(api, cart) { + const tokens = await api.call({ abi: abi.getPools, target: cart }) + const bals = await api.multiCall({ abi: abi.supply, calls: tokens, target: cart }) + api.add(tokens, bals) } -async function tvl(timestamp, block, chainBlocks) { - let balances = {}; - block = chainBlocks.fantom; - await getCarttvl(balances, block, cartoasis); - await getCarttvl(balances, block, cartplains); - await getCarttvl(balances, block, cartmesa); - await getCarttvl(balances, block, cartsummit); - return balances; +async function tvl(api) { + await getCarttvl(api, cartoasis) + await getCarttvl(api, cartplains) + await getCarttvl(api, cartmesa) + await getCarttvl(api, cartsummit) + await sumTokens2({ api, resolveLP: true}) + api.removeTokenBalance(summit) + api.removeTokenBalance(everest) } -async function staking(timestamp, block, chainBlocks) { - let balances = {}; - block = chainBlocks.fantom; - const chain = "fantom"; - const getPoolTokens = (await sdk.api.abi.call({ - target: "0x20dd72ed959b6147912c2e529f0a0c651c33c9ce", - params: "0x1577eb091d3933a89be62130484e090bb8bd0e5800010000000000000000020f", - abi: abi["getPoolTokens"], - block, - chain - })).output; - const valueOfSummitInUSDCInPool = (Number(getPoolTokens.balances[0]) * 3) * 1e12; - const summitValueInUSDC = valueOfSummitInUSDCInPool/ Number(getPoolTokens.balances[1]); - const summitInEverest = (await sdk.api.erc20.balanceOf({ - target: summit, - owner: everest, - block, - chain - })).output; - sdk.util.sumSingleBalance(balances, "fantom:" + ADDRESSES.fantom.DAI, BigNumber(summitInEverest).times(summitValueInUSDC).toFixed(0)); - return balances; -} module.exports = { - methodology: "TVL is from deposits into the cartographer contracts. Staking TVL is from SUMMIT deposited into EVEREST contract", - fantom: { - misrepresentedTokens: true, - tvl, - staking - } + methodology: "TVL is from deposits into the cartographer contracts. Staking TVL is from SUMMIT deposited into EVEREST contract", + fantom: { + misrepresentedTokens: true, + tvl, + staking: staking(everest, summit) + } } \ No newline at end of file diff --git a/projects/superform/index.js b/projects/superform/index.js index 68eb5431df..5d0e489620 100644 --- a/projects/superform/index.js +++ b/projects/superform/index.js @@ -1,4 +1,4 @@ -const superform_chains = ["ethereum", "polygon", "bsc", "avax", "arbitrum", "optimism", "base", "fantom"]; +const superform_chains = ["ethereum", "polygon", "bsc", "avax", "arbitrum", "optimism", "base", "fantom", "blast", "linea"]; const factory_contract = "0xD85ec15A9F814D6173bF1a89273bFB3964aAdaEC"; const fantom_factory_contract = "0xbc85043544CC2b3Fd095d54b6431822979BBB62A"; @@ -10,11 +10,11 @@ async function tvl(api) { const getSuperformRes = await api.multiCall({ abi: "function getSuperform(uint256) external view returns(address, uint32, uint64)", calls: forms, target: api.chainId === 250 ? fantom_factory_contract : factory_contract }) const super4626 = getSuperformRes.map(v => v[0]) const vaults = await api.multiCall({ abi: 'address:vault', calls: super4626 }) - + // Filter out blacklisted vaults const filteredVaults = vaults.filter(vault => !blacklisted_vaults.includes(vault.toLowerCase())); const filteredSuper4626 = super4626.filter((_, index) => !blacklisted_vaults.includes(vaults[index].toLowerCase())); - + const assets = await api.multiCall({ abi: 'address:asset', calls: filteredSuper4626 }) const vBals = await api.multiCall({ abi: "erc20:balanceOf", calls: filteredVaults.map((v, i) => ({ target: v, params: filteredSuper4626[i] })) }) const bals = await api.multiCall({ abi: "function previewRedeemFrom(uint256) external view returns(uint256)", calls: filteredSuper4626.map((v, i) => ({ target: v, params: vBals[i] })), permitFailure: true }) @@ -26,8 +26,9 @@ async function tvl(api) { module.exports = { methodology: "counts the TVL of each superform across all the supported networks", hallmarks: [ - [1707350400,"Early Access"], - [1715212800,"Open Launch"] + [1707350400, "Early Access"], + [1715212800, "Open Launch"], + [1734012000, "SuperVaults Launch"], ] }; diff --git a/projects/superlend/index.js b/projects/superlend/index.js new file mode 100644 index 0000000000..651e67ca89 --- /dev/null +++ b/projects/superlend/index.js @@ -0,0 +1,7 @@ +const { aaveExports } = require('../helper/aave'); +const methodologies = require('../helper/methodologies'); + +module.exports = { + methodology: methodologies.lendingMarket, + etlk: aaveExports('etlk', "0xEcbDd440C7a929d7524784Af634dF9EB0747b9e7", undefined, ["0x99e8269dDD5c7Af0F1B3973A591b47E8E001BCac"], { v3: true }), +} \ No newline at end of file diff --git a/projects/superposition/index.js b/projects/superposition/index.js index b6ecf4c48d..f37e0a6a68 100644 --- a/projects/superposition/index.js +++ b/projects/superposition/index.js @@ -13,21 +13,44 @@ async function _getResources() { const brokersFilter = (i) => i.type.includes(`${spRootAddress}::broker::Broker`); -function processBrokerData(brokerDataArray, isBorrowed = false) { +const coinToFungibleAssetFilter = (i) => + i.type.includes(`${spRootAddress}::map::Map`); + +function processBrokerData(brokerDataArray, coinToFungibleAssetArray, isBorrowed = false) { + const coinToFungibleAssetMap = coinToFungibleAssetArray.reduce(function(map, item) { + map[item.type] = item.data.fa_metadata; + return map; + }, {}); + const result = {}; brokerDataArray.map((item) => { const { type, data } = item; - result[type] = !isBorrowed ? parseInt(data.available) : parseInt(data.borrowed) + + const brokerType = type; + + const coinType = brokerType.match(/<([^>]+)>/)[1]; + + let tokenMint = coinType; + { + // Superposition uses custom coin types to represent fungible assets + // Find the fungible asset address so DefiLama can find + // the correct token price + const mapType = `${spRootAddress}::map::Map<${coinType}>`; + if (mapType in coinToFungibleAssetMap) { + tokenMint = coinToFungibleAssetMap[mapType]; + } + } + + result[tokenMint] = !isBorrowed ? parseInt(data.available) : parseInt(data.borrowed) }); return result; } -function simplifyKeys(balanceData, api) { +function addBalanceData(balanceData, api) { Object.entries(balanceData).forEach(([key, value]) => { - const newKey = key.match(/<([^>]+)>/)[1]; - api.add(newKey, value); + api.add(key, value); }); } @@ -38,14 +61,20 @@ module.exports = { tvl: async (api) => { const resources = await _getResources(); const brokers = resources.filter(brokersFilter); - const balanceData = processBrokerData(brokers); - simplifyKeys(balanceData, api); + const coinToFungibleAssetArray = resources.filter( + coinToFungibleAssetFilter + ); + const balanceData = processBrokerData(brokers, coinToFungibleAssetArray); + addBalanceData(balanceData, api); }, borrowed: async (api) => { const resources = await _getResources(); const brokers = resources.filter(brokersFilter); - const balanceData = processBrokerData(brokers, true); - simplifyKeys(balanceData, api); + const coinToFungibleAssetArray = resources.filter( + coinToFungibleAssetFilter + ); + const balanceData = processBrokerData(brokers, coinToFungibleAssetArray, true); + addBalanceData(balanceData, api); }, }, }; diff --git a/projects/superstate-uscc/index.js b/projects/superstate-uscc/index.js new file mode 100644 index 0000000000..0fcfa509d6 --- /dev/null +++ b/projects/superstate-uscc/index.js @@ -0,0 +1,14 @@ +const USCC = "0x14d60e7fdc0d71d8611742720e4c50e7a974020c"; + +module.exports = { + methodology: "TVL corresponds to the total amount of USCC minted onchain, does not include Superstate book-entry AUM", + ethereum: { + tvl: async (api) => { + const totalSupplies = await api.multiCall({ + calls: [USCC], + abi: "erc20:totalSupply", + }); + api.addTokens([USCC], totalSupplies); + }, + }, +}; diff --git a/projects/superstate/index.js b/projects/superstate/index.js index f5bea3e236..d97ed45dc5 100644 --- a/projects/superstate/index.js +++ b/projects/superstate/index.js @@ -1,15 +1,14 @@ const USTB = "0x43415eb6ff9db7e26a15b704e7a3edce97d31c4e"; -const USCC = "0x14d60e7fdc0d71d8611742720e4c50e7a974020c"; module.exports = { - methodology: "TVL corresponds to the total amount of USTB & USCC minted", + methodology: "TVL corresponds to the total amount of USTB & USCC minted onchain, does not include Superstate book-entry AUM", ethereum: { tvl: async (api) => { const totalSupplies = await api.multiCall({ - calls: [USTB, USCC], + calls: [USTB], abi: "erc20:totalSupply", }); - api.addTokens([USTB, USCC], totalSupplies); + api.addTokens([USTB], totalSupplies); }, }, }; diff --git a/projects/superswap-v2/index.js b/projects/superswap-v2/index.js new file mode 100644 index 0000000000..eea758e2d4 --- /dev/null +++ b/projects/superswap-v2/index.js @@ -0,0 +1,13 @@ +const { getUniTVL } = require("../helper/unknownTokens") +const FACTORY = "0x22505cb4d5d10b2c848a9d75c57ea72a66066d8c" + +const dexTVL = getUniTVL({ factory: FACTORY, useDefaultCoreAssets: true, permitFailure: true }) + + +module.exports = { + misrepresentedTokens: true, + methodology: `Uses factory(${FACTORY}) address and whitelisted tokens address to find and price Liquidity Pool pairs.`, + optimism: { + tvl: dexTVL, + } +}; diff --git a/projects/superswap-v3/index.js b/projects/superswap-v3/index.js new file mode 100644 index 0000000000..b523c956f7 --- /dev/null +++ b/projects/superswap-v3/index.js @@ -0,0 +1,8 @@ +const { uniV3Export } = require("../helper/uniswapV3") + +module.exports = { + methodology: "TVL accounts for the liquidity on all AMM pools taken from the factory contract", + ...uniV3Export({ + optimism: { factory: "0xe52a36Bb76e8f40e1117db5Ff14Bd1f7b058B720", fromBlock: 124982239 }, + }) +} diff --git a/projects/supr-staking/index.js b/projects/supr-staking/index.js new file mode 100644 index 0000000000..84463e778a --- /dev/null +++ b/projects/supr-staking/index.js @@ -0,0 +1,16 @@ +const SUPR = '0x3390108E913824B8eaD638444cc52B9aBdF63798' +const ROLLUX_SUPR_STAKING = '0x400aDCba906EA6E87FEC276f0E0C0857F71A85F2' +const ROLLUX_SUPR_GROUP_STAKING = '0xa9A37e4D70Fc6af8A0CC16995B9363f10dCE132E' + +async function staking(api) { + const bal = await api.call({ abi: 'erc20:totalSupply', target: ROLLUX_SUPR_STAKING }) + api.add(SUPR, bal) + return api.sumTokens({ owner: ROLLUX_SUPR_GROUP_STAKING, tokens: [SUPR] }) +} + +module.exports = { + rollux: { + tvl: () => ({}), + staking, + }, +} \ No newline at end of file diff --git a/projects/surge-trade/index.js b/projects/surge-trade/index.js new file mode 100644 index 0000000000..9257be46e3 --- /dev/null +++ b/projects/surge-trade/index.js @@ -0,0 +1,14 @@ +const { queryAddresses } = require('../helper/chain/radixdlt') + +module.exports = { + radixdlt: { tvl }, +} + +async function tvl(api) { + const [{ details: { state }, fungible_resources }] = await queryAddresses({ addresses: ['component_rdx1crezrpxw9ypg6v2panqjqwevnwplg94yeej0rhqq9k7p4kgnltrc9g'], miscQuery: { "aggregation_level": "Vault" } }) + const stateObj = {} + state.fields.map(i => stateObj[i.field_name] = +i.value) + const poolAmount = parseFloat(fungible_resources.items[0].vaults.items[0].amount) + const tvl_usd = poolAmount + stateObj.virtual_balance + stateObj.unrealized_pool_funding + stateObj.pnl_snap + api.add('resource_rdx1t4upr78guuapv5ept7d7ptekk9mqhy605zgms33mcszen8l9fac8vf', tvl_usd) +} diff --git a/projects/sushiswap-v3/index.js b/projects/sushiswap-v3/index.js index 64f6fd8beb..0e97e040d1 100644 --- a/projects/sushiswap-v3/index.js +++ b/projects/sushiswap-v3/index.js @@ -95,6 +95,7 @@ module.exports = uniV3Export({ blast: { factory: '0x7680d4b43f3d1d54d6cfeeb2169463bfa7a6cf0d', fromBlock: 284122, }, //europa: { factory: '0x51d15889b66A2c919dBbD624d53B47a9E8feC4bB', fromBlock: 5124251, }, rsk: { factory: '0x46B3fDF7B5cde91Ac049936bF0Bdb12C5D22202E', fromBlock: 6365060, }, //this one + sonic: { factory: '0x46B3fDF7B5cde91Ac049936bF0Bdb12C5D22202E', fromBlock: 1, }, //this one }); const config = { diff --git a/projects/sushiswap/api.js b/projects/sushiswap/api.js index 1efce7786f..a732fcf382 100644 --- a/projects/sushiswap/api.js +++ b/projects/sushiswap/api.js @@ -133,6 +133,7 @@ module.exports = { linea: { tvl: getUniTVL({ factory: '0xFbc12984689e5f15626Bad03Ad60160Fe98B303C', useDefaultCoreAssets: true, }) }, thundercore: { tvl: tvl2 }, islm: { tvl: tvl2 }, + sonic: { tvl: tvl2 }, } // module.exports.polygon.tvl = getChainTVL('polygon') diff --git a/projects/suter-shield/index.js b/projects/suter-shield/index.js index f47367ef18..dd2d096282 100644 --- a/projects/suter-shield/index.js +++ b/projects/suter-shield/index.js @@ -1,122 +1,28 @@ +const { sumTokensExport, } = require('../helper/unwrapLPs') const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk'); -const BigNumber = require("bignumber.js") - -// ETH -const ETH_COIN = ADDRESSES.null; -const SUTER_ETH_V1 = '0x02b4E089E96a0A672dE0a0d93E2869B899b15a44'; -const SUTER_ETH_V2 = '0x934cc5704165711296207b5AFc87933AE0685a4C'; - -const USDT_COIN = ADDRESSES.ethereum.USDT; -const SUTER_USDT_V1 = '0x29abf1a011cdfb9548dc8faa6d19b1b39808bf58'; -const SUTER_USDT_V2 = '0xB8fcF79EAd34E98e45fc21E5dB1C5C561d906371'; - -const DAI_COIN = ADDRESSES.ethereum.DAI; -const SUTER_DAI_V1 = '0x54A8e0C76Eec21DD30842FbbcA2D336669102b77'; -const SUTER_DAI_V2 = '0xbdf418486D438e44F5aAC6aF86330dA638ea70AD'; - -const SUTER_COIN = '0xAA2ce7Ae64066175E0B90497CE7d9c190c315DB4'; -const SUTER_SUTER_V1 = '0xab4e72599e2cec5dcc8249657833b3408905900e'; - -// BSC -// const BNB_COIN = ADDRESSES.null; -// WBNB -const BNB_COIN = ADDRESSES.bsc.WBNB; -const SUTER_BNB_V1 = '0x2A00d7d2de1E147a3BCAa122B4EC5D6f9F0c1147'; -const SUTER_BNB_V2 = '0x5bb6eE37a6503fe381207c3BAC0Aa6d7B33590Fa'; - -const BUSD_COIN = ADDRESSES.bsc.BUSD; -const SUTER_BUSD_V1 = '0xe557c77Ed24df7cDF21ED55a8C56Ea36CeBD5BD2'; -const SUTER_BUSD_V2 = '0x382926Ba4D92E5d7652A85Aa7085Ffb15b6b6C89'; - -const CAKE_COIN = '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82'; -const SUTER_CAKE_V1 = '0x8cc4c8529c0D8bb9B9FA197530d656cCBcB88DeB'; -const SUTER_CAKE_V2 = '0xa19e53Af2381F34AEcA80cDcEBF6c4a3F37037a2'; - -const BAKE_COIN = '0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5'; -const SUTER_BAKE_V1 = '0x9D529c70fD8e072786b721190f6E6B30e433690a'; -const SUTER_BAKE_V2 = '0x6F3Ad49e287c2dC12aA5f0bD9e8173C57d1AdECa'; - -const BSC_SUTER_COIN = '0x4cfbbdfbd5bf0814472ff35c72717bd095ada055'; -const BSC_SUTER_SUTER_V1 = '0x617edfadeC530aE747088672831EaC5B1A6A5220'; -const BSC_SUTER_SUTER_V2 = '0x1E02013eF23C1784b3c2E2c08b1e4c253ABa2b85'; - -const XSUTER_COIN = '0x822d04d22f962d6132f53b0fa6b9409097d12550'; -const BSC_SUTER_XSUTER_V1 = '0x4de5cB2EB81A37DD768fc58fe0ca7b811C997c35'; -const BSC_SUTER_XSUTER_V2 = '0x41690D4E1E20B0cBB1fb6004CA80e67bdFa6BA02'; - -async function eth_tvl(timestamp, block) { - let balances = {}; - let total_eth_tvl = 0; - let pools = {[ETH_COIN]: [SUTER_ETH_V1, SUTER_ETH_V2], [USDT_COIN]: [SUTER_USDT_V1, SUTER_USDT_V2], [DAI_COIN]: [SUTER_DAI_V1, SUTER_DAI_V2], [SUTER_COIN]: [SUTER_SUTER_V1]}; - for(var coin in pools){ - for(var pool of pools[coin]) { - if(coin !== ETH_COIN){ - let erc20_tvl = await sdk.api.erc20.balanceOf({ - target: coin, - owner: pool, - block: block, - chain: 'ethereum' - }); - if(balances[coin] === undefined){ - balances[coin] = erc20_tvl.output; - }else{ - balances[coin] = new BigNumber(balances[coin]).plus(new BigNumber(erc20_tvl.output)); - } - } - let eth_tvl = await sdk.api.eth.getBalance({ - target: pool, - block, - chain: 'ethereum' - }); - total_eth_tvl = new BigNumber(eth_tvl.output).plus(new BigNumber(total_eth_tvl)); - } - } - - balances[ETH_COIN] = total_eth_tvl.toString(); - return balances; +const { nullAddress } = require('../helper/tokenMapping') +const config = { + ethereum: [ + [ADDRESSES.null, '0x02b4E089E96a0A672dE0a0d93E2869B899b15a44'], + [nullAddress, '0x934cc5704165711296207b5AFc87933AE0685a4C'], + [ADDRESSES.ethereum.USDT, '0x29abf1a011cdfb9548dc8faa6d19b1b39808bf58'], + [ADDRESSES.ethereum.USDT, '0xB8fcF79EAd34E98e45fc21E5dB1C5C561d906371'], + [ADDRESSES.ethereum.DAI, '0x54A8e0C76Eec21DD30842FbbcA2D336669102b77'], + [ADDRESSES.ethereum.DAI, '0xbdf418486D438e44F5aAC6aF86330dA638ea70AD'], + ], bsc: [ + [ADDRESSES.null, '0x2A00d7d2de1E147a3BCAa122B4EC5D6f9F0c1147'], + [ADDRESSES.null, '0x5bb6eE37a6503fe381207c3BAC0Aa6d7B33590Fa'], + [ADDRESSES.bsc.BUSD, '0xe557c77Ed24df7cDF21ED55a8C56Ea36CeBD5BD2'], + [ADDRESSES.bsc.BUSD, '0x382926Ba4D92E5d7652A85Aa7085Ffb15b6b6C89'], + ['0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82', '0x8cc4c8529c0D8bb9B9FA197530d656cCBcB88DeB'], + ['0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82', '0xa19e53Af2381F34AEcA80cDcEBF6c4a3F37037a2'], + ['0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5', '0x9D529c70fD8e072786b721190f6E6B30e433690a'], + ['0xE02dF9e3e622DeBdD69fb838bB799E3F168902c5', '0x6F3Ad49e287c2dC12aA5f0bD9e8173C57d1AdECa'], + ] } -async function bsc_tvl(timestamp, ethBlock, chainBlocks) { - const block = chainBlocks.bsc; - let balances = {}; - let total_bnb_tvl = 0; - let pools = {[BNB_COIN]: [SUTER_BNB_V1, SUTER_BNB_V2], [BUSD_COIN]: [SUTER_BUSD_V1, SUTER_BUSD_V2], [CAKE_COIN]: [SUTER_CAKE_V1, SUTER_CAKE_V2], [BAKE_COIN]: [SUTER_BAKE_V1, SUTER_BAKE_V2], [BSC_SUTER_COIN]: [BSC_SUTER_SUTER_V1, BSC_SUTER_SUTER_V2], [XSUTER_COIN]: [BSC_SUTER_XSUTER_V1, BSC_SUTER_XSUTER_V2]}; - for(var coin in pools){ - for(var pool of pools[coin]) { - if(coin !== BNB_COIN){ - let erc20_tvl = await sdk.api.erc20.balanceOf({ - target: coin, - owner: pool, - block: block, - chain: 'bsc' - }); - if(balances[`bsc:${coin}`] === undefined){ - balances[`bsc:${coin}`] = erc20_tvl.output; - }else{ - balances[`bsc:${coin}`] = new BigNumber(balances[`bsc:${coin}`]).plus(new BigNumber(erc20_tvl.output)); - } - } - let bnb_tvl = await sdk.api.eth.getBalance({ - target: pool, - //block, - chain: 'bsc' - }); - total_bnb_tvl = new BigNumber(bnb_tvl.output).plus(new BigNumber(total_bnb_tvl)); - } +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: sumTokensExport({ tokensAndOwners: config[chain], }) } - - balances[`bsc:${BNB_COIN}`] = total_bnb_tvl.toString(); - return balances; -} - - -module.exports = { - timetravel: false, - ethereum:{ - tvl: eth_tvl, - }, - bsc: { - tvl: bsc_tvl, - }, -}; \ No newline at end of file +}) diff --git a/projects/suzaku/index.js b/projects/suzaku/index.js new file mode 100644 index 0000000000..c1e3b9fef9 --- /dev/null +++ b/projects/suzaku/index.js @@ -0,0 +1,15 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +async function tvl(api) { + const logs = await getLogs2({ api, factory: '0xE5296638Aa86BD4175d802A210E158688e41A93c', eventAbi: 'event AddEntity(address indexed entity)', fromBlock: 20011312, }) + const COLLATERALS = logs.map(log => log.entity) + const tokens = await api.multiCall({ abi: 'address:asset', calls: COLLATERALS, }) + return api.sumTokens({ tokensAndOwners2: [tokens, COLLATERALS] }) +} + +module.exports = { + start: '2024-09-30', + avax: { + tvl, + }, +} diff --git a/projects/svn/index.js b/projects/svn/index.js index d0d8cf77d5..d142ca9e76 100644 --- a/projects/svn/index.js +++ b/projects/svn/index.js @@ -1,107 +1,33 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const { stakingPricedLP } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); -const token0Abi = 'address:token0' -const token1Abi = 'address:token1' -const { default: BigNumber } = require("bignumber.js"); +const { sumTokens2 } = require("../helper/unwrapLPs"); +const { pool2 } = require('../helper/pool2') +const { staking } = require('../helper/staking') -let token = ADDRESSES.cronos.SVN; let share = "0xf8b9facB7B4410F5703Eb29093302f2933D6E1Aa"; const rewardPool = "0xA51054BDf0910E3cE9B233e6B5BdDc0931b2E2ED"; const masonry = "0x2CcbFD9598116cdF9B94fF734ece9dCaF4c9d471"; const pool2LPs = [ - "0xB6E1705BfAFcf1efEE83C135C0F0210653bAB8F0", - "0xc924da29d37f3b8C62c4c3e4e6958bF2b5ebF677", + "0xB6E1705BfAFcf1efEE83C135C0F0210653bAB8F0", + "0xc924da29d37f3b8C62c4c3e4e6958bF2b5ebF677", ] -async function pool2(timestamp, block, chainBlocks) { - block = chainBlocks.cronos; - const chain = 'cronos'; - let balances = {}; - token = token.toLowerCase(); - share = share.toLowerCase(); - block = chainBlocks[chain]; - const pool2Balances = (await sdk.api.abi.multiCall({ - calls: pool2LPs.map(p => ({ - target: p, - params: rewardPool - })), - abi: "erc20:balanceOf", - block, - chain - })).output; - const supplies = (await sdk.api.abi.multiCall({ - calls: pool2LPs.map(p => ({ - target: p - })), - abi: "erc20:totalSupply", - block, - chain - })).output; - const pool2Token0 = (await sdk.api.abi.multiCall({ - calls: pool2LPs.map(p => ({ - target: p - })), - abi: token0Abi, - block, - chain - })).output; - const pool2Token1 = (await sdk.api.abi.multiCall({ - calls: pool2LPs.map(p => ({ - target: p - })), - abi: token1Abi, - block, - chain - })).output; - - for (let i = 0; i < pool2LPs.length; i++) { - let listedToken; - const token0 = pool2Token0[i].output.toLowerCase(); - const token1 = pool2Token1[i].output.toLowerCase(); - if (token0 === token || token0 === share) { - listedToken = token1; - } - else if (token1 === token || token1 === share) { - listedToken = token0; - } - const listedTokenBalance = (await sdk.api.erc20.balanceOf({ - target: listedToken, - owner: pool2LPs[i], - block, - chain - })).output; - const balance = BigNumber(pool2Balances[i].output).times(listedTokenBalance).div(supplies[i].output).times(2).toFixed(0); - sdk.util.sumSingleBalance(balances, `cronos:${listedToken}`, balance); - } - return balances -} -async function tvl(timestamp, block, chainBlocks) { - const balances = {}; - await sumTokensAndLPsSharedOwners( - balances, - [ - ["0xB6E1705BfAFcf1efEE83C135C0F0210653bAB8F0", true], - ["0xc924da29d37f3b8C62c4c3e4e6958bF2b5ebF677", true], - ["0x97749c9B61F878a880DfE312d2594AE07AEd7656", false], - ["0x50c0C5bda591bc7e89A342A3eD672FB59b3C46a7", false], - ["0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23", false], - ["0x2D03bECE6747ADC00E1a131BBA1469C15fD11e03", false], - ], - ["0x3827CAa33557304e1CA5D89c2f85919Da171C44D"], - chainBlocks.cronos, - "cronos", - (addr) => `cronos:${addr}` - ); - delete balances['cronos:' + ADDRESSES.cronos.SVN]; - - return balances; +async function tvl(api) { + await sumTokens2({ + api, tokens: [ + "0xB6E1705BfAFcf1efEE83C135C0F0210653bAB8F0", + "0xc924da29d37f3b8C62c4c3e4e6958bF2b5ebF677", + "0x97749c9B61F878a880DfE312d2594AE07AEd7656", + "0x50c0C5bda591bc7e89A342A3eD672FB59b3C46a7", + ADDRESSES.cronos.WCRO_1, + "0x2D03bECE6747ADC00E1a131BBA1469C15fD11e03", + ], owner: '0x3827CAa33557304e1CA5D89c2f85919Da171C44D', resolveLP: true + }) + api.removeTokenBalance(ADDRESSES.cronos.SVN) } module.exports = { - cronos : { - tvl, - pool2, - staking: stakingPricedLP(masonry, share, 'cronos', pool2LPs[1], 'mmfinance', true), - } + cronos: { + tvl, + pool2: pool2(rewardPool, pool2LPs), + staking: staking(masonry, share), + } }; \ No newline at end of file diff --git a/projects/swaap-earn/index.js b/projects/swaap-earn/index.js index f9be8debc3..dc7fe78767 100644 --- a/projects/swaap-earn/index.js +++ b/projects/swaap-earn/index.js @@ -3,7 +3,7 @@ const { cachedGraphQuery } = require('../helper/cache') const query = `query FundsTVL{ funds { id } }` module.exports = { - start: 1713312000, // Apr 17 2024 00:00:00 GMT+0000 + start: '2024-04-17', // Apr 17 2024 00:00:00 GMT+0000 } const config = { diff --git a/projects/swaap/index.js b/projects/swaap/index.js index 0744bbe62c..d1af4e2f77 100644 --- a/projects/swaap/index.js +++ b/projects/swaap/index.js @@ -29,7 +29,7 @@ async function tvl(api) { } module.exports = { - start: 1655130642, // Jun-13-2022 02:30:42 PM +UTC + start: '2022-06-13', // Jun-13-2022 02:30:42 PM +UTC polygon: { tvl, }, diff --git a/projects/swampfinance/index.js b/projects/swampfinance/index.js index 674d31402a..9ea696dcac 100644 --- a/projects/swampfinance/index.js +++ b/projects/swampfinance/index.js @@ -6,5 +6,5 @@ module.exports = yieldHelper({ chain: 'bsc', masterchef: '0x33AdBf5f1ec364a4ea3a5CA8f310B597B8aFDee3', nativeToken: '0xc5A49b4CBe004b6FD55B30Ba1dE6AC360FF9765d', - blacklistedTokens: [ADDRESSES.bsc.BTCB] + blacklistedTokens: [ADDRESSES.bsc.BTCB, ADDRESSES.bsc.ETH] }) \ No newline at end of file diff --git a/projects/swanswap/index.js b/projects/swanswap/index.js new file mode 100644 index 0000000000..8d455c7369 --- /dev/null +++ b/projects/swanswap/index.js @@ -0,0 +1,3 @@ +const { uniTvlExport } = require('../helper/unknownTokens') + +module.exports = uniTvlExport('shape', '0x2Be0c88CCc1d42920beAe4633CDdBbACe5e8812c') \ No newline at end of file diff --git a/projects/swap-coffee/index.js b/projects/swap-coffee/index.js new file mode 100644 index 0000000000..42c2a0ba0c --- /dev/null +++ b/projects/swap-coffee/index.js @@ -0,0 +1,56 @@ +const { sumTokensExport } = require('../helper/chain/ton') + +// CES +const CES_MASTER = "0:a5d12e31be87867851a28d3ce271203c8fa1a28ae826256e73c506d94d49edad" +const CES_STAKING_CONTRACT = "0:29f90533937d696105883b981e9427d1ae411eef5b08eab83f4af89c495d27df" +const DEDUST_TON_CES_POOL = "0:123e245683bd5e93ae787764ebf22291306f4a3fcbb2dcfcf9e337186af92c83" +const STONFI_CES_TON_POOL = "0:6a839f7a9d6e5303d71f51e3c41469f2c35574179eb4bfb420dca624bb989753" + +// XROCK +const XROCK_MASTER = "0:157c463688a4a91245218052c5580807792cf6347d9757e32f0ee88a179a6549" +const XROCK_STAKING_CONTRACT = "0:c84deaf1d956d5f80be722bbdaeeba33d70d068ace97c6fc23e1bfeb5689e1ca" +const DEDUST_XROCK_USDT_POOL = "0:9cf96b400deedd4143bd113d8d767f0042515e2ad510c4b4adbe734cd30563b8" +const STONFI_XROCK_USDT_POOL = "0:6ba0e19f6adacbefdcbbc859407241eff578f4a57edc8e3e05e86dcfbb283f20" + +// JETTON +const JETTON_STAKING_CONTRACT = "0:160d382ed1a373e7e859d1a76b319b4a3e5c8945f26fc8177662ac59a2c67f38" +const JETTON_MASTER = "0:105e5589bc66db15f13c177a12f2cf3b94881da2f4b8e7922c58569176625eb5" +const STONFI_V2_JETTON_TON_POOL = "0:ff5f1fa2411d33dc6268cd0b74744d726e0c01145c9f4f9c9e867c0e244de490" +const DEDUST_JETTON_TON_POOL = "0:f417fc37e424d65314d646379fa15fb8d342910368d7e755f87b3220994518ff" +const STONFI_JETTON_TON_POOL = "0:139eae96db1bf5d02d7d2cd942dbac45b535757dbccc917997402587aadbfa3a" +const DEDUST_JETTON_USDT_POOL = "0:98ac7350eecb80d1f1d690912e2ed5e541e2efff1a722670103f97ed2407f473" +const STONFI_JETTON_USDT_POOL = "0:1b011c80e68e5942aab7e5c79b7b4faacd4999ecda9579df58b3edfbcca414f4" +const STONFI_V2_JETTON_USDT_POOL = "0:46fe73fa794a69f3d6723d10b136dc884061df06e602ccb5d58414306efe5310" + +// DFC +const DFC_STAKING_CONTRACT = "0:3acaf26d83f9bff8b88b72434fb6ab23182f5153e7690a07557e9626f8824bab" +const DFC_MASTER = "0:f6eb371de82aa9cfb5b22ca547f31fdc0fa0fbb41ae89ba84a73272ff0bf2157" +const DEDUST_DFC_TON_POOL = "0:84868f284afcd59de33eab700b57d18c3a8473946370ac6b6ae29db1dd29c89c" +const STONFI_DFC_TON_POOL = "0:a66a91222d03b4b9810e9af0de5cd47d8b947891854f126c8d2447304824d251" + +module.exports = { + methodology: "Counts swap.coffee smartcontract balance as TVL.", + timetravel: false, + ton: { + tvl: () => { }, + staking: sumTokensExport({ + owners: [CES_STAKING_CONTRACT, XROCK_STAKING_CONTRACT, JETTON_STAKING_CONTRACT, DFC_STAKING_CONTRACT], + tokens: [XROCK_MASTER, CES_MASTER, JETTON_MASTER, DFC_MASTER], + onlyWhitelistedTokens: true + }), + pool2: sumTokensExport({ + owners: [CES_STAKING_CONTRACT, XROCK_STAKING_CONTRACT, JETTON_STAKING_CONTRACT, DFC_STAKING_CONTRACT], + tokens: [ + DEDUST_TON_CES_POOL, STONFI_CES_TON_POOL, + + DEDUST_XROCK_USDT_POOL, STONFI_XROCK_USDT_POOL, + + STONFI_V2_JETTON_TON_POOL, DEDUST_JETTON_TON_POOL, STONFI_JETTON_TON_POOL, DEDUST_JETTON_USDT_POOL, + STONFI_JETTON_USDT_POOL, STONFI_V2_JETTON_USDT_POOL, + + DEDUST_DFC_TON_POOL, STONFI_DFC_TON_POOL + ], + onlyWhitelistedTokens: true + }) + } +} \ No newline at end of file diff --git a/projects/swapline-lb-v2/index.js b/projects/swapline-lb-v2/index.js new file mode 100644 index 0000000000..7ae217039c --- /dev/null +++ b/projects/swapline-lb-v2/index.js @@ -0,0 +1,5 @@ +const { joeV2Export } = require('../helper/traderJoeV2') + +module.exports = joeV2Export({ + base: '0x20918F4BA70439C58d070D4746f3aA303a7595d8' +}) \ No newline at end of file diff --git a/projects/swapmode-v3/index.js b/projects/swapmode-v3/index.js new file mode 100644 index 0000000000..0d83ba8218 --- /dev/null +++ b/projects/swapmode-v3/index.js @@ -0,0 +1,6 @@ +const { uniV3Export } = require('../helper/uniswapV3') +const factory = '0x6E36FC34eA123044F278d3a9F3819027B21c9c32' + +module.exports = uniV3Export({ + mode: { factory, fromBlock: 5005167 }, +}) \ No newline at end of file diff --git a/projects/swapos/index.js b/projects/swapos/index.js new file mode 100644 index 0000000000..710642fa8e --- /dev/null +++ b/projects/swapos/index.js @@ -0,0 +1,6 @@ +const { uniTvlExport } = require('../helper/unknownTokens'); + +module.exports = uniTvlExport( + 'ethereum', + '0xfB1Eb9a45Feb7269f3277233AF513482Bc04Ea63' +); diff --git a/projects/swapsicle-v2/index.js b/projects/swapsicle-v2/index.js index cdac04cecf..04d7290f05 100644 --- a/projects/swapsicle-v2/index.js +++ b/projects/swapsicle-v2/index.js @@ -16,156 +16,108 @@ module.exports = uniV3Export({ fromBlock: 301362984, isAlgebra: true, }, + taiko: { + factory: "0xBa90FC740a95A6997306255853959Bb284cb748a", + fromBlock: 338445, + isAlgebra: true, + }, }); const contracts = { telos: { stakingContract_iceCreamVan: "0xA234Bb3BEb60e654601BEa72Ff3fB130f9ed2aa7", stakingContract_zombieVan: "0x67275189e0deb3ce9eb918928c0011a0a582bd0e", - stakingContract_iceCreamZombies: - "0x581b6d860aa138c46dcaf6d5c709cd070cd77eb8", + stakingContract_iceCreamZombies: "0x581b6d860aa138c46dcaf6d5c709cd070cd77eb8", slush: "0xac45ede2098bc989dfe0798b4630872006e24c3f", }, mantle: { stakingContract_iceCreamVan: "0xe0ac81c7692b9119658e01edc1d743bf4c2ec21a", stakingContract_zombieVan: "0x049a58a2aa1b15628aa0cda0433d716f6f63cbba", - stakingContract_iceCreamZombies: - "0x21b276de139ce8c75a7b4f750328dbf356195b49", + stakingContract_iceCreamZombies: "0x21b276de139ce8c75a7b4f750328dbf356195b49", slush: "0x8309bc8bb43fb54db02da7d8bf87192355532829", }, + taiko: { + stakingContract_iceCreamVan: "0x0cdde1dead51b156bd62113664d60b354b4df4ab", + slush: "0x36bfe1f1b36cfdb4fe75cc592ff5dc6200ad3e0f", + }, }; const config = { mantle: { endpoint: - "https://subgraph-api.mantle.xyz/subgraphs/name/cryptoalgebra/analytics", + "https://subgraph-api.mantle.xyz/api/public/f077c8d4-0d6c-42d4-9bbd-050948dc5c86/subgraphs/swapsicle/analytics/prod/gn", }, telos: { endpoint: - "https://telos.subgraph.swapsicle.io/subgraphs/name/cryptoalgebra/analytics", + "https://api.telos.0xgraph.xyz/api/public/f59149ee-c99a-41d0-afe4-1c86170a98b0/subgraphs/swapsicle/analytics/prod/gn", + }, + taiko: { + endpoint: + "https://api.goldsky.com/api/public/project_clr6mlufzbtuy01vd012wgt5k/subgraphs/swapsicle-analytics-taiko/prod/gn", }, }; -const query = `{ - pools { - id - token0 { id } - token1 { id } - } -}`; - const slushPriceQuery = `{ token(id: "TOKENID") { derivedMatic } }`; -const WTLOS = ADDRESSES.telos.WTLOS; -const WMNT = ADDRESSES.mantle.WMNT; - -function getTLOSAddress(address) { - return `telos:${address}`; -} - -function getMantleAddress(address) { - return `mantle:${address}`; -} +const nativeTokenAddresses = { + telos: `telos:${ADDRESSES.telos.WTLOS}`, + mantle: `mantle:${ADDRESSES.mantle.WMNT}`, + taiko: `taiko:${ADDRESSES.taiko.WETH}`, +}; -async function slushToEthConvert(slushAmount, chain) { - const slushETH = await cachedGraphQuery( +async function slushToNativeConvert(slushAmount, chain) { + const slushNativePrice = await cachedGraphQuery( "swapsicle-slush-eth-price/" + chain, - chain == "telos" ? config.telos.endpoint : config.mantle.endpoint, + config[chain].endpoint, slushPriceQuery.replace( "TOKENID", - chain == "telos" ? contracts.telos.slush : contracts.mantle.slush + contracts[chain].slush ) ); - - const slushStaked = slushAmount / 10 ** 18; - return slushStaked * slushETH.token.derivedMatic; + return slushAmount / 10 ** 18 * slushNativePrice.token.derivedMatic; } -async function iceCreamVanStake({ chain, telos: block }) { - const tokenBalance = - chain == "telos" - ? await sdk.api.abi.call({ - target: contracts.telos.stakingContract_iceCreamVan, - abi: iceCreamVanABI.totalShares, - chain: "telos", - block, - }) - : await sdk.api.abi.call({ - target: contracts.mantle.stakingContract_iceCreamVan, - abi: iceCreamVanABI.totalShares, - chain: "mantle", - block, - }); - - const ETHBalance = await slushToEthConvert(tokenBalance.output, chain); - - const balances = {}; - balances[chain == "telos" ? getTLOSAddress(WTLOS) : getMantleAddress(WMNT)] = - ETHBalance * 10 ** 18; - - return balances; +/** Returns an object as follows { `chainName:nativeTokenAddress`: slushBalanceInNativeToken } */ +async function getStakeBalance(slushBalance, chain) { + const nativeBalance = await slushToNativeConvert(slushBalance, chain); + return { + [nativeTokenAddresses[chain]]: nativeBalance * 10 ** 18 + }; } -async function ZombieVanStake({ chain, telos: block }) { - const tokenBalance = - chain == "telos" - ? await sdk.api.abi.call({ - target: contracts.telos.stakingContract_zombieVan, - abi: zombieVanABI.totalStaked, - chain: "telos", - block, - }) - : await sdk.api.abi.call({ - target: contracts.mantle.stakingContract_zombieVan, - abi: zombieVanABI.totalStaked, - chain: "mantle", - block, - }); - - const ETHBalance = await slushToEthConvert(tokenBalance.output, chain); - - const balances = {}; - balances[chain == "telos" ? getTLOSAddress(WTLOS) : getMantleAddress(WMNT)] = - ETHBalance * 10 ** 18; - - return balances; +async function iceCreamVanStake(api) { + const response = await api.call({ + target: contracts[api.chain].stakingContract_iceCreamVan, + abi: iceCreamVanABI.totalShares, + }) + return getStakeBalance(response, api.chain); } -async function ICZStake({ chain, telos: block }) { - const tokenBalance = - chain == "telos" - ? await sdk.api.erc20.balanceOf({ - target: contracts.telos.slush, - owner: contracts.telos.stakingContract_iceCreamZombies, - chain: "telos", - block, - }) - : await sdk.api.erc20.balanceOf({ - target: contracts.mantle.slush, - owner: contracts.mantle.stakingContract_iceCreamZombies, - chain: "mantle", - block, - }); - - const ETHBalance = await slushToEthConvert(tokenBalance.output, chain); - - const balances = {}; - balances[chain == "telos" ? getTLOSAddress(WTLOS) : getMantleAddress(WMNT)] = - ETHBalance * 10 ** 18; +async function ZombieVanStake(api) { + const response = await api.call({ + target: contracts[api.chain].stakingContract_zombieVan, + abi: zombieVanABI.totalStaked, + }) + return getStakeBalance(response, api.chain); +} - return balances; +async function ICZStake(api) { + const response = await api.call({ + abi: 'erc20:balanceOf', + target: contracts[api.chain].slush, + params: contracts[api.chain].stakingContract_iceCreamZombies, + }) + return getStakeBalance(response, api.chain); } Object.keys(config).forEach((chain) => { - const { endpoint } = config[chain]; module.exports[chain].staking = sdk.util.sumChainTvls([ - () => iceCreamVanStake({ chain }), - () => ZombieVanStake({ chain }), - // NFT's - () => ICZStake({ chain }), - ]) -}); + (api) => iceCreamVanStake(api), + (api) => (chain !== 'taiko' ? ZombieVanStake(api) : 0), + (api) => (chain !== 'taiko' ? ICZStake(api) : 0), + ]); +}); \ No newline at end of file diff --git a/projects/swapsicle/index.js b/projects/swapsicle/index.js index 5a4174c92b..cebbb79fa3 100644 --- a/projects/swapsicle/index.js +++ b/projects/swapsicle/index.js @@ -157,5 +157,4 @@ module.exports = { stakedTLOSIceBox ]) }, - //start: 15434772, } diff --git a/projects/swaylend/index.js b/projects/swaylend/index.js new file mode 100644 index 0000000000..e4e2335760 --- /dev/null +++ b/projects/swaylend/index.js @@ -0,0 +1,32 @@ +const { sumTokens, query } = require("../helper/chain/fuel") +const { getConfig } = require('../helper/cache') +const { get } = require('../helper/http') + +const markets = [ + '0x657ab45a6eb98a4893a99fd104347179151e8b3828fd8f2a108cc09770d1ebae', // USDC market +] +async function tvl(api) { + return sumTokens({ api, owners: markets, }) +} + +async function borrowed(api) { + const abi = await getConfig('swaylend/abi', undefined,{ + fetcher: async () => { + let data = await get('https://raw.githubusercontent.com/Swaylend/swaylend-monorepo/refs/heads/develop/apps/frontend/src/contract-types/Market.ts') + data = data.split('const abi =')[1].split(';')[0] + return JSON.parse(data) // ensure that this doesnt fail + // return data + } + }) + for (const market of markets) { + const { base_token } = await query({ contractId: market, abi, method: 'get_market_configuration' }) + const { total_borrow_base }= await query({ contractId: market, abi, method: 'get_market_basics' }) + api.add(base_token.bits, +total_borrow_base ) + } +} + +module.exports = { + fuel: { tvl, borrowed, }, + timetravel: false, +} + diff --git a/projects/sweep-n-flip/index.js b/projects/sweep-n-flip/index.js index 6f4d2f25be..5c0e0e0091 100644 --- a/projects/sweep-n-flip/index.js +++ b/projects/sweep-n-flip/index.js @@ -1,37 +1,76 @@ +const { getLogs } = require('../helper/cache/getLogs'); +const { transformDexBalances } = require('../helper/portedTokens'); -const { getLogs } = require('../helper/cache/getLogs') -const { transformDexBalances } = require('../helper/portedTokens') - -const factory = '0x16eD649675e6Ed9F1480091123409B4b8D228dC1' module.exports = { misrepresentedTokens: true, methodology: 'TVL counts the liquidity of the pools on each chain.', -} +}; const config = { - ethereum: { fromBlock: 12965000, }, - polygon: { fromBlock: 12965000, }, - arbitrum: { fromBlock: 101851523, }, -} + ethereum: { + fromBlock: 12965000, + factory: '0x16eD649675e6Ed9F1480091123409B4b8D228dC1', + }, + polygon: { + fromBlock: 12965000, + factory: '0x16eD649675e6Ed9F1480091123409B4b8D228dC1', + }, + arbitrum: { + fromBlock: 101851523, + factory: '0x16eD649675e6Ed9F1480091123409B4b8D228dC1', + }, + mode: { + fromBlock: 6989680, + factory: '0x7962223D940E1b099AbAe8F54caBFB8a3a0887AB', + }, +}; -Object.keys(config).forEach(chain => { - const { fromBlock } = config[chain] +Object.keys(config).forEach((chain) => { + const { fromBlock, factory } = config[chain]; module.exports[chain] = { tvl: async (api) => { let logs = await getLogs({ api, target: factory, - eventAbi: "event PairCreated(address indexed token0, address indexed token1, address pair, uint256)", + eventAbi: + 'event PairCreated(address indexed token0, address indexed token1, address pair, uint256)', onlyArgs: true, fromBlock, - }) - let pairs = logs.map(log => log.pair) - const names = await api.multiCall({ abi: 'string:name', calls: pairs }) - logs = logs.filter((pair, i) => names[i] === 'SweepnFlip LPs') - pairs = logs.map(log => log.pair) - const bals0 = await api.multiCall({ abi: 'erc20:balanceOf', calls: pairs.map((pair, i) => ({ target: logs[i].token0, params: pair })) }) - const bals1 = await api.multiCall({ abi: 'erc20:balanceOf', calls: pairs.map((pair, i) => ({ target: logs[i].token1, params: pair })) }) - return transformDexBalances({ chain, data: logs.map((l, i) => ({ token0Bal: bals0[i], token1Bal: bals1[i], token0: l.token0, token1: l.token1 })) }) - } - } -}) \ No newline at end of file + }); + + let pairs = logs.map((log) => log.pair); + + const names = await api.multiCall({ abi: 'string:name', calls: pairs }); + + logs = logs.filter((pair, i) => names[i] === 'SweepnFlip LPs'); + + pairs = logs.map((log) => log.pair); + + const bals0 = await api.multiCall({ + abi: 'erc20:balanceOf', + calls: pairs.map((pair, i) => ({ + target: logs[i].token0, + params: pair, + })), + }); + + const bals1 = await api.multiCall({ + abi: 'erc20:balanceOf', + calls: pairs.map((pair, i) => ({ + target: logs[i].token1, + params: pair, + })), + }); + + return transformDexBalances({ + chain, + data: logs.map((l, i) => ({ + token0Bal: bals0[i], + token1Bal: bals1[i], + token0: l.token0, + token1: l.token1, + })), + }); + }, + }; +}); diff --git a/projects/swell-earn-eth/index.js b/projects/swell-earn-eth/index.js new file mode 100644 index 0000000000..6eb2e6e268 --- /dev/null +++ b/projects/swell-earn-eth/index.js @@ -0,0 +1,43 @@ +const { sumTokens2, PANCAKE_NFT_ADDRESS } = require('../helper/unwrapLPs') +const ADDRESSES = require('../helper/coreAssets.json') + +const earnETHVault = '0x9Ed15383940CC380fAEF0a75edacE507cC775f22'; +const pancakeswapMasterChef = '0x556B9306565093C855AEA9AE92A594704c2Cd59e' + +const ethTokens = [ + '0xFAe103DC9cf190eD75350761e95403b7b8aFa6c0', // rswETH + '0xf951E335afb289353dc249e82926178EaC7DEd78', // swETH + ADDRESSES.ethereum.WSTETH, // wstETH + ADDRESSES.ethereum.WETH, // WETH +] + +const pendleLPTokens = [ + "0x7C7FbB2d11803C35Aa3e283985237aD27f64406B", //rswETH 26Dec2024 + "0x0e1C5509B503358eA1Dac119C1D413e28Cc4b303", //swETH 26December2024 +] + +const vaultTokens = [ + "0x78Fc2c2eD1A4cDb5402365934aE5648aDAd094d0", // Re7 WETH +] + +const tokens = [ + ...ethTokens, + ...pendleLPTokens, + ...vaultTokens, +] + + +const tvl = async (api) => { + return sumTokens2({ + api, + owner: earnETHVault, tokens, + uniV3nftsAndOwners: [[PANCAKE_NFT_ADDRESS, earnETHVault]], + uniV3ExtraConfig: { nftIdFetcher: pancakeswapMasterChef } + }) +} + +module.exports = { + methodology: 'TVL represents the sum of tokens deposited in the vault + LP positions', + doublecounted: true, + ethereum: { tvl } +} \ No newline at end of file diff --git a/projects/swell-swbtc/index.js b/projects/swell-swbtc/index.js index a419de3aee..61f3308a3c 100644 --- a/projects/swell-swbtc/index.js +++ b/projects/swell-swbtc/index.js @@ -1,20 +1,8 @@ -const ADDRESSES = require('../helper/coreAssets.json') - -const WBTC = ADDRESSES.ethereum.WBTC; -const swBTC = '0x8DB2350D78aBc13f5673A411D4700BCF87864dDE' - -async function tvl(api) { - const totalSupply = await api.call({ target: swBTC, abi: 'uint256:totalSupply'}); - const rate = await api.call({ target: swBTC, abi: 'uint256:pricePerShare'}); - - return { - [WBTC]: (totalSupply * rate)/1e8 - }; -} +const { sumERC4626VaultsExport } = require('../helper/erc4626') module.exports = { - doublecounted: true, - ethereum: { - tvl, - }, + doublecounted: true, + ethereum: { + tvl: sumERC4626VaultsExport({ vaults: ['0x8DB2350D78aBc13f5673A411D4700BCF87864dDE'], isOG4626: true, }), + }, } \ No newline at end of file diff --git a/projects/swellchain/index.js b/projects/swellchain/index.js new file mode 100644 index 0000000000..0673aaa37d --- /dev/null +++ b/projects/swellchain/index.js @@ -0,0 +1,14 @@ +const { sumTokensExport } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: sumTokensExport({ + owners: [ + "0x7aA4960908B13D104bf056B23E2C76B43c5AACc8", // L1StandardBridge + "0x758E0EE66102816F5C3Ec9ECc1188860fbb87812", // OptimismPortal2 + "0xecf3376512EDAcA4FBB63d2c67d12a0397d24121", // wstETH L1ERC20TokenBridge + ], + fetchCoValentTokens: true, + }), + } +}; diff --git a/projects/swirllend/index.js b/projects/swirllend/index.js index ec5925e93e..a9727b1352 100644 --- a/projects/swirllend/index.js +++ b/projects/swirllend/index.js @@ -3,19 +3,18 @@ const { compoundExports2 } = require("../helper/compound"); module.exports = { linea: compoundExports2({ comptroller: "0xcAABf6Ffb76634183254B0a4a3D5fb36180FdAE4", - fetchBalances: true, cether: '0x91067b912f89dfca50c3f5529dbeb78b63c6a2e5', }), base: compoundExports2({ comptroller: "0xcAABf6Ffb76634183254B0a4a3D5fb36180FdAE4", - fetchBalances: true, cether: '0x91067b912f89dfca50c3f5529dbeb78b63c6a2e5', }), hallmarks: [ [Math.floor(new Date('2023-08-16')/1e3), 'Project Rugged!'], ], + deadFrom: '2023-08-16' }; module.exports.base.borrowed = () => ({}) diff --git a/projects/swissborg/index.js b/projects/swissborg/index.js index 77d068e1ef..4f8a3445ed 100644 --- a/projects/swissborg/index.js +++ b/projects/swissborg/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -16,17 +17,15 @@ const config = { '0x11444C6389A26C8E41d7FD5CafBfCC511303b7d3', '0x67FE3293FC4e877F3CDc3F0ed93721a600f72BdE', '0x178Fb204c1ff2Ed7d0651C522A3a5B15480Eb76d', + '0xFbA64167e4f091Ca625FA79aa6f83665856f8Bf2', + '0x8F0d8b27bF808976Fa94f03e2230b4bca95bf3C4', + '0xe2484A7Ac1b9Cb6D8E55fd00e129aB913172bea6', + '0xdbe15F6573108B6736c70779C683Ca633c18aFe2', + '0xa2E07DB4e92F66071Ca68984517972F5625AB325', ], }, bitcoin: { - owners: [ - '18DowXoMUQT5EU8zPTDTrq4hrwmi8ddCcc', - 'bc1qfu6su3qz4tn0et634mv7p090a0cgameq6rdvuc', - 'bc1qutkfwnuq4v0zdkenqt5vyuxlrmsezldzue5znc', - '1Mgs8zLJ7JyngcNRUscayyPHnnYJpJS5x2', - 'bc1qc8ee9860cdnkyej0ag5hf49pcx7uvz89lkwpr9', - '1JgXCkk3gjmgfgjT2vvnjpvqfvNNTFCRpM', - ] + owners: bitcoinAddressBook.swissborg }, ripple: { owners: [ @@ -49,6 +48,9 @@ const config = { 'Cet3t77x2BBVSmiEFm8ZPoDSngbpso2RuWPL79Ky7SpA', '9qoUcyhKSWMbk6tqGUYQUpeosPcdUnJszG4eQKwfe4gL', 'Fe7SEekiKygziaEGKxsDsgLVzrCfNvVBvAYsaJBwFA8s', + 'AR2ecEWY2vfsXmd4fUxc196LhbX5p8TnhvJg8t3fgYUN', + '7Sng9GTnkjjb8WTF2kYX8JWqGHHwJGk5Ke9639zREUAR', + '3jvARuePRR6KpNAeYYGRQzs8W4VYsWWxe4BfoTSTZhUr', ], }, polkadot: { @@ -88,6 +90,7 @@ const config = { '0xcDE4c1b984F3F02f997ECfF9980B06316de2577d', '0x7153D2ef9F14a6b1Bb2Ed822745f65E58d836C3F', '0xFF4606bd3884554CDbDabd9B6e25E2faD4f6fc54', + '0x9531AA9883bF11f2a63d86caD7e826f37Acec3c4', ] }, polygon: { @@ -106,7 +109,13 @@ const config = { owners: [ 'cosmos10dfzd2wpnpeuy2lgan35ah8dg5p4l298v0n8e8', ] - } + }, + arbitrum: { + owners: [ + '0x8F0d8b27bF808976Fa94f03e2230b4bca95bf3C4', + '0x5509Be53b2dD0CD6fb8473B0EdA94e0a3059b73a', + ] + }, } module.exports = cexExports(config) diff --git a/projects/swivel/index.js b/projects/swivel/index.js index ff654a4a7d..557bf1710e 100644 --- a/projects/swivel/index.js +++ b/projects/swivel/index.js @@ -5,6 +5,7 @@ module.exports = { hallmarks: [ [Math.floor(new Date('2023-03-13') / 1e3), 'Euler was hacked'], ], + deadFrom: '2023-03-13', ethereum: { tvl: sumTokensExport({ owners: [ diff --git a/projects/swop/index.js b/projects/swop/index.js index a70e7ddf32..f73ae827be 100644 --- a/projects/swop/index.js +++ b/projects/swop/index.js @@ -1,32 +1,31 @@ const { sumTokens, call } = require('../helper/chain/waves'); const { getConfig } = require("../helper/cache"); -// const { get } = require("../helper/http"); -// const { toUSDTBalances } = require("../helper/balances"); - +const { getUniTVL } = require('../helper/unknownTokens') const swopfiBackendEndpoint = "https://backend.swop.fi"; const getSwopFiTVL = async (api) => { - // const poolsStats = await get(`${swopfiBackendEndpoint}/pools`); - // return toUSDTBalances(poolsStats.overall.liquidity); const { pools } = await getConfig('swop', `${swopfiBackendEndpoint}/pools`) - // const owners = pools.map(i => i.id) for (const pool of pools) { await sumTokens({ owners: [pool.id], api, includeWaves: true, blacklistedTokens: ['Ehie5xYpeN8op1Cctc6aGUrqx8jq3jtf1DSjXDbfm7aT'] }) } } - module.exports = { timetravel: false, // Waves blockchain, methodology: "Counts the tokens locked on AMM pools", + misrepresentedTokens: true, + hallmarks: [ + [1730299107, "Unit0 Protocol Lunch"] + ], waves: { tvl: getSwopFiTVL, staking: async () => { - // const stakingStats = await get(`${swopfiBackendEndpoint}/staking`); - // return toUSDTBalances(stakingStats.swop.totalSwopUsdt); const res = await call({ target: '3PLHVWCqA9DJPDbadUofTohnCULLauiDWhS', key: 'total_GSwop_amount' }) return { swop: res / 1e8 } } + }, + unit0: { + tvl: getUniTVL({ factory: '0x944Eb5ac122Ea8c764Fa80e80A7fCA2C9A13Ab0a', useDefaultCoreAssets: true}) } }; diff --git a/projects/syde/index.js b/projects/syde/index.js new file mode 100644 index 0000000000..8becae7d9a --- /dev/null +++ b/projects/syde/index.js @@ -0,0 +1,13 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require("../helper/coreAssets.json"); + +const sydeBtcPool = "EQA2J0WCTdYdG-XeyMpPBTeu2dWB2f0oFiV4KVRfV0gewF4E" +const sydeEthPool = "EQD-7ycFO3yeh0EeT2wgXoOQmu64rdDBXqGm4nHDInPfCxJG" +const sydeEurPool = "EQDXvkuKPZahcTDRHSybwiU0E5VpiGFP2QS2iHr082JmtTT9" + +module.exports = { + methodology: 'Counts Syde smartcontract balance as TVL.', + ton: { + tvl: sumTokensExport({ owners: [sydeBtcPool, sydeEthPool, sydeEurPool], tokens: [ADDRESSES.null]}), + } +} diff --git a/projects/sygnum-bank/index.js b/projects/sygnum-bank/index.js new file mode 100644 index 0000000000..3d1318486b --- /dev/null +++ b/projects/sygnum-bank/index.js @@ -0,0 +1,11 @@ +const fund = "0x2AB105A3eAd22731082B790CA9A00D9A3A7627F9"; + +module.exports = { + methodology: "TVL represents the total sum of all tokens minted in Fidelity's investment fund (FIUSD)", + era: { + tvl: async (api) => { + const supply = await api.call({ target: fund, abi: "erc20:totalSupply" }); + api.add("0x2AB105A3eAd22731082B790CA9A00D9A3A7627F9", supply); + }, + }, +}; diff --git a/projects/symbiosis-finance/config.js b/projects/symbiosis-finance/config.js index 46832f3c71..e53656179b 100644 --- a/projects/symbiosis-finance/config.js +++ b/projects/symbiosis-finance/config.js @@ -1,414 +1,394 @@ -const ADDRESSES = require('../helper/coreAssets.json') - -const TOKENS = { - ethereum: { - pufETH: "0xD9A442856C234a39a81a089C06451EBAa4306a72", - LADYS: "0x12970E6868f88f6557B76120662c1B3E50A646bf", - XDAO: "0x71eebA415A523F5C952Cc2f06361D5443545Ad28" - }, - bsc: { - XDAO: "0x71eebA415A523F5C952Cc2f06361D5443545Ad28" - }, - polygon: { - XDAO: "0x71eebA415A523F5C952Cc2f06361D5443545Ad28" - }, - arbitrum: { - XDAO: "0x71eebA415A523F5C952Cc2f06361D5443545Ad28", - LADYS: "0x3b60FF35D3f7F62d636b067dD0dC0dFdAd670E4E" - }, - manta: { - pufETH: "0xA53E005Cecd3D7C89A4AE814617cC14828b6527E" - }, - scroll: { - pufETH: "0xc4d46E8402F476F269c379677C99F18E22Ea030e" - }, - zeta: { - pufETH: "0x1e4bF3CaBD7707089138dD5a545B077413FA83Fc" - }, - zklink: { - pufETH: "0x1B49eCf1A8323Db4abf48b2F5EFaA33F7DdAB3FC" - }, - cronos: { - USDC: ADDRESSES.cronos.USDC - }, - fraxtal: { - WETH: ADDRESSES.fraxtal.WETH, - FRAX: ADDRESSES.fraxtal.FRAX - } -} - module.exports = { chains: [ { - name: 'ethereum', - tokens: [ - ADDRESSES.ethereum.USDC, - ADDRESSES.ethereum.USDT, - ADDRESSES.ethereum.WETH, - ADDRESSES.ethereum.WBTC, - ADDRESSES.ethereum.FRAX, - TOKENS.ethereum.XDAO, - TOKENS.ethereum.LADYS, - TOKENS.ethereum.pufETH, - ], - holders: [ - '0xb80fDAA74dDA763a8A158ba85798d373A5E84d84', // portal v1 - '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8', // portal v2 - '0x42Cd64f48496dDdfEfF8F3704df9175dbe20d325', // portal Teleport - ] - }, - { - name: 'bsc', - tokens: [ - ADDRESSES.bsc.BUSD, - ADDRESSES.bsc.USDC, - ADDRESSES.bsc.ETH, - ADDRESSES.bsc.BTCB, - TOKENS.bsc.XDAO, - ], - holders: [ - '0xD7F9989bE0d15319d13d6FA5d468211C89F0b147', // portal v1 - '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4', // portal v2 - '0xb91d3060C90aac7c4c706aef2B37997b3b2a1DcF', // portal Teleport - '0xab0738320A21741f12797Ee921461C691673E276', // v1 pool with Ethereum - ] - }, - { - name: 'avax', - tokens: [ - ADDRESSES.avax.USDC_e, - ADDRESSES.avax.USDC, - ], - holders: [ - '0xD7F9989bE0d15319d13d6FA5d468211C89F0b147', // portal v1 - '0xE75C7E85FE6ADd07077467064aD15847E6ba9877', // portal v2 - '0xab0738320A21741f12797Ee921461C691673E276', // v1 pool with Ethereum - '0xF4BFF06E02cdF55918e0ec98082bDE1DA85d33Db', // v1 pool with BNB chain - ] - }, - { - name: 'polygon', - tokens: [ - ADDRESSES.polygon.USDC, - ADDRESSES.polygon.WETH_1, - ADDRESSES.polygon.FRAX, - TOKENS.polygon.XDAO, - ], - holders: [ - '0xD7F9989bE0d15319d13d6FA5d468211C89F0b147', // portal v1 - '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8', // portal v2 - '0x3338BE49A5f60e2593337919F9aD7098e9a7Dd7E', // portal Teleport - '0xab0738320A21741f12797Ee921461C691673E276', // v1 pool with Ethereum - '0xF4BFF06E02cdF55918e0ec98082bDE1DA85d33Db', // v1 pool with BNB chain - '0x3F1bfa6FA3B6D03202538Bf0cdE92BbE551104ac', // v1 pool with Avalanche - ] - }, - { - name: 'telos', - tokens: [ - ADDRESSES.telos.syUSDC, - ], - holders: [ - '0x17A0E3234f00b9D7028e2c78dB2caa777F11490F', // portal v1 - '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8', // portal v2 - '0x7f3C1E54b8b8C7c08b02f0da820717fb641F26C8', // v1 pool with BNB chain - ] - }, - { - name: 'aurora', - tokens: [ - ADDRESSES.aurora.USDC_e, - ], - holders: [ - '0x17A0E3234f00b9D7028e2c78dB2caa777F11490F', // portal v1 - '0x7Ff7AdE2A214F9A4634bBAA4E870A5125dA521B8', // v1 pool with BNB chain - '0x7F1245B61Ba0b7D4C41f28cAc9F8637fc6Bec9E4', // v1 pool with Polygon - ] - }, - { - name: 'boba', - tokens: [ - ADDRESSES.boba.USDC, - ], - holders: [ - '0xD7F9989bE0d15319d13d6FA5d468211C89F0b147', // portal v1 - '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8', // portal v2 - '0xab0738320A21741f12797Ee921461C691673E276', // v1 pool with Ethereum - '0xe0ddd7afC724BD4B320472B5C954c0abF8192344', // v1 pool with BNB chain - ] - }, - { - name: 'boba_avax', - tokens: [ - ADDRESSES.boba_avax.USDC_e, - ], - holders: [ - '0xd8db4fb1fEf63045A443202d506Bcf30ef404160', // portal v2 - ] - }, - { - name: 'boba_bnb', - tokens: [ - ADDRESSES.boba_bnb.USDC, - ], - holders: [ - '0x6148FD6C649866596C3d8a971fC313E5eCE84882', // pool v2 - ] - }, - { - name: 'kava', - tokens: [ - ADDRESSES.kava.USDC, - ADDRESSES.kava.USDt, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'era', - tokens: [ - ADDRESSES.era.USDC, - ADDRESSES.era.WETH, - ADDRESSES.era.WBTC, - ], - holders: [ - '0x39dE19C9fF25693A2311AAD1dc5C790194084A39', // portal v2 - '0x4f5456d4d0764473DfCA1ffBB8524C151c4F19b9', // new portal v2 - '0x97b99f47b086a074f214f4A62A3b041599726DC2', // portal Teleport - ] - }, - { - name: 'arbitrum', - tokens: [ - ADDRESSES.arbitrum.USDC, // USDC.e - ADDRESSES.arbitrum.USDC_CIRCLE, - ADDRESSES.arbitrum.WETH, - ADDRESSES.arbitrum.FRAX, - TOKENS.arbitrum.XDAO, - TOKENS.arbitrum.LADYS, - ], - holders: [ - '0x01A3c8E513B758EBB011F7AFaf6C37616c9C24d9', // portal v2 - '0x0425841529882628880fBD228AC90606e0c2e09A', // portal Teleport - ] - }, - { - name: 'optimism', - tokens: [ - ADDRESSES.optimism.USDC, - ADDRESSES.optimism.WETH_1, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'arbitrum_nova', - tokens: [ - ADDRESSES.arbitrum_nova.USDC, - ADDRESSES.arbitrum_nova.WETH, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'polygon_zkevm', - tokens: [ - ADDRESSES.polygon_zkevm.USDC, - ADDRESSES.polygon_zkevm.USDC_CIRCLE, - ADDRESSES.polygon_zkevm.WETH, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'mantle', - tokens: [ - ADDRESSES.mantle.USDC, - ADDRESSES.mantle.WETH, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'linea', - tokens: [ - ADDRESSES.linea.WETH, - ADDRESSES.linea.USDC, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - '0x7f6fb9f3ce785F3d85772c038Fda58eC9432D421', // portal Teleport - ] - }, - { - name: 'base', - tokens: [ - ADDRESSES.base.WETH, - ADDRESSES.base.USDbC, - ], - holders: [ - '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4', // portal v2 - '0xEE981B2459331AD268cc63CE6167b446AF4161f8', // portal v2 new - ] - }, - { - name: 'tron', - tokens: [ - ADDRESSES.tron.USDT, - ], - holders: [ - 'TVgY3ayqTGUoe7th84ZNL5peVfRNdLFDjf', // portal v2 - ] - }, - { - name: 'scroll', - tokens: [ - ADDRESSES.scroll.WETH, - ADDRESSES.scroll.USDC, - TOKENS.scroll.pufETH, - ], - holders: [ - '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4', // portal v2 - '0x9b1c1949995E43E6d391A4FDA207bf4386Ee5a32', // portal Teleport - ] - }, - { - name: 'manta', - tokens: [ - ADDRESSES.manta.WETH, - ADDRESSES.manta.USDC, - TOKENS.manta.pufETH, - ], - holders: [ - '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4', // portal v2 - ] - }, - { - name: 'metis', - tokens: [ - ADDRESSES.metis.WETH, - ], - holders: [ - '0xd8db4fb1fEf63045A443202d506Bcf30ef404160', // portal v2 - ] - }, - { - name: 'mode', - tokens: [ - ADDRESSES.mode.WETH, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'rsk', - tokens: [ - ADDRESSES.rsk.rUSDT, - ADDRESSES.rsk.WRBTC1, - ], - holders: [ - '0x5aa5f7f84ed0e5db0a4a85c3947ea16b53352fd4', // portal v2 - ] - }, - { - name: 'blast', - tokens: [ - ADDRESSES.blast.WETH, - ], - holders: [ - '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4', // portal v2 - ] - }, - { - name: 'merlin', - tokens: [ - ADDRESSES.merlin.WBTC, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'ftn', - tokens: [ - ADDRESSES.ftn.USDC, - ], - holders: [ - '0x318C2B9a03C37702742C3d40C72e4056e430135A', // portal v2 - ] - }, - { - name: 'zklink', - tokens: [ - ADDRESSES.zklink.WETH, - TOKENS.zklink.pufETH, - ], - holders: [ - '0x8Dc71561414CDcA6DcA7C1dED1ABd04AF474D189', // portal v2 - ] - }, - { - name: 'core', - tokens: [ - ADDRESSES.core.coreBTC, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'taiko', - tokens: [ - ADDRESSES.taiko.WETH, - ], - holders: [ - '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4', // portal v2 - ] - }, - { - name: 'sei', - tokens: [ - ADDRESSES.sei.USDC, - ADDRESSES.sei.USDT, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, - { - name: 'zeta', - tokens: [ - TOKENS.zeta.pufETH, - ADDRESSES.zeta.USDC_1, - ], - holders: [ - '0x8a7F930003BedD63A1ebD99C5917FD6aE7E3dedf', // portal v2 - ] - }, - { - name: 'cronos', - tokens: [ - TOKENS.cronos.USDC, - ], - holders: [ - '0xE75C7E85FE6ADd07077467064aD15847E6ba9877', // portal v2 - ] - }, - { - name: 'fraxtal', - tokens: [ - TOKENS.fraxtal.WETH, - TOKENS.fraxtal.FRAX, - ], - holders: [ - '0x292fC50e4eB66C3f6514b9E402dBc25961824D62', // portal v2 - ] - }, + name: 'ethereum', + tokens: [ + '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC, + '0xd38BB40815d2B0c2d2c866e0c72c5728ffC76dd9', // SIS, + '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', // WETH, + '0xdAC17F958D2ee523a2206206994597C13D831ec7', // USDT, + '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', // WBTC, + '0x12970E6868f88f6557B76120662c1B3E50A646bf', // LADYS, + '0xD9A442856C234a39a81a089C06451EBAa4306a72', // pufETH, + '0x853d955aCEf822Db058eb8505911ED77F175b99e', // FRAX, + '0x9C7BEBa8F6eF6643aBd725e45a4E8387eF260649', // G, + '0x582d872A1B094FC48F5DE31D3B73F2D9bE47def1', // WTON + ], + holders: [ + '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8' // portal + ] + }, + { + name: 'bsc', + tokens: [ + '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d', // USDC, + '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56', // BUSD, + '0x2170Ed0880ac9A755fd29B2688956BD959F933F8', // ETH, + '0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c', // BTCB, + '0xF98b660AdF2ed7d9d9D9dAACC2fb0CAce4F21835', // SIS, + '0x9C7BEBa8F6eF6643aBd725e45a4E8387eF260649', // G, + '0x76A797A59Ba2C17726896976B7B3747BfD1d220f', // WTON + ], + holders: [ + '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4' // portal + ] + }, + { + name: 'avax', + tokens: [ + '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', // USDC, + '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664', // USDC.e + ], + holders: [ + '0xE75C7E85FE6ADd07077467064aD15847E6ba9877' // portal + ] + }, + { + name: 'polygon', + tokens: [ + '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', // USDC.e, + '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619', // WETH, + '0x45c32fA6DF82ead1e2EF74d17b76547EDdFaFF89', // FRAX + ], + holders: [ + '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8' // portal + ] + }, + { + name: 'telos', + tokens: [ + '0xe6E5f3d264117E030C21920356641DbD5B3d660c', // USDC, + '0x63d71E79AdF0886c989A23b04a0E86F1489b6BC3', // WETH, + '0x7bD3ffe9f0C9CF08FD60e102FEa455A6EA580276', // USDT + ], + holders: [ + '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8' // portal + ] + }, + { + name: 'kava', + tokens: [ + '0x919C1c267BC06a7039e03fcc2eF738525769109c', // USDt + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'boba', + tokens: [ + '0x66a2A913e447d6b4BF33EFbec43aAeF87890FBbc', // USDC + ], + holders: [ + '0xb8f275fBf7A959F4BCE59999A2EF122A099e81A8' // portal + ] + }, + { + name: 'era', + tokens: [ + '0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4', // USDC.e, + '0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4', // USDC, + '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91', // WETH, + '0xBBeB516fb02a01611cBBE0453Fe3c580D7281011', // WBTC, + '0xdd9f72afED3631a6C85b5369D84875e6c42f1827', // SIS, + '0xED0c95EBe5a3E687cB2224687024FeC6518E683e', // syBTC + ], + holders: [ + '0x4f5456d4d0764473DfCA1ffBB8524C151c4F19b9' // portal + ] + }, + { + name: 'arbitrum', + tokens: [ + '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', // USDC, + '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8', // USDC.e, + '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', // WETH, + '0x9E758B8a98a42d612b3D38B66a22074DC03D7370', // SIS, + '0x3b60FF35D3f7F62d636b067dD0dC0dFdAd670E4E', // LADYS, + '0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F', // FRAX, + '0x1A6B3A62391ECcaaa992ade44cd4AFe6bEC8CfF1', // UXLINK + ], + holders: [ + '0x01A3c8E513B758EBB011F7AFaf6C37616c9C24d9' // portal + ] + }, + { + name: 'optimism', + tokens: [ + '0x7F5c764cBc14f9669B88837ca1490cCa17c31607', // USDC.e, + '0x4200000000000000000000000000000000000006', // WETH + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'arbitrum_nova', + tokens: [ + '0x750ba8b76187092B0D1E87E28daaf484d1b5273b', // USDC, + '0x722E8BdD2ce80A4422E880164f2079488e115365', // WETH + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'polygon_zkevm', + tokens: [ + '0xA8CE8aee21bC2A48a5EF670afCc9274C7bbbC035', // USDC, + '0x37eAA0eF3549a5Bb7D431be78a3D99BD360d19e5', // USDC.e, + '0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9', // WETH + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'linea', + tokens: [ + '0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f', // WETH, + '0x176211869cA2b568f2A7D4EE941E073a821EE1ff', // USDC, + '0x6EF95B6f3b0F39508e3E04054Be96D5eE39eDE0d', // SIS + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'mantle', + tokens: [ + '0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9', // USDC, + '0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111', // WETH, + '0x1Bdd8878252DaddD3Af2ba30628813271294eDc0', // CATI + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'base', + tokens: [ + '0x4200000000000000000000000000000000000006', // WETH, + '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA', // USDbC, + '0x9C7BEBa8F6eF6643aBd725e45a4E8387eF260649', // G + ], + holders: [ + '0xEE981B2459331AD268cc63CE6167b446AF4161f8' // portal + ] + }, + { + name: 'tron', + tokens: [ + 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t', // USDT + ], + holders: [ + 'TVgY3ayqTGUoe7th84ZNL5peVfRNdLFDjf' // portal + ] + }, + { + name: 'scroll', + tokens: [ + '0x5300000000000000000000000000000000000004', // WETH, + '0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4', // USDC, + '0x1467b62A6AE5CdcB10A6a8173cfe187DD2C5a136', // SIS, + '0xc4d46E8402F476F269c379677C99F18E22Ea030e', // pufETH + ], + holders: [ + '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4' // portal + ] + }, + { + name: 'manta', + tokens: [ + '0x0Dc808adcE2099A9F62AA87D9670745AbA741746', // WETH, + '0xb73603C5d87fA094B7314C74ACE2e64D165016fb', // USDC, + '0xA53E005Cecd3D7C89A4AE814617cC14828b6527E', // pufETH + ], + holders: [ + '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4' // portal + ] + }, + { + name: 'metis', + tokens: [ + '0x420000000000000000000000000000000000000A', // WETH + ], + holders: [ + '0xd8db4fb1fEf63045A443202d506Bcf30ef404160' // portal + ] + }, + { + name: 'ftn', + tokens: [ + '0x4237e0A5b55233D5B6D6d1D9BF421723954130D8', // USDC, + '0xE5b3562A0fa9eC3e718C96FfE349e1280D2Be591', // WETH, + '0xDeF886C55a79830C47108eeb9c37e78a49684e41', // USDT + ], + holders: [ + '0x318C2B9a03C37702742C3d40C72e4056e430135A' // portal + ] + }, + { + name: 'mode', + tokens: [ + '0x4200000000000000000000000000000000000006', // WETH + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'rsk', + tokens: [ + '0xef213441A85dF4d7ACbDaE0Cf78004e1E486bB96', // rUSDT, + '0x542fDA317318eBF1d3DEAf76E0b632741A7e677d', // WRBTC + ], + holders: [ + '0x5aa5f7f84ed0e5db0a4a85c3947ea16b53352fd4' // portal + ] + }, + { + name: 'blast', + tokens: [ + '0x4300000000000000000000000000000000000004', // WETH + ], + holders: [ + '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4' // portal + ] + }, + { + name: 'merlin', + tokens: [ + '0xF6D226f9Dc15d9bB51182815b320D3fBE324e1bA', // WBTC + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'zklink', + tokens: [ + '0x8280a4e7D5B3B658ec4580d3Bc30f5e50454F169', // WETH, + '0x1B49eCf1A8323Db4abf48b2F5EFaA33F7DdAB3FC', // pufETH + ], + holders: [ + '0x8Dc71561414CDcA6DcA7C1dED1ABd04AF474D189' // portal + ] + }, + { + name: 'core', + tokens: [ + '0x8034aB88C3512246Bf7894f57C834DdDBd1De01F', // coreBTC + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'taiko', + tokens: [ + '0xA51894664A773981C6C112C43ce576f315d5b1B6', // WETH + ], + holders: [ + '0x5Aa5f7f84eD0E5db0a4a85C3947eA16B53352FD4' // portal + ] + }, + { + name: 'sei', + tokens: [ + '0x3894085Ef7Ff0f0aeDf52E2A2704928d1Ec074F1', // USDC, + '0xB75D0B03c06A926e488e2659DF1A861F860bD3d1', // USDT + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'zeta', + tokens: [ + '0x1e4bF3CaBD7707089138dD5a545B077413FA83Fc', // pufETH, + '0x0cbe0dF132a6c6B4a2974Fa1b7Fb953CF0Cc798a', // USDC.ETH + ], + holders: [ + '0x8a7F930003BedD63A1ebD99C5917FD6aE7E3dedf' // portal + ] + }, + { + name: 'cronos', + tokens: [ + '0xc21223249CA28397B4B6541dfFaEcC539BfF0c59', // USDC + ], + holders: [ + '0xE75C7E85FE6ADd07077467064aD15847E6ba9877' // portal + ] + }, + { + name: 'fraxtal', + tokens: [ + '0xA8a59D73388D0c4344a7b0Ba287ddb654227c38a', // WETH, + '0xFc00000000000000000000000000000000000001', // FRAX + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'gravity', + tokens: [ + '0xFbDa5F676cB37624f28265A144A48B0d6e87d3b6', // USDC.e, + '0xBB859E225ac8Fb6BE1C7e38D87b767e95Fef0EbD', // wG + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'bsquared', + tokens: [ + '0x4200000000000000000000000000000000000006', // WBTC + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'ton', + tokens: [ + 'EQD8AErK5HbmnftlHQuk8bXC_JuX1COLPeNIfMriw23gfO3I', // TON, + 'EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs', // USDT, + 'EQBh9XACT0B60U8Q48VnjyqCxzxpM4oA0c8rqKt4h70yk1V5', // UXLINK, + 'EQD-cvR0Nz6XAyRBvbhz-abTrRC6sI5tvHvvpeQraV9UAAD7', // CATI + ], + holders: [ + 'EQDpUHhVl5lJ6Y47DCd0TWdXB_kd-U-N6KyAELePNjfj15HT' // portal + ] + }, + { + name: 'cronos_zkevm', + tokens: [ + '0xaa5b845F8C9c047779bEDf64829601d8B264076c', // USDC + ], + holders: [ + '0x2E818E50b913457015E1277B43E469b63AC5D3d7' // portal + ] + }, + { + name: 'morph', + tokens: [ + '0xe34c91815d7fc18A9e2148bcD4241d0a5848b693', // USDC + ], + holders: [ + '0x292fC50e4eB66C3f6514b9E402dBc25961824D62' // portal + ] + }, + { + name: 'boba_bnb', + tokens: [ + '0x9f98f9f312d23d078061962837042b8918e6aff2', // USDC + ], + holders: [ + '0x6148FD6C649866596C3d8a971fC313E5eCE84882' // portal + ] + } ] } \ No newline at end of file diff --git a/projects/symbiosis-finance/index.js b/projects/symbiosis-finance/index.js index 6df91ba4bc..794479e66c 100644 --- a/projects/symbiosis-finance/index.js +++ b/projects/symbiosis-finance/index.js @@ -1,15 +1,28 @@ const config = require("./config"); const { sumTokensExport } = require('../helper/unwrapLPs') +const { sumTokensExport: sumTon } = require('../helper/chain/ton') module.exports = { - methodology: 'Counts the amount of stables locked in Symbiosis protocol contracts: Portals V1, NervePools V1, Portals V2, OmniPool V2', + methodology: 'Counts the amount of stables locked in Symbiosis protocol contracts: Portals V2', }; config.chains.forEach(chainInfo => { const {name: chain, tokens, holders} = chainInfo - module.exports[chain] = { - tvl: sumTokensExport({ chain, tokens, owners: holders }) + + if (chain === 'ton') { + module.exports[chain] = { + tvl: sumTon({ chain, tokens, owners: holders }) + } + } else { + module.exports[chain] = { + tvl: sumTokensExport({ chain, tokens, owners: holders }) + } } }) -module.exports.boba_avax.tvl = () => ({}) \ No newline at end of file +const deprecatedChains = ['aurora', 'boba_avax'] +deprecatedChains.forEach(chain => { + module.exports[chain] = { + tvl: () => ({}) + } +}) \ No newline at end of file diff --git a/projects/symbiotic/index.js b/projects/symbiotic/index.js index fbc2c2c316..6944033af2 100644 --- a/projects/symbiotic/index.js +++ b/projects/symbiotic/index.js @@ -8,7 +8,7 @@ async function tvl(api) { } module.exports = { - start: 1718088924, + start: '2024-06-11', ethereum: { tvl, }, diff --git a/projects/symmetric/index.js b/projects/symmetric/index.js index 126b17d6c3..dd34bfed56 100644 --- a/projects/symmetric/index.js +++ b/projects/symmetric/index.js @@ -1,5 +1,5 @@ const sdk = require('@defillama/sdk'); -const { v1Tvl, onChainTvl } = require('../helper/balancer') +const { v1Tvl, onChainTvl, balV2GraphExport } = require('../helper/balancer') module.exports = { celo: { @@ -19,5 +19,11 @@ module.exports = { }, meter: { tvl: onChainTvl('0x913f21E596790aFC6AA45229E9ff8b7d0A473D5A', 51825430), + }, + taiko: { + tvl: onChainTvl('0xbccc4b4c6530F82FE309c5E845E50b5E9C89f2AD', 371729), + }, + etlk: { + tvl: balV2GraphExport({ vault:'0xbccc4b4c6530F82FE309c5E845E50b5E9C89f2AD', graphURL: '4y4fC3k9DMrJ9XYY6Z1Qi8DXJkpRrQuQCjh7zBRhxjQr', name: 'symmetric-etlk'}) } } diff --git a/projects/symmetry-trade/index.js b/projects/symmetry-trade/index.js index 5979d08122..916c06b3b6 100644 --- a/projects/symmetry-trade/index.js +++ b/projects/symmetry-trade/index.js @@ -12,7 +12,6 @@ const TOKENS = [ module.exports = { methodology: 'counts the token deposited in market contract', - start: 923000, scroll: { tvl: sumTokensExport({ owner: MARKET_CONTRACT, tokens: TOKENS}), } diff --git a/projects/synapse/config.js b/projects/synapse/config.js index d0b9b8c941..382124df23 100644 --- a/projects/synapse/config.js +++ b/projects/synapse/config.js @@ -370,7 +370,7 @@ module.exports = { { pool: ADDRESSES.aurora.nUSD, tokens: [ - ADDRESSES.canto.NOTE, + '0x4e71a2e537b7f9d9413d3991d37958c0b5e1e503', // "0xd8836af2e565d3befce7d906af63ee45a57e8f80", // nUSD ] }, diff --git a/projects/synatra/index.js b/projects/synatra/index.js new file mode 100644 index 0000000000..8acc14204a --- /dev/null +++ b/projects/synatra/index.js @@ -0,0 +1,15 @@ +const { getTokenSupplies,} = require("../helper/solana"); + +const ySOL_MINT = 'yso11zxLbHA3wBJ9HAtVu6wnesqz9A2qxnhxanasZ4N'; +const yUSD_MINT = 'yUSDX7W89jXWn4zzDPLnhykDymSjQSmpaJ8e4fjC1fg'; +const TOKEN_MINTS = [ySOL_MINT, yUSD_MINT] + +async function tvl(api) { + await getTokenSupplies(TOKEN_MINTS, {api }) +} + +module.exports = { + doublecounted: true, + methodology: 'Tracks tvl via number of tokens currently minted for each pool.', + solana: { tvl, }, +} diff --git a/projects/syncswap/index.js b/projects/syncswap/index.js index b24b4c8d10..170dd73e6c 100644 --- a/projects/syncswap/index.js +++ b/projects/syncswap/index.js @@ -43,21 +43,27 @@ async function tvl(api) { const config = { era: { fromBlock: 9775, - stableFactorys: ['0x5b9f21d407F35b10CbfDDca17D5D84b129356ea3','0x81251524898774F5F2FCaE7E7ae86112Cb5C317f'], - classicFactorys: ['0xf2DAd89f2788a8CD54625C60b55cD3d2D0ACa7Cb','0x0a34FBDf37C246C0B401da5f00ABd6529d906193'], - aquaFactorys: ['0x20b28B1e4665FFf290650586ad76E977EAb90c5D','0xFfa499b019394d9bEB5e21FC54AD572E4942302b','0x0754870C1aAb00eDCFABDF4e6FEbDD30e90f327d'] + stableFactorys: ['0x5b9f21d407F35b10CbfDDca17D5D84b129356ea3', '0x81251524898774F5F2FCaE7E7ae86112Cb5C317f'], + classicFactorys: ['0xf2DAd89f2788a8CD54625C60b55cD3d2D0ACa7Cb', '0x0a34FBDf37C246C0B401da5f00ABd6529d906193'], + aquaFactorys: ['0x20b28B1e4665FFf290650586ad76E977EAb90c5D', '0xFfa499b019394d9bEB5e21FC54AD572E4942302b', '0x0754870C1aAb00eDCFABDF4e6FEbDD30e90f327d'] }, linea: { fromBlock: 716, - stableFactorys: ['0xE4CF807E351b56720B17A59094179e7Ed9dD3727','0x61Abf754fc031C544236053495a193f3518e9101','0x024A096bAb43587d24004C95C3e20FcB7518Ad86'], - classicFactorys: ['0x37BAc764494c8db4e54BDE72f6965beA9fa0AC2d','0x9573994Ae6C9b35627976d26FA89e507e71FBaA2','0xb8AbaEa25E42DA5ac6897C9DAb0a8157885fE32b'], - aquaFactorys: ['0x7a31060d8524c21496a352BE65549eEf1e864fb0','0x1080EE857D165186aF7F8d63e8ec510C28A6d1Ea'] + stableFactorys: ['0xE4CF807E351b56720B17A59094179e7Ed9dD3727', '0x61Abf754fc031C544236053495a193f3518e9101', '0x024A096bAb43587d24004C95C3e20FcB7518Ad86'], + classicFactorys: ['0x37BAc764494c8db4e54BDE72f6965beA9fa0AC2d', '0x9573994Ae6C9b35627976d26FA89e507e71FBaA2', '0xb8AbaEa25E42DA5ac6897C9DAb0a8157885fE32b'], + aquaFactorys: ['0x7a31060d8524c21496a352BE65549eEf1e864fb0', '0x1080EE857D165186aF7F8d63e8ec510C28A6d1Ea'] + }, + sophon: { + fromBlock: 38459, + stableFactorys: ["0x8c9d66ba3e1d7681cffffa3c7d9807adae368e74"], + classicFactorys: ["0x432bcc3bc62de9186f9e8763c82d43e418681e6c"], + aquaFactorys: ["0xa2e2f6b5db704fde654db69895c89523332e538e"], }, scroll: { fromBlock: 80875, - stableFactorys: ['0xE4CF807E351b56720B17A59094179e7Ed9dD3727','0x5BEBDA7E264b03bB963CB2418f40C5ffcefb7A9e','0xA2acA673C00495A184F88De533BBa8e1b7f38D00'], - classicFactorys: ['0x37BAc764494c8db4e54BDE72f6965beA9fa0AC2d','0xDAEdEcF3F1Caf8d9050A0C973B77E40bA8024F69','0x76f549af692efA64952d02c075226df9878Fb54C'], - aquaFactorys: ['0xa033eAbcCfd9b71543E34dec43935467A230Ce2d','0x87aeb51d606056F48D241C4072f55ACd9D937018'] + stableFactorys: ['0xE4CF807E351b56720B17A59094179e7Ed9dD3727', '0x5BEBDA7E264b03bB963CB2418f40C5ffcefb7A9e', '0xA2acA673C00495A184F88De533BBa8e1b7f38D00'], + classicFactorys: ['0x37BAc764494c8db4e54BDE72f6965beA9fa0AC2d', '0xDAEdEcF3F1Caf8d9050A0C973B77E40bA8024F69', '0x76f549af692efA64952d02c075226df9878Fb54C'], + aquaFactorys: ['0xa033eAbcCfd9b71543E34dec43935467A230Ce2d', '0x87aeb51d606056F48D241C4072f55ACd9D937018'] }, } diff --git a/projects/synstation/index.js b/projects/synstation/index.js new file mode 100644 index 0000000000..d7c9dac062 --- /dev/null +++ b/projects/synstation/index.js @@ -0,0 +1,20 @@ +const { sumUnknownTokens } = require("../helper/unknownTokens") + +const config = { + ethereum: "0x3BaC111A6F5ED6A554616373d5c7D858d7c10d88", + astar: "0xe9B85D6A1727d4B22595bab40018bf9B7407c677" +} + +Object.keys(config).forEach(chain => { + const prestakingAddress = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const data = await api.fetchList({ lengthAbi: 'uint256:poolLength', itemAbi: 'function poolInfo(uint256) view returns (address want, uint256 totalDeposited,uint256,uint256)', target: prestakingAddress, }) + + const tokens = data.map(i => i.want) + const bals = data.map(i => i.totalDeposited) + bals.forEach((v, i) => v && api.add(tokens[i], v)) + return sumUnknownTokens({ api, resolveLP: true, useDefaultCoreAssets: true, }) + } + } + }) \ No newline at end of file diff --git a/projects/synthetix-v3/index.js b/projects/synthetix-v3/index.js index 168346a3d0..c4a3d554ea 100644 --- a/projects/synthetix-v3/index.js +++ b/projects/synthetix-v3/index.js @@ -1,11 +1,22 @@ const { sumTokensExport } = require('../helper/unwrapLPs') const ADDRESSES = require('../helper/coreAssets.json') +const CUSTOM_ADDRESSES = { + arbitrum: { + WEETH: "0x35751007a407ca6FEFfE80b3cB397736D2cf4dbe", + sUSDe: ADDRESSES.arbitrum.sUSDe, + tBTC: "0x6c84a8f1c29108F47a79964b5Fe888D4f4D0dE40" + } +} + module.exports = { + ethereum: { + tvl: sumTokensExport({ owner: '0xffffffaEff0B96Ea8e4f94b2253f31abdD875847', tokens: [ADDRESSES.ethereum.SNX] }) + }, base: { tvl: sumTokensExport({ owner: '0x32C222A9A159782aFD7529c87FA34b96CA72C696', tokens: [ADDRESSES.base.USDC] }) }, arbitrum: { - tvl: sumTokensExport({ owner: '0xffffffaEff0B96Ea8e4f94b2253f31abdD875847', tokens: [ADDRESSES.arbitrum.USDC_CIRCLE, ADDRESSES.arbitrum.WETH, ADDRESSES.arbitrum.ARB, ADDRESSES.arbitrum.USDe] }) + tvl: sumTokensExport({ owner: '0xffffffaEff0B96Ea8e4f94b2253f31abdD875847', tokens: [ADDRESSES.arbitrum.USDC_CIRCLE, ADDRESSES.arbitrum.WETH, ADDRESSES.arbitrum.ARB, ADDRESSES.arbitrum.USDe, ADDRESSES.arbitrum.WSTETH, CUSTOM_ADDRESSES.arbitrum.WEETH, CUSTOM_ADDRESSES.arbitrum.sUSDe, CUSTOM_ADDRESSES.arbitrum.tBTC] }) } } diff --git a/projects/synthetix/api.js b/projects/synthetix/api.js index 1e5cc6072d..f242ddf26a 100644 --- a/projects/synthetix/api.js +++ b/projects/synthetix/api.js @@ -136,7 +136,7 @@ async function SNXHolders(snxGraphEndpoint, block, chain) { } module.exports = { - start: 1565287200, // Fri Aug 09 2019 00:00:00 + start: '2019-08-08', // Fri Aug 09 2019 00:00:00 optimism: { tvl: chainTvl("optimism") }, diff --git a/projects/synthetix/apiCache.js b/projects/synthetix/apiCache.js index 9280915254..7e0e2f728a 100644 --- a/projects/synthetix/apiCache.js +++ b/projects/synthetix/apiCache.js @@ -149,7 +149,7 @@ async function SNXHolders(snxGraphEndpoint, block, chain) { } module.exports = { - start: 1565287200, // Fri Aug 09 2019 00:00:00 + start: '2019-08-08', // Fri Aug 09 2019 00:00:00 optimism: { tvl: chainTvl("optimism") }, diff --git a/projects/synthex/index.js b/projects/synthex/index.js index 88364890f1..fc06264777 100644 --- a/projects/synthex/index.js +++ b/projects/synthex/index.js @@ -14,7 +14,6 @@ const DAI = ADDRESSES.optimism.DAI; module.exports = { methodology: "counts value of assets in the PoolC and PoolF", - start: 82762407, arbitrum: { tvl: sumTokensExport({ ownerTokens: [ diff --git a/projects/t-protocol-v2/index.js b/projects/t-protocol-v2/index.js index 864c3d6419..3916b2b061 100644 --- a/projects/t-protocol-v2/index.js +++ b/projects/t-protocol-v2/index.js @@ -8,7 +8,7 @@ const USTP = '0xed4d84225273c867d269f967cc696e0877068f8a' module.exports = { methodology: "counts value of assets in the Treasury", - start: 1677913260, + start: '2023-03-04', ethereum: { tvl, }, diff --git a/projects/t-protocol/index.js b/projects/t-protocol/index.js index dad6f75eea..14501bfd3f 100644 --- a/projects/t-protocol/index.js +++ b/projects/t-protocol/index.js @@ -7,7 +7,7 @@ const STBT = '0x530824DA86689C9C17CdC2871Ff29B058345b44a' module.exports = { methodology: "counts value of assets in the Treasury", - start: 1677913260, + start: '2023-03-04', ethereum: { tvl: sumTokensExport({ owner: TREASURY_CONTRACT, tokens: [USDC_TOKEN_CONTRACT, STBT] }), }, diff --git a/projects/tachyswap/index.js b/projects/tachyswap/index.js index 582afc546d..c6e7a20ea0 100644 --- a/projects/tachyswap/index.js +++ b/projects/tachyswap/index.js @@ -4,7 +4,6 @@ module.exports = { misrepresentedTokens: true, etlk: { tvl: getUniTVL({ - fetchBalances: true, useDefaultCoreAssets: true, factory: '0x033eff22bC5Bd30c597e1fdE8Ca6fB1C1274C688', }) diff --git a/projects/taco/index.js b/projects/taco/index.js index 79a2ccfdbf..b03c24affd 100644 --- a/projects/taco/index.js +++ b/projects/taco/index.js @@ -10,7 +10,8 @@ async function wax() { ["alien.worlds", "TLM", "alien-worlds"], ["usdt.alcor", "USDT", "alcor-ibc-bridged-usdt-wax"], ["wombattokens", "WOMBAT", "wombat"], - ["wuffi", "WUF", "wuffi"] + ["wuffi", "WUF", "wuffi"], + ["token.fusion", "LSWAX", "waxfusion-staked-wax"], ]; return await get_account_tvl(accounts, tokens, "wax"); } diff --git a/projects/taffy/index.js b/projects/taffy/index.js index 30cf64f9ab..bcdb9ee1b2 100644 --- a/projects/taffy/index.js +++ b/projects/taffy/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens'); -module.exports = uniTvlExport('saakuru', '0xb9FFd4f89A86a989069CAcaE90e9ce824D0c4971', { fetchBalances: true, }) \ No newline at end of file +module.exports = uniTvlExport('saakuru', '0xb9FFd4f89A86a989069CAcaE90e9ce824D0c4971') \ No newline at end of file diff --git a/projects/taidog/index.js b/projects/taidog/index.js index 8e56a5ad2d..2657a16651 100644 --- a/projects/taidog/index.js +++ b/projects/taidog/index.js @@ -7,7 +7,7 @@ const TAIDOG_STAKING_CONTRACT = "0x9b4484D5A2665930702d09f74086CAD86d96b25E"; const TAIDOG_WETH_LP = "0x28Be5f9caBd48B712a031a901590b71f5509526D"; const LP_STAKING_CONTRACT = "0xD664c3b22c60b4927ab1e0035b99F157bc2d8F1B"; -const TAIKO_TOKEN = "0xA9d23408b9bA935c230493c40C73824Df71A0975"; +const TAIKO_TOKEN = ADDRESSES.taiko.TAIKO; const TAIKO_STAKING_CONTRACT = "0x89a95021E45AcAB4B89eb20C18691E3E0D1d2170"; async function poolsTvl(api) { @@ -79,7 +79,6 @@ module.exports = { misrepresentedTokens: true, methodology: "TVL counts user deposits of assets like (ETH, USDC, TAIKO) into protocol, counts pool2 (lp tokens) in staking contract 0xD664c3b22c60b4927ab1e0035b99F157bc2d8F1B, and counts the number of TAIDOG tokens in the staking contract 0x9b4484D5A2665930702d09f74086CAD86d96b25E", - start: 84000, taiko: { tvl: sumTokensExport({ tokensAndOwners: [ diff --git a/projects/taikodrips/index.js b/projects/taikodrips/index.js new file mode 100644 index 0000000000..6a13030c3b --- /dev/null +++ b/projects/taikodrips/index.js @@ -0,0 +1,13 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { staking } = require("../helper/staking") + +const TaikoToken = ADDRESSES.taiko.TAIKO +const FarmingContract = '0xf90209C44dBf5Fa3d40ac85a008206b5A8c24899' + +module.exports = { + methodology: 'We count the TVL on the Taiko token in the farming contract.', + taiko: { + tvl: () => ({}), + staking: staking([FarmingContract], TaikoToken) + } +} diff --git a/projects/takoTako/index.js b/projects/takoTako/index.js new file mode 100644 index 0000000000..ffe978e343 --- /dev/null +++ b/projects/takoTako/index.js @@ -0,0 +1,14 @@ +const { aaveV2Export } = require("../helper/aave"); +const methodologies = require("../helper/methodologies"); + +const LPConfiguratorContract = "0xD07B62ee683267D4A884453eaE982A151653515E"; + +module.exports = { + taiko: { + ...aaveV2Export(LPConfiguratorContract, { + fromBlock: 381054, + }), + }, +}; + +module.exports.methodology = methodologies.lendingMarket; diff --git a/projects/tangible/index.js b/projects/tangible/index.js index bf48c1b3de..6faa980f3e 100644 --- a/projects/tangible/index.js +++ b/projects/tangible/index.js @@ -11,7 +11,6 @@ const realTvl = async (api) => { const basketManager = '0x5e581ce0472bF528E7F5FCB96138d7759AC2ac3f'.toLowerCase() // get all baskets in existance const baskets = await api.call({ abi: 'address[]:getBasketsArray', target: basketManager }) - console.log(baskets) const basketTVL = await api.multiCall({ abi: 'uint256:getTotalValueOfBasket', calls: baskets}) api.add(USTB, basketTVL) } diff --git a/projects/tapbit-cex/index.js b/projects/tapbit-cex/index.js new file mode 100644 index 0000000000..b0a2fb0e96 --- /dev/null +++ b/projects/tapbit-cex/index.js @@ -0,0 +1,13 @@ +const { cexExports } = require("../helper/cex"); +const bitcoinAddressBook = require("../helper/bitcoin-book/index.js"); + +const config = { + ethereum: { + owners: ["0x33b9b598fb490f17426da7b7d344ead1bc3915dd"], + }, + bitcoin: { + owners: bitcoinAddressBook.tapbit, + }, +}; + +module.exports = cexExports(config); diff --git a/projects/taraswap/index.js b/projects/taraswap/index.js new file mode 100644 index 0000000000..08675afca6 --- /dev/null +++ b/projects/taraswap/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3'); + +module.exports = uniV3Export({ + tara: { factory: '0x5EFAc029721023DD6859AFc8300d536a2d6d4c82', fromBlock: 10674828 }, +}) \ No newline at end of file diff --git a/projects/tashi/index.js b/projects/tashi/index.js index e08d509c35..b7dd8ec1e0 100644 --- a/projects/tashi/index.js +++ b/projects/tashi/index.js @@ -1,7 +1,6 @@ const { compoundExports } = require('../helper/compound') -const ADDRESSES = require('../helper/coreAssets.json') module.exports = { methodology: "Same as compound, we just get all the collateral (not borrowed money) on the lending markets", - evmos: compoundExports("0x053841Bd1D291380726a007eA834Ecd296923260", "evmos", "0x1cd248D72248A0618932F77093Dc4ceC9757759d", ADDRESSES.null, undefined, undefined, { fetchBalances: true, }) + evmos: compoundExports("0x053841Bd1D291380726a007eA834Ecd296923260", "0x1cd248D72248A0618932F77093Dc4ceC9757759d") } diff --git a/projects/tbtc/index.js b/projects/tbtc/index.js index fac1e605c8..a749ac298f 100644 --- a/projects/tbtc/index.js +++ b/projects/tbtc/index.js @@ -1,36 +1,13 @@ -const sdk = require('@defillama/sdk'); -const { sumTokensExport } = require('../helper/sumTokens'); +const { sumTokens } = require('../helper/chain/bitcoin') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') -const owners = [ -'bc1ql6yu2xywnmslnameu6376wzut4nwnafdj483ez', -'bc1q7uf083n9rsn8zgds0eg9kyzugjcz7pe4sq2jzf', -'bc1ql54ftzuh6k76wcn7330vlwxahhth8lqjc55lkc', -'bc1qhq052tz9pvjp4x2vu6ndc4rlpxesc9dz37uqt5', -'bc1q3rtrkav9l6m0e5vxya77mtlvqh8rk0eyf74277', -'bc1qde4ggwj2jp5tetjztfml3peyvwzvpwtr9ng6we', -'bc1qrzk68h8l2kvkvky00l8xvwz45pr4mmtyfpf0j8', -'bc1qkza8dm07rr5pxedam5w5v5g627j0lrwwzncsvd', -'bc1qrw5tn47ea05seyetlywltrdk06rldpk746etc9', -'bc1qcwkzqwfyqc7frec2g0rmjlrsw3d8vdwxrksn62', -'bc1qpdrzltkxg742jk8tr0pe7hltkme5p25ezmllz6', -'bc1qpqrm609emjpl35v2fu3frq0r87d29vm8ffygkf', -'bc1qhqlyelhwffrwdz4xzfe5whqxxft8quzvdscc8g', -'bc1qpaz0dp264pakv6f6ljmg2f3x27xmsj6la33mhc', -'bc1q9alywjvrsxu024a2m25lltl6h070l6lqfya45c', -'bc1q8cwt90ck2uvzwqj7q3dwvwclnprz7rk4qzk05k', -'bc1q2xygt58u9r6hc32uxruh93ap8q9898rep04xdk', -'bc1q4rheadle4sgdgdatkeuqfm90qv3wpkd7q8yp0m', -'bc1qrflqxl5pwet9tgv4uex6a6srmh3u4cvefeq0h6', -'bc1qqu0nw5n5n6uvjw5m3hwh8zvzckd8cnth8nt80k', -'bc1q3las75huex5jjhunheqycegw2x8fvhc6y0q3nu', -] +async function tvl() { + return sumTokens({ owners: await bitcoinAddressBook.tBTC() }) +} module.exports = { + timetravel: false, methodology: "BTC on btc chain", - ethereum: {tvl: () => ({}) }, - bitcoin: { - tvl: sdk.util.sumChainTvls([ - sumTokensExport({ owners }), - ]), - }, + ethereum: { tvl: () => ({}) }, + bitcoin: { tvl }, }; diff --git a/projects/tcv_platform/index.js b/projects/tcv_platform/index.js new file mode 100644 index 0000000000..73b6ac13c2 --- /dev/null +++ b/projects/tcv_platform/index.js @@ -0,0 +1,18 @@ + + +const { sumTokens2 } = require('../helper/unwrapLPs'); + +async function tvl(api) { + const tcvFactory = "0xCa2396933E02Fb7636126a914aE5f5512ab31077"; + const index = await api.call({ target: tcvFactory, abi: 'uint256:numVaults', }); + const vaults = await api.call({ target: tcvFactory, abi: 'function vaults(uint256,uint256) returns (address[])', params: ["0", String(index)], }); + await sumTokens2({ api, resolveUniV3: true, owners: vaults }) +} + +module.exports = { + methodology: "Calculates total liquidity from all NFT ranges in the given pools.", + start: '2024-06-01', + arbitrum: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/teleswap/index.js b/projects/teleswap/index.js new file mode 100644 index 0000000000..f4d272436a --- /dev/null +++ b/projects/teleswap/index.js @@ -0,0 +1,34 @@ +const sdk = require('@defillama/sdk'); +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require('../helper/sumTokens.js'); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') +const { sumTokensExport: sumBRC20TokensExport } = require('../helper/chain/brc20.js'); + +const TST = "0x0828096494ad6252F0F853abFC5b6ec9dfe9fDAd"; +const TST_DELEGATION = "0x93AD6C8B3a273E0B4aeeBd6CF03422C885217D3B"; + + +module.exports = { + methodology: 'TVL is the sum of all BTC locked by users, collateral locked by Lockers, and TST delegated to Lockers.', + bitcoin: { + tvl: sdk.util.sumChainTvls([ + sumTokensExport({ owners: bitcoinAddressBook.teleswap }), + sumBRC20TokensExport({ owners: bitcoinAddressBook.teleswap }), + ]) + }, + ethereum: { staking: sumTokensExport({ owners: [TST_DELEGATION], tokens: [TST] }) }, +} + +const config = { + polygon: { owners: ['0xf5D6D369A7F4147F720AEAdd4C4f903aE8046166'], tokens: [ADDRESSES.null] }, + bsc: { owners: ['0x84F74e97ebab432CeE185d601290cE0A483987A5'], tokens: [ADDRESSES.null] }, + bsquared: { owners: ['0x20752a82fe75996a582Ae2be1b7C3D4866C5b733'], tokens: [ADDRESSES.bsquared.WBTC] }, + bob: { owners: ['0xd720996f0D8fFD9154c8271D2991f54E5d93D2A9'], tokens: [ADDRESSES.bob.WBTC] }, +} + +Object.keys(config).forEach(chain => { + const { owners, tokens, } = config[chain] + module.exports[chain] = { + tvl: sumTokensExport({ owners, tokens }) + } +}) \ No newline at end of file diff --git a/projects/tempest-finance/chains.js b/projects/tempest-finance/chains.js new file mode 100644 index 0000000000..4d9f171e4d --- /dev/null +++ b/projects/tempest-finance/chains.js @@ -0,0 +1,11 @@ +module.exports = { + ethereum: 1, + optimism: 10, + bsc: 56, + manta: 169, + canto: 7700, + base: 8453, + arbitrum: 42161, + scroll: 534352, + swellchain: 1923, +} \ No newline at end of file diff --git a/projects/tempest-finance/index.js b/projects/tempest-finance/index.js new file mode 100644 index 0000000000..330e8fb5c7 --- /dev/null +++ b/projects/tempest-finance/index.js @@ -0,0 +1,20 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); +const chains = require("./chains"); +const axios = require("axios"); + +async function tvl(api) { + const response = await axios.get(`https://protocol-service-api.tempestfinance.xyz/api/v1/vaults?chainId=${chains[api.chain]}`) + const vaults = response.data.data.vaults; + + const tokens = vaults.map(vault => vault.mainAsset); + const balances = await api.multiCall({ abi: 'uint256:totalAssets', calls: vaults.map(vault => vault.address) }); + + api.addTokens(tokens, balances) + return sumTokens2({ api }) +} + +Object.keys(chains).forEach(chain => { + module.exports[chain] = { + tvl + } +}) diff --git a/projects/tempest/index.js b/projects/tempest/index.js index a3b893ead3..29480fcbfd 100644 --- a/projects/tempest/index.js +++ b/projects/tempest/index.js @@ -10,3 +10,7 @@ module.exports = { cether: '0x6283829589A6A02981B425fd2e86D22F012191aC', }) }; + +module.exports.deadFrom='2023-09-08', +module.exports.optimism.borrowed = () => ({}) // bad debt +module.exports.base.borrowed = () => ({}) // bad debt diff --git a/projects/tender-finance/index.js b/projects/tender-finance/index.js index bc9ca25784..d14494d520 100644 --- a/projects/tender-finance/index.js +++ b/projects/tender-finance/index.js @@ -3,8 +3,8 @@ const { compoundExports } = require("../helper/compound"); module.exports = { hallmarks: [ - [1678190400,"Oracle Exploit"] + [1678190400, "Oracle Exploit"] ], methodology: "Same as compound, we just get all the collateral (not borrowed money) on the lending markets.", - arbitrum: compoundExports('0xeed247Ba513A8D6f78BE9318399f5eD1a4808F8e', 'arbitrum', '0x0706905b2b21574DEFcF00B5fc48068995FCdCdf', ADDRESSES.arbitrum.WETH) + arbitrum: compoundExports('0xeed247Ba513A8D6f78BE9318399f5eD1a4808F8e', '0x0706905b2b21574DEFcF00B5fc48068995FCdCdf', ADDRESSES.arbitrum.WETH) }; diff --git a/projects/terraswap/factoryTvl.js b/projects/terraswap/factoryTvl.js index 06c8723aaf..a038c565b7 100644 --- a/projects/terraswap/factoryTvl.js +++ b/projects/terraswap/factoryTvl.js @@ -36,23 +36,33 @@ async function getAllPairs(factory, chain, { blacklistedPairs = [] } = {}) { const [addr, balance] = getAssetInfo(asset) pairDto.assets.push({ addr, balance }) }) + pairDto.pair_type = pair.pair_type dtos.push(pairDto) }) - const {errors} = await PromisePool + const { errors } = await PromisePool .withConcurrency(10) .for(allPairs) .process(getPairPool) - if((errors?.length ?? 0) > 50){ + if ((errors?.length ?? 0) > 50) { throw new Error(`Too many errors: ${errors.length}/${allPairs.length} on ${chain}`) } return dtos } -function getFactoryTvl(factory, { blacklistedPairs = []} = {}) { +const isNotXYK = (pair) => pair.pair_type && pair.pair_type.custom === 'concentrated' + +function getFactoryTvl(factory, { blacklistedPairs = [] } = {}) { return async (api) => { const pairs = (await getAllPairs(factory, api.chain, { blacklistedPairs })).filter(pair => (pair.assets[0].balance && pair.assets[1].balance)) - const data = pairs.map(({ assets }) => ({ + const otherPairs = pairs.filter(isNotXYK) + const xykPairs = pairs.filter(pair => !isNotXYK(pair)) + otherPairs.forEach(({ assets }) => { + api.add(assets[0].addr, assets[0].balance) + api.add(assets[1].addr, assets[1].balance) + }) + + const data = xykPairs.map(({ assets }) => ({ token0: assets[0].addr, token0Bal: assets[0].balance, token1: assets[1].addr, diff --git a/projects/tetu/index.js b/projects/tetu/index.js index 950ba99fb8..17cc363f81 100644 --- a/projects/tetu/index.js +++ b/projects/tetu/index.js @@ -17,7 +17,7 @@ const EXCLUDED_VAULTS = { } module.exports = { - start: 1628024400, //Tue Aug 03 2021 21:00:00 GMT+0000 + start: '2021-08-03', //Tue Aug 03 2021 21:00:00 GMT+0000 misrepresentedTokens: true, }; diff --git a/projects/thUSD/index.js b/projects/thUSD/index.js index 368dc65b0c..ca9b1759d5 100644 --- a/projects/thUSD/index.js +++ b/projects/thUSD/index.js @@ -2,7 +2,7 @@ const sdk = require('@defillama/sdk') const { getLiquityTvl } = require("../helper/liquity") const { sumTokensExport, nullAddress } = require("../helper/unwrapLPs") const tBTCTvl = getLiquityTvl('0xf5e4ffeb7d2183b61753aa4074d72e51873c1d0a', { nonNativeCollateralToken: true, abis: { collateralToken: 'address:collateralAddress' } }) -const ethTvl = sumTokensExport({ owner: '0x1f490764473eb1013461D6079F827DB95d8B4DC5', tokens: [nullAddress]}) +const ethTvl = sumTokensExport({ owners: ['0x1f490764473eb1013461D6079F827DB95d8B4DC5', '0xE922B5591Da479a559b25261BD6Dc8f89cA1A29d'], tokens: [nullAddress]}) module.exports = { ethereum: { diff --git a/projects/thala-lsd/index.js b/projects/thala-lsd/index.js index 5685d9aa7c..122d11eab8 100644 --- a/projects/thala-lsd/index.js +++ b/projects/thala-lsd/index.js @@ -13,7 +13,6 @@ module.exports = { const { data: { supply } } = await aQuery(`/v1/accounts/${LSD_ACCOUNT}/resource/0x1::coin::CoinInfo%3C${LSD_ACCOUNT}::staking::ThalaAPT%3E`); const [active, inactive, pending_active, pending_inactive] = await function_view({ functionStr: `0x1::delegation_pool::get_delegation_pool_stake`, - type_arguments: [], args: [THALA_VALIDATOR] }); const validator_apt = Number(active) + Number(inactive) + Number(pending_active) + Number(pending_inactive); diff --git a/projects/thala-vethl/index.js b/projects/thala-vethl/index.js index d00714ddb5..1d24a5f418 100644 --- a/projects/thala-vethl/index.js +++ b/projects/thala-vethl/index.js @@ -2,19 +2,19 @@ const utils = require("../helper/utils"); const sdk = require("@defillama/sdk"); const { transformBalances } = require("../helper/portedTokens"); -const THALA_API = "https://app.thala.fi/api"; +const THALA_API_VETHL = "https://app.thala.fi/api/vethl-tvl"; const thlAddress = "0x7fd500c11216f0fe3095d0c4b8aa4d64a4e2e04f83758462f2b127255643615::thl_coin::THL"; const thlDecimals = 8; module.exports = { - timetravel: true, - start: 1692598825, + timetravel: false, + start: '2023-08-21', methodology: `TVL data is pulled from the Thala's API "https://app.thala.fi/api/vethl-tvl".`, aptos: { tvl: () => ({}), - staking: async ({ timestamp }) => { - const response = await utils.fetchURL(`${THALA_API}/vethl-tvl?timestamp=${ timestamp }`); + staking: async () => { + const response = await utils.fetchURL(THALA_API_VETHL); const thlAmount = response.data.data * 10**thlDecimals; const balances = {}; @@ -24,4 +24,3 @@ module.exports = { }, }, }; - diff --git a/projects/thalaswap-v2/index.js b/projects/thalaswap-v2/index.js new file mode 100644 index 0000000000..bb57d69b96 --- /dev/null +++ b/projects/thalaswap-v2/index.js @@ -0,0 +1,24 @@ +const { function_view } = require("../helper/chain/aptos"); + +const thalaswapLensAddress = "ff1ac437457a839f7d07212d789b85dd77b3df00f59613fcba02388464bfcacb"; + +async function getPools(lensAddress) { + return function_view({ functionStr: `${lensAddress}::lens::get_all_pools_info`}) +} + +module.exports = { + timetravel: false, + methodology: + "Aggregates TVL in all pools in Thalaswap, Thala Labs' AMM.", + aptos: { + tvl: async (api) => { + const poolInfos = await getPools(thalaswapLensAddress) + + for (const poolInfo of poolInfos) { + const assets = poolInfo.assets_metadata.map(asset => asset.inner) + const balances = poolInfo.balances + api.add(assets, balances) + } + }, + }, +}; \ No newline at end of file diff --git a/projects/thales/abi.json b/projects/thales/abi.json index fff29c16a5..f6307863a3 100644 --- a/projects/thales/abi.json +++ b/projects/thales/abi.json @@ -3,5 +3,6 @@ "totalDeposited": "uint256:totalDeposited", "tradingAllocation": "uint256:tradingAllocation", "getUnderlyingBalance": "function getUnderlyingBalances() view returns (uint256 amount0Current, uint256 amount1Current)", - "activeParlayMarkets": "function activeParlayMarkets(uint index, uint pageSize) external view returns (address[] memory)" + "activeParlayMarkets": "function activeParlayMarkets(uint index, uint pageSize) external view returns (address[] memory)", + "getActiveTickets": "function getActiveTickets(uint _index, uint _pageSize) external view returns (address[] memory)" } diff --git a/projects/thales/addresses.js b/projects/thales/addresses.js new file mode 100644 index 0000000000..db1148e4be --- /dev/null +++ b/projects/thales/addresses.js @@ -0,0 +1,25 @@ +const ADDRESSES = require('../helper/coreAssets.json') + +const CHAIN_TOKENS = { + optimism: { + USDC: ADDRESSES.optimism.USDC_CIRCLE, + ETH: ADDRESSES.optimism.WETH_1, + WETH: ADDRESSES.optimism.WETH, + THALES: '0x217d47011b23bb961eb6d93ca9945b7501a5bb11' + }, + arbitrum: { + USDC: ADDRESSES.arbitrum.USDC, + WETH: ADDRESSES.arbitrum.WETH, + THALES: '0xE85B662Fe97e8562f4099d8A1d5A92D4B453bF30' + }, + polygon: { + USDC: ADDRESSES.polygon.USDC + }, + base: { + USDC: ADDRESSES.base.USDbC, + WETH: ADDRESSES.base.WETH, + THALES: '0xf34e0cff046e154cafcae502c7541b9e5fd8c249' + } +} + +module.exports = CHAIN_TOKENS diff --git a/projects/thales/chainConfig.js b/projects/thales/chainConfig.js new file mode 100644 index 0000000000..8a0ce49bd6 --- /dev/null +++ b/projects/thales/chainConfig.js @@ -0,0 +1,63 @@ +const CHAIN_TOKENS = require('./addresses') +const CONTRACTS = require('./constants') + +const CHAIN_CONFIG = { + optimism: { + tokens: CHAIN_TOKENS.optimism, + staking: { + contract: CONTRACTS.optimism.STAKING_CONTRACT, + token: CHAIN_TOKENS.optimism.THALES + }, + speedMarkets: CONTRACTS.optimism.SPEED_MARKETS, + managers: CONTRACTS.optimism.MANAGERS, + liquidityPools: { + sports: [ + { address: CONTRACTS.optimism.SPORTS_POOLS.USDC, token: 'USDC' }, + { address: CONTRACTS.optimism.SPORTS_POOLS.WETH, token: 'WETH' }, + { address: CONTRACTS.optimism.SPORTS_POOLS.THALES, token: 'THALES' } + ], + digitalOptions: [ + { address: CONTRACTS.optimism.DIGITAL_POOLS.USDC, token: 'USDC' } + ] + } + }, + arbitrum: { + tokens: CHAIN_TOKENS.arbitrum, + staking: { + contract: CONTRACTS.arbitrum.STAKING_CONTRACT, + token: CHAIN_TOKENS.arbitrum.THALES + }, + speedMarkets: CONTRACTS.arbitrum.SPEED_MARKETS, + managers: CONTRACTS.arbitrum.MANAGERS, + liquidityPools: { + sports: [ + { address: CONTRACTS.arbitrum.SPORTS_POOLS.USDC, token: 'USDC' }, + { address: CONTRACTS.arbitrum.SPORTS_POOLS.WETH, token: 'WETH' }, + { address: CONTRACTS.arbitrum.SPORTS_POOLS.THALES, token: 'THALES' } + ], + digitalOptions: [ + { address: CONTRACTS.arbitrum.DIGITAL_POOLS.USDC, token: 'USDC' } + ] + } + }, + polygon: { + tokens: CHAIN_TOKENS.polygon, + speedMarkets: CONTRACTS.polygon.SPEED_MARKETS + }, + base: { + tokens: CHAIN_TOKENS.base, + staking: { + contract: CONTRACTS.base.STAKING_CONTRACT, + token: CHAIN_TOKENS.base.THALES + }, + speedMarkets: CONTRACTS.base.SPEED_MARKETS, + managers: CONTRACTS.base.MANAGERS, + liquidityPools: { + digitalOptions: [ + { address: CONTRACTS.base.DIGITAL_POOLS.USDC, token: 'USDC' } + ] + } + } +} + +module.exports = CHAIN_CONFIG diff --git a/projects/thales/constants.js b/projects/thales/constants.js new file mode 100644 index 0000000000..adba7771b8 --- /dev/null +++ b/projects/thales/constants.js @@ -0,0 +1,66 @@ +const CONTRACTS = { + optimism: { + LP_TOKEN: '0xdff90e4a6c229565f25337b1db9fa12f6d8cb118', + STAKING_CONTRACT: '0xc392133eea695603b51a5d5de73655d571c2ce51', + SPEED_MARKETS: [ + '0xE16B8a01490835EC1e76bAbbB3Cadd8921b32001', + '0xFf8Cf5ABF583D0979C0B9c35d62dd1fD52cce7C7' + ], + MANAGERS: { + digital: ['0x7f9e03e40d8b95419C7BdF30D256d08f2Ec11Dba'], + sports: ['0x2367FB44C4C2c4E5aAC62d78A55876E01F251605'] + }, + SPORTS_POOLS: { + USDC: '0x0fe1044Fc8C05482102Db14368fE88791E9B8698', + WETH: '0x4f2822D4e60af7f9F70E7e45BC1941fe3461231e', + THALES: '0xE59206b08cC96Da0818522C75eE3Fd4EBB7c0A47' + }, + DIGITAL_POOLS: { + USDC: '0x47Da40be6B617d0199ADF1Ec3550f3875b246124' + } + }, + arbitrum: { + LP_TOKEN: '0x447f7bbfb5192ed5d6f815afb171f3f004ee94ac', + STAKING_CONTRACT: '0x160Ca569999601bca06109D42d561D85D6Bb4b57', + SPEED_MARKETS: [ + '0x02D0123a89Ae6ef27419d5EBb158d1ED4Cf24FA3', + '0xe92B4c614b04c239d30c31A7ea1290AdDCb8217D' + ], + MANAGERS: { + digital: ['0x95d93c88c1b5190fA7FA4350844e0663e5a11fF0'], + sports: ['0xB155685132eEd3cD848d220e25a9607DD8871D38'] + }, + SPORTS_POOLS: { + USDC: '0x22D180F39A0eB66098cf839AF5e3C6b009383B6A', + WETH: '0xcB4728a1789B87E05c813B68DBc5E6A98a4856bA', + THALES: '0x9733AB157f5A89f0AD7460d08F869956aE2018dA' + }, + DIGITAL_POOLS: { + USDC: '0xea4c2343Fd3C239c23Dd37dd3ee51AEc84544735' + } + }, + polygon: { + SPEED_MARKETS: [ + '0x4B1aED25f1877E1E9fBECBd77EeE95BB1679c361', + '0x14D2d7f64D6F10f8eF06372c2e5E36850661a537' + ] + }, + base: { + LP_TOKEN: '0x3f386acc3a8e9194cf6279c219df8dd3c5b71974', + STAKING_CONTRACT: '0x84aB38e42D8Da33b480762cCa543eEcA6135E040', + SPEED_MARKETS: [ + '0x85b827d133FEDC36B844b20f4a198dA583B25BAA', + '0x6848F001ddDb4442d352C495c7B4a231e3889b70' + ], + MANAGERS: { + digital: ['0xc62E56E756a3D14ffF838e820F38d845a16D49dE'], + sports: [] + }, + DIGITAL_POOLS: { + USDC: '0x5713ab44042D92C642444bd2F0fee9c2336F9E3b' + } + } + } + + module.exports = CONTRACTS + \ No newline at end of file diff --git a/projects/thales/index.js b/projects/thales/index.js index 83f6abf46c..20c1f843fb 100644 --- a/projects/thales/index.js +++ b/projects/thales/index.js @@ -1,131 +1,32 @@ -const { sumTokens2 } = require('../helper/unwrapLPs') const { staking } = require('../helper/staking') -const abi = require('./abi.json') -const { dodoPool2 } = require('../helper/pool2') -const ADDRESSES = require('../helper/coreAssets.json') - -const ethMarketsManager = "0x5ed98Ebb66A929758C7Fe5Ac60c979aDF0F4040a" - -const opMarketsManager = "0xBE086E0A2c588Ad64C8530048cE4356190D6a6F3" -const OP_SUSD = ADDRESSES.optimism.sUSD -const opThalesStaking = "0xc392133eea695603b51a5d5de73655d571c2ce51" -const opThalesAmm = "0x278b5a44397c9d8e52743fedec263c4760dc1a1a" -const opRangedAmm = "0x2d356b114cbCA8DEFf2d8783EAc2a5A5324fE1dF" -const opParlayAmm = "0x82B3634C0518507D5d817bE6dAb6233ebE4D68D9" -const opSportsLp = "0x842e89b7a7eF8Ce099540b3613264C933cE0eBa5" -const opSportsVault = ["0x43d19841d818b2ccc63a8b44ce8c7def8616d98e", "0x5e2b49c68f1fd68af1354c377eacec2f05632d3f", "0x8285047f33c26c1bf5b387f2b07f21a2af29ace2", "0xbaac5464bf6e767c9af0e8d4677c01be2065fd5f", "0xc922f4CDe42dD658A7D3EA852caF7Eae47F6cEcd"] -const opAmmVault = ["0xb484027CB0c538538Bad2bE492714154f9196F93", "0x6c7Fd4321183b542E81Bcc7dE4DfB88F9DBca29F", "0x43318DE9E8f65b591598F17aDD87ae7247649C83"] -const opThalesLpToken = "0xac6705BC7f6a35eb194bdB89066049D6f1B0B1b5"; -const opThalesToken = "0x217d47011b23bb961eb6d93ca9945b7501a5bb11" -const opSportsMarketsManager = "0xFBffEbfA2bF2cF84fdCf77917b358fC59Ff5771e" - -const polygonMarketsManager = "0x85f1B57A1D3Ac7605de3Df8AdA056b3dB9676eCE" -const polygon_USDC = ADDRESSES.polygon.USDC -const polygonThalesAmm = "0xd52B865584c25FEBfcB676B9A87F32683356A063" -const polygonRangedAMM = "0xe8e022405505a9F2b0B7452C844F1e64423849fC" - -const arbitrumMarketsManager = "0x95d93c88c1b5190fA7FA4350844e0663e5a11fF0" -const arbitrum_USDC = ADDRESSES.arbitrum.USDC -const arbThalesStaking = "0x160Ca569999601bca06109D42d561D85D6Bb4b57" -const arbitrumThalesAMM = "0x2b89275efB9509c33d9AD92A4586bdf8c4d21505" -const arbSportsMarketsManager = "0x72ca0765d4bE0529377d656c9645600606214610" -const arbParlayAmm = "0x2Bb7D689780e7a34dD365359bD7333ab24903268" -const arbSportsLp = "0x8e9018b48456202aA9bb3E485192B8475822B874" -const arbSportsVault = ["0xfF7AEA98740fA1e2a9eB81680583e62aaFf1e3Ad", "0xE26374c7aFe71a2a6AB4A61080772547C43B87E6", "0xA852a651377fbE23f3d3acF5919c3D092aD4b77d", "0x31c2947c86412A5e33794105aA034DD9312eb711"] -const arbAmmVault = ["0x640c34D9595AD5351Da8c5C833Bbd1AfD20519ea", "0x0A29CddbdAAf56342507574820864dAc967D2683", "0x008A4e30A8b41781F5cb017b197aA9Aa4Cd53b46"] -const arbThalesToken = "0xE85B662Fe97e8562f4099d8A1d5A92D4B453bF30" - - -const baseMarketManager = "0xc62E56E756a3D14ffF838e820F38d845a16D49dE" -const baseSportsMarketManager = "0xB0EE5C967F209f24f7eF30c2C6Da38346a87E089" -const baseParlayAMM = "0x5625c3233b52206a5f23c5fC1Ce16F6A7e3874dd" -const baseSportsAMM = "0xAFD339acf24813e8038bfdF19A8d87Eb94B4605d" -const baseRangedAMM = "0xB8109ac56EE572990e6d2C6b4648042bB1C33317" -const baseThalesAMM = "0xe41cD3A25CBdeDA0BC46D48C380393D953bD2034" - - -const bscMarketManager = "0xc62E56E756a3D14ffF838e820F38d845a16D49dE" -const bscRangedAMM = "0xda5Bd4aBAFbE249bdC5684eAD594B0ac379687fd" -const bscThalesAMM = "0x465B66A3e33088F0666dB1836652fBcF037c7319" - -async function guniPool2(api) { - const [lp, token0, token1] = await api.batchCall([ - { target: opThalesLpToken, abi: abi.getUnderlyingBalance, }, - { target: opThalesLpToken, abi: 'address:token0', }, - { target: opThalesLpToken, abi: 'address:token1', }, - ]) - api.add(token0, lp[0]) - api.add(token1, lp[1]) -} - -async function getMarkets(api, manager) { - return api.call({ target: manager, abi: abi.activeMarkets, params: [0, 1000] }) -} - -async function addSportsLPTvl(api, contract, token) { - api.add(token, await api.call({ target: contract, abi: abi.totalDeposited, })) -} - -const speedMarkets = { - arbitrum: ['0x02D0123a89Ae6ef27419d5EBb158d1ED4Cf24FA3'], - polygon: ['0x4B1aED25f1877E1E9fBECBd77EeE95BB1679c361'], - optimism: ['0xE16B8a01490835EC1e76bAbbB3Cadd8921b32001'], - base: ['0x85b827d133FEDC36B844b20f4a198dA583B25BAA'], - bsc: ['0x72ca0765d4bE0529377d656c9645600606214610'], +const CHAIN_CONFIG = require('./chainConfig') +const helpers = require('./utils') + +// Create module for each chain +const createChainModule = (chain) => { + const config = CHAIN_CONFIG[chain] + const module = { + tvl: (api) => helpers.calculateChainTVL(api, chain) + } + + // Add staking if configured + if (config.staking) { + module.staking = staking( + config.staking.contract, + config.staking.token + ) + } + + return module } +// Export configuration for each chain module.exports = { - methodology: "sUSD/USDC locked on markets", - ethereum: { - tvl: async (api) => { - return sumTokens2({ api, owners: await getMarkets(api, ethMarketsManager), tokens: [ADDRESSES.ethereum.sUSD] }) - }, - pool2: dodoPool2("0x136829c258e31b3ab1975fe7d03d3870c3311651", "0x031816fd297228e4fd537c1789d51509247d0b43"), - }, - polygon: { - tvl: async (api) => { - const markets = await getMarkets(api, polygonMarketsManager) - markets.push(polygonThalesAmm, polygonRangedAMM) - if (speedMarkets[api.chain]) markets.push(...speedMarkets[api.chain]) - return sumTokens2({ api, owners: markets, tokens: [polygon_USDC] }) - }, - }, - optimism: { - tvl: async (api) => { - await addSportsLPTvl(api, opSportsLp, OP_SUSD) - const markets = (await Promise.all([opMarketsManager, opSportsMarketsManager,].map(i => getMarkets(api, i)))).flat() - markets.push(opThalesAmm, opParlayAmm, opRangedAmm, ...opSportsVault, ...opAmmVault) - if (speedMarkets[api.chain]) markets.push(...speedMarkets[api.chain]) - return sumTokens2({ api, tokens: [OP_SUSD], owners: markets }) - }, - staking: staking(opThalesStaking, opThalesToken), - pool2: guniPool2, - }, - arbitrum: { - tvl: async (api) => { - await addSportsLPTvl(api, arbSportsLp, arbitrum_USDC) - const markets = (await Promise.all([arbitrumMarketsManager, arbSportsMarketsManager,].map(i => getMarkets(api, i)))).flat() - markets.push(arbitrumThalesAMM, arbParlayAmm, ...arbSportsVault, ...arbAmmVault) - if (speedMarkets[api.chain]) markets.push(...speedMarkets[api.chain]) - return sumTokens2({ api, tokens: [arbitrum_USDC], owners: markets }) - }, - staking: staking(arbThalesStaking, arbThalesToken), - }, - base: { - tvl: async (api) => { - const markets = (await Promise.all([baseMarketManager, baseSportsMarketManager,].map(i => getMarkets(api, i)))).flat() - markets.push(baseParlayAMM, baseRangedAMM, baseSportsAMM, baseThalesAMM) - if (speedMarkets[api.chain]) markets.push(...speedMarkets[api.chain]) - return sumTokens2({ api, tokens: [ADDRESSES.base.USDbC], owners: markets }) - }, - staking: staking('0x84aB38e42D8Da33b480762cCa543eEcA6135E040', '0xf34e0cff046e154cafcae502c7541b9e5fd8c249'), - }, - bsc: { - tvl: async (api) => { - const markets = (await Promise.all([bscMarketManager,].map(i => getMarkets(api, i)))).flat() - markets.push( bscRangedAMM, bscThalesAMM) - if (speedMarkets[api.chain]) markets.push(...speedMarkets[api.chain]) - return sumTokens2({ api, tokens: [ADDRESSES.bsc.BUSD], owners: markets }) - }, - }, + methodology: "Calculate TVL for liquidity pools, markets, staking and pool2", + optimism: createChainModule('optimism'), + arbitrum: createChainModule('arbitrum'), + polygon: createChainModule('polygon'), + base: createChainModule('base'), + ethereum: {tvl: async ()=>({})}, + bsc: {tvl: async ()=>({})}, } diff --git a/projects/thales/utils.js b/projects/thales/utils.js new file mode 100644 index 0000000000..86f2d6b6e6 --- /dev/null +++ b/projects/thales/utils.js @@ -0,0 +1,70 @@ +const { sumTokens2 } = require('../helper/unwrapLPs') +const abi = require('./abi.json') +const CHAIN_CONFIG = require('./chainConfig') + +const utils = { + // Get token address from chain config + getTokenAddress: (chain, symbol) => CHAIN_CONFIG[chain].tokens[symbol], + + // Add LP TVL + addLPTvl: async (api, contract, token) => { + const tokenAddress = utils.getTokenAddress(api.chain, token) + api.add(tokenAddress, await api.call({ + target: contract, + abi: abi.totalDeposited + })) + }, + + // Get markets from manager + getMarketsFromManager: async (api, manager, abiMethod) => { + return api.call({ + target: manager, + abi: abi[abiMethod], + params: [0, 1000] + }) + }, + + // Get all markets for a chain + getAllMarkets: async (api, chain) => { + const config = CHAIN_CONFIG[chain] + if (!config.managers) return [] + + const [digitalMarkets, sportsMarkets] = await Promise.all([ + Promise.all((config.managers.digital || []).map(manager => + utils.getMarketsFromManager(api, manager, 'activeMarkets') + )), + Promise.all((config.managers.sports || []).map(manager => + utils.getMarketsFromManager(api, manager, 'getActiveTickets') + )) + ]) + + return [...digitalMarkets.flat(), ...sportsMarkets.flat()] + }, + + // Calculate chain TVL + calculateChainTVL: async (api, chain) => { + const config = CHAIN_CONFIG[chain] + + // Add LP TVLs + for (const poolType in config.liquidityPools || {}) { + for (const pool of config.liquidityPools[poolType]) { + await utils.addLPTvl(api, pool.address, pool.token) + } + } + + // Get all markets + const markets = [ + ...await utils.getAllMarkets(api, chain), + ...(config.speedMarkets || []) + ] + + // Calculate TVL for all markets and tokens + return sumTokens2({ + api, + owners: markets, + tokens: Object.values(config.tokens) + }) + } +} + +module.exports = utils diff --git a/projects/theo-network/index.js b/projects/theo-network/index.js new file mode 100644 index 0000000000..a02ebfb8e6 --- /dev/null +++ b/projects/theo-network/index.js @@ -0,0 +1,20 @@ +const { getConfig } = require('../helper/cache') + +const config = { + ethereum: {}, + arbitrum: {}, + base: {}, +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + const { [chain]: data } = await getConfig('theo-network', "https://vaults.theo.xyz/vaults/vaultInfo"); + + const calls = Object.values(data).map(i => i.contract) + const tokens = Object.values(data).map(i => i.asset) + const bals = await api.multiCall({ abi: 'uint256:totalBalance', calls }) + api.add(tokens, bals) + } + } +}) \ No newline at end of file diff --git a/projects/thetanuts/index.js b/projects/thetanuts/index.js index bff48b0012..c1b96ac200 100644 --- a/projects/thetanuts/index.js +++ b/projects/thetanuts/index.js @@ -168,7 +168,7 @@ let boba = ADDRESSES.boba.BOBA const bobaUSDC = ADDRESSES.boba.USDC // cronos assets -const wcro = '0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23' +const wcro = ADDRESSES.cronos.WCRO_1 // Arbitrum assets const arb = ADDRESSES.arbitrum.ARB diff --git a/projects/thetis-market/index.js b/projects/thetis-market/index.js new file mode 100644 index 0000000000..800362e625 --- /dev/null +++ b/projects/thetis-market/index.js @@ -0,0 +1,57 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { getResource } = require("../helper/chain/aptos"); + +const POOL_TRADING_ACCOUNT = + "0x0c727553dd5019c4887581f0a89dca9c8ea400116d70e9da7164897812c6646e"; + +const APT_USDt_POOL = + "0x604440935157ff96d6e436220c708c410e1e1978bbefd6d714b70b1e5f1f11"; +const zWBTC_USDt_POOL = + "0x1166d5635ef8fd10e1aa2cb005c4a3fad91f3b452e35019d8ce90fa7634aeb"; +const zWETH_USDt_POOL = + "0x6366d76a364e565877e22f22807323ce630e3512eedf96570ae44312e4116565"; + +const Pools = [ + { + poolAddress: APT_USDt_POOL, + longToken: ADDRESSES.aptos.APT, + shortToken: ADDRESSES.aptos.USDt, + }, + { + poolAddress: zWBTC_USDt_POOL, + longToken: ADDRESSES.aptos.zWBTC, + shortToken: ADDRESSES.aptos.USDt, + }, + { + poolAddress: zWETH_USDt_POOL, + longToken: ADDRESSES.aptos.zWETH, + shortToken: ADDRESSES.aptos.USDt, + }, +]; + +async function tvl(api) { + const poolConfigs = await Promise.all([ + getResource(Pools[0].poolAddress, `${POOL_TRADING_ACCOUNT}::pool::Pool`), + getResource(Pools[1].poolAddress, `${POOL_TRADING_ACCOUNT}::pool::Pool`), + getResource(Pools[2].poolAddress, `${POOL_TRADING_ACCOUNT}::pool::Pool`), + ]); + const mergeArray = poolConfigs.map((p, i) => { + return { ...p, ...Pools[i] }; + }); + const tvlShortToken = mergeArray.map( + (p) => + Number(p.short_asset.pool_amount) + Number(p.short_asset.reserve_amount) + ); + api.add(ADDRESSES.aptos.APT, Number(mergeArray[0].long_asset.pool_amount)); + api.add(ADDRESSES.aptos.zWBTC, Number(mergeArray[1].long_asset.pool_amount)); + api.add(ADDRESSES.aptos.zWETH, Number(mergeArray[2].long_asset.pool_amount)); + api.add( + ADDRESSES.aptos.USDt, + tvlShortToken.reduce((acc, curr) => acc + curr, 0) + ); +} + +module.exports = { + timetravel: false, + aptos: { tvl }, +}; diff --git a/projects/tholgar/index.js b/projects/tholgar/index.js index e79f638b01..01cebefd2a 100644 --- a/projects/tholgar/index.js +++ b/projects/tholgar/index.js @@ -60,5 +60,4 @@ module.exports = { ethereum: { tvl: ethTvl, }, - start: 17368026 }; diff --git a/projects/thorn-protocol/index.js b/projects/thorn-protocol/index.js new file mode 100644 index 0000000000..fb2544c228 --- /dev/null +++ b/projects/thorn-protocol/index.js @@ -0,0 +1,18 @@ +const { sumTokens2 } = require('../helper/unwrapLPs') + +async function tvl(api) { + let target = "0x888099De8EA8068D92bB04b47A743B82195c4aD2" + const pairs = await api.fetchList({ lengthAbi: 'pairLength', itemAbi: 'swapPairContract', target }) + const res = await api.fetchList({ lengthAbi: 'N_COINS', itemAbi: 'coins', targets: pairs, groupedByInput: true, }) + const ownerTokens = res.map((tokens, i) => [tokens, pairs[i]]) + return sumTokens2({ api, ownerTokens, permitFailure: true, }) +} + +module.exports = { + methodology: + "Uses factory(0x888099De8EA8068D92bB04b47A743B82195c4aD2) address and whitelisted tokens address to find and price Liquidity Pool pairs", + start: '2024-10-17', + sapphire: { + tvl, + }, +}; diff --git a/projects/thriveonmars/index.js b/projects/thriveonmars/index.js new file mode 100644 index 0000000000..aec445e302 --- /dev/null +++ b/projects/thriveonmars/index.js @@ -0,0 +1,18 @@ +const { get_account_tvl } = require("../helper/chain/eos"); + +// Thrive On Mars +// https://thriveonmars.com +async function wax() { + const accounts = ["play.mars"]; + const tokens = [ + ["eosio.token", "WAX", "wax"] + ]; + return await get_account_tvl(accounts, tokens, "wax"); +} + +module.exports = { + methodology: `Thrive On Mars TVL is achieved by querying token balances from NFT gaming contracts`, + wax: { + tvl: wax + }, +} \ No newline at end of file diff --git a/projects/tidalfinance/abi.json b/projects/tidalfinance/abi.json deleted file mode 100644 index 2689ba630e..0000000000 --- a/projects/tidalfinance/abi.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "getAssetLength": "uint256:getAssetLength", - "assetBalance": "function assetBalance(uint16) view returns (uint256)" -} \ No newline at end of file diff --git a/projects/tidalfinance/index.js b/projects/tidalfinance/index.js index a84081065a..2a8b03890e 100644 --- a/projects/tidalfinance/index.js +++ b/projects/tidalfinance/index.js @@ -1,69 +1,19 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); +const { staking } = require('../helper/staking'); -// Contracts -const assetManager = "0xA2b6eC586F989cf1C055B7C9D16fDdA80FDD679b"; const sellerContract = "0xc73C6C3e80C28dBc55F65bBdC895E828bb98C72d"; const stakingContract = "0x21edB57A75ee69BCe0Fe3D0EfC5674bcF1D5BF93"; -// Tokens -const USDC = ADDRESSES.polygon.USDC; const TIDAL = "0xB41EC2c036f8a42DA384DDE6ADA79884F8b84b26"; -/*** Staking of native token (TIDAL) TVL portion ***/ -const staking = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - const transformAddress = i => `polygon:${i}`; - - await sumTokensAndLPsSharedOwners( - balances, - [[TIDAL, false]], - [stakingContract], - chainBlocks["polygon"], - "polygon", - transformAddress - ); - - return balances; -}; - -/*** Polygon TVL Portions ***/ -const polygonTvl = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - const lengthOfAssets = ( - await sdk.api.abi.call({ - abi: abi.getAssetLength, - target: assetManager, - chain: "polygon", - block: chainBlocks["polygon"], - }) - ).output; - - for (let i = 0; i < lengthOfAssets; i++) { - const BalanceOfAsset = ( - await sdk.api.abi.call({ - abi: abi.assetBalance, - target: sellerContract, - params: i, - chain: "polygon", - block: chainBlocks["polygon"], - }) - ).output; - - sdk.util.sumSingleBalance(balances, `polygon:${USDC}`, BalanceOfAsset); - } - - return balances; +const polygonTvl = async (api) => { + return api.sumTokens({ owner: sellerContract, tokens: [ADDRESSES.polygon.USDC] }) }; module.exports = { - misrepresentedTokens: true, polygon: { - staking, + staking: staking(stakingContract, TIDAL,), tvl: polygonTvl, }, methodology: diff --git a/projects/timewarp/index.js b/projects/timewarp/index.js index 33eafdae0c..53857f026a 100644 --- a/projects/timewarp/index.js +++ b/projects/timewarp/index.js @@ -1,102 +1,22 @@ -const sdk = require("@defillama/sdk"); -const abi = require("./abi.json"); +const { staking } = require('../helper/staking') +const { pool2 } = require('../helper/pool2') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); - -const TimeWarpPool_LP_UNISWAP_ETH = - "0x55c825983783c984890bA89F7d7C9575814D83F2"; -const TimeWarpPool_LP_PANCAKE_BSC = - "0xC48467BA55cF0B777978F19701329c87949EFD3C"; +const TimeWarpPool_LP_UNISWAP_ETH = "0x55c825983783c984890bA89F7d7C9575814D83F2"; +const TimeWarpPool_LP_PANCAKE_BSC = "0xC48467BA55cF0B777978F19701329c87949EFD3C"; const TimeWarpPool_TIME_ETH = "0xa106dd3Bc6C42B3f28616FfAB615c7d494Eb629D"; const TimeWarpPool_TIME_BSC = "0x59f2757Ae3a1BAa21e4f397a28985Ceb431c676b"; -const calcTvl = async (balances, chain, block, TimeWarpPool) => { - const erc20TokenOrLp = ( - await sdk.api.abi.call({ - abi: abi.erc20Deposit, - target: TimeWarpPool, - chain, - block, - }) - ).output; - - const transformAddress = i => `bsc:${i}`; - - await sumTokensAndLPsSharedOwners( - balances, - TimeWarpPool == TimeWarpPool_TIME_ETH || - TimeWarpPool == TimeWarpPool_TIME_BSC - ? [[erc20TokenOrLp, false]] - : [[erc20TokenOrLp, true]], - [TimeWarpPool], - block, - chain, - chain == "bsc" ? transformAddress : (addr) => addr - ); -}; - -/*** Staking of native token (TIME) on Ethereum and Binance TVL portion ***/ -const stakingETH = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - // --- Staking of native token TIME on Ethereum --- - await calcTvl( - balances, - "ethereum", - chainBlocks["ethereum"], - TimeWarpPool_TIME_ETH - ); - - return balances; -}; - -const stakingBSC = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - // --- Staking of native token TIME on Binance --- - await calcTvl(balances, "bsc", chainBlocks["bsc"], TimeWarpPool_TIME_BSC); - - return balances; -}; - -/*** Ethereum TVL Portion ***/ -const ethTvl = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - await calcTvl( - balances, - "ethereum", - chainBlocks["ethereum"], - TimeWarpPool_LP_UNISWAP_ETH - ); - - return balances; -}; - -/*** Binance TVL Portion ***/ -const bscTvl = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - - await calcTvl( - balances, - "bsc", - chainBlocks["bsc"], - TimeWarpPool_LP_PANCAKE_BSC - ); - - return balances; -}; - module.exports = { - misrepresentedTokens: true, ethereum: { - tvl: ethTvl, - staking: stakingETH + tvl: () => ({}), + pool2: pool2(TimeWarpPool_LP_UNISWAP_ETH, '0x1d474d4B4A62b0Ad0C819841eB2C74d1c5050524'), + staking: staking(TimeWarpPool_TIME_ETH, '0x485d17A6f1B8780392d53D64751824253011A260'), }, bsc: { - tvl: bscTvl, - staking: stakingBSC + tvl: () => ({}), + pool2: pool2(TimeWarpPool_LP_PANCAKE_BSC, '0xa5ebD19961CF4B8aF06a9d9D2B91d73B48744867'), + staking: staking(TimeWarpPool_TIME_BSC, '0x3b198e26E473b8faB2085b37978e36c9DE5D7f68'), }, methodology: `We count as TVL the staking Lps on Ethereum (TIME-ETH Sushiswap LP) and Binance (TIME-BNB Pancake LP) networks threw their TimeWarpPool contracts; and diff --git a/projects/tivel-finance/index.js b/projects/tivel-finance/index.js index 42e2ab819d..c1135bca9c 100644 --- a/projects/tivel-finance/index.js +++ b/projects/tivel-finance/index.js @@ -1,5 +1,5 @@ const config = { - era: '0x846FcA826196B3D674fd1691Bb785F3E4216bc0F', + era: '0xf7c504346b27F6073F7182e61f870531Fca1c09d', scroll: '0x30e44f48c9542533cB0b6b7dA39F6d42F26D843f', } diff --git a/projects/tlx/index.js b/projects/tlx/index.js index c66b889291..b092c4e06e 100644 --- a/projects/tlx/index.js +++ b/projects/tlx/index.js @@ -41,7 +41,7 @@ async function tvl(api) { } module.exports = { - start: 1712731500, + start: '2024-04-10', methodology: "Total TLX locked in the genesis locker contract and total TLX staked in the staking contract. TVL is computed as the total margin deposited across the protocol's leveraged tokens.", optimism: { diff --git a/projects/tokemak/index.js b/projects/tokemak/index.js index 6f52e0e1ea..3d516c5547 100644 --- a/projects/tokemak/index.js +++ b/projects/tokemak/index.js @@ -1,5 +1,4 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk') const { sumTokens2, } = require('../helper/unwrapLPs') const abi = require("../pendle/abi.json"); const positions = require('./positions.json'); @@ -15,6 +14,30 @@ const cvx_abi = { stkcvxFRAXBP_lockedStakesOf: "function lockedStakesOf(address account) view returns (tuple(bytes32 kek_id, uint256 start_timestamp, uint256 liquidity, uint256 ending_timestamp, uint256 lock_multiplier)[])", } +const AUTOPILOT_SYSTEM_REGISTRIES_BY_CHAIN = { + 1: '0x2218F90A98b0C070676f249EF44834686dAa4285', + 8453: '0x18Dc926095A7A007C01Ef836683Fdef4c4371b4e' +} + +const autopilotContracts = { + systemRegistry: { + abi: { + autoPoolRegistry: "function autoPoolRegistry() view returns (address)" + } + }, + autoPoolRegistry: { + abi: { + listVaults: "function listVaults() view returns (address[] memory)" + } + }, + autopool: { + abi: { + totalAssets: "function totalAssets() view returns (uint256)", + asset: "function asset() view returns (address)" + } + } +} + const degenesisContract = "0xc803737D3E12CC4034Dde0B2457684322100Ac38"; const wethPool = "0xD3D13a578a53685B4ac36A1Bab31912D2B2A2F36"; const usdcPool = "0x04bda0cf6ad025948af830e75228ed420b0e860d"; @@ -31,9 +54,9 @@ const fxs = ADDRESSES.ethereum.FXS; const tcrPool = "0x15A629f0665A3Eb97D7aE9A7ce7ABF73AeB79415"; const tcr = "0x9C4A4204B79dd291D6b6571C5BE8BbcD0622F050"; const toke = ADDRESSES.ethereum.TOKE; -const rtoke1 = "0xa760e26aA76747020171fCF8BdA108dFdE8Eb930"; -const rtoke2 = "0x96f98ed74639689c3a11daf38ef86e59f43417d3"; -const rtoke3 = "0xA374A62DdBd21e3d5716cB04821CB710897c0972"; +const tTokeReactor = "0xa760e26aA76747020171fCF8BdA108dFdE8Eb930"; +const stakingVestingV1 = "0x96f98ed74639689c3a11daf38ef86e59f43417d3"; +const accTokeV1 = "0xA374A62DdBd21e3d5716cB04821CB710897c0972"; const sushiPool = "0xf49764c9C5d644ece6aE2d18Ffd9F1E902629777"; const sushi = ADDRESSES.ethereum.SUSHI; const fraxPool = "0x94671A3ceE8C7A12Ea72602978D1Bb84E920eFB2"; @@ -110,7 +133,6 @@ async function tvl(api) { [cvxFRAXPool, tokeManager], [cvxalUSDPool, tokeManager], ] - const balances = {} // cvxcrvFRAX const cvxFraxUsdcPool = "0x7e880867363A7e321f5d260Cade2B0Bb2F717B02"; @@ -133,9 +155,9 @@ async function tvl(api) { target: cvxcvxFxsPool, params: [tokeTreasury], }); - sdk.util.sumSingleBalance(balances, cvxcrvFrax, cvxcrvFraxBal) - sdk.util.sumSingleBalance(balances, cvxcrvFrax, treasuryFraxBal[0]['liquidity']) - sdk.util.sumSingleBalance(balances, cvxcvxFxs, cvxcvxFxsBal) + api.add(cvxcrvFrax, cvxcrvFraxBal) + api.add(cvxcrvFrax, treasuryFraxBal[0]['liquidity']) + api.add(cvxcvxFxs, cvxcvxFxsBal) let curveHoldings = positions.exchanges.filter( pool => pool.type == 'Curve') @@ -147,10 +169,24 @@ async function tvl(api) { lpBalances(curveHoldings, toa, tokens, calls,) lpBalances(uniHoldings, toa, tokens, calls) const amountRes = await api.multiCall({ abi: abi.userInfo, calls }) - tokens.forEach((val, i) => sdk.util.sumSingleBalance(balances, val, amountRes[i].amount, api.chain)) + tokens.forEach((val, i) => api.add(val, amountRes[i].amount)) + await populateAutopilotDetails(1, api); + + return sumTokens2({ api, tokensAndOwners: toa, }) +} + +async function populateAutopilotDetails(chainId, api) { + // Get the instance of the Autopool Registry from the System Registry + const autopoolRegistry = await api.call({ abi: autopilotContracts.systemRegistry.abi.autoPoolRegistry, target: AUTOPILOT_SYSTEM_REGISTRIES_BY_CHAIN[chainId], }); + // Use the Autopool Registry to get all the Autopools in the system + const autopools = await api.call({ abi: autopilotContracts.autoPoolRegistry.abi.listVaults, target: autopoolRegistry, }); + await api.erc4626Sum2({ calls: autopools}) +} - return sumTokens2({ balances, api, tokensAndOwners: toa, }) +async function baseTvl(api) { + await populateAutopilotDetails(8453, api); + return sumTokens2({ api }) } function lpBalances(holdings, toa, tokens, calls) { @@ -175,11 +211,11 @@ function lpBalances(holdings, toa, tokens, calls) { } async function staking(api) { - let vestedToke = '57238445' + let vestedToke = '1438444' api.add(ADDRESSES.ethereum.TOKE, vestedToke * 1e18 * -1) return sumTokens2({ api, tokensAndOwners: [ - [toke, rtoke1], [toke, rtoke2], [toke, rtoke3] + [toke, tTokeReactor], [toke, stakingVestingV1], [toke, accTokeV1] ] }) } @@ -198,5 +234,8 @@ module.exports = { tvl, pool2, staking + }, + base: { + tvl: baseTvl } } diff --git a/projects/tomofinance.js b/projects/tomofinance.js index 21ed2dd93f..76c5c65a8a 100644 --- a/projects/tomofinance.js +++ b/projects/tomofinance.js @@ -1,21 +1,6 @@ -const sdk = require('@defillama/sdk'); - -async function taiSupply(timestamp, ethBlock, {tomochain: block}) { - const taiContract = '0x4d04315e6BABD038d15ea0E240A88B292d2Add41'; - - const supply = (await sdk.api.erc20.totalSupply({ - target: taiContract, - block: block, - chain: 'tomochain', - decimals: 18 - })).output; - - return { 'usd-coin': supply }; -} - module.exports = { - misrepresentedTokens: true, - tomochain: { - tvl: taiSupply - } -}; + tomochain: { + tvl: () => ({}), + }, + deadFrom: '2021-05-22' +} diff --git a/projects/tonco/index.js b/projects/tonco/index.js new file mode 100644 index 0000000000..6e5a974fed --- /dev/null +++ b/projects/tonco/index.js @@ -0,0 +1,12 @@ +const { sumTokensExport } = require("../helper/chain/ton"); +const ADDRESSES = require('../helper/coreAssets.json') + +const router = "EQC_-t0nCnOFMdp7E7qPxAOCbCWGFz-e3pwxb6tTvFmshjt5" +const wtTOn = "EQCHHakhWxSQIWbw6ioW21YnjVKBCDd_gVjF9Mz9_dIuFy23" + +module.exports = { + timetravel: true, + ton: { + tvl: sumTokensExport({ owners: [router, wtTOn], tokens: [ADDRESSES.null], }), + } +} diff --git a/projects/tonpools/index.js b/projects/tonpools/index.js new file mode 100644 index 0000000000..3faff2f7ad --- /dev/null +++ b/projects/tonpools/index.js @@ -0,0 +1,21 @@ +const { call } = require('../helper/chain/ton') +const { sumTokens } = require("../helper/chain/ton"); +const ADDRESSES = require("../helper/coreAssets.json"); + +const tonpoolsContractAddress = "EQA7y9QkiP4xtX_BhOpY4xgVlLM7LPcYUA4QhBHhFZeL4fTa"; + +const tonpoolUSDTContractAddress = "EQDrSz9W4tjwnqy1F4z-O4Vkdp8g2YP94cmh12X5RbYpejCw"; + +async function tvl(api) { + const result = await call({ target: tonpoolUSDTContractAddress, abi: 'poolBalances' }) + api.add(ADDRESSES.ton.USDT, result[1]) + await sumTokens({ api, owners: [tonpoolsContractAddress], tokens: [ADDRESSES.null], }) +} + +module.exports = { + methodology: "Ton Pools's TVL includes all deposited supported assets", + ton: { + tvl, + }, +}; + diff --git a/projects/tonpump/index.js b/projects/tonpump/index.js new file mode 100644 index 0000000000..8737155ce9 --- /dev/null +++ b/projects/tonpump/index.js @@ -0,0 +1,15 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokens } = require("../helper/chain/ton"); +const { getConfig } = require("../helper/cache"); + +async function fetchTvl(api,) { + const res = await getConfig('tonpump', 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=hot') + await sumTokens({ api, tokens: [ADDRESSES.ton.TON], owners: res, onlyWhitelistedTokens: true, }) +} + +module.exports = { + timetravel: false, + ton: { + tvl: fetchTvl + } +} diff --git a/projects/tonstakers-token-staking/index.js b/projects/tonstakers-token-staking/index.js new file mode 100644 index 0000000000..69ffac6702 --- /dev/null +++ b/projects/tonstakers-token-staking/index.js @@ -0,0 +1,79 @@ +const { call, getTokenRates } = require("../helper/chain/ton"); +const { sleep } = require("../helper/utils"); + +const farms = [ + { + contract: "EQBh2Asg4Opnlgmkw25gpZ7IcmyNPJceLh_51o0lOGwGjvuc", + name: "GEMSTON", + token: "0:57e8af5a5d59779d720d0b23cf2fce82e0e355990f2f2b7eb4bba772905297a4", + launch: 1721817124, + decimals: 9, + }, + { + contract: "EQDjQOGq_bx9pdjQJhQRK9Lux-YOUwDu1UNM8SevvbG25dEq", + name: "$PUNK", + token: "0:9da73e90849b43b66dacf7e92b576ca0978e4fc25f8a249095d7e5eb3fe5eebb", + launch: 1722433134, + decimals: 9, + }, + { + contract: "EQA0R317P10bopg5YGnI4B9_cJc0jPbVwnLZu3JuMWdyNgly", + name: "XROCK", + token: "0:157c463688a4a91245218052c5580807792cf6347d9757e32f0ee88a179a6549", + launch: 1722515467, + decimals: 9, + }, + { + contract: "EQA5BgnWFYQuKjDMgmqsYRTA1S3qjrF1MvmjG-BDEA19j0I9", + name: "JetTon", + token: "0:105e5589bc66db15f13c177a12f2cf3b94881da2f4b8e7922c58569176625eb5", + launch: 1722940520, + decimals: 9, + }, + { + contract: "EQDw7u6CwkbIfzhfdxITAy09yqvAk59hyCdxbdQCR67ilyn-", + name: "durev", + token: "0:74d8327471d503e2240345b06fe1a606de1b5e3c70512b5b46791b429dab5eb1", + launch: 1723474591, + decimals: 9, + }, + { + contract: "EQDMMSQsmGocIRUMxXL4MamEGasiANnV6GpKstApK45lVGwc", + name: "$WEB3", + token: "0:6d70be0903e3dd3e252407cbad1dca9d69fb665124ea74bf19d4479778f2ed8b", + launch: 1723732987, + decimals: 3, + }, +]; + +const retrieveFarmTVL = async (farmContract) => { + const result = await call({ + target: farmContract, + abi: "get_farming_minter_data", + }); + return result[3]; +}; + +const getFullTVl = async (api) => { + const tokens = farms.map((farm) => farm.token); + + const prices = await getTokenRates({ tokens }); + + for (const farm of farms) { + const balanceRaw = await retrieveFarmTVL(farm.contract); + await sleep(1000); + + const decimalPow = Math.pow(10, farm.decimals); + const balance = balanceRaw / decimalPow; + api.addUSDValue(balance * (prices[farm.token] || 0)); + } +}; + +module.exports = { + timetravel: false, + misrepresentedTokens: true, + ton: { + tvl: () => ({}), + staking: getFullTVl, + }, +}; diff --git a/projects/tonyielding/index.js b/projects/tonyielding/index.js new file mode 100644 index 0000000000..640619f605 --- /dev/null +++ b/projects/tonyielding/index.js @@ -0,0 +1,10 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokens } = require("../helper/chain/ton"); +const TONYIELDING = 'EQAN0yTLUz7gGuM41LniwcdoKKLPYV0BCDPSxTSoqrlRSTAR'; + +module.exports = { + methodology: 'Counts the number of TON in the Tonyielding contract.', + ton: { + tvl: (api) => sumTokens({ api, owners: [TONYIELDING], tokens: [ADDRESSES.null] }), + } +}; diff --git a/projects/toobit/index.js b/projects/toobit/index.js index 99344e2d86..ec14f44970 100644 --- a/projects/toobit/index.js +++ b/projects/toobit/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const config = { ethereum: { @@ -7,9 +8,7 @@ const config = { ], }, bitcoin: { - owners: [ - '3926KKKCqcLaWpAau73TMo19sNv23s1wji' - ] + owners: bitcoinAddressBook.toobit }, bsc: { owners: [ diff --git a/projects/torch/index.js b/projects/torch/index.js new file mode 100644 index 0000000000..37c7e5e307 --- /dev/null +++ b/projects/torch/index.js @@ -0,0 +1,34 @@ +const ADDRESSES = require("../helper/coreAssets.json") +const { sumTokens } = require('../helper/chain/ton') +const { get } = require("../helper/http") + +const DEX = 'EQCaEOMOR2SRcXTVSolw--rY62ghCoCRjn4Is3bBdnqYwIVZ' +const YIELD_ROUTER = 'EQDYU6gxBxFT3arWR-N9RFTfqAoQKyWk4JMgTBNOM2KL18Dw' + +async function tvl(api) { + const tokenTvl = await get('https://yield-api.torch.finance/tvl') + + const tvl = tokenTvl.reduce((acc, data) => { + acc += Number(data.tvl) / 1e9 + return acc + }, 0) + + await sumTokens({ + api, + owners: [DEX, YIELD_ROUTER], + tokens: [ADDRESSES.ton.TON], + }); + + api.add(ADDRESSES.ton.USDT, tvl * 1e6) +} + +module.exports = { + timetravel: false, + methodology: `The TVL calculation for Torch includes both the general jettons + balance and LP jettons balance. The price of general jettons is obtained via tonApi, + while the price of LP jettons is calculated using on-chain data (reserve0, reserve1, + and total LP supply). The LP jettons price calculation is handled on the Torch API side.`.trim(), + ton: { + tvl: tvl + }, +} \ No newline at end of file diff --git a/projects/torches/index.js b/projects/torches/index.js index 96b4757da5..8de85bc134 100644 --- a/projects/torches/index.js +++ b/projects/torches/index.js @@ -1,6 +1,5 @@ -const { compoundExports } = require("../helper/compound"); +const { compoundExports2 } = require("../helper/compound"); -const checkForLPTokens = i => /-LP/.test(i) module.exports = { - kcc: compoundExports("0xfbAFd34A4644DC4f7c5b2Ae150279162Eb2B0dF6", "kcc", undefined, undefined, undefined, checkForLPTokens) + kcc: compoundExports2({ comptroller: '0xfbAFd34A4644DC4f7c5b2Ae150279162Eb2B0dF6'}) } \ No newline at end of file diff --git a/projects/toreus/index.js b/projects/toreus/index.js index 9050af084a..4ac52c64fa 100644 --- a/projects/toreus/index.js +++ b/projects/toreus/index.js @@ -6,8 +6,11 @@ const TOREUS = "0x8549724fcC84ee9ee6c7A676F1Ba2Cc2f43AAF5B"; module.exports = { methodology, + deadFrom: '2023-07-18', kava: { ...aaveExports("kava", "0xcCe311383b0f4A41c82D8d03a1f4214A3c8E70Bd"), staking: staking(stakingContract, TOREUS), }, -}; \ No newline at end of file +}; + +module.exports.kava.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/toros/index.js b/projects/toros/index.js index b8bbb5a362..bdc0efe517 100644 --- a/projects/toros/index.js +++ b/projects/toros/index.js @@ -11,11 +11,14 @@ async function tvl(api) { params: [torosMultisigManager], }); - const poolSummaries = await api.multiCall({ + const poolSummariesRes = await api.multiCall({ abi: TOROS_POOL_ABI, calls: pools, + permitFailure: true }); + const poolSummaries = poolSummariesRes.filter(i => i && i.totalFundValue !== null && i.totalFundValue !== undefined); + const totalValue = poolSummaries.reduce( (acc, i) => acc + +i.totalFundValue, 0 @@ -28,7 +31,7 @@ async function tvl(api) { module.exports = { misrepresentedTokens: true, - start: 1627776000, // Sunday, August 1, 2021 12:00:00 AM + start: '2021-08-01', // Sunday, August 1, 2021 12:00:00 AM methodology: "Aggregates total value of each Toros vault both on Polygon and Optimism", polygon: { diff --git a/projects/toucan-protocol/index.js b/projects/toucan-protocol/index.js index 441843bc51..909485c2db 100644 --- a/projects/toucan-protocol/index.js +++ b/projects/toucan-protocol/index.js @@ -54,7 +54,7 @@ const getRegenCredits = () => { }; module.exports = { - start: 1634842800, + start: '2021-10-21', base: { tvl: getCalculationMethod("base") }, diff --git a/projects/traderjoe-lend/index.js b/projects/traderjoe-lend/index.js index aeb05ccf43..e72efed541 100644 --- a/projects/traderjoe-lend/index.js +++ b/projects/traderjoe-lend/index.js @@ -1,27 +1,6 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk'); -const { getCompoundV2Tvl } = require('../helper/compound'); - -const comptroller = "0xdc13687554205E5b89Ac783db14bb5bba4A1eDaC"; +const { compoundExports2 } = require('../helper/compound'); module.exports = { - methodology: 'We count liquidity on the pairs and we get that information from the "traderjoe-xyz/exchange" subgraph. The staking portion of TVL includes the JoeTokens within the JoeBar contract.', - avax:{ - tvl: getCompoundV2Tvl( - comptroller, - "avax", - addr => `avax:${addr}`, - "0xC22F01ddc8010Ee05574028528614634684EC29e", - ADDRESSES.avax.WAVAX, - false - ), - borrowed: getCompoundV2Tvl( - comptroller, - "avax", - addr => `avax:${addr}`, - "0xC22F01ddc8010Ee05574028528614634684EC29e", - ADDRESSES.avax.WAVAX, - true - ), - } + methodology: 'We count liquidity on the pairs and we get that information from the "traderjoe-xyz/exchange" subgraph. The staking portion of TVL includes the JoeTokens within the JoeBar contract.', + avax: compoundExports2({ comptroller: '0xdc13687554205E5b89Ac783db14bb5bba4A1eDaC', cether: '0xC22F01ddc8010Ee05574028528614634684EC29e' }), }; diff --git a/projects/trado-spot/index.js b/projects/trado-spot/index.js new file mode 100644 index 0000000000..31d1fe9852 --- /dev/null +++ b/projects/trado-spot/index.js @@ -0,0 +1,10 @@ +const { iziswapExport } = require('../helper/iziswap') + +const poolHelpers = { + 'flow': ['0x19b683A2F45012318d9B2aE1280d68d3eC54D663'], +} // liquidityManager contracts + + +Object.keys(poolHelpers).forEach(chain => { + module.exports[chain] = { tvl: iziswapExport({ poolHelpers: poolHelpers[chain], }), } +}) \ No newline at end of file diff --git a/projects/trado/index.js b/projects/trado/index.js new file mode 100644 index 0000000000..ddc132d3f8 --- /dev/null +++ b/projects/trado/index.js @@ -0,0 +1,10 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokensExport } = require("../helper/unwrapLPs"); +// perp +const USDCe = ADDRESSES.milkomeda.BNB +const USDX = '0xAeBE92ebc1a67F810Cb35fdcdA6398f6136DCD50' + +module.exports = { + flow: { tvl: sumTokensExport({ owner: USDX, tokens: [USDCe], })}, + methodology: `The TVL for Trado Perpetual is calculated based on the value of all stablecoins locked in the USDX contract.`, +}; diff --git a/projects/tradoor/index.js b/projects/tradoor/index.js index ebe0c7c6bd..6c06183ac5 100644 --- a/projects/tradoor/index.js +++ b/projects/tradoor/index.js @@ -1,11 +1,15 @@ const { sumTokensExport } = require("../helper/chain/ton"); const ADDRESSES = require("../helper/coreAssets.json"); -const evaaScAddr = "EQBPAMNu5Eud9AEvplOjNlRhxI4EkuJEhEMAmxh9erxmImKs" - module.exports = { methodology: 'Counts Tradoor smartcontract balance as TVL.', ton: { - tvl: sumTokensExport({ owner: evaaScAddr, tokens: [ADDRESSES.null]}), + tvl: sumTokensExport({ + owners: [ + "EQBPAMNu5Eud9AEvplOjNlRhxI4EkuJEhEMAmxh9erxmImKs", // v1 + "EQD_EzjJ9u0fpMJkoZBSv_ZNEMitAoYo9SsuD0s1ehIifnnn", // v2 + ], + tokens: [ADDRESSES.null] + }), } } diff --git a/projects/tranche/index.js b/projects/tranche/index.js index 6796d3d525..3912c836fd 100644 --- a/projects/tranche/index.js +++ b/projects/tranche/index.js @@ -93,7 +93,7 @@ function tvl(chain) { } module.exports = { - start: 1621340071, + start: '2021-05-18', ethereum: tvl('ethereum'), fantom: tvl('fantom'), avax: tvl('avax'), diff --git a/projects/tranquil/index.js b/projects/tranquil/index.js index 8c578c5c7c..8cbbef2a5c 100644 --- a/projects/tranquil/index.js +++ b/projects/tranquil/index.js @@ -1,140 +1,36 @@ -const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk"); -const { BigNumber } = require("bignumber.js"); -const { getCompoundV2Tvl} = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound') const { uniTvlExport } = require('../helper/calculateUniTvl.js'); +const { staking } = require('../helper/staking') -const tqOne = "0x34B9aa82D89AE04f0f546Ca5eC9C93eFE1288940"; // tqONE -const wOne = ADDRESSES.harmony.WONE; const stONEAddr = "0x22D62b19b7039333ad773b7185BB61294F3AdC19"; // stONE ERC20 contract -const tranqToken = "0xcf1709ad76a79d5a60210f23e81ce2460542a836"; +const { tvl: _tvl, borrowed } = compoundExports2({ comptroller: '0x6a82A17B48EF6be278BBC56138F35d04594587E3', cether: '0x34b9aa82d89ae04f0f546ca5ec9c93efe1288940' }) -const tranqWONESushiLP = "0x643f94fc0a804ea13adb88b9e17244bf94022a25"; -const stoneWONESushiLP = "0x6b53ca1ed597ed7ccd5664ec9e03329992c2ba87"; - -async function tranqWONE_pool2(balances, timestamp, chain, chainBlocks) { - let { output: balance } = await sdk.api.abi.multiCall({ - calls: [ - { - target: tranqToken, - params: tranqWONESushiLP, - }, - { - target: wOne, - params: tranqWONESushiLP, - }, - ], - abi: "erc20:balanceOf", - block: chainBlocks.harmony, - chain: "harmony", - }); - - let oneBalance = BigNumber(balance[1].output) - .div(10 ** 18) - .toFixed(0); - - sdk.util.sumSingleBalance( - balances, - `harmony:${tranqToken}`, - balance[0].output - ); - sdk.util.sumSingleBalance(balances, ["wrapped-one"], oneBalance); -} - -async function stoneWONE_pool2(balances, timestamp, chain, chainBlocks) { - let { output: balance } = await sdk.api.abi.multiCall({ - calls: [ - { - target: stONEAddr, - params: stoneWONESushiLP, - }, - { - target: wOne, - params: stoneWONESushiLP, - }, - ], - abi: "erc20:balanceOf", - block: chainBlocks.harmony, - chain: "harmony", - }); - - let oneBalance = BigNumber(balance[1].output) - .div(10 ** 18) - .toFixed(0); - - sdk.util.sumSingleBalance( - balances, - `harmony:${stONEAddr}`, - balance[0].output - ); - sdk.util.sumSingleBalance(balances, ["wrapped-one"], oneBalance); -} - -async function pool2(timestamp, chain, chainBlocks) { - let balances = {}; - await tranqWONE_pool2(balances, timestamp, chain, chainBlocks); - await stoneWONE_pool2(balances, timestamp, chain, chainBlocks); - - - return balances; +async function tvl(api) { + // Add ONE amount locked in Liquid Staking + // https://docs.tranquil.finance/liquid-staking-stone/tranquil-stone + const stoneBalance = await api.call({ target: stONEAddr, abi: 'erc20:totalSupply', }) + api.add(stONEAddr, stoneBalance) + return api.getBalances() } -async function tvl(timestamp, chain, chainBlocks) { - const transformAddress = addr=>`harmony:${addr}`; - const lendingMarketTvlFn = getCompoundV2Tvl("0x6a82A17B48EF6be278BBC56138F35d04594587E3", "harmony", transformAddress, tqOne, wOne, false); - let balances = await lendingMarketTvlFn(timestamp, chain, chainBlocks); - - // Add ONE amount locked in Liquid Staking - // https://docs.tranquil.finance/liquid-staking-stone/tranquil-stone - const stoneBalance = (await sdk.api.abi.call({ - block: chainBlocks.harmony, - target: stONEAddr, - abi: 'erc20:totalSupply', - chain: 'harmony' - })).output; - balances[`harmony:${stONEAddr}`]= stoneBalance; - - return balances; -} - -async function borrowed(timestamp, chain, chainBlocks) { - const transformAddress = addr=>`harmony:${addr}`; - const lendingMarketTvlFn = getCompoundV2Tvl("0x6a82A17B48EF6be278BBC56138F35d04594587E3", "harmony", transformAddress, tqOne, wOne, true); - return await lendingMarketTvlFn(timestamp, chain, chainBlocks); -} - - const xtranqToken = "0xb4aa8c8e555b3a2f1bfd04234ff803c011760e59"; const stakingContract = "0x59a4d6b2a944e8acabbd5d2571e731388918669f"; -async function staking(timestamp, chain, chainBlocks) { - let balances = {}; - - let { output: balance } = await sdk.api.erc20.balanceOf({ - target: xtranqToken, - owner: stakingContract, - block: chainBlocks.harmony, - chain: "harmony", - }); - - sdk.util.sumSingleBalance(balances, `harmony:${tranqToken}`, balance); - - return balances; -} - module.exports = { methodology: "TVL includes values locked into TqTokens. Pool2 are the liquidity in the TRANQ-WONE SUSHI LPs. Staking TVL are the xTRANQ tokens locked into the staking contract.", harmony: { tvl: sdk.util.sumChainTvls([ + _tvl, tvl, uniTvlExport('0xF166939E9130b03f721B0aE5352CCCa690a7726a', 'harmony', true), ]), - borrowed: borrowed, - pool2: pool2, - staking: staking, + borrowed: borrowed, + pool2: () => ({}), + staking: staking(stakingContract, xtranqToken), }, - hallmarks:[ + hallmarks: [ [1655991120, "Horizon bridge Hack $100m"], ], }; diff --git a/projects/trapeza-protocol/index.js b/projects/trapeza-protocol/index.js index 7e8925d946..5bea20a417 100644 --- a/projects/trapeza-protocol/index.js +++ b/projects/trapeza-protocol/index.js @@ -13,6 +13,7 @@ module.exports = { hallmarks: [ [1648684800, "Rug Pull"] ], + deadFrom: 1648684800, misrepresentedTokens: true, ...ohmTvl(treasury, treasuryTokens, "bsc", fidlStaking, fidl, undefined, undefined, false) } \ No newline at end of file diff --git a/projects/treasury/alienbase.js b/projects/treasury/alienbase.js new file mode 100644 index 0000000000..0b7e5f74ec --- /dev/null +++ b/projects/treasury/alienbase.js @@ -0,0 +1,8 @@ +const { treasuryExports } = require("../helper/treasury"); + +module.exports = treasuryExports({ + base: { + owners: ['0x4aB9070B7680f802cBf8322e597a4409902171e5'], + ownTokens: ['0x1dd2d631c92b1aCdFCDd51A0F7145A50130050C4'], + }, +}) \ No newline at end of file diff --git a/projects/treasury/alphaX-protocol.js b/projects/treasury/alphaX-protocol.js new file mode 100644 index 0000000000..a1f9fc51c8 --- /dev/null +++ b/projects/treasury/alphaX-protocol.js @@ -0,0 +1,7 @@ +const { treasuryExports } = require("../helper/treasury"); + +module.exports = treasuryExports({ + ethereum: { + owners: ['0x95e2A6458419b7A38193CB853F45fD7329443A90'], + }, +}) diff --git a/projects/treasury/balancer.js b/projects/treasury/balancer.js index a0327c28f3..1d9601f342 100644 --- a/projects/treasury/balancer.js +++ b/projects/treasury/balancer.js @@ -1,4 +1,5 @@ const ADDRESSES = require("../helper/coreAssets.json"); +const { karpatKeyTvl } = require("../helper/karpatkey"); const { nullAddress, treasuryExports } = require("../helper/treasury"); // Treasury addresses per chain @@ -104,46 +105,48 @@ const avaxOwnTokens = [ "0xA39d8651689c8b6e5a9e0AA4362629aeF2c58F55" // 80BAL-20WAVAX BPT ]; - +// Keeping old code because karpatkey's api tends to break module.exports = treasuryExports({ ethereum: { owners: [eth, eth2], - tokens: ethTokens, + //tokens: ethTokens, ownTokens: ethOwnTokens }, arbitrum: { owners: [arb], - tokens: arbTokens, + //tokens: arbTokens, ownTokens: arbOwnTokens }, polygon: { owners: [pol], - tokens: polTokens, + //tokens: polTokens, ownTokens: polOwnTokens }, polygon_zkevm: { owners: [zkevm], - tokens: zkevmTokens, + //tokens: zkevmTokens, ownTokens: zkevmOwnTokens }, optimism: { owners: [op], - tokens: opTokens, + //tokens: opTokens, ownTokens: opOwnTokens }, base: { owners: [base], - tokens: baseTokens, + //tokens: baseTokens, ownTokens: baseOwnTokens }, xdai: { owners: [xdai], - tokens: xdaiTokens, + //tokens: xdaiTokens, ownTokens: xdaiOwnTokens }, avax: { owners: [avax], - tokens: avaxTokens, + //tokens: avaxTokens, ownTokens: avaxOwnTokens } }); + +module.exports.ethereum.tvl = async (api)=>karpatKeyTvl(api, "Balancer DAO", "BAL") \ No newline at end of file diff --git a/projects/treasury/bankofcronos.js b/projects/treasury/bankofcronos.js index 7a3808f5f3..47bf8672d5 100644 --- a/projects/treasury/bankofcronos.js +++ b/projects/treasury/bankofcronos.js @@ -12,7 +12,7 @@ module.exports = treasuryExports({ nullAddress, ADDRESSES.cronos.USDC,//USDC '0x26043Aaa4D982BeEd7750e2D424547F5D76951d4',//CUSD - '0x5C7F8A570d578ED84E63fdFA7b1eE72dEae1AE23',//WCRO + ADDRESSES.cronos.WCRO_1,//WCRO '0xe44Fd7fCb2b1581822D0c862B68222998a0c299a',//WETH ADDRESSES.cronos.WBTC,//WBTC ], diff --git a/projects/treasury/benqi.js b/projects/treasury/benqi.js index f4f236745e..e74e28e272 100644 --- a/projects/treasury/benqi.js +++ b/projects/treasury/benqi.js @@ -1,4 +1,3 @@ -const { getCompoundV2Tvl } = require("../helper/compound"); const { stakings } = require("../helper/staking"); const { sumTokens } = require("../helper/sumTokens"); const { nullAddress } = require("../helper/treasury"); @@ -8,22 +7,16 @@ const treasury2 = "0x9d6ef2445fcc41b0d08865f0a7839490cc58a7b7"; const owners = [treasury, treasury2] const qi = "0x8729438EB15e2C8B576fCc6AeCdA6A148776C0F5"; -async function tvl(api){ - const balances = await getCompoundV2Tvl("0x486af39519b4dc9a7fccd318217352830e8ad9b4", "avax", undefined, undefined, undefined, false, undefined, { - abis:{ - getCash: {"constant":true,"inputs":[],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"} - } - })() - return sumTokens({ - balances, - api, - owners, - tokens: [nullAddress] - }) +async function tvl(api) { + const markets = await api.call({ abi: "address[]:getAllMarkets", target: '0x486af39519b4dc9a7fccd318217352830e8ad9b4'}) + const underlyings = (await api.multiCall({ abi: 'address:underlying', calls: markets, permitFailure: true })).map(i => i ?? nullAddress) + const bals = await api.multiCall({ abi: 'uint256:totalReserves', calls: markets}) + api.add(underlyings, bals) + return sumTokens({ api, owners, tokens: [nullAddress] }) } module.exports = { - avax:{ + avax: { ownTokens: stakings(owners, qi), tvl } diff --git a/projects/treasury/betswirl.js b/projects/treasury/betswirl.js index 2a43dc69bd..1ecf614b30 100644 --- a/projects/treasury/betswirl.js +++ b/projects/treasury/betswirl.js @@ -74,7 +74,7 @@ module.exports = { methodology: "BetSwirl has no users TVL yet. However, it includes the bankrolls amounts (each tokens amount in the bank allowing players to bet).", // The first Bank was deployed on Polygon at tx 0x6b99f617946d2f8c23adcd440cd3309d2da750e52d135853f38a0da11cdc3233 - start: 1648344312, // new Date(Date.UTC(2022, 2, 27, 1, 25, 12)).getTime() / 1e3, + start: '2022-03-27', // new Date(Date.UTC(2022, 2, 27, 1, 25, 12)).getTime() / 1e3, bsc: { tvl: treasury("bsc"), ownTokens: staking('0xa475f643aa480a3df3e9872b6e80e75ae99b19db', '0x3e0a7C7dB7bB21bDA290A80c9811DE6d47781671'), diff --git a/projects/treasury/bitdao.js b/projects/treasury/bitdao.js index 99027682dd..ef471f8be5 100644 --- a/projects/treasury/bitdao.js +++ b/projects/treasury/bitdao.js @@ -1,112 +1,76 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { nullAddress,treasuryExports } = require("../helper/treasury"); -const sdk = require("@defillama/sdk"); +const sdk = require('@defillama/sdk'); +const { nullAddress } = require("../helper/treasury"); +const { getConfig } = require('../helper/cache') -//eth wallets -const mTreasuryL1 = "0x78605Df79524164911C144801f41e9811B7DB73D"; -const mTreasuryL1SC = "0xCa264A4Adf80d3c390233de135468A914f99B6a5" -const mTreasuryL1O1 = "0xf0e91a74cb053d79b39837E1cfba947D0c98dd93" -const mTreasuryL1E1 = "0x1a743BD810dde05fa897Ec41FE4D42068F7fD6b2" -const mTreasuryL1RB1 = "0x164Cf077D3004bC1f26E7A46Ad8fA54df4449E3F" -const mTreasuryL1LPE1 = "0xA5b79541548ef2D48921F63ca72e4954e50a4a74" +const API_URL = 'https://api.mantle.xyz/api/v2/treasury/tokens'; +const MNT = '0x3c3a81e81dc49a522a592e7622a7e711c06bf354'; +const USDe = ADDRESSES.ethereum.USDe; +const COOK = '0x9f0c013016e8656bc256f948cd4b79ab25c7b94d' +const ethenaFarm = '0x8707f238936c12c309bfc2b9959c35828acfc512'; +const SPECIFIC_TOKENS = ['eth', 'ethena-farming-usde', 'eigen-layer-eth', 'mnt']; -//mantle wallets +const abi = "function stakes(address, address) view returns (uint256 stakedAmount, uint152 coolingDownAmount, uint104 cooldownStartTimestamp)"; -const mTreasuryL2 = "0x94FEC56BBEcEaCC71c9e61623ACE9F8e1B1cf473" -const mTreasuryL2RB2 = "0x87C62C3F9BDFc09200bCF1cbb36F233A65CeF3e6" -const mTreasuryL2LPM1 = "0x992b65556d330219e7e75C43273535847fEee262" -const mTreasuryL2FF1 = "0xcD9Dab9Fa5B55EE4569EdC402d3206123B1285F4" +const isSpecificToken = token => SPECIFIC_TOKENS.includes(token); -const BIT = "0x1A4b46696b2bB4794Eb3D4c26f1c55F9170fa4C5"; -const MNT = "0x3c3a81e81dc49a522a592e7622a7e711c06bf354" +const getEthenaFarmingBalance = async (api, wallet) => { + const { stakedAmount, coolingDownAmount } = await api.call({ target: ethenaFarm, params: [wallet, USDe], abi }); + return Number(stakedAmount) + Number(coolingDownAmount); +}; -const MNTMantle = ADDRESSES.metis.Metis -const wrappedmantleonmantle = ADDRESSES.mantle.WMNT +const getTvlData = async (api, key) => { + const data = await getConfig('mantle-treasury', API_URL) + const rawDatas = data.filter(({ chain }) => key === chain); + const datas = rawDatas.map(({ id, walletAddress, amount }) => ({ id, walletAddress, amount })); -const ecspWallets = [ -'0x87c185bEFFfb36a42b741d10601A007e997a63bA', -'0x8AA6a67e96850e070B0c8E94E3a35C5f9f01809C', -'0x50f6e426fdefb3f994d3fe9fa4e1ee715f85de7f', -'0x7427b4Fd78974Ba1C3B5d69e2F1B8ACF654fEB44', -'0x7fe2bAffD481a8776A9eaD15a8eD17Fe37107903', -'0x15Bb5D31048381c84a157526cEF9513531b8BE1e', -'0xdD1c2483056fF46153249bd903401ae7bF6360D1', -'0x565F603D583F9199487923775114ae8c0D17D044', -'0x650aD9e7EfCD34B7d050c22a6A8dFFAFe3B4A22E', -'0x607105cE5bf13e70B49E949a3DdFaD694d19374F', -'0x131C7f3461A6696317ddfEdfed3BCdc10A2062B2', -'0xa1F7D91Bf121f4940d96c5C52Bc577011B95B51b', -'0x911169AA285f5D18fC3567d150616d4B0869d3a5', -'0x3f946F00A00eB2A66A4BD1AeAF137E05dB6CAEc6', -'0x9fe09b3ed1A407162876fEB1995048A620552fD0', -'0xd4338fC8Dc9d2FDcb99604d3cFc80019EBE01058', -'0x71Fb53Afc7E36C3f11BC1bdBBAB7B6FC3E552eb6', -'0x92A9e359d72F934a5d7c1251201f9855A381B23c', -'0xb118d4B94B0D4ce38F0D15d88f1dC09580a60b7A', -'0xaA42736947d1fdcc5d93F459A6D1dC0d7b9a92a4', -'0xF366eC9FA2DCE0ee7A6bdae4Aaa5c076E8391AFC', -'0x5DA939F5e2bC3C7159ac16f98BbFb23759000cd5', -'0x60F6ce1965D99EEffDF63B5303664f25fCb0347F', -'0xC784F3aEA5ce3daBA6907ee5d6Ce321a204Eb3A8', -'0xDCA65E2DFEe70991374eD47EfB4aD6B4FCD0c612', -'0x4ea7b4D10a01c93509BaA0CBb128c89344A1F578', -'0x4dF3d780Af7cbD51d9c76f236477edF417c7B554', -'0xA38e519b12D9CE133396a3E4EB92aac0934AB351', -'0x6d9755211D627fe0EA02D94C23C6110af16a8882', -'0x43c0f24E84e6d45b021d18C982beAbFA969577c8', -'0xB82C91bB7e8696a4A057192ED61aFcD1F9121722', -'0x15FFBf5730FA9eF271B2E9b4a1a6c90F2288155B', -'0xCef70f66e50CF016BB932De6425AA6f7286A3886', -'0x50165383783124232B9e4367D59815947012Ac27', -'0x97D50c7d14E68bEBC0f81B4FdCed89a1122330A6' -] + const wallets = Object.values( + datas.reduce((acc, { id, walletAddress, amount }) => { + acc[walletAddress] = acc[walletAddress] || { owner: walletAddress, tokens: [] }; + acc[walletAddress].tokens.push({ address: id, amount }); + return acc; + }, {}) + ); -const tokenTreasuries = treasuryExports({ + const uniqueOwners = new Set(); + const uniqueTokens = new Set(); + + for (const { owner, tokens } of wallets) { + const eigenLayerToken = tokens.find(token => token.address === 'eigen-layer-eth'); + if (tokens.some(token => token.address === 'eth')) api.add(nullAddress, (await sdk.api.eth.getBalance({ target: owner })).output); + if (tokens.some(token => token.address === 'mnt')) api.add(MNT, (await sdk.api.eth.getBalance({ target: owner })).output, { skipChain: true }); + if (tokens.some(token => token.address === 'ethena-farming-usde')) api.add(USDe, await getEthenaFarmingBalance(api, owner)); + if (eigenLayerToken) api.add(nullAddress, eigenLayerToken.amount * 10 ** 18); + + const nonSpecificTokens = tokens.filter(token => !isSpecificToken(token.address)); + if (nonSpecificTokens.length > 0) { + uniqueOwners.add(owner); + nonSpecificTokens.forEach(token => uniqueTokens.add(token.address)); + } + } + + return { owners: Array.from(uniqueOwners), tokens: Array.from(uniqueTokens) }; +}; + +module.exports = { ethereum: { - tokens: [ - nullAddress, - ADDRESSES.ethereum.USDC,//USDC - ADDRESSES.ethereum.DAI,//DAI - ADDRESSES.ethereum.WETH,//WETH - ADDRESSES.ethereum.USDT,//USDT - '0x50D1c9771902476076eCFc8B2A83Ad6b9355a4c9',//FTT - '0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272',//xSUSHI - "0x52A8845DF664D76C69d2EEa607CD793565aF42B8", - ADDRESSES.ethereum.sUSDe, //sUSDe - ], - owners: [mTreasuryL1, mTreasuryL1SC,mTreasuryL1O1,mTreasuryL1E1, mTreasuryL1RB1, mTreasuryL1LPE1, ...ecspWallets ], - ownTokens: [BIT, MNT], - resolveLP: true, - resolveUniV3: true + tvl: sdk.util.sumChainTvls([async ({ api }) => { + const { owners, tokens } = await getTvlData(api, 'eth') + return api.sumTokens({ owners, tokens, blacklistedTokens: [MNT] }); + }]), + ownTokens: async ({ api }) => { + const { owners } = await getTvlData(api, 'eth') + return api.sumTokens({ ownerTokens: owners.map(owner => [[MNT], owner]) }); + } }, mantle: { - tokens: [ - nullAddress, - "0x5bE26527e817998A7206475496fDE1E68957c5A6", //ondo usd - "0xcda86a272531e8640cd7f1a92c01839911b90bb0", //mantle staked eth - ADDRESSES.mantle.WETH, //eth - ADDRESSES.mantle.USDC, //usdc - ADDRESSES.mantle.USDT, //tether - "0xf52b354ffdb323e0667e87a0136040e3e4d9df33", //lp meth - ], - owners: [mTreasuryL2, mTreasuryL2RB2, mTreasuryL2LPM1, mTreasuryL2FF1, ...ecspWallets], - ownTokens: [MNTMantle, wrappedmantleonmantle], - resolveLP: true, + tvl: async (api) => { + const { owners, tokens } = await getTvlData(api, 'mnt') + return api.sumTokens({ owners, tokens, blacklistedTokens: [COOK] }); + }, + ownTokens: async ({ api }) => { + const { owners } = await getTvlData(api, 'mnt') + return api.sumTokens({ ownerTokens: owners.map(owner => [[COOK], owner]) }); + } }, -}) - -async function otherTvl(_timestamp, _block, _chainBlocks, {api}){ - const shares = await api.call({ abi: 'function shares(address user) public view returns (uint256)', target: "0x298afb19a105d59e74658c4c334ff360bade6dd2", params:["0xca264a4adf80d3c390233de135468a914f99b6a5"]}) - const balances = { - "ethereum:0xd5f7838f5c461feff7fe49ea5ebaf7728bb0adfa": shares - } - return balances } - -module.exports={ - ethereum:{ - tvl: sdk.util.sumChainTvls([tokenTreasuries.ethereum.tvl, otherTvl]), - ownTokens: tokenTreasuries.ethereum.ownTokens - }, - mantle: tokenTreasuries.mantle -} \ No newline at end of file diff --git a/projects/treasury/bonsai.js b/projects/treasury/bonsai.js new file mode 100644 index 0000000000..af5e372c30 --- /dev/null +++ b/projects/treasury/bonsai.js @@ -0,0 +1,54 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { nullAddress, treasuryExports } = require("../helper/treasury"); + +const arbitrumAddresses = [ + "0xb137d135Dc8482B633265c21191F50a4bA26145d", // Main treasury + "0x8E52cA5A7a9249431F03d60D79DDA5EAB4930178", // Arbitrum DAO delegate + "0xB0B4bd94D656353a30773Ac883591DDBaBC0c0bA", // Old ARBIs multisig + "0x4e5645bee4eD80C6FEe04DCC15D14A3AC956748A" // Multisig collecting vaults fees +]; +const ethAddresses = "0x9478D820E8d38Ca96610b7FCbE377822C2F60f2c" + +const ownTokens = [ + "0x79EaD7a012D97eD8DeEcE279f9bC39e264d7Eef9", // Bonsai +]; + +module.exports = treasuryExports({ + arbitrum: { + tokens: [ + nullAddress, // ETH + ADDRESSES.arbitrum.fsGLP, + ADDRESSES.arbitrum.fGLP, + ADDRESSES.arbitrum.USDC, // USDC.e + ADDRESSES.arbitrum.USDC_CIRCLE, // USDC + ADDRESSES.arbitrum.USDT, + ADDRESSES.arbitrum.WETH, + ADDRESSES.arbitrum.GMX, + ADDRESSES.arbitrum.ARB, + ADDRESSES.arbitrum.WBTC, + "0xe4dddfe67e7164b0fe14e218d80dc4c08edc01cb", // KNC + ADDRESSES.arbitrum.LINK, // LINK + "0x56659245931cb6920e39c189d2a0e7dd0da2d57b", // IBEX + "0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0", // UNI + "0x55ff62567f09906a85183b866df84bf599a4bf70", // KROM + "0x3d9907f9a368ad0a51be60f7da3b97cf940982d8", // GRAIL + "0x3CAaE25Ee616f2C8E13C74dA0813402eae3F496b", // xGRAIL + "0x3e6648c5a70a150a88bce65f4ad4d506fe15d2af", // spell + "0x10010078a54396f62c96df8532dc2b4847d47ed3", // hnd + "0x32eb7902d4134bf98a28b963d26de779af92a212", // rpdx + "0xd4d42f0b6def4ce0383636770ef773390d85c61a", // sushi + "0x2cab3abfc1670d1a452df502e216a66883cdf079", // l2dao + "0x539bde0d7dbd336b79148aa742883198bbf60342", // magic + "0x6694340fc020c5e6b96567843da2df01b2ce1eb6", // stg + ], + owners: arbitrumAddresses, + ownTokens, + }, + ethereum: { + tokens: [ + nullAddress, + ADDRESSES.ethereum.USDC, // usdc + ], + owners: [ethAddresses] + }, +}); diff --git a/projects/treasury/commonwealth.js b/projects/treasury/commonwealth.js new file mode 100644 index 0000000000..3a99df4e7e --- /dev/null +++ b/projects/treasury/commonwealth.js @@ -0,0 +1,13 @@ +const { treasuryExports } = require("../helper/treasury"); + +const owners = [ + '0xdE70B8BC5215BdF03f839BB8cD0F639D4E3E2881', + '0xA205fD6A798A9Ba8b107A00b8A6a5Af742d6aCb5', + '0x990eCdf73704f9114Ee28710D171132b5Cfdc6f0', + '0xa653879692D4D0e6b6E0847ceDd58eAD2F1CC136' +] + +const WLTH = '0x99b2B1A2aDB02B38222ADcD057783D7e5D1FCC7D'; +module.exports = treasuryExports({ + base: { owners, ownTokens: [WLTH], }, +}) diff --git a/projects/treasury/croblanc.js b/projects/treasury/croblanc.js index 806a6efef5..a0d3525160 100644 --- a/projects/treasury/croblanc.js +++ b/projects/treasury/croblanc.js @@ -1,7 +1,8 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { staking } = require("../helper/staking"); const treasury = "0xb20234c33337537111f4ab6f5EcaD400134aC143"; -const WCRO = "0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23"; +const WCRO = ADDRESSES.cronos.WCRO_1; module.exports = { cronos: { diff --git a/projects/treasury/dexfinance.js b/projects/treasury/dexfinance.js index db92c5584a..8a874ccf18 100644 --- a/projects/treasury/dexfinance.js +++ b/projects/treasury/dexfinance.js @@ -56,7 +56,7 @@ module.exports = treasuryExports({ // tokens: [ // ADDRESSES.pulse.WETH, // ADDRESSES.ethereum.USDC, //usdc(fork) - // '0x30fcb23a906493371b1721c8feb8815804808d74', //sdai + // ADDRESSES.pulse.sDAI, //sdai // '0xaa2c47a35c1298795b5271490971ec4874c8e53d', //usdex // '0x6386704cd6f7a584ea9d23ccca66af7eba5a727e', //spark // ] @@ -77,7 +77,7 @@ module.exports = treasuryExports({ '0x940181a94a35a4569e4529a3cdfb74e38fd98631', //aero '0x7f62ac1e974d65fab4a81821ca6af659a5f46298', //wels '0x78b3c724a2f663d11373c4a1978689271895256f', //tkn - '0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452', //wsteth + ADDRESSES.base.wstETH, //wsteth '0x373504da48418c67e6fcd071f33cb0b3b47613c7', //wbasedoge ] }, diff --git a/projects/treasury/galaxygoogle.js b/projects/treasury/galaxygoogle.js index fcc803f7d1..b9ee1dad47 100644 --- a/projects/treasury/galaxygoogle.js +++ b/projects/treasury/galaxygoogle.js @@ -1,7 +1,4 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); - -const gg = "0xF2F7CE610a091B94d41D69f4fF1129434a82E2f0" // https://app.galaxygoggle.money/#/bonds const treasury = "0xD5F922e23693e552793fE0431F9a95ba67A60A23" @@ -10,42 +7,22 @@ const mim = "0x130966628846BFd36ff31a822705796e8cb8C18D" const wavax = ADDRESSES.avax.WAVAX const joe = ADDRESSES.avax.JOE -async function tvl(timestamp, block, chainBlocks) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [mim, false], - [wavax, false], - [joe, false], - ["0xe9E8d6b6ce6D94Fc9d724711e80784Ec096949Fc", true], // mim-gg - ], - [treasury, dao], - chainBlocks.avax, - 'avax', - addr=>`avax:${addr}` - ); - - return balances; +async function tvl(api) { + return api.sumTokens({ owners: [treasury, dao], tokens: [mim, wavax, joe, "0xe9E8d6b6ce6D94Fc9d724711e80784Ec096949Fc",] }); } const bscTreasury = "0xF76C9753507B3Df0867EB02D86d07C6fFcEecaf1"; const treasuryTokensBSC = [ - [ADDRESSES.bsc.BUSD, false], // BUSD - ["0x13Cf29b3F58f777dDeD38278F7d938401f6b260c", true] // GG-BUSD + ADDRESSES.bsc.BUSD, // BUSD + "0x13Cf29b3F58f777dDeD38278F7d938401f6b260c", // GG-BUSD ] -async function bscTvl(timestamp, block, chainBlocks) { - let balances = {}; - await sumTokensAndLPsSharedOwners(balances, treasuryTokensBSC, [bscTreasury], chainBlocks.bsc, "bsc", addr=>`bsc:${addr}`); - balances[`avax:${gg}`] = balances["bsc:0xcaf23964ca8db16d816eb314a56789f58fe0e10e"] || 0; - delete balances["bsc:0xcaf23964ca8db16d816eb314a56789f58fe0e10e"]; - return balances; +async function bscTvl(api) { + return api.sumTokens({ owners: [bscTreasury], tokens: treasuryTokensBSC }); } module.exports = { - avax:{ + avax: { tvl, }, bsc: { diff --git a/projects/treasury/gearbox.js b/projects/treasury/gearbox.js index 45b2ffaee4..2e8f5f5e7c 100644 --- a/projects/treasury/gearbox.js +++ b/projects/treasury/gearbox.js @@ -3,8 +3,14 @@ const { nullAddress, treasuryExports } = require("../helper/treasury"); // Treasury const treasury = "0x7b065Fcb0760dF0CEA8CFd144e08554F3CeA73D1"; -const GEAR = "0xBa3335588D9403515223F109EdC4eB7269a9Ab5D"; +const treasuryFee = "0x3E965117A51186e41c2BB58b729A1e518A715e5F"; +const treasuryArb = "0x2c31eFFE426765E68A43163A96DD13DF70B53C14"; +const treasuryOpt = "0x1ACc5BC353f23B901801f3Ba48e1E51a14263808"; +const aeraVault = "0x564bc596affd8eb9c5065bc37835d801f3830c9e"; +const GEAR = "0xBa3335588D9403515223F109EdC4eB7269a9Ab5D"; +const GEAR_ARB = "0x2F26337576127efabEEc1f62BE79dB1bcA9148A4"; +const GEAR_OPT = "0x39E6C2E1757ae4354087266E2C3EA9aC4257C1eb"; module.exports = treasuryExports({ ethereum: { @@ -16,8 +22,30 @@ module.exports = treasuryExports({ ADDRESSES.ethereum.USDC, ADDRESSES.ethereum.DAI, ADDRESSES.ethereum.WSTETH,//wsteth + ADDRESSES.ethereum.USDT, + ADDRESSES.ethereum.CRVUSD, ], - owners: [treasury], + owners: [treasury,treasuryFee,aeraVault], ownTokens: [GEAR] }, -}) + arbitrum: { + tokens: [ + nullAddress, + ADDRESSES.arbitrum.WETH, + ADDRESSES.arbitrum.USDC, + ADDRESSES.arbitrum.USDC_CIRCLE, + ], + owners: [treasuryArb], + ownTokens: [GEAR_ARB] + }, + optimism: { + tokens: [ + nullAddress, + ADDRESSES.optimism.WETH, + ADDRESSES.optimism.USDC, + ADDRESSES.optimism.USDC_CIRCLE, + ], + owners: [treasuryOpt], + ownTokens: [GEAR_OPT] + }, +}); diff --git a/projects/treasury/impermax.js b/projects/treasury/impermax.js index 8ec65d3c2a..27e981b126 100644 --- a/projects/treasury/impermax.js +++ b/projects/treasury/impermax.js @@ -1,12 +1,25 @@ const { nullAddress, treasuryExports } = require("../helper/treasury"); -const treasury = "0x7f959c082bc30f3ea88187fac1a640438ad7bf20"; +const treasury = "0xc28f68cd2df0fcc50f0058fb20abbc77bec8bdc6"; +const operations = "0x2157bfbb446744fc92bd95c3911eb58d0a9b01bd"; module.exports = treasuryExports({ arbitrum: { tokens: [ nullAddress, ], - owners: [treasury,], + owners: [treasury, operations], }, -}) \ No newline at end of file + base: { + tokens: [ + nullAddress, + ], + owners: [treasury, operations], + }, + blast: { + tokens: [ + nullAddress, + ], + owners: [treasury, operations], + }, +}) diff --git a/projects/treasury/india-covid-relief-fund.js b/projects/treasury/india-covid-relief-fund.js index f75c213016..8a8c422174 100644 --- a/projects/treasury/india-covid-relief-fund.js +++ b/projects/treasury/india-covid-relief-fund.js @@ -1,12 +1,11 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { nullAddress,treasuryExports } = require("../helper/treasury"); +const { nullAddress, treasuryExports } = require("../helper/treasury") +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const Treasury = "0x68A99f89E475a078645f4BAC491360aFe255Dff1"; const Treasury_bsc = "0x5C9E5571B17D91e6ACcD4F0c29bBe199Af1f7B09"; -const Treasury_btc = "bc1q220k2449fau0pxu9hfn28q3w4k99ep9hwsa5fa"; const Treasury_trx = "TSZMcrQzMLdKrgiMPoe2uQMHLeEpkf2j8E" - module.exports = treasuryExports({ ethereum: { tokens: [ @@ -40,7 +39,7 @@ module.exports = treasuryExports({ tokens: [ nullAddress, ], - owners: [Treasury_btc] + owners: bitcoinAddressBook.indiaCovid } //https://cryptorelief.in/transparency }) \ No newline at end of file diff --git a/projects/treasury/inverse.js b/projects/treasury/inverse.js index 078f9d88b5..d1bc67789e 100644 --- a/projects/treasury/inverse.js +++ b/projects/treasury/inverse.js @@ -41,6 +41,7 @@ module.exports = treasuryExports({ "0x7e05540A61b531793742fde0514e6c136b5fbAfE", // xFODL "0x0a6B1d9F920019BAbc4De3F10c94ECB822106104", "0x73E02EAAb68a41Ea63bdae9Dbd4b7678827B2352", + "0xbD1F921786e12a80F2184E4d6A5cAcB25dc673c9", // dola-inv uni ], owners: [anchorTreasury, treasurymultisig, pcmultisig, bugbountymultisig, fedchair], ownTokens: [ @@ -54,6 +55,19 @@ module.exports = treasuryExports({ blacklistedTokens: [ '0x21e83dbfd8f11d885eba9f9ba126da11ae0671b7', '0x265befe2b1a0f4f646dea96ba09c1656b74bda91', + ], + convexRewardPools: [ + "0x9a2d1b49b7c8783E37780AcE4ffA3416Eea64357",// DBR tripool CVX + "0x21E2d7f66DF6F4e8199210b9490a51831C9847C7",// inv tripool CVX + "0xE8cBdBFD4A1D776AB1146B63ABD1718b2F92a823",// dola-fraxpyusd lp CVX + "0x2ef1dA0368470B2603BAb392932E70205eEb9046",// dola-fxusd lp CVX + "0x0404d05F3992347d2f0dC3a97bdd147D77C85c1c",// dola-fraxusdc lp CVX + ], + auraPools: [ + // "0xA36d3799eA28f4B75653EBF9D91DDA4519578086", // sDOLA-DOLA aura pool + ], + blacklistedLPs: [ + '0xcb79637aaffdc1e8db17761fa10367b46745ecb0' ] }, optimism: { diff --git a/projects/treasury/k9finance.js b/projects/treasury/k9finance.js new file mode 100644 index 0000000000..2622ebfd21 --- /dev/null +++ b/projects/treasury/k9finance.js @@ -0,0 +1,18 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { nullAddress, treasuryExports } = require("../helper/treasury"); + +const treasury = "0xDA4Df6E2121eDaB7c33Ed7FE0f109350939eDA84"; +const shibtreasury = "0x5C3d21D406226F17a06510F1CB9157BD9e751416" + +module.exports = treasuryExports({ + ethereum: { + tokens: [nullAddress], + owners: [treasury], + ownTokens: ["0x91fbb2503ac69702061f1ac6885759fc853e6eae"] + }, + shibarium: { + tokens: [nullAddress,ADDRESSES.shibarium.BONE_5], + owners: [shibtreasury], + ownTokens: ["0x91fbB2503AC69702061f1AC6885759Fc853e6EaE"] + }, +}) \ No newline at end of file diff --git a/projects/treasury/luchadores.js b/projects/treasury/luchadores.js index 4d55111cbf..a22ede10c5 100644 --- a/projects/treasury/luchadores.js +++ b/projects/treasury/luchadores.js @@ -1,4 +1,4 @@ -const ADDRESSES = require('../helper/coreAssets.json') +const ADDRESSES = require('../helper/coreAssets.json'); const { nullAddress, treasuryExports } = require("../helper/treasury"); module.exports = treasuryExports({ @@ -19,6 +19,7 @@ module.exports = treasuryExports({ ], owners: ['0xa715c8b17268f140D76494c12ec07B48218549C4'], ownTokens: ['0xF4435cC8b478d54313F04c956882BE3D9aCf9F6F'], + blacklistedTokens: ['0x3a94201a0b6c3593ad3b3e17e3dfce33da183514'], resolveLP: true, } }) diff --git a/projects/treasury/memewe.js b/projects/treasury/memewe.js new file mode 100644 index 0000000000..108a0151f3 --- /dev/null +++ b/projects/treasury/memewe.js @@ -0,0 +1,15 @@ +const { nullAddress, treasuryExports } = require("../helper/treasury"); + + +module.exports = treasuryExports({ + base: { + owners: [ + '0xFfC60ed4c5ee48beb646dD81521842A4a4d19980', + ], + tokens: [ + nullAddress, + "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" + ], + ownTokens: [], + }, +}) \ No newline at end of file diff --git a/projects/treasury/minswap.js b/projects/treasury/minswap.js index ee314246df..4b8300c6f3 100644 --- a/projects/treasury/minswap.js +++ b/projects/treasury/minswap.js @@ -1,13 +1,15 @@ -const { get } = require('../helper/http'); +// https://minswap.org/analytics/dao-treasury +const { sumTokensExport} = require("../helper/chain/cardano"); + +const min_dao = 'addr1z9wdv59sq7zzy2l6gchq3247lz7ssfsxs45nj4njhwsp5uzj2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pqzygnta' +const min_dao_hot = 'addr1q8zntywq3fldecrqk4vl593sznvj7483ejcajnavvh2qpsvftaax5f3wasl5m49rtjw5pen938vr7863w0lfz94h0lfqldx3pu' +const min_fee_dao = 'addr1qxymvaeg3306xyp6yk3mjdj7usp40x2e5cecsh75xw5tsczj2c79gy9l76sdg0xwhd7r0c0kna0tycz4y5s6mlenh8pqjx0th5' +const min_pol = 'addr1q9gxe8vx0kvv5g6gv4n5wmsxexjqsjftc599qqcp2vkmmwh7snv5yhw2qqvdev3c7wn6s3xhrnx25eg6zcqjxj9vrv2s0e38ze' +const min_ada_min_pol = 'addr1qx54hjkagnc7zanqkfjearg8nk2w303pgdyl2qm4hs2x8saxg62nrp8kp2mukmrr4pfyt4fpdyjp7dx8jxffs4gf2xcsx6uj7a' module.exports = { cardano: { tvl: () => ({}), - ownTokens: async () => { - const pol = await get("https://api-mainnet-prod.minswap.org/landing-page/pol-details"); - return { - "coingecko:cardano": parseInt(pol[0]["totalPOL"]["totalAdaWorth"]), - } - } - }, -}; + ownTokens: sumTokensExport({ owners: [min_dao, min_dao_hot, min_fee_dao, min_pol, min_ada_min_pol] }) + } +} diff --git a/projects/treasury/monstro-fun.js b/projects/treasury/monstro-fun.js new file mode 100644 index 0000000000..2f36a918f9 --- /dev/null +++ b/projects/treasury/monstro-fun.js @@ -0,0 +1,21 @@ +const BASE_CONTRACT = '0x813303b6F253C74D997020518227f87Ff721F53F'; +const ABI_FARMZ = "function farmzLatestStats() view returns (uint256 totalInvested, uint256 currentTVL, uint256 insurance, uint256 totalPaidOut)" +// 0xdbe214c863d6b2ecf5d79012e5d03aab09c57e28 +const ADDRESSES = require('../helper/coreAssets.json') + +async function getInvestedValue(api, contractAddress, abi) { + const response = await api.call({ target: contractAddress, abi, }); + + return api.add(ADDRESSES.base.USDC, response.totalInvested) +} + +async function tvl(api) { + await getInvestedValue(api, BASE_CONTRACT, ABI_FARMZ); +} + +module.exports = { + misrepresentedTokens: true, + base: { + tvl, + }, +}; \ No newline at end of file diff --git a/projects/treasury/newland.js b/projects/treasury/newland.js index e815cd3cc7..0d5aeedc43 100644 --- a/projects/treasury/newland.js +++ b/projects/treasury/newland.js @@ -1,6 +1,3 @@ -const { getChainTransform } = require("../helper/portedTokens"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); - const treasuryAddress = "0xB3FC6B9be3AD6b2917d304d4F5645a311bCFd0A8"; const erc20Tokens = [ //MDX @@ -10,11 +7,8 @@ const erc20Tokens = [ ]; /*** Treasury ***/ -const Treasury = async (timestamp, ethBlock, chainBlocks) => { - const balances = {}; - let transformAddress = await getChainTransform('heco') - await sumTokensAndLPsSharedOwners(balances, erc20Tokens.map(t => [t, false]), [treasuryAddress], chainBlocks["heco"], "heco", transformAddress); - return balances; +const Treasury = async (api) => { + return api.sumTokens({ owner: treasuryAddress, tokens: erc20Tokens }); }; module.exports = { diff --git a/projects/treasury/op-foundation.js b/projects/treasury/op-foundation.js index 8b0283756d..908dea7ea3 100644 --- a/projects/treasury/op-foundation.js +++ b/projects/treasury/op-foundation.js @@ -2,6 +2,10 @@ const ADDRESSES = require('../helper/coreAssets.json') const { nullAddress, treasuryExports } = require("../helper/treasury"); const treasury = "0x2501c477d0a35545a387aa4a3eee4292a9a8b3f0"; +const treasury2 = "0xfedfaf1a10335448b7fa0268f56d2b44dbd357de"; +const treasury3 = "0x2a82ae142b2e62cb7d10b55e323acb1cab663a26"; +const treasury4 = "0x19793c7824be70ec58bb673ca42d2779d12581be"; + const OP = ADDRESSES.optimism.OP module.exports = treasuryExports({ @@ -10,7 +14,7 @@ module.exports = treasuryExports({ nullAddress, ADDRESSES.optimism.USDC ], - owners: [treasury], + owners: [treasury,treasury2,treasury3,treasury4], ownTokens: [OP], }, ethereum: { diff --git a/projects/treasury/perfect-pool.js b/projects/treasury/perfect-pool.js new file mode 100644 index 0000000000..bc0039ffde --- /dev/null +++ b/projects/treasury/perfect-pool.js @@ -0,0 +1,11 @@ +const { sumTokensExport } = require("../helper/unwrapLPs") +const ADDRESSES = require('../helper/coreAssets.json') + +const TREASURY = '0xFe4559392aF0E6988F2d7A4E6447a2E702Ff215d' + +module.exports = { + start: '2024-09-02', + base: { + tvl: sumTokensExport({ owner: TREASURY, token: ADDRESSES.base.USDC }), + } +} \ No newline at end of file diff --git a/projects/treasury/rootstock-collective.js b/projects/treasury/rootstock-collective.js new file mode 100644 index 0000000000..c8d26e8018 --- /dev/null +++ b/projects/treasury/rootstock-collective.js @@ -0,0 +1,19 @@ +const { nullAddress, treasuryExports } = require("../helper/treasury"); + +// Treasury +const treasuryGrants = "0x48229e5D82a186Aa89a99212D2D59f5674aa5b6C"; +const treasuryActive = "0xf016fA6B237BB56E3AEE7022C6947a6A103E3C47"; +const treasuryGrowth = "0x267a6073637408b6A1d34d685ff5720A0CbCbD9d"; +const treasuryGeneral = "0xfE3d9B7D68aE13455475F28089968336414FD358"; + + +module.exports = treasuryExports({ + rsk: { + tokens: [ + // Rootstock Assets + nullAddress, + ], + owners: [treasuryGrants, treasuryActive, treasuryGrowth, treasuryGeneral], + ownTokens: ["0x2aCc95758f8b5F583470bA265Eb685a8f45fC9D5",] // RIF + }, +}); \ No newline at end of file diff --git a/projects/treasury/safe.js b/projects/treasury/safe.js index 47ddb3f1ac..61b6a539bf 100644 --- a/projects/treasury/safe.js +++ b/projects/treasury/safe.js @@ -5,6 +5,7 @@ const treasury = "0x3EDf6868d7c42863E44072DaEcC16eCA2804Dea1" // const SAFE = ADDRESSES.ethereum.SAFE const safe_foundation_treasury = "0x1d4f25bc16b68c50b78e1040bc430a8097fd6f45" const safe_dao_2 = "0x0b00b3227a5f3df3484f03990a87e02ebad2f888" +const safe_gnosisdao_joint_treasury = "0xd28b432f06cb64692379758B88B5fCDFC4F56922" module.exports = treasuryExports({ @@ -19,7 +20,7 @@ module.exports = treasuryExports({ tokens: [ nullAddress, ], - owners: [safe_foundation_treasury, safe_dao_2], + owners: [safe_foundation_treasury, safe_dao_2,safe_gnosisdao_joint_treasury], ownTokens: [SAFE], }, diff --git a/projects/treasury/shibui.js b/projects/treasury/shibui.js index 851bc8f5d4..fd0559b181 100644 --- a/projects/treasury/shibui.js +++ b/projects/treasury/shibui.js @@ -1,61 +1,21 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); - -const CHAINS = ["boba"]; - -const Boba_SHIBUI = "0xf08ad7c3f6b1c6843ba027ad54ed8ddb6d71169b"; const Boba_BOBA = ADDRESSES.boba.BOBA; const Boba_USDT = ADDRESSES.boba.USDT; const Boba_SHIBUI_WETH = "0xcE9F38532B3d1e00a88e1f3347601dBC632E7a82"; const Boba_SHIBUI_USDT = "0x3f714fe1380ee2204ca499d1d8a171cbdfc39eaa"; -const Boba_4Koyo = "0xDAb3Fc342A242AdD09504bea790f9b026Aa1e709"; - -const CHAIN_ORGANISED_DATA = { - boba: () => { - - return [ - { - treasuryTokens: [ - [Boba_BOBA, false], - [Boba_USDT, false], - [Boba_SHIBUI_WETH, true], - [Boba_SHIBUI_USDT, true], - ], - treasuryKoyoTokens: [Boba_4Koyo], - treasuryAddresses: [ - "0x9596E01Ad72d2B0fF13fe473cfcc48D3e4BB0f70", // Hot treasury - ], - gaugeTokens: [Boba_SHIBUI_USDT], - gaugeAddresses: [ - "0x6b8f4Fa6E44e923f5A995A87e4d79B3Bb9f8aaa3", // SHIBUI-USDT<>WAGMIv3 - ], - }, - true, - ]; - }, -}; module.exports = { - start: 394825, - boba: { - tvl: async (timestamp, _ethBlock, chainBlocks) => { - const chain = CHAINS[0]; - const [data, koyoAssets] = CHAIN_ORGANISED_DATA[chain](); - - const balances = {}; - const block = chainBlocks[chain]; - - await sumTokensAndLPsSharedOwners( - balances, - data.treasuryTokens, - data.treasuryAddresses, - block, - chain - ); - - return balances; + tvl: async (api) => { + return api.sumTokens({ owners: [ + "0x9596E01Ad72d2B0fF13fe473cfcc48D3e4BB0f70", // Hot treasury + ], tokens: [ + Boba_BOBA, + Boba_USDT, + Boba_SHIBUI_WETH, + Boba_SHIBUI_USDT, + ] }); }, }, } diff --git a/projects/treasury/sideshift-ai.js b/projects/treasury/sideshift-ai.js index 4fb7c838ee..1a65e39aff 100644 --- a/projects/treasury/sideshift-ai.js +++ b/projects/treasury/sideshift-ai.js @@ -1,11 +1,28 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { nullAddress, treasuryExports } = require("../helper/treasury"); +const owners = ['0x8f456e525ed0115e22937c5c8afac061cc697f21'] + module.exports = treasuryExports({ ethereum: { tokens: [ nullAddress, ], - owners: ['0x8f456e525ed0115e22937c5c8afac061cc697f21'], + owners, + ownTokens: [], + }, + mantle: { + tokens: [ + "0xcda86a272531e8640cd7f1a92c01839911b90bb0", + ADDRESSES.bob.FBTC + ], + owners, + ownTokens: [], + }, + arbitrum: { + tokens: [ + ], + owners, ownTokens: [], }, }) \ No newline at end of file diff --git a/projects/treasury/taraxa.js b/projects/treasury/taraxa.js new file mode 100644 index 0000000000..c9abce64d9 --- /dev/null +++ b/projects/treasury/taraxa.js @@ -0,0 +1,9 @@ +const { sumTokens2, nullAddress } = require('../helper/unwrapLPs') + +module.exports = { + tara: { + tvl: async (api) => { + return sumTokens2({ api, tokens: [nullAddress], owners: ['0x723304d1357a2334fcf902aa3d232f5139080a1b'] }) + } + } +} diff --git a/projects/treasury/typus-finance.js b/projects/treasury/typus-finance.js new file mode 100644 index 0000000000..b5527cb22f --- /dev/null +++ b/projects/treasury/typus-finance.js @@ -0,0 +1,8 @@ +const { treasuryExports } = require("../helper/treasury"); + +module.exports = treasuryExports({ + sui: { + owners: ['0xb9a09efd534d29cc9f990db26b2dab00289f32de0cdcefa68c6808de208bc9cb'], + ownTokens: ['0xf82dc05634970553615eef6112a1ac4fb7bf10272bf6cbe0f80ef44a6c489385::typus::TYPUS'], + }, +}) \ No newline at end of file diff --git a/projects/treasury/umamifinance.js b/projects/treasury/umamifinance.js index 31ad7cfa38..e42dd9e6ef 100644 --- a/projects/treasury/umamifinance.js +++ b/projects/treasury/umamifinance.js @@ -44,6 +44,11 @@ module.exports = treasuryExports({ ADDRESSES.ethereum.USDC,//usdc ], owners: [ethowners] - }, }); + +module.exports.deadFrom = '2024-08-30' +module.exports.ethereum.tvl = () => ({}) +module.exports.ethereum.ownTokens = () => ({}) +module.exports.arbitrum.tvl = () => ({}) +module.exports.arbitrum.ownTokens = () => ({}) diff --git a/projects/treasury/unore.js b/projects/treasury/unore.js index d12966f9d2..e4b371641d 100644 --- a/projects/treasury/unore.js +++ b/projects/treasury/unore.js @@ -2,6 +2,7 @@ const ADDRESSES = require("../helper/coreAssets.json"); const { treasuryExports, nullAddress } = require("../helper/treasury"); const multisig='0x46488d2D36D8983de980Ff3b9f046DCd0a9DC2ae'; const multisig2='0x4aede441085398BD74FeB9eeFCfe08E709e69ABF' +const multisig3= '0xacd5009f13a5b4f874d61b2a1e20241ea7a7b953'; const UNO = "0x474021845c4643113458ea4414bdb7fb74a01a77"; @@ -14,7 +15,7 @@ module.exports = treasuryExports({ ADDRESSES.ethereum.WETH,//WETH ADDRESSES.ethereum.USDT,//USDT ], - owners: [multisig,multisig2], + owners: [multisig,multisig2, multisig3], ownTokens: [UNO], }, }); diff --git a/projects/treasury/venus.js b/projects/treasury/venus.js index 6933612a32..c14df2d5e3 100644 --- a/projects/treasury/venus.js +++ b/projects/treasury/venus.js @@ -60,4 +60,13 @@ module.exports = treasuryExports({ owners: [venusTreasury], ownTokens: [XVS, VAI], }, + era: { + tokens: [ + ADDRESSES.era.WBTC, + ADDRESSES.era.ZK, + ADDRESSES.era.USDC, + ADDRESSES.era.WETH + ], + owners: ['0xB2e9174e23382f7744CebF7e0Be54cA001D95599'] + } }); diff --git a/projects/treasury/yamfore.js b/projects/treasury/yamfore.js new file mode 100644 index 0000000000..72c8be11ae --- /dev/null +++ b/projects/treasury/yamfore.js @@ -0,0 +1,40 @@ +const { sumTokens2 } = require("../helper/chain/cardano"); +const { assetsAddresses } = require('../helper/chain/cardano/blockfrost'); +const { nullAddress } = require("../helper/tokenMapping"); + +async function adaHandleToAddress(handle) { + // https://docs.adahandle.com/reference/api-reference/cardano-node + const policyID = 'f0ff48bbb7bbe9d59a40f1ce90e9e9d0ff5002ec48f232b49ca0fb9a'; + const assetName = Buffer.from(handle).toString('hex'); + const [holder] = await assetsAddresses(`${policyID}000de140${assetName}`) + return holder.address +} + +async function tvl() { + // const TREASURY_ADDRESS = await adaHandleToAddress('bigblymp') + const TREASURY_ADDRESS = 'addr1qx2m86m788l8zrcc6ecfg0yq698s2ryqpz3c52z2ratw5jh8yqevyugcr8w4ezlj3sry6798h9ynqjgce3mqfwxfma9qts79w0' + + return sumTokens2({ + owners: [TREASURY_ADDRESS,], tokens: [ + nullAddress, + 'c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d' + ], + }) +} + +async function ownTokens() { + // const TREASURY_ADDRESS = await adaHandleToAddress('bigblymp') + const TREASURY_ADDRESS = 'addr1qx2m86m788l8zrcc6ecfg0yq698s2ryqpz3c52z2ratw5jh8yqevyugcr8w4ezlj3sry6798h9ynqjgce3mqfwxfma9qts79w0' + + return sumTokens2({ + owners: [TREASURY_ADDRESS,], tokens: [ + 'ee0633e757fdd1423220f43688c74678abde1cead7ce265ba8a24fcd43424c50', + ], + }) +} + +module.exports = { + cardano: { + tvl, ownTokens, + }, +}; diff --git a/projects/treehouse/index.js b/projects/treehouse/index.js new file mode 100644 index 0000000000..62478f3126 --- /dev/null +++ b/projects/treehouse/index.js @@ -0,0 +1,59 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { sumTokens2 } = require('../helper/unwrapLPs') + + +async function getInFlightLidoRedemptionNav(api) { + const unStEth = '0x889edc2edab5f40e902b864ad4d7ade8e412f9b1'; + const strategy = '0x60d2D94aCB969CA54e781007eE89F04c1A2e5943'; + const navHelper = '0xf22Ca896427677507a9EF99D30B261659775ff56'; + + const requestIds = await api.call({ + abi: "function getWithdrawalRequests(address _owner) external view returns (uint256[] memory requestsIds)", + target: unStEth, + chain: 'ethereum', + params: [strategy] +}); + + +// NAV of lido in-flight redemptions in wstETH. +const nav = await api.call({ + abi: 'function getLidoRedemptionsNav(uint[], address) external view returns (uint)', + target: navHelper, + chain: 'ethereum', + params: [requestIds, strategy] +}) + +api.add(ADDRESSES.ethereum.WSTETH, nav) +} + + +async function tvl(api) { + const vault = '0x551d155760ae96050439ad24ae98a96c765d761b' + const tokens = await api.call({ abi: 'address[]:getAllowableAssets', target: vault }) + await api.sumTokens({ owner: vault, tokens }) + + await getInFlightLidoRedemptionNav(api) + + const storage = await api.call({ abi: 'address:strategyStorage', target: vault }) + const strategies = await api.fetchList({ lengthAbi: 'getStrategyCount', itemAbi: 'getStrategyAddress', target: storage }) + return sumTokens2({ + api, owners: strategies, fetchCoValentTokens: true, resolveUniV3: true, tokenConfig: { + onlyWhitelisted: false, + } + }) +} + +async function tvlMantle(api) { + return api.sumTokens({ owner: '0x5E4ACCa7a9989007cD74aE4ed1b096c000779DCC', tokens: ['0xE6829d9a7eE3040e1276Fa75293Bde931859e8fA'] }) +} + +module.exports = { + methodology: 'Token balance in vault and strategy contracts', + start: '2024-09-10', // Tuesday, September 10, 2024 12:00:00 AM, + ethereum: { + tvl, + }, + mantle: { + tvl: tvlMantle + } +} \ No newline at end of file diff --git a/projects/treehousefinance/index.js b/projects/treehousefinance/index.js index 86ec1db83e..72790351cf 100644 --- a/projects/treehousefinance/index.js +++ b/projects/treehousefinance/index.js @@ -8,5 +8,6 @@ module.exports = { methodology: "TVL includes all farms in MasterChef contract", hallmarks: [ [1647043200, "Rug Pull"] - ] + ], + deadFrom: '2022-03-12' } \ No newline at end of file diff --git a/projects/tren-finance/index.js b/projects/tren-finance/index.js new file mode 100644 index 0000000000..482491b2eb --- /dev/null +++ b/projects/tren-finance/index.js @@ -0,0 +1,44 @@ +const SSL = ['0xDC4a311f0D852934d9b51C0eAc7c7e13EA1DF11b', '0xDFF4a68044eb68c60354810E9316B2B6DB88B3eb'] + +async function tvl(api) { + const stables = await api.multiCall({ abi: 'address:stable', calls: SSL }) + await api.sumTokens({ tokensAndOwners2: [stables, SSL] }) + const hyperPools = ['0xDC4a311f0D852934d9b51C0eAc7c7e13EA1DF11b'] + + const vaults = await api.multiCall({ abi: 'address:vault', calls: hyperPools }) + const vaultBalances = await api.multiCall({ abi: 'erc20:balanceOf', calls: vaults.map((v, i) => ({ target: v, params: hyperPools[i] })) }) + const vaultSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: vaults }) + const vToken0s = await api.multiCall({ abi: 'address:token0', calls: vaults }) + const vToken1s = await api.multiCall({ abi: 'address:token1', calls: vaults }) + const vTokenAmounts = await api.multiCall({ abi: 'function getTotalAmounts() view returns (uint256 total0, uint256 total1)', calls: vaults }) + + vaults.forEach((_vault, i) => { + const token0 = vToken0s[i] + const token1 = vToken1s[i] + const { total0, total1, } = vTokenAmounts[i] + const ratio = vaultBalances[i] / vaultSupplies[i] + api.add(token0, total0 * ratio) + api.add(token1, total1 * ratio) + }) + + const curvePoolVaults = ['0xDFF4a68044eb68c60354810E9316B2B6DB88B3eb'] + const curvePools = await api.multiCall({ abi: 'address:curvePool', calls: curvePoolVaults }) + const cBalances = await api.multiCall({ abi: 'erc20:balanceOf', calls: curvePools.map((v, i) => ({ target: v, params: curvePoolVaults[i] })) }) + const cSupplies = await api.multiCall({ abi: 'uint256:totalSupply', calls: curvePools }) + + + for (const cPool of curvePools) { + const i = curvePools.indexOf(cPool) + const cTokens = await api.fetchList({ lengthAbi: 'N_COINS', itemAbi: 'coins', target: cPool }) + const ratio = cBalances[i] / cSupplies[i] + const bals = await api.multiCall({ abi: 'erc20:balanceOf', calls: cTokens.map((v) => ({ target: v, params: cPool })) }) + for (let j=0; j { + const { factory, fromBlock } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: 'event MarketCreatedWithDescription (address marketAddress, string marketQuestion, string marketSource, string additionalInfo, uint256 endOfTrading, uint256 yesNoTokenCap, address marketOwner)', fromBlock, }) + const markets = logs.map(log => log.marketAddress) + const tokens = await api.multiCall({ abi: 'address:paymentToken', calls: markets}) + return api.sumTokens({ tokensAndOwners2: [tokens, markets]}) + } + } +}) \ No newline at end of file diff --git a/projects/trufin-trustake/index.js b/projects/trufin-trustake/index.js index c9a9b38a22..6b4618b127 100644 --- a/projects/trufin-trustake/index.js +++ b/projects/trufin-trustake/index.js @@ -1,5 +1,7 @@ const ADDRESSES = require('../helper/coreAssets.json') const { function_view } = require('../helper/chain/aptos') +const { call: near_call } = require('../helper/chain/near') +const { queryContract } = require('../helper/chain/cosmos') const TRUSTAKE_APT_CONTRACT_ADDR = "0x6f8ca77dd0a4c65362f475adb1c26ae921b1d75aa6b70e53d0e340efd7d8bc80" const MODULE = "staker" @@ -7,7 +9,7 @@ const FUNCTION = "total_staked" async function aptosTvl(api) { const totalStaked = await function_view({ functionStr: `${TRUSTAKE_APT_CONTRACT_ADDR}::${MODULE}::${FUNCTION}` }) - api.add(ADDRESSES.aptos.APT, totalStaked[0]) + api.add(ADDRESSES.aptos.APT, totalStaked) } const abi = { @@ -27,12 +29,32 @@ async function tvl(api) { api.add(MATIC_TOKEN_ADDR, (totalSupply * sharePrice) + +dust) } +const TRUSTAKE_NEAR_CONTRACT_ADDR = "staker1.msig1.trufin.near" + +async function nearTvl() { + const totalStaked = await near_call(TRUSTAKE_NEAR_CONTRACT_ADDR, 'get_total_staked', {}) + return { near: totalStaked[0] / 1e24 } +} + +const TRUSTAKE_INJ_CONTRACT_ADDR = "inj1x997dy6ka7y8u0r56yk2k83llspy33yet9zcnq" + +async function injectiveTvl(api) { + const { total_staked } = await queryContract({ contract: TRUSTAKE_INJ_CONTRACT_ADDR, chain: "injective", data: '{"get_total_staked": {}}'}) + api.add(ADDRESSES.injective.INJ, total_staked) +} + module.exports = { - methodology: `Counts the TVL of MATIC tokens in TruFin's TruStake vault.`, + methodology: `Counts the TVL of native tokens across all TruStake vaults.`, ethereum: { tvl }, aptos: { tvl: aptosTvl + }, + near: { + tvl: nearTvl + }, + injective: { + tvl: injectiveTvl } } diff --git a/projects/trufin/index.js b/projects/trufin/index.js index ab7a53a3ab..c363ce56e1 100644 --- a/projects/trufin/index.js +++ b/projects/trufin/index.js @@ -13,7 +13,7 @@ async function tvl(api) { } module.exports = { - methodology: `Counts the TVL of MATIC tokens in TruFin's TruStake vault.`, + methodology: `Counts the TVL of MATIC tokens in TruFin's Legacy vaults.`, ethereum: { tvl } diff --git a/projects/tsunami-fi/index.js b/projects/tsunami-fi/index.js index e6eec999ca..98eac221aa 100644 --- a/projects/tsunami-fi/index.js +++ b/projects/tsunami-fi/index.js @@ -2,7 +2,7 @@ const { gmxExports } = require("../helper/gmx"); const { function_view, hexToString } = require("../helper/chain/aptos"); async function tvl(api) { - const [data] = await function_view({ + const data = await function_view({ functionStr: "0x1786191d0ce793debfdef9890868abdcdc7053f982ccdd102a72732b3082f31d::basket::get_all_basket_coins_by_basket", type_arguments: [ @@ -13,7 +13,6 @@ async function tvl(api) { ({ coin_type_info: { account_address, module_name, struct_name }, reserve_amount, - margin_occupied_amount, }) => { const token = `${account_address}::${hexToString( module_name diff --git a/projects/twtstake/index.js b/projects/twtstake/index.js index d9f6c3aa43..cb11610db3 100644 --- a/projects/twtstake/index.js +++ b/projects/twtstake/index.js @@ -7,7 +7,6 @@ module.exports = { [1681948800, "TWTStake Flagged on Twitter"] ], methodology: 'Counts the number of TWT tokens in the TWT Stake contract.', - start: 1000235, bsc: { tvl: () => 0, staking: staking(TWT_STAKE_CONTRACT,TWT_TOKEN_CONTRACT) diff --git a/projects/txBridge/index.js b/projects/txBridge/index.js index 3c27fe9844..a58abcc44a 100644 --- a/projects/txBridge/index.js +++ b/projects/txBridge/index.js @@ -1,16 +1,7 @@ -const { sumTokens2 } = require("../helper/unwrapLPs"); +const getTvl = require("./util") module.exports = { ethereum: { - tvl: (api) => - sumTokens2({ - api, - owners: [ - "0x32400084C286CF3E17e7B677ea9583e60a000324", - "0x57891966931Eb4Bb6FB81430E6cE0A03AAbDe063", - "0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB" - ], - fetchCoValentTokens: true, - }), + tvl: async (api) => getTvl(api, { chainId: 324, }), }, -}; +} diff --git a/projects/txBridge/util.js b/projects/txBridge/util.js new file mode 100644 index 0000000000..bbff27fda1 --- /dev/null +++ b/projects/txBridge/util.js @@ -0,0 +1,20 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +const _target = "0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB" +const gasQuery = '0x0000000000000000000000000000000000000001' +const gasAddress = '0x0000000000000000000000000000000000000000' + +module.exports = async (api, { chainId, target = _target } = {}) => { + const totalBalances = await sumTokens2({ api, owner: target, fetchCoValentTokens: true, balances: {} }) + const tokens = Object.keys(totalBalances).map(token => token.split(':')[1]).filter(token => token !== gasAddress) + tokens.unshift(gasQuery) + const balances = (await api.multiCall({ + target, + calls: tokens.map(token => ({ params: [chainId, token] })), + abi: "function chainBalance(uint256 chainId, address l1Token) view returns (uint256 balance)", + permitFailure: true, + })).map(i => i ?? 0) + tokens[0] = gasAddress + api.add(tokens, balances) + return api.getBalances() +} diff --git a/projects/typus-finance/index.js b/projects/typus-finance/index.js index a0cad66122..50a9549513 100644 --- a/projects/typus-finance/index.js +++ b/projects/typus-finance/index.js @@ -1,18 +1,16 @@ const sui = require("../helper/chain/sui"); const SINGLE_DEPOSIT_VAULT_REGISTRY = "0xd67cf93a0df61b4b3bbf6170511e0b28b21578d9b87a8f4adafec96322dd284d"; +const REFUND_VAULT_REGISTRY ="0xf9acfc0a06094f6515c4392ffef84d40cd5f1d72bc74cbde3ee99dd7bca6cf3f" const fud_token = "0x76cb819b01abed502bee8a702b4c2d547532c12f25001c9dea795a5e631c26f1::fud::FUD"; const V1_SINGLE_DEPOSIT_VAULT_REGISTRY = "0x4ae62c4d67f9f5d7077626fcc6d450535c4df710da455a0a2bd2226558832629"; const V1_SINGLE_BID_VAULT_REGISTRY = "0x2c8cdd00ced47e717420cd2fc54990b3b38e115e34a9209271063a59ddeeb059"; async function tvl(api) { - const depositVaultFields = await sui.getDynamicFieldObjects({ + const depositVaults = await sui.getDynamicFieldObjects({ parent: SINGLE_DEPOSIT_VAULT_REGISTRY, }); - const depositVaultIds = depositVaultFields.map((item) => item.fields.id.id); - const depositVaults = await sui.getObjects(depositVaultIds); - depositVaults.forEach(({ fields }) => { const deposit_token = "0x" + fields.deposit_token.fields.name; const bid_token = "0x" + fields.bid_token.fields.name; @@ -40,10 +38,7 @@ async function tvl(api) { parent: V1_SINGLE_DEPOSIT_VAULT_REGISTRY, }); - const v1depositVaultIds = v1depositVaultFields.map((item) => item.fields.id.id); - const v1depositVaults = await sui.getObjects(v1depositVaultIds); - - v1depositVaults.forEach( + v1depositVaultFields.forEach( ({ type, fields: { @@ -62,11 +57,7 @@ async function tvl(api) { parent: V1_SINGLE_BID_VAULT_REGISTRY, }); - const v1bidVaultIds = v1bidVaultFields.map((item) => item.fields.id.id); - - const v1bidVaults = await sui.getObjects(v1bidVaultIds); - - v1bidVaults.forEach( + v1bidVaultFields.forEach( ({ type, fields: { @@ -79,6 +70,16 @@ async function tvl(api) { api.add(coin, fields.performance_fee_sub_vault.fields.balance); } ); + + // Add Refund Vaults TVL + const refundVaultFields = await sui.getDynamicFieldObjects({ + parent: REFUND_VAULT_REGISTRY, + }); + + refundVaultFields.forEach(({ fields }) => { + const token = "0x" + fields.token.fields.name; + api.add(token, fields.share_supply); + }); } module.exports = { diff --git a/projects/typus-safu/index.js b/projects/typus-safu/index.js new file mode 100644 index 0000000000..28f79c2daf --- /dev/null +++ b/projects/typus-safu/index.js @@ -0,0 +1,36 @@ +const sui = require("../helper/chain/sui"); + +const SAFU_REGISTRY = "0xdc970d638d1489385e49ddb76889748011bac4616b95a51aa63633972b841706"; +const FUNDING_VAULT_REGISTRY = "0xeb9e1c94b72cd3e1a4ca2e4d6e9dd61547c0c45c654843e0db03c50ba3c21138"; + +async function tvl(api) { + // Safu Vaults + const fields = await sui.getDynamicFieldObjects({ + parent: SAFU_REGISTRY, + }); + const safuVaults = fields.filter((item) => item.type.includes("Vault")); + + safuVaults.forEach(({ fields }) => { + const deposit_token = "0x" + fields.deposit_token.fields.name; + api.add(deposit_token, fields.share_supply.slice(0, 4)); + }); + + // Safu Funding Vults + const fields2 = await sui.getDynamicFieldObjects({ + parent: FUNDING_VAULT_REGISTRY, + }); + const safuFundingVaults = fields2.filter((item) => item.type.includes("Vault")); + + safuFundingVaults.forEach(({ fields }) => { + const deposit_token = "0x" + fields.token.fields.name; + api.add(deposit_token, fields.info[1]); + }); +} + +module.exports = { + timetravel: false, + doublecounted: true, + sui: { + tvl, + }, +}; diff --git a/projects/ubeswap-v3/index.js b/projects/ubeswap-v3/index.js new file mode 100644 index 0000000000..fe4a7bb7b5 --- /dev/null +++ b/projects/ubeswap-v3/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + celo: { factory: '0x67FEa58D5a5a4162cED847E13c2c81c73bf8aeC4', fromBlock: 25639915, }, +}) \ No newline at end of file diff --git a/projects/ulysses/index.js b/projects/ulysses/index.js new file mode 100644 index 0000000000..9e9bf5b14d --- /dev/null +++ b/projects/ulysses/index.js @@ -0,0 +1,27 @@ +const { sumTokensExport } = require("../helper/unwrapLPs") +const ADDRESSES = require('../helper/coreAssets.json') + +const defaultPort = '0x0000151d008235A6cC00004F00FA2bDF9dF95400' +const ports = { + arbitrum: '0x79f4b04FFCa54BC946aa0ef8E33eE723467f0192', + ethereum: undefined, + optimism: undefined, + base: undefined, + polygon: undefined, + avax: undefined, + bsc: undefined, + // metis: undefined, +} + +Object.keys(ports).forEach(chain => module.exports[chain] = { tvl: sumTokensExport({ owner: ports[chain] ?? defaultPort, fetchCoValentTokens: true, }) }) + +const chainsWithCovalentSupport = { + metis: { tokens: Object.values(ADDRESSES.metis).concat([ + ADDRESSES.null, + ])} +} + +Object.keys(chainsWithCovalentSupport).forEach(chain => { + const { tokens, port =defaultPort } = chainsWithCovalentSupport[chain] + module.exports[chain] = { tvl: sumTokensExport({ owner: port, tokens }) +} }) \ No newline at end of file diff --git a/projects/umamifinance/abi.json b/projects/umamifinance/abi.json deleted file mode 100644 index dda88359ca..0000000000 --- a/projects/umamifinance/abi.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "totalAssets": "uint256:totalAssets" -} \ No newline at end of file diff --git a/projects/umamifinance/index.js b/projects/umamifinance/index.js index 7efb67a8d7..5e8053f319 100644 --- a/projects/umamifinance/index.js +++ b/projects/umamifinance/index.js @@ -1,6 +1,5 @@ -const ADDRESSES = require('../helper/coreAssets.json') const { stakings } = require("../helper/staking"); -const abi = require("./abi.json"); +const { sumERC4626VaultsExport } = require("../helper/erc4626"); const UMAMI = "0x1622bf67e6e5747b81866fe0b85178a93c7f86e3"; // UMAMI staking for protocol revenue in WETH @@ -8,35 +7,37 @@ const mUMAMI = "0x2adabd6e8ce3e82f52d9998a7f64a90d294a92a4"; // UMAMI staking from when it was still ohm fork with rebasing mechanics. // There's still some staked tokens that are yet not unstaked and migrated. const OHM_STAKING_sUMAMI = "0xc9ecFeF2fac1E38b951B8C5f59294a8366Dfbd81"; -// glpUSDC vault is now deprecated -const glpUSDC = "0x2e2153fd13459eba1f277ab9acd624f045d676ce"; -const USDC = ADDRESSES.arbitrum.USDC; -const v2Vaults = [ +// glp vaults are now deprecated as well +const glpVaults = [ + "0x2e2153fd13459eba1f277ab9acd624f045d676ce", "0x727eD4eF04bB2a96Ec77e44C1a91dbB01B605e42", "0xbb84D79159D6bBE1DE148Dc82640CaA677e06126", "0x6a89FaF99587a12E6bB0351F2fA9006c6Cd12257", "0xe0A21a475f8DA0ee7FA5af8C1809D8AC5257607d", "0x37c0705A65948EA5e0Ae1aDd13552BCaD7711A23", +] + +const gmVaultsArbitrum = [ "0x959f3807f0Aa7921E18c78B00B2819ba91E52FeF", // gmUSDC "0x4bCA8D73561aaEee2D3a584b9F4665310de1dD69", // gmWETH "0x5f851F67D24419982EcD7b7765deFD64fBb50a97", // BTC gmUSDC "0xcd8011AaB161A75058eAb24e0965BAb0b918aF29", // gmWBTC ]; +const gmVaultsAvax = [ + "0x4f3274C3889e6cD54C9c739757Ab8EA4b246D76b", // WETH gmUSDC + "0xFCE0A462585A422Bac0ca443B102D0ac1Ff20f9e", // gmWETH +]; + module.exports = { doublecounted: true, - start: 1657027865, // UMAMI deployment block ts + start: '2022-07-05', // UMAMI deployment block ts arbitrum: { staking: stakings([mUMAMI, OHM_STAKING_sUMAMI], UMAMI), - tvl: async (api) => { - - const totalAssets = await api.call({ abi: abi.totalAssets, target: glpUSDC, }); - api.add(USDC, totalAssets); - - const assets = await api.multiCall({ abi: 'address:asset', calls: v2Vaults }); - const bals = await api.multiCall({ abi: 'uint256:totalAssets', calls: v2Vaults }); - api.add(assets, bals) - }, + tvl: sumERC4626VaultsExport({ vaults: glpVaults.concat(gmVaultsArbitrum), isOG4626: true }), }, -}; + avax: { + tvl: sumERC4626VaultsExport({ vaults:gmVaultsAvax, isOG4626: true }), + } +} diff --git a/projects/umbrella/index.js b/projects/umbrella/index.js index 7b6435453d..6d3eddcaa2 100644 --- a/projects/umbrella/index.js +++ b/projects/umbrella/index.js @@ -1,23 +1,39 @@ const { staking } = require("../helper/staking"); +const { pool2 } = require("../helper/pool2"); -const stakingContract = "0xDa9A63D77406faa09d265413F4E128B54b5057e0"; -const UMB = "0x6fC13EACE26590B80cCCAB1ba5d51890577D83B2"; -const pool2StakingContract = "0x885EbCF6C2918BEE4A2591dce76da70e724f9a8E"; +const UMB_eth = "0x6fC13EACE26590B80cCCAB1ba5d51890577D83B2"; const UMB_WETH_UNIV2 = "0xB1BbeEa2dA2905E6B0A30203aEf55c399C53D042"; -const stakingContract_bsc = "0x648F235ec0C24fe170BD0822d2FEf442880A25EE"; const UMB_bsc = "0x846F52020749715F02AEf25b5d1d65e48945649D"; +const UMB_WBNB_PCSV2 = "0xFfD8eEFb9F0Ba3C60282fd3E6567A2C78C994266"; + +const ethPools = [ + '0xDa9A63D77406faa09d265413F4E128B54b5057e0', '0x5A2697C772d6062Eb2005e84547Ec4a36cCb3B52', '0x2d9D79B3189377449aB2AA4bBD2cd2651e0b85BE', +]; + +const ethLpPools = [ + '0x885EbCF6C2918BEE4A2591dce76da70e724f9a8E', '0xa67cbdAd80C34e50F5DE96730f658910f52b2F8c', '0xB67D91E38fbA6CfCb693d3f4598F8bd1e6e68AE3', +]; + +const bscPools = [ + '0x1541A01c407dCf88f32659D2C4A21Bb5763Fd2B4', '0x53Fa13Fa6c803d5fF6bDAe06bf6Bc12EdF1e343d', '0x55881395d209397b0c00bCeBd88abC1386f7aBe7', +]; + +const bscLpPools = [ + '0x8c7e186ce08F1f2585193b1c10799F42966BD7FF', '0xdCbcDb9bFAD7B0A08306aF10Aa11c3c3b6470921', '0x6Ff6B943D20B611E81a581c1E7951A6Dc0AC3455', +]; + module.exports = { - misrepresentedTokens: true, ethereum: { - tvl: (async) => ({}), - staking: staking(stakingContract, UMB), - pool2: staking(pool2StakingContract, UMB_WETH_UNIV2), + tvl: () => ({}), + staking: staking(ethPools, UMB_eth), + pool2: pool2(ethLpPools, UMB_WETH_UNIV2), }, bsc: { - staking: staking(stakingContract_bsc, UMB_bsc), + staking: staking(bscPools, UMB_bsc,), + pool2: pool2(bscLpPools, UMB_WBNB_PCSV2,), }, - methodology: "Counts liquidty on the staking and pool2 only", -}; + methodology: "Counts liquidty on the staking pools (v1, v2 and v3) on Eth and BSC (https://staking.umb.network/)", +}; \ No newline at end of file diff --git a/projects/umoja-ybtc/index.js b/projects/umoja-ybtc/index.js new file mode 100644 index 0000000000..63c4d30eb9 --- /dev/null +++ b/projects/umoja-ybtc/index.js @@ -0,0 +1,11 @@ +const yBTC = "0xba3e932310cd1dbf5bd13079bd3d6bae4570886f" + +//BASIS TRADING, BTC COLLECTOR WALLET IS bc1qmus43e5gascs00t7jsf02k7gllhc5antew6n5y +module.exports = { + arbitrum: { + tvl: async (api) => { + const supply = await api.call({ abi: 'erc20:totalSupply', target: yBTC }) + api.add(yBTC, supply) + }, + } +} \ No newline at end of file diff --git a/projects/unagiswap/index.js b/projects/unagiswap/index.js new file mode 100644 index 0000000000..3573de6dbe --- /dev/null +++ b/projects/unagiswap/index.js @@ -0,0 +1,38 @@ +const { getLogs } = require('../helper/cache/getLogs') +const ADDRESSES = require('../helper/coreAssets.json') + +const config = { + taiko: { dvmFactory: '0x6694eebf40924e04c952EA8F1626d19E7a656Bb7', fromBlock: 452910, dspFactory: '0xd0de7cA3298fff085E2cb82F8a861a0254256BA0', gspFactory: '0x2235bB894b7600F1a370fc595Ee5477999A30441', dppFactory: '0x297A4885a7da4AaeF340FABEd119e7a6E3f2BCe8' }, + } + +Object.keys(config).forEach(chain => { + const { dvmFactory, fromBlock, dspFactory, gspFactory, dppFactory, blacklistedTokens, } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const ownerTokens = [] + const funcs = []; + const builder = (factorys, event) => { + if (Array.isArray(factorys)) { + factorys.forEach(factory => funcs.push(addLogs(factory, event))); + } else { + funcs.push(addLogs(factorys, event)); + } + } + builder(dvmFactory, 'event NewDVM (address baseToken, address quoteToken, address creator, address pool)'); + builder(dspFactory, 'event NewDSP(address baseToken, address quoteToken, address creator, address pool)'); + builder(gspFactory, 'event NewGSP(address baseToken, address quoteToken, address creator, address pool)'); + builder(dppFactory, 'event NewDPP (address baseToken, address quoteToken, address creator, address pool)'); + + await Promise.all(funcs) + + return api.sumTokens({ ownerTokens, blacklistedTokens, permitFailure: true, }) + + async function addLogs(target, eventAbi) { + if (!target) return; + const convert = i => [[i.baseToken, i.quoteToken], i.pool] + let logs = await getLogs({ api, target, eventAbi, onlyArgs: true, fromBlock, }); + ownerTokens.push(...logs.map(convert)) + } + } + } +}) \ No newline at end of file diff --git a/projects/unbk/index.js b/projects/unbk/index.js index a3014df280..53a9da7f90 100644 --- a/projects/unbk/index.js +++ b/projects/unbk/index.js @@ -46,7 +46,6 @@ async function tvl(timestamp, block, chainBlocks) { module.exports = { methodology: "Accross different vaults, counts the total number of assets accumulated on each of them", - start: 33000000, fantom: { tvl, }, diff --git a/projects/unclesam.js b/projects/unclesam.js index 2be1b9b90f..c6cbda4888 100644 --- a/projects/unclesam.js +++ b/projects/unclesam.js @@ -2,9 +2,7 @@ const { compoundExports } = require("./helper/compound"); const unitroller = "0x0cDD860ca594982443E737AC7A0B84f18C477E05"; module.exports = { - methodology: - "Same as Compound Finance", - base: { - ...compoundExports(unitroller, "base"), - }, + base: compoundExports(unitroller), + deadFrom: "2023-08-27" }; +module.exports.base.borrowed = () => ({}) // bad debt diff --git a/projects/unfederalreserve/index.js b/projects/unfederalreserve/index.js index baf5f92b33..4fce65cb1d 100644 --- a/projects/unfederalreserve/index.js +++ b/projects/unfederalreserve/index.js @@ -1,4 +1,6 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const {fullCoumpoundExports} = require('../helper/compound') +const { compoundExports2 } = require('../helper/compound'); -module.exports=fullCoumpoundExports("0x3105D328c66d8d55092358cF595d54608178E9B5", "ethereum", "0xFaCecE87e14B50eafc85C44C01702F5f485CA460", ADDRESSES.ethereum.WETH) \ No newline at end of file +module.exports.deadFrom='2023-11-12' +module.exports.ethereum = compoundExports2({ comptroller: '0x3105D328c66d8d55092358cF595d54608178E9B5', cether: '0xFaCecE87e14B50eafc85C44C01702F5f485CA460' }) + +module.exports.ethereum.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/unibtc/index.js b/projects/unibtc/index.js index 1696cbbf24..447ab951ff 100644 --- a/projects/unibtc/index.js +++ b/projects/unibtc/index.js @@ -1,7 +1,8 @@ const ADDRESSES = require('../helper/coreAssets.json') const defaultVault = '0xF9775085d726E782E83585033B58606f7731AB18' +const extraVault = '0x84E5C854A7fF9F49c888d69DECa578D406C26800' -const fbtc0 = '0xc96de26018a54d51c097160568752c4e3bd6c364' +const fbtc0 = ADDRESSES.bob.FBTC const fbtc1 = '0xd681C5574b7F4E387B608ed9AF5F5Fc88662b37c' const config = { @@ -9,6 +10,14 @@ const config = { vault: '0x047D41F2544B7F63A8e991aF2068a363d210d6Da', tokens: [ADDRESSES['ethereum'].WBTC, fbtc0, fbtc1] }, + arbitrum: { + vault: extraVault, + tokens: [ADDRESSES['arbitrum'].WBTC] + }, + mode: { + vault: extraVault, + tokens: [ADDRESSES['mode'].WBTC] + }, optimism: { vault: defaultVault, tokens: [ADDRESSES['optimism'].WBTC] @@ -17,6 +26,18 @@ const config = { vault: defaultVault, tokens: [fbtc0, fbtc1] }, + bob: { + vault: '0x2ac98DB41Cbd3172CB7B8FD8A8Ab3b91cFe45dCf', + tokens: [ADDRESSES['bob'].WBTC] + }, + zeta: { + vault: extraVault, + tokens: [ADDRESSES['zeta'].BTC] + }, + bsc: { + vault: extraVault, + tokens: [fbtc0, ADDRESSES['bsc'].BTCB] + }, bsquared: { vault: defaultVault, tokens: [ADDRESSES.null,ADDRESSES['bsquared'].WBTC] diff --git a/projects/uniiotx/index.js b/projects/uniiotx/index.js index a2099f79f3..acf208282a 100644 --- a/projects/uniiotx/index.js +++ b/projects/uniiotx/index.js @@ -1,6 +1,7 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { nullAddress } = require("../helper/tokenMapping"); -const UNIIOTX_TOKEN_CONTRACT = '0x236f8c0a61dA474dB21B693fB2ea7AAB0c803894'; +const UNIIOTX_TOKEN_CONTRACT = ADDRESSES.bob.uniBTC; const IOTX_STAKING_CONTRACT = "0x2c914Ba874D94090Ba0E6F56790bb8Eb6D4C7e5f"; async function tvl(api) { diff --git a/projects/union-finance/index.js b/projects/union-finance/index.js index daeafe7650..ce9c466c5b 100644 --- a/projects/union-finance/index.js +++ b/projects/union-finance/index.js @@ -1,22 +1,26 @@ - const ADDRESSES = require('../helper/coreAssets.json'); const methodologies = require('../helper/methodologies'); const config = { ethereum: { userManager: "0x49c910Ba694789B58F53BFF80633f90B8631c195", - DAI: ADDRESSES.ethereum.DAI, - uDAI: "0x954F20DF58347b71bbC10c94827bE9EbC8706887", + underlying: ADDRESSES.ethereum.DAI, + uToken: "0x954F20DF58347b71bbC10c94827bE9EbC8706887", }, arbitrum: { userManager: "0xb71F3D4342AaE0b8D531E14D2CF2F45d6e458A5F", - DAI: ADDRESSES.optimism.DAI, - uDAI: "0x954F20DF58347b71bbC10c94827bE9EbC8706887", + underlying: ADDRESSES.arbitrum.DAI, + uToken: "0x954F20DF58347b71bbC10c94827bE9EbC8706887", }, optimism: { userManager: "0x8E195D65b9932185Fcc76dB5144534e0f3597628", - DAI: ADDRESSES.optimism.DAI, - uDAI: "0xE478b5e7A423d7CDb224692d0a816CA146A744b2", + underlying: ADDRESSES.optimism.DAI, + uToken: "0xE478b5e7A423d7CDb224692d0a816CA146A744b2", + }, + base: { + userManager: "0xfd745A1e2A220C6aC327EC55d2Cb404CD939f56b", + underlying: ADDRESSES.base.USDC, + uToken: "0xc2447f36FfdA08E278D25D08Ea91D942f0C2d6ea", }, }; @@ -28,19 +32,19 @@ const abi = { }; async function tvl(api) { - const { userManager, DAI, uDAI } = config[api.chain] + const { userManager, underlying, uToken } = config[api.chain] const bals = await api.batchCall([ { target: userManager, abi: abi.totalStaked }, - { target: uDAI, abi: abi.totalRedeemable }, - { target: uDAI, abi: abi.totalReserves }, + { target: uToken, abi: abi.totalRedeemable }, + { target: uToken, abi: abi.totalReserves }, ]) - bals.forEach(i => api.add(DAI, i)) + bals.forEach(i => api.add(underlying, i)) } async function borrowed(api) { - const { DAI, uDAI } = config[api.chain] - const borrows = await api.call({ target: uDAI, abi: abi.totalBorrows, }) - api.add(DAI, borrows) + const { underlying, uToken } = config[api.chain] + const borrows = await api.call({ target: uToken, abi: abi.totalBorrows, }) + api.add(underlying, borrows) } module.exports = { diff --git a/projects/uniswap-v1/index.js b/projects/uniswap-v1/index.js index 305756f274..2cabc673fe 100644 --- a/projects/uniswap-v1/index.js +++ b/projects/uniswap-v1/index.js @@ -1,13 +1,23 @@ -const { getChainTvl } = require('../helper/getUniSubgraphTvl'); +const { nullAddress } = require('../helper/unwrapLPs') -const v1graph = getChainTvl({ - ethereum: 'ESnjgAG9NjfmHypk4Huu4PVvz55fUwpyrRqHF21thoLJ' -}, "uniswaps", "totalLiquidityUSD") +const uniFactory = '0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95' + +const abi = { + getExchange: "function getExchange(address token) view returns (address)", + getTokenWithId: "function getTokenWithId(uint256 token_id) view returns (address)", + tokenCount: "function tokenCount() view returns (uint256)", +} + +const tvl = async (api) => { + let pools = await api.fetchList({ lengthAbi: abi.tokenCount, itemAbi: abi.getTokenWithId, target: uniFactory, itemAbi2: abi.getExchange, }) + pools = pools.filter(i => i !== nullAddress) + await api.sumTokens({ owners: pools, tokens: [nullAddress] }) + const balancesV2 = api.getBalancesV2() + return balancesV2.clone(2).getBalances() // // Since Uniswap V1 only allowed swaps against ETH, it's enough to know the amount of ETH and multiply it by two to determine the pool's value without needing to know the price of the collateral in question +} module.exports = { misrepresentedTokens: true, - methodology: `Counts the tokens locked on AMM pools, pulling the data from the 'ianlapham/uniswapv2' subgraph`, - ethereum: { - tvl: v1graph("ethereum"), - } -} + methodology: `Counts the tokens in ETH value locked in AMM pools`, + ethereum: { tvl } +} \ No newline at end of file diff --git a/projects/uniswap/index.js b/projects/uniswap/index.js index 9386a131e3..6ce7f47ac1 100644 --- a/projects/uniswap/index.js +++ b/projects/uniswap/index.js @@ -17,7 +17,7 @@ const blacklists = { base: ['0xb17d69c91135516b0256c67e8bd32cd238b56161'], ethereum: ['0xa850478adaace4c08fc61de44d8cf3b64f359bec', '0x055284a4ca6532ecc219ac06b577d540c686669d', '0x8c0411f2ad5470a66cb2e9c64536cfb8dcd54d51', '0x277667eb3e34f134adf870be9550e9f323d0dc24', '0x4c83a7f819a5c37d64b4c5a2f8238ea082fa1f4e', '0x290a6a7460b308ee3f19023d2d00de604bcf5b42', '0x4b5ab61593a2401b1075b90c04cbcdd3f87ce011', '0x582d23c7ec6b59afd041a522ff64ff081e8c0d2d', '0x1f98431c8ad98523631ae4a59f267346ea31f984', '0xaf44e10ed87d90f28bff2d1fbef1f64b090f5ebb', '0xdfef6416ea3e6ce587ed42aa7cb2e586362cbbfa', '0x7e9c15c43f0d6c4a12e6bdff7c7d55d0f80e3e23', '0x1111111becab3c8866712ebf23fc4741010b8dce', '0x77777777b79f2fa437bf526169f98aa0c884c4b7', '0x630d98424efe0ea27fb1b3ab7741907dffeaad78'], arbitrum: ['0xd4d2f4110878a33ea5b97f0665e518253446161a', '0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1',], - polygon: ['0x8d52c2d70a7c28a9daac2ff12ad9bfbf041cd318', '0x1f98431c8ad98523631ae4a59f267346ea31f984', '0xd5302a8ead77b85ea3326b45f4714e0b3432b233', '0xc951ab482ff11d8df636742e1f1c3fc8037427a9',], + polygon: ['0x8d52c2d70a7c28a9daac2ff12ad9bfbf041cd318', '0x1f98431c8ad98523631ae4a59f267346ea31f984', '0xd5302a8ead77b85ea3326b45f4714e0b3432b233', '0xc951ab482ff11d8df636742e1f1c3fc8037427a9', '0xbF7970D56a150cD0b60BD08388A4A75a27777777'], } function v3TvlPaged(chain) { @@ -88,6 +88,12 @@ module.exports = { sei: { factory: "0x75FC67473A91335B5b8F8821277262a13B38c9b3", fromBlock: 79245151 }, mantle: { factory: "0x0d922Fb1Bc191F64970ac40376643808b4B74Df9", fromBlock: 63795918 }, polygon_zkevm: { factory: "0xff83c3c800Fec21de45C5Ec30B69ddd5Ee60DFC2", fromBlock: 8466867 }, + xdai: { factory: "0xe32F7dD7e3f098D518ff19A22d5f028e076489B1", fromBlock: 27416614 }, + bob: { factory: "0xcb2436774C3e191c85056d248EF4260ce5f27A9D", fromBlock: 5188280 }, + lisk: { factory: "0x0d922Fb1Bc191F64970ac40376643808b4B74Df9", fromBlock: 577168 }, + wc: { factory: "0x7a5028BDa40e7B173C278C5342087826455ea25a", fromBlock: 1603366 }, + corn: { factory: "0xcb2436774C3e191c85056d248EF4260ce5f27A9D", fromBlock: 10878 }, + sonic: { factory: "0xcb2436774C3e191c85056d248EF4260ce5f27A9D", fromBlock: 322744}, }), filecoin: { tvl: filecoinTvl }, } diff --git a/projects/unitus/index.js b/projects/unitus/index.js index 16a937ec8d..fd04c5bf50 100644 --- a/projects/unitus/index.js +++ b/projects/unitus/index.js @@ -64,5 +64,5 @@ function chainTvl(chain) { module.exports = { ...generalizedChainExports(chainTvl, Object.keys(allControllers)), - start: 1564165044, // Jul-27-2019 02:17:24 AM +UTC + start: '2019-07-26', // Jul-27-2019 02:17:24 AM +UTC } diff --git a/projects/universe/index.js b/projects/universe/index.js index 6995120515..383b607ecb 100644 --- a/projects/universe/index.js +++ b/projects/universe/index.js @@ -97,5 +97,5 @@ module.exports = { tvl, pool2, }, - start: 1621939189, // May-25-2021 10:39:49 AM +UTC + start: '2021-05-25', // May-25-2021 10:39:49 AM +UTC }; \ No newline at end of file diff --git a/projects/uniwhale/index.js b/projects/uniwhale/index.js index d384ff2f86..ab0ef6fccd 100644 --- a/projects/uniwhale/index.js +++ b/projects/uniwhale/index.js @@ -5,7 +5,7 @@ const UNIWHALE_MARGIN_POOL = "0xBB1B941aB76fAE4e9F552B860eFaC1F367AC9bCc"; const { sumTokensExport } = require('../helper/unwrapLPs') module.exports = { - start: 1677833673, + start: '2023-03-03', bsc: { tvl: sumTokensExport({ owners: [UNIWHALE_LIQUIDITY_POOL, UNIWHALE_MARGIN_POOL, ], tokens: [USDT]}), }, diff --git a/projects/uno-farm/index.js b/projects/uno-farm/index.js index 0e83260959..a3921a6440 100644 --- a/projects/uno-farm/index.js +++ b/projects/uno-farm/index.js @@ -90,7 +90,7 @@ async function tvl(api) { } module.exports = { - start: 1656018000, + start: '2022-06-23', polygon: { tvl, }, diff --git a/projects/unore/index.js b/projects/unore/index.js index 09b5f13902..344334bc92 100644 --- a/projects/unore/index.js +++ b/projects/unore/index.js @@ -1,55 +1,66 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokens2, nullAddress, } = require('../helper/unwrapLPs') +const { sumTokens2, nullAddress } = require('../helper/unwrapLPs') -const ethSSIPEth = '0x29B4b8674D93b36Bf651d0b86A8e5bE3c378aCF4' -const kavaSSIPKava = '0x112a295B0fCd382E47E98E8271e45979EDf952b6' +const uno = '0x474021845c4643113458ea4414bdb7fb74a01a77' +const uno_rollux = '0x570baA32dB74279a50491E88D712C957F4C9E409' const config = { ethereum: { - uToken: '0x474021845c4643113458ea4414bdb7fb74a01a77', + uToken: uno, // UNO token for staking only tokensAndOwners: [ - [nullAddress, ethSSIPEth], - [ADDRESSES.ethereum.USDT, '0x442e9fe958202Dc29d7018c1AA47479F2159D8a0'], - [ADDRESSES.ethereum.USDC, '0xF37c0901662f39039AFBd3c2546e3141c091e014'], + [nullAddress, '0x929F524473D7B86acc0ADD87B1874Bdf63Cf0Ab1'], // ETH SSIP + [ADDRESSES.ethereum.USDT, '0x442e9fe958202Dc29d7018c1AA47479F2159D8a0'], // USDT SSIP + [ADDRESSES.ethereum.USDC, '0xF37c0901662f39039AFBd3c2546e3141c091e014'], // USDC SSIP ], pools: [ '0x076E2A501FD0DA41E5A659aB664b2B6792B80Fa2', // UNO SSRP '0x8978d08bd89B9415eB08A4D52C1bDDf070F19fA2', // UNO SSIP '0x442e9fe958202Dc29d7018c1AA47479F2159D8a0', // USDT SSIP - '0xF37c0901662f39039AFBd3c2546e3141c091e014' ,// USDC SSIP - ], + '0xF37c0901662f39039AFBd3c2546e3141c091e014', // USDC SSIP + '0x929F524473D7B86acc0ADD87B1874Bdf63Cf0Ab1' // ETH SSIP + ] }, bsc: { - uToken: '0x474021845C4643113458ea4414bdb7fB74A01A77', + uToken: uno, // UNO token for staking only tokensAndOwners: [ - [ADDRESSES.bsc.USDC, '0xEcE9f1A3e8bb72b94c4eE072D227b9c9ba4cd750'], - [ADDRESSES.bsc.USDC, '0x0b5C802ecA88161B5daed08e488C83d819a0cD02'], - [ADDRESSES.bsc.USDC, '0x2cd32dF1C436f8dE6e09d1A9851945c56bcEd32a'], - [ADDRESSES.bsc.USDC, '0xabb83630993984C54fd60650F5A592407C51e54b'], - [ADDRESSES.bsc.USDC, '0xeF21cB3eE91EcB498146c43D56C2Ef9Bae6B7d53'], + [ADDRESSES.bsc.USDC, '0xabb83630993984C54fd60650F5A592407C51e54b'], // Zeus V2 ], pools: [ - '0xabb83630993984C54fd60650F5A592407C51e54b', // Zeus V2 - '0xeF21cB3eE91EcB498146c43D56C2Ef9Bae6B7d53' // Ares V2 - ], + '0xabb83630993984C54fd60650F5A592407C51e54b', // Zeus V2 + '0xeF21cB3eE91EcB498146c43D56C2Ef9Bae6B7d53' // Ares V2 + ] }, - kava: { + rollux: { + uToken: uno_rollux, // UNO Rollux token for staking only tokensAndOwners: [ - [nullAddress, kavaSSIPKava], - [ADDRESSES.telos.ETH, '0x6cEC77829F474b56c327655f3281739De112B019'], + [ADDRESSES.optimism.WETH_1, '0x7393310FdC8ed40B35D2afD79848BC7166Ae0474'], // Plutus + ], + pools: [ + '0x8685C2b4D2024805a1FF6831Bc4cc8569457811D', // Athena + '0x7393310FdC8ed40B35D2afD79848BC7166Ae0474' // Plutus ] } } module.exports = { - start: 1626100000, // Sep-20-2021 07:27:47 AM +UTC + start: '2021-07-12', // Sep-20-2021 07:27:47 AM +UTC + kava: { tvl: async () => ({})}, }; Object.keys(config).forEach(chain => { - const { pools, uToken, tokensAndOwners, } = config[chain] + const { pools, uToken, tokensAndOwners } = config[chain] + + // TVL (Total Value Locked) - Excludes UNO token module.exports[chain] = { - tvl: async (api) => sumTokens2({api, tokensAndOwners}) + tvl: async (api) => sumTokens2({ api, tokensAndOwners }) + } + + // Staking - Includes only UNO token and its pools + if (uToken) { + module.exports[chain].staking = async (api) => sumTokens2({ + api, + tokens: [uToken], + owners: pools + }) } - if (uToken) - module.exports[chain].staking = async (api) => sumTokens2({api, tokens: [uToken], owners: pools}) -}) \ No newline at end of file +}) diff --git a/projects/uplift/index.js b/projects/uplift/index.js index 5eff4a5931..c1bdce87f7 100644 --- a/projects/uplift/index.js +++ b/projects/uplift/index.js @@ -28,7 +28,7 @@ async function tvl(timestamp, block, chainBlocks) { module.exports = { methodology: "Counts the number of LIFT tokens in the Staking contract", - start: 1637191200, + start: '2021-11-18', bsc: { tvl: () => ({}), staking: tvl, diff --git a/projects/upshift/index.js b/projects/upshift/index.js new file mode 100644 index 0000000000..8bec8eecc5 --- /dev/null +++ b/projects/upshift/index.js @@ -0,0 +1,17 @@ +const { sumERC4626VaultsExport } = require('../helper/erc4626') +const config = { + ethereum: ["0xB7858b66dFA38b9Cb74d00421316116A7851c273", "0x80E1048eDE66ec4c364b4F22C8768fc657FF6A42", "0x18a5a3D575F34e5eBa92ac99B0976dBe26f9F869", "0xEBac5e50003d4B17Be422ff9775043cD61002f7f", "0xd684AF965b1c17D628ee0d77cae94259c41260F4", "0x5Fde59415625401278c4d41C6beFCe3790eb357f"], + avax: ["0x3408b22d8895753C9A3e14e4222E981d4E9A599E"], + base: ["0x4e2D90f0307A93b54ACA31dc606F93FE6b9132d2"] +} + +module.exports = { + doublecounted: true, + methodology: "TVL is the sum of tokens deposited in erc4626 vaults", +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: sumERC4626VaultsExport({ vaults: config[chain], isOG4626: true }) + } +}) \ No newline at end of file diff --git a/projects/usdfi-lending/index.js b/projects/usdfi-lending/index.js index 18a3724573..622c857d60 100644 --- a/projects/usdfi-lending/index.js +++ b/projects/usdfi-lending/index.js @@ -1,5 +1,5 @@ const { compoundExports } = require("../helper/compound"); module.exports = { - bsc: compoundExports('0x87363D74CD88A6220926Cf64bDEFd23ae63BE115', 'bsc',) + bsc: compoundExports('0x87363D74CD88A6220926Cf64bDEFd23ae63BE115') }; diff --git a/projects/usdx/index.js b/projects/usdx/index.js new file mode 100644 index 0000000000..c346cfb4f7 --- /dev/null +++ b/projects/usdx/index.js @@ -0,0 +1,11 @@ +const usdxAddress = "0xf3527ef8dE265eAa3716FB312c12847bFBA66Cef"; +const chains = ["ethereum", "bsc", "arbitrum"]; + +chains.forEach((chain) => { + module.exports[chain] = { + tvl: async (api) => { + const supply = await api.call({ abi: 'erc20:totalSupply', target: usdxAddress}) + api.addCGToken('usdx-money-usdx', supply/1e18) + }, + } +}) \ No newline at end of file diff --git a/projects/usual/index.js b/projects/usual/index.js index 6d5c7e3c2a..c06505226d 100644 --- a/projects/usual/index.js +++ b/projects/usual/index.js @@ -1,12 +1,18 @@ const { sumTokensExport } = require('../helper/unwrapLPs') -const USYC = '0x136471a34f6ef19fe571effc1ca711fdb8e49f2b' -const treasury = '0xdd82875f0840AAD58a455A70B88eEd9F59ceC7c7' +const tokens = [ + '0x136471a34f6ef19fe571effc1ca711fdb8e49f2b', // USYC + '0x437cc33344a0B27A429f795ff6B469C72698B291' // wM +] + +const owners = [ + '0xdd82875f0840AAD58a455A70B88eEd9F59ceC7c7', // treasury + '0x4Cbc25559DbBD1272EC5B64c7b5F48a2405e6470' // USUALM +] + module.exports = { methodology: 'TVL represents the value in RWA held by the protocol', - ethereum: { - tvl: sumTokensExport({ token: USYC, owner: treasury}) - } + ethereum: { tvl: sumTokensExport({ tokens, owners })} } \ No newline at end of file diff --git a/projects/utonic/index.js b/projects/utonic/index.js new file mode 100644 index 0000000000..6a9cccd91f --- /dev/null +++ b/projects/utonic/index.js @@ -0,0 +1,11 @@ +const { call } = require("../helper/chain/ton"); + +module.exports = { + timetravel: false, + ton: { + tvl: async () => { + const result = await call({ target: "EQAfF5j3JMIpZlLmACv7Ub7RH7WmiVMuV4ivcgNYHvNnqHTz", abi: "get_minter_data"}) + return { "coingecko:the-open-network": result[0]/1e9 }; + } + } +} \ No newline at end of file diff --git a/projects/utyabswap/index.js b/projects/utyabswap/index.js new file mode 100644 index 0000000000..1f0d46403c --- /dev/null +++ b/projects/utyabswap/index.js @@ -0,0 +1,44 @@ +const { getConfig } = require("../helper/cache"); +const { call } = require("../helper/chain/ton"); +const { transformDexBalances } = require("../helper/portedTokens"); +const { convertIntToAddress, } = require("../helper/chain/utils/ton-address"); +const { PromisePool } = require("@supercharge/promise-pool"); +const { sleep } = require("../helper/utils"); + +module.exports = { + misrepresentedTokens: true, + timetravel: false, + ton: { + tvl: async () => { + const pools = await getConfig('utyabswap', "https://api.utyabswap.com/v1/pools"); + const getPoolData = async (pool) => { + const data = await call({ target: pool.address, abi: "get_assets_full", rawStack: true, }); + + data.shift().pop(); + const asset0AddressInt = data.shift().pop(); + const asset0Address = convertIntToAddress(BigInt(asset0AddressInt)).toString() + const asset0Reserve = Number(data.shift().pop()) + + data.shift().pop(); + const asset1AddressInt = data.shift().pop(); + const asset1Address = convertIntToAddress(BigInt(asset1AddressInt)).toString() + const asset1Reserve = Number(data.shift().pop()) + + await sleep(1000 * (2 * Math.random() + 2)) + + return { + token0: asset0Address, + token1: asset1Address, + token0Bal: asset0Reserve, + token1Bal: asset1Reserve, + } + } + + const { results: data, errors } = await PromisePool.withConcurrency(2).for(pools).process(getPoolData); + + if (errors && errors.length) throw errors[0]; + + return transformDexBalances({ chain: "ton", data, }); + }, + }, +}; diff --git a/projects/vaderai/index.js b/projects/vaderai/index.js new file mode 100644 index 0000000000..331d27064f --- /dev/null +++ b/projects/vaderai/index.js @@ -0,0 +1,14 @@ +const { staking } = require('../helper/staking'); + +const vaderAddress = '0x731814e491571a2e9ee3c5b1f7f3b962ee8f4870'; + +module.exports = { + base: { + tvl: () => ({}), + staking: staking( + '0x1d6bb701eecedcd53966402064ce1c5b9eddc780', + vaderAddress + ), + }, + methodology: "$VADER coins can be staked in the protocol to earn rewards.", +}; diff --git a/projects/valence/index.js b/projects/valence/index.js new file mode 100644 index 0000000000..08ee3c0c86 --- /dev/null +++ b/projects/valence/index.js @@ -0,0 +1,81 @@ +const { queryContract, queryV1Beta1 } = require("../helper/chain/cosmos"); +const { transformBalances } = require("../helper/portedTokens"); +//Staked indicates if the asset is staked by the pooler. +//If so, we must query the pool address for the balance to determine the value. If not staked, we can lookup the balance directly. +const poolerAddresses = [ + { + address: "neutron1ulaxj0nelxshdua6l5mdkcqxa5k3gvcc8ut9w5867ej7u80qjx9s5cq5yh", //stars + staked: true, + }, + { + address: "neutron1quwzg6ntuy2tvvdt73rr4e8zkeetu2v5mehjfykrzszlkjavupvsn98wx9", //shade + staked: true, + }, + { + address: "neutron1nqd6ge2r9ndkgkl67js35v6wln093euvvkyynr43fs4lghj7vzgsl4va57", //nolus + staked: true, + }, + { + address: "neutron1yj6m02det6qd6wdugtfytfryzcmt9z9apls0sf4ww07hqq54zexqt5xgaq", //mars + staked: false, + }, +]; + +async function tvl(api) { + for (const pooler of poolerAddresses) { + let lpBalance; + let poolAddress; + + const lpConfig = await queryContract({ + contract: pooler.address, + chain: "neutron", + data: '{"lp_config":{}}', + }); + + poolAddress = lpConfig.pool_address; + + const poolInfo = await queryContract({ + contract: poolAddress, + chain: "neutron", + data: '{"pair":{}}', + }); + + // Get LP token balance for staked pooler + if (pooler.staked) { + lpBalance = await queryContract({ + contract: poolInfo.liquidity_token, + chain: "neutron", + data: `{"balance":{"address":"${pooler.address}"}}`, + }); + + lpBalance = lpBalance.balance || 0; + } else { + const balanceData = await queryV1Beta1({ + url: `bank/v1beta1/balances/${pooler.address}`, + chain: "neutron", + }); + lpBalance = balanceData.balances.find((balance) => balance.denom === poolInfo.liquidity_token)?.amount || 0; + } + + const shareValue = await queryContract({ + contract: poolAddress, + chain: "neutron", + data: `{"share":{"amount":"${lpBalance}"}}`, + }); + + shareValue.forEach((token) => { + const denom = token.info.native_token.denom; + const amount = token.amount; + api.add(denom, amount); + }); + } + + return transformBalances("neutron", api.getBalances()); +} + +module.exports = { + methodology: "Queries the Covenant Liquidity Pooler Addresses to sum up total held value.", + neutron: { + tvl, + }, +}; diff --git a/projects/valleyswap/index.js b/projects/valleyswap/index.js index 93f82ef8a9..2d58db67a4 100644 --- a/projects/valleyswap/index.js +++ b/projects/valleyswap/index.js @@ -1,7 +1,6 @@ const { getUniTVL } = require('../helper/unknownTokens') module.exports = { - start: 411656, oasis: { tvl: getUniTVL({ factory: '0xa25464822b505968eEc9A45C43765228c701d35f', diff --git a/projects/valuedefi.js b/projects/valuedefi.js index 289eeec283..1a04ed920a 100644 --- a/projects/valuedefi.js +++ b/projects/valuedefi.js @@ -1,6 +1,5 @@ const { getUniTVL } = require('./helper/unknownTokens') -const { createIncrementArray } = require('./helper/utils') const sdk = require('@defillama/sdk') const { sumTokens2 } = require('./helper/unwrapLPs') const swapFactory = '0x1b8e12f839bd4e73a47addf76cf7f0097d74c14c' @@ -13,25 +12,13 @@ const abis = { getToken: "function getToken(uint8 index) view returns (address)", } -const bscDexTVL = getUniTVL({ - factory: swapFactory, - useDefaultCoreAssets: true, -}) +const bscDexTVL = getUniTVL({ factory: swapFactory, useDefaultCoreAssets: true, }) async function bscStableSwapTvl(api) { - const pools = await api.fetchList({ lengthAbi: 'allPoolsLength', itemAbi: 'allPools', target: stableSwapFactory}) - - const tokenLength = await api.multiCall({ abi: abis.getTokenLength, calls: pools, }) - - const tokenCalls = [] - tokenLength.forEach((i, idx) => { - createIncrementArray(i).forEach(j => tokenCalls.push({ target: pools[idx], params: j })) - }) - - const tokens = await api.multiCall({ abi: abis.getToken, calls: tokenCalls, }) - - const toa = tokens.map((i, idx) => ([i, tokenCalls[idx].target])) - return sumTokens2({ tokensAndOwners: toa, api}) + const pools = await api.fetchList({ lengthAbi: 'allPoolsLength', itemAbi: 'allPools', target: stableSwapFactory }) + const tokens = await api.fetchList({ lengthAbi: abis.getTokenLength, itemAbi: abis.getToken, targets: pools, groupedByInput: true }) + const ownerTokens = tokens.map((i, idx) => ([i, pools[idx]])) + return sumTokens2({ ownerTokens, api }) } module.exports = { diff --git a/projects/valueliquid/index.js b/projects/valueliquid/index.js index 5874199351..72dd06ab5a 100644 --- a/projects/valueliquid/index.js +++ b/projects/valueliquid/index.js @@ -2,6 +2,6 @@ const { v1Tvl } = require('../helper/balancer') module.exports = { - start: 1601440616, // 09/30/2020 @ 4:36am (UTC) + start: '2020-09-30', // 09/30/2020 @ 4:36am (UTC) ethereum: { tvl: v1Tvl('0xebc44681c125d63210a33d30c55fd3d37762675b', 10961776) } }; diff --git a/projects/vapordex-v2/index.js b/projects/vapordex-v2/index.js index 4e6f81e8e6..1d7f243530 100644 --- a/projects/vapordex-v2/index.js +++ b/projects/vapordex-v2/index.js @@ -9,4 +9,8 @@ module.exports = uniV3Export({ factory, fromBlock: 312329030, }, + apechain: { + factory, + fromBlock: 2671998, + }, }); diff --git a/projects/vapordex/index.js b/projects/vapordex/index.js index a1f5a2e57b..a999bd2511 100644 --- a/projects/vapordex/index.js +++ b/projects/vapordex/index.js @@ -2,6 +2,7 @@ const { getUniTVL } = require("../helper/unknownTokens"); const FACTORY_TELOS = "0xDef9ee39FD82ee57a1b789Bc877E2Cbd88fd5caE"; const FACTORY_AVAX = "0xc009a670e2b02e21e7e75ae98e254f467f7ae257"; +const FACTORY_APECHAIN = "0xc009a670e2b02e21e7e75ae98e254f467f7ae257"; module.exports = { telos: { tvl: getUniTVL({ @@ -17,6 +18,13 @@ module.exports = { }), }, + apechain: { + tvl: getUniTVL({ + factory: FACTORY_APECHAIN, + useDefaultCoreAssets: true, + }), + }, + methodology: "TVL comes from the DEX liquidity pools, and is pulled from the factory contract:", }; diff --git a/projects/vaporwave.js b/projects/vaporwave.js index 4f801f6009..9909985a09 100644 --- a/projects/vaporwave.js +++ b/projects/vaporwave.js @@ -32,12 +32,13 @@ const chains = { module.exports = { timetravel: false, misrepresentedTokens: true, + // deadFrom: '2024-08-01', methodology: 'TVL data is pulled from the Vaporwave Finance API "https://api.vaporwave.farm/tvl".', doublecounted: true, ...Object.fromEntries(Object.entries(chains).map(chain => [chain[0], { - tvl: fetchChain(chain[1], false), - staking: fetchChain(chain[1], true), + tvl: () => ({}), + staking: () => ({}), }])) } diff --git a/projects/varen/index.js b/projects/varen/index.js index f62fe68570..7fe71195fe 100644 --- a/projects/varen/index.js +++ b/projects/varen/index.js @@ -4,7 +4,7 @@ const { getUniTVL } = require('../helper/unknownTokens') const stakingRewards = "0x25a25e2f0d2c211a96fa35e8c670ef6f5b3aba57" module.exports = { - start: 1606392528, // 11/26/2020 @ 12:08:48am (UTC) + start: '2020-11-26', // 11/26/2020 @ 12:08:48am (UTC) ethereum:{ staking: staking(stakingRewards, "0x72377f31e30a405282b522d588aebbea202b4f23"), pool2: pool2(stakingRewards, "0x88024deacdc2e9eda02a3051377ed635381faa54"), diff --git a/projects/vaultWin/index.js b/projects/vaultWin/index.js new file mode 100644 index 0000000000..1012b42a53 --- /dev/null +++ b/projects/vaultWin/index.js @@ -0,0 +1,17 @@ +const { sumTokens2 } = require("../helper/unwrapLPs") + +const abi = { + "poolInfo": "function poolInfo(address) view returns (address token, address lendToken, uint256 roundStart, uint256 roundEnd, uint256 version, address yieldSource)" +} + +async function tvl(api) { + const lotteries = await api.call({ target: '0xE8aa1245E18185698f2af53D3ab4aC0f822120F8', abi: "address[]:getLotteries" }) + const poolInfos = await api.multiCall({ target: '0xE8aa1245E18185698f2af53D3ab4aC0f822120F8', abi: abi.poolInfo, calls: lotteries }) + const ownerTokens = poolInfos.map((data, i) => [[data.token, data.lendToken], lotteries[i]]) + return sumTokens2({ api, ownerTokens }) +} + +module.exports = { + methodology: 'Staked tokens are counted as TVL', + ftn: { tvl }, +}; diff --git a/projects/vaultka/index.js b/projects/vaultka/index.js index b314fd6ffe..a85c0afb6d 100644 --- a/projects/vaultka/index.js +++ b/projects/vaultka/index.js @@ -29,12 +29,25 @@ module.exports = { const jitoSol = "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"; const jupSolProgram = "6j6Fwxf7UzfaXqQA2QraWGEAYUYzjjZP3t6ChzjzkmL9"; const jitoSolProgram = "6MAnq2z4ww8nnvfd8sec4sRMhTEdsdZXB1FLgqaYsg4d"; + const jlpUsdtStrategy = "9vuDo8ZQsmMMe3qsiFCYoxsjhHieQVMNXLsfcfpC4SrX" + + + const lendingUsdc = "DefkwTSvkHeZASCuaVJ8AxUWS6zvBCwrLFpW2FniLSWo"; //change it to token account + const lendingUsdt = "HDNrMywo5z84uBLdbcdHpgVP3bao8bw2PDiUwtM4hvHk" + const usdc = ADDRESSES.solana.USDC; + const usdt = ADDRESSES.solana.USDT; + const jlp = "27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4" + const strategyJlp = "5852AnvCSV2GDzgpRVG4ZQ5cNn7abR7pPty5FaBxHLzW" return sumTokens2({ owner: lendingSol, tokensAndOwners: [ [jupSol, jupSolProgram], [jitoSol, jitoSolProgram], + [jlp, strategyJlp], + [usdc, lendingUsdc], + [usdt, lendingUsdt], + [jlp, jlpUsdtStrategy], ], solOwners: [lendingSol], }); @@ -50,8 +63,9 @@ module.exports = { const bals = await api.multiCall({ abi: "int256:getVaultMarketValue", calls: vaults, + permitFailure: true }); - bals.forEach((i) => api.add(ADDRESSES.arbitrum.USDC, i)); + bals.filter((bal) => bal !== null).forEach((i) => api.add(ADDRESSES.arbitrum.USDC, i)); const addresses = { wSol: "0x2bcC6D6CdBbDC0a4071e48bb3B969b06B3330c07", @@ -135,7 +149,7 @@ module.exports = { }); const contractAbis = { - stakedVlpBalance: "function getStakedVlpBalance() public view returns (uint256)", + stakedVlpBalance: "function getStakedVlpBalance() public view returns ( uint256)", stakedHlpBalance: "function userTokenAmount(address user) public view returns (uint256)", stakedAlpBalance: "function userInfo(address account) external view returns (uint256, uint256)", alpPrice: "function getAlpPrice() external view returns (uint256)", // diff --git a/projects/vectis/helpers.js b/projects/vectis/helpers.js new file mode 100644 index 0000000000..40ee00803c --- /dev/null +++ b/projects/vectis/helpers.js @@ -0,0 +1,56 @@ +function deserializeUserPositions(accountInfo) { + if (!accountInfo) { + throw new Error('User account not found'); + } + + const buffer = accountInfo.data; + + // Deserialize spot positions + const spotPositions = []; + let offset = 104; // Anchor discriminator (8) + Skip authority(32) + delegate(32) + name(32) + + for (let i = 0; i < 8; i++) { + const spotPosition = { + scaled_balance: buffer.readBigUInt64LE(offset), + market_index: buffer.readUInt16LE(offset + 32), + balance_type: buffer.readUInt8(offset + 34), + }; + + // Only push non-empty positions + if (spotPosition.scaled_balance > 0n) { + spotPositions.push(spotPosition); + } + offset += 40; // Size of SpotPosition struct + } + + // Deserialize perp positions + const perpPositions = []; + for (let i = 0; i < 8; i++) { + const lastCumulativeFundingRate = buffer.readBigInt64LE(offset); + const baseAssetAmount = buffer.readBigInt64LE(offset + 8); + const quoteAssetAmount = buffer.readBigInt64LE(offset + 16); + + // Skip empty positions + if (baseAssetAmount === 0n && quoteAssetAmount === 0n) { + offset += 96; + continue; + } + + const perpPosition = { + last_cumulative_funding_rate: lastCumulativeFundingRate, + base_asset_amount: baseAssetAmount, + quote_asset_amount: quoteAssetAmount, + market_index: buffer.readUInt16LE(offset + 92) + }; + + perpPositions.push(perpPosition); + offset += 96; // Size of PerpPosition struct + } + + return { + spotPositions, + perpPositions + }; +} + +module.exports = { deserializeUserPositions }; \ No newline at end of file diff --git a/projects/vectis/index.js b/projects/vectis/index.js new file mode 100644 index 0000000000..f50d1371bf --- /dev/null +++ b/projects/vectis/index.js @@ -0,0 +1,115 @@ +const { PublicKey } = require("@solana/web3.js"); +const { getTokenMintFromMarketIndex, processSpotPosition, processPerpPosition, getPerpTokenMintFromMarketIndex, getVaultPublicKey } = require("./spotMarkets"); +const { deserializeUserPositions } = require("./helpers"); +const { getPerpMarketFundingRates } = require("./spotMarkets"); +const { getMultipleAccounts } = require('../helper/solana') + + +module.exports = { + timetravel: false, + doublecounted: true, + methodology: "Calculate sum of spot positions in vaults with unrealized profit and loss", + solana: { + tvl, + }, +}; + +const vaultUserAddresses = [ + new PublicKey("9Zmn9v5A2YWUQj47bkEmcnc37ZsYe83rsRK8VV2j1UqX"), //Vault A + new PublicKey("4KvPuh1wG8j1pLnZUC5CuqTm2a41PWNtik1NwpLoRquE"), //Vault B + new PublicKey("Hcs63usAc6cxWccycrVwx1mrNgNSpUZaUgFm7Lw9tSkR"), //Vault C + new PublicKey("ARLwHJ3CYLkVTeW3nHvPBmGQ7SLQdhZbAkWHzYrq57rt"), //Vault D + new PublicKey("FyH3qGRQSG7AmdEsPEVDxdJJLnLhAn3CZ48acQU34LFr"), //Vault E + new PublicKey("MzEPFp2LwCSMMPHLQsqfE7SN6xkPHZ8Uym2HfrH7g5P"), //Yield Compass A + new PublicKey("CMiyE7M98DSPBEhQGTA6CzNodWkNuuW4y9HoocfK75nG"), //Yield Compass B + new PublicKey("CnaXXuzc2S5UFSGoBRuKVNnzXBvxbaMwq6hZu5m91CAV"),//LST Yield Compass + new PublicKey("Fwfu73gfD5KzqtSAVKqmW414rshmYpoHY4nJ8LWqPyHB"), //Prime standard + new PublicKey("6NaF3EpArzHJ4x5GeTzjcUcdic29Rt4sy4pn6LP7iJ4r"), //Prime A + new PublicKey("3CTgSqfQPWsFCjQmJx45JgVWgqEWau5ec55tsQDxW8gM"), // Prime B + new PublicKey("2XnEYxNovTmYDXkDb7zninKttt3j9i67sj96H7CV5wZw"), // JLP Navigator II + + + +]; +/** + * Vault Equity Calculation Formula: + * VaultEquity = NetSpotValue + UnrealizedPnL + * + * Where: + * 1. NetSpotValue = Σ(spotPosition.scaledBalance * spotMarketPrice * direction) + * - spotPosition.scaledBalance: The size of the spot position + * - spotMarketPrice: Current market price of the asset + * - direction: 1 for deposits (longs), -1 for borrows (shorts) + * + * 2. UnrealizedPnL = Σ(perpPosition.baseAssetAmount * oraclePrice + perpPosition.quoteAssetAmount + fundingPnL) + * For each perpetual position: + * - baseAssetAmount * oraclePrice: Current value of the base asset position (e.g., BTC, ETH, SOL) + * - quoteAssetAmount: Amount of quote currency (USDC) in the position + * - fundingPnL: (market.amm.cumulativeFundingRate - position.lastCumulativeFundingRate) * position.baseAssetAmount / FUNDING_RATE_PRECISION + * + */ +async function tvl(api) { + // Get all vault accounts first + const accounts = await getMultipleAccounts(vaultUserAddresses) + const deserializedData = accounts.map(deserializeUserPositions) + + // Collect unique market indices upfront + const allSpotIndices = new Set() + const allPerpIndices = new Set() + + deserializedData.forEach(({ spotPositions, perpPositions }) => { + spotPositions?.forEach(pos => allSpotIndices.add(pos.market_index)) + perpPositions?.forEach(pos => allPerpIndices.add(pos.market_index)) + }) + + // Batch fetch + const allKeys = [ + ...[...allSpotIndices].map(index => getVaultPublicKey('spot_market', index)), + ...[...allPerpIndices].map(index => getVaultPublicKey('perp_market', index)) + ] + + const allAccounts = await getMultipleAccounts(allKeys) + + // Create lookup maps + const spotAccountMap = {} + const perpAccountMap = {} + + let offset = 0 + ;[...allSpotIndices].forEach((index, i) => { + spotAccountMap[index] = allAccounts[i] + offset = i + 1 + }) + ;[...allPerpIndices].forEach((index, i) => { + perpAccountMap[index] = allAccounts[i + offset] + }) + + // Process positions using the cached account data + for (const { spotPositions, perpPositions } of deserializedData) { + if (spotPositions?.length) { + spotPositions.forEach(position => { + const tokenMint = getTokenMintFromMarketIndex(position.market_index) + const adjustedBalance = processSpotPosition(position, spotAccountMap[position.market_index]) + api.add(tokenMint, adjustedBalance) + }) + } + + if (perpPositions?.length) { + perpPositions.map(position => { + const baseTokenMint = getPerpTokenMintFromMarketIndex(position.market_index) + const { baseBalance, quoteBalance } = processPerpPosition(position) + api.add(baseTokenMint, baseBalance) + + const quoteTokenMint = getTokenMintFromMarketIndex(0) + api.add(quoteTokenMint, quoteBalance) + + const { cumulativeFundingRateLong, cumulativeFundingRateShort } = getPerpMarketFundingRates(perpAccountMap[position.market_index]) + const currentCumulativeFundingRate = position.base_asset_amount > 0n ? cumulativeFundingRateLong : cumulativeFundingRateShort + const difference = (currentCumulativeFundingRate - BigInt(position.last_cumulative_funding_rate)) / BigInt(10 ** 6) + const fundingRatePnl = (difference * (position.base_asset_amount) / BigInt(10 ** 6)) + + api.add(quoteTokenMint, fundingRatePnl) + }) + } + } +} + diff --git a/projects/vectis/spotMarkets.js b/projects/vectis/spotMarkets.js new file mode 100644 index 0000000000..9ca75e4598 --- /dev/null +++ b/projects/vectis/spotMarkets.js @@ -0,0 +1,181 @@ +const anchor = require('@coral-xyz/anchor'); +const { PublicKey } = require("@solana/web3.js"); +const DRIFT_PROGRAM_ID = new PublicKey('dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH') + +const SPOT_MARKETS = { + 0: { + name: 'USDC', + mint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', + decimals: 6 + }, + 1: { + name: 'SOL', + mint: 'So11111111111111111111111111111111111111112', + decimals: 9 + }, + 6: { + name: 'jitoSOL', + mint: 'J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn', + decimals: 9 + }, + 16:{ + name:'INF', + mint:'5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm', + decimals: 9 + }, + 17:{ + name:'dSOL', + mint:'Dso1bDeDjCQxTrWHqUUi63oBvV7Mdm6WaobLbQ7gnPQ', + decimals: 9 + }, + 19: { + name: 'JLP', + mint: '27G8MtK7VtTcCHkpASjSDdkWWYfoqT6ggEuKidVJidD4', + decimals: 6 + }, + 22: { + name: 'PYUSD', + mint: '2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo', + decimals: 6 + }, + 28: { + name: 'USDS', + mint: 'USDSwr9ApdHk5bvJKMjzff41FfuX8bSxdKcR81vTwcA', + decimals: 6 + } +}; + +const PERP_MARKETS = { + 0: { + name: 'SOL-PERP', + mint: 'So11111111111111111111111111111111111111112', + baseDecimals: 9, + quoteDecimals: 6 + }, + 1: { + name: 'BTC-PERP', + mint: "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh", + baseDecimals: 8, + quoteDecimals: 6 + }, + 2: { + name: 'ETH-PERP', + mint: "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs", + baseDecimals: 8, + quoteDecimals: 6 + }, +}; + +function getTokenMintFromMarketIndex(marketIndex) { + if (!SPOT_MARKETS[marketIndex]) { + throw new Error(`Market index ${marketIndex} not found`); + } + return SPOT_MARKETS[marketIndex].mint; +} + +function getPerpTokenMintFromMarketIndex(marketIndex) { + if (!PERP_MARKETS[marketIndex]) { + throw new Error(`Perp market index ${marketIndex} not found`); + } + return PERP_MARKETS[marketIndex].mint; +} + +function getDecimalsByMarketIndex(marketIndex, isPerp = false) { + if (isPerp) { + if (!PERP_MARKETS[marketIndex]) { + throw new Error(`Perp market index ${marketIndex} not found`); + } + return PERP_MARKETS[marketIndex].baseDecimals; + } + + if (!SPOT_MARKETS[marketIndex]) { + throw new Error(`Spot market index ${marketIndex} not found`); + } + return SPOT_MARKETS[marketIndex].decimals; +} + +function processSpotPosition(position, spotMarketAccountInfo) { + const decimals = getDecimalsByMarketIndex(position.market_index); + const decimalAdjustment = 9 - decimals; + let balance = position.scaled_balance; + + // Apply decimal adjustment + if (decimalAdjustment > 0) { + balance /= BigInt(10 ** decimalAdjustment); + } + + // For borrowed positions (balance_type === 1), apply interest rate + if (position.balance_type === 1) { + const cumulativeBorrowInterest = getSpotMarketCumulativeBorrowInterest(spotMarketAccountInfo); + // Apply interest rate to the balance + balance = (balance * cumulativeBorrowInterest) / BigInt(10 ** 10); + return -balance; // Return negative for borrows + } + + return balance; // Return positive for deposits +} + +function getSpotMarketCumulativeBorrowInterest(accountInfo) { + if (!accountInfo) { + throw new Error(`No account info found for market`); + } + + const CUMULATIVE_BORROW_INTEREST_OFFSET = 8 + 48 + 32 + 256 + (16 * 8) + 8; + + const lower64Bits = accountInfo.data.readBigInt64LE(CUMULATIVE_BORROW_INTEREST_OFFSET); + const upper64Bits = accountInfo.data.readBigInt64LE(CUMULATIVE_BORROW_INTEREST_OFFSET + 8); + + return (upper64Bits << 64n) + lower64Bits; + } + + +function processPerpPosition(position) { + + //if perp market 0, amount needs to mul by 10 + let baseBalance = position.market_index === 0 ? position.base_asset_amount : position.base_asset_amount / BigInt(10); + + let quoteBalance = position.quote_asset_amount; + + return { baseBalance, quoteBalance }; +} + + + +function getPerpMarketFundingRates(accountInfo) { + if (!accountInfo) { + throw new Error(`No account info found for market`); + } + let factorToPrecision = 1n; + + + const CUMULATIVE_FUNDING_OFFSET = 8 + 48 + 32 + 256 + (16 * 15) + 24; + + const cumulativeFundingRateLong = accountInfo.data.readBigInt64LE(CUMULATIVE_FUNDING_OFFSET); + const cumulativeFundingRateShort = accountInfo.data.readBigInt64LE(CUMULATIVE_FUNDING_OFFSET + 16); + + return { + cumulativeFundingRateLong, + cumulativeFundingRateShort, + factorToPrecision + }; +} + +module.exports = { + getTokenMintFromMarketIndex, + getDecimalsByMarketIndex, + processSpotPosition, + processPerpPosition, + SPOT_MARKETS, + PERP_MARKETS, + getPerpMarketFundingRates, + getPerpTokenMintFromMarketIndex, + getVaultPublicKey, +}; + +function getVaultPublicKey(seed, marketIndex) { + return PublicKey.findProgramAddressSync( + [ + Buffer.from(anchor.utils.bytes.utf8.encode(seed)), + new anchor.BN(marketIndex).toArrayLike(Buffer, 'le', 2), + ], DRIFT_PROGRAM_ID)[0] +} \ No newline at end of file diff --git a/projects/vectorreserve/index.js b/projects/vectorreserve/index.js index 3ccda43a60..c26d674ee0 100644 --- a/projects/vectorreserve/index.js +++ b/projects/vectorreserve/index.js @@ -10,7 +10,6 @@ async function tvl(api) { module.exports = { methodology: 'Value of ETH and LSD tokens in VETH contract', - start: 19067821, ethereum: { tvl, pool2: staking(['0x2dd568028682ff2961cc341a4849f1b32f371064'], ['0xB6B0C651C37EC4ca81C0a128420e02001A57Fac2', '0x6685fcFCe05e7502bf9f0AA03B36025b09374726']), diff --git a/projects/vee-finance/index.js b/projects/vee-finance/index.js index c145a9c610..cc7de2d88e 100644 --- a/projects/vee-finance/index.js +++ b/projects/vee-finance/index.js @@ -1,23 +1,35 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const {getCompoundV2Tvl, methodology} = require('../helper/compound') -const sdk = require('@defillama/sdk') +const sdk = require("@defillama/sdk"); +const { compoundExports2, methodology } = require('../helper/compound') -module.exports={ +module.exports = { methodology, - avax:{ - tvl: sdk.util.sumChainTvls([ - //V1&V2 on Avalanche - getCompoundV2Tvl("0xA67DFeD73025b0d61F2515c531dd8D25D4Cfd0Db", "avax", addr=>`avax:${addr}`), - getCompoundV2Tvl("0x43AAd7d8Bc661dfA70120865239529ED92Faa054", "avax", addr=>`avax:${addr}`, "0x6481490DBb6Bd0e8b7CB7E1317470f6d08aDa5A2", ADDRESSES.avax.WAVAX), - getCompoundV2Tvl("0xAF7f6F7a1295dEDF52a01F5c3f04Ad1b502CdA6a", "avax", addr=>`avax:${addr}`), - getCompoundV2Tvl("0xeEf69Cab52480D2BD2D4A3f3E8F5CcfF2923f6eF", "avax", addr=>`avax:${addr}`, "0x125605c515e3f75CAd62d3613c97A76F13d73A64", ADDRESSES.avax.WAVAX), - ]) +} + +const pools = { + avax: { + pools: [ + ['0xA67DFeD73025b0d61F2515c531dd8D25D4Cfd0Db'], + ['0xAF7f6F7a1295dEDF52a01F5c3f04Ad1b502CdA6a'], + ['0x43AAd7d8Bc661dfA70120865239529ED92Faa054', '0x6481490DBb6Bd0e8b7CB7E1317470f6d08aDa5A2'], + ['0xeEf69Cab52480D2BD2D4A3f3E8F5CcfF2923f6eF', '0x125605c515e3f75CAd62d3613c97A76F13d73A64'], + ], }, heco: { - tvl: sdk.util.sumChainTvls([ - //V1 on Heco - getCompoundV2Tvl("0x484C6e804cD4Cc27fCFbCf06748d6b4BCA47db84", "heco", addr=>`heco:${addr}`), - getCompoundV2Tvl("0x2a144ACaef8fb9258e4f2c2018945a76fE7342E2", "heco", addr=>`heco:${addr}`, "0x0F75aBfef98dAaa7A8170ddA97c8100a65ABA3cC", ADDRESSES.heco.WHT), - ]) - } + pools: [ + ['0x484C6e804cD4Cc27fCFbCf06748d6b4BCA47db84'], + ['0x2a144ACaef8fb9258e4f2c2018945a76fE7342E2', '0x0F75aBfef98dAaa7A8170ddA97c8100a65ABA3cC'], + ], + }, } + +function getTvl(chain) { + const config = pools[chain] ?? { pools: [] }; + const tvls = config.pools.map(([comptroller, cether]) => compoundExports2({ comptroller, cether })); + let tvl = sdk.util.sumChainTvls(tvls.map((t) => t.tvl)) + let borrowed = sdk.util.sumChainTvls(tvls.map((t) => t.borrowed)) + return { tvl, borrowed } +} + +Object.keys(pools).forEach(chain => module.exports[chain] = getTvl(chain)) + +module.exports.avax.borrowed = () => ({}) \ No newline at end of file diff --git a/projects/vela-exchange/index.js b/projects/vela-exchange/index.js index f1ae88d8b5..e8e148734e 100644 --- a/projects/vela-exchange/index.js +++ b/projects/vela-exchange/index.js @@ -32,13 +32,13 @@ module.exports = { staking: async (api) => velaStaking(api,arbitrumEndpoint) }, base: { - start: 3566528, tvl: staking("0xC4ABADE3a15064F9E3596943c699032748b13352", ADDRESSES.base.USDbC), staking: async (api) => velaStaking(api,baseEndpoint) }, hallmarks: [ [Math.floor(new Date('2023-04-13') / 1e3), 'Refunded tokens to VLP holders & traders'], [1693926000, 'Launched on Base Chain'], - [1721314800, 'Implemented Aave VLP supply integration'] + [1721314800, 'Implemented Aave VLP supply integration'], + [1726596000, 'Burned 65m Vela tokens'] ], } diff --git a/projects/velar-amm/api.js b/projects/velar-amm/api.js index 0357b39ec4..524311d2b7 100644 --- a/projects/velar-amm/api.js +++ b/projects/velar-amm/api.js @@ -1,29 +1,45 @@ +const { sumTokens } = require('../helper/chain/stacks') const { call } = require('../helper/chain/stacks-api') const { transformDexBalances } = require('../helper/portedTokens') const { sleep } = require('../helper/utils') const sdk = require('@defillama/sdk') const factory = 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-core' +const factory2 = 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.univ2-registry_v1_0_0' +const stableFactory = 'SP1Y5YSTAHZ88XYK1VPDH24GY0HPX5J4JECTMY4A1.curve-registry_v1_1_0' module.exports = { stacks: { tvl } } -async function tvl() { +async function tvl(api) { + await uniTvl(api, stableFactory, true) + await uniTvl(api, factory) + // await uniTvl(api, factory2) +} + + +async function uniTvl(api, factory, isStable = false) { const data = [] const pairCount = +(await call({ target: factory, abi: 'get-nr-pools' })).toString() for (let i = 1; i <= pairCount; i++) { - const { - token0, token1, reserve0, reserve1, - } = await call({ target: factory, abi: 'do-get-pool', inputArgs: [{ type: 'uint', value: i }] }) - data.push({ - token0: token0.value, - token1: token1.value, - token0Bal: reserve0.value, - token1Bal: reserve1.value, - }) + const res = await call({ target: factory, abi: 'do-get-pool', inputArgs: [{ type: 'uint', value: i }] }) + const { token0, token1, reserve0, reserve1, ...rest } = res + // console.log({ token0, token1, reserve0, reserve1, rest, pairCount }) + // console.log(rest['lp-token']?.value) + // console.log(res) + if (isStable) { + await sumTokens({ owner: rest.contract.value, balances: api.getBalances() }) + } + else + data.push({ + token0: token0.value, + token1: token1.value, + token0Bal: reserve0?.value, + token1Bal: reserve1?.value, + }) sdk.log(`velar-amm: ${i}/${pairCount}`) - await sleep(2100) + await sleep(3100) } - return transformDexBalances({ chain: 'stacks', data }) + return transformDexBalances({ chain: 'stacks', data, balances: api.getBalances() }) } \ No newline at end of file diff --git a/projects/velo/index.js b/projects/velo/index.js index 172b47fed8..38414a3ec4 100644 --- a/projects/velo/index.js +++ b/projects/velo/index.js @@ -12,7 +12,10 @@ const AprFixLockedAddresses = [ "0xDa000FA80C5E9cb4E24a66bFF6a56cC454422e78", "0xEfA6EAbcb5fa35827DDB236046B3DDB6d257022B", "0xc12A93bf62CfD50620BCfDDD903913903DF647B4", - "0xc322a2110958c1365e88D88aef65Ebdf335b6E67" + "0xc322a2110958c1365e88D88aef65Ebdf335b6E67", + "0x7dd617eacd7Fd35f69275f943Ff82218213796b7", + "0xba5640094E940B32159daf38Ab8B86fE4D788a3C", + "0x4191754eCB1C460B82818beAA5fb6Ce7728bEbE8" ]; const AprFixLockWithChangeableRatioTvl = [ diff --git a/projects/velocimeter-v4/index.js b/projects/velocimeter-v4/index.js new file mode 100644 index 0000000000..abdf1edba1 --- /dev/null +++ b/projects/velocimeter-v4/index.js @@ -0,0 +1,12 @@ +const { getUniTVL } = require('../helper/unknownTokens') + +module.exports = { + misrepresentedTokens: true, + iotaevm: { + tvl: getUniTVL({ + factory: '0x10A288eF87586BE54ea690998cAC82F7Cc90BC50', + useDefaultCoreAssets: true, + hasStablePools: true, + }) + }, +} diff --git a/projects/velodrome-CL/index.js b/projects/velodrome-CL/index.js index f2b1fc3dc2..4747c74e65 100644 --- a/projects/velodrome-CL/index.js +++ b/projects/velodrome-CL/index.js @@ -1,7 +1,12 @@ +const factory = require('../helper/abis/uniswap.js') const {getUniTVL} = require('../helper/unknownTokens.js') const config = { optimism: { factory: '0x548118C7E0B865C2CfA94D15EC86B666468ac758'}, + lisk: { factory: '0x04625B046C69577EfC40e6c0Bb83CDBAfab5a55F'}, + fraxtal: { factory: '0x04625B046C69577EfC40e6c0Bb83CDBAfab5a55F'}, + //bob: { factory: '0x04625B046C69577EfC40e6c0Bb83CDBAfab5a55F'}, + mode: { factory: '0x04625B046C69577EfC40e6c0Bb83CDBAfab5a55F'} } Object.keys(config).forEach(chain => { diff --git a/projects/velodrome-v2/index.js b/projects/velodrome-v2/index.js index eba9afb904..1edd9132b8 100644 --- a/projects/velodrome-v2/index.js +++ b/projects/velodrome-v2/index.js @@ -20,6 +20,18 @@ module.exports = { allPairs: 'function allPools(uint256) view returns (address)', }, { useDefaultCoreAssets: true, hasStablePools: true, permitFailure: true, }), }, + lisk: { + tvl: uniTvlExport("0x31832f2a97Fd20664D76Cc421207669b55CE4BC0", undefined, undefined, { + allPairsLength: 'uint256:allPoolsLength', + allPairs: 'function allPools(uint256) view returns (address)', + }, { useDefaultCoreAssets: true, hasStablePools: true, permitFailure: true, }), + }, + fraxtal: { + tvl: uniTvlExport("0x31832f2a97Fd20664D76Cc421207669b55CE4BC0", undefined, undefined, { + allPairsLength: 'uint256:allPoolsLength', + allPairs: 'function allPools(uint256) view returns (address)', + }, { useDefaultCoreAssets: true, hasStablePools: true, permitFailure: true, }), + }, hallmarks: [ [1687465883, "v2 Migration on OP Mainnet"], // https://twitter.com/VelodromeFi/status/1671979216039202816 ] diff --git a/projects/velvet-capital-v3/index.js b/projects/velvet-capital-v3/index.js index aae6f8a296..d5730c9809 100644 --- a/projects/velvet-capital-v3/index.js +++ b/projects/velvet-capital-v3/index.js @@ -1,24 +1,31 @@ +const ADDRESSES = require('../helper/coreAssets.json') const { sumTokens2 } = require('../helper/unwrapLPs') -async function tvl(api) { - const indexes = await api.fetchList({ lengthAbi: 'uint256:portfolioId', itemAbi: 'function getPortfolioList(uint256) view returns (address)', target: config[api.chain] }) - const [tokens, vaults] = await Promise.all([ - api.multiCall({ abi: 'address[]:getTokens', calls: indexes }), - api.multiCall({ abi: 'address:vault', calls: indexes }), - ]) - - const ownerTokens = tokens.map((tokens, i) => [tokens, vaults[i]]); - return sumTokens2({ api, ownerTokens, resolveLP: true }); +const config = { + base: { address: '0xf93659fb357899e092813bc3a2959ceDb3282a7f', blacklistedTokens: [ADDRESSES.bsc.USDT, "0x96af5739ca66ca55ab71ac9f308720d5044995ee","0xca4f1536cd29d42bcbc8211f1b621ba9e817433f"]}, + bsc: { address: '0xA1fe1C37Bf899C7F7521082C002dFA4fEbAaA8dd', blacklistedTokens: [ADDRESSES.optimism.WETH_1] }, + ethereum: { address: '0x7c530c9ED5E734964453Ce62Ae9C4e31a247738B'} } -module.exports = { - methodology: 'calculates overall value deposited across different protocol portfolios', +const abi = { + getTokens: 'address[]:getTokens', + vault: 'address:vault' } -const config = { - base : '0xf93659fb357899e092813bc3a2959ceDb3282a7f' +async function tvl(api, address, blacklistedTokens) { + const indexes = await api.fetchList({ lengthAbi: 'uint256:portfolioId', itemAbi: 'function getPortfolioList(uint256) view returns (address)', target: address }) + const [tokens, vaults] = await Promise.all([ + api.multiCall({ abi: abi.getTokens, calls: indexes }), + api.multiCall({ abi: abi.vault, calls: indexes }), + ]) + + const ownerTokens = vaults.map((vault, i) => ([tokens[i], vault])) + return sumTokens2({ api, ownerTokens, resolveLP: true, blacklistedTokens}); } +module.exports = { methodology: 'calculates overall value deposited across different protocol portfolios' } + Object.keys(config).forEach(chain => { - module.exports[chain] = { tvl } -}) \ No newline at end of file + const { address, blacklistedTokens } = config[chain] + module.exports[chain] = { tvl: (api) => tvl(api, address, blacklistedTokens) } +}) diff --git a/projects/vendor-finance-v2/index.js b/projects/vendor-finance-v2/index.js index 8190c9b908..31214b2f16 100644 --- a/projects/vendor-finance-v2/index.js +++ b/projects/vendor-finance-v2/index.js @@ -45,7 +45,6 @@ const config = { module.exports = { doublecounted: true, methodology: 'The sum of the balance of all listed collateral and lend tokens in all deployed pools.', - start: 88774917, }; Object.keys(config).forEach(chain => { diff --git a/projects/vendor-finance/index.js b/projects/vendor-finance/index.js index f33e6c54eb..93c3d8f6ce 100644 --- a/projects/vendor-finance/index.js +++ b/projects/vendor-finance/index.js @@ -14,7 +14,7 @@ async function tvl(api) { const balances = {}; const tokensAndOwners = [] - for (const { args: { _poolAddress, _colToken, _lendToken, _expiry }} of logs) { + for (const { args: { _poolAddress, _colToken, _lendToken, _expiry } } of logs) { if (_expiry < api.timestamp) continue; tokensAndOwners.push([_colToken, _poolAddress]) tokensAndOwners.push([_lendToken, _poolAddress]) @@ -30,7 +30,7 @@ const config = { module.exports = { methodology: 'The sum of the balance of all listed collateral and lend tokens in all deployed pools.', - start: 20274088, + deadFrom: '2024-08-30' }; Object.keys(config).forEach(chain => { diff --git a/projects/venofinance/index.js b/projects/venofinance/index.js index bc87e4f181..16765dd6a7 100644 --- a/projects/venofinance/index.js +++ b/projects/venofinance/index.js @@ -3,6 +3,12 @@ const { staking } = require("../helper/staking.js"); const fountain_contract_address = "0xb4be51216f4926ab09ddf4e64bc20f499fd6ca95"; const reservoir_contract_address = "0x21179329c1dcfd36ffe0862cca2c7e85538cca07"; const vno_contract_address = "0xdb7d0a1ec37de1de924f8e8adac6ed338d4404e9"; +const zkCRO_contract_address = "0x28Ff2E4dD1B58efEB0fC138602A28D5aE81e44e2"; +const ybETH_contract_address = "0x76bf2D1e6dFda645c0c17440B17Eccc181dfC351"; +const ybUSD_contract_address = "0xFA59075DfCE274E028b58BdDFcC3D709960F594a"; +const vETH_contract_address = "0x271602A97027ee1dd03b1E6e5dB153eB659A80b1"; +const vUSD_contract_address = "0x5b91e29Ae5A71d9052620Acb813d5aC25eC7a4A2"; + async function tvlCronos(api) { const lcro_contract_address = "0x9Fae23A2700FEeCd5b93e43fDBc03c76AA7C08A6"; @@ -24,6 +30,26 @@ async function tvlEra(api) { return api.getBalances() } +async function tvlEthereum(api) { + const cro_pooled = await api.call({ abi: "uint256:totalPooledCro", target: zkCRO_contract_address }); + api.addCGToken('crypto-com-chain', cro_pooled / 1e8); + const eth_pooled = await api.call({ abi: "uint256:totalPooledEth", target: ybETH_contract_address }); + api.addCGToken('ethereum', eth_pooled / 1e18); + const usd_pooled = await api.call({ abi: "uint256:totalUsdValue", target: ybUSD_contract_address }); + api.addCGToken('dai', usd_pooled / 1e18); + + return api.getBalances(); +} + +async function tvlCronosZkEVM(api) { + const totalVEth = await api.call({ abi: "uint256:ybEthValue", target: vETH_contract_address }); + api.addCGToken('ethereum', totalVEth / 1e18); + const totalVUsd = await api.call({ abi: "uint256:ybUsdValue", target: vUSD_contract_address }); + api.addCGToken('dai', totalVUsd / 1e18); + + return api.getBalances(); +} + module.exports = { methodology: "TVL counts tokens staked by the protocol.", cronos: { @@ -36,4 +62,10 @@ module.exports = { era: { tvl: tvlEra, }, + ethereum: { + tvl: tvlEthereum, + }, + cronos_zkevm: { + tvl: tvlCronosZkEVM, + }, }; diff --git a/projects/venus-isolated-pools/index.js b/projects/venus-isolated-pools/index.js index d4585e82f7..db1229667d 100644 --- a/projects/venus-isolated-pools/index.js +++ b/projects/venus-isolated-pools/index.js @@ -30,13 +30,13 @@ async function getPools(api) { async function tvl(...args) { const [api] = args const pools = await getPools(api) - const tvls = pools.map(i => compoundExports2({ comptroller: i, fetchBalances: true, })) + const tvls = pools.map(i => compoundExports2({ comptroller: i})) return sdk.util.sumChainTvls(tvls.map(i => i.tvl))(...args) } async function borrowed(...args) { const [api] = args const pools = await getPools(api) - const tvls = pools.map(i => compoundExports2({ comptroller: i, fetchBalances: true, })) + const tvls = pools.map(i => compoundExports2({ comptroller: i})) return sdk.util.sumChainTvls(tvls.map(i => i.borrowed))(...args) } diff --git a/projects/venus.js b/projects/venus.js index 6f552d30a8..e06a2ad297 100644 --- a/projects/venus.js +++ b/projects/venus.js @@ -1,15 +1,7 @@ -const ADDRESSES = require('./helper/coreAssets.json') -const {fullCoumpoundExports, compoundExports2} = require('./helper/compound'); - -const replace = { - [ADDRESSES.bsc.BETH]: ADDRESSES.ethereum.WETH, // beth->weth - "0xfb6115445bff7b52feb98650c87f44907e58f802": ADDRESSES.ethereum.AAVE, // aave -} - -module.exports = fullCoumpoundExports("0xfd36e2c2a6789db23113685031d7f16329158384", "bsc", "0xA07c5b74C9B40447a954e1466938b865b6BBea36", ADDRESSES.bsc.WBNB, addr=>{ - return replace[addr.toLowerCase()] || `bsc:${addr}` -}) +const { compoundExports2} = require('./helper/compound'); +module.exports.bsc = compoundExports2({ comptroller: '0xfd36e2c2a6789db23113685031d7f16329158384', cether: '0xA07c5b74C9B40447a954e1466938b865b6BBea36'}) module.exports.ethereum = compoundExports2({ comptroller: '0x67aA3eCc5831a65A5Ba7be76BED3B5dc7DB60796'}) module.exports.op_bnb = compoundExports2({ comptroller: '0xd6e3e2a1d8d95cae355d15b3b9f8e5c2511874dd'}) -module.exports.arbitrum = compoundExports2({ comptroller: '0x317c1A5739F39046E20b08ac9BeEa3f10fD43326'}) \ No newline at end of file +module.exports.arbitrum = compoundExports2({ comptroller: '0x317c1A5739F39046E20b08ac9BeEa3f10fD43326'}) +module.exports.era = compoundExports2({ comptroller: '0xddE4D098D9995B659724ae6d5E3FB9681Ac941B1'}) \ No newline at end of file diff --git a/projects/vertex/index.js b/projects/vertex/index.js index 34acb291b6..241e606192 100644 --- a/projects/vertex/index.js +++ b/projects/vertex/index.js @@ -31,6 +31,23 @@ const seiConfig = { "perpEngine": "0x0F54f46979C62aB73D03Da60eBE044c8D63F724f" } +const baseConfig = { + "querier": "0x57237f44e893468efDD568cA7dE1EA8A57d14c1b", + "clearinghouse": "0xE46Cb729F92D287F6459bDA6899434E22eCC48AE", + "clearinghouseLiq": "0xA35Cd71DDC7aab953377314a56a663E9706F1354", + "endpoint": "0x92C2201D48481e2d42772Da02485084A4407Bbe2", + "spotEngine": "0xe818be1DA4E53763bC77df904aD1B5A1C5A61626", + "perpEngine": "0x5BD184F408932F9E6bA00e44A071bCCb8977fb47" +} + +const sonicConfig = { + "querier": "0xcC7895C391041231BfB5837A6923A4A26586d14f", + "clearinghouse": "0x447c9aEe069F6A13007eb9D2d2a4Bb4Ad92AB721", + "clearinghouseLiq": "0xd52e4Cb7D6e769a4957C9Da1bd33E0B12D956789", + "endpoint": "0x2f5F835d778eBE8c28fC743E50EB9a68Ca93c2Fa", + "spotEngine": "0xEa555556ab1973973e4f9d3378277Ab156de783d", + "perpEngine": "0x9100770dE5268B969e540650D003D909d5012826" +} module.exports = { arbitrum: { @@ -48,7 +65,19 @@ module.exports = { sei: { tvl: sumTokensExport({ owners: [seiConfig.clearinghouse, seiConfig.endpoint], - tokens: [ADDRESSES.sei.USDC, ADDRESSES.sei.USDT], + tokens: [ADDRESSES.sei.USDC, ADDRESSES.sei.WSEI], + }) + }, + base: { + tvl: sumTokensExport({ + owners: [baseConfig.clearinghouse, baseConfig.endpoint], + tokens: [ADDRESSES.base.USDC, ADDRESSES.base.WETH], + }) + }, + sonic: { + tvl: sumTokensExport({ + owners: [sonicConfig.clearinghouse, sonicConfig.endpoint], + tokens: [ADDRESSES.sonic["USDC.e"], ADDRESSES.sonic.wS], }) } } \ No newline at end of file diff --git a/projects/verus-market/index.js b/projects/verus-market/index.js new file mode 100644 index 0000000000..6b08dad2ff --- /dev/null +++ b/projects/verus-market/index.js @@ -0,0 +1,41 @@ +const { get } = require('../helper/http') +const { transformDexBalances } = require('../helper/portedTokens') + + +// verus bridge address? https://etherscan.io/address/0x71518580f36feceffe0721f06ba4703218cd7f63 +async function tvl(api) { + const { data: { results } } = await get("https://marketapi.verus.services/getdefichaininfo") + + const blacklist = new Set(results.map(i => i.lp_address)) + const processed = new Set() + const data = [] + results.forEach(({ tokens, lp_address, }) => { + if (processed.has(lp_address)) return; + processed.add(lp_address) + + if (tokens.length < 2) return; + + const isXYPair = tokens.length === 2 + const noBlacklistedTokens = !tokens.some(i => blacklist.has(i.i_address)) + tokens = tokens.filter(i => !blacklist.has(i.i_address)) + + if (isXYPair & noBlacklistedTokens) { + data.push({ + token0: tokens[0].i_address, + token1: tokens[1].i_address, + token0Bal: tokens[0].reserves, + token1Bal: tokens[1].reserves, + }) + } else { + tokens.forEach(i => api.add(i.i_address, i.reserves)) + } + }) + + return transformDexBalances({ data, api, }) +} + +module.exports = { + verus: { tvl }, + timetravel: false, + misrepresentedTokens: true, +} \ No newline at end of file diff --git a/projects/vesper/index.js b/projects/vesper/index.js index dae3a61ab0..715fdc1457 100644 --- a/projects/vesper/index.js +++ b/projects/vesper/index.js @@ -1,70 +1,52 @@ -const sdk = require("@defillama/sdk") -const abi = require('./abi.json') -const { getChainTransform } = require('../helper/portedTokens') const { getConfig } = require("../helper/cache") +const { sumTokensExport } = require("../helper/unwrapLPs") const chainConfig = { ethereum: { stakingPool: '0xbA4cFE5741b357FA371b506e5db0774aBFeCf8Fc', VSP: '0x1b40183efb4dd766f11bda7a7c3ad8982e998421', - api: ['https://api.vesper.finance/pools?stages=prod', 'https://api.vesper.finance/pools?stages=orbit'], + endpoints: ['https://api.vesper.finance/pools?stages=prod', 'https://api.vesper.finance/pools?stages=orbit'], }, avax: { - api: ['https://api-avalanche.vesper.finance/pools?stages=prod'], + endpoints: ['https://api-avalanche.vesper.finance/pools?stages=prod'], }, polygon: { - api: ['https://api-polygon.vesper.finance/pools?stages=prod'], + endpoints: ['https://api-polygon.vesper.finance/pools?stages=prod'], }, optimism: { - api: ['https://api-optimism.vesper.finance/pools'] + endpoints: ['https://api-optimism.vesper.finance/pools'] + }, + base: { + endpoints: ['https://api-base.vesper.finance/pools'] }, } function getChainExports(chain) { - const { stakingPool, VSP, api } = chainConfig[chain] || {} - - async function tvl(timestamp, _block, chainBlocks) { - const block = chainBlocks[chain] - const transformAddress = await getChainTransform(chain) - const balances = {} - let network = chain === 'ethereum' ? 'mainnet' : chain - if (network === 'avax') network = 'avalanche' + const { stakingPool, VSP, endpoints } = chainConfig[chain] || {} + async function tvl(api) { const poolSet = new Set() - for (let i = 0;i< api.length;i++) { + for (let i = 0; i < endpoints.length; i++) { const key = ['vesper', chain, i].join('/') - const data = await getConfig(key, api[i]) + const data = await getConfig(key, endpoints[i]) data.forEach(pool => poolSet.add(pool.address)) // add pools from our contracts list } - if (stakingPool) poolSet.delete(stakingPool) + if (stakingPool) poolSet.delete(stakingPool) const poolList = [...poolSet] - if (!poolList.length) return balances + if (!poolList.length) return; // Get collateral token - const calls = poolList.map(target => ({ target })) - const { output: tokens } = await sdk.api.abi.multiCall({ calls, abi: abi.token, chain, block, }) - const { output: totalValue } = await sdk.api.abi.multiCall({ calls, abi: abi.totalValue, chain, block, }) - tokens.forEach((token, index) => sdk.util.sumSingleBalance(balances, transformAddress(token.output), totalValue[index].output)) - return balances + const tokens = await api.multiCall({ abi: 'address:token', calls: poolList }) + const bals = await api.multiCall({ abi: 'uint256:totalValue', calls: poolList }) + api.add(tokens, bals) } let staking - if (stakingPool) - staking = async (timestamp, _block, chainBlocks) => { - const block = chainBlocks[chain] - const transformAddress = await getChainTransform(chain) - const balances = {} - const vspBalance = (await sdk.api.erc20.balanceOf({ - block, chain, - target: VSP, - owner: stakingPool - })).output; - sdk.util.sumSingleBalance(balances, transformAddress(VSP), vspBalance) - return balances - } + if (stakingPool && VSP) + staking = sumTokensExport({ owner: stakingPool, token: VSP }) return { [chain]: { tvl, staking } @@ -72,6 +54,6 @@ function getChainExports(chain) { } module.exports = { - start: 1608667205, // December 22 2020 at 8:00 PM UTC - ...['ethereum', 'avax', 'polygon','optimism'].reduce((acc, chain) => ({ ...acc, ...getChainExports(chain) }), {}) + start: '2020-12-22', // December 22 2020 at 8:00 PM UTC + ...['ethereum', 'avax', 'polygon', 'optimism', 'base'].reduce((acc, chain) => ({ ...acc, ...getChainExports(chain) }), {}) }; diff --git a/projects/vest/index.js b/projects/vest/index.js index 7187a502c5..d32ec42579 100644 --- a/projects/vest/index.js +++ b/projects/vest/index.js @@ -3,7 +3,7 @@ const ADDRESSES = require('../helper/coreAssets.json') module.exports = { methodology: "Total USDC locked in the Vest Exchange.", - start: 1710709200, + start: '2024-03-17', era: { tvl: staking([ "0xf7483A1464DeF6b8d5A6Caca4A8ce7E5be8F1F68", diff --git a/projects/vesta/index.js b/projects/vesta/index.js index ddeaf78332..d80dd26384 100644 --- a/projects/vesta/index.js +++ b/projects/vesta/index.js @@ -57,7 +57,7 @@ module.exports = { tvl, pool2, }, - start: 1644339600, + start: '2022-02-08', methodology: "Total Value Locked includes all stability pools, troves, and vst pairs", }; diff --git a/projects/vesu/index.js b/projects/vesu/index.js index 665a01f14f..0ec03ff739 100644 --- a/projects/vesu/index.js +++ b/projects/vesu/index.js @@ -4,7 +4,12 @@ const { abi, allAbi } = require("./abi"); const INTERNAL_SCALE = 10 ** 18; const SINGLETON = "0x02545b2e5d519fc230e9cd781046d3a64e092114f07e44771e0d719d148725ef"; -const POOL_ID = "0x4dc4f0ca6ea4961e4c8373265bfd5317678f4fe374d76f3fd7135f57763bf28"; +const POOLS = [ + "0x4dc4f0ca6ea4961e4c8373265bfd5317678f4fe374d76f3fd7135f57763bf28", // Genesis Pool + "0x7f135b4df21183991e9ff88380c2686dd8634fd4b09bb2b5b14415ac006fe1d", // Re7 USDC Pool + "0x52fb52363939c3aa848f8f4ac28f0a51379f8d1b971d8444de25fbd77d8f161", // Re7 xSTRK Pool + "0x2e06b705191dbe90a3fbaad18bb005587548048b725116bff3104ca501673c1" // Re7 sSTRK Pool +]; const ASSETS = [ ADDRESSES.starknet.ETH, ADDRESSES.starknet.WBTC, @@ -12,6 +17,8 @@ const ASSETS = [ ADDRESSES.starknet.USDT, ADDRESSES.starknet.WSTETH, ADDRESSES.starknet.STRK, + ADDRESSES.starknet.XSTRK, + ADDRESSES.starknet.SSTRK ]; async function tvl(api) { @@ -19,13 +26,14 @@ async function tvl(api) { } const borrowed = async (api) => { - const calls = ASSETS.map((asset) => ({ target: SINGLETON, params: [POOL_ID, asset] })); + const poolAssets = POOLS.map((pool_id) => ASSETS.map((asset) => ({ pool_id, asset }))).flat(); + const calls = poolAssets.map(({ pool_id, asset }) => ({ target: SINGLETON, params: [pool_id, asset] })) const assetStates = await multiCall({ calls, abi: abi.asset_config_unsafe, allAbi }); - return assetStates.forEach((res, index) => { + assetStates.forEach((res, index) => { const { total_nominal_debt, scale, last_rate_accumulator } = res['0'] const totalDebt = Number(total_nominal_debt) * Number(last_rate_accumulator) / INTERNAL_SCALE; const scaledTotalDebt = totalDebt * Number(scale) / INTERNAL_SCALE; - api.add(ASSETS[index], scaledTotalDebt); + api.add(poolAssets[index].asset, scaledTotalDebt); }); }; diff --git a/projects/vett/index.js b/projects/vett/index.js index 5abf1b50a2..bbd1df6d3e 100644 --- a/projects/vett/index.js +++ b/projects/vett/index.js @@ -1,8 +1,9 @@ +const ADDRESSES = require('../helper/coreAssets.json') const sdk = require("@defillama/sdk"); const chain = "thundercore"; -const posStaking = "0xC3C857a9E5Be042C8acF4F2827Aa053e93b5d039" +const posStaking = ADDRESSES.thundercore.veTT const posABI = { getTTPoolAbi: "uint256:getTTPool" } diff --git a/projects/vexchange/index.js b/projects/vexchange/index.js index eeb0bf360b..47bccf2461 100644 --- a/projects/vexchange/index.js +++ b/projects/vexchange/index.js @@ -1,25 +1,33 @@ -const { get } = require('../helper/http') +const { get } = require('../helper/http'); const { toUSDTBalances } = require('../helper/balances'); +const blacklist = ['0xb008022F676a8918299E046c91Af65Fc06b52B1C','0xca907dD0044D673e878E08Af32E2Dc2AdC731369']; + async function tvl() { - const data = await get('https://api.vexchange.io/v1/pairs') - let balance = 0 - Object.values(data).forEach(pair => { + const data = await get('https://api.vexchange.io/v1/pairs'); + let balance = 0; + + Object.entries(data).forEach(([pairAddress, pair]) => { + // Skip the blacklisted pair + if (blacklist.includes(pairAddress)) return; + if (pair.token0.usdPrice && pair.token1.usdPrice) { - balance += +pair.token0Reserve * pair.token0.usdPrice - balance += +pair.token1Reserve * pair.token1.usdPrice + balance += +pair.token0Reserve * pair.token0.usdPrice; + balance += +pair.token1Reserve * pair.token1.usdPrice; } else if (pair.token0.usdPrice) { - balance += +pair.token0Reserve * pair.token0.usdPrice * 2 - }else if (pair.token1.usdPrice) { - balance += +pair.token1Reserve * pair.token1.usdPrice * 2 + balance += +pair.token0Reserve * pair.token0.usdPrice * 2; + } else if (pair.token1.usdPrice) { + balance += +pair.token1Reserve * pair.token1.usdPrice * 2; } - }) - return toUSDTBalances(balance) + }); + + return toUSDTBalances(balance); } + module.exports = { timetravel: false, misrepresentedTokens: true, vechain: { - tvl - } -}; \ No newline at end of file + tvl, + }, +}; diff --git a/projects/vfat/index.js b/projects/vfat/index.js index 3f69a48338..6865d2b68b 100644 --- a/projects/vfat/index.js +++ b/projects/vfat/index.js @@ -1,4 +1,5 @@ const { getLogs } = require('../helper/cache/getLogs'); +const { get } = require('../helper/http'); const { sumTokens2, addUniV3LikePosition } = require('../helper/unwrapLPs'); const config = require('./config'); @@ -211,6 +212,7 @@ async function tvlArbitrumLinea(api) { await fetchSickleNftPositions(api, sickles, config[api.chain].NonfungiblePositionManager); await fetchSickleNftPositions(api, sickles, config[api.chain].masterchefV3, true); + api.removeTokenBalance('0xe80772eaf6e2e18b651f160bc9158b2a5cafca65') return sumTokens2({ api, resolveLP: true }); } @@ -321,7 +323,20 @@ Object.keys(config).forEach(chain => { tvl = genericTvl } - module.exports[chain] = { tvl } + module.exports[chain] = { tvl: tvl2 } }) -module.exports.isHeavyProtocol = true \ No newline at end of file +// module.exports.isHeavyProtocol = true +module.exports.misrepresentedTokens = true +let _get + +async function tvl2(api) { + if (!_get) + _get = get(`https://api.vfat.io/v1/sickle-stats`) + + const { chainStats } = await _get + chainStats.filter(chain => chain.chainId === api.chainId).forEach(chain => { + api.addUSDValue(chain.tvl) + }) + +} \ No newline at end of file diff --git a/projects/vine/index.js b/projects/vine/index.js index db87fd3aaa..686ef8c378 100644 --- a/projects/vine/index.js +++ b/projects/vine/index.js @@ -1,7 +1,7 @@ const { sumTokensExport, nullAddress } = require('../helper/unwrapLPs') module.exports = { - start: 1706475600, + start: '2024-01-28', sapphire: { tvl: sumTokensExport({ owner: '0x1882560361578F2687ddfa2F4CEcca7ae2e614FD', tokens: [nullAddress] }), }, diff --git a/projects/vinuswap/index.js b/projects/vinuswap/index.js new file mode 100644 index 0000000000..fd481329cc --- /dev/null +++ b/projects/vinuswap/index.js @@ -0,0 +1,36 @@ +const { getLogs2 } = require('../helper/cache/getLogs') +const { sumTokens2 } = require('../helper/unwrapLPs') + +// v1.1 factory +const factories = [ + '0x4bC45A5db58d4535FaF668F392035407d2a14E76', // v1 + '0xd74dEe1C78D5C58FbdDe619b707fcFbAE50c3EEe' // v1.1 +] + +// Deployed with an old contract +const V1_POOLS = [ + '0xa97FA6E9A764306107F2103a2024Cfe660c5dA33', + '0x3424b0dd7715C8db92414DB0c5A9E5FA0D51cCb5', + '0xfD763943f628e125CEE3D8d85DC0fc7098355d16', + '0x8d713bC2d35327B536A8B2CCec9392e57C0D04B4', + '0xd50ee26F62B1825d14e22e23747939D96746434c' +] + +async function tvl(api) { + const ownerTokens = [] + const token0s = await api.multiCall({ abi: 'address:token0', calls: V1_POOLS}) + const token1s = await api.multiCall({ abi: 'address:token1', calls: V1_POOLS}) + + ownerTokens.push(...V1_POOLS.map((pool, idx) => [[token0s[idx], token1s[idx]], pool])) + + const logs = await getLogs2({ api, target: factories[1], eventAbi: 'event PoolCreated(address indexed token0, address indexed token1, uint24 indexed fee, int24 tickSpacing, address feeManager, address pool)', fromBlock: 1, skipCacheRead: true, }) + + ownerTokens.push(...logs.map(l => [[l.token0, l.token1], l.pool])) + return sumTokens2({ api, ownerTokens }) +} + +module.exports = { + vinu: { + tvl + } +} \ No newline at end of file diff --git a/projects/visor/config.js b/projects/visor/config.js index 2135640455..3c67b92f00 100644 --- a/projects/visor/config.js +++ b/projects/visor/config.js @@ -34,6 +34,8 @@ const HYPE_REGISTRY = { ], optimism: [ ["0xF5BFA20F4A77933fEE0C7bB7F39E7642A070d599", 6538026], // Uniswap + ["0x617BA5fcB4e74758795DceBecA420116e50bD289", 126667774], // Sushiswap + ["0xF802D5c44dC4E3bB0eCcf680a6bA82Cbd24B9F33", 125319599], // Velodrome ], arbitrum: [ ["0x66CD859053c458688044d816117D5Bdf42A56813", 10617223], // Uniswap @@ -87,6 +89,8 @@ const HYPE_REGISTRY = { ["0x8118C33513feC13f8cf488CCb4509190650F0e92", 7310111], // Baseswap ["0xf1DF4F17e34Ba710DfFC487F73f1e19476E815a6", 8743213], // Thick ["0xe1cd1c2d2e4B44dE211D554649BC7dc49eF07784", 15063294], // Kinetix + ["0x6809f4881707459Ad0287C6467365E3C910e9373", 19631061], // Aerodrome + ["0x392007E4a40236c656548b4655c372bD327A6096", 22026482], // Kim ], kava: [ ["0x683292172E2175bd08e3927a5e72FC301b161300", 6384272], // Kinetix @@ -104,6 +108,7 @@ const HYPE_REGISTRY = { ["0xFc13Ebe7FEB9595D70195E9168aA7F3acE153621", 9080358], // Hercules ], xdai: [ + ["0xc0766FF871c6C8e72C110100d0120829dc017d38", 36307837], // Uniswap ["0x683292172E2175bd08e3927a5e72FC301b161300", 31760496], // Swapr ], astrzk: [ @@ -131,6 +136,7 @@ const HYPE_REGISTRY = { ], taiko: [ ["0xc27ddd78fc49875fe6f844b72bbf31dfbb099881", 57600], // Uniswap + ["0x1E97925c365cd96D74Ec55A04569915c4D65e5e0", 606236], // Panko ], rsk: [ ["0x683292172E2175bd08e3927a5e72FC301b161300", 6414342], // Uniswap @@ -139,6 +145,28 @@ const HYPE_REGISTRY = { iotaevm: [ ["0xF44cECB1CF40ee12303E85Eb8651263c01812EaD", 223591], // wagmi ], + core: [ + ["0x32e27fF479454e32868ff67Ee9F06BAFDC1E908F", 17268275], // Glyph + ["0xFc13Ebe7FEB9595D70195E9168aA7F3acE153621", 17164390], // CoreX + ], + zircuit: [ + ["0xC27DDd78FC49875Fe6F844B72bbf31DFBB099881", 1216191], // Gmeow + ["0x683292172E2175bd08e3927a5e72FC301b161300", 1216165], // Circuit + ["0x17307DaC1384719d263556aAcC3e62c0053FE25D", 4826564], // Ocelex + ], + wc: [ + ["0xC27DDd78FC49875Fe6F844B72bbf31DFBB099881", 4799965], // Uniswap + ], + apechain: [ + ["0xC27DDd78FC49875Fe6F844B72bbf31DFBB099881", 476343], // Camelot + ], + sonic: [ + ["0x683292172E2175bd08e3927a5e72FC301b161300", 1825082], // Equalizer + ["0x2705176750a81d6b1C64c5081d55aA1B54681917", 2760689], // Shadow + ], + bob: [ + ["0xC27DDd78FC49875Fe6F844B72bbf31DFBB099881", 11706713], // Uniswap + ], }; Object.keys(HYPE_REGISTRY).forEach(chain => { diff --git a/projects/visor/index.js b/projects/visor/index.js index 595add42c6..e18edc2971 100644 --- a/projects/visor/index.js +++ b/projects/visor/index.js @@ -5,10 +5,11 @@ const getTotalAmounts = "function getTotalAmounts() view returns (uint256 total0, uint256 total1)"; const { getUniqueAddresses } = require("../helper/utils"); const config = require("./config"); +const { sumTokens2 } = require('../helper/unwrapLPs') module.exports = { doublecounted: true, - start: 1616679762, // (Mar-25-2021 01:42:42 PM +UTC) + start: '2021-03-25', // (Mar-25-2021 01:42:42 PM +UTC) }; Object.keys(config).forEach(chain => { @@ -53,7 +54,7 @@ Object.keys(config).forEach(chain => { api.add(token0s[i], total0); api.add(token1s[i], total1); }); - return api.getBalances() + return sumTokens2({ api }) } } }) diff --git a/projects/vivacity/index.js b/projects/vivacity/index.js index 8c250221ad..4f7630e462 100644 --- a/projects/vivacity/index.js +++ b/projects/vivacity/index.js @@ -1,6 +1,6 @@ const { compoundExports } = require('../helper/compound') -const compoundData = compoundExports("0xe49627059Dd2A0fba4A81528207231C508d276CB", "canto") +const compoundData = compoundExports("0xe49627059Dd2A0fba4A81528207231C508d276CB") module.exports = { canto: compoundData diff --git a/projects/vnx-rwa/index.js b/projects/vnx-rwa/index.js index 11f015f845..5dc8b3d762 100644 --- a/projects/vnx-rwa/index.js +++ b/projects/vnx-rwa/index.js @@ -1,4 +1,4 @@ -const { getTokenSupply } = require("../helper/solana"); +const { getTokenSupplies } = require("../helper/solana"); const fetch = require('node-fetch'); const ASSETS = { @@ -58,9 +58,8 @@ const fetchStellarSupply = async (asset) => { }; const solanaTvl = async (api, assets) => { - const supplies = await Promise.all(assets.map(getTokenSupply)); - const scaledSupplies = supplies.map((supply) => supply * 1e9); - api.add(assets, scaledSupplies); + const supplies = await getTokenSupplies(assets) + api.addTokens(Object.keys(supplies), Object.values(supplies)); }; const stellarTvl = async (api, assets) => { diff --git a/projects/volta-dao/index.js b/projects/volta-dao/index.js index 07edfae28e..273288ddf1 100644 --- a/projects/volta-dao/index.js +++ b/projects/volta-dao/index.js @@ -1,60 +1,29 @@ const ADDRESSES = require('../helper/coreAssets.json') const { stakingUnknownPricedLP } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); -const sdk = require("@defillama/sdk"); -const { BigNumber } = require("bignumber.js"); +const { sumTokens2 } = require('../helper/unwrapLPs'); const ftmToken = "0x4c9993c7107495020c2ce9a13d11839f48ecd2e6"; const ftmStaking = "0xc6a54adddf7463f73a4c5a8e3e480bc798cf8a09"; const ftmTreasury = "0x05ab17e4dfa87ef4ac487ed20cfcc2ae75c2a792"; const ftmTokens = [ - [ADDRESSES.fantom.DAI, false], - ["0x78b51a1fd7524186982c2cb8982df312b1e896a8", true] + ADDRESSES.fantom.DAI, + "0x78b51a1fd7524186982c2cb8982df312b1e896a8" ]; const avaxToken = "0x4c9993c7107495020c2ce9a13d11839f48ecd2e6"; const avaxStaking = "0xfae672012b90cfb6bf245ac072a3aca374604b17"; const avaxTreasury = "0x05ab17e4dfa87ef4ac487ed20cfcc2ae75c2a792"; const avaxTokens = [ - [ADDRESSES.avax.DAI, false], - ["0x26e7c9b2890440866d7d3f8f84b1ccaff443b9d8", true] + ADDRESSES.avax.DAI, + "0x26e7c9b2890440866d7d3f8f84b1ccaff443b9d8" ] -async function tokenPrice(block, chain, lp, unlisted, listed) { - const tokensInLP = (await sdk.api.abi.multiCall({ - calls: [ - { - target: unlisted, - params: lp - }, - { - target: listed, - params: lp - } - ], - abi: "erc20:balanceOf", - block, - chain - })).output; - return Number(tokensInLP[1].output) / Number(tokensInLP[0].output); +async function ftmTvl(api) { + return sumTokens2({ api, owner: ftmTreasury, tokens: ftmTokens, resolveLP: true }) } -async function ftmTvl (timestamp, block, chainBlocks) { - let balances = {}; - await sumTokensAndLPsSharedOwners(balances, ftmTokens, [ftmTreasury], chainBlocks.fantom, "fantom", addr=>`fantom:${addr}`); - const ratio = await tokenPrice(chainBlocks.fantom, "fantom", "0x78b51a1fd7524186982c2cb8982df312b1e896a8", ftmToken, ADDRESSES.fantom.DAI); - sdk.util.sumSingleBalance(balances, "fantom:" + ADDRESSES.fantom.DAI, BigNumber(balances["fantom:0x4c9993c7107495020c2ce9a13d11839f48ecd2e6"]).times(ratio).toFixed(0)); - delete balances["fantom:0x4c9993c7107495020c2ce9a13d11839f48ecd2e6"]; - return balances; -} - -async function avaxTvl (timestamp, block, chainBlocks) { - let balances = {}; - await sumTokensAndLPsSharedOwners(balances, avaxTokens, [avaxTreasury], chainBlocks.avax, "avax", addr=>`avax:${addr}`); - const ratio = await tokenPrice(chainBlocks.avax,"avax", "0x26e7c9b2890440866d7d3f8f84b1ccaff443b9d8", avaxToken, ADDRESSES.avax.DAI); - sdk.util.sumSingleBalance(balances, "avax:" + ADDRESSES.avax.DAI, BigNumber(balances["avax:0x4c9993c7107495020c2ce9a13d11839f48ecd2e6"]).times(ratio).toFixed(0)); - delete balances["avax:0x4c9993c7107495020c2ce9a13d11839f48ecd2e6"]; - return balances; +async function avaxTvl(api) { + return sumTokens2({ api, owner: avaxTreasury, tokens: avaxTokens, resolveLP: true }) } module.exports = { @@ -63,7 +32,7 @@ module.exports = { tvl: ftmTvl, staking: stakingUnknownPricedLP(ftmStaking, ftmToken, "fantom", "0x78b51a1fd7524186982c2cb8982df312b1e896a8") }, - avax:{ + avax: { tvl: avaxTvl, staking: stakingUnknownPricedLP(avaxStaking, avaxToken, "avax", "0x26e7c9b2890440866d7d3f8f84b1ccaff443b9d8") } diff --git a/projects/vortexdao/index.js b/projects/vortexdao/index.js index 716c8d4015..875588d419 100644 --- a/projects/vortexdao/index.js +++ b/projects/vortexdao/index.js @@ -1,17 +1,6 @@ -const sdk = require("@defillama/sdk"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); - const space = "0x353af195c0d82820c59427BFbD318A49971AAe1a"; const stakingV1 = "0x910F038C9E74dF8baEd886a22f75C69FaE8a6792"; const stakingV2 = "0x073d3F4Ed6cb32Bd7f6F7B6da4C25672ee76c95B"; -const treasury = "0xE05CEc7Ed93C2d3E106Df88B8d7B963Ce3618f46"; -const mim = "0x130966628846bfd36ff31a822705796e8cb8c18d"; -const avai = "0x346a59146b9b4a77100d369a3d18e8007a9f46a6"; -const spaceMimJLP = "0x5087706DD31962938c57a0fB3A3107ed3794c996"; - -async function tvl(api) { - return api.sumTokens({ owners: [treasury], tokens: [spaceMimJLP, avai, mim, ] }) -} async function staking(api) { return api.sumTokens({ tokens: [space], owners: [stakingV1, stakingV2, ] }) diff --git a/projects/w3bank/index.js b/projects/w3bank/index.js index 90589db821..8edfb78664 100644 --- a/projects/w3bank/index.js +++ b/projects/w3bank/index.js @@ -2,7 +2,10 @@ const { lendingMarket } = require("../helper/methodologies"); const { compoundExports2 } = require("../helper/compound"); module.exports = { - start: 1693843200, + start: '2023-09-04', pg: compoundExports2({ comptroller: '0x697bc9fd98ddafd1979c3e079033698ca93af451'}), methodology: `${lendingMarket}`, }; + +module.exports.deadFrom='2024-06-21', +module.exports.pg.borrowed = () => ({}) // bad debt diff --git a/projects/wagmi-com/index.js b/projects/wagmi-com/index.js index 7a61881ac4..fe6b758f0d 100644 --- a/projects/wagmi-com/index.js +++ b/projects/wagmi-com/index.js @@ -10,13 +10,15 @@ module.exports = uniV3Export({ zklink: { factory: '0x6175b648473F1d4c1549aAC3c2d007e7720585e6', fromBlock: 1339353, }, iotaevm: { factory: '0x01Bd510B2eA106917e711f9a05a42fC162bee2Ac', fromBlock: 143828, }, base: { factory: '0x576A1301B42942537d38FB147895fE83fB418fD4', fromBlock: 14250787, }, + sonic: { factory: '0x56CFC796bC88C9c7e1b38C2b0aF9B7120B079aef', fromBlock: 276406, } }) -module.exports.kava = { tvl: uniV3GraphExport({ name: 'wagmi-kava', graphURL: 'https://kava.graph.wagmi.com/subgraphs/name/v3', minTVLUSD: 0 }) } +module.exports.kava = { tvl: uniV3GraphExport({ name: 'wagmi-kava', graphURL: 'https://kava.graph.wagmi.com/subgraphs/name/v3' }) } const stakingConfig = { metis: { swagmi: '0x5fb3983adc4dcc82a610a91d2e329f6401352558', wagmi: '0xaf20f5f19698f1d19351028cd7103b63d30de7d7', }, kava: { swagmi: '0x3690d1a9fb569c21372f8091527ab44f1dc9630f', wagmi: '0xaf20f5f19698f1d19351028cd7103b63d30de7d7', }, + sonic: { swagmi: '0x4b5d9db7910448e2F236509D9eE242673AFa28aA', wagmi: '0x0e0Ce4D450c705F8a0B6Dd9d5123e3df2787D16B', } } Object.keys(stakingConfig).forEach(chain => { diff --git a/projects/wagmi/index.js b/projects/wagmi/index.js new file mode 100644 index 0000000000..c53c149e50 --- /dev/null +++ b/projects/wagmi/index.js @@ -0,0 +1,15 @@ +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokens } = require("../helper/chain/ton"); +const { getConfig } = require('../helper/cache') + +async function fetchTvl(api) { + const res = await getConfig('wagmi-ton', 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=wagmi') + await sumTokens({ api, tokens: [ADDRESSES.ton.TON], owners: res, onlyWhitelistedTokens: true, }) +} + +module.exports = { + timetravel: false, + ton: { + tvl: fetchTvl + } +} diff --git a/projects/wanbridge.js b/projects/wanbridge.js index 7e116b6220..42d48e7fef 100644 --- a/projects/wanbridge.js +++ b/projects/wanbridge.js @@ -1,8 +1,9 @@ +const ADDRESSES = require('./helper/coreAssets.json') const { get } = require("./helper/http"); let ret; async function getTvl() { // This is an api which could get wanchain bridge's lockAddress, balance, tvl and price; - // The infomation is updated every 1 hour. + // The information is updated every 1 hour. if (!ret) { ret = await get("https://api.wanpos.xyz/api/tvl"); } @@ -28,7 +29,7 @@ const chainsMap = { tron: "tron", wan: "wanchain", xdc: "xdc", - ripple: "xrp", + ripple: ADDRESSES.ripple.XRP, // clover: "clover", // telos: "telos", }; @@ -37,7 +38,7 @@ Object.keys(chainsMap).map((chain) => { module.exports[chain] = { tvl: async () => { let ret = await getTvl(); - return { tether: ret[chainsMap[chain]] } + return { tether: ret[chainsMap[chain]] ?? 0 } }, }; }); diff --git a/projects/warp/index.js b/projects/warp/index.js index d9f6c370df..dae8d74ff2 100644 --- a/projects/warp/index.js +++ b/projects/warp/index.js @@ -27,7 +27,7 @@ async function tvl(api) { } module.exports = { - start: 1610650220, + start: '2021-01-14', ethereum: { tvl }, } diff --git a/projects/waterfall-wtf-finance/index.js b/projects/waterfall-wtf-finance/index.js index 991debacfe..3457756166 100644 --- a/projects/waterfall-wtf-finance/index.js +++ b/projects/waterfall-wtf-finance/index.js @@ -1,5 +1,5 @@ const sdk = require("@defillama/sdk"); -const {pool2Exports} = require("../helper/pool2"); +const {pool2} = require("../helper/pool2"); const { staking } = require("../helper/staking"); const token = "0x1811b7eD3B613805A9a4B4b1B80C99d58Af32576"; @@ -16,6 +16,6 @@ module.exports = { bsc: { tvl: async () => ({}), staking: staking(masonry, shares), - pool2: pool2Exports(shareRewardPool, pancakeLPs, "bsc", addr=>`bsc:${addr}`) + pool2: pool2(shareRewardPool, pancakeLPs, "bsc", addr=>`bsc:${addr}`) } } \ No newline at end of file diff --git a/projects/waterfalldefi/index.js b/projects/waterfalldefi/index.js index e4f68b7560..b093f54783 100644 --- a/projects/waterfalldefi/index.js +++ b/projects/waterfalldefi/index.js @@ -135,7 +135,6 @@ async function tvl(chain, block) { module.exports = { methodology: 'Counts Waterfall DeFi tranche products TVL and staking TVL', - start: 16343128, bsc: { tvl: bscTVL, staking: bscStaking diff --git a/projects/waterloan/index.js b/projects/waterloan/index.js index 256fb11dcc..4db8fbd980 100644 --- a/projects/waterloan/index.js +++ b/projects/waterloan/index.js @@ -78,13 +78,14 @@ function waterloan(chain, borrowed) { } module.exports = { + deadFrom: '2022-10-23', methodology: `Counts all tokens locked in the contracts to be used as collateral in lending pool. Borrowed coins are not counted towards the TVL, only the coins actually locked in the contracts are counted.`, csc: { tvl: waterloan("csc", false), - borrowed: waterloan("csc", true), + borrowed: () => ({}) // bad debt waterloan("csc", true), }, smartbch: { tvl: waterloan("smartbch", false), - borrowed: waterloan("smartbch", true), + borrowed: () => ({}) // bad debt waterloan("smartbch", true), }, }; diff --git a/projects/wavesbridge/index.js b/projects/wavesbridge/index.js new file mode 100644 index 0000000000..38353161f6 --- /dev/null +++ b/projects/wavesbridge/index.js @@ -0,0 +1,46 @@ +const solana = require('../helper/solana'); +const waves = require("../helper/chain/waves"); +const { sumTokens2, } = require('../helper/unwrapLPs'); + +const data = { + bsc: { + contractAddress: "0x3AC7A6635d99F376c3c05442f7Eef62d349C3A55", + tokens: ["0xbA2aE424d960c26247Dd6c32edC70B295c744C43", "0x873CD8702d18Eb584CCdFFc10a5B88d62606cEEF",] + }, + ethereum: { + contractAddress: "0x3AC7A6635d99F376c3c05442f7Eef62d349C3A55", + tokens: ["0x1a920b0eaE5B49c51eBf042a61c3Fa58Dae04882", "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE", "0x6982508145454Ce325dDbE47a25d4ec3d2311933", "0x4d224452801ACEd8B2F0aebE155379bb5D594381", "0x812Ba41e071C7b7fA4EBcFB62dF5F45f6fA853Ee",] + }, + unit0: { + contractAddress: "0x3AC7A6635d99F376c3c05442f7Eef62d349C3A55", + tokens: ["0xEb19000D90f17FFbd3AD9CDB8915D928F4980fD1", "0xb303d80db8415FD1d3C9FED68A52EEAc9a052671", "0x1B100DE3F13E3f8Bb2f66FE58c1949c32E71248B", "0x9CE808657ba90C65a2700b1cA5D943eC72834B52",] + }, +} + +async function tvl(api) { + const { contractAddress: owner, tokens } = data[api.chain]; + return sumTokens2({ api, owner, tokens }) +} + +async function solanaTvl() { + return solana.sumTokens2({ owner: '8eQ7p6cBh57pESr6oHT6PS9GtdLQdJVYebeCytf9mufe' }) +} + +async function wavesTvl(api) { + return waves.sumTokens({ owners: ['3P6Rk2XBo6MJm9seLfxvJ1VSGz54yWiYb9U'], api }) +} + +module.exports = { + methodology: "All tokens locked in WavesBridge smart contracts.", + timetravel: false, + waves: { + tvl: wavesTvl, + }, + solana: { + tvl: solanaTvl, + }, +} + +Object.keys(data).forEach(chain => { + module.exports[chain] = { tvl } +}) diff --git a/projects/waxfun/index.js b/projects/waxfun/index.js new file mode 100644 index 0000000000..a36b729806 --- /dev/null +++ b/projects/waxfun/index.js @@ -0,0 +1,18 @@ +const { get_account_tvl } = require("../helper/chain/eos"); + +// WaxFun +// https://wax.fun +async function wax() { + const accounts = ["main.waxfun"]; + const tokens = [ + ["eosio.token", "WAX", "wax"] + ]; + return await get_account_tvl(accounts, tokens, "wax"); +} + +module.exports = { + methodology: `WaxFun TVL is achieved by querying token balances from a launchpad contract`, + wax: { + tvl: wax + }, +} \ No newline at end of file diff --git a/projects/wbtc.js b/projects/wbtc.js index d806eb7234..e823eea80f 100644 --- a/projects/wbtc.js +++ b/projects/wbtc.js @@ -1,409 +1,20 @@ -const sdk = require("@defillama/sdk"); const { sumTokens } = require("./helper/sumTokens"); const ADDRESSES = require('./helper/coreAssets.json') +const bitcoinAddressBook = require('./helper/bitcoin-book/index.js') // WALLETS FROM HERE https://wbtc.network/dashboard/audit -const owners = [ - "31qyn946XELbPKMaSWhk2SfFN8ikqLJ1GY", - "31rYKY9PysQgRoc6eB9fwJ3e89F5dcvRM4", - "32Ks4Rtb1A5NtzexGq6zEeqHta6hoqvCZW", - "32hJnfPp6ZDnmkJ3tosoo6PvEemFr1z1Bd", - "32hPQh4EMBS14BMutrW2WJ4V76yxuXHJdF", - "32iT1QaoQD61rZgCNLccNqAdbnx4HwgvZE", - "32m8wzKabRRF7o6JRXN1srLSA5FzND769o", - "32oLNY3suWAZvYTBeAaFFSk32rJtS8w9i8", - "32okkzumvdoocdjN18SzbnTTNd2omQvvt3", - "337ot6fHGs4NCZwg2cKwShhrYX46g8ACtQ", - "33C6kjmmGp2mrS6coGn627an3xpiRpEyhX", - "33DM5s2vPgX2P52DpurbXdVYa8dGwDCsJ3", - "33K5r4QntjmmD4mzSHq3WQJQtf4Dw8jvcZ", - "33ZA8VjwL2oucQceCP9WLEVunLkLvhaaPb", - "33epzdB4nk3FWHtUpHMQrzTWxiehSti11v", - "33jqiX8NtPd8empn7ibEc2tn25GUx8iUE8", - "33xk2gq91LNUaip9bPnoECtfaA1RjAcrSo", - "33xpP9NhBBmQt3XS1mD2g4pi1FZNuUFVR8", - "343uVxqsriiveWxekC6s3mNaERzsbfke3h", - "34MSicAL7qVGkevFPLwyc9KohGzoUSnu3Q", - "34whRPeeSYTPcihybfXmkG2uoShUdT3d2d", - "35AY8sKs3yt3FbZpsmAtgvSXBZtvqqwc8e", - "35HfRwMwqB7sNTwijoG4fGHBmfWMm48aaB", - "35QASqiGmQmHoccRc8pk9EtPVDFZDrFA59", - "35SZSm1CDcz7p27Hj78xZACv4Ak45EKGpf", - "35ULMyVnFoYaPaMxwHTRmaGdABpAThM4QR", - "35XnFgLYBuYogTx9HHGbJCRGfyqyC9ZtDG", - "35ZmRhYBwDfvoASsw35KNJxwypvsX9xD14", - "35sfxCN1Gz37dq9KkpTfW56W59CK46JMY6", - "36WQ2FEUnTmt67xXNZgQMSFQZjK6AJxLCZ", - "36hbDz8GSBpQdEf2UzcKieCNxSA3HS17JX", - "36jYq75ewM9AMTfnKRTwkPBBWwJtGg4CsE", - "371SbkDHpTvRuYTwayWsBNsXK93Tj4sDAd", - "37Tgw6PStVEAyfAJT8yEvLAcxkoRYK3hDz", - "37Tob2tV9LRVzJng6Z4YCLyPsmq8n2xMQi", - "37aZoS67WApGWTDsn2rYDsxebhTdZSR1sh", - "37hV1tJYctQLPin7vCSjpDL34PpiiUTyTx", - "38J1ce6tPUgy958VBkGGa2AmFU3LQLJ2Gv", - "38MHxNgiHENWExwCe3EEWYmfvgFM3i1WVW", - "38R6URq21qncKbYiiRXPi2MVx8xYRgDtWD", - "38TQEEGTmmPa1rghsYGwZhapiDQsSEnkub", - "38b9cazfu4SxqoahgdiHEMSo1aNDdKquRm", - "38bzm6nhQMFJe71jJw1U7CbgNrVNpkonZF", - "38rK7BfeiegdchggPCk2CZc3fuy8ozwzPP", - "39RMkGSQUQjifV2TpgRNYW73JK38xwA3NJ", - "39WQqCosC8ZD4S9XBPHRnnRUeVRvNctnnm", - "39e7mxbeNmRRnjfy1qkphv1TiMcztZ8VuE", - "39mayj82aZdb6UWs9qQAZZrC3VzfxUQP7c", - "39pEDUwFFj28sN5muXrmT5mAbDJSf6qEL2", - "3A2wJ7LBiR4NhPbJSLNVfzZk6vDeYYPrit", - "3ANaBZ6odMrzdg9xifgRNxAUFUxnReesws", - "3B9UDWZNPdtL81JLnnPEJoiurcmaGx8DZm", - "3BJJ68V6H1CoEx4MWdhqVk2kFpPUNVbs3T", - "3BTqdvZt5MYYWLAGXt8psAMSAa8Gh2AVPA", - "3BY62gfDUmuzMp1T9Wx4LnMRk3oNbQsKyQ", - "3Brhg9KYdB9oDrUtvKJ9k7mbn7zzHnMV51", - "3DDUy5Ze4TaqKFpktAhHcmmffz9KKGtTrb", - "3DKc1cFmTC4BJFcoyeN7fDp1oavTM4SvuX", - "3DeAGDRtQ984GazpLqfpS4kRW8NXBei5V8", - "3DiJgisVit4pqj4ByKxi5p1qdjGDxpGfR4", - "3ERNo3RAgP8o5jqELPKUEV47ADm4JtvKBd", - "3Epe1CixppBP9QSQ7DkvsWNKsgifTaxMY2", - "3ErNFK17MbH3GAGfakMwTrKo8uHmBuuVX1", - "3FFgKaYkEf1M73QtzuY9DGqC7VeM2sAQhT", - "3G3kGKAD5BgWZu91ejMXsW5LxEMhKZj46Z", - "3GbZUJ2oaUG3rZTvAwTCqpsNMWGm6j62r1", - "3GnY2SF2DoWRwWyQb6jThRJ5xYzNWFfd7J", - "3Go9rkgYQ3oLXfbbiDFENXmWZXQDaMjvtx", - "3GohY4RNGXjRH5KhByj5m4Amxq9jTsGfBr", - "3HFrW63zQ58PypYhSYgHB2gij5VirsyRAm", - "3HLxZqoEHdGPV9oFZQxVfG41z1uP1LrNaJ", - "3HVCDPPbAqiRwRjXhvu7PSDkLGgEajexuH", - "3Hdj2n5DEKPGsRd5md85exAXdwnRbomWTy", - "3He1eqsBZM5kbtZGuUDX7ysfEVWCjweZtJ", - "3JDewabYE785vTmaQe3MuHvUvEZJQTx8HU", - "3JJpCZCk4h4TpQeU7SA1yhH768Xgbtdbfg", - "3JTWYpPz7JkvhnAN7XKzYK31AfmxEUzRb8", - "3JbEPhuab1Gx6yrY8dD6wF1NrVAn3eG8CD", - "3JcNkH5QWYuSfiQYADq4yV2hAYnQ8KC74t", - "3JfZb6DbsRaQExeHAYmFa3s3azckqdyQr5", - "3K2mpXMDFe7cT1baogitkRGeXqCYeDw6J5", - "3KT7jvZyvhok3fkZt8Y9w8tcqpyQW5Jg8s", - "3KTeq879YjzhqkAXzZmdapJAVC6qz5qEth", - "3KUrPEGy9VFeQHZYJSGZpE78X5zf1n48pP", - "3KXKTXR9YxHuhm863nqnSrKznkYtcx7wC7", - "3KkkHYZywtjNy2eoVvL1xLo2Mnzz3gaDqQ", - "3KwPoNu1FxihhyRKjv1VG6C3FPy8vgjyse", - "3LScoRmRA3kknxF5dLxz6wfw3z4LXRiVyT", - "3LYNPfnfmGRQcheXUZFRNEYPDDmLvDSgAE", - "3LoYYxQis416ykPKGNuWe4iLdfSPWCHjgd", - "3LrxWneLHwvbNrMKXorkc17wxHqCCpNGkq", - "3MJ4rpTvuiTxYhTppNx7NokNUDZg26ofi1", - "3MPcUSHeWCSxCUsJtTS2L2zZfWLvorNFef", - "3MUJjyx13waUriNPkVnemdoJAiJT6nBmef", - "3Mzdh31vo6wUPTWnZ7GncPPWXA1WDopkhm", - "3NNsvp7bfeihJTiGbiL3t6jH3jUbRERsB7", - "3NsC2NXzKum7sVWQLQ3YYB3o9JbTz5FoaV", - "3PfcB36gDa47YkrbRtzZSwmrKSMsBSrhr6", - "3PggDrcp4et9phMamnSenN8HeNPP2YCuCX", - "3QB2qhnj5Xxwhh3GKcfwQDSkL91BCCn5cp", - "3QSd3JjJ35VAf5Shv3EPVpGCi5eVMQr6dk", - "3QWaxXXXbobqpWprekwzANeFuNrYXmaNXU", - "3QjqS6A7uyoCx1vcXQoqtLatubFmsHe1ps", - "bc1q02hdwthfslrempcvrgnrelsluszmt20qjaahg3tn2plse5pc3evsskz9g6", - "bc1q07jp79h30qmh39pkdmntaycwezmfl2njzvp85z8sdthhp2cus42qrwzglw", - "bc1q094s5w7semhdkcgzxrhxe6am449prjhsend8p83fhk9jv6rnr0eq6af0pp", - "bc1q0asc7qsj90esjzfmgz7r79tc5vd455yugwx0q4eqdqhqs82t0s2sfhtec2", - "bc1q0de5mlkcvundsnzdsmj6padctjh25jgsq3tcyu6d2qcgjnz0h8us2sws8a", - "bc1q0nnem9u53fcxcnmuutqw7j458hn56ljte34edvstjfyz8rfhxyesju3hhx", - "bc1q0s0enxvmfvfg3dj0rza2el0vz7p3a6xk2juv7vztw22l4g35rknsmv58se", - "bc1q0tckafgtukhn78d32ljl8c3hr0an5jq08599gf08mqxeqlahdg3s5wvuz3", - "bc1q0tvp3naff0auk3p4q99k3s9ltlf2w97uclrjspf3lvjkjywsj8lqvdx46f", - "bc1q0vthrmhktt2mhew5rq6e5q3qlj573uxcfqry5h9ea3gh4l9fz6hq999wz3", - "bc1q20mxuuv6ta5uy6m3s34lzwgs6p4qme4wyvv9y2cawd8a45y84susw2c9rk", - "bc1q2420wgxmqkxjkpkkdd9hxflxuqxhuqnt7atg0w3q3ypv0qfel0yqtanfuy", - "bc1q28pdpztsjuy4lqsa5hs249vq8ftykkt06aa8w97hgjxuvqz30trqqz5jdh", - "bc1q2j0ks6v6swlavvg20adsdn7hf9avm0979jc003g9lkg9dx0trz3sma7q62", - "bc1q2njvavlw9esncygac77d3jxjfwu877f23gxa88x33vjf3xa24lqq0xxetl", - "bc1q2nra9wwwq7pu4cg8zwycp8dzg9hcv8ywlj356p4ahjy7l80khphqvjdyfy", - "bc1q2qux9ad0egep5v5f2sup5hyszrl3nrfzyegmnmccmw7yk9chplhsy5sn4l", - "bc1q2wd3mfdcvjrxlccpl7wrzunzch7xaymtfzuvvx2tld760j3x5chqgsget8", - "bc1q33qexf56q60lxfpjhvgkj0l0lcgsapa7lsugkcwnyrceuw7kd89qsmy8h7", - "bc1q349jnpnefh952da4unfapsd3a6zmhgw8ctd2nk4ut40r37ax0d2qn0dluu", - "bc1q3d9jgd2yfx49986hjek9ulcj55umf6uyssrxqdmma7w7f7cyhc7qqyqvzr", - "bc1q3dyv677fn6feur2qjaqjdcftzgrmrwa7mjnvq7y8wxtka4ceu8tswfcvwm", - "bc1q42vvtdvdkdzj7glr6mtd52vgxddagktxusha6dxl2fes2dernqwqzff9k3", - "bc1q46uyezygewcl972rkp6z4pdtay669pxwrl8q70mgnda4cyf6yz0qj6rcsn", - "bc1q47z7kxma7lp7chnkaucee7ey9qds292kylz6rqvdlusu839ved9stns32j", - "bc1q48j4p67jmgpdpzxtu5tv3rendwvf6jjtqs2gt8ed96syxuqrsdfsl788un", - "bc1q4fpz2ntr5zlz6jga924hmaqc4a86s8luvfym3ff0qqr6gxykp60qeqqdn7", - "bc1q4gs9f4nhla3ufe6sumn8k0smcc5vxr0524nz3d5nhww70dr703lse46rmp", - "bc1q4gvftsdjy8wd6ga8c3a66rg4q6lxqvgak6edgnz7whs690vy2x8st6at64", - "bc1q4tl9hjvv3yvvsgqdajd492etlg8phrtml36ee5n0dt3mylmce23qnd5fdm", - "bc1q4zvuejph0q3z2c0narhgjtz6w47h6rst5eyyvr270lxh4tfqzluqrx4h4f", - "bc1q5a0t7av9xtay7av70fdwscsnx62rssut3mg7dclwmmsj0nxq5z3qgm8t49", - "bc1q5j8dyy5u94j0ulfg98l6jwsgjfq7dna0wwcwqvjcmwkgkwtcf30sm856qg", - "bc1q5ltp433ew9q98antza5s68h46g404eeaj6jkg4u6799q9dmkdngsmh6zny", - "bc1q5mq8f6rh85jwk0agf8huhtjp6syxcu7q4dk7alda9c2cedflj8js0u8j9f", - "bc1q5s4sa6s4vgst2pt97gvnxrmh9z8xa2j7kj370400fpx06pkk9uls7vzaaq", - "bc1q5sn9gqy6hd46yw545946f6a5crqryskhs9gge5z3gkp5d9luezmqllv7wz", - "bc1q5wj7yc27dzvnejeq9h543d6xt4cd90q8v8569tpzm6g5k3k252wq9jwuza", - "bc1q5xfafyynujpe4xm3sau92sy8rar3auf80vz3as6cjrn7pyvncfxq34hhcv", - "bc1q63yjt8zpr2kcegcmjr3vyqukm9zhlr432mcgss027lzs36qeh7qse8ct8w", - "bc1q67r0cfzcaqqm70sr00jq9fdyaplwcg24rtskylppej2qpgscjw7q5nrwf9", - "bc1q68mfyj37aurdzxwpq93vka6qkvhmcjl02l66va6vy8yktegp6nvs5knqe2", - "bc1q6e05t64zsdffvjxgw9njyxt5yhgq7xt2xxsufxk5npfcz4aewrgsyccu28", - "bc1q6hcsftu0hmm7q67cec272y8sxwhkq0pnpymshuty9x8wmymmjhdsquhzh4", - "bc1q6j7yxe948zd35xsrx3jucflxeq65unmrwusrm9a6c82lj459zmyskn5xk3", - "bc1q6kumts4ps94pyp8mfdn7yyy9p7y8n0wvgq760xpyk2r005rsh0dqdxxp22", - "bc1q6lmpnckv0zkdkv6xkvd2m2uy8mxetnz9g3qxkp3kpkvfhnsv0w7slkje25", - "bc1q6vk4rdxdnuklg5m4ltm866v6scz6lyuxdhj50qp6p4en8vtt23js9wpzgj", - "bc1q6vs72ztq8xchew26exy4kdnjxzrlxz43ny4lfckg95z5ka6ge6rs4rc5g2", - "bc1q6xr3ys66ry7jsfdfrlz82kfkwwnmdqtjh0ctm7y974kvufrwwezs6clrgr", - "bc1q6yk7s5g8u2ev7k9sw4zdazlfxj4vtduxgpekxvttzhju00c0yshs7ymvzl", - "bc1q6yzjmcudjlvq5nc0un27kfzwr283u0wdm53kqhelsja428t8jjfqpxc32j", - "bc1q76gspqpw24cqsptydstwy3egft798n2zq39gxfmfuxd5fvhh8p9s2s7c7f", - "bc1q78df3e2evtq70ntdcmcwzn0gs8a9zrlzh3p3xfrrt7p7s589pqesccuz22", - "bc1q78tqk9mn587sgnqqthsyrawmwpne7ssl4a4wlyasq4c9jqjtndwsyj22kn", - "bc1q79crmsa0k8g8k735nqqlctxqhz6eeugw2qv3x0sskdvsmsvjq7rsujhrr9", - "bc1q7d5q7e53k4w3c6n28tjrdvmlxl8skxutykk6fs9fgh79h0k9xc4sr9hzuy", - "bc1q7du4789yhw996lqwx6scre99sfzy2e53ax9502daxscsye7vvmksy8r743", - "bc1q7eaej94t49psde7mkmy6dd7vgn8f0zg45yqalpysy7u47y3z00lqg3x7fn", - "bc1q7l6c5ddseh5h54680ae0ufkx29y6rnl5yr8vhr6nfwc5smk8p0ysexsgsw", - "bc1q7pnj8k3tphfvcq7vrzlja5vqdqp7xed9rfn9hdl4ehgq09la9yhs5dpurz", - "bc1q7ps737rkza38ha5ysg3k4sjrd2xauexthkw23lxt74lpr70gum4s2jp8uk", - "bc1q7ta8kheq8ellkn6fmmkzxj47vq0uqcd53zd8n7g45hl945d6eals3d4ljj", - "bc1q7wcl3plp72cghpd6lapucmxtaa5fq4w4wmhswu6xjqhrmt9jsh7sfapsw4", - "bc1q7zdunrqm74erprv46nyryjkvl5nuymgmn2ek3x7mgck48umga5mstxdl9p", - "bc1q8fkquy9luszzu2mlsad3fsjgx433vp4qx69wswz5skhz65txv2lssgaua9", - "bc1q8mfdkttc6n804j43jmcqkftdug7yje77a55qeyhsy5ej7ca65wgscrvyd2", - "bc1q8nm7r22vw6lnmzl52lqvnlrft6hm36ye0087e984feavjmej4spq8y57z9", - "bc1q8pqeaj8c647ascnjpc582dzwfw8xstvyderzxzvc2dk09j8d4rasvctr5f", - "bc1q8uldtn4rnr23djmpvgwacs6tcazepkflhmej9t5r3afc9lldq4mqrl6zna", - "bc1q93rsljth5uxrpye4na8688r043lye0ny7uyexr4n24hf9wlgdmns9zcjn5", - "bc1q95ptqclhvj9vrsfnexfd4fs3l95dyyrt3cq3qyfpgxsmfuhspj3qq5gcqt", - "bc1q9988y3xw3mhv0tnrugu8c2vsw7e6f7ywrdaya6wcrcertw8rz54snxgnl9", - "bc1q9cs23smvx9c4q6eqcjpxgp0yrw6ar62w2x4mwe4dd88hqsfg35yq2pfk3y", - "bc1q9d6ayjfl3jagylp7x86v3dzzk65u0gt34mw74w9fxh0nyaf24slqp6sat4", - "bc1q9ehldvjkmd3s28m7922w6mun083kpjqfr9q9cal8zkqp0yaxyr4sy8v4re", - "bc1q9evu4ywa2tmhxt9x3fe6nt0e5ngxmq7kewmdvuk57j4c53ak4zjsj87pw7", - "bc1q9f5cecrwtwrfrvgxde5c04serf3txc8mdx7kgk3zhen2xp22zgcq5dngyh", - "bc1q9fftzadztvgpe90hnwec9n5al44xkuw6dc0n3mtt8w9wxyeg3rlqwfn527", - "bc1q9r4slky3fsjnen39u3fh6d22pwvk3pduj3htwyd5as3hywe2d49q6zyk05", - "bc1q9rrkgd0x5rv57ftysp3t4e35zhma2ejcjj0per8cg89um0mn0acs5hqh5k", - "bc1q9xne956dj0szmxur2up3xg4jl0ktjxpkggr7r5kw5tth48n4pemskcd9mc", - "bc1qa0mxdj0yehl3m99c8tsgepmngz0a0yf96v9al3ejyvla97hysjdsgzj59x", - "bc1qafrg9lt04d9wvurrgvr7l8p4cn5f07zh86d8rljeh6fzqegxe44sj82x4a", - "bc1qah2zmzd4atalqpds7ke86h7lvv49xqa43cyk28y2lwsus7sujd2sndplut", - "bc1qaj7w4a7kxvkjdgz76mc2uy66825ngjhqtasqd6tgssrajc68dk0qqkd3hc", - "bc1qak00ktehfya8j5vg5xcq7dfa2rae7zfnvjgs9jm0fsxa7a420rjs4zcp6t", - "bc1qanjru8xgu07kq6w0meyvydsfuvrlt75f4uekrhkuucp73w4gq0kql9dh26", - "bc1qatg2m52vj24zxvu92azvphxs08xp59prr86fcgdg42sp85v3qhsqsw88rc", - "bc1qau35ge0tgqlqvhn3pyv99ckukaxh9kes6e3jfpc4vw2ssfh3fpeq4dec6j", - "bc1qaygehcvv8334c6x9e42shrjz88kpnhw0gycz5fque4w4rjck6pnq7msl6g", - "bc1qaz28gc8e58uj5e80nu9j0yjws4zy84ahqlnfqd9ryhvc7a80vlyq430rvv", - "bc1qc058aal4cj2kk8e3tvhwu95cndy0lzr2zrxe49f3yasp693nyh7slfcgpl", - "bc1qc3h2hv8wnld70ujx8dyrmxs0ly27xs7us09y6e226yfl5vrgc2qsrxuucz", - "bc1qc9wlxjgu53ua5efqyjfwhwr3cn89smxq230h574v56edwmw0f0vq8qaakl", - "bc1qca7rh32jt8kg4kqtkcu98uucjlsslzsreh7tchk6hddvwe8kzzjshpppat", - "bc1qcf7wyjzz6f32je5vyk6pvketf5ykyg2lys66vwm43mc0g0gchzasy0k2e8", - "bc1qcmslz2gwsenf0xn9g90gvwkzympzxxhwhp8vrckudj0w5pdndwss92v3h4", - "bc1qcnp9057urvh2rrm09eya8mrasea7yys9q3q8hxs7unyct7nydtcsz57ajd", - "bc1qcnx924c7w3e8r42q3rvup60lw64gyn2kd4fs3pwckw7zw9966aaq568nz4", - "bc1qcudwp0xdlldgw78t6zfcklehwqt44a0hqt6n92k6uplk2w6q33fst0kdnv", - "bc1qcxzdm5pcfqnam3umsxsnwfykfx8j9rsl4nhrfqnt55qeg9q3625qvvyyuz", - "bc1qd3lvm6evz5suedhlwyrtf9cjrqtaq9unwe6423yl3j3exmq97a4s0mpzwt", - "bc1qdjxc3z0m2q5mz7lr67pmuq8hgqmhds6nmae0fkk2s07zge2f9jsseutev2", - "bc1qdm5rxs4w29c5u8wg7ppeqssgjrql23c0gsps7m0ctr6ratcl2a3sjnnq9g", - "bc1qdn29e8sa4xmwf0c4r6xkekea2mwt73d2qjsdtsne5j6gd9ujwysqmfh59v", - "bc1qdqs2zn6hrhvpxrtp0t82xfk2jv2j445hu7gguzm0ktwzdq5zzflqth7638", - "bc1qdvpvz88pq46qnvcz6jz08nmfldwhf8nx2v6x4z4tc79mpy8smkvqc9t9q8", - "bc1qe6xyfazpkry4nje0wmhfnv6faxfuu2drx4uryejdl2mhrplgeujs3knff6", - "bc1qe9q66vu5yyuzedfzugdh3yj5ask3n4wpx8pghw7ff6x7dd5p0gqqf66rxd", - "bc1qecswgzwg3sldnh4cwdfgly7f05sp2sela8g7hg0y0vp8l7t9nueqarz5w9", - "bc1qemj5cexuhn0ld93drv40kqfhvl2dag5vgy3d9vv4dar0hl6he3xs4fpjma", - "bc1qemtc7ddu4fvngf7pg8c5sukqswt3fr2zcnqnt7pju6a5fyrz7e5q96x25r", - "bc1qesf0u9lu5petyuukl9zq0g86wf2k69yehys2n4te7pf2y2csqpgst0tqhu", - "bc1qf285u7ygu9f2umg33a4c9wtdkfpahpt5kvqazk6arzktsw6vwguq02eckh", - "bc1qf2dh6acfagsayfprjzwzzysn4d4rdudkd6dq2adu2wj0t6ty8vlqnse73k", - "bc1qf3ret54m7mdevr8xwv8msstpcx6978vgwzfxkw3zjmlydfk4lqxqekert0", - "bc1qf42d25evlz8m503fgdw3trkzq9y53s5kwayfwjpvas26q2cnlt4skltleh", - "bc1qfdpu4yp2zk7xmm6tpfcatxe4gax5ktd0g9ra59jzcqtqkldrqe4qn0qqc2", - "bc1qfjrw5r0wttwu0u0gewyfcs2v37mujcxlhrfp7pqt48zwtjt2fs2shqjw2d", - "bc1qfrn20wgnt6l0a3qq4fxca8c66cuyqmvrfwkwwqhkxnf6z5xuxnpqzdzymf", - "bc1qg47q9u0ctw40jf0p8wswc67tcr96wel065f735cdu3e9aypqpumsvt4lun", - "bc1qg7egerrjv5ka0axjcwzh2rnkldr2k5yace828glhjyc6yz6s46sq6jk8xw", - "bc1qggrjslsem6ep9x4yxvyfdtgcxvyf9z85srlxpsuucrq6xsvaz3jspha83z", - "bc1qgp74f6xyajxznu2hnjh9txmzy7k7et3pkh9rc6enxt68fh8lw5js78s4d8", - "bc1qgpf2ar68l58zau2alfdnuw6afhm99k0nlfsrvcacd3jzpjlhq96qhxaxtr", - "bc1qgtldvmct0wa0569crgedr3ccrlydxfrymk7rfmalt7ehjqx54axsfv00gg", - "bc1qgtlgfqdyw60cawws4lvnesva46lgmyx2hhfl9xcnqp5m45u3dq3ska8nl2", - "bc1qgu5wpteehuuq8dcdd30d7la405j9r8wa2ttzqawt73lt8aec6kjs6u33r4", - "bc1qgzq2gq0l5nuxlaj45eyp4v3w6scaa9hx6f4chg60sufwmqwe4c7sp9tcng", - "bc1qh08szja77tucpmmwqmvyk72z0kjkqwuk2r327w7vwwh0f7997u6q3du9ga", - "bc1qh0yftewpsf8s3pyln8s6ky6qd6c7n643gndfhmkp7uczayua2mys9u6gw7", - "bc1qh3kulsckdz7d5ar3taglhqz4sa3wuasanyypuxyjscwzh0mm3g8qe9danw", - "bc1qh4qr0ytwjz7axxyrnl95la36jdqlygqpnul7wxx6a0mwzfmg9tkqkgszc7", - "bc1qhdaulu7pyhdhz4ty35v62gkx56nj2l7e6rz3x799sztdklan8n8sx863nu", - "bc1qhh2t6x7z57svrxdtl83xzdfz8melaueg7jmtpmsma40g2cfdxkes3lkd95", - "bc1qhjjcklsnjs0aseena8mmvlu7kufmeuhrlfz9l7dewpqsn43s707qkd7dny", - "bc1qhjxpm66t2k6v7c5zk6u2sdh8t36kas4a5402sqw82ewdpzuutf2s38ra4l", - "bc1qhl29w3rzcp9q3623hzvvnuksst0g48347qm82tr8ng3dfm9r0yvshlmvh2", - "bc1qhn7h9l2ky9l95sq7rqgaxp6c8ka0r5vfrghaln2pmeu67x4zpzzq3zcccf", - "bc1qhr5qw998er3rerm0lawlzzuuux6kja9zm4ryjls0aq5anprwuugs0yfcdg", - "bc1qhrgwkqetel4vpvj2azyyyhdvpg9u8j2dqz0svuwzh3vx4pvjf2dqtkt4uk", - "bc1qhrsvduw6j20dh4mseyf38zxqzd642zd6vmfjg9lmjj4d25qlvj5sv36ajm", - "bc1qhszm6vgtkhdn9cex8xurjkxjs2jhte0teetdnu4clr0ecxm20u5qhghyh9", - "bc1qj233g3tm9jejsnxvz3a06zqaqwwj2356f2n2sv572ggpahmmmxfqflfcx4", - "bc1qj390dgucrvx68jfad2wdpfhfuynvztgy9sy9a7009wmpecsdlu8q8zh0k4", - "bc1qj5dr2574mxgrxqxahymlvwna345d6d8424tyuqy3v2zhgu55j7fs2ezzq5", - "bc1qj9sat2haxfa7lsga96cxu26w9k4nr7z6sx4m33uzfq2x53sagcpqfzzjdz", - "bc1qjfmxg8fxqx286r254f3frzgra4sp4n5p2zczfsnrpkhdnyjyrhfqwul5wh", - "bc1qjnf3kfl592u85jlkvv99ms2qghv7yycrvg9902dtlh4lnfywg6wq5stn90", - "bc1qjnt2w6jx3ttx8dw0gt3nflm3ld0n2akkrkjzp73ua3kxzyhsj4jst848l6", - "bc1qjr7emlhxssap2npu5szrs5fa3cgxcnrd9gh9e3mdxzhdpye4puas7dp5pk", - "bc1qjsqyvnms83kvlnhc7r8phce0wj7j7nnvh8ye8ejxynke0uujwvksn2lely", - "bc1qjwjq6t60fwfsr7hf80yrhyy9lrvfjl2l9lpdwsw6sds4ph9uuglqjj53xx", - "bc1qk6ctvhc78eg80v989xmt7u5mwefewt728d9s0jxpgvqxa2m87xxsnu0wzw", - "bc1qk6n59st3mvj6ns0juv3vsdng48aszwdt7gyp0xlt8mrfn5qc9crsdx8dv8", - "bc1qkayh60m2uc86cere4z2gz03g2ayg2k726klqf0vx7lq588xzz0nqjvrg0q", - "bc1qkeh8sh6hzc49097j6fs8lgkfxpyas7wntelwnfqk4xhzccaj0nfq73s3f0", - "bc1qkjr6ew6d5nqf2vpxd7vm4w5lps72c8sxnc7hxnwcs9psqvpcmqkset3kdn", - "bc1qkka8ku2z79wq7wtkr44qmp6x3gftc9suju2q3ncw0xdy2nwj37jqu7hec8", - "bc1qkkhxgzvlvhymm2eprt0eukr3gw23zmarcuw087td9l34tmuprrysh643xt", - "bc1qkqap38eq4y8auh6z8yjwrj8r2p77n6xshcp8xpy2kkjcu7lhfyfqntsrjh", - "bc1qkrh06leyzgp84z0v495c0gr68tqn9ewue3lendpcrdz8htz0yw6q9aqyz3", - "bc1qktk40875p4gcafun6m2yzfxsrdt6d5h55c2zhd45wfefkusux27s38c764", - "bc1qku8s2753ttheldjrz5v4xmampnetjp3vy30m7j0nd3348e2m9rpq26l3ef", - "bc1qkvtt6kaw688mzu7txj9q3mn9m60pskv62gdz5j5kugd5fc7f8dfsdsfsq6", - "bc1qlftdm0w434ud5nz5ktnmak4gmr7k4x5qajmr5pvuh4vz9m4e8ljsujemsu", - "bc1qlk5g7mtuyxdy3txqz7q24yjffcdk6g6mr4ks48afv5234hly3hvslw8aje", - "bc1qllpem4drxvxu45r7aj7aqma50cylmaup07eynehs6v3f8zppcw2s00v3rt", - "bc1qln0rhtex8dwmqgex2mzkm47c437tunl6kw9amq7s4dye57fjk44s8x264n", - "bc1qlss2xnh3hsa78pedunw9qsm9nzpczrq90dtcp0sqknt3xkf5wyzsjtc662", - "bc1qlv8j6wgysv9xdpqtfau2lq5rcju0v4eyazrlawpgu8pwd2usz0dsfqc9up", - "bc1qlv8t6axsf50pe5wnt4x4xhqfudkumdvx3rc38f9kj3q82qhqy6lq626v47", - "bc1qm6hw09d24eqlz0x5r5txlpsrqvpf250fd5py3s4uwax6gwtdjfrq03yh9z", - "bc1qm72da6c6sq6a34rkwxk9sfpmy9kqea4dv33280hm5ghfdm4myvaqxnhcrw", - "bc1qm8z7nqmtmrurzcz82yec3sgk5rz67tm5rcaklqxajyxd348vppes86jvuz", - "bc1qmcvwrhj556capug3q5xzhwyhq82cps4l6ng0w573v6rl8zgkrlmqwh9386", - "bc1qmfzk56r5xvgfztej8fkg7rw76wy5qylh79shsaewpltfq4pz2qss5ajj7r", - "bc1qmhjm7sca3qwyujgfqtg3vw7swzxyg7mkxe4e7uzdef5ftc2kejwqjp7q7p", - "bc1qmj4g65rdqztaea7aqwnht5v2fhajmjat8j0q75nencrq2gu8q3ds5e0k5l", - "bc1qmr28gws3f589wmxf870mee4mapyzrv2209h3c992hhv3nn7ppctqhejqve", - "bc1qmschx4zu5yd9y82jqs6rwse3lftuzu97j9x76wdtx2avtee0g56qppefym", - "bc1qn3r3kqf90txgcsdxzu2s0p5avp79axlf98lzrwlmpnmxc3ak0vwsuxrepa", - "bc1qn55zpxs6fzjju36zuvkndzjfz0glhejtv299krn96sahl2pupthqhjc49k", - "bc1qneexyhzwx2g7ugw7m93kf48d6mdpt76gghmnr07s7dq7nhlwvc0shnryqd", - "bc1qnnx8uu6tuw5qlnqava2vjzrlsrwlaws7h6med4ndhtghrw8r5vcske26rv", - "bc1qntgp8cuk9sp2xadzc72h20qt372nvkjk5pmknvu9zntnf0yly5dqy7ev8j", - "bc1qnwa48yav84vzadrk79ulzrzu8s5epl7sfqelxufnpls63j7szx6s4n20hg", - "bc1qnwh5kqa6u5k2zevq0dfwn8z8mux4sz6t23g4xqeaf2lrd6zda75ssrs0gx", - "bc1qnx38lf4ds0lrw3s0l9fc745l0x3xdzw3w8stmxdvwu3v0n8jrcqsxm34ls", - "bc1qp798q5d3n8wsj3x345c7v65u9fwfe43e9vyupllmrrjq5k5n39rseze5vk", - "bc1qpa3ggjgfsr4cule3c42ns4y97k9z38whpx5940uw4mn6taeaaqjs97t28r", - "bc1qpcywcjgfel39zc762pmwayj9wu3v5xly0kjtdx2n2w0pandsce9q5rr54q", - "bc1qpr7fnnc9gan8vd9waym2rc2td24s72732wltnu9rc0yxhdssqaasr3up6s", - "bc1qpsftpydc86wxgga26r6nfq5tvrh5m34055kdrp25lulqu70shunskxflr3", - "bc1qptacp904tazvu54qxty5qunnwqhcm84ydrt39r9c4cqzkqrtju6qfd7eyt", - "bc1qpvwcac0hah03lepsvrx8zu9gdyvprfnckga4cfjg3ctaflwc4xvqp6hw3h", - "bc1qpwhmpvrau7f82hlh6es4wzedcq2rx5aqx5ue4ajsl4r7h29udx7q2ztulw", - "bc1qq5d4g9gcrwmwm8w965cwtkdgu60sl7fteahhtelzhna7rm29q0uswgca9t", - "bc1qq6jmww5tpr6t4cgl577d28cjr6mpxz85d6tkh7kjn2njkyd7flrqyt25yw", - "bc1qq77frdehk027ur54wzhhpg8dtqwpdn3emaxv42kxxlzmttrznzqs7mye34", - "bc1qq7m25904sfa4qn0na5gfssltjdmxwuvqxfl73dunza4s4cysqh7ssale4g", - "bc1qqea6940qjuhnuqqcu6u5ajeh3as8drwwwey56vxp90d05gzx72psw4ngua", - "bc1qqf4k7r66y3g3fpjlq6g46g5av5qgqvjpdhu6lhg68fwzm4rc4v0quux3vy", - "bc1qqfkncsw0gzr3vdyearnvt9w3ckuymet0v495dk5hwpfyjfeej42s28g3uz", - "bc1qqmsz5fe3dqcg7wxt3wc9s69td0yxnhlj97pvxknv8s25yuylawwsc99267", - "bc1qqsse9hgmx3w56c5suhkp2gqyxqhh6acc6wf0gnd7fjtp97f7c8esmhtj4x", - "bc1qqtmu9k5pakw4q4p242322x5tjy6tqtjj3u596nvksxjdhw789gfsmuskwz", - "bc1qqtyxkv77ce6s7hqw2ljg6axaxf4463q2krwne5vlxhhk3x7laasq3vqe5x", - "bc1qqx37qn2ca3gpjtuj5dkh8l6u4dh9sujn66f5gwe5maw7cvw47rmsej5kwl", - "bc1qqzq92mhj6a0v8kflqx6t0p3g47pdrqpv8f8gu7uk2a30kxxnplns4ez65a", - "bc1qr9kjw52l7m3nxhprgkt99nhrqtem5erzay6jy3j7xzyge65z3v2qse5xdw", - "bc1qra0g63370unwjrjpx4f267xss94zgxp78wqyc8gavqstnplakmfq0yq9f9", - "bc1qrg5y53hvpnu78pvy70v4s0qe52rnx3298gdvc7t9lsu2lya7deuql4a28j", - "bc1qrje4nstr7yy2qvmrfazlnjcsd3573fh6j9u58t446mn3ltp8e5vqgz8535", - "bc1qrjgp0ksa0wmhdfslzta0cem3s030jg3cxf7xfqtjcjy3jstj8wnsenhgs3", - "bc1qrmhgzejkazuezzduws22wuk6atlsxruytyh9ynx2855qpfezy5vskdznmv", - "bc1qrpcnmqxe8q4mq3n04qdy657wu23qxu8x5pvc0yx9adwz0x093gtsh5r2cv", - "bc1qrtyl2hpxu4lpl8x7fz6rlwvd43v6a9ynvqjf2mr7gegvnmdc0lxqas83mx", - "bc1qruqm8ef6lukm3kew536vxpys0nsrkdqqq7gn5eyjz6fsdee55frq9ksm66", - "bc1qrz3dctwmkkksya4n0cfhfdej480vx9shkt9vfe63qg0crmr3x68swt9jn8", - "bc1qs3w6eh4wqxphz769jlkglhdrmfaz4pj668aag2qrhcmrj74a02psr7mx0l", - "bc1qs6edu8cf7dtn2fq4earyhagryd3zsqvkdlaj285xptzjrq4szzkqz3fxze", - "bc1qsh9f8ackh9etwqjy6hd3vcqnc8wy9wnynsfypyv0p8nxesytkqeqtp7edq", - "bc1qsl92pxqza6xmw26xp6783slr46eh7wfdeyxnpyg0ammfcrc370esjrcfma", - "bc1qsmwlvh7v6wkg9kxtgh65q9lat00xx68g7nqycn8jdr5dudvqe8ksd4mxg7", - "bc1qsu0lfh6ae4pklru5cs6qscf9z88m4ckljlcxyqp5qfcvv5ygg40suzkygv", - "bc1qsvgk35j2tgq3anjydqlccunngrqur9pk3hdlfpgmd3kq69njaqmqdde6r0", - "bc1qswcfs3404reuplxzvmnxv23r82jzttw7ugm4gzwdwddpqa985mzs4ex3wv", - "bc1qsy0tanmqylsxjzpfecms96du4vp4tursfh9fyp4w0ff5aky7qe9sclj6f4", - "bc1qt5fugtlsp402yta0xvl79rlxc5epx9nd926f9dvct5r3uzuay5gqwyq55w", - "bc1qt5hqtxfktkuusrpcyus2zrc4x28hg23l35pushfmj0dsvmfrv2lq5vu9au", - "bc1qt8wuxew7ly35fvu2xaytmjvr6dlux5d05p9qahzw6h3axkc5p2ksla52xp", - "bc1qtahzsvs0hrt22dmdt3268hpdh9eh3rlxprac584x8l9s2df6jefq5nse9k", - "bc1qtcx3lve9uscxevqv0ekj2e75kjy6mqn0aedxq6xrtxv9td0jm7dsj7vtuu", - "bc1qthgusw4jxlw2e9h69r8hpv22df47dups2gmkzlgp7l8ww27eew6q7ewjvv", - "bc1qtjq2ypqq3kamya3dsfphy7mdqwp5nc4adaxan6mqdze59d7ptu3qc9ryth", - "bc1qtllzgt5hsxvnhga8tq3nars4d94c263q8dm8vakrq6r42648vhtqtyy36q", - "bc1qtr7kzsz669mfn8677ltxlm8c3t9nkzskj2v3lexx0kxhamzg7zxspkd8w9", - "bc1qttkf88qadw9mlvnfftw37gllk8q7m3jmfxrugath75rl3ydpt9zqlfjzzl", - "bc1qtuvqgvkjnq0gw4cc6p60yc3y6j7jzz937cs0wy6w09h5dyg36d0q8xsjlh", - "bc1qty4wtp9zhvtjuj7p36vf4avs98l4vata8634m3z4ys99t5qlhjwscslcg5", - "bc1qtyaqju2ar9x2v6c4jf42j9x9qzjcwev9u8uys524qnhznths37zq27ppfm", - "bc1qtym0jxefs7z9vr5y50gdsmtdfgcfyr9rxema6n23jw4cswulcu6qsj8t92", - "bc1qtzn5ktk3hhhgaweupzt9k6k9m00jws3xn5teplwupfy2ltl0xcjsl4g02l", - "bc1qu5pttfk0s407dtr7ds2e547ugq80ay4n82qpvwqzsvlccdjcp84qxpef24", - "bc1qu6jn53gw9t3j62lee0ht0p3dhtkycg24gj5kcp230jq6fn4jcsnsxjxn6h", - "bc1quezt5y4lqf37guytyf8jj56eywjvsanv7u8fq6q8p46hg02tc5vsyx3let", - "bc1qup8qwemtepa2wf4r8w599lphxq6f38s3ta8925eu7y8zvp4x6v2svqrfq2", - "bc1qv85ky08r24v3cnysh8hk9c5ftg60f2kwellmzpzlqnwfawgtdqesghlznz", - "bc1qvax0qf0zgycnwyd2cmgzsr65l6mldc7r3wm4876xg4u7rtywp2dsw034tt", - "bc1qvcwzkv448c9rz60fas5wqgnrl5gzvh0nnacyudqcsxhr0j9fa24s48m79n", - "bc1qvkn8eymy7c2rpw2c5x6x8td4hrul6vx79y4mtd4zzdxdrxwk9q2sv6rnn8", - "bc1qvu6u5tnjk22sggwkp2j3vlxle5mq9xz8v82g7j57k9ele02wjmkqz9vrvt", - "bc1qw0lsnwv0sga0n3rcpaxtjg4z6jhf0xu6dyhdv7jcx9d8gm4phtesr9vywe", - "bc1qw5ue35s2rms9wz2ajxu4h83uzaylax7jqwp3h3cxamj9j05dgw9q6nnr24", - "bc1qwu39fckqy2cl9z42994xyhg657q7txajwakf9sdzt4f3caluk3fqz3zl94", - "bc1qwx5sl8mls6hkmumjnekf6szuzh979cmgzsz8dqm3xeayrxfgz4us8m8y4z", - "bc1qwzy2ezy8zskmuu2v6y60w5uqe46qeql94may8fetnl9uyahlx0lsthg04q", - "bc1qx628pacq3m5px4zjjagrtpc8a6v3my5l06rxcrl5xr3vfv4s00cqcxmlhy", - "bc1qx6ws8f6p3zzevs0rf5kvu7e074snfmr8mms8ezgreg7kas84l7ssptyejn", - "bc1qx9yj7x4xmek7rm5styss3vcdth48p6uqzjdfsua9s7v430jq2r8q0j4kge", - "bc1qxaj93j90njr4lwrevjhg3zr2qyr0zerw0d8fxlxhep6c8uu4jqdqhlqptt", - "bc1qxpa34lagwsvq5t8ul09y2hz2dh0flkampx8lqyp3jdt4lpwaxx2qe2uvxj", - "bc1qxs6nw2cjmctjeqjk5lhr47uv6anmge3ut66gmuexcryrymusqt9s2tvz62", - "bc1qxuv7ge2hcfhzykp49g2pxz69p99d0aujx5wupud28tulftlc0agslcmuuf", - "bc1qxyx06rxxprx9plp009nvl0f0ft5e3af3tt53n7pctylafqfltwvqyk7sfg", - "bc1qy2av32x3tkfucu25dqfh4nqkf50ayng43ervl7fcwg4crcu3queqtlcrsa", - "bc1qy7efv6fkened6hnhzydmcd9eatj20dsnc4px2gtmkedc0xznlcxq6n04jv", - "bc1qy8hl8khkpcsnjqvgna6h8249x4at9vjern9meph0e5el4g0nudlq7kd773", - "bc1qy9f5q32h9rmem40nd06e4l8cxwqlttuale9s6q076aymt0dayx6qekhfmp", - "bc1qy9w004s6gek29k3npgmxq8huqx48l2gatx9yqlu0rchxzlnn7nlsn059c2", - "bc1qyr5df2mhp3lfjrd2sjx56eqm7netrtdtwengw657k7k6hnmyedlqwfx472", - "bc1qys46dh5q94lykgqrvthhh52ajsk7s4c5ex7p9t7tvqe3uxheq2us3rwra2", - "bc1qywh2j5t52zhqhvlqymsw78mq9lfrh4utf47ufhfpkgfzj3trqaaswuak4h", - "bc1qz2fe23n5ykggw9394gxly6jqxk23rmhxesvd7q9d3sfee6cqmycqha09qg", - "bc1qzchnul757l7q2yrhtv2gga3h560vfjdj002xcstcd5cvspa3puks4h7gu5", - "bc1qzdah777dzr46n8wwdmr2y8etxzt0e66j90v4f9m2dj2wzjk3mtgqhamaj5", - "bc1qze2smuhn3k3yxq49fzsmz4pfjemnhpsjt5g3xc8slyh42edy23zsxjsr73", - "bc1qzk3kkegykpk0uzyekqfyr4l4ky62hx7tt9cx4r5klv98x3f37z0sr26gaf", - "bc1qzlhsk5ftpz6uaxgmm8hel59v7avmn0q8wp9gaaxdzzkde7ryumeqdnte02", - "bc1qzm3t8m5fcnz8t22kf2lyr97u2wret0pkjvzngldnqq5su434tsrqxjncvj", -]; +const owners = bitcoinAddressBook.wbtc -async function tvl(api, block){ +async function tvl(api){ if(api.timestamp > Date.now()/1e3 - 3600){ return sumTokens({ owners, api }) } else { - return { - [ADDRESSES.ethereum.WBTC]: (await sdk.api.erc20.totalSupply({ target: ADDRESSES.ethereum.WBTC, block:block })).output - } + const supply = await api.call({ target: ADDRESSES.ethereum.WBTC, abi: 'erc20:totalSupply', }) + api.add(ADDRESSES.ethereum.WBTC, supply) } } module.exports = { - bitcoin: { - tvl, - }, + bitcoin: { tvl }, methodology: `TVL for WBTC consists of the BTC deposits in custody that were used to mint WBTC`, }; diff --git a/projects/weave/index.js b/projects/weave/index.js index 763b0ef497..a2691b0457 100644 --- a/projects/weave/index.js +++ b/projects/weave/index.js @@ -15,7 +15,6 @@ async function tvl(api) { module.exports = { methodology: 'gets the balance of the strategy contract', - start: 5793963, kava: { tvl, } diff --git a/projects/weft-finance-v2/index.js b/projects/weft-finance-v2/index.js new file mode 100644 index 0000000000..41e84af097 --- /dev/null +++ b/projects/weft-finance-v2/index.js @@ -0,0 +1,38 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { post } = require('../helper/http') + +const { sumTokens } = require('../helper/chain/radixdlt'); + +const KEY_VALUE_STORE_URL = `https://mainnet.radixdlt.com/state/key-value-store/` + +const lendingPool = 'component_rdx1czmr02yl4da709ceftnm9dnmag7rthu0tu78wmtsn5us9j02d9d0xn' + +const lendingMarket = 'component_rdx1cpy6putj5p7937clqgcgutza7k53zpha039n9u5hkk0ahh4stdmq4w' + +const resourcePoolsKVS = 'internal_keyvaluestore_rdx1kzjr763caq96j0kv883vy8gnf3jvrrp7dfm9zr5n0akryvzsxvyujc' + +async function tvl(api) { + // + return sumTokens({ owners: [lendingPool, lendingMarket], api, transformLSU: true }); +} + +async function borrowed(api) { + + let keys = (await post(`${KEY_VALUE_STORE_URL}/keys`, { "key_value_store_address": resourcePoolsKVS })).items.map(i => ({ key_hex: i.key.raw_hex })) + + let data = (await post(`${KEY_VALUE_STORE_URL}/data`, { "key_value_store_address": resourcePoolsKVS, "keys": keys })).entries.map(i => ([i.key.programmatic_json.value, i.value.programmatic_json.fields])) + + data.forEach(([key, fields]) => { + + let totalLoan = fields[6].fields[1].value + + api.add(key, +totalLoan) + + }); + +} + +module.exports = { + radixdlt: { tvl, borrowed }, + timetravel: false, +}; diff --git a/projects/welnance/index.js b/projects/welnance/index.js index 4dd3ede56f..b5fd292628 100644 --- a/projects/welnance/index.js +++ b/projects/welnance/index.js @@ -1,16 +1,11 @@ -const ADDRESSES = require('../helper/coreAssets.json') const { compoundExports } = require("../helper/compound"); const comptroller = "0xdc21c1dAF3277f07fFA6EB09fCD3E07EDc36DC0A"; module.exports = { - bsc: { - ...compoundExports( comptroller, - "bsc", - "0x38e22c429e62530cbB59B90bF14a71346C727752", - ADDRESSES.bsc.WBNB - ), - }, + bsc: compoundExports(comptroller, + "0x38e22c429e62530cbB59B90bF14a71346C727752", + ), methodology: "Same as compound, we just get all the collateral (not borrowed money) on the lending markets", }; diff --git a/projects/wemix-lend/index.js b/projects/wemix-lend/index.js index 94298ddd35..ea92a8e390 100644 --- a/projects/wemix-lend/index.js +++ b/projects/wemix-lend/index.js @@ -1,10 +1,8 @@ const {compoundExports} = require('../helper/compound'); -const { nullAddress } = require('../helper/tokenMapping'); const compound = "0x929620a759a564e3C273e8a4efCDa5806da168F2"; const cETH = "0x34b9B18fDBE2aBC6DfB41A7f6d39B5E511ce3e23"; -const chain = "wemix"; module.exports = { - wemix: compoundExports(compound, chain, cETH, nullAddress), + wemix: compoundExports(compound,cETH), }; \ No newline at end of file diff --git a/projects/whitewhale-dex/index.js b/projects/whitewhale-dex/index.js index 3089d9a942..5762a195c3 100644 --- a/projects/whitewhale-dex/index.js +++ b/projects/whitewhale-dex/index.js @@ -21,8 +21,11 @@ module.exports = { ] } - Object.keys(factory).forEach(chain => { const contract = factory[chain] - module.exports[chain] = { tvl: getFactoryTvl(contract) } + if (chain === 'comdex') { + module.exports[chain] = { tvl: () => ({}) } + } else { + module.exports[chain] = { tvl: getFactoryTvl(contract) } + } }) \ No newline at end of file diff --git a/projects/windfall/index.js b/projects/windfall/index.js new file mode 100644 index 0000000000..d4afc50580 --- /dev/null +++ b/projects/windfall/index.js @@ -0,0 +1,17 @@ +const { sumTokensExport } = require("../helper/unwrapLPs") +const ADDRESSES = require('../helper/coreAssets.json') + +module.exports = { + methodology: 'Counts the number of tokens in the Windfall contract.', +}; + +const config = { + canto: { tokens: ['0xEe602429Ef7eCe0a13e4FfE8dBC16e101049504C'], owners: ['0x2d9dDE57Ec40baF970Dbc8f7933861013B661c93'] }, + blast: { tokens: [ADDRESSES.blast.USDB, ADDRESSES.blast.WETH], owners: ['0x0a4C236254C4C0bD5DD710f1fa12D7791d491358', '0x6d89540c22868ff9e3676423162a9e909BBB2558',] }, +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: sumTokensExport(config[chain]) + } +}) \ No newline at end of file diff --git a/projects/winr-protocol/index.js b/projects/winr-protocol/index.js index f743a7e34c..243db35d0c 100644 --- a/projects/winr-protocol/index.js +++ b/projects/winr-protocol/index.js @@ -2,7 +2,6 @@ const { gmxExports } = require('../helper/gmx') const WINR_VAULT_CONTRACT = "0x8c50528F4624551Aad1e7A265d6242C3b06c9Fca"; module.exports = { - start: 67057671, arbitrum: { tvl: gmxExports({ vault: WINR_VAULT_CONTRACT }), }, diff --git a/projects/wisdomtree/index.js b/projects/wisdomtree/index.js new file mode 100644 index 0000000000..c0aec1c3f6 --- /dev/null +++ b/projects/wisdomtree/index.js @@ -0,0 +1,45 @@ +// Since the NAVs are hardcoded, here are the links to find the different NAVs from WisdomTree's PoR +// https://www.wisdomtree.com/investments/digital-funds/money-market/wtgxx +// https://www.wisdomtree.com/investments/digital-funds/fixed-income/flttx +// https://www.wisdomtree.com/investments/digital-funds/fixed-income/wtsyx +// https://www.wisdomtree.com/investments/digital-funds/fixed-income/wttsx +// https://www.wisdomtree.com/investments/digital-funds/fixed-income/tipsx +// https://www.wisdomtree.com/investments/digital-funds/fixed-income/wtstx +// https://www.wisdomtree.com/investments/digital-funds/fixed-income/wtlgx +// https://www.wisdomtree.com/investments/digital-funds/equity/spxux +// https://www.wisdomtree.com/investments/digital-funds/asset-allocation/wtsix + +const { getAssetSupply } = require('../helper/chain/stellar.js') + +const CONFIG = { + stellar: [ + { asset: 'WTGX-GDMBNMFJ3TRFLASJ6UGETFME3PJPNKPU24C7KFDBEBPQFG2CI6UC3JG6', NAV: 1.000 }, // WTGX + { asset: 'FLTT-GBTZKH3RNKW46XEZNCGZEBAGJISKDZKQXKSQ2N5G5SFX36TLWKKR6QJ6', NAV: 1.013 }, // FLTTX + { asset: 'WTSY-GB3ZUC7FGDEEBXY3BDEJWMPNGBFA66YRI4QQT6PBO3ZT6F33S7RL36VF', NAV: 1.004 }, // WTSYX + { asset: 'WTTS-GBBV5CF7UPA2PYRPA632URLB55BWML7X4H33ZRCDWMTULOXDGPHJR5VI', NAV: 9.833 }, // WTTSX + { asset: 'TIPS-GAJ4KSYLVBJKQ4UBPKJJXPYWVIRZWVTIYRMHBXTHGCDS4XJXXYEUALVD', NAV: 9.662 }, // TIPSX + { asset: 'WTST-GDEBI5X7J4IDXCSVV3KPFZIHQRCBVF3DAZMS5H7KYOBK45T6XYGDE77P', NAV: 9.511 }, // WTSTX + { asset: 'WTLG-GAK7PE7DD4ZRJQN3VBCQFBKFV53JGUM2SQATQAKLFK6MVONPGNYK34XH', NAV: 8.645 }, // WTLGX + { asset: 'SPXU-GDJBVX3QA5HJPBSAU5VIX2W6MC37NU4UFXPKEGK42SJCYN6AEQ4Z6COM', NAV: 15.815 }, // SPXUX + { asset: 'WTSI-GAD22PDBRFEMXAKPFDP4JGDFWKKD6VPXWUWEAXBS6ZYJYFFQDUN7HAFG', NAV: 10.282 }, // WTSIX + ], + ethereum: '0x1fecf3d9d4fee7f2c02917a66028a48c6706c179' // WTGX +} + +const stellarTvl = async (api) => { + const assets = CONFIG[api.chain] + for (const { asset, NAV } of assets) { + const supply = await getAssetSupply(asset) + api.addUSDValue(supply * NAV) + } +} + +const evmTVL = async (api) => { + const decimals = await api.call({ target: CONFIG[api.chain], abi: 'erc20:decimals' }) + const supply = await api.call({ target: CONFIG[api.chain], abi: 'erc20:totalSupply' }) + api.addUSDValue(supply / 10 ** (decimals)) +} + +Object.keys(CONFIG).forEach((chain) => { + module.exports[chain] = { tvl: chain === 'stellar' ? stellarTvl : evmTVL }; +}); diff --git a/projects/wise-lending-v2/index.js b/projects/wise-lending-v2/index.js index bb9c673262..9d6c1503e4 100644 --- a/projects/wise-lending-v2/index.js +++ b/projects/wise-lending-v2/index.js @@ -1,4 +1,4 @@ -const ADDRESSES = require('../helper/coreAssets.json') +const ADDRESSES = require('../helper/coreAssets.json'); async function tvl(api) { const { lending: lendingContract, tvlAddresses } = config[api.chain]; @@ -12,9 +12,9 @@ async function borrowed(api) { abi: 'function getPseudoTotalBorrowAmount(address) view returns (uint256)', target: lendingContract, calls: borrowAddresses - }) + }); - api.add(borrowAddresses, borrowAmounts) + api.add(borrowAddresses, borrowAmounts); } const aavePools = [ @@ -25,6 +25,16 @@ const aavePools = [ "0x6ab707Aca953eDAeFBc4fD23bA73294241490620", ]; +const wisePools = [ + ADDRESSES.ethereum.WETH, + ADDRESSES.ethereum.USDT, + ADDRESSES.ethereum.USDC, + ADDRESSES.ethereum.DAI, + ADDRESSES.ethereum.WBTC, + ADDRESSES.ethereum.WSTETH, +]; + + const config = { arbitrum: { lending: '0x9034a49587bD2c1Af27598E0f04F30Db66C87Ebf', @@ -32,6 +42,12 @@ const config = { tvlAddresses: aavePools, borrowAddresses: aavePools }, + ethereum: { + lending: '0x78190e4c7C7B2c2C3b0562F1f155a1FC2F5160CA', + feeManager: '0x0bc24e61daad6293a1b3b53a7d01086bff0ea6e5', + tvlAddresses: wisePools, + borrowAddresses: wisePools + }, }; Object.keys(config).forEach(chain => { diff --git a/projects/wonderland/index.js b/projects/wonderland/index.js index 023a1f9903..47173b354f 100644 --- a/projects/wonderland/index.js +++ b/projects/wonderland/index.js @@ -1,6 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') const { stakings } = require("../helper/staking"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const TimeStaking = "0x4456B87Af11e87E329AB7d7C7A246ed1aC2168B9"; const RevenueSharingFarm = "0xC172c84587bEa6d593269bFE08632bf2Da2Bc0f6"; @@ -10,67 +9,45 @@ const wMEMO = "0x0da67235dd5787d67955420c84ca1cecd4e5bb3b"; const Treasury_Eth = "0x355D72Fb52AD4591B2066E43e89A7A38CF5cb341"; const Treasury_Avax = "0x88bbE6dE858B179841c8f49a56b99fb0522a263a"; -async function avaxTvl(timestamp, ethBlock, chainBlocks) { - const balances = {}; - const transform = (addr) => - addr.toLowerCase() === ADDRESSES.avax.USDt - ? [ADDRESSES.ethereum.USDT]: `avax:${addr}`; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [ADDRESSES.avax.USDt, false], - [ADDRESSES.avax.USDC_e, false], - ["0x39fC9e94Caeacb435842FADeDeCB783589F50f5f", false], // KNC - ["0x63682bDC5f875e9bF69E201550658492C9763F89", false], // BSGG - ["0x0da67235dd5787d67955420c84ca1cecd4e5bb3b", false], //wMEMO - ], - [Treasury_Avax], - chainBlocks.avax, - "avax", - transform - ); - - const wmemoAddress = transform(wMEMO); - delete balances[wmemoAddress]; - - return balances; +async function avaxTvl(api) { + await api.sumTokens({ + owner: Treasury_Avax, tokens: [ADDRESSES.avax.USDt, + ADDRESSES.avax.USDC_e, + "0x39fC9e94Caeacb435842FADeDeCB783589F50f5f", // KNC + "0x63682bDC5f875e9bF69E201550658492C9763F89", // BSGG + "0x0da67235dd5787d67955420c84ca1cecd4e5bb3b", //wMEMO + ] + }) + api.removeTokenBalance(wMEMO) } -async function ethTvl(timestamp, ethBlock, chainBlocks) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [ADDRESSES.ethereum.LUSD, false], - [ADDRESSES.ethereum.FXS, false], // FRAX - [ADDRESSES.ethereum.CVX, false], - [ADDRESSES.ethereum.cvxCRV, false], - ["0x55C08ca52497e2f1534B59E2917BF524D4765257", false], // UwU - ["0x69570f3E84f51Ea70b7B68055c8d667e77735a25", false], // BSGG - ["0x04906695D6D12CF5459975d7C3C03356E4Ccd460", false], // sOHM - ["0x29127fE04ffa4c32AcAC0fFe17280ABD74eAC313", false], // sifu - [ADDRESSES.ethereum.TUSD, false], - ["0x66761Fa41377003622aEE3c7675Fc7b5c1C2FaC5", false], // CPOOL - ["0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF", false], // ALCX - ["0xdB25f211AB05b1c97D595516F45794528a807ad8", false], // EURS - [ADDRESSES.ethereum.GNO, false], // GNO - ["0x41D5D79431A913C4aE7d69a668ecdfE5fF9DFB68", false], // INV - ["0xE80C0cd204D654CEbe8dd64A4857cAb6Be8345a3", false], // JPEG - ["0x0C10bF8FcB7Bf5412187A595ab97a3609160b5c6", false], // USDD - ["0xAf5191B0De278C7286d6C7CC6ab6BB8A73bA2Cd6", false], // STG - ["0x6243d8CEA23066d098a15582d81a598b4e8391F4", false], // FLX - [ADDRESSES.ethereum.SNX, false], - [ADDRESSES.ethereum.USDT, false], - [ADDRESSES.ethereum.DAI, false], - ], - [Treasury_Eth], - ethBlock, - "ethereum" - ); - - return balances; +async function ethTvl(api) { + return api.sumTokens({ + owner: Treasury_Eth, tokens: [ + ADDRESSES.ethereum.LUSD, + ADDRESSES.ethereum.FXS, // FRAX + ADDRESSES.ethereum.CVX, + ADDRESSES.ethereum.cvxCRV, + "0x55C08ca52497e2f1534B59E2917BF524D4765257", // UwU + "0x69570f3E84f51Ea70b7B68055c8d667e77735a25", // BSGG + "0x04906695D6D12CF5459975d7C3C03356E4Ccd460", // sOHM + "0x29127fE04ffa4c32AcAC0fFe17280ABD74eAC313", // sifu + ADDRESSES.ethereum.TUSD, + "0x66761Fa41377003622aEE3c7675Fc7b5c1C2FaC5", // CPOOL + "0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF", // ALCX + "0xdB25f211AB05b1c97D595516F45794528a807ad8", // EURS + ADDRESSES.ethereum.GNO, // GNO + "0x41D5D79431A913C4aE7d69a668ecdfE5fF9DFB68", // INV + "0xE80C0cd204D654CEbe8dd64A4857cAb6Be8345a3", // JPEG + "0x0C10bF8FcB7Bf5412187A595ab97a3609160b5c6", // USDD + "0xAf5191B0De278C7286d6C7CC6ab6BB8A73bA2Cd6", // STG + "0x6243d8CEA23066d098a15582d81a598b4e8391F4", // FLX + ADDRESSES.ethereum.SNX, + ADDRESSES.ethereum.USDT, + ADDRESSES.ethereum.DAI, + + ] + }) } module.exports = { diff --git a/projects/woo-cex/index.js b/projects/woo-cex/index.js index d905a62a60..48edcacf0e 100644 --- a/projects/woo-cex/index.js +++ b/projects/woo-cex/index.js @@ -1,4 +1,5 @@ const { cexExports } = require('../helper/cex') +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') const owners = [ '0x0d83f81bc9f1e8252f87a4109bbf0d90171c81df', @@ -8,12 +9,7 @@ const owners = [ ] const config = { - bitcoin: { - owners: [ - 'bc1qh78w4qq9v2dqntjtxne97kp9u2485jdqrfsghh', - 'bc1qm4hycszv0v0qel3swxqyp57nkpnnrda4rc55lm' - ], - }, + bitcoin: { owners: bitcoinAddressBook.wooCEX }, ethereum: { owners }, fantom: { owners }, avax: { owners }, diff --git a/projects/woofi-earn/index.js b/projects/woofi-earn/index.js index fdb802a815..76132e08a6 100644 --- a/projects/woofi-earn/index.js +++ b/projects/woofi-earn/index.js @@ -6,10 +6,14 @@ module.exports = { misrepresentedTokens: true, }; -(['fantom', 'bsc', 'avax', 'polygon', 'arbitrum', 'optimism', ]).forEach(chain => { +(['fantom', 'bsc', 'avax', 'polygon', 'arbitrum', 'optimism', 'era', 'base', 'mantle']).forEach(chain => { module.exports[chain] = { tvl: async () => { - let data = await get('https://fi-api.woo.org/yield?network=' + chain) + let network = chain + if (chain == 'era') { + network = 'zksync' + } + let data = await get('https://fi-api.woo.org/yield?network=' + network) const tvl = data.data.total_deposit / 1e18 return toUSDTBalances(tvl) } diff --git a/projects/woofi.js b/projects/woofi.js index 1dcba24a85..1cce08d2c8 100644 --- a/projects/woofi.js +++ b/projects/woofi.js @@ -57,6 +57,7 @@ const wooPPConfig = { ethereum: [], era: [ ADDRESSES.era.WETH, // WETH + ADDRESSES.era.ZK, // ZK ADDRESSES.era.USDC, // USDC.e '0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4', // native USDC ], @@ -66,18 +67,28 @@ const wooPPConfig = { ], linea: [ ADDRESSES.linea.WETH, // WETH + '0x3aAB2285ddcDdaD8edf438C1bAB47e1a9D05a9b4', // WBTC ADDRESSES.linea.USDC, // native USDC + ADDRESSES.linea.USDT, // USDT ], base: [ ADDRESSES.base.WETH, // WETH + '0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf', // cbBTC ADDRESSES.base.USDbC, // USDbC ADDRESSES.base.USDC, // native USDC ], mantle: [ ADDRESSES.mantle.WMNT, // WMNT ADDRESSES.mantle.WETH, // WETH + '0xcDA86A272531e8640cD7F1a92c01839911B90bb0', // mETH ADDRESSES.mantle.USDT, // USDT ADDRESSES.mantle.USDC, // USDC + '0xE6829d9a7eE3040e1276Fa75293Bde931859e8fA', // cmETH + ], + sonic: [ + ADDRESSES.sonic.wS, //wS + '0x50c42dEAcD8Fc9773493ED674b675bE577f2634b', // WETH + ADDRESSES.sonic['USDC.e'], // USDC.e ], } @@ -153,6 +164,12 @@ const chainConfig = { woo: null, stakingContract: null, stakingContractV2: null, + }, + sonic: { + wooPPContract: '0xEd9e3f98bBed560e66B89AaC922E29D4596A9642', + woo: null, + stakingContract: null, + stakingContractV2: null, } } diff --git a/projects/worldes/index.js b/projects/worldes/index.js new file mode 100644 index 0000000000..f3a4353fc9 --- /dev/null +++ b/projects/worldes/index.js @@ -0,0 +1,36 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +const config = { + arbitrum: { dvmFactory: '0x3bA0388E64900e274f2C6fCfaE34Eed65c01282A', fromBlock: 228710000, dspFactory: '0xf3AadDd00C2E263d760BE52BB7142276B74E8b47', WorldesRWATokenFactory: '0x4Ef31B45919aE1874840B9563D46FCD57E2Ae0b7', WorldesDvmProxy: '0x7e93ED796aFD3D9a6e9a24c668153fBb981bE60E', WorldesDspProxy: '0xE6933Fb2dc110a43fdeC6bB83d6ae99aC557c452', WorldesMineProxy: '0x2eFda50249176e3ee1A26964Ad6496DC5aA2aCE7', WES: '0xcEab5Af10D5376016c8C352ea77F8Bc6a88bDa11' }, +} + +Object.keys(config).forEach(chain => { + const { dvmFactory, fromBlock, dspFactory, blacklistedTokens, WES, } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const ownerTokens = [] + if (WES) { + const supply = await api.call({ abi: 'uint256:totalSupply', target: WES }) + api.add(WES, supply) + } + + await builder(dvmFactory, 'event NewDVM(address baseToken, address quoteToken, address creator, address pool)'); + await builder(dspFactory, 'event NewDSP(address baseToken, address quoteToken, address creator, address pool)'); + + return api.sumTokens({ ownerTokens, blacklistedTokens, permitFailure: true, }) + + async function builder(factorys, event) { + if (!Array.isArray(factorys)) + factorys = [factorys]; + const res = factorys.map(factory => addLogs(factory, event)); + await Promise.all(res) + } + + async function addLogs(target, eventAbi) { + const convert = i => [[i.baseToken, i.quoteToken], i.pool] + let logs = await getLogs2({ api, target, eventAbi, fromBlock }) + ownerTokens.push(...logs.map(convert)) + } + } + } +}) \ No newline at end of file diff --git a/projects/wowswap/index.js b/projects/wowswap/index.js index c5b9da94b0..2d618234b8 100644 --- a/projects/wowswap/index.js +++ b/projects/wowswap/index.js @@ -40,7 +40,7 @@ function tvl(chain) { } module.exports = { - start: 1618218000, // Mon Apr 12 2021 09:00:00 + start: '2021-04-12', // Mon Apr 12 2021 09:00:00 misrepresentedTokens: true, }; diff --git a/projects/wrappedfi.js b/projects/wrappedfi.js index 8e9ca0d4b3..dbfb35f467 100644 --- a/projects/wrappedfi.js +++ b/projects/wrappedfi.js @@ -1,122 +1,21 @@ -const sdk = require("@defillama/sdk"); - -const ethContracts = [ - /** - * WCELO - * - * coingecko: wrapped-celo - * coinmarketcap: wrapped-celo - */ - '0xE452E6Ea2dDeB012e20dB73bf5d3863A3Ac8d77a', - - /** - * WCUSD - * - * coingecko: wrapped-celo-dollar - * coinmarketcap: wrapped-celo-dollar - */ - '0xad3E3Fc59dff318BecEaAb7D00EB4F68b1EcF195', - - /** - * WFIL - * - * coingecko: wrapped-filecoin - * coinmarketcap: wrapped-filecoin - */ - '0x6e1A19F235bE7ED8E3369eF73b196C07257494DE', - - /** - * WFLOW - * - * coingecko: wrapped-flow - */ - '0x5c147e74d63b1d31aa3fd78eb229b65161983b2b', - - /** - * WKDA - * - * coingecko: wrapped-kadena - */ - '0x85d7bdfc9c3426b33a684241eeee70385bc42820', - - /** - * WLTC - * - * no price available - */ - '0x53c4871322Bb47e7A24136fce291a6dcC832a294', - - /** - * WXRP - * - * coingecko: wrapped-xrp - */ - '0x39fBBABf11738317a448031930706cd3e612e1B9', - - /** - * WZEC - * - * coingecko: wrapped-zcash - * coinmarketcap: wrapped-zec - */ - '0x4A64515E5E1d1073e83f30cB97BEd20400b66E10' -]; - -const celoContracts = [ - /** - * CBTC or WBTC - * - * no identifiers for coingecko or coinmarketcap - */ - '0xD629eb00dEced2a080B7EC630eF6aC117e614f1b', - - /** - * CETH - * - * no identifiers for coingecko or coinmarketcap - */ - '0x2def4285787d58a2f811af24755a8150622f4361', // ceth -]; - -const ethTvls = ethContracts.map((contractAddress) => { - return async (timestamp, block) => { - if (contractAddress == '0x53c4871322Bb47e7A24136fce291a6dcC832a294') { - return { - litecoin: ( - await sdk.api.erc20.totalSupply({ - block, - target: contractAddress, - }) - ).output / 10 ** 18, - } - } - return { - [contractAddress]: ( - await sdk.api.erc20.totalSupply({ - block, - target: contractAddress, - }) - ).output, - }; - }; -}); - -const celoTvls = celoContracts.map((contractAddress) => { - return async (timestamp, ethBlock, { celo: block }) => { - return { - [`celo:${contractAddress}`]: ( - await sdk.api.erc20.totalSupply({ - block, - target: contractAddress, - chain: "celo", - }) - ).output, - }; - }; -}); +const { cexExports } = require('./helper/cex') +const ADDRESSES = require('./helper/coreAssets.json') module.exports = { - ethereum: { tvl: sdk.util.sumChainTvls(ethTvls), }, - celo: { tvl: sdk.util.sumChainTvls(celoTvls), }, + ...cexExports({ + ripple: { + owners: ['r4Pr9aBnqN84hbkmJo4HwUtLj63E5vGFyE'] + }, + celo: { + tokensAndOwners: [ + [ADDRESSES.null, '0x84d9dcAc2f00F2Cd903E340b5241EB6e5c198572'] + ] + }, + ethereum: { + tokensAndOwners: [ + [ADDRESSES.null, '0xD6873b9592AB601E6cE6a6A781799d54961942F3'] + ] + }, + }), methodology: 'The TVL consists of the underlying capital held in custody.' }; \ No newline at end of file diff --git a/projects/xWeowns/index.js b/projects/xWeowns/index.js index fe07eb3c84..006f1e1b8c 100644 --- a/projects/xWeowns/index.js +++ b/projects/xWeowns/index.js @@ -1,25 +1,3 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); - -const contracts = { - "xWeowns": "0xaBA0Bb586335B938a7a817A900017D891268d32c", - "USDT": "0x32D2b9bBCf25525b8D7E92CBAB14Ca1a5f347B14", - "USDTethereum": ADDRESSES.ethereum.USDT -}; - -async function tvl(timestamp, block, chainBlocks) { - return { - [ contracts.USDTethereum ]: - (await sdk.api.abi.call({ - target: contracts.USDT, - params: contracts.xWeowns, - abi: 'erc20:balanceOf', - block: chainBlocks.lachain, - chain: 'lachain' - })).output - }; -} - module.exports = { lachain: { tvl: () => 0, diff --git a/projects/xbank/index.js b/projects/xbank/index.js index c9e3f5ef78..7ce5b8aedd 100644 --- a/projects/xbank/index.js +++ b/projects/xbank/index.js @@ -1,8 +1,11 @@ const { compoundExports2 } = require('../helper/compound'); module.exports = { + deadFrom: '2024-04-28', era: compoundExports2({ comptroller: '0xC6d329a2C3f8cFDECAe7FeEc387fa633C6520991', cether: '0xE4622A57Ab8F4168b80015BBA28fA70fb64fa246', }) -}; \ No newline at end of file +}; + +module.exports.era.borrowed = () => ({}) // bad debt \ No newline at end of file diff --git a/projects/xdai/index.js b/projects/xdai/index.js index 6cab74c42c..87cae71d77 100644 --- a/projects/xdai/index.js +++ b/projects/xdai/index.js @@ -27,5 +27,5 @@ module.exports = { ethereum: { tvl: eth, }, - start: 1539028166, + start: '2018-10-08', }; diff --git a/projects/xfai/index.js b/projects/xfai/index.js index cc4a44c425..c8578d09a0 100644 --- a/projects/xfai/index.js +++ b/projects/xfai/index.js @@ -3,7 +3,7 @@ const FACTORY_ADDRESS = "0xa5136eAd459F0E61C99Cec70fe8F5C24cF3ecA26"; module.exports = { methodology: `Sums on-chain tvl by getting pools using xfai factory`, - start: 1692347965 , // Aug-18-2023 08:39:25 AM +UTC + start: '2023-08-18' , // Aug-18-2023 08:39:25 AM +UTC linea: { tvl: async (api) => { const pools = await api.fetchList({ lengthAbi: "uint256:allPoolsLength", itemAbi: "function allPools(uint256) external view returns (address)", target: FACTORY_ADDRESS}) diff --git a/projects/xlink-btc-lst/index.js b/projects/xlink-btc-lst/index.js new file mode 100644 index 0000000000..cb798ae1e1 --- /dev/null +++ b/projects/xlink-btc-lst/index.js @@ -0,0 +1,8 @@ +const { sumTokensExport } = require("../helper/sumTokens"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') + +module.exports = { + methodology: "Staking tokens via Babylon counts as TVL", + doublecounted:true, + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.xlinkLST }) } +} \ No newline at end of file diff --git a/projects/xlink/index.js b/projects/xlink/index.js index ad6c513dc3..f031befd7d 100644 --- a/projects/xlink/index.js +++ b/projects/xlink/index.js @@ -1,67 +1,53 @@ -const { sumTokensExport } = require('../helper/sumTokens'); -const ADDRESSES = require('../helper/coreAssets.json'); +const ADDRESSES = require("../helper/coreAssets.json"); +const { sumTokensExport } = require("../helper/sumTokens"); +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { - methodology: "TVL of XLink is the sum of the tokens locked in its contracts", - timetravel: false, -}; - -const config = { - bitcoin: { - owners: - [ - 'bc1qh604n2zey83dnlwt4p0m8j4rvetyersm0p6fts', - '31wQsi1uV8h7mL3QvBXQ3gzkH9zXNTp5cF', - 'bc1q9hs56nskqsxmgend4w0823lmef33sux6p8rzlp', - '32jbimS6dwSEebMb5RyjGxcmRoZEC5rFrS', - 'bc1qlhkfxlzzzcc25z95v7c0v7svlp5exegxn0tf58', - '3MJ8mbu4sNseNeCprG85emwgG9G9SCort7', - 'bc1qeph95q50cq6y66elk3zzp48s9eg66g47cptpft', - 'bc1qfcwjrdjk3agmg50n4c7t4ew2kjqqxc09qgvu7d', - '1882c4wfo2CzNo4Y4LCqxKGQvz7BsE7nqJ', - '1KGnLjKyqiGSdTNH9s6okFk2t5J7R6CdWt', + methodology: "Staking tokens via AlexLab counts as TVL", + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.xlink }) }, + ethereum: { + tvl: sumTokensExport({ + owners: [ + "0x7ceC01355aC0791dE5b887e80fd20e391BCB103a", + "0xcD0cb6AA811E1c8cD9A55EcB9Cc83f6a50Bed311", + "0x13b72A19e221275D3d18ed4D9235F8F859626673", ], + tokens: [ADDRESSES.ethereum.WBTC, ADDRESSES.null], + }), }, - bsc: { - owners: - [ - '0xFFda60ed91039Dd4dE20492934bC163e0F61e7f5', - // '0x5caeb9d58325044a1ad9d4abff2e0d525928812d' // is EOA - ], - tokens: - [ + bsc: { + tvl: sumTokensExport({ + owners: [ + "0x7ceC01355aC0791dE5b887e80fd20e391BCB103a", + "0xcD0cb6AA811E1c8cD9A55EcB9Cc83f6a50Bed311", + "0xFFda60ed91039Dd4dE20492934bC163e0F61e7f5", + ], + tokens: [ ADDRESSES.bsc.USDT, - ADDRESSES.bsc.BTCB - ] + ADDRESSES.bsc.BTCB, + ], + }), }, - ethereum: { - owners: - [ - '0x13b72A19e221275D3d18ed4D9235F8F859626673', - // '0x1bf78679b001c5efa20d80600e085ae52d25abc1' // is EOA - ], - tokens: - [ - ADDRESSES.ethereum.USDT, - ADDRESSES.ethereum.WBTC - ] + stacks: { + tvl: sumTokensExport({ + owners: [ + "SP2XD7417HGPRTREMKF748VNEQPDRR0RMANB7X1NK.cross-bridge-registry-v2-01", + "SP2XD7417HGPRTREMKF748VNEQPDRR0RMANB7X1NK.btc-peg-out-endpoint-v2-01", + ], + blacklistedTokens: [ + "SP2XD7417HGPRTREMKF748VNEQPDRR0RMANB7X1NK.token-abtc::bridged-btc", + "SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex::alex", + ], + }), }, - stacks: { - owners: - [ - 'SP2XD7417HGPRTREMKF748VNEQPDRR0RMANB7X1NK.cross-bridge-registry-v2-01', - 'SP2XD7417HGPRTREMKF748VNEQPDRR0RMANB7X1NK.btc-peg-out-endpoint-v2-01' - ], - blacklistedTokens: - [ - 'SP2XD7417HGPRTREMKF748VNEQPDRR0RMANB7X1NK.token-abtc::bridged-btc', - 'SP102V8P0F7JX67ARQ77WEA3D3CFB5XW39REDT0AM.token-alex::alex', - ] - }, -} - -Object.keys(config).forEach(chain => { - module.exports[chain] = { - tvl: sumTokensExport(config[chain]) - } -}) \ No newline at end of file + bsquared: { + tvl: sumTokensExport({ + owners: [ + '0x10eeCCc43172458F0ff9Cc3E9730aB256fAEE32e' + ], + tokens: [ + ADDRESSES.bsquared.UBTC + ] + }), + } +}; diff --git a/projects/xrgb/index.js b/projects/xrgb/index.js index d1070836a2..91c3e3046d 100644 --- a/projects/xrgb/index.js +++ b/projects/xrgb/index.js @@ -1,9 +1,7 @@ const { sumTokensExport } = require("../helper/chain/brc20"); -const owner = 'bc1ptm05s4f6f8j78zhx62lzx0dep07f2597nlgeltmm4sjn5stdu6gq4sxg2w' +const bitcoinAddressBook = require('../helper/bitcoin-book/index.js') module.exports = { methodology: "XRGB as bridge,Unlock ERC404 on all chains", - bitcoin: { - tvl: sumTokensExport({ owner, blacklistedTokens: ['XRGB'] }), - } + bitcoin: { tvl: sumTokensExport({ owners: bitcoinAddressBook.xrgb, blacklistedTokens: ['XRGB'] }) } }; \ No newline at end of file diff --git a/projects/xrpl-dex/api.js b/projects/xrpl-dex/api.js new file mode 100644 index 0000000000..998f4ac1be --- /dev/null +++ b/projects/xrpl-dex/api.js @@ -0,0 +1,193 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const rippleCodec = require("ripple-binary-codec"); +const { PromisePool } = require("@supercharge/promise-pool"); +const { getCache, setCache } = require("../helper/cache"); +const axios = require('axios') + +const NODE_URL = "https://xrplcluster.com"; +const API_XRP = "https://api.xrpscan.com/api/v1/amm/" +const RATE_LIMIT_DELAY_MS = 500; +const MIN_POOL_SIZE = 9500 +const getTimeNow = () => Math.floor(Date.now() / 1000); +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) + +const retry = async (fn, retries = 7, delay) => { + let attempts = 0; + while (attempts < retries) { + try { + return await fn(); + } catch (error) { + attempts++; + console.error(`Attempt ${attempts} failed. Retrying...`); + const currentDelay = delay ? delay : attempts * 1000; + if (attempts >= retries) throw error; + + await sleep(currentDelay); + } + } +}; + +const getLedgerDatas = async (binary, marker, atLedgerIndex) => { + const payload = { + method: "ledger_data", + params: [ + { + ledger_index: atLedgerIndex ?? "validated", + binary, + type: "amm", + ...(marker && { marker }), + }, + ], + }; + + return await retry(async () => { + const { data } = await axios.post(NODE_URL, payload); + + if (data.result && data.result?.state) { + return { + state: data.result.state, + marker: data.result.marker, + }; + } + + throw new Error("Invalid response format from XRPL"); + }); +}; + +let poolIndex = 0; +const getPools = async (nextMarker, isBinary, atLedgerIndex, poolsFound = []) => { + try { + console.log(`${++poolIndex} Fetching pools... Marker: ${nextMarker || 'start'}, Pools found so far: ${poolsFound.length}`); + const { state, marker } = await getLedgerDatas(isBinary, nextMarker, atLedgerIndex); + + if (state && state.length > 0) { + const decodedState = isBinary + ? state.map((entry) => rippleCodec.decode(entry.data)) + : state; + + poolsFound.push( + ...decodedState.map((entry) => ({ + account: entry.Account, + asset1: { currency: entry.Asset.currency, issuer: entry.Asset.issuer }, + asset2: { currency: entry.Asset2.currency, issuer: entry.Asset2.issuer }, + })) + ); + + } + + if (marker) { + await sleep(RATE_LIMIT_DELAY_MS); + return getPools(marker, isBinary, atLedgerIndex, poolsFound); + } + + } catch (error) { + console.error("Failed to fetch pools:", error.message); + } + + return poolsFound; +}; + +const parseReserve = (reserveData) => { + if (!reserveData) return null; + + const isXrp = typeof reserveData === "string"; + return { + currency: isXrp ? ADDRESSES.ripple.XRP : reserveData.currency, + issuer: isXrp ? null : reserveData.issuer, + amount: isXrp ? reserveData : reserveData.value, + }; +}; + +const getReserveDatas = async (pool) => { + return await retry(async () => { + const { data } = await axios.get(API_XRP + pool.account); + + return { + token0: parseReserve(data?.amount), + token1: parseReserve(data?.amount2) + } + }); +}; + +const getAllReservesDatas = async (poolAddresses, atLedgerIndex) => { + const poolsWithReserves = []; + + const { errors } = await PromisePool.withConcurrency(4) + .for(poolAddresses) + .process(async (pool) => { + try { + await sleep(RATE_LIMIT_DELAY_MS); + + const { token0, token1 } = await getReserveDatas(pool, atLedgerIndex); + poolsWithReserves.push({ + pool: pool.account, + token0Reserve: token0, + token1Reserve: token1, + }); + } catch (error) { + console.error("Errors occurred while fetching reserves:", errors); + } + }); + + if (errors?.length) console.log(errors) + if (errors.length > 0) throw errors[0] + + return poolsWithReserves; +}; + +const getXrplPools = async () => { + const timeNow = getTimeNow() + const startOfDay = Math.floor(new Date().setUTCHours(0, 0, 0, 0) / 1000); + let { pools: cachedPools = [], marker: lastMarker = null, lastUpdate = 0 } = await getCache('xrpl-dex', 'pools'); + + if (lastUpdate >= startOfDay && cachedPools?.length > MIN_POOL_SIZE) { + console.log(`Pools have already been updated today. Last update: ${new Date(lastUpdate * 1000).toISOString()}`); + return; + } + + console.time("xrpl-dex fetch pool list") + + try { + const pools = await getPools(null, 1); + console.timeEnd("xrpl-dex fetch pool list"); + console.log("Total pools fetched:", pools.length); + const finalMarker = pools.marker || lastMarker + + await setCache('xrpl-dex', 'pools', { pools, marker: finalMarker, lastUpdate: timeNow }); + } catch (error) { + console.error("Error during XRPL pool fetching:", error.message); + console.timeEnd("xrpl-dex fetch pool list"); + } +} + +const getXrplBalances = async (pools) => { + const timeNow = getTimeNow(); + const startOfDay = Math.floor(new Date().setUTCHours(0, 0, 0, 0) / 1000); + const { balanaces: _preBalances, lastUpdate = 0 } = await getCache('xrpl-dex', 'balances') || {}; + + if (lastUpdate >= startOfDay && _preBalances?.length > MIN_POOL_SIZE) { + console.log(`Balances have already been updated today. Last update: ${new Date(lastUpdate * 1000).toISOString()}`); + return; + } + + console.time("Fetching balances for pools"); + + try { + const balances = await getAllReservesDatas(pools); + console.timeEnd("Fetching balances for pools"); + await setCache('xrpl-dex', 'balances', { balances, lastUpdate: timeNow }); + return balances; + } catch (error) { + console.error("Error during balances fetching:", error.message); + } +}; + +const main = async () => { + await getXrplPools(); + const { pools = [] } = await getCache('xrpl-dex', 'pools'); + const seen = new Set(); + const uniquePools = pools.filter(pool => seen.has(JSON.stringify(pool)) ? false : seen.add(JSON.stringify(pool))); + await getXrplBalances(uniquePools) +}; + +main().catch(console.error).finally(() => process.exit(0)); \ No newline at end of file diff --git a/projects/xrpl-dex/app.js b/projects/xrpl-dex/app.js deleted file mode 100644 index 6f6870d2dd..0000000000 --- a/projects/xrpl-dex/app.js +++ /dev/null @@ -1,165 +0,0 @@ -const rippleCodec = require("ripple-binary-codec"); -const { PromisePool } = require("@supercharge/promise-pool"); -const { getCache, setCache } = require("../helper/cache"); -const { transformDexBalances } = require("../helper/portedTokens"); - -const NODE_URL = "https://xrplcluster.com"; - -const fetchLedgerData = async (binary, marker, atLedgerIndex) => { - const xrplResponse = await fetch(NODE_URL, { - method: "POST", - body: JSON.stringify({ - method: "ledger_data", - params: [ - { - ledger_index: atLedgerIndex ?? "validated", - binary, - type: "amm", - ...(marker && { marker: marker }), - }, - ], - }), - }); - const xrplResponseJson = await xrplResponse.json(); - return { - state: xrplResponseJson.result.state, - marker: xrplResponseJson.result.marker, - }; -}; - -const fetchPoolReserves = async (pool, atLedgerIndex) => { - const xrplResponse = await fetch(NODE_URL, { - method: "POST", - body: JSON.stringify({ - method: "amm_info", - params: [ - { - ledger_index: atLedgerIndex ?? "validated", - asset: pool.asset1, - asset2: pool.asset2, - }, - ], - }), - }); - const xrplResponseJson = await xrplResponse.json(); - return { - token0: parseReserve(xrplResponseJson.result.amm?.amount), - token1: parseReserve(xrplResponseJson.result.amm?.amount2), - }; -}; - -let lastPrinted = 0 -const discoverPools = async (nextMarker, isBinary, atLedgerIndex, poolsFound = []) => { - const { state, marker } = await fetchLedgerData( - isBinary, - nextMarker, - atLedgerIndex - ); - if (state && state.length != 0) { - const decodedState = isBinary - ? state.map((entry) => rippleCodec.decode(entry.data)) - : state; - poolsFound.push( - ...decodedState.map((entry) => ({ - account: entry.Account, - asset1: { - currency: entry.Asset.currency, - issuer: entry.Asset.issuer, - }, - asset2: { - currency: entry.Asset2.currency, - issuer: entry.Asset2.issuer, - }, - })) - ); - } - - if (poolsFound.length % 10 === 0 && lastPrinted !== poolsFound.length) { - console.log(new Date(), "Pools found so far ", poolsFound.length); - lastPrinted = poolsFound.length; - } - if (marker) - return discoverPools( - marker, - isBinary, - atLedgerIndex, - poolsFound - ) - return poolsFound; -}; - -const parseReserve = (reserveData) => { - if (!reserveData) return null; - const reserveIsXrp = typeof reserveData === "string"; - return { - currency: reserveIsXrp ? "XRP" : reserveData.currency, - issuer: reserveIsXrp ? null : reserveData.issuer, - amount: reserveIsXrp ? reserveData : reserveData.value, - }; -}; - -const getAllPoolsReserves = async (poolAddresses, atLedgerIndex) => { - const poolsWithReserves = []; - - const { errors } = await PromisePool.withConcurrency(14) - .for(poolAddresses) - .process(async (pool) => { - const { token0, token1 } = await fetchPoolReserves(pool, atLedgerIndex); - poolsWithReserves.push({ - pool: pool.account, - token0Reserve: token0, - token1Reserve: token1, - }); - }); - if (errors.length > 0) - throw new Error(errors[0]) - return poolsWithReserves -} - -main().catch(console.error).then(() => { - console.log("done"); - process.exit(0) -}) - -function getTimeNow() { - return Math.floor(Date.now() / 1000); -} - -async function main() { - const timeNow = getTimeNow() - const aDayInSeconds = 60 * 60 * 24; - const projectKey = 'xrpl-dex' - const cacheKey = 'cache' - let { allPools, lastPoolUpdate, lastDataUpdate, tvl } = await getCache(projectKey, cacheKey) - if (!lastPoolUpdate || timeNow - lastPoolUpdate > 3 * aDayInSeconds) { - // try { - console.time("xrpl-dex fetch pool list"); - allPools = await discoverPools(null, 1); - console.timeEnd("xrpl-dex fetch pool list"); - lastPoolUpdate = getTimeNow(); - await setCache(projectKey, cacheKey, { allPools, lastPoolUpdate, lastDataUpdate, tvl }) - // } catch (e) { - // console.error(e) - // } - } - if (lastDataUpdate && timeNow - lastDataUpdate < 2 * 60 * 60) { - // data was updated recently, no need to update - return - } - const poolsWithReserves = await getAllPoolsReserves(allPools); - - tvl = await transformDexBalances({ - chain: 'ripple', - data: poolsWithReserves - .filter(i => i.token0Reserve && i.token1Reserve) - .map(i => ({ - token0: i.token0Reserve.currency, - token0Bal: i.token0Reserve.amount, - token1: i.token1Reserve.currency, - token1Bal: i.token1Reserve.amount, - })), - }) - await setCache(projectKey, cacheKey, { - allPools, lastPoolUpdate, lastDataUpdate: getTimeNow(), tvl, - }) -} \ No newline at end of file diff --git a/projects/xrpl-dex/index.js b/projects/xrpl-dex/index.js index e49f337192..6e789599aa 100644 --- a/projects/xrpl-dex/index.js +++ b/projects/xrpl-dex/index.js @@ -1,27 +1,26 @@ -const { getCache, } = require("../helper/cache"); +const { getCache } = require("../helper/cache"); +const { transformDexBalances } = require("../helper/portedTokens"); +const tvl = async (api) => { + const { balances = [] } = await getCache('xrpl-dex', 'balances'); + if (balances.length < 9500) throw new Error('No balances found') -module.exports = { - methodology: - "Finds all AMM pools on XRPL, checks their reserves, calculates TVL (in XRP) for each pool and sums them up.", - ripple: { - tvl, - }, - misrepresentedTokens: true, -}; - -function getTimeNow() { - return Math.floor(Date.now() / 1000); + const tvl = await transformDexBalances({ + chain: 'ripple', + data: balances + .filter(i => i.token0Reserve && i.token1Reserve) + .map(i => ({ + token0: i.token0Reserve.currency, + token0Bal: i.token0Reserve.amount, + token1: i.token1Reserve.currency, + token1Bal: i.token1Reserve.amount, + })) + }) + api.addCGToken('ripple', tvl?.XRP / 1e6) } -async function tvl(api) { - const timeNow = getTimeNow() - const aDayInSeconds = 60 * 60 * 24; - const projectKey = 'xrpl-dex' - const cacheKey = 'cache' - let { lastDataUpdate, tvl } = await getCache(projectKey, cacheKey) - const val = tvl?.XRP - if (!lastDataUpdate || timeNow - lastDataUpdate > aDayInSeconds || !val) - throw new Error("stale/missing tvl data"); - api.addCGToken('ripple', val/1e6) -} \ No newline at end of file +module.exports = { + methodology: "Finds all AMM pools on XRPL, checks their reserves, calculates TVL (in XRP) for each pool and sums them up.", + ripple: { tvl }, + misrepresentedTokens: true, +}; \ No newline at end of file diff --git a/projects/xrpl-dex/package-lock.json b/projects/xrpl-dex/package-lock.json index 646973e4f7..f55185a857 100644 --- a/projects/xrpl-dex/package-lock.json +++ b/projects/xrpl-dex/package-lock.json @@ -9,24 +9,69 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "ripple-binary-codec": "^2.1.0" + "ripple-binary-codec": "^2.1.0", + "xrpl": "^4.0.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/base": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.7.tgz", - "integrity": "sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.5.0.tgz", + "integrity": "sha512-8EnFYkqEQdnkuGBVpCzKxyIwDCBLDVj3oiX0EKUFre/tOjL/Hqba1D6n/8RcmaQy4f95qQFrO2A8Sr6ybh4NRw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.6.0", + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.7" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.4.0.tgz", + "integrity": "sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.5.0", + "@scure/base": "~1.1.8" + }, "funding": { "url": "https://paulmillr.com/funding/" } @@ -44,6 +89,16 @@ "node": ">=16.0.0" } }, + "node_modules/@xrplf/secret-numbers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@xrplf/secret-numbers/-/secret-numbers-1.0.0.tgz", + "integrity": "sha512-qsCLGyqe1zaq9j7PZJopK+iGTGRbk6akkg6iZXJJgxKwck0C5x5Gnwlb1HKYGOwPKyrXWpV6a2YmcpNpUFctGg==", + "license": "ISC", + "dependencies": { + "@xrplf/isomorphic": "^1.0.0", + "ripple-keypairs": "^2.0.0" + } + }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -82,6 +137,20 @@ "node": ">= 16" } }, + "node_modules/ripple-keypairs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-2.0.0.tgz", + "integrity": "sha512-b5rfL2EZiffmklqZk1W+dvSy97v3V/C7936WxCCgDynaGPp7GE6R2XO7EU9O2LlM/z95rj870IylYnOQs+1Rag==", + "license": "ISC", + "dependencies": { + "@noble/curves": "^1.0.0", + "@xrplf/isomorphic": "^1.0.0", + "ripple-address-codec": "^5.0.0" + }, + "engines": { + "node": ">= 16" + } + }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -101,6 +170,26 @@ "optional": true } } + }, + "node_modules/xrpl": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xrpl/-/xrpl-4.0.0.tgz", + "integrity": "sha512-VZm1lQWHQ6PheAAFGdH+ISXKvqB2hZDQ0w4ZcdAEtmqZQXtSIVQHOKPz95rEgGANbos7+XClxJ73++joPhA8Cw==", + "license": "ISC", + "dependencies": { + "@scure/bip32": "^1.3.1", + "@scure/bip39": "^1.2.1", + "@xrplf/isomorphic": "^1.0.1", + "@xrplf/secret-numbers": "^1.0.0", + "bignumber.js": "^9.0.0", + "eventemitter3": "^5.0.1", + "ripple-address-codec": "^5.0.0", + "ripple-binary-codec": "^2.1.0", + "ripple-keypairs": "^2.0.0" + }, + "engines": { + "node": ">=18.0.0" + } } } } diff --git a/projects/xrpl-dex/package.json b/projects/xrpl-dex/package.json index a7e910c8e3..ea7ef196a4 100644 --- a/projects/xrpl-dex/package.json +++ b/projects/xrpl-dex/package.json @@ -9,6 +9,7 @@ "license": "MIT", "description": "", "dependencies": { - "ripple-binary-codec": "^2.1.0" + "ripple-binary-codec": "^2.1.0", + "xrpl": "^4.0.0" } } diff --git a/projects/xrpl-dex/run.sh b/projects/xrpl-dex/run.sh index 83626d02a0..6f1fe596c7 100644 --- a/projects/xrpl-dex/run.sh +++ b/projects/xrpl-dex/run.sh @@ -1,3 +1,3 @@ npm i cd .. && npm i && cd xrpl-dex -node app.js \ No newline at end of file +node api.js \ No newline at end of file diff --git a/projects/xrune/abi.json b/projects/xrune/abi.json deleted file mode 100644 index 7e755d4472..0000000000 --- a/projects/xrune/abi.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "getPrice": "function getPrice(address asset) view returns (uint256)", - "getTotal": "uint256:getTotal", - "getPoolAddress": "address:getPoolAddress" -} \ No newline at end of file diff --git a/projects/xrune/index.js b/projects/xrune/index.js index 679dcf6af8..2851dc77b5 100644 --- a/projects/xrune/index.js +++ b/projects/xrune/index.js @@ -1,26 +1,5 @@ -const sdk = require("@defillama/sdk"); -const { stakings } = require("../helper/staking.js"); -const abi = require("./abi.json"); -const BN = require("bignumber.js"); +const { staking } = require("../helper/staking.js"); -async function getTotal(pools, chain, block) { - const balances = {}; - await Promise.all( - pools.map((pool) => - sdk.api.erc20 - .balanceOf({ - target: pool[1], - owner: pool[0], - chain, - block, - }) - .then((result) => - sdk.util.sumSingleBalance(balances, pool[2], result.output) - ) - ) - ); - return balances; -} const token = "0x69fa0feE221AD11012BAb0FdB45d444D3D2Ce71c"; const ethStaking = [ @@ -29,32 +8,11 @@ const ethStaking = [ "0xc20434f595c32B5297A737Cb173382Dd2485C2cC", //4-Month Vault "0x8ba0C510Da4507D1F5f73ff9E1FcD14Edc819EB2", //6-Month Vault ]; -const ethPools = [ - [ - "0x817ba0ecafD58460bC215316a7831220BFF11C80", - "0x69fa0feE221AD11012BAb0FdB45d444D3D2Ce71c", - "0x69fa0feE221AD11012BAb0FdB45d444D3D2Ce71c", - ], //Tiers - [ - "0xebcd3922a199cd1358277c6458439c13a93531ed", - "0x69fa0feE221AD11012BAb0FdB45d444D3D2Ce71c", - "0x69fa0feE221AD11012BAb0FdB45d444D3D2Ce71c", - ], //DAO - [ - "0x5b1b8bdbcc534b17e9f8e03a3308172c7657f4a3", - "0x69fa0feE221AD11012BAb0FdB45d444D3D2Ce71c", - "0x69fa0feE221AD11012BAb0FdB45d444D3D2Ce71c", - ], //DAO -]; - -async function eth(_timestamp, block, chainBlocks) { - return getTotal(ethPools, "ethereum", block); -} module.exports = { methodology: `TVL comes from the Staking Vaults and Launchpad Tiers`, ethereum: { - tvl: eth, - staking: stakings(ethStaking, token), + tvl: () => ({}), + staking: staking([...ethStaking, '0x817ba0ecafD58460bC215316a7831220BFF11C80'], token), }, }; diff --git a/projects/xsigma/index.js b/projects/xsigma/index.js index 03f7066428..349a39da19 100644 --- a/projects/xsigma/index.js +++ b/projects/xsigma/index.js @@ -1,8 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); const { staking } = require("../helper/staking"); const { pool2 } = require("../helper/pool2"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const SigThreePoolContract = "0x3333333ACdEdBbC9Ad7bda0876e60714195681c5"; const USDC = ADDRESSES.ethereum.USDC; @@ -13,20 +11,8 @@ const sigMasterchefContract = "0x98C32b59a0AC00Cd33750427b1A317eBcf84D0F7"; const SIG = "0x7777777777697cfeecf846a76326da79cc606517"; const SIG_ETH_UNIV2 = "0x23b7e6932cb873b8696afba077c4a2486b1c862e"; -async function ethTvl() { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [USDC, false], - [DAI, false], - [USDT, false], - ], - [SigThreePoolContract] - ); - - return balances; +async function ethTvl(api) { + return api.sumTokens({ owner: SigThreePoolContract, tokens: [USDC, DAI, USDT] }); } module.exports = { diff --git a/projects/xspswap-v3/index.js b/projects/xspswap-v3/index.js index 9b74be6cdd..b1d5865bf1 100644 --- a/projects/xspswap-v3/index.js +++ b/projects/xspswap-v3/index.js @@ -2,5 +2,5 @@ const { uniV3Export } = require('../helper/uniswapV3') const factory = '0x30F317A9EC0f0D06d5de0f8D248Ec3506b7E4a8A' module.exports = uniV3Export({ - xdc: { factory, fromBlock: 59782067, methodology: 'TVL accounts for the liquidity on all AMM pools taken from the factory contract', }, + xdc: { factory, fromBlock: 59782067, methodology: 'TVL accounts for the liquidity on all AMM pools taken from the factory contract', permitFailure: true }, }) \ No newline at end of file diff --git a/projects/xswap/index.js b/projects/xswap/index.js new file mode 100644 index 0000000000..63e841b09c --- /dev/null +++ b/projects/xswap/index.js @@ -0,0 +1,13 @@ +const { getUniTVL } = require('../helper/unknownTokens'); + +const factory = '0x3ca837175312070f4E4fF64972a199122Ee03805'; + +module.exports = { + crossfi: { + tvl: getUniTVL({ + factory, + chain: 'crossfi', + useDefaultCoreAssets: true, + }), + }, +}; \ No newline at end of file diff --git a/projects/xusdmoney/index.js b/projects/xusdmoney/index.js index 9a08db546e..cce6aed046 100644 --- a/projects/xusdmoney/index.js +++ b/projects/xusdmoney/index.js @@ -1,7 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') const { staking } = require("../helper/staking"); const { pool2s } = require("../helper/pool2"); -const { sumTokensAndLPsSharedOwners } = require("../helper/unwrapLPs"); const collateralPoolContracts = [ // WETH Pool @@ -43,20 +42,8 @@ const lpPairAddresses = [ "0x88d9bE8D3DFe82eF3b09641284467f1Ee5E98343", ]; -async function ethTvl(chainBlocks) { - const balances = {}; - - await sumTokensAndLPsSharedOwners( - balances, - [ - [WETH, false], - [DAI, false], - [USDC, false], - ], - collateralPoolContracts - ); - - return balances; +async function ethTvl(api) { + return api.sumTokens({ owners: collateralPoolContracts, tokens: [WETH, DAI, USDC] }); } module.exports = { diff --git a/projects/xy-finance/index.js b/projects/xy-finance/index.js index 7124d5d4d7..49ce033273 100644 --- a/projects/xy-finance/index.js +++ b/projects/xy-finance/index.js @@ -73,6 +73,9 @@ const config = { }, ox_chain: { chainId: '6699' + }, + cronos_zkevm: { + chainId: '388' } } @@ -500,6 +503,12 @@ const yPoolDepositContract = { // "contractAddress": "0xD95841e7eC6b61f708829B57a3433C3Fd24B2A8c", // "tokenAddress": "0x92073dE2706eB8f0265998bCf7B8F751e1349b8F" // } + }, + "388": { + "ETH": { + "contractAddress": "0xAa0b0654E79E17332d983E2351bD926cE336B9BD", + "tokenAddress": "0x271602A97027ee1dd03b1E6e5dB153eB659A80b1" + }, } } diff --git a/projects/y24/index.js b/projects/y24/index.js index a2ae49cc6f..86bbc58032 100644 --- a/projects/y24/index.js +++ b/projects/y24/index.js @@ -6,7 +6,6 @@ const StakingContract2 = '0xe0Ceee33e1CE1EF4EA322B50D55d99E714B7BB6d'; module.exports = { methodology: 'This is the total value locked in y24 staking', - start: 35011373, bsc: { tvl: () => ({}), staking: sumTokensExport({owners: [StakingContract1, StakingContract2], tokens: [TOKEN_ADDRESS], lps: ['0x44628669C0F888b2884d20b94C22af465AA11f05'], useDefaultCoreAssets: true,}) diff --git a/projects/y2b-finance/index.js b/projects/y2b-finance/index.js index d61e36d21e..7863274132 100644 --- a/projects/y2b-finance/index.js +++ b/projects/y2b-finance/index.js @@ -1,32 +1,9 @@ -const { sumTokens2, sumTokensExport } = require('../helper/unwrapLPs') -const { getLogs } = require('../helper/cache/getLogs') - -async function tvl(api) { - const logs = await getLogs({ - api, - fromBlock: 16310967, - eventAbi: 'event MarketCreated(uint256 indexed mIndex, address hedge, address risk, address token, string name, int256 strikePrice)', - topics: ['0xf38f00404415af51ddd0dd57ce975d015de2f40ba8a087ac48cd7552b7580f32'], - target: '0xF33C13DA4425629C3F10635E4f935D8020F97D1f', - }) - - const vaults = logs.map(({ args }) => ([args.hedge, args.risk])).flat() - const tokens = await api.multiCall({ - abi: 'address:asset', - calls: vaults, - }) - const tokensAndOwners = tokens.map((token, i) => ([token, vaults[i]])) - - return sumTokens2({ api, tokensAndOwners }) -} - - module.exports = { hallmarks: [ [1673913600, "Rug Pull"] ], - ethereum: { - tvl, - // staking: sumTokensExport({ owners: [], tokens: ['0xF9C12B27cE5058ab98ce11BD53900f84E18C0650']}) + deadFrom: 1673913600, + ethereum: { + tvl: () => ({}), } } diff --git a/projects/yamato/index.js b/projects/yamato/index.js index 2cde39faa4..345d87ca22 100644 --- a/projects/yamato/index.js +++ b/projects/yamato/index.js @@ -21,7 +21,7 @@ async function tvl(_, block) { } module.exports = { - start: 1690387200, + start: '2023-07-26', ethereum: { tvl, } diff --git a/projects/yamfore/index.js b/projects/yamfore/index.js new file mode 100644 index 0000000000..29919f2cb8 --- /dev/null +++ b/projects/yamfore/index.js @@ -0,0 +1,24 @@ +const { sumTokens2 } = require("../helper/chain/cardano"); +const { nullAddress } = require("../helper/tokenMapping"); + +const V1_PROTOCOL_SCRIPT_ADDRESS = "addr1xywgm3cqq35eh8p83x7gymkgqs8r9zzeg9sgq74d59apepgu3hrsqprfnwwz0zdusfhvspqwx2y9jstqspa2mgt6rjzs2v0fp9" + +async function tvl() { + return sumTokens2({ + owners: [ + V1_PROTOCOL_SCRIPT_ADDRESS, + ], + tokens: [ + nullAddress, + 'c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d' + ], + }) +} + +module.exports = { + cardano: { + tvl + }, + start: '2024-10-14', + methodology: "TVL is equal to all ADA, CBLP and USDM (USDM by Moneta) held in the treasury and unlent funds, collected fees and loan collateral held by the V1 script.", +}; diff --git a/projects/yaxis/index.js b/projects/yaxis/index.js index 99e18a06ed..dbc4808452 100644 --- a/projects/yaxis/index.js +++ b/projects/yaxis/index.js @@ -26,5 +26,5 @@ module.exports = { staking: staking_, pool2: staking(constants.UNISWAP_LPS.map(i => i.staking), constants.UNISWAP_LPS.map(i => i.address)) }, - start: 1600185600, // 09/16/2020 @ 12:00am (UTC+8) + start: '2020-09-15', // 09/16/2020 @ 12:00am (UTC+8) }; diff --git a/projects/yay-staking/index.js b/projects/yay-staking/index.js new file mode 100644 index 0000000000..779c772e8c --- /dev/null +++ b/projects/yay-staking/index.js @@ -0,0 +1,16 @@ +const yayStoneAddress = '0xe86142af1321eaac4270422081c1EdA31eEcFf0c' +const yayAgETHAddress = '0x0341d2c2CE65B62aF8887E905245B8CfEA2a3b97' + +const tvl = async (api) => { + return api.sumTokens({ + tokensAndOwners: [ + ['0x7122985656e38bdc0302db86685bb972b145bd3c', yayStoneAddress], + ['0xe1b4d34e8754600962cd944b535180bd758e6c2e', yayAgETHAddress], + ] + }) +} + +module.exports = { + start: '2024-08-01', + ethereum: { tvl }, +} \ No newline at end of file diff --git a/projects/yearn-ether/index.js b/projects/yearn-ether/index.js index 2077e35232..43b1cbaae9 100644 --- a/projects/yearn-ether/index.js +++ b/projects/yearn-ether/index.js @@ -7,6 +7,6 @@ async function tvl(api) { module.exports = { methodology: 'counts the total amount of ETH underlying the LSTs deposited into the yETH pool.', - start: 1693971707, + start: '2023-09-06', ethereum: { tvl } }; diff --git a/projects/yel/index.js b/projects/yel/index.js index 2b470a01b0..9b499ba978 100644 --- a/projects/yel/index.js +++ b/projects/yel/index.js @@ -1,5 +1,9 @@ const { sumUnknownTokens } = require('../helper/unknownTokens') const { sumTokens2 } = require('../helper/unwrapLPs') +const { + normalizeAddress, +} = require('../helper/tokenMapping') + const ADDRESSES = require('../helper/coreAssets.json') const config = { @@ -16,14 +20,85 @@ const config = { farms: ['0x954b15065e4FA1243Cd45a020766511b68Ea9b6E', '0x0379C1BbE394f835366D2EFDBf2AF09fBa0689A4'], lps: ['0x8bAb87ECF28Bf45507Bd745bc70532e968b5c2De'], ownTokens: ['0xd3b71117e6c1558c1553305b44988cd944e97300'] }, blast: { - ownTokensAndOwners: [['0x949185D3BE66775Ea648F4a306740EA9eFF9C567', '0x7d2f5881F0C4B840fcFA2c49F4052d1A004eAf0d']], + ownTokensAndOwners: [ + // Token Potion(lToken) slToken + ['0x949185D3BE66775Ea648F4a306740EA9eFF9C567', '0x7d2f5881F0C4B840fcFA2c49F4052d1A004eAf0d', '0xD451E3443Fc9e12d37F64EC0FeD100cE2c10D22A'] + ], tokensAndOwners: [ - [ADDRESSES.blast.WETH, '0x795a85CD543D0E2d29F7e11e33a20a38A4b5121e'], - [ADDRESSES.blast.BLAST, '0x7D8490333315EaAa5e93F3C6983d1e8128D7f50f'], + // Token Potion(lToken) slToken + [ADDRESSES.blast.WETH, '0x795a85CD543D0E2d29F7e11e33a20a38A4b5121e', '0x7D8490333315EaAa5e93F3C6983d1e8128D7f50f' ], + [ADDRESSES.blast.BLAST, '0x07BF0Bc908Ef4badF8ec0fB1f77A8dBFe33c33c0', '0x73681f24a4a099E71e0Ddd084f2310bA1E0b3a36' ], + ], + }, + base: { + ownTokensAndOwners: [ + // Token Potion(lToken) slToken + ['0x949185D3BE66775Ea648F4a306740EA9eFF9C567', '0x516712404013200B499Cd8fAE4575E5d48F6Ba65', '0x38b8b2B4b063e71047474018707Fab2E9a2bB971'] + ], + tokensAndOwners: [ + // Token Potion(lToken) slToken + [ADDRESSES.optimism.WETH_1, '0x0540f15374eCF13aAB3c0a76b643333CE0D00579', '0x0E7De1d6A1aA4178CBfce3dE4EAaD0427034f924'], + [ADDRESSES.base.USDC, '0xE7349C94BDE0D13599Ed496342857bb231FeF02B', '0xabb4D7866e1059bD21581FC5FC6D49388D30a323'], + ['0x1509706a6c66CA549ff0cB464de88231DDBe213B', '0x8a27CE3A836C8A9D962D86C099f229f3baF3EB4a', '0xFfeC8bAAa8cf32Bc7F85ea6a7C44Ad541309FD1F'] + ], + }, + sonic: { + ownTokensAndOwners: [ + // Token Potion(lToken) slToken + ['0x949185D3BE66775Ea648F4a306740EA9eFF9C567', '0x6E074300A7Bf53af6e20f1f07dDDfeedAE5598A8', '0x64E869D31aE8A567059872f597A8529CBd88DC98'] + ], + tokensAndOwners: [ + // Token Potion(lToken) slToken + [ADDRESSES.sonic.wS, '0x7Ba0abb5f6bDCbf6409BB2803CdF801215424490', '0x24419689ac4A2D3Dafa07623129545f9b2156405'], + [ADDRESSES.sonic['USDC.e'], '0x995171196618b7FE0F0C6D606D79583DD1c8ff60', '0x5573aDB63D3eb7473C68Fdb2033CCbAc51a0Be0a'], + + ['0x79bbF4508B1391af3A0F4B30bb5FC4aa9ab0E07C', '0x92Dd17b19F74E696502Ee9eD478901F24c5d9a9A', '0x153ea9DF2B7977A8670a6EdF10b814d229D8d9Ef'], + ['0x0e0Ce4D450c705F8a0B6Dd9d5123e3df2787D16B', '0xecf1b589F47511D23b026eF53D16FEbB89Aa5f3A', '0x590159e00c05E4C91f562Fe862cc90d75af5d28b'], + ['0x9fDbC3f8Abc05Fa8f3Ad3C17D2F806c1230c4564', '0xdE31054Fb0ee7c6C39641db2e677011E276644aC', '0x017bdAd7eb46fC2721a5A148D43C0c25A11E740c'] + ], } } +async function tvl( api, coveredAssets){ + for(const assets of coveredAssets){ + const originalToken = normalizeAddress(assets[0]) + const potion = normalizeAddress(assets[1]) + const slToken = normalizeAddress(assets[2]) + + let totalTokenBalance = 0 + const balances = await api.multiCall({ + abi : 'erc20:balanceOf', + calls : [ + { + target : originalToken, + params : potion + }, + { + target : potion, + params : slToken + } + ] + }) + + let potionSupply = Number( + await api.call({ + abi : 'erc20:totalSupply', + target : potion, + }) + ) + + const tokenBalanceOnPotion = Number(balances[0]) + const ltokenBalanceOnSLToken = Number(balances[1]) + + const cbr = tokenBalanceOnPotion / potionSupply + + totalTokenBalance = tokenBalanceOnPotion + (ltokenBalanceOnSLToken * cbr) + + api.add(originalToken, totalTokenBalance) + } +} + Object.keys(config).forEach(chain => { const { farms = [], lps = [], ownTokens = [], ownTokensAndOwners, tokensAndOwners, } = config[chain] module.exports[chain] = { @@ -41,7 +116,10 @@ Object.keys(config).forEach(chain => { await sumTokens2({ api, ownerTokens, blacklistedTokens: [...lps, ...ownTokens], resolveLP: true, }) } - if (tokensAndOwners) return api.sumTokens({ tokensAndOwners }) + if (tokensAndOwners){ + await tvl(api, tokensAndOwners) + } + }, pool2: async (api) => { if (farms.length && lps.length) @@ -52,7 +130,9 @@ Object.keys(config).forEach(chain => { if (farms.length && ownTokens.length) await sumUnknownTokens({ api, owners: farms, tokens: ownTokens, useDefaultCoreAssets: true, lps, }) - if (ownTokensAndOwners) return api.sumTokens({ tokensAndOwners: ownTokensAndOwners }) + if (ownTokensAndOwners){ + await tvl(api, ownTokensAndOwners) + } }, } -}) \ No newline at end of file +}) diff --git a/projects/yellow/index.js b/projects/yellow/index.js new file mode 100644 index 0000000000..c62f69ac39 --- /dev/null +++ b/projects/yellow/index.js @@ -0,0 +1,22 @@ +const { sumTokensExport } = require('../helper/unwrapLPs') + +const vaultAddress = '0xb5F3a9dD92270f55e55B7Ac7247639953538A261' + +const vaults = { + ethereum: {}, + linea: {}, + polygon: {}, + scroll: {}, +} + +module.exports = { + methodology: 'The total amount of assets locked in the Yellow Wallet.', +} + +Object.keys(vaults).forEach((chain) => { + const { vault = vaultAddress, tokens = [] } = vaults[chain] + + module.exports[chain] = { + tvl: sumTokensExport({ owner: vault, tokens, fetchCoValentTokens: true }), + } +}) diff --git a/projects/yetiFinance/index.js b/projects/yetiFinance/index.js index 19dd253676..6b04ffa4fd 100644 --- a/projects/yetiFinance/index.js +++ b/projects/yetiFinance/index.js @@ -1,197 +1,14 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require("@defillama/sdk"); - -const getAllCollateralAbi = 'function getAllCollateral() view returns (address[], uint256[])' -const fetchPrice_vAbi = "uint256:fetchPrice_v" -const farmPoolTotalSupplyAbi = "uint256:totalSupply" -const curve_get_virtual_priceAbi = "uint256:get_virtual_price" -const getPriceAbi = 'function getPrice(address _collateral) view returns (uint256)' -const getReservesAbi = 'function getReserves() view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast)' - -// YetiController knows the price of the collateral -const YETI_CONTROLLER_ADDRESS = "0xcCCCcCccCCCc053fD8D1fF275Da4183c2954dBe3"; - -// All system collaterals are stored across activepool and defaultpool -const ACTIVE_POOL_ADDRESS = "0xAAAaaAaaAaDd4AA719f0CF8889298D13dC819A15"; -const DEFAULT_POOL_ADDRESS = "0xdDDDDDdDDD3AD7297B3D13E17414fBED370cd425"; - -const FARM_ADDRESS = "0xfffFffFFfFe8aA117FE603a37188E666aF110F39"; -const BOOST_CURVE_LP_FARM_ADDRESS = "0xD8A4AA01D54C8Fdd104EAC28B9C975f0663E75D8" - -const YUSDCURVE_POOL_ADDRESS = "0x1da20ac34187b2d9c74f729b85acb225d3341b25" - -const YETIAVAX_POOL2_ADDRESS = "0xbdc7EF37283BC67D50886c4afb64877E3e83f869" - -const YETI_PRICEFEED = "0x8a98709077E8A98ECAf89056838a99b484686863" - -const AVAX_PRICEFEED = "0x45F7260f7Cc47b15eB5cB6ac0dAaBd8Efb2A0edB" - -const YETI_TOKEN_ADDRESS = "0x77777777777d4554c39223C354A05825b2E8Faa3" - -const VEYETI_ADDRESS = "0x88888888847DF39Cf1dfe1a05c904b4E603C9416" -const chain = 'avax' -/** - * Get TVL of YETI FInance - */ -async function tvl(_, _block, chainBlocks) { - const block = chainBlocks[chain] - const activePoolCollaterals = ( - await sdk.api.abi.call({ - target: ACTIVE_POOL_ADDRESS, - abi: getAllCollateralAbi, - block, - chain: "avax" - }) - ).output - - const defaultPoolCollaterals = ( - await sdk.api.abi.call({ - target: DEFAULT_POOL_ADDRESS, - abi: getAllCollateralAbi, - block, - chain: "avax" - }) - ).output - - // require(activePoolCollaterals[0].length === defaultPoolCollaterals[0].length, "active pool collaterals and default pool collaterals have different length") - - // in USD - let systemCollateralTvl = 0 - // iterate through all the collateral types and sum up amount * price to get TVL in USD - for (let i = 0; i < activePoolCollaterals[0].length; i++) { - - const tokenAddress = activePoolCollaterals[0][i] - const amount = +activePoolCollaterals[1][i] + +defaultPoolCollaterals[1][i] - const decimals = ( - await sdk.api.erc20.decimals(tokenAddress, "avax") - ).output; - - const price = ( - await sdk.api.abi.call({ - target: YETI_CONTROLLER_ADDRESS, - abi: getPriceAbi, - block, - chain: "avax", - params: tokenAddress - }) - ).output - - - // some collaterals have decimals that is < 18 so need to normalize decimals - systemCollateralTvl += amount * (10 ** (18 - +decimals)) * +price / (10 ** 18) - } - - - const curveFarmAmount = ( - await sdk.api.abi.call({ - target: FARM_ADDRESS, - abi: farmPoolTotalSupplyAbi, - block, - chain: "avax" - }) - ).output - - const curveBoostFarmAmount = ( - await sdk.api.abi.call({ - target: BOOST_CURVE_LP_FARM_ADDRESS, - abi: farmPoolTotalSupplyAbi, - block, - chain: "avax" - }) - ).output - - const YUSDCurvPrice = ( - await sdk.api.abi.call({ - target: YUSDCURVE_POOL_ADDRESS, - abi: curve_get_virtual_priceAbi, - block, - chain: "avax" - }) - ).output - - const farmTvl = (+curveFarmAmount + +curveBoostFarmAmount) * +YUSDCurvPrice / (10 ** 18) - - const total = systemCollateralTvl + farmTvl - - return { - // In USDC, USDC has decimal of 6 - ["avax:" + ADDRESSES.avax.USDC]: total / (10 ** 12) - } -} - -async function pool2(_, _block, chainBlocks) { - const block = chainBlocks[chain] - const reserves = ( - await sdk.api.abi.call({ - target: YETIAVAX_POOL2_ADDRESS, - abi: getReservesAbi, - block, - chain: "avax" - }) - ).output - const YETIReserve = reserves[0] - const AVAXReserve = reserves[1] - - const YETIPrice = ( - await sdk.api.abi.call({ - target: YETI_PRICEFEED, - abi: fetchPrice_vAbi, - block, - chain: "avax" - }) - ).output - - const AVAXPrice = ( - await sdk.api.abi.call({ - target: AVAX_PRICEFEED, - abi: fetchPrice_vAbi, - block, - chain: "avax" - }) - ).output - - const pool2ValueUSD = (YETIReserve * YETIPrice + AVAXReserve * AVAXPrice) / 10 ** 18 - return { - // In USDC, USDC has decimal of 6 - ["avax:" + ADDRESSES.avax.USDC]: pool2ValueUSD / (10 ** 12) - } -} - -async function staking(_, _block, chainBlocks) { - const block = chainBlocks[chain] - const veYETIBalance = ( - await sdk.api.erc20.balanceOf({ - target: YETI_TOKEN_ADDRESS, - owner: VEYETI_ADDRESS, - block, - chain:"avax" - }) - ).output; - - const YETIPrice = ( - await sdk.api.abi.call({ - target: YETI_PRICEFEED, - abi: fetchPrice_vAbi, - block, - chain: "avax" - }) - ).output - - const stakingUSD = veYETIBalance * YETIPrice / (10 ** 18) - return { - // In USDC, USDC has decimal of 6 - ["avax:" + ADDRESSES.avax.USDC]: stakingUSD / (10 ** 12) - } -} - +// https://yetifinance.medium.com/yeti-finance-wind-down-55913bbf6aed module.exports = { misrepresentedTokens: true, - methodology: true, - // first trove opened - start: 1650027587, + start: '2022-04-15', + deadFrom: '2324-02-10', + hallmarks: [ + [Math.floor(new Date('2023-12-28')/1e3), 'Protocol decides to wind down'], + ], avax:{ - tvl, - pool2, - staking + tvl: () => ({}), + pool2: () => ({}), + staking: () => ({}), }, }; diff --git a/projects/yfdai/index.js b/projects/yfdai/index.js index 839ffc7445..52133f95d9 100644 --- a/projects/yfdai/index.js +++ b/projects/yfdai/index.js @@ -1,6 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') -const sdk = require('@defillama/sdk') -const {sumTokens} = require('../helper/unwrapLPs') +const { sumTokensExport } = require('../helper/unwrapLPs') +const { staking } = require('../helper/staking') const yfdaiTokenAddress = "0xf4CD3d3Fda8d7Fd6C5a500203e38640A70Bf9577"; const YfDaiStakingAdddress = "0x44d771D0C998f524ff39aB6Df64B72bce1d09566"; @@ -15,33 +15,13 @@ const YfDaiETHLP60DayVault = "0x26572bf2620108cb5006987e6348c07dc4e14a0f"; const YfDaiETHLP90DayVault = "0x175d6cbaeff93734ada4c5430815f2208a6b040c"; const impulsevenStakingAddress = "0xc0c135D29ba6BB1Ca5F88571A0c45807C3015c64"; -async function eth(_timestamp, ethBlock, chainBlocks) { - const balances = {} - await sumTokens(balances, [ - [yfdaiTokenAddress, YfDaiSafetradeStakingAddress], - [weth, wethVault], - [dai, daiVault], - ], ethBlock) - return balances -} - -async function staking(_timestamp, ethBlock, chainBlocks) { - const balances = {} - await sumTokens(balances, [ - [yfdaiTokenAddress, YfDaiETHLP72HRSVault], - [yfdaiTokenAddress, YfDaiETHLP30DayVault], - [yfdaiTokenAddress, YfDaiETHLP60DayVault], - [yfdaiTokenAddress, YfDaiETHLP90DayVault], - [yfdaiTokenAddress, impulsevenStakingAddress], - [yfdaiTokenAddress, YfDaiStakingAdddress] - ], ethBlock) - return balances -} - - module.exports = { - ethereum:{ - tvl: eth, - staking - }, + ethereum: { + tvl: sumTokensExport({ tokensAndOwners: [ + [yfdaiTokenAddress, YfDaiSafetradeStakingAddress], + [weth, wethVault], + [dai, daiVault], + ]}), + staking: staking([YfDaiStakingAdddress, YfDaiETHLP72HRSVault, YfDaiETHLP30DayVault, YfDaiETHLP60DayVault, YfDaiETHLP90DayVault, impulsevenStakingAddress,], yfdaiTokenAddress) + }, } diff --git a/projects/yfii/index.js b/projects/yfii/index.js index 202195c85d..4c9d659208 100644 --- a/projects/yfii/index.js +++ b/projects/yfii/index.js @@ -105,6 +105,6 @@ async function tvl(timestamp, block) { module.exports = { doublecounted: true, - start: 1600185600, // 09/16/2020 @ 12:00am (UTC+8) + start: '2020-09-15', // 09/16/2020 @ 12:00am (UTC+8) ethereum: { tvl } }; diff --git a/projects/yiedl-vaults/index.js b/projects/yiedl-vaults/index.js index 3659a66116..300d674eaf 100644 --- a/projects/yiedl-vaults/index.js +++ b/projects/yiedl-vaults/index.js @@ -90,6 +90,6 @@ module.exports = { optimism: { tvl, }, - start: 1703073600, // 2023-12-20 12:00:00 UTC + start: '2023-12-20', // 2023-12-20 12:00:00 UTC methodology: 'Calculates the total value of positions held by the YIEDL Vaults in Synthetix Perpetuals.' }; diff --git a/projects/yield-fi/index.js b/projects/yield-fi/index.js new file mode 100644 index 0000000000..c43a7ce743 --- /dev/null +++ b/projects/yield-fi/index.js @@ -0,0 +1,14 @@ +const config = { + ethereum: "0x1CE7D9942ff78c328A4181b9F3826fEE6D845A97", + optimism: '0x895e15020C3f52ddD4D8e9514eB83C39F53B1579', + bob: '0x895e15020C3f52ddD4D8e9514eB83C39F53B1579' +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + const supply = await api.call({ abi: 'erc20:totalSupply', target: config[chain] }) + api.add(config[chain], supply) + } + } +}) \ No newline at end of file diff --git a/projects/yieldfields/index.js b/projects/yieldfields/index.js index 67ee07a603..3caa7cd4bc 100644 --- a/projects/yieldfields/index.js +++ b/projects/yieldfields/index.js @@ -6,5 +6,5 @@ module.exports = { bsc: { tvl: getUniTVL({ factory: '0x0A376eE063184B444ff66a9a22AD91525285FE1C', useDefaultCoreAssets: true }), }, - start: 1621263282, // May-17-2021 03:54:42 PM + start: '2021-05-17', // May-17-2021 03:54:42 PM }; diff --git a/projects/yieldflow/index.js b/projects/yieldflow/index.js index 94b58c40ca..ec358d77c2 100644 --- a/projects/yieldflow/index.js +++ b/projects/yieldflow/index.js @@ -66,6 +66,30 @@ const managers = [ '0xD4c68a094De7e1336E261c6EDD595F64cd70A064', '0x88609B69feDc0EEF4326c3390a8ae1b2073DcF03', '0xdcC4391042d462158C847f73F4232ce47A8F999c', + + '0xB67EFF6590D8457c870f84b5eA3B2CeEb7dbCD50', + '0xE7cC8F17295cb9975e3D9aB3798C4fe0AA378c5F', + '0xfb35BeDFB647c0445B9177aFFd6e7b81Bb8Ab9Bc', + + '0x590905F3adC1a16Af6A144Eaca57ba65760e93Cf', + '0x4568936B2846debb1Ed65122841A500B639f49A7', + '0x17263600ABccf294C6D0Ec02bCc23A240e883c7D', + + '0x1F73AbC7e254980AB26974C9A13c8493143F97Bc', + '0x599Dd6b1205E51fbcb2879105051C0EBbfa76b03', + '0xcC125F83BFe2A30F1BEfdf6E06043dB5a7a02A61', + + '0xd7F287266D0E057D0e64C126687154CB1db9610A', + '0x56E81D09b31572982019fDa2e284cFAe48BD5aAc', + '0xAf0ddFa27EcccF9f0358cAC2d18E4800b53063f4', + + '0x3Bd5B4422685F9321F0e5a8333067A4A049fC664', + '0x1AC1d8911BBb2Fed8fD736e3649FC363001C8e07', + '0x5ABf77610fabaD2DeF07A43eF6f66C1D2438dE7e', + + '0xc9aDB46B1Ea65EE8A7A7BD1aE0dfB82d7421751d', + '0x5309161C131f75F15c28BD1a5d3614001c8d9c10', + '0x2fd2c02534383ca0c973F92237Af2639021DaC23', ] async function tvl(api) { @@ -96,11 +120,15 @@ const config = { '0x47Dd57DFe9e01616e4Adc28015243Ea6A2C09cEC', '0x0a4a169a6b2ac75c86e2F0e42822fdEA13fB1CC8', '0xafFA16b152232dAd8BF3AaDF6bb6F895A836F917', - '0xFB04d48e4CE9C042188Ef933ff4cf58921Ab59B8' + '0xFB04d48e4CE9C042188Ef933ff4cf58921Ab59B8', + '0x36232356758c746A50AD5078815F09e39E34628d', + '0xA0FDf5DC858ea552d51B4fa304e72cEB34e736fb', + '0xaC36A41da8f069C4874Dda60e073B5DcF889B56E', + '0x9D0731968AE480936c25ae841573842eEF6D65a4' ] } } Object.keys(config).forEach(chain => { module.exports[chain] = { tvl } -}) \ No newline at end of file +}) diff --git a/projects/yieldnest/index.js b/projects/yieldnest/index.js index f69868f71d..9e26d6c82a 100644 --- a/projects/yieldnest/index.js +++ b/projects/yieldnest/index.js @@ -2,17 +2,29 @@ const ADDRESSES = require('../helper/coreAssets.json') const YN_ETH = '0x09db87a538bd693e9d08544577d5ccfaa6373a48' -const YN_LSDE = '0x35Ec69A77B79c255e5d47D5A3BdbEFEfE342630c' +const yn_ETHx = '0x657d9ABA1DBb59e53f9F3eCAA878447dCfC96dCb' module.exports = { + doublecounted: true, ethereum: { tvl: async (api) => { const ynethBalance = await api.call({ abi: 'uint256:totalAssets', target: YN_ETH }) api.add(ADDRESSES.null, ynethBalance) const lsdRegistry = '0x323C933df2523D5b0C756210446eeE0fB84270fd' const lsds = await api.call({ abi: 'address[]:getAssets', target: lsdRegistry }) - const bals = await api.call({ abi: 'function assetBalances(address[]) view returns (uint256[])', target: YN_LSDE, params: [lsds] }) + const bals = await api.call({ abi: 'function getAllAssetBalances() view returns (uint256[])', target: lsdRegistry }) api.add(lsds, bals) + const maxethBalance = await api.call({ abi: 'uint256:totalAssets', target: yn_ETHx }) + api.add(ADDRESSES.null, maxethBalance) + } }, -} \ No newline at end of file + bsc: { + tvl: async (api) => { + const ynBNB = '0x304B5845b9114182ECb4495Be4C91a273b74B509' + const ynBTCk = '0x78839cE14a8213779128Ee4da6D75E1326606A56' + const ynBNBx = '0x32C830f5c34122C6afB8aE87ABA541B7900a2C5F' + return api.erc4626Sum({ calls: [ynBNB, ynBTCk, ynBNBx], isOG4626: true}) + } + }, +} diff --git a/projects/yieldwolf/index.js b/projects/yieldwolf/index.js index 22782306de..856cc19b95 100644 --- a/projects/yieldwolf/index.js +++ b/projects/yieldwolf/index.js @@ -1,105 +1,33 @@ -const sdk = require("@defillama/sdk"); const abi = require("./abi.json"); -const { unwrapLPsAuto } = require("../helper/unwrapLPs"); -const { - getChainTransform, -} = require("../helper/portedTokens"); +const { sumTokens2 } = require("../helper/unwrapLPs"); -const vaultsContractPolygon = "0xBF65023BcF48Ad0ab5537Ea39C9242de499386c9"; -const ignoreAddresses_polygon = ["0x0B048D6e01a6b9002C291060bF2179938fd8264c"]; - -const vaultsContractFantom = "0x876F890135091381c23Be437fA1cec2251B7c117"; -const vaultsContractCelo = "0xd54AA6fEeCc289DeceD6cd0fDC54f78079495E79"; -const vaultsContractAvax = "0xc9070B3EFE0aacC5AfB4B31C5DbDCA7C6B4bAAA9"; -const vaultsContractCronos = "0x8fEc7A778Cba11a98f783Ebe9826bEc3b5E67F95"; -const vaultsContractHarmony = "0x8fec7a778cba11a98f783ebe9826bec3b5e67f95"; -const vaultsContractBsc = "0xD3aB90CE1eEcf9ab3cBAE16A00acfbace30EbD75"; - -const calcTvl = async (chain, block, masterchef, ignoreAddresses = []) => { - const balances = {} - const transformAddress = await getChainTransform(chain) - const poolLength = ( - await sdk.api.abi.call({ abi: abi.poolLength, target: masterchef, chain, block, }) - ).output; - const calls = [] - for (let index = 0; index < poolLength; index++) - calls.push({ params: index }) - - const { output: res } = await sdk.api.abi.multiCall({ - target: masterchef, - abi: abi.poolInfo, - calls: calls, - chain, block, - }); - - const stratCalls = res.map(i => ({ target: i.output.strategy })) - - const { output: stratResponse } = await sdk.api.abi.multiCall({ - abi: abi.totalStakeTokens, - calls: stratCalls, - chain, block, - }); - - res.forEach(({ output }, i) => { - const token = output.stakeToken - if (ignoreAddresses.some((addr) => addr.toLowerCase() === token.toLowerCase())) return; - sdk.util.sumSingleBalance(balances, transformAddress(token), stratResponse[i].output) - }) - - await unwrapLPsAuto({ balances, block, chain, transformAddress }) - return balances -}; - -const polygonTvl = async (ts, _, chainBlocks) => { - return calcTvl("polygon", chainBlocks["polygon"], vaultsContractPolygon, ignoreAddresses_polygon); -}; - -const fantomTvl = async (ts, _, chainBlocks) => { - return calcTvl("fantom", chainBlocks["fantom"], vaultsContractFantom,); -}; - -const celoTvl = async (ts, _, chainBlocks) => { - return calcTvl("celo", chainBlocks["celo"], vaultsContractCelo,); -}; - -const avaxTvl = async (ts, _, chainBlocks) => { - return calcTvl("avax", chainBlocks["avax"], vaultsContractAvax,); -}; - -const cronosTvl = async (ts, _, chainBlocks) => { - return calcTvl("cronos", chainBlocks["cronos"], vaultsContractCronos,); -}; - -const harmonyTvl = async (ts, _, chainBlocks) => { - return calcTvl("harmony", chainBlocks["harmony"], vaultsContractHarmony,); -}; - -const bscTvl = async (ts, _, chainBlocks) => { - return calcTvl("bsc", chainBlocks["bsc"], vaultsContractBsc,); -}; +const blacklistedTokens = ["0x0B048D6e01a6b9002C291060bF2179938fd8264c"]; module.exports = { misrepresentedTokens: true, - polygon: { - tvl: polygonTvl, - }, - fantom: { - tvl: fantomTvl, - }, - celo: { - tvl: celoTvl, - }, - avax: { - tvl: avaxTvl, - }, - cronos: { - tvl: cronosTvl, - }, - harmony: { - tvl: harmonyTvl, - }, - bsc: { - tvl: bscTvl, - }, methodology: "We count liquidity on all the Vaults through YieldWolf Contracts", -}; +} + +const config = { + polygon: '0xBF65023BcF48Ad0ab5537Ea39C9242de499386c9', + fantom: '0x876F890135091381c23Be437fA1cec2251B7c117', + celo: '0xd54AA6fEeCc289DeceD6cd0fDC54f78079495E79', + avax: '0xc9070B3EFE0aacC5AfB4B31C5DbDCA7C6B4bAAA9', + cronos: '0x8fEc7A778Cba11a98f783Ebe9826bEc3b5E67F95', + harmony: '0x8fec7a778cba11a98f783ebe9826bec3b5e67f95', + bsc: '0xD3aB90CE1eEcf9ab3cBAE16A00acfbace30EbD75', +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + const poolInfos = await api.fetchList({ lengthAbi: abi.poolLength, itemAbi: abi.poolInfo, target: config[chain]}) + const strategies = poolInfos.map(i => i.strategy) + const tokens = poolInfos.map(i => i.stakeToken) + const bals = await api.multiCall({ abi: abi.totalStakeTokens, calls: strategies}) + api.add(tokens, bals) + blacklistedTokens.forEach(token => api.removeTokenBalance(token)) + return sumTokens2({ api, resolveLP: true }) + } + } +}) \ No newline at end of file diff --git a/projects/yieldyak-staked-avax/index.js b/projects/yieldyak-staked-avax/index.js index c283738089..98651d7aa5 100644 --- a/projects/yieldyak-staked-avax/index.js +++ b/projects/yieldyak-staked-avax/index.js @@ -22,7 +22,7 @@ async function avax(api) { } module.exports = { - start: 1658869201, + start: '2022-07-26', methodology: "Total Supply and Underlying Price of the derivative is multiplied, resulting in number of staked Avax tokens.", doublecounted: true, avax: { diff --git a/projects/yldr/index.js b/projects/yldr/index.js index b601e17d0e..50187d6585 100644 --- a/projects/yldr/index.js +++ b/projects/yldr/index.js @@ -3,7 +3,7 @@ const { getLogs } = require('../helper/cache/getLogs') module.exports = { methodology: 'Get available liquidity for all reserves and include Uniswap V3 positions', - start: 1702931986, + start: '2023-12-18', }; const config = { diff --git a/projects/zeebu/index.js b/projects/zeebu/index.js new file mode 100644 index 0000000000..5b583d7e15 --- /dev/null +++ b/projects/zeebu/index.js @@ -0,0 +1,38 @@ +const { stakings } = require("../helper/staking"); +const { pool2s } = require("../helper/pool2"); + +const VOTING_ESCROW_ADDRESSES = { + ethereum: '0x8e76Cdf3b14c540aB54aFa7f8492AC1d16Ecfb35', + base: '0xcf08d1ec5d8e566d95299399307f75f98d6aea03', + bsc: '0xd3e8cD2eDbf252860E02ffb245fD654b1ab30f30', +}; + +const ZBU_ADDRESSES = { + ethereum: '0xe77f6aCD24185e149e329C1C0F479201b9Ec2f4B', + base: '0x2C8C89C442436CC6C0a77943E09c8Daf49Da3161', + bsc: '0x4D3dc895a9EDb234DfA3e303A196c009dC918f84', +}; + +const lpTokens = [ + '0xC3889F9764d68BDF2e16f237206746344172A147' +]; + +const stackingcontract = [ + '0x45dd22aCe398002b34cB37b363B2F02C7dd47842' +]; + +module.exports = { + ethereum: { + staking: stakings([VOTING_ESCROW_ADDRESSES["ethereum"]], ZBU_ADDRESSES["ethereum"]), + tvl: () => ({}) + }, + base: { + staking: stakings([VOTING_ESCROW_ADDRESSES["base"]], ZBU_ADDRESSES["base"]), + pool2: pool2s(stackingcontract, lpTokens), + }, + bsc: { + staking: stakings([VOTING_ESCROW_ADDRESSES["bsc"]], ZBU_ADDRESSES["bsc"]), + }, + methodology: + 'Counts ZBU tokens locked in Voting Escrow contracts across Ethereum, Base, and BSC.', +}; \ No newline at end of file diff --git a/projects/zencha/index.js b/projects/zencha/index.js index ba46550394..4561a451f6 100644 --- a/projects/zencha/index.js +++ b/projects/zencha/index.js @@ -1,55 +1,10 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokens } = require("../helper/unwrapLPs"); +const { sumTokensExport } = require("../helper/unwrapLPs"); const swapFlashLoan = '0x2D027B49B8960810F84D5fE172d07FFf62311852'; -const tokens = { - DAI: { - boba: ADDRESSES.boba.DAI, - eth: ADDRESSES.ethereum.DAI - }, - USDT: { - boba: ADDRESSES.boba.USDT, - eth: ADDRESSES.ethereum.USDT - }, - USDC: { - boba: ADDRESSES.boba.USDC, - eth: ADDRESSES.ethereum.USDC - } -}; - -function transform(address) { - for (let token of Object.keys(tokens)) { - if (tokens[token].boba == address) { - return tokens[token].eth; - } - } - - return address; -} - -async function tvl(timestamp, block, chainBlocks) { - block = chainBlocks.boba; - const balances = {}; - - await sumTokens( - balances, - [ - [tokens.DAI.boba, swapFlashLoan], - [tokens.USDT.boba , swapFlashLoan], - [tokens.USDC.boba , swapFlashLoan], - ], - block, - "boba", - transform - ); - - return balances; -} - module.exports = { boba: { - tvl + tvl: sumTokensExport({ owner: swapFlashLoan, tokens: [ADDRESSES.boba.USDC, ADDRESSES.boba.USDT, ADDRESSES.boba.DAI] }), } -}; -// node test.js projects/zencha/index.js \ No newline at end of file +} \ No newline at end of file diff --git a/projects/zeno/index.js b/projects/zeno/index.js index 541525055a..d76d60bba6 100644 --- a/projects/zeno/index.js +++ b/projects/zeno/index.js @@ -16,7 +16,7 @@ async function metisTvl(api) { } module.exports = { - start: 1710294153, + start: '2024-03-13', metis: { tvl: metisTvl, }, diff --git a/projects/zenolend/index.js b/projects/zenolend/index.js new file mode 100644 index 0000000000..995ab15332 --- /dev/null +++ b/projects/zenolend/index.js @@ -0,0 +1,10 @@ + +const { compoundExports2 } = require('../helper/compound') + +const config = { + apechain: '0xc2C583093Af9241E17B2Ec51844154468D21bF6F', +} + +Object.keys(config).forEach(chain => { + module.exports[chain] = compoundExports2({ comptroller: config[chain] }) +}); \ No newline at end of file diff --git a/projects/zero1-labs/index.js b/projects/zero1-labs/index.js index 488fb7619e..de777e952e 100644 --- a/projects/zero1-labs/index.js +++ b/projects/zero1-labs/index.js @@ -8,6 +8,7 @@ module.exports = { "0x7AabE771aCcAa3F54a1B7c05d65c6E55d0Cd0Af6", "0x88062FE2751f3D5cEC18F6113A532A611632ae79", "0x8DBA1f564458dd46283ca3a4CDf6CA019963aB42", + "0x68605AA964F25aC8c7C159331F9dF050321FDcc6", ], "0x1495bc9e44Af1F8BCB62278D2bEC4540cF0C05ea"), }, } diff --git a/projects/zerolend/index.js b/projects/zerolend/index.js index 6f56ea6d81..09c30da827 100644 --- a/projects/zerolend/index.js +++ b/projects/zerolend/index.js @@ -1,14 +1,25 @@ +const sdk = require('@defillama/sdk') const { aaveExports } = require("../helper/aave"); const { staking } = require("../helper/staking"); const { pool2s } = require("../helper/pool2"); const config = { - era: "0xB73550bC1393207960A385fC8b34790e5133175E", - manta: "0x67f93d36792c49a4493652B91ad4bD59f428AD15", - blast: "0xc6DF4ddDBFaCb866e78Dcc01b813A41C15A08C10", - linea: "0x67f93d36792c49a4493652B91ad4bD59f428AD15", - xlayer: "0x97e59722318F1324008484ACA9C343863792cBf6", - ethereum: "0x47223D4eA966a93b2cC96FFB4D42c22651FADFcf", + era: ["0xB73550bC1393207960A385fC8b34790e5133175E"], + manta: ["0x67f93d36792c49a4493652B91ad4bD59f428AD15"], + blast: ["0xc6DF4ddDBFaCb866e78Dcc01b813A41C15A08C10"], + base: ["0xA754b2f1535287957933db6e2AEE2b2FE6f38588"], + linea: [ + "0x67f93d36792c49a4493652B91ad4bD59f428AD15", // main linea market + '0x9aFB91a3cfB9aBc8Cbc8429aB57b6593FE36E173', // croak linea market + '0xEe9ec60657B714E3FAC5255a5443AC5EC7Ba5bB0', // foxy linea market + ], + xlayer: ["0x97e59722318F1324008484ACA9C343863792cBf6"], + zircuit: ["0xA754b2f1535287957933db6e2AEE2b2FE6f38588"], + ethereum: [ + "0x47223D4eA966a93b2cC96FFB4D42c22651FADFcf", // ethereum lrt market + '0x31063F7CA8ef4089Db0dEdf8D6e35690B468A611', // bitcoin lrt market + '0x298ECDcb0369Aef75cBbdA3e46a224Cfe622E287' // stablecoin rwa market + ], }; const linea = { @@ -23,7 +34,11 @@ const linea = { const data = {}; Object.keys(config).forEach((chain) => { - data[chain] = aaveExports(chain, undefined, undefined, [config[chain]]); + const chainExports = config[chain].map((address) => aaveExports(chain, undefined, undefined, [address])) + data[chain] = { + tvl: sdk.util.sumChainTvls(chainExports.map(i => i.tvl)), + borrowed: sdk.util.sumChainTvls(chainExports.map(i => i.borrowed)) + } }); data.linea.staking = staking(linea.zeroLocker, linea.zero, "linea"); diff --git a/projects/zeroswap/index.js b/projects/zeroswap/index.js index 17163c26da..aa538efc9a 100644 --- a/projects/zeroswap/index.js +++ b/projects/zeroswap/index.js @@ -10,7 +10,6 @@ const AVAX_STAKING_ADDRESS = '0xa4751EAa89C5D6ff61384766268cabf25aCD1011' module.exports = { methodology: 'Counts tvl of all the tokens staked through Staking Contracts', - start: 1000235, ethereum: { tvl:() => ({}), staking: staking(ETH_STAKING_ADDRESS, ETH_TOKEN_ADDRESS), diff --git a/projects/zest-protocol/index.js b/projects/zest-protocol/index.js index dee057d6a7..7f134eb7cf 100644 --- a/projects/zest-protocol/index.js +++ b/projects/zest-protocol/index.js @@ -1,176 +1,10 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const Abis = require("./abi.json"); -const sdk = require("@defillama/sdk"); -const BigNumber = require("bignumber.js"); - -const Contracts = { - fantom: { - wftm: ADDRESSES.fantom.WFTM, - wethBank: "0xB717b014BC34fc904396585CbF4FC1B0BBe603B4", - weth: "0x74b23882a30290451A17c44f4F05243b6b58C76d", - zsp: "0x2C26617034C840C9412CD67aE0Fc68A6755D00BF", - ftmz: "0x9e219b51891e2c62ea8a2ea438d331eae7c68484", - usdc: ADDRESSES.fantom.USDC, - bank: "0x9fc3E5259Ba18BD13366D0728a256E703869F21D", - multiFeeDistribution: "0x1b6deD5c603d66800B0DDf566Ec316a344C7BcaD", - chef: "0xFdAa392FCF8946e8e658B9f36ffbE6659cB40edf", - wftmLps: [ - { - address: "0xcAa542473912a727C7F6715458db8C5f9b0291FC", // ZSP-WFTM - isToken0: true, - }, - { - address: "0xd02cc84b296ef3332Ca9371fC633bB7D7a51ad32", // FTMz-WFTM - isToken0: true, - }, - ], - wethLps: [ - { - address: "0x4f9b08C06A19EBee8871C3b563C38326927Ac945", // ETHz-WETH - isToken0: true, - }, - ], - usdcLps: [ - { - address: "0x2ABDC15324a38093e07b9EBF7c15bD8e672E212e", // ZSP-USDC - isToken0: true, - }, - ], - }, -}; - -async function calcTvl(timestamp, ethBlock, chainBlocks) { - const block = chainBlocks.fantom; - const chain = "fantom"; - - const bankBalance = await sdk.api.abi.call({ - target: Contracts.fantom.bank, - abi: Abis.bank.usableCollateralBalance, - chain: chain, - block, - }); - - const bankBalanceWeth = await sdk.api.abi.call({ - target: Contracts.fantom.wethBank, - abi: Abis.bank.usableCollateralBalance, - chain: chain, - block, - }); - - return { - [`fantom:${Contracts.fantom.wftm}`]: +bankBalance.output, - [`fantom:${Contracts.fantom.weth}`]: +bankBalanceWeth.output, - }; -} - -async function calcStakingTvl(timestamp, ethBlock, chainBlocks) { - const block = chainBlocks.fantom; - const chain = "fantom"; - - const stakingData = await sdk.api.abi.call({ - target: Contracts.fantom.multiFeeDistribution, - abi: Abis.multiFeeDistribution.totalSupply, - chain: chain, - block, - }); - - return { - [`fantom:${Contracts.fantom.zsp}`]: stakingData.output, - }; -} - -async function calcLp(lps, block, chain, baseToken) { - const reserves = ( - await sdk.api.abi.multiCall({ - calls: lps.map((lp) => ({ - target: lp.address, - params: [], - })), - abi: Abis.pair.getReserves, - block, - chain, - }) - ).output; - const totalSupplies = ( - await sdk.api.abi.multiCall({ - calls: lps.map((lp) => ({ - target: lp.address, - params: [], - })), - abi: "erc20:totalSupply", - block, - chain, - }) - ).output; - const balances = ( - await sdk.api.abi.multiCall({ - calls: lps.map((lp) => ({ - target: lp.address, - params: [Contracts.fantom.chef], - })), - abi: "erc20:balanceOf", - block, - chain, - }) - ).output; - - const results = lps.map((lp, index) => - new BigNumber( - reserves[index].output[lp.isToken0 ? "_reserve0" : "_reserve1"] - ) - .times(2) - .times(new BigNumber(balances[index].output)) - .idiv(new BigNumber(totalSupplies[index].output)) - ); - - const total = results.reduce( - (total, num) => total.plus(num), - new BigNumber(0) - ); - - return { - [`fantom:${baseToken}`]: total.toString(10), - }; -} - -async function ftmPool2(timestamp, block, chainBlocks) { - const zsp = await calcLp( - Contracts.fantom.wftmLps, - chainBlocks.fantom, - "fantom", - Contracts.fantom.zsp - ); - - const ftmz = await calcLp( - Contracts.fantom.wftmLps, - chainBlocks.fantom, - "fantom", - Contracts.fantom.wftm - ); - - const weth = await calcLp( - Contracts.fantom.wethLps, - chainBlocks.fantom, - "fantom", - Contracts.fantom.weth - ); - - const usdc = await calcLp( - Contracts.fantom.usdcLps, - chainBlocks.fantom, - "fantom", - Contracts.fantom.usdc - ); - - return { ...zsp, ...ftmz, ...weth, ...usdc }; -} - module.exports = { methodology: "TVL of collateral added to Zest Protocol in order to mint Synthetic Assets.", + deadFrom: '2022-08-10', fantom: { - tvl: calcTvl, - pool2: ftmPool2, - staking: calcStakingTvl, + tvl: () => ({}), + pool2: () => ({}), + staking: () => ({}), }, }; diff --git a/projects/zetaEarn/index.js b/projects/zetaEarn/index.js index 4411f0b53d..937c715b18 100644 --- a/projects/zetaEarn/index.js +++ b/projects/zetaEarn/index.js @@ -1,6 +1,18 @@ -async function tvl(api) { +async function zetaTvl(api) { api.addGasToken(await api.call({target: '0x45334a5b0a01ce6c260f2b570ec941c680ea62c0', abi: 'uint256:getTotalPooledZETA'})) - } -module.exports = { zeta: { tvl } } \ No newline at end of file +const btrZTokens = [ + '0xd53E6f1d37f430d84eFad8060F9Fec558B36F6fa', // zbtc + '0xdc842A54dB9E6136c7972eA863Efd6CE0d45602c', // zordi + '0xb86e3Cc68d9C56E1b87DEddF49c4A6fdaaF04A82' // zsats +]; + +async function btrTvl(api) { + for (const token of btrZTokens) { + const supply = await api.call({ abi: 'uint256:totalSupply', target: token }); + api.add(token, supply); + } +} + +module.exports = { zeta: { tvl: zetaTvl }, btr: { tvl: btrTvl } } diff --git a/projects/zircuit-chain/index.js b/projects/zircuit-chain/index.js new file mode 100644 index 0000000000..ee2044a19d --- /dev/null +++ b/projects/zircuit-chain/index.js @@ -0,0 +1,17 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners: ['0x17bfAfA932d2e23Bd9B909Fd5B4D2e2a27043fb1', '0x386B76D9cA5F5Fb150B6BFB35CF5379B22B26dd8'], + fetchCoValentTokens: true, + permitFailure: true, + blacklistedTokens: ['0xfd418e42783382e86ae91e445406600ba144d162'] + }), + staking: (api) => sumTokens2({ + api, owner: '0x386B76D9cA5F5Fb150B6BFB35CF5379B22B26dd8', token: '0xfd418e42783382e86ae91e445406600ba144d162', + }) + }, +}; diff --git a/projects/zircuit/index.js b/projects/zircuit/index.js index dc8ef0a2ae..8f06809941 100644 --- a/projects/zircuit/index.js +++ b/projects/zircuit/index.js @@ -1,39 +1,23 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokensExport } = require("../helper/unwrapLPs"); +const { getLogs2 } = require('../helper/cache/getLogs'); +const { sumTokens2 } = require('../helper/unwrapLPs'); -const ZIRCUIT_STAKING_CONTRACT = '0xf047ab4c75cebf0eb9ed34ae2c186f3611aeafa6'; +const config = { + ethereum: { + factory: '0xf047ab4c75cebf0eb9ed34ae2c186f3611aeafa6', fromBlock: 19237243, missing: [ + '0xa1290d69c65a6fe4df752f95823fae25cb99e5a7', + '0xbf5495Efe5DB9ce00f80364C8B423567e58d2110', + ] + }, + zircuit: { factory: '0x7d8311839eB44Dd5194abd2dd3998722455A24E0', fromBlock: 2427557, }, +} -const TOKEN_CONTRACTS = [ - '0xa1290d69c65a6fe4df752f95823fae25cb99e5a7', // rsETH - '0xbf5495Efe5DB9ce00f80364C8B423567e58d2110', // ezETH - '0x8c1BEd5b9a0928467c9B1341Da1D7BD5e10b6549', // lsETH - ADDRESSES.ethereum.WETH, // ETH - '0xFAe103DC9cf190eD75350761e95403b7b8aFa6c0', // rswETH - '0x49446A0874197839D15395B908328a74ccc96Bc0', // mstETH - '0xE46a5E19B19711332e33F33c2DB3eA143e86Bc10', // mwBETH - '0x32bd822d615A3658A68b6fDD30c2fcb2C996D678', // mswETH - ADDRESSES.ethereum.WSTETH, // wstETH - '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee', // weETH - '0xf951E335afb289353dc249e82926178EaC7DEd78', // swETH - ADDRESSES.ethereum.USDe, // USDe - ADDRESSES.ethereum.STONE, // cSTONE - '0xd5F7838F5C461fefF7FE49ea5ebaF7728bB0ADfa', // mETH - '0xD9A442856C234a39a81a089C06451EBAa4306a72', // pufETH - '0x18f313Fc6Afc9b5FD6f0908c1b3D476E3feA1DD9', // egETH - '0x5fD13359Ba15A84B76f7F87568309040176167cd', // amphrETH - '0x7a4EffD87C2f3C55CA251080b1343b605f327E3a', // rstETH - '0xBEEF69Ac7870777598A04B2bd4771c71212E6aBc', // steakLRT - '0x84631c0d0081FDe56DeB72F6DE77abBbF6A9f93a', // Re7LRT - '0x8c9532a60E0E7C6BbD2B2c1303F63aCE1c3E9811', // pzETH - '0xF469fBD2abcd6B9de8E169d128226C0Fc90a012e', // pumpBTC - '0x917ceE801a67f933F2e6b33fC0cD1ED2d5909D88' // weETHs -]; - -module.exports = { - ethereum: { - tvl: sumTokensExport({ - owner: ZIRCUIT_STAKING_CONTRACT, - tokens: TOKEN_CONTRACTS, - }), +Object.keys(config).forEach(chain => { + const { factory, fromBlock, missing = [] } = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const logs = await getLogs2({ api, factory, eventAbi: 'event TokenStakabilityChanged(address token, bool enabled)', fromBlock, }) + const tokens = logs.map(i => i.token).concat(missing) + return sumTokens2({ api, owner: factory, tokens, permitFailure: true, }) } -}; \ No newline at end of file + } +}) \ No newline at end of file diff --git a/projects/zivoe/index.js b/projects/zivoe/index.js new file mode 100644 index 0000000000..27b631ea5c --- /dev/null +++ b/projects/zivoe/index.js @@ -0,0 +1,49 @@ +const { getLogs2 } = require("../helper/cache/getLogs"); + +const LOANS_FROM_BLOCK = 20973423; + +// On-Chain Credit Locker +const OCC_USDC = "0xfAb4e880467e26ED46F00c669C28fEaC58262698"; + +// TVL Owners +const DAO = "0xB65a66621D7dE34afec9b9AC0755133051550dD7"; +const YDL = "0xfB7920B55887840643e20952f22Eb18dDC474B2B"; +const ST_STT = "0x0D45c292baCdC47CE850E4c83a2FA2e8509DEd5D"; +const ST_JTT = "0xcacdB1A5a11F824E02De4CA6E7b2D12BB278aA7c"; + +// TVL Asset +const USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; + +async function borrowed(api) { + const loansIds = await getLogs2({ + api, + target: OCC_USDC, + eventAbi: "event OfferAccepted(uint256 indexed id, uint256 principal, address indexed borrower, uint256 paymentDueBy)", + fromBlock: LOANS_FROM_BLOCK, + customCacheFunction: ({ cache, logs }) => { + if (!cache.logs) cache.logs = [] + cache.logs.push(...logs.map(i => i.id.toString())) + cache.logs = [...new Set(cache.logs)] + return cache + }, + }); + + const loans = await api.multiCall({ + abi: "function loans(uint256) view returns (address borrower, uint256 principalOwed, uint256 APR, uint256 APRLateFee, uint256 paymentDueBy, uint256 paymentsRemaining, uint256 term, uint256 paymentInterval, uint256 offerExpiry, uint256 gracePeriod, int8 paymentSchedule, uint8 state)", + target: OCC_USDC, + calls: loansIds, + }); + const owedAmounts = loans.map(({ principalOwed }) => principalOwed); + + const occAsset = await api.call({ abi: "address:stablecoin", target: OCC_USDC }); + const tokens = Array(owedAmounts.length).fill(occAsset); + + api.addTokens(tokens, owedAmounts); +} + +module.exports = { + ethereum: { + tvl: () => ({}), + borrowed, + }, +}; diff --git a/projects/zkLink/index.js b/projects/zkLink/index.js index 3c3ec06b60..1f9b6131b9 100644 --- a/projects/zkLink/index.js +++ b/projects/zkLink/index.js @@ -1,5 +1,6 @@ const { sumTokens2 } = require("../helper/unwrapLPs"); const ADDRESSES = require("../helper/coreAssets.json"); +const { staking } = require("../helper/staking.js"); const config = { ethereum: { @@ -99,7 +100,7 @@ const config = { "0x80d12A78EfE7604F00ed07aB2f16F643301674D5", ], tokens: [ - "0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452", // wstETH + ADDRESSES.base.wstETH, // wstETH ], }, optimism: { @@ -134,3 +135,7 @@ async function tvl(api) { Object.keys(config).forEach(async chain => { module.exports[chain] = { tvl } }) +module.exports.ethereum.staking = staking( + '0xAd16eDCF7DEB7e90096A259c81269d811544B6B6', + '0xfC385A1dF85660a7e041423DB512f779070FCede' +); \ No newline at end of file diff --git a/projects/zkSwap-finance-stableswap/index.js b/projects/zkSwap-finance-stableswap/index.js new file mode 100644 index 0000000000..92ea9e093d --- /dev/null +++ b/projects/zkSwap-finance-stableswap/index.js @@ -0,0 +1,35 @@ +const { getLogs2 } = require('../helper/cache/getLogs') + +module.exports = { + methodology: + "TVL accounts for the liquidity on all StableSwap pools.", +} + +const config = { + era: [{ target: '0xc93397F26886daB0d752C86612C78dbd2C1d5a59', fromBlock: 48190039, token3: true, },], +} + +Object.keys(config).forEach(chain => { + const factories = config[chain] + module.exports[chain] = { + tvl: async (api) => { + const configs = await Promise.all(factories.map(getTvlConfig)) + return api.sumTokens({ ownerTokens: configs.flat() }) + + async function getTvlConfig({ target, fromBlock, token3 }) { + let topic = '0xa9551fb056fc743efe2a0a34e39f9769ad10166520df7843c09a66f82e148b97' + let eventAbi = 'event NewStableSwapPair(address indexed swapContract, address indexed tokenA, address indexed tokenB)' + let getOwnTokens = logs => logs.map(i => ([[i.tokenA, i.tokenB], i.swapContract])) + + if (token3) { + topic = '0x48dc7a1b156fe3e70ed5ed0afcb307661905edf536f15bb5786e327ea1933532' + eventAbi = 'event NewStableSwapPair(address indexed swapContract, address tokenA, address tokenB, address tokenC, address LP)' + getOwnTokens = logs => logs.map(i => ([[i.tokenA, i.tokenB, i.tokenC], i.swapContract])) + } + + const logs = await getLogs2({ api, target, fromBlock, eventAbi }) + return getOwnTokens(logs) + } + } + } +}) \ No newline at end of file diff --git a/projects/zkSwap-finance-v3/index.js b/projects/zkSwap-finance-v3/index.js new file mode 100644 index 0000000000..bdcfdbc69e --- /dev/null +++ b/projects/zkSwap-finance-v3/index.js @@ -0,0 +1,5 @@ +const { uniV3Export } = require('../helper/uniswapV3') + +module.exports = uniV3Export({ + era: { factory: '0x88ADD6a7e3C221e02f978B388a092c9FD8cd7850', fromBlock: 49205949 }, +}) diff --git a/projects/zkUSD/index.js b/projects/zkUSD/index.js index 7082b77323..b9a17333fb 100644 --- a/projects/zkUSD/index.js +++ b/projects/zkUSD/index.js @@ -6,7 +6,7 @@ const TROVE_MANAGER_ADDRESS = { } module.exports = { - start: 1700000000, // Tuesday, November 14, 2023 10:13:20 PM + start: '2023-11-14', // Tuesday, November 14, 2023 10:13:20 PM }; Object.keys(TROVE_MANAGER_ADDRESS).forEach(chain => { diff --git a/projects/zkdx/index.js b/projects/zkdx/index.js index 2b75c223b5..4ccd02f99b 100644 --- a/projects/zkdx/index.js +++ b/projects/zkdx/index.js @@ -3,7 +3,6 @@ const {staking} = require("../helper/staking"); module.exports = { methodology: 'zkDX counts the staking values as tvl', - start: 3744214, era: { tvl: staking( ["0x79033C597B7d8e752a7511cF24512f4A7217C0B8", "0xd6cce119B45Efcb378a4735a96aE08826A37ca1c", diff --git a/projects/zkfairswap/index.js b/projects/zkfairswap/index.js index c9145bae53..856b5a4056 100644 --- a/projects/zkfairswap/index.js +++ b/projects/zkfairswap/index.js @@ -1,3 +1,3 @@ const { uniTvlExport } = require('../helper/unknownTokens') -module.exports = uniTvlExport( "zkfair", "0xeA70460a5B0E3A94EC05b1AaFCe9e6Eb11C334A0", { fetchBalances: true } ); +module.exports = uniTvlExport( "zkfair", "0xeA70460a5B0E3A94EC05b1AaFCe9e6Eb11C334A0" ); diff --git a/projects/zkfinance/index.js b/projects/zkfinance/index.js index 1ba6e29c4e..a5f3d04b8a 100644 --- a/projects/zkfinance/index.js +++ b/projects/zkfinance/index.js @@ -6,6 +6,5 @@ module.exports = { era: compoundExports2({ comptroller: zksyncComptroller, cether: zkEther, - fetchBalances: true, }), }; diff --git a/projects/zklend-strk-staking/abi.js b/projects/zklend-strk-staking/abi.js new file mode 100644 index 0000000000..c15975632d --- /dev/null +++ b/projects/zklend-strk-staking/abi.js @@ -0,0 +1,19 @@ +const strkStaking = [ + { + "type": "function", + "name": "get_total_stake", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u128" + } + ], + "state_mutability": "view" + }, +] +const strkStakingAbi = {} +strkStaking.forEach(i => strkStakingAbi[i.name] = i) + +module.exports = { + strkStakingAbi, +} \ No newline at end of file diff --git a/projects/zklend-strk-staking/index.js b/projects/zklend-strk-staking/index.js new file mode 100644 index 0000000000..b1a2d0afc5 --- /dev/null +++ b/projects/zklend-strk-staking/index.js @@ -0,0 +1,17 @@ +const ADDRESSES = require('../helper/coreAssets.json') +const { call } = require('../helper/chain/starknet') +const { strkStakingAbi } = require('./abi'); + +const stakingContract = '0x057ea05c22d6b162d0f2ef4b3d1e1edf3c065d81cf0f41950f716a71e9ad6bae' + +async function tvl(api) { + const stakedAmount = await call({ target: stakingContract, abi: strkStakingAbi.get_total_stake }) + api.add(ADDRESSES.starknet.STRK, stakedAmount) +} + +module.exports = { + methodology: 'The TVL is calculated as a sum of total STRK deposited into zkLend\'s staking contract', + starknet: { + tvl, + }, +} diff --git a/projects/zks-miner/index.js b/projects/zks-miner/index.js index 9591eaf13e..8677befd7b 100644 --- a/projects/zks-miner/index.js +++ b/projects/zks-miner/index.js @@ -13,4 +13,5 @@ module.exports = { era: { tvl: sumTokensExport({ owners: [SILVER_MINER, DIAMOND_MINER, GOLD_MINER,], tokens: [nullAddress] }) }, + deadFrom: 1682726400 } diff --git a/projects/zkswap/index.js b/projects/zkswap/index.js index d903305201..267a7a92a8 100644 --- a/projects/zkswap/index.js +++ b/projects/zkswap/index.js @@ -8,7 +8,7 @@ const configs = [ ] module.exports = { - start: 1613135160, // 02/12/2021 @ 01:06pm UTC + start: '2021-02-12', // 02/12/2021 @ 01:06pm UTC ethereum: { tvl: sdk.util.sumChainTvls(configs.map(i => { return async function tvl(api) { diff --git a/projects/zomb2/index.js b/projects/zomb2/index.js index 54cd40a12a..0c3df29c11 100644 --- a/projects/zomb2/index.js +++ b/projects/zomb2/index.js @@ -1,5 +1,5 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { zombiTvl } = require("../zombi/zombi"); +const { zombiTvl } = require("../zomb2/zombi"); const token = "0xA87bcE04d4a396DF40cC1be3a21CF04592C08290"; const share = "0x9E594379bC7e2034fCc8607Fb8C57F149Fb68284"; diff --git a/projects/zombi/zombi.js b/projects/zomb2/zombi.js similarity index 100% rename from projects/zombi/zombi.js rename to projects/zomb2/zombi.js diff --git a/projects/zombi/index.js b/projects/zombi/index.js index c8f7f81b8f..cfd01c10d0 100644 --- a/projects/zombi/index.js +++ b/projects/zombi/index.js @@ -1,26 +1,11 @@ -const ADDRESSES = require('../helper/coreAssets.json') -const { zombiTvl } = require("./zombi"); - -const token = "0xda5db6c2a2fd53a2d3fc4246bbd8acce5f93bae1"; -const share = "0xb3584d821109e49a068a8c3a05f367bc54061252"; -const rewardPool = "0x3E6a10C75d33D4fF95A33342d33A73176Bcd0629"; -const rewardPoolGeneris = "0xDa0cB4684b02D8bB253Af60a942625D1BC9Ba53d"; -const masonry = "0x4E2950365024D27956538AB27C97083634DDBE90"; - -const pool2LPs = [ - "0xe577DF94b4Ea94399B7438e27EA1Ba81717464A0", - "0x5db45a30732cf98fda72b9b91a0c554dc1f2e83b" -]; -const listedTokenGeneris = [ - ADDRESSES.fantom.WFTM,//wftm - '0x74b23882a30290451A17c44f4F05243b6b58C76d',//weth - '0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE',//boo - '0xaD996A45fd2373ed0B10Efa4A8eCB9de445A4302'//alpaca -] - module.exports = { hallmarks: [ [1646870400, "Rug Pull"] ], - ...zombiTvl(token, share, rewardPool, rewardPoolGeneris, masonry, pool2LPs, listedTokenGeneris, "fantom", undefined, false, "0xe577DF94b4Ea94399B7438e27EA1Ba81717464A0") + deadFrom: 1646870400, + fantom: { + tvl: () => ({}), + pool2: () => ({}), + staking: () => ({}), + }, } diff --git a/projects/zombie-network/index.js b/projects/zombie-network/index.js index 1a34a8c9ed..019f19b31c 100644 --- a/projects/zombie-network/index.js +++ b/projects/zombie-network/index.js @@ -1,45 +1,27 @@ const sdk = require("@defillama/sdk"); -const { getChainTransform } = require("../helper/portedTokens"); const BLOOD_TOKEN_ADDR = "0x07709260f6C431bc2CB1480F523F4F7c639a5155"; const FOUNTAIN_ADDR = "0x028c7738353a939E654bBDf5Bd57EbB17755cfa0"; const VAULT_ADDR = "0xD7656b90263f6ceaB35370d37f08fD1aEc19A421"; -const chain = 'klaytn' -let balanceResolve +async function staking(api) { -function getTvlPromise(key) { - return async (ts, _block, chainBlocks) => { - if (!balanceResolve) - balanceResolve = getTvl(ts, _block, chainBlocks) - return (await balanceResolve)[key] - } -} -async function getTvl(timestamp, ethBlock, chainBlocks) { - const block = chainBlocks[chain] - const transform = await getChainTransform(chain); - - const balances = { - staking: {}, - pool2: {}, - tvl: {} - } + const { output: klayBalance } = await sdk.api2.eth.getBalance({ target: FOUNTAIN_ADDR, ...api }) + const [bldBalance, stakingBalance] = await api.multiCall({ abi: 'erc20:balanceOf', calls: [FOUNTAIN_ADDR, VAULT_ADDR], target: BLOOD_TOKEN_ADDR }) - const { output: klayBalance } = await sdk.api.eth.getBalance({ target: FOUNTAIN_ADDR, block, chain}) - const { output: bldBalance } = await sdk.api.erc20.balanceOf({ target: BLOOD_TOKEN_ADDR, owner: FOUNTAIN_ADDR, block, chain}) - const { output: stakingBalance } = await sdk.api.erc20.balanceOf({ target: BLOOD_TOKEN_ADDR, owner: VAULT_ADDR, block, chain}) - - const pool2Balance = klayBalance * 2 / 10 ** 18 const bloodPrice = klayBalance / bldBalance - const staking = stakingBalance * bloodPrice / 10 ** 18 - sdk.util.sumSingleBalance(balances.pool2, 'klay-token', pool2Balance ) - sdk.util.sumSingleBalance(balances.staking, 'klay-token', staking ) + const staking = stakingBalance * bloodPrice / 1e18 + api.addCGToken('klay-token', staking) +} - return balances +async function pool2(api) { + const { output: klayBalance } = await sdk.api2.eth.getBalance({ target: FOUNTAIN_ADDR, ...api }) + const pool2Balance = klayBalance * 2 / 1e18 + api.addCGToken('klay-token', pool2Balance) } module.exports = { - klaytn: - ['tvl', 'staking', 'pool2'] - .reduce((acc, key) => ({ ...acc, [key]: getTvlPromise(key) }), {}), + klaytn: { + tvl: () => ({}), staking, pool2, + } }; diff --git a/projects/zomma/index.js b/projects/zomma/index.js index 2c3ef3a96d..949b4741d2 100644 --- a/projects/zomma/index.js +++ b/projects/zomma/index.js @@ -5,11 +5,25 @@ const ZOMMA_CONTRACT_ALPHA = "0x709051774c60c0527dbaf880f41425eae036efaf"; const ZOMMA_CONTRACT_BETA = "0x7bf1f1c2d8caa200b068747487cb9bf109e529f1"; const ZOMMA_CONTRACT_ETH_AUDIT = "0xdd5ae451a75a654146747235fdb515f06a55d018"; const ZOMMA_CONTRACT_BTC_AUDIT = "0x1f14544aea89046e068e98c8672d2fbc3ab45bab"; -const USDC_CONTRACT = ADDRESSES.era.USDC; +const ZK_USDC_CONTRACT = ADDRESSES.era.USDC; + +const ZOMMA_ARB_VAULT = "0x452610BB258c143B5f26687286AE5e59EC69c267"; +const ZOMMA_ARB_VAULT2 = "0xF55DF159c030b2804269742853079c9FD6B8cf64" +const ZOMMA_ARB_CONTRACT_ETH = "0xa9DEb981b735EC0525c8D4C959267429FdD82347"; +const ZOMMA_ARB_CONTRACT_BTC = "0x275376e25e068c894d0df5cc9a3d1893d94e9f4a"; +const ARB_USDC_CONTRACT = ADDRESSES.arbitrum.USDC_CIRCLE; +const ARB_AAVE_USDC_CONTRACT = "0x724dc807b04555b71ed48a6896b6F41593b8C637"; +const ARB_AAVE_GHO_CONTRACT = "0xeBe517846d0F36eCEd99C735cbF6131e1fEB775D"; module.exports = { methodology: "TVL is calculated as the sum of USDC deposited by traders and the liquidity in the Pools.", + arbitrum: { + tvl: sumTokensExport({ + owners: [ZOMMA_ARB_VAULT, ZOMMA_ARB_VAULT2, ZOMMA_ARB_CONTRACT_ETH, ZOMMA_ARB_CONTRACT_BTC], + tokens: [ARB_USDC_CONTRACT, ARB_AAVE_USDC_CONTRACT, ARB_AAVE_GHO_CONTRACT], + }), + }, era: { tvl: sumTokensExport({ owners: [ @@ -18,7 +32,7 @@ module.exports = { ZOMMA_CONTRACT_ETH_AUDIT, ZOMMA_CONTRACT_BTC_AUDIT, ], - tokens: [USDC_CONTRACT], + tokens: [ZK_USDC_CONTRACT], }), }, }; \ No newline at end of file diff --git a/projects/zootopia-finance/index.js b/projects/zootopia-finance/index.js index 19ae5d2884..56d56b92be 100644 --- a/projects/zootopia-finance/index.js +++ b/projects/zootopia-finance/index.js @@ -1,5 +1,6 @@ const ADDRESSES = require('../helper/coreAssets.json') -const { sumTokens2 } = require('../helper/unwrapLPs') +const { sumTokens2 } = require('../helper/unwrapLPs'); +const { deadFrom } = require('../mosquitos-finance'); // ztp swap address const SWAP_ADDR = "0xCdD4396527b6681775173839002E6af201885CB8"; @@ -18,6 +19,7 @@ module.exports = { hallmarks: [ [1667174400, "Rug Pull"] ], + deadFrom: 1667174400, bsc: { tvl, }, diff --git a/projects/zora/index.js b/projects/zora/index.js new file mode 100644 index 0000000000..14e04e0898 --- /dev/null +++ b/projects/zora/index.js @@ -0,0 +1,15 @@ +const { sumTokens2 } = require("../helper/unwrapLPs"); + +module.exports = { + ethereum: { + tvl: (api) => + sumTokens2({ + api, + owners: [ + "0x3e2Ea9B92B7E48A52296fD261dc26fd995284631", + "0x1a0ad011913A150f69f6A19DF447A0CfD9551054", + ], + fetchCoValentTokens: true, + }), + }, +}; diff --git a/projects/zprotocol-dex/index.js b/projects/zprotocol-dex/index.js new file mode 100644 index 0000000000..6f6cd62b5d --- /dev/null +++ b/projects/zprotocol-dex/index.js @@ -0,0 +1,4 @@ +const { uniTvlExports } = require('../helper/unknownTokens') +module.exports = uniTvlExports({ + 'scroll': '0xED93e976d43AF67Cc05aa9f6Ab3D2234358F0C81' +}) \ No newline at end of file diff --git a/projects/zprotocol-masterchef/index.js b/projects/zprotocol-masterchef/index.js new file mode 100644 index 0000000000..82c3eae486 --- /dev/null +++ b/projects/zprotocol-masterchef/index.js @@ -0,0 +1,28 @@ +// const {zProtocolScrollFarmingExports} = require("./scroll"); +const { staking, } = require('../helper/unknownTokens'); +const { sumTokens2 } = require('../helper/unwrapLPs'); + +const FACTORY = "0xED93e976d43AF67Cc05aa9f6Ab3D2234358F0C81"; +const FARM_MASTER = "0x7a757614fEFA05f40456016Af74262Fe53546DBa"; +const ZP_TOKEN = "0x2147a89fb4608752807216D5070471c09A0DcE32"; +// const export1 = zProtocolScrollFarmingExports(FARM_MASTER, FACTORY, 'scroll', ZP_TOKEN); +const farmAbi = { + poolInfo: "function poolInfo(uint256) view returns (address token, uint256 catId, uint256 allocPoint, uint256 lastRewardTime, uint256 accZPPerShare, uint256 depositFeeBP, uint256 harvestInterval)", +} + +module.exports = { + methodology: "count value of staked tokens except of z-dex LP tokens", + misrepresentedTokens: true, + scroll: { + tvl, + staking: staking({ tokens: [ZP_TOKEN], owner: FARM_MASTER, useDefaultCoreAssets: true, lps: ['0xb74806780Ac59D0d7567bE66Ff23511400bD9cf8']}) + } +} + +async function tvl(api) { + let blacklistedTokens = await api.fetchList({ lengthAbi: 'allPairsLength', itemAbi: 'allPairs', target: FACTORY }) + blacklistedTokens.push(ZP_TOKEN) + const poolInfo = await api.fetchList({ lengthAbi: 'poolsLength', itemAbi: farmAbi.poolInfo, target: FARM_MASTER }) + await sumTokens2({ api, owner: FARM_MASTER, tokens: poolInfo.map(pool => pool.token), resolveLP: true, blacklistedTokens, }) + api.removeTokenBalance(ZP_TOKEN) +} \ No newline at end of file diff --git a/projects/zuit/index.js b/projects/zuit/index.js new file mode 100644 index 0000000000..49f28b4415 --- /dev/null +++ b/projects/zuit/index.js @@ -0,0 +1,32 @@ +const { sumTokens2 } = require('../helper/unwrapLPs') +const { getLogs2 } = require('../helper/cache/getLogs') + +async function tvl(api) { + const { fromBlock, baseFactorys, stableFactorys, oasisFactorys = [] } = config[api.chain] + + let logs = await Promise.all([baseFactorys, stableFactorys, oasisFactorys].flat().map(getFactoryLogs)) + logs = logs.flat() + + const ownerTokens = logs.map(({ token0, token1, pool }) => [[token0, token1], pool]) + return sumTokens2({ api, ownerTokens}) + + async function getFactoryLogs(target) { + return getLogs2({ + api, + target, + fromBlock, + eventAbi: 'event PoolCreated(address indexed token0, address indexed token1, address pool)', + }) + } +} + +const config = { + zircuit: { + fromBlock: 1374699, + baseFactorys: ['0xE4CF807E351b56720B17A59094179e7Ed9dD3727'], + stableFactorys: ['0x40d660504eB163708d8AC8109fc8F2c063ddAE4b'], + oasisFactorys: ['0xE14f6575F4721F404FFB79DA76e4790AD67B960A'] + } +} + +Object.keys(config).forEach(chain => { module.exports[chain] = { tvl } }) \ No newline at end of file diff --git a/test.js b/test.js index 1193a37075..686d68c1fd 100644 --- a/test.js +++ b/test.js @@ -10,7 +10,7 @@ const path = require("path"); require("dotenv").config(); const { ENV_KEYS } = require("./projects/helper/env"); const { util: { - blocks: { getCurrentBlocks }, + blocks: { getBlocks }, humanizeNumber: { humanizeNumber }, } } = require("@defillama/sdk"); const { util } = require("@defillama/sdk"); @@ -27,7 +27,7 @@ const currentCacheVersion = sdk.cache.currentVersion // load env for cache if (process.env.LLAMA_SANITIZE) Object.keys(process.env).forEach((key) => { if (key.endsWith('_RPC')) return; - if (['TVL_LOCAL_CACHE_ROOT_FOLDER', 'LLAMA_DEBUG_MODE', 'GRAPH_API_KEY', ...ENV_KEYS].includes(key) || key.includes('SDK')) return; + if (['TVL_LOCAL_CACHE_ROOT_FOLDER', 'LLAMA_DEBUG_MODE', 'GRAPH_API_KEY', 'LLAMA_DEBUG_LEVEL2', ...ENV_KEYS].includes(key) || key.includes('SDK')) return; delete process.env[key] }) process.env.SKIP_RPC_CHECK = 'true' @@ -103,22 +103,50 @@ sdk.api.abi.call = async (...args) => { } } +function validateHallmarks(hallmark) { + if (!Array.isArray(hallmark)) { + throw new Error("Hallmarks should be an array of [unixTimestamp, eventText] but got " + JSON.stringify(hallmark)) + } + const [timestamp, text] = hallmark + if (typeof timestamp !== 'number' && isNaN(+new Date(timestamp))) { + throw new Error("Hallmark timestamp should be a number/dateString") + } + const year = new Date(timestamp * 1000).getFullYear() + const currentYear = new Date().getFullYear() + if (year < 2010 || year > currentYear) { + throw new Error("Hallmark timestamp should be between 2010 and " + currentYear + " but got " + year) + } + + if (typeof text !== 'string') { + throw new Error("Hallmark text should be a string") + } +} + (async () => { let module = {}; - try { - module = require(passedFile) - } catch (e) { - console.log(e) - } - if(module.hallmarks && module.hallmarks.length > 6){ - console.error("WARNING: Hallmarks should only be set for events that led to a big change in TVL, please reduce hallmarks to only those that meet this condition") + module = require(passedFile) + if (module.hallmarks) { + if (!Array.isArray(module.hallmarks)) { + throw new Error("Hallmarks should be an array of arrays") + } + if (module.hallmarks.length > 6) { + console.error("WARNING: Hallmarks should only be set for events that led to a big change in TVL, please reduce hallmarks to only those that meet this condition") + } + + module.hallmarks.forEach(validateHallmarks) } // await initCache() const chains = Object.keys(module).filter(item => typeof module[item] === 'object' && !Array.isArray(module[item])); checkExportKeys(module, passedFile, chains) - const unixTimestamp = Math.round(Date.now() / 1000) - 60; - // const { chainBlocks } = await getCurrentBlocks([]); // fetch only ethereum block for local test - const chainBlocks = {} + + let unixTimestamp = Math.round(Date.now() / 1000) - 60; + let chainBlocks = {} + const passedTimestamp = process.argv[3] + if (passedTimestamp !== undefined) { + unixTimestamp = Number(passedTimestamp) + const res = await getBlocks(unixTimestamp, chains) + chainBlocks = res.chainBlocks + } const ethBlock = chainBlocks.ethereum; const usdTvls = {}; const tokensBalances = {}; @@ -204,11 +232,16 @@ sdk.api.abi.call = async (...args) => { Object.entries(usdTokenBalances).forEach(([chain, balances]) => { console.log(`--- ${chain} ---`); - Object.entries(balances) - .sort((a, b) => b[1] - a[1]) - .forEach(([symbol, balance]) => { - console.log(symbol.padEnd(25, " "), humanizeNumber(balance)); - }); + let entries = Object.entries(balances) + entries.sort((a, b) => b[1] - a[1]) + + if (entries.length > 30) { + console.log("Showing top 30 tokens, total tokens:", entries.length) + entries = entries.slice(0, 30) + } + entries.forEach(([symbol, balance]) => { + console.log(symbol.padEnd(25, " "), humanizeNumber(balance)); + }); console.log("Total:", humanizeNumber(usdTvls[chain]), "\n"); }); console.log(`------ TVL ------`); @@ -235,6 +268,7 @@ function checkExportKeys(module, filePath, chains) { || (filePath.length === 2 && !(['api.js', 'index.js', 'apiCache.js',].includes(filePath[1]) // matches .../projects/projectXYZ/index.js || ['treasury', 'entities'].includes(filePath[0]) // matches .../projects/treasury/project.js + || /v\d+\.js$/.test(filePath[1]) // matches .../projects/projectXYZ/v1.js ))) process.exit(0) diff --git a/tsconfig.json b/tsconfig.json index 97ad9508cb..682d025ac4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,4 +18,4 @@ "strictNullChecks": false, "typeRoots": ["./typings/", "./node_modules/@types/"] } -} +} \ No newline at end of file diff --git a/utils/formatIdl.js b/utils/formatIdl.js new file mode 100644 index 0000000000..7f799098f3 --- /dev/null +++ b/utils/formatIdl.js @@ -0,0 +1,151 @@ +// const jsonString = require('json-stringify-pretty-compact') +const fs = require('fs') + +const stringOrChar = /("(?:[^\\"]|\\.)*")|[:,]/g; +let idl = require('../projects/test/idl.json') + +idl.instructions = [] +idl.events = [] +idl.errors = [] + +const whitelistedTypes = new Set() +const typeMap = {} +idl.types.forEach(t => typeMap[t.name] = t) +const whitelistedTypeMap = {} +const accountMap = {} +idl.accounts.forEach(a => accountMap[a.name] = a) + +idl.accounts.forEach(checkType) + +function checkType(typeObj) { + let isAccountObjInTypeMap = false + if (whitelistedTypes.has(typeObj.name)) return; + whitelistedTypes.add(typeObj.name) + if (!typeObj.type && accountMap[typeObj.name]) { // it could be account whose type is present in the typeMap + if (typeMap[typeObj.name]) { + typeObj = typeMap[typeObj.name] + isAccountObjInTypeMap = true + } + else return; + } + + if (isAccountObjInTypeMap || !accountMap[typeObj.name]) + whitelistedTypeMap[typeObj.name] = typeObj + + if (typeObj.type.kind !== 'struct') return; + typeObj.type.fields.forEach(f => { + if (typeof f.type === 'object') { + const tName = f.type.defined?.name + if (tName && typeMap[tName]) checkType(typeMap[tName]) + if (f.type.array) + f.type.array.forEach(a => { + if (a.defined && typeMap[a.defined.name]) checkType(typeMap[a.defined.name]) + }) + } + }) +} + +console.log(JSON.stringify({whitelistedTypeMap: Object.keys(whitelistedTypeMap), accountMap: Object.keys(accountMap), whitelistedTypes: Array.from(whitelistedTypes)}, null, 2)) +idl.types = Object.values(whitelistedTypeMap) + + + + +const res = stringify(idl, { maxLength: 153 }) +fs.writeFileSync(__dirname + '/../projects/test/idl.json', res) + + +// from json-stringify-pretty-compact + +function stringify(passedObj, options = {}) { + const indent = JSON.stringify( + [1], + undefined, + options.indent === undefined ? 2 : options.indent + ).slice(2, -3); + + const maxLength = + indent === "" + ? Infinity + : options.maxLength === undefined + ? 80 + : options.maxLength; + + let { replacer } = options; + + return (function _stringify(obj, currentIndent, reserved) { + if (obj && typeof obj.toJSON === "function") { + obj = obj.toJSON(); + } + + const string = JSON.stringify(obj, replacer); + + if (string === undefined) { + return string; + } + + const length = maxLength - currentIndent.length - reserved; + + if (string.length <= length) { + const prettified = string.replace( + stringOrChar, + (match, stringLiteral) => { + return stringLiteral || `${match} `; + } + ); + if (prettified.length <= length) { + return prettified; + } + } + + if (replacer != null) { + obj = JSON.parse(string); + replacer = undefined; + } + + if (typeof obj === "object" && obj !== null) { + const nextIndent = currentIndent + indent; + const items = []; + let index = 0; + let start; + let end; + + if (Array.isArray(obj)) { + start = "["; + end = "]"; + const { length } = obj; + for (; index < length; index++) { + items.push( + _stringify(obj[index], nextIndent, index === length - 1 ? 0 : 1) || + "null" + ); + } + } else { + start = "{"; + end = "}"; + const keys = Object.keys(obj); + const { length } = keys; + for (; index < length; index++) { + const key = keys[index]; + const keyPart = `${JSON.stringify(key)}: `; + const value = _stringify( + obj[key], + nextIndent, + keyPart.length + (index === length - 1 ? 0 : 1) + ); + if (value !== undefined) { + items.push(keyPart + value); + } + } + } + + if (items.length > 0) { + return [start, indent + items.join(`,\n${nextIndent}`), end].join( + `\n${currentIndent}` + ); + } + } + + return string; + })(passedObj, "", 0); +} diff --git a/utils/handleError.js b/utils/handleError.js index 049f9b2cd9..e360dc9dc7 100644 --- a/utils/handleError.js +++ b/utils/handleError.js @@ -22,7 +22,7 @@ function getStackMessage(stack) { if (!stack) return [] if (/ at (checkExportKeys)/.test(stack)) return [] - const isNodeMolule = m => /node_modules/.test(m) + const isNodeMolule = m => /node_modules/.test(m) && !/defillama/.test(m) const isNotLoggerMessage = m => !/log/.test(m) const isNotInternalMessage = m => !/node:internal/.test(m) diff --git a/utils/scripts/checkBTCDups.js b/utils/scripts/checkBTCDups.js new file mode 100644 index 0000000000..45e7d49dd9 --- /dev/null +++ b/utils/scripts/checkBTCDups.js @@ -0,0 +1,83 @@ +const fs = require('fs'); +const path = require('path'); + +// Regular expression to match Bitcoin addresses +// const btcAddressRegex = /\b(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,39}\b/g; + + +// Regular expression to match alphanumeric strings between single or double quotes +const addressRegex = /['"]([a-zA-Z0-9]{25,99})['"]/g; + +// Function to read all files in a directory recursively +const readFilesInDirectory = (dir) => { + let files = []; + const items = fs.readdirSync(dir); + for (const item of items) { + const fullPath = path.join(dir, item); + if (fs.statSync(fullPath).isDirectory()) { + files = files.concat(readFilesInDirectory(fullPath)); + } else { + files.push(fullPath); + } + } + return files; +}; + +// Function to extract Bitcoin addresses from a file +const extractBtcAddresses = (filePath) => { + let content = fs.readFileSync(filePath, 'utf8'); + if (['solana', 'tezos'].some(i => content.includes(i)) && !content.includes('bitcoin')) return [] + content = content.replaceAll('modifyEndpoint("', '') + content = content.replaceAll('modifyEndpoint(\'', '') + return content.match(addressRegex) || []; +}; + +// Function to find duplicates between files +const findDuplicates = (folderPath) => { + console.log(folderPath) + const files = readFilesInDirectory(folderPath+'/'); + const addressMap = new Map(); + + for (let file of files) { + const addresses = extractBtcAddresses(file); + file = file.replace(folderPath, '') + for (let address of addresses) { + address = address.replace(/'/g, '').replace(/"/g, '') + if (address.startsWith('0x') || !/\d/.test(address)) continue; + if (addressMap.has(address)) { + const arry = addressMap.get(address) + if (!arry.includes(file)) + arry.push(file); + } else { + addressMap.set(address, [file]); + } + } + } + + // Find duplicates + const duplicates = []; + for (const [address, fileList] of addressMap.entries()) { + if (fileList.length > 1) { + duplicates.push({ address, files: fileList }); + } + } + + return duplicates; +}; + +// Main function +const main = (folderPath) => { + const duplicates = findDuplicates(folderPath); + if (duplicates.length > 0) { + console.log('Duplicate Bitcoin addresses found:'); + for (const { address, files } of duplicates) { + console.log(`Address: ${address}`); + console.log(`Files: ${files.join(', ')}`); + console.log('---'); + } + } else { + console.log('No duplicate Bitcoin addresses found.'); + } +}; + +main(path.join(__dirname, '../../projects')); \ No newline at end of file diff --git a/utils/scripts/checkBTCDupsv2.js b/utils/scripts/checkBTCDupsv2.js new file mode 100644 index 0000000000..2dcec07b6a --- /dev/null +++ b/utils/scripts/checkBTCDupsv2.js @@ -0,0 +1,30 @@ +const addressBook = require('../../projects/helper/bitcoin-book/index'); + +console.log('project count: ', Object.keys(addressBook).length); +const addressProjectMap = {} + +async function run() { + + await Promise.all(Object.keys(addressBook).map(async project => { + let addresses = addressBook[project]; + if (!Array.isArray(addresses)) addresses = await addresses() + for (let address of addresses) { + if (addressProjectMap[address]) { + addressProjectMap[address].push(project); + } else { + addressProjectMap[address] = [project]; + } + } + })) + + const duplicates = {} + for (const [address, projects] of Object.entries(addressProjectMap)) { + if (projects.length > 1) { + duplicates[address] = projects.join(', '); + } + } + + console.table(Object.entries(duplicates)); +} + +run().catch(console.error).then(() => process.exit(0)); \ No newline at end of file diff --git a/utils/scripts/checkFixTokensPriced.js b/utils/scripts/checkFixTokensPriced.js new file mode 100644 index 0000000000..da8b955b90 --- /dev/null +++ b/utils/scripts/checkFixTokensPriced.js @@ -0,0 +1,34 @@ +const { fixBalancesTokens } = require("../../projects/helper/tokenMapping") +const axios = require('axios') + + +async function run() { + let allTokens = [] + const tokensMissingPrice = [] + const tokensWithPrice = [] + const tokenSet = new Set() + Object.entries(fixBalancesTokens).forEach(([chain, tokens]) => { + Object.keys(tokens).forEach(token => { + const key = chain+':'+token + if (!tokenSet.has(key.toLowerCase())) { // ignore duplicates + tokenSet.add(key.toLowerCase()) + allTokens.push(key) + } + }) + }) + const burl = 'https://coins.llama.fi/prices/current/'+allTokens.join(',') + const prices = (await axios.get(burl)).data.coins + + allTokens.forEach(token => { + if (!prices[token]) { + tokensMissingPrice.push(token) + } else { + tokensWithPrice.push(token) + } + }) + + console.log('Tokens with price:', tokensWithPrice, tokensWithPrice.length) + console.log('Tokens missing price:', tokensMissingPrice, tokensMissingPrice.length) +} + +run().catch(console.error).then(() => process.exit(0)) \ No newline at end of file diff --git a/utils/scripts/checkTonDupes.js b/utils/scripts/checkTonDupes.js new file mode 100644 index 0000000000..80652ac35a --- /dev/null +++ b/utils/scripts/checkTonDupes.js @@ -0,0 +1,37 @@ +const { get } = require("../../projects/helper/http"); + +const addressBook = { + bigpump: 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=bigpump', + blum: 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=blum', + wagmi: 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=wagmi', + tonpump: 'https://tonfunstats-eqnd7.ondigitalocean.app/api/v1/getServiceTokens?service=hot', +} + +console.log('project count: ', Object.keys(addressBook).length); +const addressProjectMap = {} + +async function run() { + + await Promise.all(Object.keys(addressBook).map(async project => { + let addresses = await get(addressBook[project]); + for (let address of addresses) { + if (addressProjectMap[address]) { + addressProjectMap[address].push(project); + } else { + addressProjectMap[address] = [project]; + } + } + })) + + const duplicates = {} + for (const [address, projects] of Object.entries(addressProjectMap)) { + if (projects.length > 1) { + duplicates[address] = projects.join(', '); + } + } + + console.log('Ton meme duplicates count: ', Object.keys(duplicates).length); + console.table(Object.entries(duplicates)); +} + +run().catch(console.error).then(() => process.exit(0)); \ No newline at end of file diff --git a/utils/scripts/coingeckoApi.js b/utils/scripts/coingeckoApi.js index c91a9360bb..eead4b226d 100644 --- a/utils/scripts/coingeckoApi.js +++ b/utils/scripts/coingeckoApi.js @@ -14,7 +14,6 @@ const ONE_WEEK = 7 * ONE_DAY run() - function writeToCache() { fs.writeFileSync(cacheFile, JSON.stringify(geckoCache)) } diff --git a/utils/scripts/stringTimestamp.js b/utils/scripts/stringTimestamp.js new file mode 100644 index 0000000000..41708cffb2 --- /dev/null +++ b/utils/scripts/stringTimestamp.js @@ -0,0 +1,96 @@ +const fs = require('fs'); +const path = require('path'); + +// Function to convert Unix timestamp to 'YYYY-MM-DD' format +function convertTimestamp(unixTimestamp) { + const date = new Date(unixTimestamp * 1000); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +// Function to process files in the given directory +function processFiles(dir) { + if (['node_modules', 'raindex', 'helper', 'exactly'].some(name => dir.includes(name))) { + return; + } + fs.readdir(dir, (err, files) => { + if (err) { + console.error(`Error reading directory ${dir}:`, err); + return; + } + + files.forEach(file => { + const filePath = path.join(dir, file); + fs.stat(filePath, (err, stats) => { + if (err) { + console.error(`Error stating file ${filePath}:`, err); + return; + } + + if (stats.isFile()) { + fs.readFile(filePath, 'utf8', (err, data) => { + if (err) { + console.error(`Error reading file ${filePath}:`, err); + return; + } + + const regex = /start:\s*(\d+)/g; + const newData = data.replace(regex, (match, p1) => { + if (!/^\d{10}$/.test(p1)) { + console.error(`Invalid Unix timestamp ${p1} in file ${filePath}`); + return match; + } + + const year = new Date(parseInt(p1, 10) * 1000).getFullYear(); + if (year < 2005 || year > 2055) { + console.error(`Year ${year} out of range for timestamp ${p1} in file ${filePath}`); + return match; + } + const newTimestamp = convertTimestamp(parseInt(p1, 10)); + return `start: '${newTimestamp}'`; + }); + + if (newData !== data) { + fs.writeFile(filePath, newData, 'utf8', err => { + if (err) { + console.error(`Error writing file ${filePath}:`, err); + } else { + console.log(`Updated file ${filePath}`); + } + }); + } + }); + } else if (stats.isDirectory()) { + processFiles(filePath); + } + }); + }); + }); +} + +// Get the directory two levels up +const baseDir = path.resolve(__dirname, '../../projects'); + +// Process all directories two levels up +fs.readdir(baseDir, (err, dirs) => { + if (err) { + console.error(`Error reading base directory ${baseDir}:`, err); + return; + } + + dirs.forEach(dir => { + const dirPath = path.join(baseDir, dir); + fs.stat(dirPath, (err, stats) => { + if (err) { + console.error(`Error stating directory ${dirPath}:`, err); + return; + } + + if (stats.isDirectory()) { + processFiles(dirPath); + } + }); + }); +}); \ No newline at end of file diff --git a/utils/scripts/useTokenLabels.js b/utils/scripts/useTokenLabels.js index 36a8730639..096f99530e 100644 --- a/utils/scripts/useTokenLabels.js +++ b/utils/scripts/useTokenLabels.js @@ -28,7 +28,11 @@ function run() { run() +const ignoredFolders = ['symbiosis-finance', 'node_modules'] +const blacklistedAddresses = new Set(['XRP']) + function updateFile(file) { + if (ignoredFolders.some(s => file.includes(s))) return; let relativePath = path.relative(file + '/..', allLabelsFile) if (relativePath.startsWith('coreAssets')) relativePath = './' + relativePath const requireStr = `const ADDRESSES = require('${relativePath}')\n` @@ -39,10 +43,10 @@ function updateFile(file) { Object.entries(allLabels).forEach(([chain, mapping]) => { const label = ['ADDRESSES', chain] if (chain === 'null') { - updateFileStr([...label].join('.'), mapping, file) + updateFileStr([...label].join('.'), mapping) } else { Object.entries(mapping).forEach(([symbol, addr]) => { - updateFileStr([...label, symbol].join('.'), addr, file) + updateFileStr([...label, symbol].join('.'), addr) }) } }) @@ -50,7 +54,9 @@ function updateFile(file) { fileStr = requireStr + fileStr fs.writeFileSync(file, fileStr, { encoding: 'utf-8' }) - function updateFileStr(label, address, file) { + + function updateFileStr(label, address) { + if (blacklistedAddresses.has(address)) return; if (!address || !address.length) return; if (!updateFile) { updateFile = (new RegExp(address, 'i')).test(fileStr)