@harvest-finance/harvest-strategy-polygon 0.0.1-security → 1.0.0
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.
Potentially problematic release.
This version of @harvest-finance/harvest-strategy-polygon might be problematic. Click here for more details.
- package/README.md +110 -5
- package/contracts/base/Controller.sol +125 -0
- package/contracts/base/ControllerV2.sol +363 -0
- package/contracts/base/FeeRewardForwarder.sol +163 -0
- package/contracts/base/PotPool.sol +360 -0
- package/contracts/base/ProfitSharingReceiver.sol +39 -0
- package/contracts/base/RewardForwarderV2.sol +109 -0
- package/contracts/base/Vault.sol +344 -0
- package/contracts/base/VaultERC4626.sol +113 -0
- package/contracts/base/VaultProxy.sol +35 -0
- package/contracts/base/VaultStorage.sol +199 -0
- package/contracts/base/VaultStorageV2.sol +196 -0
- package/contracts/base/VaultV2.sol +369 -0
- package/contracts/base/ape-base/MiniApeV2Strategy.sol +322 -0
- package/contracts/base/ape-base/interface/IMiniChefV2.sol +31 -0
- package/contracts/base/ape-base/interface/IRewarder.sol +10 -0
- package/contracts/base/factory/MegaFactory.sol +120 -0
- package/contracts/base/factory/interface/IPoolFactory.sol +6 -0
- package/contracts/base/factory/interface/IStrategyFactory.sol +6 -0
- package/contracts/base/factory/interface/IVaultFactory.sol +7 -0
- package/contracts/base/factory/pool/PotPoolFactory.sol +43 -0
- package/contracts/base/factory/strategy/UpgradableStrategyFactory.sol +19 -0
- package/contracts/base/factory/vault/RegularVaultFactory.sol +34 -0
- package/contracts/base/incentives/GlobalIncentivesHelper.sol +167 -0
- package/contracts/base/incentives/NotifyHelperGeneric.sol +61 -0
- package/contracts/base/incentives/NotifyHelperStateful.sol +290 -0
- package/contracts/base/inheritance/Controllable.sol +26 -0
- package/contracts/base/inheritance/ControllableInit.sol +31 -0
- package/contracts/base/inheritance/Governable.sol +29 -0
- package/contracts/base/inheritance/GovernableInit.sol +51 -0
- package/contracts/base/inheritance/IUpgradeSource.sol +8 -0
- package/contracts/base/inheritance/OwnableWhitelist.sol +17 -0
- package/contracts/base/inheritance/RewardTokenProfitNotifier.sol +48 -0
- package/contracts/base/inheritance/Storage.sol +36 -0
- package/contracts/base/interface/IController.sol +30 -0
- package/contracts/base/interface/IControllerV2.sol +135 -0
- package/contracts/base/interface/IERC4626.sol +263 -0
- package/contracts/base/interface/IFeeRewardForwarder.sol +9 -0
- package/contracts/base/interface/IProfitSharingReceiver.sol +10 -0
- package/contracts/base/interface/IRewardForwarder.sol +58 -0
- package/contracts/base/interface/IRewardPool.sol +34 -0
- package/contracts/base/interface/IStrategy.sol +25 -0
- package/contracts/base/interface/IUniversalLiquidator.sol +21 -0
- package/contracts/base/interface/IUniversalLiquidatorRegistry.sol +20 -0
- package/contracts/base/interface/IUpgradeSource.sol +8 -0
- package/contracts/base/interface/IVault.sol +35 -0
- package/contracts/base/interface/aave/DataTypes.sol +266 -0
- package/contracts/base/interface/aave/IAToken.sol +37 -0
- package/contracts/base/interface/aave/IPool.sol +13 -0
- package/contracts/base/interface/balancer/Gauge.sol +22 -0
- package/contracts/base/interface/balancer/IBVault.sol +557 -0
- package/contracts/base/interface/balancer/IBalancerMinter.sol +114 -0
- package/contracts/base/interface/balancer/linearPool/ILinearPool.sol +185 -0
- package/contracts/base/interface/balancer/linearPool/ILinearPoolFactory.sol +16 -0
- package/contracts/base/interface/balancer/linearPool/ILinearPoolRebalancer.sol +8 -0
- package/contracts/base/interface/balancer/linearPool/IPoolSwapStructs.sol +57 -0
- package/contracts/base/interface/caviar/ICaviarChef.sol +16 -0
- package/contracts/base/interface/compound/IComet.sol +114 -0
- package/contracts/base/interface/compound/ICometRewards.sol +17 -0
- package/contracts/base/interface/curve/Gauge.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_2token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_2token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_3token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_3token_meta.sol +20 -0
- package/contracts/base/interface/curve/ICurveDeposit_3token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_4token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_4token_meta.sol +20 -0
- package/contracts/base/interface/curve/ICurveDeposit_4token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_5token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_5token_meta.sol +20 -0
- package/contracts/base/interface/curve/ICurveDeposit_5token_underlying.sol +31 -0
- package/contracts/base/interface/curve/ICurveDeposit_6token.sol +25 -0
- package/contracts/base/interface/curve/ICurveDeposit_6token_meta.sol +20 -0
- package/contracts/base/interface/gamma/IClearing.sol +8 -0
- package/contracts/base/interface/gamma/IHypervisor.sol +17 -0
- package/contracts/base/interface/gamma/IStakingRewards.sol +35 -0
- package/contracts/base/interface/gamma/IUniProxy.sol +15 -0
- package/contracts/base/interface/kyber/IDMMExchangeRouter.sol +69 -0
- package/contracts/base/interface/kyber/IDMMFactory.sol +35 -0
- package/contracts/base/interface/kyber/IDMMLiquidityRouter.sol +204 -0
- package/contracts/base/interface/kyber/IDMMPool.sol +42 -0
- package/contracts/base/interface/kyber/IDMMRouter01.sol +12 -0
- package/contracts/base/interface/kyber/IDMMRouter02.sol +55 -0
- package/contracts/base/interface/kyber/IKyberZap.sol +7 -0
- package/contracts/base/interface/merkl/IDistributor.sol +6 -0
- package/contracts/base/interface/morpho/IMetaMorpho.sol +7 -0
- package/contracts/base/interface/pearl/IGauge.sol +13 -0
- package/contracts/base/interface/pearl/IPair.sol +44 -0
- package/contracts/base/interface/pearl/IRouter.sol +305 -0
- package/contracts/base/interface/quickswap/IDragonLair.sol +25 -0
- package/contracts/base/interface/quickswap/IMasterChef.sol +13 -0
- package/contracts/base/interface/uniswap/IUniswapV2Factory.sol +15 -0
- package/contracts/base/interface/uniswap/IUniswapV2Migrator.sol +6 -0
- package/contracts/base/interface/uniswap/IUniswapV2Pair.sol +59 -0
- package/contracts/base/interface/uniswap/IUniswapV2Router01.sol +96 -0
- package/contracts/base/interface/uniswap/IUniswapV2Router02.sol +137 -0
- package/contracts/base/interface/uniswap/IUniswapV3Pool.sol +24 -0
- package/contracts/base/interface/uniswap/IUniswapV3Router.sol +64 -0
- package/contracts/base/interface/uniswap/IWETH.sol +8 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolActions.sol +103 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolDerivedState.sol +40 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolEvents.sol +121 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolImmutables.sol +35 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolOwnerActions.sol +23 -0
- package/contracts/base/interface/uniswap/pool/IUniswapV3PoolState.sol +116 -0
- package/contracts/base/masterchef-base/MasterChefHodlStrategy.sol +240 -0
- package/contracts/base/masterchef-base/MasterChefStrategy.sol +364 -0
- package/contracts/base/masterchef-base/interfaces/IMasterChef.sol +12 -0
- package/contracts/base/migration/vaultMigratable_2JPYv2.sol +87 -0
- package/contracts/base/migration/vaultMigratable_bal2EUR_PAR.sol +121 -0
- package/contracts/base/migration/vaultMigratable_bal2EUR_agEUR.sol +121 -0
- package/contracts/base/migration/vaultMigratable_balMaticX.sol +153 -0
- package/contracts/base/migration/vaultMigratable_balStMatic.sol +153 -0
- package/contracts/base/noop/NoopStrategy.sol +89 -0
- package/contracts/base/noop/NoopStrategyUpgradeable.sol +92 -0
- package/contracts/base/sushi-base/MiniChefV2Strategy.sol +380 -0
- package/contracts/base/sushi-base/interface/IMiniChefV2.sol +31 -0
- package/contracts/base/sushi-base/interface/IRewarder.sol +9 -0
- package/contracts/base/sushi-base/lib/BoringERC20.sol +30 -0
- package/contracts/base/upgradability/Address.sol +33 -0
- package/contracts/base/upgradability/BaseUpgradeabilityProxy.sol +61 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategy.sol +111 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategyStorage.sol +176 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategyStorageV2.sol +290 -0
- package/contracts/base/upgradability/BaseUpgradeableStrategyV2.sol +145 -0
- package/contracts/base/upgradability/IUpgradable.sol +7 -0
- package/contracts/base/upgradability/Proxy.sol +71 -0
- package/contracts/base/upgradability/ReentrancyGuard.sol +57 -0
- package/contracts/base/upgradability/ReentrancyGuardUpgradeable.sol +51 -0
- package/contracts/base/upgradability/StrategyProxy.sol +35 -0
- package/contracts/base/wmatic/WMATIC.sol +8 -0
- package/contracts/strategies/aave/AaveSupplyStrategy.sol +213 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_DAI.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_EURS.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDC.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDCe.sol +23 -0
- package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDT.sol +23 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_BANANA_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_BNB_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_BTC_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_DAI_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_DAI_USDC.sol +37 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_ETH_MATIC.sol +36 -0
- package/contracts/strategies/ape/ApeStrategyMainnet_USDT_MATIC.sol +36 -0
- package/contracts/strategies/aura/AuraStrategy.sol +347 -0
- package/contracts/strategies/aura/AuraStrategyMainnet_jEUR_PAR.sol +30 -0
- package/contracts/strategies/aura/interface/IAuraBaseRewardPool.sol +25 -0
- package/contracts/strategies/aura/interface/IAuraBooster.sol +17 -0
- package/contracts/strategies/aura/interface/IAuraDepositor.sol +7 -0
- package/contracts/strategies/balancer/BalancerStrategyV3.sol +509 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2BRL.sol +39 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2BRLUSD.sol +38 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_PAR.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_PARv2.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_agEUR.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MATIC_USDC_ETH_BAL.sol +32 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MaticX.sol +37 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MaticX_amMatic.sol +38 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_SPHERE_MATIC.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_TNGBL_USDC.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_WBTC_ETH_USDC.sol +32 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_bbamusd.sol +36 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_frxETH.sol +32 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_frxETH_amWETH.sol +35 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stETH.sol +35 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stMatic.sol +36 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stMatic_amMatic.sol +39 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_tetuBal.sol +36 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_wUSDR_USDC.sol +34 -0
- package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_wstETH_amWETH.sol +37 -0
- package/contracts/strategies/balancer/interface/Gauge.sol +26 -0
- package/contracts/strategies/balancer/interface/IBVault.sol +557 -0
- package/contracts/strategies/balancer/interface/IBalanceMinter.sol +114 -0
- package/contracts/strategies/complifi/ComplifiDerivStrategy.sol +381 -0
- package/contracts/strategies/complifi/ComplifiDerivStrategyMainnet_ETH5x.sol +35 -0
- package/contracts/strategies/complifi/ComplifiStrategy.sol +362 -0
- package/contracts/strategies/complifi/ComplifiStrategyMainnet_COMFI_WETH.sol +34 -0
- package/contracts/strategies/complifi/interfaces/ILiquidityMining.sol +13 -0
- package/contracts/strategies/complifi/interfaces/ILiquidityPool.sol +63 -0
- package/contracts/strategies/complifi/interfaces/IProxyActions.sol +10 -0
- package/contracts/strategies/complifi/interfaces/IUSDCVault.sol +55 -0
- package/contracts/strategies/compound/CompoundStrategy.sol +296 -0
- package/contracts/strategies/compound/CompoundStrategyMainnet_USDC.sol +28 -0
- package/contracts/strategies/compound/CompoundStrategyMainnet_USDT.sol +28 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategy.sol +292 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_ETH.sol +27 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_USDC.sol +27 -0
- package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_USDT.sol +27 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_3CRV.sol +40 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_3CRYPTO.sol +37 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_CRV_3CRYPTO copy.sol +37 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_MATIC_3CRYPTO.sol +37 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_USDR.sol +40 -0
- package/contracts/strategies/convex/ConvexStrategyMainnet_aCRV.sol +38 -0
- package/contracts/strategies/convex/base/ConvexStrategy.sol +480 -0
- package/contracts/strategies/convex/interface/IBaseRewardPool.sol +13 -0
- package/contracts/strategies/convex/interface/IBooster.sol +10 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategy.sol +272 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_ETH_USDC.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_ETH_USDT.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_MATIC_USDT.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_TBTC_ETH.sol +25 -0
- package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_WBTC_ETH_w.sol +25 -0
- package/contracts/strategies/genomes/NoopStrategy_GENE_ETH.sol +23 -0
- package/contracts/strategies/genomes/NoopStrategy_GNOME_ETH.sol +23 -0
- package/contracts/strategies/idle/IdleFinanceStrategy.sol +240 -0
- package/contracts/strategies/idle/IdleStrategyDAIMainnet.sol +33 -0
- package/contracts/strategies/idle/IdleStrategyUSDCMainnet.sol +33 -0
- package/contracts/strategies/idle/IdleStrategyWETHMainnet.sol +30 -0
- package/contracts/strategies/idle/interface/IdleToken.sol +58 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3.sol +351 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2CAD.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_EURT.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_EURe.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_PAR.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2JPY.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2JPYv2.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2NZD.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2SGD.sol +34 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jCHF_USDC.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jCHF_WETH.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jEUR_USDC.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jEUR_WETH.sol +35 -0
- package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jGBP_USDC.sol +35 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3.sol +281 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_AUR3_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_AURJUL22_WETH.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN2_4EUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN3_4EUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN4_4EUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTANGLENOV22_2EURagEUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTANGLE_2EURagEUR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTJUL22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMAY22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMIMONOV22_2EURPAR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMIMO_2EURPAR.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTNOV22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTSEP22_USDC.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_QUI_2CAD.sol +27 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_SES_2JPY.sol +28 -0
- package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_agDEN_2EUR.sol +27 -0
- package/contracts/strategies/jarvis/interface/IElysianFields.sol +11 -0
- package/contracts/strategies/jarvis/interface/IKyberFairLaunch.sol +13 -0
- package/contracts/strategies/jarvis/interface/IKyberRewardLocker.sol +9 -0
- package/contracts/strategies/meshswap/MeshswapStrategy.sol +304 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_MESH_oMOOI.sol +30 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_MESH_oZEMIT.sol +30 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_USDC_oUSDC.sol +31 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_USDT_oUSDT.sol +31 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_MESH.sol +27 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_USDC.sol +28 -0
- package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_USDT.sol +28 -0
- package/contracts/strategies/meshswap/interface/IExchange.sol +9 -0
- package/contracts/strategies/meshswap/interface/IRouter.sol +68 -0
- package/contracts/strategies/pearl/CaviarStrategy.sol +244 -0
- package/contracts/strategies/pearl/CaviarStrategyMainnet_CVR.sol +26 -0
- package/contracts/strategies/pearl/PearlHodlStrategy.sol +254 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_CVR_PEARL.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_DAI_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_ETH_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_MATIC_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_PEARL_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_STAR_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_TNGBL_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_USDC_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_USDT_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_WBTC_USDR.sol +27 -0
- package/contracts/strategies/pearl/PearlHodlStrategyMainnet_wUSDR_USDR.sol +27 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategy.sol +400 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_ETH_narrow.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_ETH_wide.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_USDC_narrow.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_USDC_wide.sol +31 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_USDC_ETH_narrow.sol +34 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_USDC_ETH_wide.sol +34 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2.sol +348 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_USDC_DAI.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_USDC_USDT.sol +29 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_WBTC_ETH_narrow.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_WBTC_USDC_narrow.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_cbETH_ETH.sol +28 -0
- package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_wstETH_ETH.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategy.sol +312 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_DAI.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_USDT.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_WETH.sol +28 -0
- package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_WMATIC_USDC.sol +28 -0
- package/contracts/strategies/yel/YelStrategy.sol +350 -0
- package/contracts/strategies/yel/YelStrategyMainnet_YEL_WETH.sol +29 -0
- package/hardhat.config.js +58 -0
- package/index.js +42 -0
- package/package.json +56 -6
- package/scripts/01-deploy-vault-regular-with-upgradable-strategy.js +41 -0
- package/scripts/02-deploy-vault-regular.js +35 -0
- package/scripts/03-deploy-upgradable-strategy.js +34 -0
- package/scripts/04-deploy-new-implementation.js +24 -0
- package/scripts/README.md +55 -0
- package/scripts/utils.js +42 -0
- package/test/aave/dai.js +207 -0
- package/test/aave/eurs.js +207 -0
- package/test/aave/usdc.js +206 -0
- package/test/aave/usdce.js +206 -0
- package/test/aave/usdt.js +206 -0
- package/test/ape/banana-matic.js +157 -0
- package/test/ape/bnb-matic.js +159 -0
- package/test/ape/btc-matic.js +159 -0
- package/test/ape/dai-matic.js +159 -0
- package/test/ape/dai-usdc.js +163 -0
- package/test/ape/eth-matic.js +158 -0
- package/test/ape/usdt-matic.js +159 -0
- package/test/aura/jeur-par.js +135 -0
- package/test/balancer/2brl_v3.js +123 -0
- package/test/balancer/2brlusd_v3.js +123 -0
- package/test/balancer/2eur_ageur.js +141 -0
- package/test/balancer/2eur_par.js +141 -0
- package/test/balancer/2eur_par_v2.js +123 -0
- package/test/balancer/bbamusd_v3.js +124 -0
- package/test/balancer/btc.js +131 -0
- package/test/balancer/frxETH.js +123 -0
- package/test/balancer/frxeth_amweth.js +123 -0
- package/test/balancer/matic_usdc_eth_bal.js +123 -0
- package/test/balancer/maticx_ammatic.js +123 -0
- package/test/balancer/maticx_v2.js +120 -0
- package/test/balancer/maticx_v3.js +141 -0
- package/test/balancer/polybase.js +131 -0
- package/test/balancer/polybase_v2.js +121 -0
- package/test/balancer/polydefi.js +131 -0
- package/test/balancer/polydefi2.js +131 -0
- package/test/balancer/qipool.js +136 -0
- package/test/balancer/sphere_matic.js +123 -0
- package/test/balancer/stETH.js +123 -0
- package/test/balancer/stable.js +131 -0
- package/test/balancer/stable_v2.js +121 -0
- package/test/balancer/stmatic_ammatic.js +123 -0
- package/test/balancer/stmatic_v2.js +120 -0
- package/test/balancer/stmatic_v3.js +141 -0
- package/test/balancer/tetubal_v3.js +123 -0
- package/test/balancer/tngbl_usdc.js +123 -0
- package/test/balancer/tricrypto.js +131 -0
- package/test/balancer/tusd_stable.js +142 -0
- package/test/balancer/usdc_weth.js +136 -0
- package/test/balancer/usdc_weth_v2.js +123 -0
- package/test/balancer/wbtc_eth_usdc.js +123 -0
- package/test/balancer/wbtc_weth.js +136 -0
- package/test/balancer/wsteth_amweth.js +123 -0
- package/test/balancer/wusdr_usdc.js +123 -0
- package/test/compound/usdc.js +127 -0
- package/test/compound/usdt.js +129 -0
- package/test/compound-blue/eth.js +136 -0
- package/test/compound-blue/usdc.js +136 -0
- package/test/compound-blue/usdt.js +136 -0
- package/test/convex/3crv.js +123 -0
- package/test/convex/3crypto.js +123 -0
- package/test/convex/acrv.js +123 -0
- package/test/convex/crv_3crypto.js +123 -0
- package/test/convex/matic_3crypto.js +123 -0
- package/test/convex/usdr.js +123 -0
- package/test/core/emission-fork.js +197 -0
- package/test/core/emission.js +209 -0
- package/test/core/vault_upgrade.js +129 -0
- package/test/curve/aave.js +132 -0
- package/test/curve/atricrypto3.js +135 -0
- package/test/curve/eurtusd.js +135 -0
- package/test/gamma-merkl/qs-eth-usdc.js +212 -0
- package/test/gamma-merkl/qs-eth-usdt.js +213 -0
- package/test/gamma-merkl/qs-matic-usdt.js +213 -0
- package/test/gamma-merkl/qs-tbtc-eth.js +213 -0
- package/test/gamma-merkl/qs-wbtc-eth-w.js +213 -0
- package/test/genomes/gene-eth.js +115 -0
- package/test/genomes/gnome-eth.js +115 -0
- package/test/idle/dai.js +129 -0
- package/test/idle/usdc.js +128 -0
- package/test/idle/weth.js +128 -0
- package/test/jarvis/2cad-hodl.js +183 -0
- package/test/jarvis/2cad-update-nov22.js +182 -0
- package/test/jarvis/2cad-update.js +177 -0
- package/test/jarvis/2cad-update2.js +182 -0
- package/test/jarvis/2cad-update3.js +182 -0
- package/test/jarvis/2eur-ageur-update-nov22.js +182 -0
- package/test/jarvis/2eur-ageur-update.js +182 -0
- package/test/jarvis/2eur-eure-hodl.js +176 -0
- package/test/jarvis/2eur-eurt-hodl.js +176 -0
- package/test/jarvis/2eur-eurt-update-nov22.js +182 -0
- package/test/jarvis/2eur-hodl.js +176 -0
- package/test/jarvis/2eur-par-hodl.js +176 -0
- package/test/jarvis/2eur-par-update-nov22.js +182 -0
- package/test/jarvis/2jpy-hodl.js +244 -0
- package/test/jarvis/2jpy-update-nov22.js +182 -0
- package/test/jarvis/2jpy-update.js +177 -0
- package/test/jarvis/2jpy-update2.js +182 -0
- package/test/jarvis/2jpyv2-upgrade.js +184 -0
- package/test/jarvis/2nzd-hodl.js +176 -0
- package/test/jarvis/2nzd-update.js +182 -0
- package/test/jarvis/2sgd-hodl.js +176 -0
- package/test/jarvis/2sgd-update-nov22.js +182 -0
- package/test/jarvis/2sgd-update.js +182 -0
- package/test/jarvis/2sgd-update2.js +182 -0
- package/test/jarvis/4eur-hodl-upgrade.js +177 -0
- package/test/jarvis/4eur-hodl.js +183 -0
- package/test/jarvis/4eur-update.js +181 -0
- package/test/jarvis/4eur-update2.js +181 -0
- package/test/jarvis/agden-2eur.js +222 -0
- package/test/jarvis/aur-usdc-v2.js +115 -0
- package/test/jarvis/aur-usdc.js +127 -0
- package/test/jarvis/aur3-usdc.js +115 -0
- package/test/jarvis/aurjul22-weth.js +222 -0
- package/test/jarvis/den-4eur.js +115 -0
- package/test/jarvis/den2-4eur.js +220 -0
- package/test/jarvis/den3-4eur.js +220 -0
- package/test/jarvis/den4-4eur.js +220 -0
- package/test/jarvis/jchf-usdc-hodl-v2.js +184 -0
- package/test/jarvis/jchf-usdc-hodl-v3.js +178 -0
- package/test/jarvis/jchf-usdc-hodl.js +193 -0
- package/test/jarvis/jchf-weth-hodl.js +176 -0
- package/test/jarvis/jeur-usdc-hodl-v2.js +184 -0
- package/test/jarvis/jeur-usdc-hodl-v3.js +178 -0
- package/test/jarvis/jeur-usdc-hodl.js +193 -0
- package/test/jarvis/jeur-weth-hodl.js +176 -0
- package/test/jarvis/jgbp-usdc-hodl-v2.js +184 -0
- package/test/jarvis/jgbp-usdc-hodl-v3.js +178 -0
- package/test/jarvis/jgbp-usdc-hodl.js +193 -0
- package/test/jarvis/jrtangle-2eurageur.js +220 -0
- package/test/jarvis/jrtanglenov22-2eurageur.js +220 -0
- package/test/jarvis/jrtjul22-usdc.js +115 -0
- package/test/jarvis/jrtmay22-usdc.js +115 -0
- package/test/jarvis/jrtmimo-2eurpar.js +220 -0
- package/test/jarvis/jrtmimonov22-2eurpar.js +220 -0
- package/test/jarvis/jrtnov22-usdc.js +220 -0
- package/test/jarvis/jrtsep22-usdc.js +220 -0
- package/test/jarvis/qui-2cad.js +218 -0
- package/test/jarvis/ses-2jpy.js +222 -0
- package/test/meshswap/mesh-omooi.js +197 -0
- package/test/meshswap/mesh-ozemit.js +197 -0
- package/test/meshswap/usdc-ousdc.js +197 -0
- package/test/meshswap/usdt-ousdt.js +197 -0
- package/test/meshswap/wmatic-mesh.js +197 -0
- package/test/meshswap/wmatic-usdc.js +197 -0
- package/test/meshswap/wmatic-usdt.js +197 -0
- package/test/mstable/musd.js +123 -0
- package/test/pearl/cvr-pearl.js +198 -0
- package/test/pearl/cvr.js +133 -0
- package/test/pearl/dai-usdr.js +198 -0
- package/test/pearl/eth-usdr.js +198 -0
- package/test/pearl/matic-usdr.js +198 -0
- package/test/pearl/pearl-usdr.js +198 -0
- package/test/pearl/star-usdr.js +186 -0
- package/test/pearl/tngbl-usdr.js +198 -0
- package/test/pearl/usdc-usdr.js +198 -0
- package/test/pearl/usdt-usdr.js +198 -0
- package/test/pearl/wbtc-usdr.js +198 -0
- package/test/pearl/wusdr-usdr.js +198 -0
- package/test/popsicle/ice-weth.js +128 -0
- package/test/quick/eth-matic.js +132 -0
- package/test/quick/eth-usdt.js +140 -0
- package/test/quick/ifarm-quick.js +147 -0
- package/test/quick/matic-usdc.js +145 -0
- package/test/quick/psp-matic.js +124 -0
- package/test/quick/wbtc-eth.js +145 -0
- package/test/quick-gamma/cbeth-eth.js +207 -0
- package/test/quick-gamma/matic-eth-narrow.js +201 -0
- package/test/quick-gamma/matic-eth-wide.js +197 -0
- package/test/quick-gamma/matic-usdc-narrow.js +197 -0
- package/test/quick-gamma/matic-usdc-wide.js +197 -0
- package/test/quick-gamma/upgrade/matic-eth-narrow.js +204 -0
- package/test/quick-gamma/upgrade/matic-usdc-narrow.js +199 -0
- package/test/quick-gamma/usdc-dai.js +209 -0
- package/test/quick-gamma/usdc-eth-narrow.js +197 -0
- package/test/quick-gamma/usdc-eth-wide.js +197 -0
- package/test/quick-gamma/usdc-usdt.js +209 -0
- package/test/quick-gamma/wbtc-eth-narrow.js +207 -0
- package/test/quick-gamma/wbtc-usdc-narrow.js +209 -0
- package/test/quick-gamma/wsteth-eth.js +207 -0
- package/test/sushi/eth-usdt.js +153 -0
- package/test/sushi/matic-eth.js +138 -0
- package/test/sushi/usdc-eth.js +153 -0
- package/test/test-config.js +24 -0
- package/test/uniswap-gamma/usdc-dai.js +212 -0
- package/test/uniswap-gamma/usdc-usdt.js +212 -0
- package/test/uniswap-gamma/usdc-weth.js +212 -0
- package/test/uniswap-gamma/wmatic-usdc.js +210 -0
- package/test/utilities/Utils.js +96 -0
- package/test/utilities/hh-utils.js +242 -0
- package/test/utilities/make-vault.js +10 -0
- package/test/yel/yel-wmatic.js +129 -0
@@ -0,0 +1,480 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
pragma experimental ABIEncoderV2;
|
4
|
+
|
5
|
+
import "@openzeppelin/contracts/math/Math.sol";
|
6
|
+
import "@openzeppelin/contracts/math/SafeMath.sol";
|
7
|
+
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
|
8
|
+
import "../../../base/upgradability/BaseUpgradeableStrategy.sol";
|
9
|
+
import "../interface/IBooster.sol";
|
10
|
+
import "../interface/IBaseRewardPool.sol";
|
11
|
+
import "../../../base/interface/uniswap/IUniswapV3Router.sol";
|
12
|
+
import "../../../base/interface/curve/ICurveDeposit_2token.sol";
|
13
|
+
import "../../../base/interface/curve/ICurveDeposit_3token_underlying.sol";
|
14
|
+
import "../../../base/interface/curve/ICurveDeposit_3token_meta.sol";
|
15
|
+
import "../../../base/interface/curve/ICurveDeposit_4token.sol";
|
16
|
+
import "../../../base/interface/curve/ICurveDeposit_4token_meta.sol";
|
17
|
+
import "../../../base/interface/curve/ICurveDeposit_5token.sol";
|
18
|
+
import "../../../base/interface/curve/ICurveDeposit_5token_meta.sol";
|
19
|
+
import "../../../base/interface/curve/ICurveDeposit_6token.sol";
|
20
|
+
import "../../../base/interface/curve/ICurveDeposit_6token_meta.sol";
|
21
|
+
import "../../../base/interface/curve/Gauge.sol";
|
22
|
+
|
23
|
+
contract ConvexStrategy is BaseUpgradeableStrategy {
|
24
|
+
using SafeMath for uint256;
|
25
|
+
using SafeERC20 for IERC20;
|
26
|
+
|
27
|
+
address public constant booster = address(0xF403C135812408BFbE8713b5A23a04b3D48AAE31);
|
28
|
+
address public constant weth = address(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619);
|
29
|
+
address public constant uniV3Router = address(0xE592427A0AEce92De3Edee1F18E0157C05861564);
|
30
|
+
|
31
|
+
// additional storage slots (on top of BaseUpgradeableStrategy ones) are defined here
|
32
|
+
bytes32 internal constant _POOLID_SLOT = 0x3fd729bfa2e28b7806b03a6e014729f59477b530f995be4d51defc9dad94810b;
|
33
|
+
bytes32 internal constant _DEPOSIT_TOKEN_SLOT = 0x219270253dbc530471c88a9e7c321b36afda219583431e7b6c386d2d46e70c86;
|
34
|
+
bytes32 internal constant _DEPOSIT_ARRAY_POSITION_SLOT = 0xb7c50ef998211fff3420379d0bf5b8dfb0cee909d1b7d9e517f311c104675b09;
|
35
|
+
bytes32 internal constant _CURVE_DEPOSIT_SLOT = 0xb306bb7adebd5a22f5e4cdf1efa00bc5f62d4f5554ef9d62c1b16327cd3ab5f9;
|
36
|
+
bytes32 internal constant _NTOKENS_SLOT = 0xbb60b35bae256d3c1378ff05e8d7bee588cd800739c720a107471dfa218f74c1;
|
37
|
+
bytes32 internal constant _METAPOOL_SLOT = 0x567ad8b67c826974a167f1a361acbef5639a3e7e02e99edbc648a84b0923d5b7;
|
38
|
+
bytes32 internal constant _FACTORYPOOL_SLOT = 0x500e267ef080ca4b1fe5982fc057193811113b41ddc8ea0538460e8d197f4eb1;
|
39
|
+
|
40
|
+
// this would be reset on each upgrade
|
41
|
+
address[] public WETH2deposit;
|
42
|
+
mapping(address => address[]) public reward2WETH;
|
43
|
+
address[] public rewardTokens;
|
44
|
+
mapping (address => mapping(address => uint24)) public storedPairFee;
|
45
|
+
|
46
|
+
constructor() public BaseUpgradeableStrategy() {
|
47
|
+
assert(_POOLID_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.poolId")) - 1));
|
48
|
+
assert(_DEPOSIT_TOKEN_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.depositToken")) - 1));
|
49
|
+
assert(_DEPOSIT_ARRAY_POSITION_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.depositArrayPosition")) - 1));
|
50
|
+
assert(_CURVE_DEPOSIT_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.curveDeposit")) - 1));
|
51
|
+
assert(_NTOKENS_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.nTokens")) - 1));
|
52
|
+
assert(_METAPOOL_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.metaPool")) - 1));
|
53
|
+
assert(_FACTORYPOOL_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.factoryPool")) - 1));
|
54
|
+
}
|
55
|
+
|
56
|
+
function initializeBaseStrategy(
|
57
|
+
address _storage,
|
58
|
+
address _underlying,
|
59
|
+
address _vault,
|
60
|
+
address _rewardPool,
|
61
|
+
uint256 _poolID,
|
62
|
+
address _depositToken,
|
63
|
+
uint256 _depositArrayPosition,
|
64
|
+
address _curveDeposit,
|
65
|
+
uint256 _nTokens,
|
66
|
+
bool _metaPool,
|
67
|
+
bool _factoryPool
|
68
|
+
) public initializer {
|
69
|
+
|
70
|
+
BaseUpgradeableStrategy.initialize(
|
71
|
+
_storage,
|
72
|
+
_underlying,
|
73
|
+
_vault,
|
74
|
+
_rewardPool,
|
75
|
+
weth,
|
76
|
+
80, // profit sharing numerator
|
77
|
+
1000, // profit sharing denominator
|
78
|
+
true, // sell
|
79
|
+
0, // sell floor
|
80
|
+
12 hours // implementation change delay
|
81
|
+
);
|
82
|
+
|
83
|
+
address _lpt;
|
84
|
+
(_lpt,,,,) = IBooster(booster).poolInfo(_poolID);
|
85
|
+
require(_lpt == underlying(), "Pool Info does not match underlying");
|
86
|
+
require(_depositArrayPosition < _nTokens, "Deposit array position out of bounds");
|
87
|
+
require(1 < _nTokens && _nTokens < 7, "_nTokens should be between 2 and 6");
|
88
|
+
_setDepositArrayPosition(_depositArrayPosition);
|
89
|
+
_setPoolId(_poolID);
|
90
|
+
_setDepositToken(_depositToken);
|
91
|
+
_setCurveDeposit(_curveDeposit);
|
92
|
+
_setNTokens(_nTokens);
|
93
|
+
_setMetaPool(_metaPool);
|
94
|
+
_setFactoryPool(_factoryPool);
|
95
|
+
}
|
96
|
+
|
97
|
+
function depositArbCheck() public pure returns(bool) {
|
98
|
+
return true;
|
99
|
+
}
|
100
|
+
|
101
|
+
function rewardPoolBalance() internal view returns (uint256 bal) {
|
102
|
+
bal = IBaseRewardPool(rewardPool()).balanceOf(address(this));
|
103
|
+
}
|
104
|
+
|
105
|
+
function exitRewardPool() internal {
|
106
|
+
uint256 stakedBalance = rewardPoolBalance();
|
107
|
+
if (stakedBalance != 0) {
|
108
|
+
IBaseRewardPool(rewardPool()).withdrawAll(true);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
function partialWithdrawalRewardPool(uint256 amount) internal {
|
113
|
+
IBaseRewardPool(rewardPool()).withdraw(amount, false); //don't claim rewards at this point
|
114
|
+
}
|
115
|
+
|
116
|
+
function emergencyExitRewardPool() internal {
|
117
|
+
uint256 stakedBalance = rewardPoolBalance();
|
118
|
+
if (stakedBalance != 0) {
|
119
|
+
IBaseRewardPool(rewardPool()).withdrawAll(false); //don't claim rewards
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
function unsalvagableTokens(address token) public view returns (bool) {
|
124
|
+
return (token == rewardToken() || token == underlying());
|
125
|
+
}
|
126
|
+
|
127
|
+
function enterRewardPool() internal {
|
128
|
+
address _underlying = underlying();
|
129
|
+
uint256 entireBalance = IERC20(_underlying).balanceOf(address(this));
|
130
|
+
IERC20(_underlying).safeApprove(booster, 0);
|
131
|
+
IERC20(_underlying).safeApprove(booster, entireBalance);
|
132
|
+
IBooster(booster).depositAll(poolId()); //deposit and stake
|
133
|
+
}
|
134
|
+
|
135
|
+
/*
|
136
|
+
* In case there are some issues discovered about the pool or underlying asset
|
137
|
+
* Governance can exit the pool properly
|
138
|
+
* The function is only used for emergency to exit the pool
|
139
|
+
*/
|
140
|
+
function emergencyExit() public onlyGovernance {
|
141
|
+
emergencyExitRewardPool();
|
142
|
+
_setPausedInvesting(true);
|
143
|
+
}
|
144
|
+
|
145
|
+
/*
|
146
|
+
* Resumes the ability to invest into the underlying reward pools
|
147
|
+
*/
|
148
|
+
|
149
|
+
function continueInvesting() public onlyGovernance {
|
150
|
+
_setPausedInvesting(false);
|
151
|
+
}
|
152
|
+
|
153
|
+
function setDepositLiquidationPath(address [] memory _route) public onlyGovernance {
|
154
|
+
require(_route[0] == weth, "Path should start with WETH");
|
155
|
+
require(_route[_route.length-1] == depositToken(), "Path should end with depositToken");
|
156
|
+
WETH2deposit = _route;
|
157
|
+
}
|
158
|
+
|
159
|
+
function setRewardLiquidationPath(address [] memory _route) public onlyGovernance {
|
160
|
+
require(_route[_route.length-1] == weth, "Path should end with WETH");
|
161
|
+
bool isReward = false;
|
162
|
+
for(uint256 i = 0; i < rewardTokens.length; i++){
|
163
|
+
if (_route[0] == rewardTokens[i]) {
|
164
|
+
isReward = true;
|
165
|
+
}
|
166
|
+
}
|
167
|
+
require(isReward, "Path should start with a rewardToken");
|
168
|
+
reward2WETH[_route[0]] = _route;
|
169
|
+
}
|
170
|
+
|
171
|
+
function addRewardToken(address _token, address[] memory _path2WETH) public onlyGovernance {
|
172
|
+
rewardTokens.push(_token);
|
173
|
+
setRewardLiquidationPath(_path2WETH);
|
174
|
+
}
|
175
|
+
|
176
|
+
function changeDepositToken(address _depositToken, address[] memory _liquidationPath) public onlyGovernance {
|
177
|
+
_setDepositToken(_depositToken);
|
178
|
+
setDepositLiquidationPath(_liquidationPath);
|
179
|
+
}
|
180
|
+
|
181
|
+
function uniV3PairFee(address sellToken, address buyToken) public view returns(uint24 fee) {
|
182
|
+
if(storedPairFee[sellToken][buyToken] != 0) {
|
183
|
+
return storedPairFee[sellToken][buyToken];
|
184
|
+
} else if(storedPairFee[buyToken][sellToken] != 0) {
|
185
|
+
return storedPairFee[buyToken][sellToken];
|
186
|
+
} else {
|
187
|
+
return 3000;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
function setPairFee(address token0, address token1, uint24 fee) public onlyGovernance {
|
192
|
+
storedPairFee[token0][token1] = fee;
|
193
|
+
}
|
194
|
+
|
195
|
+
function uniV3Swap(
|
196
|
+
uint256 amountIn,
|
197
|
+
uint256 minAmountOut,
|
198
|
+
address[] memory pathWithoutFee
|
199
|
+
) internal {
|
200
|
+
address currentSellToken = pathWithoutFee[0];
|
201
|
+
|
202
|
+
IERC20(currentSellToken).safeIncreaseAllowance(uniV3Router, amountIn);
|
203
|
+
|
204
|
+
bytes memory pathWithFee = abi.encodePacked(currentSellToken);
|
205
|
+
for(uint256 i=1; i < pathWithoutFee.length; i++) {
|
206
|
+
address currentBuyToken = pathWithoutFee[i];
|
207
|
+
pathWithFee = abi.encodePacked(
|
208
|
+
pathWithFee,
|
209
|
+
uniV3PairFee(currentSellToken, currentBuyToken),
|
210
|
+
currentBuyToken);
|
211
|
+
currentSellToken = currentBuyToken;
|
212
|
+
}
|
213
|
+
|
214
|
+
IUniswapV3Router.ExactInputParams memory param = IUniswapV3Router.ExactInputParams({
|
215
|
+
path: pathWithFee,
|
216
|
+
recipient: address(this),
|
217
|
+
deadline: block.timestamp,
|
218
|
+
amountIn: amountIn,
|
219
|
+
amountOutMinimum: minAmountOut
|
220
|
+
});
|
221
|
+
|
222
|
+
IUniswapV3Router(uniV3Router).exactInput(param);
|
223
|
+
}
|
224
|
+
|
225
|
+
// We assume that all the tradings can be done on Sushiswap
|
226
|
+
function _liquidateReward() internal {
|
227
|
+
if (!sell()) {
|
228
|
+
// Profits can be disabled for possible simplified and rapoolId exit
|
229
|
+
emit ProfitsNotCollected(sell(), false);
|
230
|
+
return;
|
231
|
+
}
|
232
|
+
|
233
|
+
address _rewardToken = rewardToken();
|
234
|
+
address _depositToken = depositToken();
|
235
|
+
|
236
|
+
for(uint256 i = 0; i < rewardTokens.length; i++){
|
237
|
+
address token = rewardTokens[i];
|
238
|
+
uint256 rewardBalance = IERC20(token).balanceOf(address(this));
|
239
|
+
|
240
|
+
if(reward2WETH[token].length < 2 || rewardBalance < 1e15) {
|
241
|
+
continue;
|
242
|
+
}
|
243
|
+
uniV3Swap(rewardBalance, 1, reward2WETH[token]);
|
244
|
+
}
|
245
|
+
|
246
|
+
uint256 rewardBalance = IERC20(_rewardToken).balanceOf(address(this));
|
247
|
+
notifyProfitInRewardToken(rewardBalance);
|
248
|
+
uint256 remainingRewardBalance = IERC20(_rewardToken).balanceOf(address(this));
|
249
|
+
|
250
|
+
if (remainingRewardBalance == 0) {
|
251
|
+
return;
|
252
|
+
}
|
253
|
+
|
254
|
+
if(_depositToken != _rewardToken) {
|
255
|
+
uniV3Swap(remainingRewardBalance, 1, WETH2deposit);
|
256
|
+
}
|
257
|
+
|
258
|
+
uint256 tokenBalance = IERC20(_depositToken).balanceOf(address(this));
|
259
|
+
if (tokenBalance > 0) {
|
260
|
+
depositCurve();
|
261
|
+
}
|
262
|
+
}
|
263
|
+
|
264
|
+
function depositCurve() internal {
|
265
|
+
address _depositToken = depositToken();
|
266
|
+
address _curveDeposit = curveDeposit();
|
267
|
+
uint256 _nTokens = nTokens();
|
268
|
+
uint256 _depositArrayPosition = depositArrayPosition();
|
269
|
+
bool _metaPool = metaPool();
|
270
|
+
|
271
|
+
uint256 tokenBalance = IERC20(_depositToken).balanceOf(address(this));
|
272
|
+
IERC20(_depositToken).safeApprove(_curveDeposit, 0);
|
273
|
+
IERC20(_depositToken).safeApprove(_curveDeposit, tokenBalance);
|
274
|
+
|
275
|
+
// we can accept 1 as minimum, this will be called only by trusted roles
|
276
|
+
uint256 minimum = 1;
|
277
|
+
if (_nTokens == 2) {
|
278
|
+
uint256[2] memory depositArray;
|
279
|
+
depositArray[_depositArrayPosition] = tokenBalance;
|
280
|
+
ICurveDeposit_2token(_curveDeposit).add_liquidity(depositArray, minimum);
|
281
|
+
} else if (_nTokens == 3) {
|
282
|
+
uint256[3] memory depositArray;
|
283
|
+
depositArray[_depositArrayPosition] = tokenBalance;
|
284
|
+
if (_metaPool) {
|
285
|
+
address pool;
|
286
|
+
if (factoryPool()) {
|
287
|
+
pool = underlying();
|
288
|
+
} else {
|
289
|
+
pool = ICurveLP(underlying()).minter();
|
290
|
+
}
|
291
|
+
ICurveDeposit_3token_meta(_curveDeposit).add_liquidity(pool, depositArray, minimum);
|
292
|
+
} else {
|
293
|
+
ICurveDeposit_3token_underlying(_curveDeposit).add_liquidity(depositArray, minimum, true);
|
294
|
+
}
|
295
|
+
} else if (_nTokens == 4) {
|
296
|
+
uint256[4] memory depositArray;
|
297
|
+
depositArray[_depositArrayPosition] = tokenBalance;
|
298
|
+
if (_metaPool) {
|
299
|
+
address pool;
|
300
|
+
if (factoryPool()) {
|
301
|
+
pool = underlying();
|
302
|
+
} else {
|
303
|
+
pool = ICurveLP(underlying()).minter();
|
304
|
+
}
|
305
|
+
ICurveDeposit_4token_meta(_curveDeposit).add_liquidity(pool, depositArray, minimum);
|
306
|
+
} else {
|
307
|
+
ICurveDeposit_4token(_curveDeposit).add_liquidity(depositArray, minimum);
|
308
|
+
}
|
309
|
+
} else if (_nTokens == 5) {
|
310
|
+
uint256[5] memory depositArray;
|
311
|
+
depositArray[_depositArrayPosition] = tokenBalance;
|
312
|
+
if (_metaPool) {
|
313
|
+
address pool = ICurveLP(underlying()).minter();
|
314
|
+
ICurveDeposit_5token_meta(_curveDeposit).add_liquidity(pool, depositArray, minimum);
|
315
|
+
} else {
|
316
|
+
ICurveDeposit_5token(_curveDeposit).add_liquidity(depositArray, minimum);
|
317
|
+
}
|
318
|
+
} else if (_nTokens == 6) {
|
319
|
+
uint256[6] memory depositArray;
|
320
|
+
depositArray[_depositArrayPosition] = tokenBalance;
|
321
|
+
if (_metaPool) {
|
322
|
+
address pool = ICurveLP(underlying()).minter();
|
323
|
+
ICurveDeposit_6token_meta(_curveDeposit).add_liquidity(pool, depositArray, minimum);
|
324
|
+
} else {
|
325
|
+
ICurveDeposit_6token(_curveDeposit).add_liquidity(depositArray, minimum);
|
326
|
+
}
|
327
|
+
}
|
328
|
+
}
|
329
|
+
|
330
|
+
/*
|
331
|
+
* Stakes everything the strategy holds into the reward pool
|
332
|
+
*/
|
333
|
+
function investAllUnderlying() internal onlyNotPausedInvesting {
|
334
|
+
// this check is needed, because most of the SNX reward pools will revert if
|
335
|
+
// you try to stake(0).
|
336
|
+
if(IERC20(underlying()).balanceOf(address(this)) > 0) {
|
337
|
+
enterRewardPool();
|
338
|
+
}
|
339
|
+
}
|
340
|
+
|
341
|
+
/*
|
342
|
+
* Withdraws all the asset to the vault
|
343
|
+
*/
|
344
|
+
function withdrawAllToVault() public restricted {
|
345
|
+
address _underlying = underlying();
|
346
|
+
if (address(rewardPool()) != address(0)) {
|
347
|
+
exitRewardPool();
|
348
|
+
}
|
349
|
+
_liquidateReward();
|
350
|
+
IERC20(_underlying).safeTransfer(vault(), IERC20(_underlying).balanceOf(address(this)));
|
351
|
+
}
|
352
|
+
|
353
|
+
/*
|
354
|
+
* Withdraws all the asset to the vault
|
355
|
+
*/
|
356
|
+
function withdrawToVault(uint256 amount) public restricted {
|
357
|
+
address _underlying = underlying();
|
358
|
+
// Typically there wouldn't be any amount here
|
359
|
+
// however, it is possible because of the emergencyExit
|
360
|
+
uint256 entireBalance = IERC20(_underlying).balanceOf(address(this));
|
361
|
+
|
362
|
+
if(amount > entireBalance){
|
363
|
+
// While we have the check above, we still using SafeMath below
|
364
|
+
// for the peace of mind (in case something gets changed in between)
|
365
|
+
uint256 needToWithdraw = amount.sub(entireBalance);
|
366
|
+
uint256 toWithdraw = Math.min(rewardPoolBalance(), needToWithdraw);
|
367
|
+
partialWithdrawalRewardPool(toWithdraw);
|
368
|
+
}
|
369
|
+
IERC20(_underlying).safeTransfer(vault(), amount);
|
370
|
+
}
|
371
|
+
|
372
|
+
/*
|
373
|
+
* Note that we currently do not have a mechanism here to include the
|
374
|
+
* amount of reward that is accrued.
|
375
|
+
*/
|
376
|
+
function investedUnderlyingBalance() external view returns (uint256) {
|
377
|
+
return rewardPoolBalance()
|
378
|
+
.add(IERC20(underlying()).balanceOf(address(this)));
|
379
|
+
}
|
380
|
+
|
381
|
+
/*
|
382
|
+
* Governance or Controller can claim coins that are somehow transferred into the contract
|
383
|
+
* Note that they cannot come in take away coins that are used and defined in the strategy itself
|
384
|
+
*/
|
385
|
+
function salvage(address recipient, address token, uint256 amount) external onlyControllerOrGovernance {
|
386
|
+
// To make sure that governance cannot come in and take away the coins
|
387
|
+
require(!unsalvagableTokens(token), "token is defined as not salvagable");
|
388
|
+
IERC20(token).safeTransfer(recipient, amount);
|
389
|
+
}
|
390
|
+
|
391
|
+
/*
|
392
|
+
* Get the reward, sell it in exchange for underlying, invest what you got.
|
393
|
+
* It's not much, but it's honest work.
|
394
|
+
*
|
395
|
+
* Note that although `onlyNotPausedInvesting` is not added here,
|
396
|
+
* calling `investAllUnderlying()` affectively blocks the usage of `doHardWork`
|
397
|
+
* when the investing is being paused by governance.
|
398
|
+
*/
|
399
|
+
function doHardWork() external onlyNotPausedInvesting restricted {
|
400
|
+
IBaseRewardPool(rewardPool()).getReward(address(this));
|
401
|
+
_liquidateReward();
|
402
|
+
investAllUnderlying();
|
403
|
+
}
|
404
|
+
|
405
|
+
/**
|
406
|
+
* Can completely disable claiming UNI rewards and selling. Good for emergency withdraw in the
|
407
|
+
* simplest possible way.
|
408
|
+
*/
|
409
|
+
function setSell(bool s) public onlyGovernance {
|
410
|
+
_setSell(s);
|
411
|
+
}
|
412
|
+
|
413
|
+
/**
|
414
|
+
* Sets the minimum amount of CRV needed to trigger a sale.
|
415
|
+
*/
|
416
|
+
function setSellFloor(uint256 floor) public onlyGovernance {
|
417
|
+
_setSellFloor(floor);
|
418
|
+
}
|
419
|
+
|
420
|
+
// masterchef rewards pool ID
|
421
|
+
function _setPoolId(uint256 _value) internal {
|
422
|
+
setUint256(_POOLID_SLOT, _value);
|
423
|
+
}
|
424
|
+
|
425
|
+
function poolId() public view returns (uint256) {
|
426
|
+
return getUint256(_POOLID_SLOT);
|
427
|
+
}
|
428
|
+
|
429
|
+
function _setDepositToken(address _address) internal {
|
430
|
+
setAddress(_DEPOSIT_TOKEN_SLOT, _address);
|
431
|
+
}
|
432
|
+
|
433
|
+
function depositToken() public view returns (address) {
|
434
|
+
return getAddress(_DEPOSIT_TOKEN_SLOT);
|
435
|
+
}
|
436
|
+
|
437
|
+
function _setDepositArrayPosition(uint256 _value) internal {
|
438
|
+
setUint256(_DEPOSIT_ARRAY_POSITION_SLOT, _value);
|
439
|
+
}
|
440
|
+
|
441
|
+
function depositArrayPosition() public view returns (uint256) {
|
442
|
+
return getUint256(_DEPOSIT_ARRAY_POSITION_SLOT);
|
443
|
+
}
|
444
|
+
|
445
|
+
function _setCurveDeposit(address _address) internal {
|
446
|
+
setAddress(_CURVE_DEPOSIT_SLOT, _address);
|
447
|
+
}
|
448
|
+
|
449
|
+
function curveDeposit() public view returns (address) {
|
450
|
+
return getAddress(_CURVE_DEPOSIT_SLOT);
|
451
|
+
}
|
452
|
+
|
453
|
+
function _setNTokens(uint256 _value) internal {
|
454
|
+
setUint256(_NTOKENS_SLOT, _value);
|
455
|
+
}
|
456
|
+
|
457
|
+
function nTokens() public view returns (uint256) {
|
458
|
+
return getUint256(_NTOKENS_SLOT);
|
459
|
+
}
|
460
|
+
|
461
|
+
function _setMetaPool(bool _value) internal {
|
462
|
+
setBoolean(_METAPOOL_SLOT, _value);
|
463
|
+
}
|
464
|
+
|
465
|
+
function metaPool() public view returns (bool) {
|
466
|
+
return getBoolean(_METAPOOL_SLOT);
|
467
|
+
}
|
468
|
+
|
469
|
+
function _setFactoryPool(bool _value) internal {
|
470
|
+
setBoolean(_FACTORYPOOL_SLOT, _value);
|
471
|
+
}
|
472
|
+
|
473
|
+
function factoryPool() public view returns (bool) {
|
474
|
+
return getBoolean(_FACTORYPOOL_SLOT);
|
475
|
+
}
|
476
|
+
|
477
|
+
function finalizeUpgrade() external onlyGovernance {
|
478
|
+
_finalizeUpgrade();
|
479
|
+
}
|
480
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
interface IBaseRewardPool {
|
5
|
+
function balanceOf(address account) external view returns(uint256 amount);
|
6
|
+
function pid() external view returns (uint256 _pid);
|
7
|
+
function stakingToken() external view returns (address _stakingToken);
|
8
|
+
function getReward(address account) external;
|
9
|
+
function stake(uint256 _amount) external;
|
10
|
+
function stakeAll() external;
|
11
|
+
function withdraw(uint256 amount, bool claim) external;
|
12
|
+
function withdrawAll(bool claim) external;
|
13
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
//SPDX-License-Identifier: Unlicense
|
2
|
+
pragma solidity 0.6.12;
|
3
|
+
|
4
|
+
interface IBooster {
|
5
|
+
function deposit(uint256 _pid, uint256 _amount, bool _stake) external;
|
6
|
+
function depositAll(uint256 _pid) external;
|
7
|
+
function withdrawTo(uint256 _pid, uint256 _amount, address _to) external;
|
8
|
+
function poolInfo(uint256 _pid) external view returns (address lpToken, address, address, bool, address);
|
9
|
+
function earmarkRewards(uint256 _pid) external;
|
10
|
+
}
|