@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.

Files changed (485) hide show
  1. package/README.md +110 -5
  2. package/contracts/base/Controller.sol +125 -0
  3. package/contracts/base/ControllerV2.sol +363 -0
  4. package/contracts/base/FeeRewardForwarder.sol +163 -0
  5. package/contracts/base/PotPool.sol +360 -0
  6. package/contracts/base/ProfitSharingReceiver.sol +39 -0
  7. package/contracts/base/RewardForwarderV2.sol +109 -0
  8. package/contracts/base/Vault.sol +344 -0
  9. package/contracts/base/VaultERC4626.sol +113 -0
  10. package/contracts/base/VaultProxy.sol +35 -0
  11. package/contracts/base/VaultStorage.sol +199 -0
  12. package/contracts/base/VaultStorageV2.sol +196 -0
  13. package/contracts/base/VaultV2.sol +369 -0
  14. package/contracts/base/ape-base/MiniApeV2Strategy.sol +322 -0
  15. package/contracts/base/ape-base/interface/IMiniChefV2.sol +31 -0
  16. package/contracts/base/ape-base/interface/IRewarder.sol +10 -0
  17. package/contracts/base/factory/MegaFactory.sol +120 -0
  18. package/contracts/base/factory/interface/IPoolFactory.sol +6 -0
  19. package/contracts/base/factory/interface/IStrategyFactory.sol +6 -0
  20. package/contracts/base/factory/interface/IVaultFactory.sol +7 -0
  21. package/contracts/base/factory/pool/PotPoolFactory.sol +43 -0
  22. package/contracts/base/factory/strategy/UpgradableStrategyFactory.sol +19 -0
  23. package/contracts/base/factory/vault/RegularVaultFactory.sol +34 -0
  24. package/contracts/base/incentives/GlobalIncentivesHelper.sol +167 -0
  25. package/contracts/base/incentives/NotifyHelperGeneric.sol +61 -0
  26. package/contracts/base/incentives/NotifyHelperStateful.sol +290 -0
  27. package/contracts/base/inheritance/Controllable.sol +26 -0
  28. package/contracts/base/inheritance/ControllableInit.sol +31 -0
  29. package/contracts/base/inheritance/Governable.sol +29 -0
  30. package/contracts/base/inheritance/GovernableInit.sol +51 -0
  31. package/contracts/base/inheritance/IUpgradeSource.sol +8 -0
  32. package/contracts/base/inheritance/OwnableWhitelist.sol +17 -0
  33. package/contracts/base/inheritance/RewardTokenProfitNotifier.sol +48 -0
  34. package/contracts/base/inheritance/Storage.sol +36 -0
  35. package/contracts/base/interface/IController.sol +30 -0
  36. package/contracts/base/interface/IControllerV2.sol +135 -0
  37. package/contracts/base/interface/IERC4626.sol +263 -0
  38. package/contracts/base/interface/IFeeRewardForwarder.sol +9 -0
  39. package/contracts/base/interface/IProfitSharingReceiver.sol +10 -0
  40. package/contracts/base/interface/IRewardForwarder.sol +58 -0
  41. package/contracts/base/interface/IRewardPool.sol +34 -0
  42. package/contracts/base/interface/IStrategy.sol +25 -0
  43. package/contracts/base/interface/IUniversalLiquidator.sol +21 -0
  44. package/contracts/base/interface/IUniversalLiquidatorRegistry.sol +20 -0
  45. package/contracts/base/interface/IUpgradeSource.sol +8 -0
  46. package/contracts/base/interface/IVault.sol +35 -0
  47. package/contracts/base/interface/aave/DataTypes.sol +266 -0
  48. package/contracts/base/interface/aave/IAToken.sol +37 -0
  49. package/contracts/base/interface/aave/IPool.sol +13 -0
  50. package/contracts/base/interface/balancer/Gauge.sol +22 -0
  51. package/contracts/base/interface/balancer/IBVault.sol +557 -0
  52. package/contracts/base/interface/balancer/IBalancerMinter.sol +114 -0
  53. package/contracts/base/interface/balancer/linearPool/ILinearPool.sol +185 -0
  54. package/contracts/base/interface/balancer/linearPool/ILinearPoolFactory.sol +16 -0
  55. package/contracts/base/interface/balancer/linearPool/ILinearPoolRebalancer.sol +8 -0
  56. package/contracts/base/interface/balancer/linearPool/IPoolSwapStructs.sol +57 -0
  57. package/contracts/base/interface/caviar/ICaviarChef.sol +16 -0
  58. package/contracts/base/interface/compound/IComet.sol +114 -0
  59. package/contracts/base/interface/compound/ICometRewards.sol +17 -0
  60. package/contracts/base/interface/curve/Gauge.sol +25 -0
  61. package/contracts/base/interface/curve/ICurveDeposit_2token.sol +25 -0
  62. package/contracts/base/interface/curve/ICurveDeposit_2token_underlying.sol +31 -0
  63. package/contracts/base/interface/curve/ICurveDeposit_3token.sol +25 -0
  64. package/contracts/base/interface/curve/ICurveDeposit_3token_meta.sol +20 -0
  65. package/contracts/base/interface/curve/ICurveDeposit_3token_underlying.sol +31 -0
  66. package/contracts/base/interface/curve/ICurveDeposit_4token.sol +25 -0
  67. package/contracts/base/interface/curve/ICurveDeposit_4token_meta.sol +20 -0
  68. package/contracts/base/interface/curve/ICurveDeposit_4token_underlying.sol +31 -0
  69. package/contracts/base/interface/curve/ICurveDeposit_5token.sol +25 -0
  70. package/contracts/base/interface/curve/ICurveDeposit_5token_meta.sol +20 -0
  71. package/contracts/base/interface/curve/ICurveDeposit_5token_underlying.sol +31 -0
  72. package/contracts/base/interface/curve/ICurveDeposit_6token.sol +25 -0
  73. package/contracts/base/interface/curve/ICurveDeposit_6token_meta.sol +20 -0
  74. package/contracts/base/interface/gamma/IClearing.sol +8 -0
  75. package/contracts/base/interface/gamma/IHypervisor.sol +17 -0
  76. package/contracts/base/interface/gamma/IStakingRewards.sol +35 -0
  77. package/contracts/base/interface/gamma/IUniProxy.sol +15 -0
  78. package/contracts/base/interface/kyber/IDMMExchangeRouter.sol +69 -0
  79. package/contracts/base/interface/kyber/IDMMFactory.sol +35 -0
  80. package/contracts/base/interface/kyber/IDMMLiquidityRouter.sol +204 -0
  81. package/contracts/base/interface/kyber/IDMMPool.sol +42 -0
  82. package/contracts/base/interface/kyber/IDMMRouter01.sol +12 -0
  83. package/contracts/base/interface/kyber/IDMMRouter02.sol +55 -0
  84. package/contracts/base/interface/kyber/IKyberZap.sol +7 -0
  85. package/contracts/base/interface/merkl/IDistributor.sol +6 -0
  86. package/contracts/base/interface/morpho/IMetaMorpho.sol +7 -0
  87. package/contracts/base/interface/pearl/IGauge.sol +13 -0
  88. package/contracts/base/interface/pearl/IPair.sol +44 -0
  89. package/contracts/base/interface/pearl/IRouter.sol +305 -0
  90. package/contracts/base/interface/quickswap/IDragonLair.sol +25 -0
  91. package/contracts/base/interface/quickswap/IMasterChef.sol +13 -0
  92. package/contracts/base/interface/uniswap/IUniswapV2Factory.sol +15 -0
  93. package/contracts/base/interface/uniswap/IUniswapV2Migrator.sol +6 -0
  94. package/contracts/base/interface/uniswap/IUniswapV2Pair.sol +59 -0
  95. package/contracts/base/interface/uniswap/IUniswapV2Router01.sol +96 -0
  96. package/contracts/base/interface/uniswap/IUniswapV2Router02.sol +137 -0
  97. package/contracts/base/interface/uniswap/IUniswapV3Pool.sol +24 -0
  98. package/contracts/base/interface/uniswap/IUniswapV3Router.sol +64 -0
  99. package/contracts/base/interface/uniswap/IWETH.sol +8 -0
  100. package/contracts/base/interface/uniswap/pool/IUniswapV3PoolActions.sol +103 -0
  101. package/contracts/base/interface/uniswap/pool/IUniswapV3PoolDerivedState.sol +40 -0
  102. package/contracts/base/interface/uniswap/pool/IUniswapV3PoolEvents.sol +121 -0
  103. package/contracts/base/interface/uniswap/pool/IUniswapV3PoolImmutables.sol +35 -0
  104. package/contracts/base/interface/uniswap/pool/IUniswapV3PoolOwnerActions.sol +23 -0
  105. package/contracts/base/interface/uniswap/pool/IUniswapV3PoolState.sol +116 -0
  106. package/contracts/base/masterchef-base/MasterChefHodlStrategy.sol +240 -0
  107. package/contracts/base/masterchef-base/MasterChefStrategy.sol +364 -0
  108. package/contracts/base/masterchef-base/interfaces/IMasterChef.sol +12 -0
  109. package/contracts/base/migration/vaultMigratable_2JPYv2.sol +87 -0
  110. package/contracts/base/migration/vaultMigratable_bal2EUR_PAR.sol +121 -0
  111. package/contracts/base/migration/vaultMigratable_bal2EUR_agEUR.sol +121 -0
  112. package/contracts/base/migration/vaultMigratable_balMaticX.sol +153 -0
  113. package/contracts/base/migration/vaultMigratable_balStMatic.sol +153 -0
  114. package/contracts/base/noop/NoopStrategy.sol +89 -0
  115. package/contracts/base/noop/NoopStrategyUpgradeable.sol +92 -0
  116. package/contracts/base/sushi-base/MiniChefV2Strategy.sol +380 -0
  117. package/contracts/base/sushi-base/interface/IMiniChefV2.sol +31 -0
  118. package/contracts/base/sushi-base/interface/IRewarder.sol +9 -0
  119. package/contracts/base/sushi-base/lib/BoringERC20.sol +30 -0
  120. package/contracts/base/upgradability/Address.sol +33 -0
  121. package/contracts/base/upgradability/BaseUpgradeabilityProxy.sol +61 -0
  122. package/contracts/base/upgradability/BaseUpgradeableStrategy.sol +111 -0
  123. package/contracts/base/upgradability/BaseUpgradeableStrategyStorage.sol +176 -0
  124. package/contracts/base/upgradability/BaseUpgradeableStrategyStorageV2.sol +290 -0
  125. package/contracts/base/upgradability/BaseUpgradeableStrategyV2.sol +145 -0
  126. package/contracts/base/upgradability/IUpgradable.sol +7 -0
  127. package/contracts/base/upgradability/Proxy.sol +71 -0
  128. package/contracts/base/upgradability/ReentrancyGuard.sol +57 -0
  129. package/contracts/base/upgradability/ReentrancyGuardUpgradeable.sol +51 -0
  130. package/contracts/base/upgradability/StrategyProxy.sol +35 -0
  131. package/contracts/base/wmatic/WMATIC.sol +8 -0
  132. package/contracts/strategies/aave/AaveSupplyStrategy.sol +213 -0
  133. package/contracts/strategies/aave/AaveSupplyStrategyMainnet_DAI.sol +23 -0
  134. package/contracts/strategies/aave/AaveSupplyStrategyMainnet_EURS.sol +23 -0
  135. package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDC.sol +23 -0
  136. package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDCe.sol +23 -0
  137. package/contracts/strategies/aave/AaveSupplyStrategyMainnet_USDT.sol +23 -0
  138. package/contracts/strategies/ape/ApeStrategyMainnet_BANANA_MATIC.sol +36 -0
  139. package/contracts/strategies/ape/ApeStrategyMainnet_BNB_MATIC.sol +36 -0
  140. package/contracts/strategies/ape/ApeStrategyMainnet_BTC_MATIC.sol +36 -0
  141. package/contracts/strategies/ape/ApeStrategyMainnet_DAI_MATIC.sol +36 -0
  142. package/contracts/strategies/ape/ApeStrategyMainnet_DAI_USDC.sol +37 -0
  143. package/contracts/strategies/ape/ApeStrategyMainnet_ETH_MATIC.sol +36 -0
  144. package/contracts/strategies/ape/ApeStrategyMainnet_USDT_MATIC.sol +36 -0
  145. package/contracts/strategies/aura/AuraStrategy.sol +347 -0
  146. package/contracts/strategies/aura/AuraStrategyMainnet_jEUR_PAR.sol +30 -0
  147. package/contracts/strategies/aura/interface/IAuraBaseRewardPool.sol +25 -0
  148. package/contracts/strategies/aura/interface/IAuraBooster.sol +17 -0
  149. package/contracts/strategies/aura/interface/IAuraDepositor.sol +7 -0
  150. package/contracts/strategies/balancer/BalancerStrategyV3.sol +509 -0
  151. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2BRL.sol +39 -0
  152. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2BRLUSD.sol +38 -0
  153. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_PAR.sol +34 -0
  154. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_PARv2.sol +34 -0
  155. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_2EUR_agEUR.sol +34 -0
  156. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MATIC_USDC_ETH_BAL.sol +32 -0
  157. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MaticX.sol +37 -0
  158. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_MaticX_amMatic.sol +38 -0
  159. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_SPHERE_MATIC.sol +34 -0
  160. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_TNGBL_USDC.sol +34 -0
  161. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_WBTC_ETH_USDC.sol +32 -0
  162. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_bbamusd.sol +36 -0
  163. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_frxETH.sol +32 -0
  164. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_frxETH_amWETH.sol +35 -0
  165. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stETH.sol +35 -0
  166. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stMatic.sol +36 -0
  167. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_stMatic_amMatic.sol +39 -0
  168. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_tetuBal.sol +36 -0
  169. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_wUSDR_USDC.sol +34 -0
  170. package/contracts/strategies/balancer/BalancerStrategyV3Mainnet_wstETH_amWETH.sol +37 -0
  171. package/contracts/strategies/balancer/interface/Gauge.sol +26 -0
  172. package/contracts/strategies/balancer/interface/IBVault.sol +557 -0
  173. package/contracts/strategies/balancer/interface/IBalanceMinter.sol +114 -0
  174. package/contracts/strategies/complifi/ComplifiDerivStrategy.sol +381 -0
  175. package/contracts/strategies/complifi/ComplifiDerivStrategyMainnet_ETH5x.sol +35 -0
  176. package/contracts/strategies/complifi/ComplifiStrategy.sol +362 -0
  177. package/contracts/strategies/complifi/ComplifiStrategyMainnet_COMFI_WETH.sol +34 -0
  178. package/contracts/strategies/complifi/interfaces/ILiquidityMining.sol +13 -0
  179. package/contracts/strategies/complifi/interfaces/ILiquidityPool.sol +63 -0
  180. package/contracts/strategies/complifi/interfaces/IProxyActions.sol +10 -0
  181. package/contracts/strategies/complifi/interfaces/IUSDCVault.sol +55 -0
  182. package/contracts/strategies/compound/CompoundStrategy.sol +296 -0
  183. package/contracts/strategies/compound/CompoundStrategyMainnet_USDC.sol +28 -0
  184. package/contracts/strategies/compound/CompoundStrategyMainnet_USDT.sol +28 -0
  185. package/contracts/strategies/compound-blue/CompoundBlueStrategy.sol +292 -0
  186. package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_ETH.sol +27 -0
  187. package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_USDC.sol +27 -0
  188. package/contracts/strategies/compound-blue/CompoundBlueStrategyMainnet_USDT.sol +27 -0
  189. package/contracts/strategies/convex/ConvexStrategyMainnet_3CRV.sol +40 -0
  190. package/contracts/strategies/convex/ConvexStrategyMainnet_3CRYPTO.sol +37 -0
  191. package/contracts/strategies/convex/ConvexStrategyMainnet_CRV_3CRYPTO copy.sol +37 -0
  192. package/contracts/strategies/convex/ConvexStrategyMainnet_MATIC_3CRYPTO.sol +37 -0
  193. package/contracts/strategies/convex/ConvexStrategyMainnet_USDR.sol +40 -0
  194. package/contracts/strategies/convex/ConvexStrategyMainnet_aCRV.sol +38 -0
  195. package/contracts/strategies/convex/base/ConvexStrategy.sol +480 -0
  196. package/contracts/strategies/convex/interface/IBaseRewardPool.sol +13 -0
  197. package/contracts/strategies/convex/interface/IBooster.sol +10 -0
  198. package/contracts/strategies/gamma-merkl/GammaMerklStrategy.sol +272 -0
  199. package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_ETH_USDC.sol +25 -0
  200. package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_ETH_USDT.sol +25 -0
  201. package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_MATIC_USDT.sol +25 -0
  202. package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_TBTC_ETH.sol +25 -0
  203. package/contracts/strategies/gamma-merkl/GammaMerklStrategyMainnet_QS_WBTC_ETH_w.sol +25 -0
  204. package/contracts/strategies/genomes/NoopStrategy_GENE_ETH.sol +23 -0
  205. package/contracts/strategies/genomes/NoopStrategy_GNOME_ETH.sol +23 -0
  206. package/contracts/strategies/idle/IdleFinanceStrategy.sol +240 -0
  207. package/contracts/strategies/idle/IdleStrategyDAIMainnet.sol +33 -0
  208. package/contracts/strategies/idle/IdleStrategyUSDCMainnet.sol +33 -0
  209. package/contracts/strategies/idle/IdleStrategyWETHMainnet.sol +30 -0
  210. package/contracts/strategies/idle/interface/IdleToken.sol +58 -0
  211. package/contracts/strategies/jarvis/JarvisHodlStrategyV3.sol +351 -0
  212. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2CAD.sol +34 -0
  213. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR.sol +34 -0
  214. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_EURT.sol +34 -0
  215. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_EURe.sol +34 -0
  216. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2EUR_PAR.sol +34 -0
  217. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2JPY.sol +34 -0
  218. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2JPYv2.sol +34 -0
  219. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2NZD.sol +34 -0
  220. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_2SGD.sol +34 -0
  221. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jCHF_USDC.sol +35 -0
  222. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jCHF_WETH.sol +35 -0
  223. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jEUR_USDC.sol +35 -0
  224. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jEUR_WETH.sol +35 -0
  225. package/contracts/strategies/jarvis/JarvisHodlStrategyV3Mainnet_jGBP_USDC.sol +35 -0
  226. package/contracts/strategies/jarvis/JarvisStrategyV3.sol +281 -0
  227. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_AUR3_USDC.sol +27 -0
  228. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_AURJUL22_WETH.sol +27 -0
  229. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN2_4EUR.sol +27 -0
  230. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN3_4EUR.sol +27 -0
  231. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_DEN4_4EUR.sol +27 -0
  232. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTANGLENOV22_2EURagEUR.sol +27 -0
  233. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTANGLE_2EURagEUR.sol +27 -0
  234. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTJUL22_USDC.sol +27 -0
  235. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMAY22_USDC.sol +27 -0
  236. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMIMONOV22_2EURPAR.sol +27 -0
  237. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTMIMO_2EURPAR.sol +27 -0
  238. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTNOV22_USDC.sol +27 -0
  239. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_JRTSEP22_USDC.sol +27 -0
  240. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_QUI_2CAD.sol +27 -0
  241. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_SES_2JPY.sol +28 -0
  242. package/contracts/strategies/jarvis/JarvisStrategyV3Mainnet_agDEN_2EUR.sol +27 -0
  243. package/contracts/strategies/jarvis/interface/IElysianFields.sol +11 -0
  244. package/contracts/strategies/jarvis/interface/IKyberFairLaunch.sol +13 -0
  245. package/contracts/strategies/jarvis/interface/IKyberRewardLocker.sol +9 -0
  246. package/contracts/strategies/meshswap/MeshswapStrategy.sol +304 -0
  247. package/contracts/strategies/meshswap/MeshswapStrategyMainnet_MESH_oMOOI.sol +30 -0
  248. package/contracts/strategies/meshswap/MeshswapStrategyMainnet_MESH_oZEMIT.sol +30 -0
  249. package/contracts/strategies/meshswap/MeshswapStrategyMainnet_USDC_oUSDC.sol +31 -0
  250. package/contracts/strategies/meshswap/MeshswapStrategyMainnet_USDT_oUSDT.sol +31 -0
  251. package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_MESH.sol +27 -0
  252. package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_USDC.sol +28 -0
  253. package/contracts/strategies/meshswap/MeshswapStrategyMainnet_WMATIC_USDT.sol +28 -0
  254. package/contracts/strategies/meshswap/interface/IExchange.sol +9 -0
  255. package/contracts/strategies/meshswap/interface/IRouter.sol +68 -0
  256. package/contracts/strategies/pearl/CaviarStrategy.sol +244 -0
  257. package/contracts/strategies/pearl/CaviarStrategyMainnet_CVR.sol +26 -0
  258. package/contracts/strategies/pearl/PearlHodlStrategy.sol +254 -0
  259. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_CVR_PEARL.sol +27 -0
  260. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_DAI_USDR.sol +27 -0
  261. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_ETH_USDR.sol +27 -0
  262. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_MATIC_USDR.sol +27 -0
  263. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_PEARL_USDR.sol +27 -0
  264. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_STAR_USDR.sol +27 -0
  265. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_TNGBL_USDR.sol +27 -0
  266. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_USDC_USDR.sol +27 -0
  267. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_USDT_USDR.sol +27 -0
  268. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_WBTC_USDR.sol +27 -0
  269. package/contracts/strategies/pearl/PearlHodlStrategyMainnet_wUSDR_USDR.sol +27 -0
  270. package/contracts/strategies/quick-gamma/QuickGammaStrategy.sol +400 -0
  271. package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_ETH_narrow.sol +31 -0
  272. package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_ETH_wide.sol +31 -0
  273. package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_USDC_narrow.sol +31 -0
  274. package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_MATIC_USDC_wide.sol +31 -0
  275. package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_USDC_ETH_narrow.sol +34 -0
  276. package/contracts/strategies/quick-gamma/QuickGammaStrategyMainnet_USDC_ETH_wide.sol +34 -0
  277. package/contracts/strategies/quick-gamma/QuickGammaStrategyV2.sol +348 -0
  278. package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_USDC_DAI.sol +28 -0
  279. package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_USDC_USDT.sol +29 -0
  280. package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_WBTC_ETH_narrow.sol +28 -0
  281. package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_WBTC_USDC_narrow.sol +28 -0
  282. package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_cbETH_ETH.sol +28 -0
  283. package/contracts/strategies/quick-gamma/QuickGammaStrategyV2Mainnet_wstETH_ETH.sol +28 -0
  284. package/contracts/strategies/uniswap-gamma/UniswapGammaStrategy.sol +312 -0
  285. package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_DAI.sol +28 -0
  286. package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_USDT.sol +28 -0
  287. package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_USDC_WETH.sol +28 -0
  288. package/contracts/strategies/uniswap-gamma/UniswapGammaStrategyMainnet_WMATIC_USDC.sol +28 -0
  289. package/contracts/strategies/yel/YelStrategy.sol +350 -0
  290. package/contracts/strategies/yel/YelStrategyMainnet_YEL_WETH.sol +29 -0
  291. package/hardhat.config.js +58 -0
  292. package/index.js +42 -0
  293. package/package.json +56 -6
  294. package/scripts/01-deploy-vault-regular-with-upgradable-strategy.js +41 -0
  295. package/scripts/02-deploy-vault-regular.js +35 -0
  296. package/scripts/03-deploy-upgradable-strategy.js +34 -0
  297. package/scripts/04-deploy-new-implementation.js +24 -0
  298. package/scripts/README.md +55 -0
  299. package/scripts/utils.js +42 -0
  300. package/test/aave/dai.js +207 -0
  301. package/test/aave/eurs.js +207 -0
  302. package/test/aave/usdc.js +206 -0
  303. package/test/aave/usdce.js +206 -0
  304. package/test/aave/usdt.js +206 -0
  305. package/test/ape/banana-matic.js +157 -0
  306. package/test/ape/bnb-matic.js +159 -0
  307. package/test/ape/btc-matic.js +159 -0
  308. package/test/ape/dai-matic.js +159 -0
  309. package/test/ape/dai-usdc.js +163 -0
  310. package/test/ape/eth-matic.js +158 -0
  311. package/test/ape/usdt-matic.js +159 -0
  312. package/test/aura/jeur-par.js +135 -0
  313. package/test/balancer/2brl_v3.js +123 -0
  314. package/test/balancer/2brlusd_v3.js +123 -0
  315. package/test/balancer/2eur_ageur.js +141 -0
  316. package/test/balancer/2eur_par.js +141 -0
  317. package/test/balancer/2eur_par_v2.js +123 -0
  318. package/test/balancer/bbamusd_v3.js +124 -0
  319. package/test/balancer/btc.js +131 -0
  320. package/test/balancer/frxETH.js +123 -0
  321. package/test/balancer/frxeth_amweth.js +123 -0
  322. package/test/balancer/matic_usdc_eth_bal.js +123 -0
  323. package/test/balancer/maticx_ammatic.js +123 -0
  324. package/test/balancer/maticx_v2.js +120 -0
  325. package/test/balancer/maticx_v3.js +141 -0
  326. package/test/balancer/polybase.js +131 -0
  327. package/test/balancer/polybase_v2.js +121 -0
  328. package/test/balancer/polydefi.js +131 -0
  329. package/test/balancer/polydefi2.js +131 -0
  330. package/test/balancer/qipool.js +136 -0
  331. package/test/balancer/sphere_matic.js +123 -0
  332. package/test/balancer/stETH.js +123 -0
  333. package/test/balancer/stable.js +131 -0
  334. package/test/balancer/stable_v2.js +121 -0
  335. package/test/balancer/stmatic_ammatic.js +123 -0
  336. package/test/balancer/stmatic_v2.js +120 -0
  337. package/test/balancer/stmatic_v3.js +141 -0
  338. package/test/balancer/tetubal_v3.js +123 -0
  339. package/test/balancer/tngbl_usdc.js +123 -0
  340. package/test/balancer/tricrypto.js +131 -0
  341. package/test/balancer/tusd_stable.js +142 -0
  342. package/test/balancer/usdc_weth.js +136 -0
  343. package/test/balancer/usdc_weth_v2.js +123 -0
  344. package/test/balancer/wbtc_eth_usdc.js +123 -0
  345. package/test/balancer/wbtc_weth.js +136 -0
  346. package/test/balancer/wsteth_amweth.js +123 -0
  347. package/test/balancer/wusdr_usdc.js +123 -0
  348. package/test/compound/usdc.js +127 -0
  349. package/test/compound/usdt.js +129 -0
  350. package/test/compound-blue/eth.js +136 -0
  351. package/test/compound-blue/usdc.js +136 -0
  352. package/test/compound-blue/usdt.js +136 -0
  353. package/test/convex/3crv.js +123 -0
  354. package/test/convex/3crypto.js +123 -0
  355. package/test/convex/acrv.js +123 -0
  356. package/test/convex/crv_3crypto.js +123 -0
  357. package/test/convex/matic_3crypto.js +123 -0
  358. package/test/convex/usdr.js +123 -0
  359. package/test/core/emission-fork.js +197 -0
  360. package/test/core/emission.js +209 -0
  361. package/test/core/vault_upgrade.js +129 -0
  362. package/test/curve/aave.js +132 -0
  363. package/test/curve/atricrypto3.js +135 -0
  364. package/test/curve/eurtusd.js +135 -0
  365. package/test/gamma-merkl/qs-eth-usdc.js +212 -0
  366. package/test/gamma-merkl/qs-eth-usdt.js +213 -0
  367. package/test/gamma-merkl/qs-matic-usdt.js +213 -0
  368. package/test/gamma-merkl/qs-tbtc-eth.js +213 -0
  369. package/test/gamma-merkl/qs-wbtc-eth-w.js +213 -0
  370. package/test/genomes/gene-eth.js +115 -0
  371. package/test/genomes/gnome-eth.js +115 -0
  372. package/test/idle/dai.js +129 -0
  373. package/test/idle/usdc.js +128 -0
  374. package/test/idle/weth.js +128 -0
  375. package/test/jarvis/2cad-hodl.js +183 -0
  376. package/test/jarvis/2cad-update-nov22.js +182 -0
  377. package/test/jarvis/2cad-update.js +177 -0
  378. package/test/jarvis/2cad-update2.js +182 -0
  379. package/test/jarvis/2cad-update3.js +182 -0
  380. package/test/jarvis/2eur-ageur-update-nov22.js +182 -0
  381. package/test/jarvis/2eur-ageur-update.js +182 -0
  382. package/test/jarvis/2eur-eure-hodl.js +176 -0
  383. package/test/jarvis/2eur-eurt-hodl.js +176 -0
  384. package/test/jarvis/2eur-eurt-update-nov22.js +182 -0
  385. package/test/jarvis/2eur-hodl.js +176 -0
  386. package/test/jarvis/2eur-par-hodl.js +176 -0
  387. package/test/jarvis/2eur-par-update-nov22.js +182 -0
  388. package/test/jarvis/2jpy-hodl.js +244 -0
  389. package/test/jarvis/2jpy-update-nov22.js +182 -0
  390. package/test/jarvis/2jpy-update.js +177 -0
  391. package/test/jarvis/2jpy-update2.js +182 -0
  392. package/test/jarvis/2jpyv2-upgrade.js +184 -0
  393. package/test/jarvis/2nzd-hodl.js +176 -0
  394. package/test/jarvis/2nzd-update.js +182 -0
  395. package/test/jarvis/2sgd-hodl.js +176 -0
  396. package/test/jarvis/2sgd-update-nov22.js +182 -0
  397. package/test/jarvis/2sgd-update.js +182 -0
  398. package/test/jarvis/2sgd-update2.js +182 -0
  399. package/test/jarvis/4eur-hodl-upgrade.js +177 -0
  400. package/test/jarvis/4eur-hodl.js +183 -0
  401. package/test/jarvis/4eur-update.js +181 -0
  402. package/test/jarvis/4eur-update2.js +181 -0
  403. package/test/jarvis/agden-2eur.js +222 -0
  404. package/test/jarvis/aur-usdc-v2.js +115 -0
  405. package/test/jarvis/aur-usdc.js +127 -0
  406. package/test/jarvis/aur3-usdc.js +115 -0
  407. package/test/jarvis/aurjul22-weth.js +222 -0
  408. package/test/jarvis/den-4eur.js +115 -0
  409. package/test/jarvis/den2-4eur.js +220 -0
  410. package/test/jarvis/den3-4eur.js +220 -0
  411. package/test/jarvis/den4-4eur.js +220 -0
  412. package/test/jarvis/jchf-usdc-hodl-v2.js +184 -0
  413. package/test/jarvis/jchf-usdc-hodl-v3.js +178 -0
  414. package/test/jarvis/jchf-usdc-hodl.js +193 -0
  415. package/test/jarvis/jchf-weth-hodl.js +176 -0
  416. package/test/jarvis/jeur-usdc-hodl-v2.js +184 -0
  417. package/test/jarvis/jeur-usdc-hodl-v3.js +178 -0
  418. package/test/jarvis/jeur-usdc-hodl.js +193 -0
  419. package/test/jarvis/jeur-weth-hodl.js +176 -0
  420. package/test/jarvis/jgbp-usdc-hodl-v2.js +184 -0
  421. package/test/jarvis/jgbp-usdc-hodl-v3.js +178 -0
  422. package/test/jarvis/jgbp-usdc-hodl.js +193 -0
  423. package/test/jarvis/jrtangle-2eurageur.js +220 -0
  424. package/test/jarvis/jrtanglenov22-2eurageur.js +220 -0
  425. package/test/jarvis/jrtjul22-usdc.js +115 -0
  426. package/test/jarvis/jrtmay22-usdc.js +115 -0
  427. package/test/jarvis/jrtmimo-2eurpar.js +220 -0
  428. package/test/jarvis/jrtmimonov22-2eurpar.js +220 -0
  429. package/test/jarvis/jrtnov22-usdc.js +220 -0
  430. package/test/jarvis/jrtsep22-usdc.js +220 -0
  431. package/test/jarvis/qui-2cad.js +218 -0
  432. package/test/jarvis/ses-2jpy.js +222 -0
  433. package/test/meshswap/mesh-omooi.js +197 -0
  434. package/test/meshswap/mesh-ozemit.js +197 -0
  435. package/test/meshswap/usdc-ousdc.js +197 -0
  436. package/test/meshswap/usdt-ousdt.js +197 -0
  437. package/test/meshswap/wmatic-mesh.js +197 -0
  438. package/test/meshswap/wmatic-usdc.js +197 -0
  439. package/test/meshswap/wmatic-usdt.js +197 -0
  440. package/test/mstable/musd.js +123 -0
  441. package/test/pearl/cvr-pearl.js +198 -0
  442. package/test/pearl/cvr.js +133 -0
  443. package/test/pearl/dai-usdr.js +198 -0
  444. package/test/pearl/eth-usdr.js +198 -0
  445. package/test/pearl/matic-usdr.js +198 -0
  446. package/test/pearl/pearl-usdr.js +198 -0
  447. package/test/pearl/star-usdr.js +186 -0
  448. package/test/pearl/tngbl-usdr.js +198 -0
  449. package/test/pearl/usdc-usdr.js +198 -0
  450. package/test/pearl/usdt-usdr.js +198 -0
  451. package/test/pearl/wbtc-usdr.js +198 -0
  452. package/test/pearl/wusdr-usdr.js +198 -0
  453. package/test/popsicle/ice-weth.js +128 -0
  454. package/test/quick/eth-matic.js +132 -0
  455. package/test/quick/eth-usdt.js +140 -0
  456. package/test/quick/ifarm-quick.js +147 -0
  457. package/test/quick/matic-usdc.js +145 -0
  458. package/test/quick/psp-matic.js +124 -0
  459. package/test/quick/wbtc-eth.js +145 -0
  460. package/test/quick-gamma/cbeth-eth.js +207 -0
  461. package/test/quick-gamma/matic-eth-narrow.js +201 -0
  462. package/test/quick-gamma/matic-eth-wide.js +197 -0
  463. package/test/quick-gamma/matic-usdc-narrow.js +197 -0
  464. package/test/quick-gamma/matic-usdc-wide.js +197 -0
  465. package/test/quick-gamma/upgrade/matic-eth-narrow.js +204 -0
  466. package/test/quick-gamma/upgrade/matic-usdc-narrow.js +199 -0
  467. package/test/quick-gamma/usdc-dai.js +209 -0
  468. package/test/quick-gamma/usdc-eth-narrow.js +197 -0
  469. package/test/quick-gamma/usdc-eth-wide.js +197 -0
  470. package/test/quick-gamma/usdc-usdt.js +209 -0
  471. package/test/quick-gamma/wbtc-eth-narrow.js +207 -0
  472. package/test/quick-gamma/wbtc-usdc-narrow.js +209 -0
  473. package/test/quick-gamma/wsteth-eth.js +207 -0
  474. package/test/sushi/eth-usdt.js +153 -0
  475. package/test/sushi/matic-eth.js +138 -0
  476. package/test/sushi/usdc-eth.js +153 -0
  477. package/test/test-config.js +24 -0
  478. package/test/uniswap-gamma/usdc-dai.js +212 -0
  479. package/test/uniswap-gamma/usdc-usdt.js +212 -0
  480. package/test/uniswap-gamma/usdc-weth.js +212 -0
  481. package/test/uniswap-gamma/wmatic-usdc.js +210 -0
  482. package/test/utilities/Utils.js +96 -0
  483. package/test/utilities/hh-utils.js +242 -0
  484. package/test/utilities/make-vault.js +10 -0
  485. package/test/yel/yel-wmatic.js +129 -0
