@stake-dao/reader 0.1.4 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/bytecodes/index.js +16 -0
- package/dist/esm/bytecodes/index.js.map +1 -0
- package/dist/esm/bytecodes/strategies/batches/batchBalancerStrats.js +68 -0
- package/dist/esm/bytecodes/strategies/batches/batchBalancerStrats.js.map +1 -0
- package/dist/esm/{batches/curveStrats.js → bytecodes/strategies/batches/batchCurveStrats.js} +3 -3
- package/dist/esm/bytecodes/strategies/batches/batchCurveStrats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.js +61 -0
- package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapPositions.js +44 -0
- package/dist/esm/bytecodes/strategies/batches/batchPancakeSwapPositions.js.map +1 -0
- package/dist/esm/bytecodes/strategies/batches/batchPancakeswapStrats.js +48 -0
- package/dist/esm/bytecodes/strategies/batches/batchPancakeswapStrats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/batches/batchPendleStrats.js +63 -0
- package/dist/esm/bytecodes/strategies/batches/batchPendleStrats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/builds/buildBalancerStrats.js +54 -0
- package/dist/esm/bytecodes/strategies/builds/buildBalancerStrats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.js +64 -0
- package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapStrats.js +51 -0
- package/dist/esm/bytecodes/strategies/builds/buildPancakeSwapStrats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.js +54 -0
- package/dist/esm/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/builds/buildPendleStrats.js +39 -0
- package/dist/esm/bytecodes/strategies/builds/buildPendleStrats.js.map +1 -0
- package/dist/esm/{batches → bytecodes/strategies/builds}/buildYearnStrats.js +2 -2
- package/dist/esm/bytecodes/strategies/builds/buildYearnStrats.js.map +1 -0
- package/dist/esm/bytecodes/strategies/fetchYearnGauges.js.map +1 -0
- package/dist/esm/bytecodes/strategies/sdtGaugeRewards.js.map +1 -0
- package/dist/esm/bytecodes/tokenData.js.map +1 -0
- package/dist/esm/{batches → bytecodes}/types.js.map +1 -1
- package/dist/esm/index.js +33 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lockers/utils/endpoints.js +1 -1
- package/dist/esm/lockers/utils/endpoints.js.map +1 -1
- package/dist/esm/prices.js +39 -3
- package/dist/esm/prices.js.map +1 -1
- package/dist/esm/strategies/balancer/build.js +4 -11
- package/dist/esm/strategies/balancer/build.js.map +1 -1
- package/dist/esm/strategies/balancer/fetch.js +190 -0
- package/dist/esm/strategies/balancer/fetch.js.map +1 -0
- package/dist/esm/strategies/curve/build.js +4 -4
- package/dist/esm/strategies/curve/build.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js +0 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js +3 -2
- package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.js +3 -2
- package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js +2 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.js +2 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/index.js +22 -4
- package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
- package/dist/esm/strategies/curve/httpCalls.js +3 -3
- package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
- package/dist/esm/strategies/curve/onChainCalls.js +3 -2
- package/dist/esm/strategies/curve/onChainCalls.js.map +1 -1
- package/dist/esm/strategies/pancakeswap/abis/PancakeSwapMasterchef.json +1575 -0
- package/dist/esm/strategies/pancakeswap/build.js +48 -0
- package/dist/esm/strategies/pancakeswap/build.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/buildErc20.js +63 -0
- package/dist/esm/strategies/pancakeswap/buildErc20.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/config.js +7 -0
- package/dist/esm/strategies/pancakeswap/config.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/endpoints.js +10 -0
- package/dist/esm/strategies/pancakeswap/endpoints.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeApisData.js +24 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeApisData.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeErc20Vaults.js +134 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeErc20Vaults.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeNotDeployed.js +102 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeNotDeployed.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeV3Vaults.js +142 -0
- package/dist/esm/strategies/pancakeswap/fetch/getPancakeV3Vaults.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/fetch/index.js +25 -0
- package/dist/esm/strategies/pancakeswap/fetch/index.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/fetch/pancakePositions.js +87 -0
- package/dist/esm/strategies/pancakeswap/fetch/pancakePositions.js.map +1 -0
- package/dist/esm/strategies/pancakeswap/fetch/pancakeswapMath.js +199 -0
- package/dist/esm/strategies/pancakeswap/fetch/pancakeswapMath.js.map +1 -0
- package/dist/esm/strategies/pendle/abis/MulticallPendleStratsAbi.json +103 -0
- package/dist/esm/strategies/pendle/build.js +70 -0
- package/dist/esm/strategies/pendle/build.js.map +1 -0
- package/dist/esm/strategies/pendle/fetch.js +267 -0
- package/dist/esm/strategies/pendle/fetch.js.map +1 -0
- package/dist/esm/strategies/pendle/getPendleApiData.js +15 -0
- package/dist/esm/strategies/pendle/getPendleApiData.js.map +1 -0
- package/dist/esm/strategies/pendle/pendlePoints.js +71 -0
- package/dist/esm/strategies/pendle/pendlePoints.js.map +1 -0
- package/dist/esm/strategies/utils/getAprBreakdown.js +9 -9
- package/dist/esm/strategies/utils/getAprBreakdown.js.map +1 -1
- package/dist/esm/strategies/utils/index.js +10 -1
- package/dist/esm/strategies/utils/index.js.map +1 -1
- package/dist/esm/strategies/yearn/build.js +5 -4
- package/dist/esm/strategies/yearn/build.js.map +1 -1
- package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js +3 -2
- package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js.map +1 -1
- package/dist/esm/strategies/yearn/fetch/index.js +1 -1
- package/dist/esm/strategies/yearn/fetch/index.js.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/utils.js +1 -1
- package/dist/esm/utils.js.map +1 -1
- package/dist/types/bytecodes/index.d.ts +16 -0
- package/dist/types/bytecodes/index.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/batches/batchBalancerStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/batches/batchBalancerStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/batches/batchCurveStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/batches/batchCurveStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/batches/batchPancakeSwapPositions.d.ts +4 -0
- package/dist/types/bytecodes/strategies/batches/batchPancakeSwapPositions.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/batches/batchPancakeswapStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/batches/batchPancakeswapStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/batches/batchPendleStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/batches/batchPendleStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/builds/buildBalancerStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/builds/buildBalancerStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/builds/buildPancakeSwapStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/builds/buildPancakeSwapStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/builds/buildPendleStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/builds/buildPendleStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/builds/buildYearnStrats.d.ts +4 -0
- package/dist/types/bytecodes/strategies/builds/buildYearnStrats.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/fetchYearnGauges.d.ts +4 -0
- package/dist/types/bytecodes/strategies/fetchYearnGauges.d.ts.map +1 -0
- package/dist/types/bytecodes/strategies/sdtGaugeRewards.d.ts +4 -0
- package/dist/types/bytecodes/strategies/sdtGaugeRewards.d.ts.map +1 -0
- package/dist/types/bytecodes/tokenData.d.ts.map +1 -0
- package/dist/types/bytecodes/types.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lockers/utils/endpoints.d.ts +1 -1
- package/dist/types/lockers/utils/endpoints.d.ts.map +1 -1
- package/dist/types/prices.d.ts +8 -1
- package/dist/types/prices.d.ts.map +1 -1
- package/dist/types/strategies/balancer/build.d.ts +0 -1
- package/dist/types/strategies/balancer/build.d.ts.map +1 -1
- package/dist/types/strategies/balancer/fetch.d.ts +11 -0
- package/dist/types/strategies/balancer/fetch.d.ts.map +1 -0
- package/dist/types/strategies/curve/build.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/curveApiData/bytecode.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/curveApiData/getCurveApiData.d.ts +1 -1
- package/dist/types/strategies/curve/fetch/curveApiData/getCurveApiData.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/index.d.ts +15 -2
- package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
- package/dist/types/strategies/curve/onChainCalls.d.ts.map +1 -1
- package/dist/types/strategies/pancakeswap/build.d.ts +2 -0
- package/dist/types/strategies/pancakeswap/build.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/buildErc20.d.ts +7 -0
- package/dist/types/strategies/pancakeswap/buildErc20.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/config.d.ts +7 -0
- package/dist/types/strategies/pancakeswap/config.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/endpoints.d.ts +8 -0
- package/dist/types/strategies/pancakeswap/endpoints.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeApisData.d.ts +10 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeApisData.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeErc20Vaults.d.ts +44 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeErc20Vaults.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeNotDeployed.d.ts +3 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeNotDeployed.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeV3Vaults.d.ts +7 -0
- package/dist/types/strategies/pancakeswap/fetch/getPancakeV3Vaults.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/fetch/index.d.ts +17 -0
- package/dist/types/strategies/pancakeswap/fetch/index.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/fetch/pancakePositions.d.ts +11 -0
- package/dist/types/strategies/pancakeswap/fetch/pancakePositions.d.ts.map +1 -0
- package/dist/types/strategies/pancakeswap/fetch/pancakeswapMath.d.ts +33 -0
- package/dist/types/strategies/pancakeswap/fetch/pancakeswapMath.d.ts.map +1 -0
- package/dist/types/strategies/pendle/build.d.ts +42 -0
- package/dist/types/strategies/pendle/build.d.ts.map +1 -0
- package/dist/types/strategies/pendle/fetch.d.ts +60 -0
- package/dist/types/strategies/pendle/fetch.d.ts.map +1 -0
- package/dist/types/strategies/pendle/getPendleApiData.d.ts +3 -0
- package/dist/types/strategies/pendle/getPendleApiData.d.ts.map +1 -0
- package/dist/types/strategies/pendle/pendlePoints.d.ts +80 -0
- package/dist/types/strategies/pendle/pendlePoints.d.ts.map +1 -0
- package/dist/types/strategies/types.d.ts +17 -3
- package/dist/types/strategies/types.d.ts.map +1 -1
- package/dist/types/strategies/utils/getAprBreakdown.d.ts +1 -4
- package/dist/types/strategies/utils/getAprBreakdown.d.ts.map +1 -1
- package/dist/types/strategies/utils/index.d.ts +2 -0
- package/dist/types/strategies/utils/index.d.ts.map +1 -1
- package/dist/types/strategies/yearn/build.d.ts.map +1 -1
- package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts.map +1 -1
- package/dist/types/strategies/yearn/fetch/index.d.ts +13 -2
- package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -1
- package/dist/types/utils.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/bytecodes/index.ts +18 -0
- package/src/bytecodes/strategies/batches/batchBalancerStrats.ts +70 -0
- package/src/{batches/curveStrats.ts → bytecodes/strategies/batches/batchCurveStrats.ts} +3 -3
- package/src/bytecodes/strategies/batches/batchPancakeSwapErc20Strats.ts +67 -0
- package/src/bytecodes/strategies/batches/batchPancakeSwapPositions.ts +50 -0
- package/src/bytecodes/strategies/batches/batchPancakeswapStrats.ts +54 -0
- package/src/bytecodes/strategies/batches/batchPendleStrats.ts +65 -0
- package/src/bytecodes/strategies/builds/buildBalancerStrats.ts +56 -0
- package/src/bytecodes/strategies/builds/buildPancakeSwapErc20Strats.ts +70 -0
- package/src/bytecodes/strategies/builds/buildPancakeSwapStrats.ts +57 -0
- package/src/bytecodes/strategies/builds/buildPancakeswapNotDeployedErc20Strats.ts +60 -0
- package/src/bytecodes/strategies/builds/buildPendleStrats.ts +41 -0
- package/src/{batches → bytecodes/strategies/builds}/buildYearnStrats.ts +3 -3
- package/src/{batches → bytecodes/strategies}/fetchYearnGauges.ts +1 -1
- package/src/{batches → bytecodes/strategies}/sdtGaugeRewards.ts +1 -1
- package/src/endpoints.ts +2 -0
- package/src/index.ts +43 -5
- package/src/lockers/utils/endpoints.ts +2 -1
- package/src/prices.ts +57 -6
- package/src/strategies/balancer/build.ts +66 -0
- package/src/strategies/balancer/endpoints.ts +27 -0
- package/src/strategies/balancer/fetch.ts +266 -0
- package/src/strategies/curve/build.ts +4 -3
- package/src/strategies/curve/fetch/curveApiData/bytecode.ts +0 -1
- package/src/strategies/curve/fetch/curveApiData/getCurveApiData.ts +4 -3
- package/src/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.ts +7 -3
- package/src/strategies/curve/fetch/curveApiData/getGaugesWeights.ts +3 -2
- package/src/strategies/curve/fetch/curveApiData/getPoolsFromRegistries.ts.ts +3 -2
- package/src/strategies/curve/fetch/index.ts +53 -15
- package/src/strategies/curve/httpCalls.ts +3 -3
- package/src/strategies/curve/onChainCalls.ts +4 -2
- package/src/strategies/pancakeswap/build.ts +57 -0
- package/src/strategies/pancakeswap/buildErc20.ts +73 -0
- package/src/strategies/pancakeswap/config.ts +7 -0
- package/src/strategies/pancakeswap/endpoints.ts +12 -0
- package/src/strategies/pancakeswap/fetch/getPancakeApisData.ts +32 -0
- package/src/strategies/pancakeswap/fetch/getPancakeErc20Vaults.ts +184 -0
- package/src/strategies/pancakeswap/fetch/getPancakeNotDeployed.ts +132 -0
- package/src/strategies/pancakeswap/fetch/getPancakeV3Vaults.ts +191 -0
- package/src/strategies/pancakeswap/fetch/index.ts +50 -0
- package/src/strategies/pancakeswap/fetch/pancakePositions.ts +147 -0
- package/src/strategies/pancakeswap/fetch/pancakeswapMath.ts +305 -0
- package/src/strategies/pendle/build.ts +93 -0
- package/src/strategies/pendle/fetch.ts +349 -0
- package/src/strategies/pendle/getPendleApiData.ts +20 -0
- package/src/strategies/pendle/pendlePoints.ts +71 -0
- package/src/strategies/types.ts +20 -3
- package/src/strategies/utils/getAprBreakdown.ts +9 -9
- package/src/strategies/utils/index.ts +14 -1
- package/src/strategies/yearn/build.ts +5 -4
- package/src/strategies/yearn/fetch/fetchAllYearnGauges.ts +4 -3
- package/src/strategies/yearn/fetch/index.ts +22 -11
- package/src/utils.ts +3 -3
- package/dist/esm/batches/balancerStrats.js +0 -73
- package/dist/esm/batches/balancerStrats.js.map +0 -1
- package/dist/esm/batches/buildBalancerStrats.js +0 -62
- package/dist/esm/batches/buildBalancerStrats.js.map +0 -1
- package/dist/esm/batches/buildYearnStrats.js.map +0 -1
- package/dist/esm/batches/curveStrats.js.map +0 -1
- package/dist/esm/batches/fetchYearnGauges.js.map +0 -1
- package/dist/esm/batches/index.js +0 -8
- package/dist/esm/batches/index.js.map +0 -1
- package/dist/esm/batches/sdtGaugeRewards.js.map +0 -1
- package/dist/esm/batches/tokenData.js.map +0 -1
- package/dist/esm/strategies/balancer/fetch/index.js +0 -203
- package/dist/esm/strategies/balancer/fetch/index.js.map +0 -1
- package/dist/types/batches/balancerStrats.d.ts +0 -4
- package/dist/types/batches/balancerStrats.d.ts.map +0 -1
- package/dist/types/batches/buildBalancerStrats.d.ts +0 -4
- package/dist/types/batches/buildBalancerStrats.d.ts.map +0 -1
- package/dist/types/batches/buildYearnStrats.d.ts +0 -4
- package/dist/types/batches/buildYearnStrats.d.ts.map +0 -1
- package/dist/types/batches/curveStrats.d.ts +0 -4
- package/dist/types/batches/curveStrats.d.ts.map +0 -1
- package/dist/types/batches/fetchYearnGauges.d.ts +0 -4
- package/dist/types/batches/fetchYearnGauges.d.ts.map +0 -1
- package/dist/types/batches/index.d.ts +0 -8
- package/dist/types/batches/index.d.ts.map +0 -1
- package/dist/types/batches/sdtGaugeRewards.d.ts +0 -4
- package/dist/types/batches/sdtGaugeRewards.d.ts.map +0 -1
- package/dist/types/batches/tokenData.d.ts.map +0 -1
- package/dist/types/batches/types.d.ts.map +0 -1
- package/dist/types/strategies/balancer/fetch/index.d.ts +0 -6
- package/dist/types/strategies/balancer/fetch/index.d.ts.map +0 -1
- package/src/batches/index.ts +0 -5
- /package/dist/esm/{batches → bytecodes/strategies}/fetchYearnGauges.js +0 -0
- /package/dist/esm/{batches → bytecodes/strategies}/sdtGaugeRewards.js +0 -0
- /package/dist/esm/{batches → bytecodes}/tokenData.js +0 -0
- /package/dist/esm/{batches → bytecodes}/types.js +0 -0
- /package/dist/types/{batches → bytecodes}/tokenData.d.ts +0 -0
- /package/dist/types/{batches → bytecodes}/types.d.ts +0 -0
- /package/src/{batches → bytecodes}/tokenData.ts +0 -0
- /package/src/{batches → bytecodes}/types.ts +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { decodeAbiParameters, encodeAbiParameters, parseAbiParameters, zeroAddress } from 'viem'
|
|
2
|
+
|
|
3
|
+
import { contracts, tokenWithId } from '@stake-dao/constants'
|
|
4
|
+
import { range } from 'lodash-es'
|
|
5
|
+
import { buildPancakeSwapStrats } from '../../bytecodes/index.js'
|
|
6
|
+
import { batchJsonRpc, rpcCall } from '../../utils.js'
|
|
7
|
+
import { concatBytecode } from '../utils/index.js'
|
|
8
|
+
import { PCS_POOLS_CHUNK_SIZE } from './config.js'
|
|
9
|
+
|
|
10
|
+
export const buildPancakeSwapStrategies = async (rpc: string, chainId: number) => {
|
|
11
|
+
const cake = tokenWithId('cake', chainId)!
|
|
12
|
+
const cakeReward = { name: cake.name, symbol: cake.symbol, address: cake.address, decimals: cake.decimals }
|
|
13
|
+
|
|
14
|
+
const nPoolsRequest = await rpcCall(rpc, [{ to: contracts.pancakeMasterchef![chainId]!, data: '0x081e3eda' }]) // poolLength()
|
|
15
|
+
const nPools = Number(decodeAbiParameters([{ type: 'uint256', name: 'n_gauges' }], nPoolsRequest[0].result))
|
|
16
|
+
|
|
17
|
+
const poolsCalls = range(0, nPools, PCS_POOLS_CHUNK_SIZE).map((skip) => {
|
|
18
|
+
const inputParams = [
|
|
19
|
+
contracts.pancakeMasterchef![chainId]!,
|
|
20
|
+
skip,
|
|
21
|
+
skip + PCS_POOLS_CHUNK_SIZE > nPools ? nPools : skip + PCS_POOLS_CHUNK_SIZE,
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
const inputData = encodeAbiParameters(
|
|
25
|
+
parseAbiParameters(buildPancakeSwapStrats.inputType![chainId]!) as any,
|
|
26
|
+
inputParams,
|
|
27
|
+
)
|
|
28
|
+
return concatBytecode(buildPancakeSwapStrats.bytecode[chainId]!, inputData)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
const pools = await batchJsonRpc({
|
|
32
|
+
rpc,
|
|
33
|
+
calls: poolsCalls,
|
|
34
|
+
outputTypeAbi: buildPancakeSwapStrats.outputTypeHr![chainId]!,
|
|
35
|
+
callsKey: `strategies/pancakeswap/build.ts: buildPancakeSwapStrategies/pools - chainId ${chainId} - rpc ${rpc}`,
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
return pools
|
|
39
|
+
.filter((d) => d.pool !== zeroAddress)
|
|
40
|
+
.map((data) => {
|
|
41
|
+
return {
|
|
42
|
+
key: `${chainId}-${data.id}`,
|
|
43
|
+
poolId: Number(data.id),
|
|
44
|
+
protocol: 'pancakeswap',
|
|
45
|
+
chainId,
|
|
46
|
+
pool: data.pool,
|
|
47
|
+
fee: data.fee,
|
|
48
|
+
coins: data.coins.map((c) => ({
|
|
49
|
+
name: c._name,
|
|
50
|
+
symbol: c._symbol,
|
|
51
|
+
address: c._address,
|
|
52
|
+
decimals: Number(c._decimals),
|
|
53
|
+
})),
|
|
54
|
+
rewards: [cakeReward],
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { chunk } from 'lodash-es'
|
|
2
|
+
import { encodeAbiParameters, parseAbiParameters } from 'viem'
|
|
3
|
+
import { buildPancakeSwapErc20Strats } from '../../bytecodes/index.js'
|
|
4
|
+
import { batchJsonRpc } from '../../utils.js'
|
|
5
|
+
import { bytes32ToString, concatBytecode } from '../utils/index.js'
|
|
6
|
+
import { BROKEN_VAULT, PCS_POOLS_ERC20_CHUNK_SIZE } from './config.js'
|
|
7
|
+
|
|
8
|
+
interface VaultAndLp {
|
|
9
|
+
vault: string
|
|
10
|
+
lpToken: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const buildPancakeSwapErc20Strategies = async (stratsList: VaultAndLp[], rpc: string, chainId: number) => {
|
|
14
|
+
const inputArgsChunks = chunk(stratsList, PCS_POOLS_ERC20_CHUNK_SIZE)
|
|
15
|
+
const poolsCalls = inputArgsChunks.map((poolsArgs) => {
|
|
16
|
+
const inputData = encodeAbiParameters(parseAbiParameters(buildPancakeSwapErc20Strats.inputType[chainId]!) as any, [
|
|
17
|
+
poolsArgs,
|
|
18
|
+
])
|
|
19
|
+
return concatBytecode(buildPancakeSwapErc20Strats.bytecode[chainId]!, inputData)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
const pools = await batchJsonRpc({
|
|
23
|
+
rpc,
|
|
24
|
+
calls: poolsCalls,
|
|
25
|
+
outputTypeAbi: buildPancakeSwapErc20Strats.outputTypeHr[chainId],
|
|
26
|
+
callsKey: `strategies/pancakeswap/buildErc20.ts: buildPancakeSwapErc20Strategies/pools - chainId ${chainId} - rpc ${rpc}`,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
return pools
|
|
30
|
+
.map((data) => {
|
|
31
|
+
const coins = data.coins.map((c) => ({
|
|
32
|
+
name: bytes32ToString(c._name),
|
|
33
|
+
symbol: bytes32ToString(c._symbol),
|
|
34
|
+
address: c._address,
|
|
35
|
+
decimals: Number(c._decimals),
|
|
36
|
+
}))
|
|
37
|
+
|
|
38
|
+
const lpName = bytes32ToString(data.lpToken._name)
|
|
39
|
+
const isStable = lpName.includes('StableSwap')
|
|
40
|
+
const isMetapool = coins.some((c) => c.name.includes(' LPs'))
|
|
41
|
+
const lpSymbol = `${coins.map((c) => c.symbol).join('-')} ${isStable ? 'Stable LP' : 'LP'}`
|
|
42
|
+
|
|
43
|
+
if (!BROKEN_VAULT[chainId].includes(data.vault)) {
|
|
44
|
+
return {
|
|
45
|
+
key: `${data.manager.toLowerCase()}-${coins.map((c) => c.symbol.toLowerCase()).join('-')}`,
|
|
46
|
+
protocol: 'pancakeswap',
|
|
47
|
+
chainId,
|
|
48
|
+
isMetapool,
|
|
49
|
+
isStable,
|
|
50
|
+
manager: data.manager,
|
|
51
|
+
pool: data.pool,
|
|
52
|
+
gaugeAddress: data.gauge,
|
|
53
|
+
vault: data.vault,
|
|
54
|
+
lpToken: {
|
|
55
|
+
name: lpName,
|
|
56
|
+
symbol: lpSymbol,
|
|
57
|
+
address: data.lpToken._address,
|
|
58
|
+
decimals: Number(data.lpToken._decimals),
|
|
59
|
+
},
|
|
60
|
+
coins,
|
|
61
|
+
rewards: data.rewards.map((r) => ({
|
|
62
|
+
name: r._name,
|
|
63
|
+
symbol: r._symbol,
|
|
64
|
+
address: r._address,
|
|
65
|
+
decimals: Number(r._decimals),
|
|
66
|
+
})),
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return undefined
|
|
71
|
+
})
|
|
72
|
+
.filter(Boolean)
|
|
73
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const CHAINS_DENOMINATOR = {
|
|
2
|
+
1: 'ethereum',
|
|
3
|
+
56: 'bsc',
|
|
4
|
+
42161: 'arbitrum',
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const PANCAKESWAP_FEE_URL = (version: string, chainId: number) => {
|
|
8
|
+
return `https://explorer-api.pancakeswap.com/cached/pools/apr/${version}/${CHAINS_DENOMINATOR[chainId]}/farms-lp`
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const MANAGER_FEES_ENDPOINT =
|
|
12
|
+
'https://raw.githubusercontent.com/stake-dao/votemarket-data/main/tvls/pancakeManagersFees.json'
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { bsc } from 'viem/chains'
|
|
2
|
+
import { MANAGER_FEES_ENDPOINT, PANCAKESWAP_FEE_URL } from '../endpoints.js'
|
|
3
|
+
|
|
4
|
+
interface PancakeManagerFees {
|
|
5
|
+
[lp: string]: { token0: string; token1: string }
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const getPancakeSwapManagerFeesAPR = async (chainId: number): Promise<PancakeManagerFees> => {
|
|
9
|
+
if (chainId !== bsc.id) return {}
|
|
10
|
+
|
|
11
|
+
const data = await (await fetch(MANAGER_FEES_ENDPOINT)).json()
|
|
12
|
+
const res: PancakeManagerFees = {}
|
|
13
|
+
|
|
14
|
+
for (const d of data) {
|
|
15
|
+
res[d.lpAddress.toLowerCase()] = {
|
|
16
|
+
token0: d.token0,
|
|
17
|
+
token1: d.token1,
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return res
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const getPancakeSwapFeesAPR = async (chainId: number) => {
|
|
25
|
+
const [v2TradingFees, stableTradingFees, v3TradingFees] = await Promise.all([
|
|
26
|
+
(await fetch(PANCAKESWAP_FEE_URL('v2', chainId))).json(),
|
|
27
|
+
(await fetch(PANCAKESWAP_FEE_URL('stable', chainId))).json(),
|
|
28
|
+
(await fetch(PANCAKESWAP_FEE_URL('v3', chainId))).json(),
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
return { ...v2TradingFees, ...stableTradingFees, ...v3TradingFees }
|
|
32
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { encodeAbiParameters, formatUnits, parseAbiParameters } from 'viem'
|
|
2
|
+
|
|
3
|
+
import { batchPancakeSwapErc20Strats } from '../../../bytecodes/index.js'
|
|
4
|
+
|
|
5
|
+
import { buildPancakeSwapErc20Strategies } from '../buildErc20.js'
|
|
6
|
+
|
|
7
|
+
import { ONE_YEAR, STRAT_FEES, contracts, pancakeswapErc20Strats, tokenWithId } from '@stake-dao/constants'
|
|
8
|
+
import { concatBytecode, decodeNewFactoryEvent } from '../../../index.js'
|
|
9
|
+
import { type Price, mergePrices } from '../../../prices.js'
|
|
10
|
+
import { batchJsonRpc, equalTlc } from '../../../utils.js'
|
|
11
|
+
import { getAprBreakdown } from '../../utils/getAprBreakdown.js'
|
|
12
|
+
|
|
13
|
+
export const getPancakeErc20Vaults = async (
|
|
14
|
+
rpc: string,
|
|
15
|
+
chainId: number,
|
|
16
|
+
basePrices: Price[],
|
|
17
|
+
feesApr: any,
|
|
18
|
+
managerFees: any,
|
|
19
|
+
events: any,
|
|
20
|
+
) => {
|
|
21
|
+
const oldVaultsAndLp = pancakeswapErc20Strats.strats[chainId]!
|
|
22
|
+
const newVaultsAndLp = decodeNewFactoryEvent(events).map((e) => ({ vault: e.vault, lpToken: e.lpToken }))
|
|
23
|
+
const vaultsAndLp = oldVaultsAndLp.concat(newVaultsAndLp)
|
|
24
|
+
|
|
25
|
+
const poolsErc20: any[] =
|
|
26
|
+
vaultsAndLp.length > 0
|
|
27
|
+
? await buildPancakeSwapErc20Strategies(oldVaultsAndLp.concat(newVaultsAndLp), rpc, chainId)
|
|
28
|
+
: []
|
|
29
|
+
|
|
30
|
+
if (poolsErc20.length > 0) {
|
|
31
|
+
const poolsErc20Info = poolsErc20.map((p) => ({ lp: p.lpToken.address, wrapper: p.gaugeAddress, vault: p.vault }))
|
|
32
|
+
|
|
33
|
+
const pricesToFetch = poolsErc20
|
|
34
|
+
.flatMap((p) =>
|
|
35
|
+
p.coins.map((c) => {
|
|
36
|
+
const coinPrice = basePrices.find((bp) => equalTlc(bp.address, c.address))?.usdPrice || 0
|
|
37
|
+
return coinPrice === 0 ? { address: c.address, symbol: c.symbol } : undefined
|
|
38
|
+
}),
|
|
39
|
+
)
|
|
40
|
+
.filter(Boolean)
|
|
41
|
+
const prices = await mergePrices(basePrices, pricesToFetch, chainId)
|
|
42
|
+
|
|
43
|
+
const cake = tokenWithId('cake', chainId)!
|
|
44
|
+
const cakePriceUsd = prices.find((p) => equalTlc(p.address, cake.address))?.usdPrice || 0
|
|
45
|
+
|
|
46
|
+
const poolsErc20InputData = encodeAbiParameters(
|
|
47
|
+
parseAbiParameters(batchPancakeSwapErc20Strats.inputType[chainId]!) as any,
|
|
48
|
+
[contracts.cakeLocker![chainId], poolsErc20Info],
|
|
49
|
+
)
|
|
50
|
+
const poolsErc20Calls = concatBytecode(batchPancakeSwapErc20Strats.bytecode[chainId]!, poolsErc20InputData)
|
|
51
|
+
const decodedPromiseErc20 = await batchJsonRpc({
|
|
52
|
+
rpc,
|
|
53
|
+
calls: [poolsErc20Calls],
|
|
54
|
+
outputTypeAbi: batchPancakeSwapErc20Strats.outputTypeHr[chainId],
|
|
55
|
+
callsKey: `strategies/pancakeswap/fetch/getPancakeErc20Vaults.ts: getPancakeErc20Vaults - chainId ${chainId} - rpc ${rpc}`,
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const parsedStratsErc20 = poolsErc20.map((strat, index) => {
|
|
59
|
+
const stratParsedData = decodedPromiseErc20[0].stratsData[index]
|
|
60
|
+
|
|
61
|
+
const token0PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[0]!.address))?.usdPrice || 0
|
|
62
|
+
const token1PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[1]!.address))?.usdPrice || 0
|
|
63
|
+
|
|
64
|
+
const lpPriceInUsd =
|
|
65
|
+
Number(formatUnits(stratParsedData.token0PerShare, strat.coins[0].decimals)) * token0PriceInUsd +
|
|
66
|
+
Number(formatUnits(stratParsedData.token1PerShare, strat.coins[1].decimals)) * token1PriceInUsd
|
|
67
|
+
|
|
68
|
+
const totalSupply = formatUnits(stratParsedData.sharesDeposited, 18)
|
|
69
|
+
const tvl = lpPriceInUsd * Number(totalSupply)
|
|
70
|
+
const tvlTotal = lpPriceInUsd * Number(formatUnits(stratParsedData.sharesTotalSupply, 18))
|
|
71
|
+
|
|
72
|
+
let tradingApy = Number(feesApr[strat.lpToken.address.toLowerCase()]?.apr7d || 0)
|
|
73
|
+
if (!tradingApy && managerFees[strat.pool.toLowerCase()]) {
|
|
74
|
+
const feesData = managerFees[strat.pool.toLowerCase()]
|
|
75
|
+
tradingApy = feesData
|
|
76
|
+
? ((Number(formatUnits(feesData.token0, strat.coins[0].decimals)) * token0PriceInUsd +
|
|
77
|
+
Number(formatUnits(feesData.token1, strat.coins[1].decimals)) * token1PriceInUsd) /
|
|
78
|
+
tvlTotal) *
|
|
79
|
+
365 *
|
|
80
|
+
100
|
|
81
|
+
: 0
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const boost =
|
|
85
|
+
Number(formatUnits(stratParsedData.boost, 0)) / Number(formatUnits(stratParsedData.boostPrecision, 0)) ||
|
|
86
|
+
(strat.manager === 'pancakeswap' ? 2.5 : 3) // Pancake max boost is 2.5, managers farm is 3
|
|
87
|
+
|
|
88
|
+
const rewardPerYear = cakePriceUsd * Number(formatUnits(stratParsedData.rewardPerSecond, 18)) * ONE_YEAR
|
|
89
|
+
const farmApr =
|
|
90
|
+
tvl > 0
|
|
91
|
+
? ((rewardPerYear *
|
|
92
|
+
(Number(formatUnits(stratParsedData.boostedSharesDeposited, 0)) /
|
|
93
|
+
Number(formatUnits(stratParsedData.boostedSharesTotalSupply, 0)))) /
|
|
94
|
+
tvl) *
|
|
95
|
+
((100 - STRAT_FEES + 0.5) / 100)
|
|
96
|
+
: (rewardPerYear / tvlTotal) * boost
|
|
97
|
+
|
|
98
|
+
const rewardsData = stratParsedData.sdRewardsData.map((r: any, index: number) => {
|
|
99
|
+
const rewardToken = strat.rewards[index]
|
|
100
|
+
const rewardPrice = prices.find((p: any) => equalTlc(p.symbol, rewardToken.symbol))
|
|
101
|
+
|
|
102
|
+
const periodFinish = Number(formatUnits(r.period_finish, 0))
|
|
103
|
+
const streaming = periodFinish > Math.floor(Date.now() / 1000)
|
|
104
|
+
|
|
105
|
+
const rewardApr =
|
|
106
|
+
streaming && rewardPrice && tvl > 0
|
|
107
|
+
? (Number(formatUnits(r.rate * BigInt(ONE_YEAR), 18)) * rewardPrice.usdPrice) /
|
|
108
|
+
tvl /
|
|
109
|
+
(equalTlc(rewardToken.symbol, 'SDT') ? 2.5 : 1)
|
|
110
|
+
: 0
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
token: rewardToken,
|
|
114
|
+
price: rewardPrice ? rewardPrice.usdPrice : 0,
|
|
115
|
+
apr: rewardApr * 100,
|
|
116
|
+
streaming,
|
|
117
|
+
periodFinish,
|
|
118
|
+
rate: formatUnits(r.rate, 0),
|
|
119
|
+
lastUpdate: formatUnits(r.last_update, 0),
|
|
120
|
+
claimablePendingRewards:
|
|
121
|
+
rewardToken.symbol === 'CAKE' ? formatUnits(stratParsedData.claimablePendingRewards, 0) : '0',
|
|
122
|
+
}
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
const apr = getAprBreakdown(
|
|
126
|
+
{ ...strat, minApr: (farmApr / boost) * 100, tradingApy },
|
|
127
|
+
rewardsData,
|
|
128
|
+
boost,
|
|
129
|
+
undefined,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
const name = strat.coins.reduce((res: string, current) => `${res}/${current.symbol}`, '').slice(1)
|
|
133
|
+
const subname =
|
|
134
|
+
strat.manager === 'pancakeswap' ? (strat.lpToken.symbol.includes('Stable LP') ? 'Stable' : 'v2') : strat.manager
|
|
135
|
+
const version =
|
|
136
|
+
strat.manager === 'pancakeswap'
|
|
137
|
+
? strat.lpToken.symbol.includes('Stable LP')
|
|
138
|
+
? 'stable'
|
|
139
|
+
: '2'
|
|
140
|
+
: strat.manager.toLowerCase()
|
|
141
|
+
|
|
142
|
+
const sdGauge = {
|
|
143
|
+
address: strat.sdGauge,
|
|
144
|
+
totalSupply: formatUnits(stratParsedData.sharesDeposited, 0),
|
|
145
|
+
relativeWeight: '0',
|
|
146
|
+
weight: '0',
|
|
147
|
+
futureWeight: '0',
|
|
148
|
+
workingSupply: '0',
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
key: strat.key,
|
|
153
|
+
name,
|
|
154
|
+
subname,
|
|
155
|
+
protocol: strat.protocol,
|
|
156
|
+
version,
|
|
157
|
+
chainId: strat.chainId,
|
|
158
|
+
isMetapool: strat.isMetapool,
|
|
159
|
+
isStable: strat.isStable,
|
|
160
|
+
vault: strat.vault,
|
|
161
|
+
lpToken: strat.lpToken,
|
|
162
|
+
gaugeAddress: strat.gaugeAddress,
|
|
163
|
+
pool: strat.pool,
|
|
164
|
+
manager: strat.manager,
|
|
165
|
+
coins: strat.coins,
|
|
166
|
+
sdGauge,
|
|
167
|
+
lpPriceInUsd,
|
|
168
|
+
tvl,
|
|
169
|
+
apr: { ...apr, boost },
|
|
170
|
+
rewards: rewardsData,
|
|
171
|
+
// Base APR data
|
|
172
|
+
tradingApy,
|
|
173
|
+
minApr: (farmApr / boost) * 100,
|
|
174
|
+
maxApr: (farmApr / boost) * (strat.manager === 'pancakeswap' ? 2.5 : 3) * 100,
|
|
175
|
+
// Raw data
|
|
176
|
+
totalSupply: formatUnits(stratParsedData.sharesDeposited, 0),
|
|
177
|
+
}
|
|
178
|
+
})
|
|
179
|
+
|
|
180
|
+
return parsedStratsErc20
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return []
|
|
184
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { ONE_YEAR, STRAT_FEES, contracts, tokenWithId } from '@stake-dao/constants'
|
|
2
|
+
import { decodeAbiParameters, encodeAbiParameters, formatUnits, parseAbiParameters, zeroAddress } from 'viem'
|
|
3
|
+
|
|
4
|
+
import { range } from 'lodash-es'
|
|
5
|
+
import { buildPancakeswapNotDeployedErc20Strats } from '../../../bytecodes/index.js'
|
|
6
|
+
import { bytes32ToString, concatBytecode } from '../../../index.js'
|
|
7
|
+
import { type Price, mergePrices } from '../../../prices.js'
|
|
8
|
+
import { batchJsonRpc, equalTlc, rpcCall } from '../../../utils.js'
|
|
9
|
+
import { PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE } from '../config.js'
|
|
10
|
+
|
|
11
|
+
export const getPancakeNotDeployed = async (
|
|
12
|
+
rpc: string,
|
|
13
|
+
chainId: number,
|
|
14
|
+
basePrices: Price[],
|
|
15
|
+
feesApr: any,
|
|
16
|
+
managerFees: any,
|
|
17
|
+
deployedLp: string[],
|
|
18
|
+
) => {
|
|
19
|
+
const poolLengthRequest = await rpcCall(rpc, [{ to: contracts.pancakeFarmBooster![chainId]!, data: '0x081e3eda' }]) // poolLength()
|
|
20
|
+
const poolLength =
|
|
21
|
+
Number(decodeAbiParameters([{ type: 'uint256', name: 'n_gauges' }], poolLengthRequest[0].result)) + 1
|
|
22
|
+
|
|
23
|
+
const notDeployedCalls = range(1, poolLength, PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE).map((skip) => {
|
|
24
|
+
const inputParams = [
|
|
25
|
+
contracts.pancakeFarmBooster![chainId],
|
|
26
|
+
skip,
|
|
27
|
+
skip + PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE > poolLength ? poolLength : skip + PCS_POOLS_NOT_DEPLOYED_CHUNK_SIZE,
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
const inputData = encodeAbiParameters(
|
|
31
|
+
parseAbiParameters(buildPancakeswapNotDeployedErc20Strats.inputType[chainId]!) as any,
|
|
32
|
+
inputParams,
|
|
33
|
+
)
|
|
34
|
+
return concatBytecode(buildPancakeswapNotDeployedErc20Strats.bytecode[chainId]!, inputData)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const notDeployedData = await batchJsonRpc({
|
|
38
|
+
rpc,
|
|
39
|
+
calls: notDeployedCalls,
|
|
40
|
+
outputTypeAbi: buildPancakeswapNotDeployedErc20Strats.outputTypeHr[chainId],
|
|
41
|
+
callsKey: `strategies/pancakeswap/fetch/getPancakeNotDeployed.ts: notDeployedData - chainId ${chainId} - rpc ${rpc}`,
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
const pricesToFetch = notDeployedData
|
|
45
|
+
.flatMap((d) => {
|
|
46
|
+
if (d.lpToken._address === zeroAddress || deployedLp.includes(d.lpToken._address)) return undefined
|
|
47
|
+
|
|
48
|
+
return d.coins.map((c) => {
|
|
49
|
+
const coinPrice = basePrices.find((bp) => equalTlc(bp.address, c._address))?.usdPrice || 0
|
|
50
|
+
return coinPrice === 0 ? { address: c._address, symbol: bytes32ToString(c._symbol) } : undefined
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
.filter(Boolean)
|
|
54
|
+
const prices = await mergePrices(basePrices, pricesToFetch, chainId)
|
|
55
|
+
|
|
56
|
+
const cake = tokenWithId('cake', chainId)!
|
|
57
|
+
const cakeReward = { name: cake.name, symbol: cake.symbol, address: cake.address, decimals: cake.decimals }
|
|
58
|
+
const cakePriceUsd = prices.find((p) => equalTlc(p.address, cake.address))?.usdPrice || 0
|
|
59
|
+
|
|
60
|
+
// TODO type
|
|
61
|
+
const notDeployed: any[] = notDeployedData
|
|
62
|
+
.map((d) => {
|
|
63
|
+
if (d.lpToken._address === zeroAddress || deployedLp.includes(d.lpToken._address)) return undefined
|
|
64
|
+
|
|
65
|
+
const coins = d.coins.map((c) => ({
|
|
66
|
+
name: bytes32ToString(c._name),
|
|
67
|
+
symbol: bytes32ToString(c._symbol),
|
|
68
|
+
address: c._address,
|
|
69
|
+
decimals: Number(c._decimals),
|
|
70
|
+
}))
|
|
71
|
+
|
|
72
|
+
const lpName = bytes32ToString(d.lpToken._name)
|
|
73
|
+
const isStable = lpName.includes('StableSwap')
|
|
74
|
+
const isMetapool = coins.some((c) => c.name.includes(' LPs'))
|
|
75
|
+
const lpSymbol = `${coins.map((c) => c.symbol).join('-')} ${isStable ? 'Stable LP' : 'LP'}`
|
|
76
|
+
|
|
77
|
+
const lpToken = {
|
|
78
|
+
name: lpName,
|
|
79
|
+
symbol: lpSymbol,
|
|
80
|
+
address: d.lpToken._address,
|
|
81
|
+
decimals: Number(d.lpToken._decimals),
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const token0PriceInUsd = prices.find((p) => equalTlc(p.address, coins[0]!.address))?.usdPrice || 0
|
|
85
|
+
const token1PriceInUsd = prices.find((p) => equalTlc(p.address, coins[1]!.address))?.usdPrice || 0
|
|
86
|
+
|
|
87
|
+
const lpPriceInUsd =
|
|
88
|
+
Number(formatUnits(d.token0PerShare, coins[0].decimals)) * token0PriceInUsd +
|
|
89
|
+
Number(formatUnits(d.token1PerShare, coins[1].decimals)) * token1PriceInUsd
|
|
90
|
+
|
|
91
|
+
const tvl = lpPriceInUsd * Number(formatUnits(d.sharesTotalSupply, 18))
|
|
92
|
+
|
|
93
|
+
let tradingApy = Number(feesApr[lpToken.address.toLowerCase()]?.apr7d || 0)
|
|
94
|
+
if (!tradingApy && managerFees[d.pool.toLowerCase()]) {
|
|
95
|
+
const feesData = managerFees[d.pool.toLowerCase()]
|
|
96
|
+
tradingApy = feesData
|
|
97
|
+
? ((Number(formatUnits(feesData.token0, coins[0].decimals)) * token0PriceInUsd +
|
|
98
|
+
Number(formatUnits(feesData.token1, coins[1].decimals)) * token1PriceInUsd) /
|
|
99
|
+
tvl) *
|
|
100
|
+
365 *
|
|
101
|
+
100
|
|
102
|
+
: 0
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const boost = d.manager === 'pancakeswap' ? 2.5 : 3 // Pancake max boost is 2.5, managers farm is 3
|
|
106
|
+
|
|
107
|
+
const rewardPerYear = cakePriceUsd * Number(formatUnits(d.rewardPerSecond, 18)) * ONE_YEAR
|
|
108
|
+
const stakedTvl = lpPriceInUsd * Number(formatUnits(d.stakedInGauge, 18))
|
|
109
|
+
|
|
110
|
+
const minApr = (rewardPerYear / (stakedTvl > 0 ? stakedTvl : tvl)) * ((100 - STRAT_FEES + 0.5) / 100)
|
|
111
|
+
const maxApr = minApr * boost
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
key: `${d.manager.toLowerCase()}-${coins.map((c) => c.symbol.toLowerCase()).join('-')}`,
|
|
115
|
+
protocol: 'pancakeswap',
|
|
116
|
+
chainId,
|
|
117
|
+
isMetapool,
|
|
118
|
+
isStable,
|
|
119
|
+
manager: d.manager,
|
|
120
|
+
pool: d.pool,
|
|
121
|
+
gaugeAddress: d.gagaugeAddressuge,
|
|
122
|
+
lpToken,
|
|
123
|
+
coins,
|
|
124
|
+
minApr,
|
|
125
|
+
maxApr,
|
|
126
|
+
rewards: [cakeReward],
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
.filter(Boolean)
|
|
130
|
+
|
|
131
|
+
return notDeployed
|
|
132
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { chunk } from 'lodash-es'
|
|
2
|
+
import { encodeAbiParameters, formatUnits, parseAbiParameters } from 'viem'
|
|
3
|
+
|
|
4
|
+
import { batchPancakeSwapPositions, batchPancakeSwapStrats } from '../../../bytecodes/index.js'
|
|
5
|
+
|
|
6
|
+
import { getFarmApr } from './pancakeswapMath.js'
|
|
7
|
+
|
|
8
|
+
import { STRAT_FEES, contracts, tokenWithId } from '@stake-dao/constants'
|
|
9
|
+
import { buildPancakeSwapStrategies, concatBytecode } from '../../../index.js'
|
|
10
|
+
import { type Price, mergePrices } from '../../../prices.js'
|
|
11
|
+
import { batchJsonRpc, equalTlc } from '../../../utils.js'
|
|
12
|
+
import type { PancakeSwapGlobalData } from '../../types.js'
|
|
13
|
+
import { getAprBreakdown } from '../../utils/getAprBreakdown.js'
|
|
14
|
+
import { computePositionData } from './pancakePositions.js'
|
|
15
|
+
|
|
16
|
+
// NOTE: Need to include mainnet SDT price and sdCAKE in prices args
|
|
17
|
+
export const getPancakeV3Vaults = async (
|
|
18
|
+
rpc: string,
|
|
19
|
+
chainId: number,
|
|
20
|
+
basePrices: Price[],
|
|
21
|
+
feesApr: any,
|
|
22
|
+
stakedTVLS: any,
|
|
23
|
+
) => {
|
|
24
|
+
const pools = await buildPancakeSwapStrategies(rpc, chainId)
|
|
25
|
+
const poolInfos = pools.map((p) => ({ pid: p.poolId, pool: p.pool }))
|
|
26
|
+
|
|
27
|
+
const poolInfosInputArgsChunks = chunk(poolInfos, 20)
|
|
28
|
+
const poolInfosCalls = poolInfosInputArgsChunks.map((inputArgs) => {
|
|
29
|
+
const inputData = encodeAbiParameters(parseAbiParameters(batchPancakeSwapStrats.inputType[chainId]!) as any, [
|
|
30
|
+
contracts.pancakeMasterchef![chainId],
|
|
31
|
+
inputArgs,
|
|
32
|
+
])
|
|
33
|
+
return concatBytecode(batchPancakeSwapStrats.bytecode[chainId]!, inputData)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
const decodedPromise = await batchJsonRpc({
|
|
37
|
+
rpc,
|
|
38
|
+
calls: poolInfosCalls,
|
|
39
|
+
outputTypeAbi: batchPancakeSwapStrats.outputTypeHr[chainId]!,
|
|
40
|
+
callsKey: `strategies/pancakeswap/fetch/getPancakeV3Vaults.ts: getPancakeV3Vaults - chainId ${chainId} - rpc ${rpc}`,
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const positionsInputData = encodeAbiParameters(
|
|
44
|
+
parseAbiParameters(batchPancakeSwapPositions.inputType[chainId]!) as any,
|
|
45
|
+
[contracts.pancakeMasterchef![chainId], contracts.cakeStrategy![chainId], contracts.cakeLocker![chainId]],
|
|
46
|
+
)
|
|
47
|
+
const positionsCalls = concatBytecode(batchPancakeSwapPositions.bytecode[chainId]!, positionsInputData)
|
|
48
|
+
|
|
49
|
+
const positionsData = await batchJsonRpc({
|
|
50
|
+
rpc,
|
|
51
|
+
calls: [positionsCalls],
|
|
52
|
+
outputTypeAbi: batchPancakeSwapPositions.outputTypeHr[chainId]!,
|
|
53
|
+
callsKey: `strategies/pancakeswap/fetch/getPancakeV3Vaults.ts: positionsData - chainId ${chainId} - rpc ${rpc}`,
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const pricesToFetch = pools
|
|
57
|
+
.flatMap((p) =>
|
|
58
|
+
p.coins.map((c) => {
|
|
59
|
+
const coinPrice = basePrices.find((bp) => equalTlc(bp.address, c.address))?.usdPrice || 0
|
|
60
|
+
return coinPrice === 0 ? { address: c.address, symbol: c.symbol } : undefined
|
|
61
|
+
}),
|
|
62
|
+
)
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
const prices = await mergePrices(basePrices, pricesToFetch, chainId)
|
|
65
|
+
|
|
66
|
+
const cake = tokenWithId('cake', chainId)!
|
|
67
|
+
const cakePriceUsd = prices.find((p) => equalTlc(p.address, cake.address))?.usdPrice || 0
|
|
68
|
+
|
|
69
|
+
const global: PancakeSwapGlobalData = {
|
|
70
|
+
totalAllocPoint: '0',
|
|
71
|
+
inflationRate: '0',
|
|
72
|
+
fees: {
|
|
73
|
+
veSdt: 0,
|
|
74
|
+
perf: 0,
|
|
75
|
+
accumulator: 0,
|
|
76
|
+
claimer: 0,
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// TODO stratsData type
|
|
81
|
+
let stratsData: any[] = []
|
|
82
|
+
|
|
83
|
+
decodedPromise.forEach((d, index) => {
|
|
84
|
+
if (index === 0) {
|
|
85
|
+
global.totalAllocPoint = formatUnits(d.totalAllocPoint, 0)
|
|
86
|
+
global.inflationRate = formatUnits(d.inflationRate, 30)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
for (const stratData of d.pancakeSwapStratsData) {
|
|
90
|
+
const stratParsedData = {
|
|
91
|
+
poolId: Number(stratData.id),
|
|
92
|
+
allocPoint: Number(stratData.allocPoint),
|
|
93
|
+
tick: stratData.tick,
|
|
94
|
+
sqrtPriceX96: stratData.sqrtPriceX96.toString(),
|
|
95
|
+
totalLiquidity: stratData.totalLiquidity.toString(),
|
|
96
|
+
totalBoostLiquidity: stratData.totalBoostLiquidity.toString(),
|
|
97
|
+
poolLiquidity: stratData.poolLiquidity.toString(),
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const strat = pools.find((p) => p.poolId === stratParsedData.poolId)
|
|
101
|
+
|
|
102
|
+
const token0PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[0]!.address))?.usdPrice || 0
|
|
103
|
+
const token1PriceInUsd = prices.find((p) => equalTlc(p.address, strat.coins[1]!.address))?.usdPrice || 0
|
|
104
|
+
|
|
105
|
+
let tvl = 0
|
|
106
|
+
let boost = 2
|
|
107
|
+
const poolPositionData = positionsData.filter((p) => Number(p.pid) === strat.poolId)
|
|
108
|
+
const fees24H = ((feesApr[strat.pool.toLowerCase()]?.volumeUSD24h || 0) * strat.fee) / 10000
|
|
109
|
+
|
|
110
|
+
const positions = poolPositionData.map((p) => {
|
|
111
|
+
const computedPositionData = computePositionData(
|
|
112
|
+
strat,
|
|
113
|
+
p,
|
|
114
|
+
stratParsedData,
|
|
115
|
+
fees24H,
|
|
116
|
+
prices,
|
|
117
|
+
token0PriceInUsd,
|
|
118
|
+
token1PriceInUsd,
|
|
119
|
+
global.totalAllocPoint,
|
|
120
|
+
global.inflationRate,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
tvl += computedPositionData.tvlToAdd
|
|
124
|
+
boost = computedPositionData.boost
|
|
125
|
+
|
|
126
|
+
return computedPositionData.positionData
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
const protocolTvlData = stakedTVLS[strat.pool]
|
|
130
|
+
const protocolTvl = protocolTvlData
|
|
131
|
+
? Number(protocolTvlData.token0) * token0PriceInUsd + Number(protocolTvlData.token1) * token1PriceInUsd
|
|
132
|
+
: 0
|
|
133
|
+
|
|
134
|
+
const farmApr =
|
|
135
|
+
getFarmApr({
|
|
136
|
+
tvlUsd: protocolTvl,
|
|
137
|
+
cakePriceUsd,
|
|
138
|
+
cakePerSecond: Number(global.inflationRate),
|
|
139
|
+
poolWeight: stratParsedData.allocPoint / Number(global.totalAllocPoint),
|
|
140
|
+
}) *
|
|
141
|
+
((100 - STRAT_FEES + 0.5) / 100) // +0.5 because no harvest fee on v3 pools
|
|
142
|
+
|
|
143
|
+
const rewards = [
|
|
144
|
+
{
|
|
145
|
+
token: strat.rewards[0],
|
|
146
|
+
apr: farmApr * boost,
|
|
147
|
+
price: cakePriceUsd,
|
|
148
|
+
streaming: true,
|
|
149
|
+
periodFinish: 0,
|
|
150
|
+
rate: '0',
|
|
151
|
+
lastUpdate: '0',
|
|
152
|
+
claimablePendingRewards: '0',
|
|
153
|
+
},
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
const tradingApy = Number(feesApr[strat.pool.toLowerCase()]?.apr7d || 0)
|
|
157
|
+
const apr = getAprBreakdown({ ...strat, tradingApy }, rewards, boost, undefined)
|
|
158
|
+
|
|
159
|
+
const parsedData = {
|
|
160
|
+
key: strat.key,
|
|
161
|
+
name: strat.coins.reduce((res: string, current) => `${res}/${current.symbol}`, '').slice(1),
|
|
162
|
+
subname: 'v3',
|
|
163
|
+
protocol: strat.protocol,
|
|
164
|
+
version: '3',
|
|
165
|
+
chainId: strat.chainId,
|
|
166
|
+
pool: strat.pool,
|
|
167
|
+
fee: strat.fee,
|
|
168
|
+
coins: strat.coins,
|
|
169
|
+
coinsPrice: [token0PriceInUsd, token1PriceInUsd],
|
|
170
|
+
tvl,
|
|
171
|
+
apr: { ...apr, boost },
|
|
172
|
+
rewards,
|
|
173
|
+
// Positions
|
|
174
|
+
positions,
|
|
175
|
+
// Base APR data
|
|
176
|
+
tradingApy,
|
|
177
|
+
gaugesProjectedApr: strat.gaugesProjectedApr,
|
|
178
|
+
minApr: farmApr,
|
|
179
|
+
maxApr: farmApr * 2,
|
|
180
|
+
// Raw data
|
|
181
|
+
tick: Number(stratParsedData.tick),
|
|
182
|
+
sqrtPriceX96: stratParsedData.sqrtPriceX96.toString(),
|
|
183
|
+
allocPoint: stratParsedData.allocPoint,
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
stratsData = stratsData.concat(parsedData)
|
|
187
|
+
}
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
return { global, stratsData }
|
|
191
|
+
}
|