diff --git a/src/adaptors/factor-v2/index.js b/src/adaptors/factor-v2/index.js new file mode 100644 index 0000000000..25a223f7ea --- /dev/null +++ b/src/adaptors/factor-v2/index.js @@ -0,0 +1,39 @@ +const vaults = require('./vaults'); +const { getTvl, getApr } = require('./shared'); + +async function getSingleYieldVaultAPY() { + const poolData = await Promise.all( + vaults.map(async (vault) => { + const project = 'factor-v2'; + const chain = 'arbitrum'; + const pool = `${vault.poolAddress}-${chain}`.toLowerCase(); + const url = `https://app.factor.fi/vault/${vault.poolAddress}`; + const symbol = vault.symbol; + + const [tvlUsd, apyBase] = await Promise.all([ + getTvl(vault.poolAddress, vault.underlyingToken, vault.strategy), + getApr(vault.poolAddress, vault.underlyingToken, vault.strategy), + ]); + + const data = { + pool, + chain, + project, + symbol, + tvlUsd, + apyBase, + underlyingTokens: [vault.underlyingToken], + url, + }; + + return data; + }) + ); + + return poolData; +} + +module.exports = { + timetravel: false, + apy: getSingleYieldVaultAPY, +}; diff --git a/src/adaptors/factor-v2/shared.js b/src/adaptors/factor-v2/shared.js new file mode 100644 index 0000000000..841eb4bb11 --- /dev/null +++ b/src/adaptors/factor-v2/shared.js @@ -0,0 +1,101 @@ +const sdk = require('@defillama/sdk3'); +const utils = require('../utils'); + +const { + getMuxLpApr, + getGlpApr, + getVlpApr, + getLodestarApr, + getLodestarTokenPriceInUSD, + getPendleApr, + getSJoeApr, + getSiloApr, + getTenderApr, + getOliveApr, + getPxGMXApr, + getPenpieApr +} = require('./strategy-adapter'); +const { getCoinDataFromDefillamaAPI } = require('./strategy-adapter/utils'); + +async function getApr(poolAddress, underlyingTokenAddress, strategy) { + let apr = 0; + switch (strategy) { + case 'GLPStrategy': + apr = await getGlpApr(); + break; + case 'MuxStrategy': + apr = await getMuxLpApr(); + break; + case 'VelaStrategy': + apr = await getVlpApr(); + break; + case 'LodestarStrategy': + apr = await getLodestarApr(underlyingTokenAddress); + break; + case 'PenpieStrategy': + apr = await getPenpieApr(underlyingTokenAddress); + break; + case 'PendleStrategy': + apr = await getPendleApr(underlyingTokenAddress); + break; + case 'TraderJoeStrategy': + apr = await getSJoeApr(underlyingTokenAddress); + break; + case 'SiloStrategy': + apr = await getSiloApr(underlyingTokenAddress); + break; + case 'TenderStrategy': + apr = await getTenderApr(underlyingTokenAddress); + break; + case 'OliveStrategy': + apr = await getOliveApr(); + break; + case 'RedactedStrategy': + apr = await getPxGMXApr(); + break; + default: + apr = 0; + } + + const harvestCountPerDay = 3; + const apyBase = utils.aprToApy(apr, harvestCountPerDay * 365); + + return apyBase; +} + +async function getTvl(poolAddress, underlyingTokenAddress, strategy) { + let underlyingTokenPrice = 0; + + if (strategy == 'LodestarStrategy') { + underlyingTokenPrice = await getLodestarTokenPriceInUSD( + underlyingTokenAddress + ); + } else if (strategy == "RedactedStrategy") { + const gmxCoin = await getCoinDataFromDefillamaAPI('arbitrum','0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a') + underlyingTokenPrice = gmxCoin.price; + } else { + underlyingTokenPrice = ( + await utils.getPrices([underlyingTokenAddress], 'arbitrum') + ).pricesByAddress[underlyingTokenAddress.toLowerCase()]; + } + + const [{ output: assetBalance }, { output: assetDecimals }] = + await Promise.all([ + sdk.api.abi.call({ + target: poolAddress, + abi: 'uint256:assetBalance', + chain: 'arbitrum', + }), + sdk.api.abi.call({ + target: underlyingTokenAddress, + abi: 'erc20:decimals', + chain: 'arbitrum', + }), + ]); + + const tvlUsd = (assetBalance / 10 ** assetDecimals) * underlyingTokenPrice; + + return tvlUsd; +} + +module.exports = { getTvl, getApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/glp-adapter.js b/src/adaptors/factor-v2/strategy-adapter/glp-adapter.js new file mode 100644 index 0000000000..3a950aacae --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/glp-adapter.js @@ -0,0 +1,16 @@ +const { getDefiLLamaPools } = require('./utils'); + +/*////////////////////////////////////////////////////////////////////////////// + GLP APR +//////////////////////////////////////////////////////////////////////////////*/ + +async function getGlpApr() { + const pool = await getDefiLLamaPools( + '825688c0-c694-4a6b-8497-177e425b7348' + ); + const apr = pool.apyBase + pool.apyReward; + + return apr; +} + +module.exports = { getGlpApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/index.js b/src/adaptors/factor-v2/strategy-adapter/index.js new file mode 100644 index 0000000000..f8cd5e36d3 --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/index.js @@ -0,0 +1,13 @@ +module.exports = { + ...require('./lodestar-adapter'), + ...require('./mux-adapter'), + ...require('./glp-adapter'), + ...require('./vela-adapter'), + ...require('./pendle-adapter'), + ...require('./sjoe-adapter'), + ...require('./silo-adapter'), + ...require('./tender-adapter'), + ...require('./olive-adapter'), + ...require('./redacted-adapter'), + ...require('./penpie-adapter'), +}; diff --git a/src/adaptors/factor-v2/strategy-adapter/lodestar-adapter.js b/src/adaptors/factor-v2/strategy-adapter/lodestar-adapter.js new file mode 100644 index 0000000000..adbd7e663d --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/lodestar-adapter.js @@ -0,0 +1,59 @@ +const sdk = require('@defillama/sdk3'); +const utils = require('../../utils'); +const { makeReadable } = require('./utils'); + +async function getSupplyRatePerBlock(assetAddress) { + const { output } = await sdk.api.abi.call({ + target: assetAddress, + abi: 'uint256:supplyRatePerBlock', + chain: 'arbitrum', + }); + return { + supplyRatePerBlock: makeReadable(output), + }; +} + +async function getLodestarApr(assetAddress) { + const { supplyRatePerBlock } = await getSupplyRatePerBlock(assetAddress); + const blocksPerYear = 7200 * 365; + const apr = (1 + supplyRatePerBlock) ** blocksPerYear - 1; + return apr * 100; +} + +async function getExchangeRateStored(assetAddress) { + const { output } = await sdk.api.abi.call({ + target: assetAddress, + abi: 'uint256:exchangeRateStored', + chain: 'arbitrum', + }); + return { + exchangeRateStored: makeReadable(output, 16), + }; +} + +async function getLodestarUnderlyingTokenPriceInUSD(lToken) { + const { output: underlyingTokenAddress } = await sdk.api.abi.call({ + target: lToken, + abi: 'address:underlying', + chain: 'arbitrum', + }); + const underlyingLodestarTokenPriceInUSD = ( + await utils.getPrices([underlyingTokenAddress], 'arbitrum') + ).pricesByAddress[underlyingTokenAddress.toLowerCase()]; + + return { underlyingLodestarTokenPriceInUSD }; +} + +async function getLodestarTokenPriceInUSD(lToken) { + const [{ exchangeRateStored }, { underlyingLodestarTokenPriceInUSD }] = + await Promise.all([ + getExchangeRateStored(lToken), + getLodestarUnderlyingTokenPriceInUSD(lToken), + ]); + + const lTokenPriceInUSD = + underlyingLodestarTokenPriceInUSD * exchangeRateStored; + return lTokenPriceInUSD; +} + +module.exports = { getLodestarApr, getLodestarTokenPriceInUSD }; diff --git a/src/adaptors/factor-v2/strategy-adapter/mux-adapter.js b/src/adaptors/factor-v2/strategy-adapter/mux-adapter.js new file mode 100644 index 0000000000..abd86469ed --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/mux-adapter.js @@ -0,0 +1,108 @@ +const sdk = require('@defillama/sdk3'); +const utils = require('../../utils'); +const { makeReadable } = require('./utils'); + +/*////////////////////////////////////////////////////////////////////////////// + Mux Reward Router +//////////////////////////////////////////////////////////////////////////////*/ + +async function getDataFromRewardRouter() { + const REWARD_ROUTER_ADDRESS = '0xaf9C4F6A0ceB02d4217Ff73f3C95BbC8c7320ceE'; + + const rewardRouterABIs = [ + 'uint256:feeRewardRate', + 'uint256:muxRewardRate', + 'uint256:poolOwnedRate', + 'uint256:votingEscrowedRate', + ]; + + const [feeRewardRate, muxRewardRate, poolOwnedRate, votingEscrowedRate] = + await Promise.all( + rewardRouterABIs.map(async (abi) => { + const { output } = await sdk.api.abi.call({ + target: REWARD_ROUTER_ADDRESS, + abi: abi, + chain: 'arbitrum', + }); + return output; + }) + ); + return { + feeRewardRate: makeReadable(feeRewardRate), + muxRewardRate: makeReadable(muxRewardRate), + poolOwnedRate: makeReadable(poolOwnedRate), + votingEscrowedRate: makeReadable(votingEscrowedRate), + }; +} + +/*////////////////////////////////////////////////////////////////////////////// + Mux Pool Owned Liquidity +//////////////////////////////////////////////////////////////////////////////*/ + +async function getDataFromPOL() { + const MLP_ADDRESS = '0x7CbaF5a14D953fF896E5B3312031515c858737C8'; + const POL_ADDRESS = '0x18891480b9dd2aC5eF03220C45713d780b5CFdeF'; + + const { output: mlpPolBalance } = await sdk.api.abi.call({ + target: MLP_ADDRESS, + abi: 'erc20:balanceOf', + params: [POL_ADDRESS], + chain: 'arbitrum', + }); + + return { + mlpPolBalance: makeReadable(mlpPolBalance), + }; +} + +/*////////////////////////////////////////////////////////////////////////////// + Token Prices +//////////////////////////////////////////////////////////////////////////////*/ + +async function getTokenPrices() { + const tokenAddresses = [ + '0x7CbaF5a14D953fF896E5B3312031515c858737C8', // MuxLP + '0x4e352cf164e64adcbad318c3a1e222e9eba4ce42', // MCB + '0x82af49447d8a07e3bd95bd0d56f35241523fbab1', // WETH + ]; + + const tokenPrices = await utils.getPrices(tokenAddresses, 'arbitrum'); + + const mlpPrice = tokenPrices.pricesByAddress[tokenAddresses[0].toLowerCase()]; + const mcbPrice = tokenPrices.pricesByAddress[tokenAddresses[1].toLowerCase()]; + const ethPrice = tokenPrices.pricesByAddress[tokenAddresses[2].toLowerCase()]; + + return { mlpPrice, mcbPrice, ethPrice }; +} + +/*////////////////////////////////////////////////////////////////////////////// + Mux LP APR +//////////////////////////////////////////////////////////////////////////////*/ + +async function getMuxLpApr() { + const [ + { mlpPolBalance }, + { feeRewardRate, muxRewardRate, poolOwnedRate, votingEscrowedRate }, + { mlpPrice, mcbPrice, ethPrice }, + ] = await Promise.all([ + getDataFromPOL(), + getDataFromRewardRouter(), + getTokenPrices(), + ]); + + const mlpCirculatingSupply = mlpPolBalance / poolOwnedRate; + + const muxAPR = + (muxRewardRate * mcbPrice * 86400 * 365 * (1 - votingEscrowedRate)) / + (mlpCirculatingSupply * mlpPrice); + + const ethAPR = + (feeRewardRate * ethPrice * 86400 * 365 * 0.7) / + (mlpCirculatingSupply * mlpPrice); + + const totalAPR = (muxAPR + ethAPR) * 100; + + return totalAPR; +} + +module.exports = { getMuxLpApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/olive-adapter.js b/src/adaptors/factor-v2/strategy-adapter/olive-adapter.js new file mode 100644 index 0000000000..6fee17b3f8 --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/olive-adapter.js @@ -0,0 +1,22 @@ +const { getDefiLLamaPools } = require('./utils'); + +async function getOliveApr() { + const pool = await getDefiLLamaPools( + '79587734-a461-4f4c-b9e2-c85c70484cf8' + ); + + const beefyApr = + pool.apyBase + (isNaN(pool.apyReward) ? 0 : pool.apyReward); + + const ampFactor = 1.33; + const weeksPerYear = 365 / 7; + const oliveBoost = 0.05; + const apr = + (1 + (beefyApr * ampFactor) / weeksPerYear) ** weeksPerYear - + 1 + + oliveBoost; + + return apr * 100; +} + +module.exports = { getOliveApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/pendle-adapter.js b/src/adaptors/factor-v2/strategy-adapter/pendle-adapter.js new file mode 100644 index 0000000000..5356a1b30f --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/pendle-adapter.js @@ -0,0 +1,23 @@ +const { getDefiLLamaPools } = require('./utils'); + +async function getPendleApr(poolAddress) { + const poolAddressToIdMap = { + // wstETH + '0x08a152834de126d2ef83d612ff36e4523fd0017f': + 'f05aa688-f627-4438-89c6-2fef135510c7', + + // rETH + '0x14fbc760efaf36781cb0eb3cb255ad976117b9bd': + '35fe5f76-3b7d-42c8-9e54-3da70fbcb3a9', + }; + + const pool = await getDefiLLamaPools( + poolAddressToIdMap[poolAddress.toLowerCase()] + ); + + const apr = pool.apyBase + pool.apyReward; + + return apr; +} + +module.exports = { getPendleApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/penpie-adapter.js b/src/adaptors/factor-v2/strategy-adapter/penpie-adapter.js new file mode 100644 index 0000000000..93ce3cf783 --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/penpie-adapter.js @@ -0,0 +1,45 @@ +const sdk = require('@defillama/sdk3'); +const { getAprFromDefillamaPool, makeReadable } = require('./utils'); +const utils = require('../../utils'); +const { default: axios } = require('axios'); + +const MASTER_PENPIE_ADDRESS = '0x0776C06907CE6Ff3d9Dbf84bA9B3422d7225942D'; +const PNP_ADDRESS = '0x2Ac2B254Bc18cD4999f64773a966E4f4869c34Ee'; + +async function getPenpieApr(underlyingTokenAddress) { + const tokenPrices = await utils.getPrices( + [PNP_ADDRESS, underlyingTokenAddress], + 'arbitrum' + ); + + const pnpPriceInUSD = tokenPrices.pricesByAddress[PNP_ADDRESS.toLowerCase()]; + const poolPriceInUSD = tokenPrices.pricesByAddress[underlyingTokenAddress.toLowerCase()]; + + const { output } = await sdk.api.abi.call({ + target: MASTER_PENPIE_ADDRESS, + abi: 'function getPoolInfo(address) public view returns (uint256,uint256,uint256,uint256)', + params: [underlyingTokenAddress], + chain: 'arbitrum', + }); + + const secondsPerYear = 31536000; + const totalStaked = makeReadable(output[2]); + const emissionPerSecondsInPNP = makeReadable(output[0]); + const emissionPerYearInPNP = emissionPerSecondsInPNP * secondsPerYear; + const emissionPerYearInUSD = emissionPerYearInPNP * pnpPriceInUSD; + + const tvlInUSD = totalStaked * poolPriceInUSD; + + const response = await axios.get( + `https://api-v2.pendle.finance/core/v1/42161/markets/${underlyingTokenAddress}` + ); + + const apr = + (emissionPerYearInUSD * 100) / tvlInUSD + + response.data.maxBoostedApy * 100 * 0.83 + + response.data.swapFeeApy; + + return apr; +} + +module.exports = { getPenpieApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/redacted-adapter.js b/src/adaptors/factor-v2/strategy-adapter/redacted-adapter.js new file mode 100644 index 0000000000..516a072719 --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/redacted-adapter.js @@ -0,0 +1,14 @@ +const { default: axios } = require('axios'); + +async function getPxGMXApr() { + const response = await axios.get( + 'https://pirex.io/_next/data/33VnMjJ28usC4n5WCEd0z/vaults.json', + + ); + const apr = parseFloat(response.data.pageProps.apy.pxGMX); + + return apr; +} + +module.exports = { getPxGMXApr }; + diff --git a/src/adaptors/factor-v2/strategy-adapter/silo-adapter.js b/src/adaptors/factor-v2/strategy-adapter/silo-adapter.js new file mode 100644 index 0000000000..dd33944153 --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/silo-adapter.js @@ -0,0 +1,48 @@ +const sdk = require('@defillama/sdk3'); +const { request, gql } = require('graphql-request'); + +async function getSiloAddress(underlyingTokenAddress) { + const [{ output: underlyingSiloAddress }, { output: siloAddress }] = + await Promise.all([ + sdk.api.abi.call({ + target: underlyingTokenAddress, + abi: 'address:asset', + chain: 'arbitrum', + }), + sdk.api.abi.call({ + target: underlyingTokenAddress, + abi: 'address:silo', + chain: 'arbitrum', + }), + ]); + + return { underlyingSiloAddress, siloAddress }; +} + +async function getSiloApr(underlyingTokenAddress) { + const { siloAddress, underlyingSiloAddress } = await getSiloAddress( + underlyingTokenAddress + ); + + const subgraphQuery = gql` + query GetInterestRate($interestRateId: String!) { + interestRate(id: $interestRateId) { + rate + } + } + `; + + const response = await request( + 'https://api.thegraph.com/subgraphs/name/siros-ena/silo-finance-arbitrum-alt', + subgraphQuery, + { + interestRateId: `LENDER-VARIABLE-${siloAddress.toLowerCase()}-${underlyingSiloAddress.toLowerCase()}`, + } + ); + + const apr = parseFloat(response.interestRate.rate); + + return apr; +} + +module.exports = { getSiloApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/sjoe-adapter.js b/src/adaptors/factor-v2/strategy-adapter/sjoe-adapter.js new file mode 100644 index 0000000000..f014c0d46c --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/sjoe-adapter.js @@ -0,0 +1,59 @@ +const sdk = require('@defillama/sdk3'); +const { request, gql } = require('graphql-request'); +const { getCoinDataFromDefillamaAPI, getCurrentTimestamp } = require('./utils'); + +async function getMonthlyReward() { + const query = gql` + query feeBankDayDatasQuery($first: Int! = 100, $dateAfter: Int!) { + dayDatas( + first: $first + orderBy: date + orderDirection: desc + where: { date_gte: $dateAfter } + ) { + id + date + usdRemitted + } + } + `; + const thirtyDaysAgoRaw = getCurrentTimestamp() - 30 * 86400; + const thirtyDaysAgo = thirtyDaysAgoRaw - (thirtyDaysAgoRaw % 86400); + const variables = { + dateAfter: thirtyDaysAgo, + }; + const { dayDatas } = await request( + 'https://api.thegraph.com/subgraphs/name/traderjoe-xyz/fee-collector-arbitrum', + query, + variables + ); + + const monthlyReward = dayDatas.reduce((acc, dayData) => { + return acc + parseFloat(dayData.usdRemitted); + }, 0); + return monthlyReward; +} + +async function getTVLFromSource(underlyingTokenAddress) { + const [{ output: internalJoeBalance }, coinData] = await Promise.all([ + sdk.api.abi.call({ + target: '0x43646A8e839B2f2766392C1BF8f60F6e587B6960', + abi: 'uint256:internalJoeBalance', + chain: 'arbitrum', + }), + getCoinDataFromDefillamaAPI('arbitrum', underlyingTokenAddress), + ]); + + const { price, decimals } = coinData; + + return (parseInt(internalJoeBalance.toString()) * price) / 10 ** decimals; +} + +async function getSJoeApr(underlyingTokenAddress) { + const monthlyReward = await getMonthlyReward(); + const sJoeTVL = await getTVLFromSource(underlyingTokenAddress); + const apr = (monthlyReward * 12) / sJoeTVL * 100; + return apr; +} + +module.exports = { getSJoeApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/tender-adapter.js b/src/adaptors/factor-v2/strategy-adapter/tender-adapter.js new file mode 100644 index 0000000000..e664f4448f --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/tender-adapter.js @@ -0,0 +1,19 @@ +const { getDefiLLamaPools } = require('./utils'); + +async function getTenderApr(poolAddress) { + const poolAddressToIdMap = { + // USDC + '0x068485a0f964b4c3d395059a19a05a8741c48b4e': + 'f152ff88-dd31-4efb-a0a9-ad26b5536cc7', + }; + + const pool = await getDefiLLamaPools( + poolAddressToIdMap[poolAddress.toLowerCase()] + ); + + const apr = pool.apyBase + (isNaN(pool.apyReward) ? 0 : pool.apyReward); + + return apr; +} + +module.exports = { getTenderApr }; diff --git a/src/adaptors/factor-v2/strategy-adapter/utils.js b/src/adaptors/factor-v2/strategy-adapter/utils.js new file mode 100644 index 0000000000..c5c50d9b41 --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/utils.js @@ -0,0 +1,50 @@ +const { default: axios } = require('axios'); + +async function getAprFromDefillamaPool(apyFunction, poolId) { + const pools = await apyFunction(); + const pool = pools.filter( + (item) => item.pool.toLowerCase() == poolId.toLowerCase() + ); + + if (!pool.length) return 0; + + const apr = pool[0].apyBase + pool[0].apyReward; + + return apr; +} + +function makeReadable(val, dec = 18) { + return parseInt(val) / 10 ** dec; +} + +async function getCoinDataFromDefillamaAPI(chain, tokenAddress) { + const coinId = `${chain}:${tokenAddress}`; + const response = await axios.get( + 'https://coins.llama.fi/prices/current/' + coinId + ); + const coinData = response.data.coins[coinId]; + + // { decimals, symbol, price, timestamp, confidence } + return coinData; +} + +function getCurrentTimestamp() { + const timestamp = Math.floor(Date.now() / 1000); + return timestamp; +} + +async function getDefiLLamaPools(poolId) { + const response = await axios.get('https://yields.llama.fi/pools'); + const pools = response.data.data; + return pools.find( + (pools) => pools.pool.toLowerCase() == poolId.toLowerCase() + ); +} + +module.exports = { + makeReadable, + getAprFromDefillamaPool, + getCoinDataFromDefillamaAPI, + getDefiLLamaPools, + getCurrentTimestamp, +}; diff --git a/src/adaptors/factor-v2/strategy-adapter/vela-adapter.js b/src/adaptors/factor-v2/strategy-adapter/vela-adapter.js new file mode 100644 index 0000000000..1745528c22 --- /dev/null +++ b/src/adaptors/factor-v2/strategy-adapter/vela-adapter.js @@ -0,0 +1,16 @@ +const { getDefiLLamaPools } = require('./utils'); + +/*////////////////////////////////////////////////////////////////////////////// + VLP APR +//////////////////////////////////////////////////////////////////////////////*/ + +async function getVlpApr() { + const pool = await getDefiLLamaPools( + 'ddafe2fb-757a-45dd-87b5-a2c42dc9e093' + ); + const apr = pool.apyBase + pool.apyReward; + + return apr; +} + +module.exports = { getVlpApr }; diff --git a/src/adaptors/factor-v2/vaults.js b/src/adaptors/factor-v2/vaults.js new file mode 100644 index 0000000000..22d0dd8622 --- /dev/null +++ b/src/adaptors/factor-v2/vaults.js @@ -0,0 +1,94 @@ +const vaults = [ + { + poolAddress: '0x89e06Baa8E09Bf943a767788Cf00C9f9e9a873d9', + strategy: 'GLPStrategy', + symbol: 'factGAC', + underlyingToken: '0x5402B5F40310bDED796c7D0F3FF6683f5C0cFfdf', + }, + { + poolAddress: '0x9F7323E95F9ee9f7Ec295d7545e82Cd93fA13f97', + strategy: 'MuxStrategy', + symbol: 'muxpMAC', + underlyingToken: '0x7CbaF5a14D953fF896E5B3312031515c858737C8', + }, + { + poolAddress: '0x3DAe492145e0631D341617bAA81a4c72C2CD4b99', + strategy: 'TraderJoeStrategy', + symbol: 'factJAC', + underlyingToken: '0x371c7ec6D8039ff7933a2AA28EB827Ffe1F52f07', + }, + { + poolAddress: '0xF45A9E3f2F5984BaB983C9f245204DE23aE3b1A1', + strategy: 'SiloStrategy', + symbol: 'siloSUAC', + underlyingToken: '0x55ADE3B74abef55bF379FF6Ae61CB77a405Eb4A8', + }, + { + poolAddress: '0xdfD0a93a22CAE02C81CCe29A6A6362Bec2D2C282', + strategy: 'SiloStrategy', + symbol: 'siloSGAC', + underlyingToken: '0x96E1301bd2536A3C56EBff8335FD892dD9bD02dC', + }, + { + poolAddress: '0xE990f7269E7BdDa64b947C81D69aed92a68cEBC6', + strategy: 'PendleStrategy', + symbol: 'factWAC', + underlyingToken: '0x08a152834de126d2ef83D612ff36e4523FD0017F', + }, + { + poolAddress: '0xEb6c9C35f2BBeeDd4CECc717a869584f85C17d67', + strategy: 'PendleStrategy', + symbol: 'factRAC', + underlyingToken: '0x14FbC760eFaF36781cB0eb3Cb255aD976117B9Bd', + }, + { + poolAddress: '0xe4a286bCA6026CccC7D240914c34219D074F4020', + strategy: 'VelaStrategy', + symbol: 'factVAC', + underlyingToken: '0xC5b2D9FDa8A82E8DcECD5e9e6e99b78a9188eB05', + }, + { + poolAddress: '0x32d1778be7aF21E956DFA38683a707F5539cFc8c', + strategy: 'OliveStrategy', + symbol: 'olivPPO', + underlyingToken: '0x5402B5F40310bDED796c7D0F3FF6683f5C0cFfdf', + }, + { + poolAddress: '0x9Ae93cb28F8A5e6D31B9F9887d57604B31DcC42E', + strategy: 'LodestarStrategy', + symbol: 'lodePAC', + underlyingToken: '0x1ca530f02DD0487cef4943c674342c5aEa08922F', + }, + { + poolAddress: '0x18dFCCb8EAc64Da10DCc5cbf677314c0125B6C4B', + strategy: 'TenderStrategy', + symbol: 'factTAC', + underlyingToken: '0x068485a0f964B4c3D395059a19A05a8741c48B4E', + }, + // { + // poolAddress: '0x52459E1FA6E71BCB93C84c2e2b438ED797A8F3a8', + // strategy: 'PerennialStrategy', + // symbol: 'pereBCA', + // underlyingToken: '0x5A572B5fBBC43387B5eF8de2C4728A4108ef24a6', + // }, + // { + // poolAddress: '0xc994bC98251E043D4681Af980b1E487CfC88193a', + // strategy: 'RedactedStrategy', + // symbol: 'redaPMY', + // underlyingToken: '0x9A592B4539E22EeB8B2A3Df679d572C7712Ef999', + // }, + { + poolAddress: '0xfc0D36C2781F26377da6b72Ab448F5b2a71e7D14', + strategy: 'PenpieStrategy', + symbol: 'pieWEAC', + underlyingToken: '0x08a152834de126d2ef83D612ff36e4523FD0017F', + }, + { + poolAddress: '0xA92c3927A69cBb48735DE6aBf477ea5281152Ef3', + strategy: 'PenpieStrategy', + symbol: 'pieREAC', + underlyingToken: '0x14FbC760eFaF36781cB0eb3Cb255aD976117B9Bd', + }, +]; + +module.exports = vaults;