@@ -0,0 +1,196 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
5
+
6
+ contract VaultStorageV2 is Initializable {
7
+
8
+ bytes32 internal constant _STRATEGY_SLOT = 0xf1a169aa0f736c2813818fdfbdc5755c31e0839c8f49831a16543496b28574ea;
9
+ bytes32 internal constant _UNDERLYING_SLOT = 0x1994607607e11d53306ef62e45e3bd85762c58d9bf38b5578bc4a258a26a7371;
10
+ bytes32 internal constant _UNDERLYING_UNIT_SLOT = 0xa66bc57d4b4eed7c7687876ca77997588987307cb13ecc23f5e52725192e5fff;
11
+ bytes32 internal constant _VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT = 0x39122c9adfb653455d0c05043bd52fcfbc2be864e832efd3abc72ce5a3d7ed5a;
12
+ bytes32 internal constant _VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT = 0x469a3bad2fab7b936c45eecd1f5da52af89cead3e2ed7f732b6f3fc92ed32308;
13
+ bytes32 internal constant _NEXT_IMPLEMENTATION_SLOT = 0xb1acf527cd7cd1668b30e5a9a1c0d845714604de29ce560150922c9d8c0937df;
14
+ bytes32 internal constant _NEXT_IMPLEMENTATION_TIMESTAMP_SLOT = 0x3bc747f4b148b37be485de3223c90b4468252967d2ea7f9fcbd8b6e653f434c9;
15
+ bytes32 internal constant _NEXT_STRATEGY_SLOT = 0xcd7bd9250b0e02f3b13eccf8c73ef5543cb618e0004628f9ca53b65fbdbde2d0;
16
+ bytes32 internal constant _NEXT_STRATEGY_TIMESTAMP_SLOT = 0x5d2b24811886ad126f78c499d71a932a5435795e4f2f6552f0900f12d663cdcf;
17
+ bytes32 internal constant _ALLOW_SHARE_PRICE_DECREASE_SLOT = 0x22f7033891e85fc76735ebd320e0d3f546da431c4729c2f6d2613b11923aaaed;
18
+ bytes32 internal constant _WITHDRAW_BEFORE_REINVESTING_SLOT = 0x4215fbb95dc0890d3e1660fb9089350f2d3f350c0a756934874cae6febf42a79;
19
+ bytes32 internal constant _PAUSED_SLOT = 0xf1cf856d03630b74791fc293cfafd739932a5a075b02d357fb7a726a38777930;
20
+
21
+ /**
22
+ * @dev Storage slot with the address of the current implementation.
23
+ * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
24
+ * validated in the constructor.
25
+ */
26
+ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
27
+
28
+ constructor() public {
29
+ assert(_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.strategy")) - 1));
30
+ assert(_UNDERLYING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlying")) - 1));
31
+ assert(_UNDERLYING_UNIT_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.underlyingUnit")) - 1));
32
+ assert(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestNumerator")) - 1));
33
+ assert(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.vaultFractionToInvestDenominator")) - 1));
34
+ assert(_NEXT_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementation")) - 1));
35
+ assert(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextImplementationTimestamp")) - 1));
36
+ assert(_NEXT_STRATEGY_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextStrategy")) - 1));
37
+ assert(_NEXT_STRATEGY_TIMESTAMP_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.nextStrategyTimestamp")) - 1));
38
+ assert(_ALLOW_SHARE_PRICE_DECREASE_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.allowSharePriceDecrease")) - 1));
39
+ assert(_WITHDRAW_BEFORE_REINVESTING_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.withdrawBeforeReinvesting")) - 1));
40
+ assert(_PAUSED_SLOT == bytes32(uint256(keccak256("eip1967.vaultStorage.paused")) - 1));
41
+ }
42
+
43
+ function initialize(
44
+ address _underlying,
45
+ uint256 _toInvestNumerator,
46
+ uint256 _toInvestDenominator,
47
+ uint256 _underlyingUnit
48
+ ) public initializer {
49
+ _setUnderlying(_underlying);
50
+ _setVaultFractionToInvestNumerator(_toInvestNumerator);
51
+ _setVaultFractionToInvestDenominator(_toInvestDenominator);
52
+ _setUnderlyingUnit(_underlyingUnit);
53
+ _setNextStrategyTimestamp(0);
54
+ _setNextStrategy(address(0));
55
+ _setAllowSharePriceDecrease(false);
56
+ _setWithdrawBeforeReinvesting(false);
57
+ }
58
+
59
+ function _setStrategy(address _address) internal {
60
+ setAddress(_STRATEGY_SLOT, _address);
61
+ }
62
+
63
+ function _strategy() internal view returns (address) {
64
+ return getAddress(_STRATEGY_SLOT);
65
+ }
66
+
67
+ function _setUnderlying(address _address) internal {
68
+ setAddress(_UNDERLYING_SLOT, _address);
69
+ }
70
+
71
+ function _underlying() internal view returns (address) {
72
+ return getAddress(_UNDERLYING_SLOT);
73
+ }
74
+
75
+ function _setUnderlyingUnit(uint256 _value) internal {
76
+ setUint256(_UNDERLYING_UNIT_SLOT, _value);
77
+ }
78
+
79
+ function _underlyingUnit() internal view returns (uint256) {
80
+ return getUint256(_UNDERLYING_UNIT_SLOT);
81
+ }
82
+
83
+ function _setVaultFractionToInvestNumerator(uint256 _value) internal {
84
+ setUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT, _value);
85
+ }
86
+
87
+ function _vaultFractionToInvestNumerator() internal view returns (uint256) {
88
+ return getUint256(_VAULT_FRACTION_TO_INVEST_NUMERATOR_SLOT);
89
+ }
90
+
91
+ function _setVaultFractionToInvestDenominator(uint256 _value) internal {
92
+ setUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT, _value);
93
+ }
94
+
95
+ function _vaultFractionToInvestDenominator() internal view returns (uint256) {
96
+ return getUint256(_VAULT_FRACTION_TO_INVEST_DENOMINATOR_SLOT);
97
+ }
98
+
99
+ function _setAllowSharePriceDecrease(bool _value) internal {
100
+ setBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT, _value);
101
+ }
102
+
103
+ function _allowSharePriceDecrease() internal view returns (bool) {
104
+ return getBoolean(_ALLOW_SHARE_PRICE_DECREASE_SLOT);
105
+ }
106
+
107
+ function _setWithdrawBeforeReinvesting(bool _value) internal {
108
+ setBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT, _value);
109
+ }
110
+
111
+ function _withdrawBeforeReinvesting() internal view returns (bool) {
112
+ return getBoolean(_WITHDRAW_BEFORE_REINVESTING_SLOT);
113
+ }
114
+
115
+ function _setNextImplementation(address _address) internal {
116
+ setAddress(_NEXT_IMPLEMENTATION_SLOT, _address);
117
+ }
118
+
119
+ function _nextImplementation() internal view returns (address) {
120
+ return getAddress(_NEXT_IMPLEMENTATION_SLOT);
121
+ }
122
+
123
+ function _setNextImplementationTimestamp(uint256 _value) internal {
124
+ setUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT, _value);
125
+ }
126
+
127
+ function _nextImplementationTimestamp() internal view returns (uint256) {
128
+ return getUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT);
129
+ }
130
+
131
+ function _setNextStrategy(address _value) internal {
132
+ setAddress(_NEXT_STRATEGY_SLOT, _value);
133
+ }
134
+
135
+ function _nextStrategy() internal view returns (address) {
136
+ return getAddress(_NEXT_STRATEGY_SLOT);
137
+ }
138
+
139
+ function _setNextStrategyTimestamp(uint256 _value) internal {
140
+ setUint256(_NEXT_STRATEGY_TIMESTAMP_SLOT, _value);
141
+ }
142
+
143
+ function _nextStrategyTimestamp() internal view returns (uint256) {
144
+ return getUint256(_NEXT_STRATEGY_TIMESTAMP_SLOT);
145
+ }
146
+
147
+ function _implementation() internal view returns (address) {
148
+ return getAddress(_IMPLEMENTATION_SLOT);
149
+ }
150
+
151
+ function _paused() internal view returns (bool) {
152
+ return getBoolean(_PAUSED_SLOT);
153
+ }
154
+
155
+ function _setPaused(bool _value) internal {
156
+ setBoolean(_PAUSED_SLOT, _value);
157
+ }
158
+
159
+ function setBoolean(bytes32 slot, bool _value) internal {
160
+ setUint256(slot, _value ? 1 : 0);
161
+ }
162
+
163
+ function getBoolean(bytes32 slot) internal view returns (bool) {
164
+ return (getUint256(slot) == 1);
165
+ }
166
+
167
+ function setAddress(bytes32 slot, address _address) internal {
168
+ // solhint-disable-next-line no-inline-assembly
169
+ assembly {
170
+ sstore(slot, _address)
171
+ }
172
+ }
173
+
174
+ function setUint256(bytes32 slot, uint256 _value) internal {
175
+ // solhint-disable-next-line no-inline-assembly
176
+ assembly {
177
+ sstore(slot, _value)
178
+ }
179
+ }
180
+
181
+ function getAddress(bytes32 slot) internal view returns (address str) {
182
+ // solhint-disable-next-line no-inline-assembly
183
+ assembly {
184
+ str := sload(slot)
185
+ }
186
+ }
187
+
188
+ function getUint256(bytes32 slot) internal view returns (uint256 str) {
189
+ // solhint-disable-next-line no-inline-assembly
190
+ assembly {
191
+ str := sload(slot)
192
+ }
193
+ }
194
+
195
+ uint256[50] private ______gap;
196
+ }
@@ -0,0 +1,369 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts-upgradeable/math/MathUpgradeable.sol";
5
+ import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
6
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
7
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
8
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
9
+ import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
10
+ import "./interface/IStrategy.sol";
11
+ import "./interface/IVault.sol";
12
+ import "./interface/IControllerV2.sol";
13
+ import "./interface/IUpgradeSource.sol";
14
+ import "./inheritance/ControllableInit.sol";
15
+ import "./VaultStorageV2.sol";
16
+
17
+ contract VaultV2 is ERC20Upgradeable, IUpgradeSource, ControllableInit, VaultStorageV2 {
18
+ using SafeERC20Upgradeable for IERC20Upgradeable;
19
+ using AddressUpgradeable for address;
20
+ using SafeMathUpgradeable for uint256;
21
+
22
+ /**
23
+ * Caller has exchanged assets for shares, and transferred those shares to owner.
24
+ *
25
+ * MUST be emitted when tokens are deposited into the Vault via the mint and deposit methods.
26
+ */
27
+ event Deposit(
28
+ address indexed sender,
29
+ address indexed receiver,
30
+ uint256 assets,
31
+ uint256 shares
32
+ );
33
+
34
+ /**
35
+ * Caller has exchanged shares, owned by owner, for assets, and transferred those assets to receiver.
36
+ *
37
+ * MUST be emitted when shares are withdrawn from the Vault in ERC4626.redeem or ERC4626.withdraw methods.
38
+ */
39
+ event Withdraw(
40
+ address indexed sender,
41
+ address indexed receiver,
42
+ address indexed owner,
43
+ uint256 assets,
44
+ uint256 shares
45
+ );
46
+ event Invest(uint256 amount);
47
+ event StrategyAnnounced(address newStrategy, uint256 time);
48
+ event StrategyChanged(address newStrategy, address oldStrategy);
49
+
50
+
51
+ constructor() public {
52
+ }
53
+
54
+ // the function is name differently to not cause inheritance clash in truffle and allows tests
55
+ function initializeVault(
56
+ address _storage,
57
+ address _underlying,
58
+ uint256 _toInvestNumerator,
59
+ uint256 _toInvestDenominator
60
+ ) public initializer {
61
+ require(_toInvestNumerator <= _toInvestDenominator, "cannot invest more than 100%");
62
+ require(_toInvestDenominator != 0, "cannot divide by 0");
63
+
64
+ __ERC20_init(
65
+ string(abi.encodePacked("FARM_", ERC20Upgradeable(_underlying).symbol())),
66
+ string(abi.encodePacked("f", ERC20Upgradeable(_underlying).symbol()))
67
+ );
68
+ _setupDecimals(ERC20Upgradeable(_underlying).decimals());
69
+
70
+ ControllableInit.initialize(
71
+ _storage
72
+ );
73
+
74
+ uint256 underlyingUnit = 10 ** uint256(ERC20Upgradeable(address(_underlying)).decimals());
75
+ VaultStorageV2.initialize(
76
+ _underlying,
77
+ _toInvestNumerator,
78
+ _toInvestDenominator,
79
+ underlyingUnit
80
+ );
81
+ }
82
+
83
+ function strategy() public view returns(address) {
84
+ return _strategy();
85
+ }
86
+
87
+ function underlying() public view returns(address) {
88
+ return _underlying();
89
+ }
90
+
91
+ function underlyingUnit() public view returns(uint256) {
92
+ return _underlyingUnit();
93
+ }
94
+
95
+ function vaultFractionToInvestNumerator() public view returns(uint256) {
96
+ return _vaultFractionToInvestNumerator();
97
+ }
98
+
99
+ function vaultFractionToInvestDenominator() public view returns(uint256) {
100
+ return _vaultFractionToInvestDenominator();
101
+ }
102
+
103
+ function nextImplementation() public view returns(address) {
104
+ return _nextImplementation();
105
+ }
106
+
107
+ function nextImplementationTimestamp() public view returns(uint256) {
108
+ return _nextImplementationTimestamp();
109
+ }
110
+
111
+ function nextImplementationDelay() public view returns (uint256) {
112
+ return IControllerV2(controller()).nextImplementationDelay();
113
+ }
114
+
115
+ modifier whenStrategyDefined() {
116
+ require(address(strategy()) != address(0), "Strategy must be defined");
117
+ _;
118
+ }
119
+
120
+ // Only smart contracts will be affected by this modifier
121
+ modifier defense() {
122
+ require(
123
+ (msg.sender == tx.origin) || // If it is a normal user and not smart contract,
124
+ // then the requirement will pass
125
+ !IControllerV2(controller()).greyList(msg.sender), // If it is a smart contract, then
126
+ "This smart contract has been grey listed" // make sure that it is not on our greyList.
127
+ );
128
+ _;
129
+ }
130
+
131
+ /**
132
+ * Chooses the best strategy and re-invests. If the strategy did not change, it just calls
133
+ * doHardWork on the current strategy. Call this through controller to claim hard rewards.
134
+ */
135
+ function doHardWork() whenStrategyDefined onlyControllerOrGovernance external {
136
+ // ensure that new funds are invested too
137
+ invest();
138
+ IStrategy(strategy()).doHardWork();
139
+ }
140
+
141
+ /*
142
+ * Returns the cash balance across all users in this contract.
143
+ */
144
+ function underlyingBalanceInVault() view public returns (uint256) {
145
+ return IERC20Upgradeable(underlying()).balanceOf(address(this));
146
+ }
147
+
148
+ /* Returns the current underlying (e.g., DAI's) balance together with
149
+ * the invested amount (if DAI is invested elsewhere by the strategy).
150
+ */
151
+ function underlyingBalanceWithInvestment() view public returns (uint256) {
152
+ if (address(strategy()) == address(0)) {
153
+ // initial state, when not set
154
+ return underlyingBalanceInVault();
155
+ }
156
+ return underlyingBalanceInVault().add(IStrategy(strategy()).investedUnderlyingBalance());
157
+ }
158
+
159
+ function getPricePerFullShare() public view returns (uint256) {
160
+ return totalSupply() == 0
161
+ ? underlyingUnit()
162
+ : underlyingUnit().mul(underlyingBalanceWithInvestment()).div(totalSupply());
163
+ }
164
+
165
+ /* get the user's share (in underlying)
166
+ */
167
+ function underlyingBalanceWithInvestmentForHolder(address holder) view external returns (uint256) {
168
+ if (totalSupply() == 0) {
169
+ return 0;
170
+ }
171
+ return underlyingBalanceWithInvestment()
172
+ .mul(balanceOf(holder))
173
+ .div(totalSupply());
174
+ }
175
+
176
+ function nextStrategy() public view returns (address) {
177
+ return _nextStrategy();
178
+ }
179
+
180
+ function nextStrategyTimestamp() public view returns (uint256) {
181
+ return _nextStrategyTimestamp();
182
+ }
183
+
184
+ function canUpdateStrategy(address _strategy) public view returns (bool) {
185
+ bool isStrategyNotSetYet = strategy() == address(0);
186
+ bool hasTimelockPassed = block.timestamp > nextStrategyTimestamp() && nextStrategyTimestamp() != 0;
187
+ return isStrategyNotSetYet || (_strategy == nextStrategy() && hasTimelockPassed);
188
+ }
189
+
190
+ /**
191
+ * Indicates that the strategy update will happen in the future
192
+ */
193
+ function announceStrategyUpdate(address _strategy) public onlyControllerOrGovernance {
194
+ // records a new timestamp
195
+ uint256 when = block.timestamp.add(nextImplementationDelay());
196
+ _setNextStrategyTimestamp(when);
197
+ _setNextStrategy(_strategy);
198
+ emit StrategyAnnounced(_strategy, when);
199
+ }
200
+
201
+ /**
202
+ * Finalizes (or cancels) the strategy update by resetting the data
203
+ */
204
+ function finalizeStrategyUpdate() public onlyControllerOrGovernance {
205
+ _setNextStrategyTimestamp(0);
206
+ _setNextStrategy(address(0));
207
+ }
208
+
209
+ function setStrategy(address _strategy) public onlyControllerOrGovernance {
210
+ require(canUpdateStrategy(_strategy),
211
+ "The strategy exists and switch timelock did not elapse yet");
212
+ require(_strategy != address(0), "new _strategy cannot be empty");
213
+ require(IStrategy(_strategy).underlying() == address(underlying()), "Vault underlying must match Strategy underlying");
214
+ require(IStrategy(_strategy).vault() == address(this), "the strategy does not belong to this vault");
215
+
216
+ emit StrategyChanged(_strategy, strategy());
217
+ if (address(_strategy) != address(strategy())) {
218
+ if (address(strategy()) != address(0)) { // if the original strategy (no underscore) is defined
219
+ IERC20Upgradeable(underlying()).safeApprove(address(strategy()), 0);
220
+ IStrategy(strategy()).withdrawAllToVault();
221
+ }
222
+ _setStrategy(_strategy);
223
+ IERC20Upgradeable(underlying()).safeApprove(address(strategy()), 0);
224
+ IERC20Upgradeable(underlying()).safeApprove(address(strategy()), uint256(~0));
225
+ }
226
+ finalizeStrategyUpdate();
227
+ }
228
+
229
+ function setVaultFractionToInvest(uint256 numerator, uint256 denominator) external onlyGovernance {
230
+ require(denominator > 0, "denominator must be greater than 0");
231
+ require(numerator <= denominator, "denominator must be greater than or equal to the numerator");
232
+ _setVaultFractionToInvestNumerator(numerator);
233
+ _setVaultFractionToInvestDenominator(denominator);
234
+ }
235
+
236
+ function rebalance() external onlyControllerOrGovernance {
237
+ withdrawAll();
238
+ invest();
239
+ }
240
+
241
+ function availableToInvestOut() public view returns (uint256) {
242
+ uint256 wantInvestInTotal = underlyingBalanceWithInvestment()
243
+ .mul(vaultFractionToInvestNumerator())
244
+ .div(vaultFractionToInvestDenominator());
245
+ uint256 alreadyInvested = IStrategy(strategy()).investedUnderlyingBalance();
246
+ if (alreadyInvested >= wantInvestInTotal) {
247
+ return 0;
248
+ } else {
249
+ uint256 remainingToInvest = wantInvestInTotal.sub(alreadyInvested);
250
+ return remainingToInvest <= underlyingBalanceInVault()
251
+ // TODO: we think that the "else" branch of the ternary operation is not
252
+ // going to get hit
253
+ ? remainingToInvest : underlyingBalanceInVault();
254
+ }
255
+ }
256
+
257
+ function invest() internal whenStrategyDefined {
258
+ uint256 availableAmount = availableToInvestOut();
259
+ if (availableAmount > 0) {
260
+ IERC20Upgradeable(underlying()).safeTransfer(address(strategy()), availableAmount);
261
+ emit Invest(availableAmount);
262
+ }
263
+ }
264
+
265
+ /*
266
+ * Allows for depositing the underlying asset in exchange for shares.
267
+ * Approval is assumed.
268
+ */
269
+ function deposit(uint256 amount) external nonReentrant defense {
270
+ _deposit(amount, msg.sender, msg.sender);
271
+ }
272
+
273
+ /*
274
+ * Allows for depositing the underlying asset in exchange for shares
275
+ * assigned to the holder.
276
+ * This facilitates depositing for someone else (using DepositHelper)
277
+ */
278
+ function depositFor(uint256 amount, address holder) public nonReentrant defense {
279
+ _deposit(amount, msg.sender, holder);
280
+ }
281
+
282
+ function withdraw(uint256 shares) external nonReentrant defense {
283
+ _withdraw(shares, msg.sender, msg.sender);
284
+ }
285
+
286
+ function withdrawAll() public onlyControllerOrGovernance whenStrategyDefined {
287
+ IStrategy(strategy()).withdrawAllToVault();
288
+ }
289
+
290
+ function _deposit(uint256 amount, address sender, address beneficiary) internal {
291
+ require(amount > 0, "Cannot deposit 0");
292
+ require(beneficiary != address(0), "holder must be defined");
293
+
294
+ if (address(strategy()) != address(0)) {
295
+ require(IStrategy(strategy()).depositArbCheck(), "Too much arb");
296
+ }
297
+
298
+ uint256 toMint = totalSupply() == 0
299
+ ? amount
300
+ : amount.mul(totalSupply()).div(underlyingBalanceWithInvestment());
301
+ _mint(beneficiary, toMint);
302
+
303
+ IERC20Upgradeable(underlying()).safeTransferFrom(sender, address(this), amount);
304
+
305
+ // update the contribution amount for the beneficiary
306
+ emit Deposit(sender, beneficiary, amount, toMint);
307
+ }
308
+
309
+ function _withdraw(uint256 numberOfShares, address receiver, address owner) internal {
310
+ require(totalSupply() > 0, "Vault has no shares");
311
+ require(numberOfShares > 0, "numberOfShares must be greater than 0");
312
+ uint256 totalSupply = totalSupply();
313
+
314
+ address sender = msg.sender;
315
+ if (sender != owner) {
316
+ uint256 currentAllowance = allowance(owner, sender);
317
+ if (currentAllowance != uint(-1)) {
318
+ require(currentAllowance >= numberOfShares, "ERC20: transfer amount exceeds allowance");
319
+ _approve(owner, sender, currentAllowance - numberOfShares);
320
+ }
321
+ }
322
+ _burn(owner, numberOfShares);
323
+
324
+ uint256 underlyingAmountToWithdraw = underlyingBalanceWithInvestment()
325
+ .mul(numberOfShares)
326
+ .div(totalSupply);
327
+ if (underlyingAmountToWithdraw > underlyingBalanceInVault()) {
328
+ // withdraw everything from the strategy to accurately check the share value
329
+ if (numberOfShares == totalSupply) {
330
+ IStrategy(strategy()).withdrawAllToVault();
331
+ } else {
332
+ uint256 missing = underlyingAmountToWithdraw.sub(underlyingBalanceInVault());
333
+ IStrategy(strategy()).withdrawToVault(missing);
334
+ }
335
+ // recalculate to improve accuracy
336
+ underlyingAmountToWithdraw = MathUpgradeable.min(underlyingBalanceWithInvestment()
337
+ .mul(numberOfShares)
338
+ .div(totalSupply), underlyingBalanceInVault());
339
+ }
340
+
341
+ IERC20Upgradeable(underlying()).safeTransfer(receiver, underlyingAmountToWithdraw);
342
+
343
+ // update the withdrawal amount for the holder
344
+ emit Withdraw(sender, receiver, owner, underlyingAmountToWithdraw, numberOfShares);
345
+ }
346
+
347
+ /**
348
+ * Schedules an upgrade for this vault's proxy.
349
+ */
350
+ function scheduleUpgrade(address impl) public onlyGovernance {
351
+ _setNextImplementation(impl);
352
+ _setNextImplementationTimestamp(block.timestamp.add(nextImplementationDelay()));
353
+ }
354
+
355
+ function shouldUpgrade() external view override returns (bool, address) {
356
+ return (
357
+ nextImplementationTimestamp() != 0
358
+ && block.timestamp > nextImplementationTimestamp()
359
+ && nextImplementation() != address(0),
360
+ nextImplementation()
361
+ );
362
+ }
363
+
364
+ function finalizeUpgrade() external override onlyGovernance {
365
+ _setNextImplementation(address(0));
366
+ _setNextImplementationTimestamp(0);
367
+ ReentrancyGuardUpgradeable._setNotEntered(_NOT_ENTERED_SLOT, true);
368
+ }
369
+ }