Files
2025-05-21 11:10:13 +02:00

97 lines
3.7 KiB
JavaScript

const { sumTokens2 } = require("../helper/unwrapLPs")
const { getUserMasterChefBalances } = require("../helper/masterchef")
const { getUserCraftsmanV2Balances, getUserCamelotMasterBalances } = require("./helpers")
const vvsPoolInfoABI = 'function poolInfo(uint256) view returns (address lpToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accVVSPerShare)'
const spookyMasterChefV2PoolInfoABI = 'function lpToken(uint256) view returns (address)'
const { getConfig } = require('../helper/cache')
const BASE_API_URL = 'https://api.singlefinance.io'
const constants = {
'cronos': {
chainId: 25,
single: '0x0804702a4e749d39a35fde73d1df0b1f1d6b8347'
},
'fantom': {
chainId: 250,
single: '0x8cc97b50fe87f31770bcdcd6bc8603bc1558380b'
},
'arbitrum': {
chainId: 42161,
single: '0x55853edc67aa68ec2e3903ac00f2bc5bf2ca8db0'
}
}
const getWMasterChefBalances = ({ masterChef: masterChefAddress, wMasterChef, name, ...rest }, args) => {
const commonParams = { masterChefAddress, userAddres: wMasterChef }
if (name === "vvsMultiYield") {
return getUserCraftsmanV2Balances({ ...commonParams, poolInfoABI: vvsPoolInfoABI, craftsmanV1: rest.craftsmanV1, ...args })
}
if (name === "spookyMultiYield" || name === "sushi") {
return getUserMasterChefBalances({ ...commonParams, poolInfoABI: spookyMasterChefV2PoolInfoABI, getLPAddress: a => a, ...args, chain: args.api.chain, block: args.api.block, balances: args.api.getBalances() })
}
if (name === "camelot") {
return getUserCamelotMasterBalances({ ...commonParams, ...args })
}
return getUserMasterChefBalances({ ...commonParams, poolInfoABI: vvsPoolInfoABI, ...args, chain: args.api.chain, block: args.api.block, balances: args.api.getBalances() })
}
const getHelpers = (chain) => {
const SINGLE_TOKEN = constants[chain].single;
const _getConfig = () => getConfig('single/contracts/'+chain, `${BASE_API_URL}/api/protocol/contracts?chainid=${constants[chain].chainId}`)
async function staking(api) {
const { pools, } = await _getConfig()
const tokensAndOwners = pools.filter(pool => !pool.isLP).map(pool => [pool.tokenContract, pool.address])
return sumTokens2({ tokensAndOwners, api })
}
async function tvl(api) {
const { wmasterchefs, vaults, } = await _getConfig()
for (const wMasterChef of wmasterchefs) {
await getWMasterChefBalances(wMasterChef, { api, excludePool2: true, pool2Tokens: [SINGLE_TOKEN] })
}
const tokensAndOwners = vaults.map(({ token, address }) => [token, address])
await sumTokens2({ api, tokensAndOwners, }) // Add lending pool tokens to balances
}
async function pool2(api) {
const { wmasterchefs, pools } = await _getConfig()
const tokensAndOwners = pools.filter(pool => pool.isLP).map(pool => [pool.tokenContract, pool.address])
await sumTokens2({ api, tokensAndOwners, resolveLP: true }) // Add staked lp tokens to balances
for (const wMasterChef of wmasterchefs) {
await getWMasterChefBalances(wMasterChef, { api, onlyPool2: true, pool2Tokens: [SINGLE_TOKEN] })
}
}
return {
tvl,
pool2,
staking
}
}
module.exports = {
start: '2022-01-26',
misrepresentedTokens: true,
cronos: getHelpers('cronos'),
fantom: getHelpers('fantom'),
arbitrum: getHelpers('arbitrum'),
}
/* async function cronosTvl(api) {
const { data } = await getConfig('single/vault/cronos', 'https://api.singlefinance.io/api/vaults?chainid=25')
const tokensAndOwners = data.map(({ token, address }) => [token.id, address])
await api.sumTokens({ tokensAndOwners})
const { data: strategies } = await getConfig('single/strategy/cronos','https://api.singlefinance.io/api/strategies?chainid=25')
const tether = strategies.reduce((a, i)=> a+i.tvl/1e18, 0)
api.addUSDValue(tether)
}
*/