@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,176 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
6
+
7
+ contract BaseUpgradeableStrategyStorage {
8
+
9
+ bytes32 internal constant _UNDERLYING_SLOT = 0xa1709211eeccf8f4ad5b6700d52a1a9525b5f5ae1e9e5f9e5a0c2fc23c86e530;
10
+ bytes32 internal constant _VAULT_SLOT = 0xefd7c7d9ef1040fc87e7ad11fe15f86e1d11e1df03c6d7c87f7e1f4041f08d41;
11
+
12
+ bytes32 internal constant _REWARD_TOKEN_SLOT = 0xdae0aafd977983cb1e78d8f638900ff361dc3c48c43118ca1dd77d1af3f47bbf;
13
+ bytes32 internal constant _REWARD_POOL_SLOT = 0x3d9bb16e77837e25cada0cf894835418b38e8e18fbec6cfd192eb344bebfa6b8;
14
+ bytes32 internal constant _SELL_FLOOR_SLOT = 0xc403216a7704d160f6a3b5c3b149a1226a6080f0a5dd27b27d9ba9c022fa0afc;
15
+ bytes32 internal constant _SELL_SLOT = 0x656de32df98753b07482576beb0d00a6b949ebf84c066c765f54f26725221bb6;
16
+ bytes32 internal constant _PAUSED_INVESTING_SLOT = 0xa07a20a2d463a602c2b891eb35f244624d9068572811f63d0e094072fb54591a;
17
+
18
+ bytes32 internal constant _PROFIT_SHARING_NUMERATOR_SLOT = 0xe3ee74fb7893020b457d8071ed1ef76ace2bf4903abd7b24d3ce312e9c72c029;
19
+ bytes32 internal constant _PROFIT_SHARING_DENOMINATOR_SLOT = 0x0286fd414602b432a8c80a0125e9a25de9bba96da9d5068c832ff73f09208a3b;
20
+
21
+ bytes32 internal constant _NEXT_IMPLEMENTATION_SLOT = 0x29f7fcd4fe2517c1963807a1ec27b0e45e67c60a874d5eeac7a0b1ab1bb84447;
22
+ bytes32 internal constant _NEXT_IMPLEMENTATION_TIMESTAMP_SLOT = 0x414c5263b05428f1be1bfa98e25407cc78dd031d0d3cd2a2e3d63b488804f22e;
23
+ bytes32 internal constant _NEXT_IMPLEMENTATION_DELAY_SLOT = 0x82b330ca72bcd6db11a26f10ce47ebcfe574a9c646bccbc6f1cd4478eae16b31;
24
+
25
+ constructor() public {
26
+ assert(_UNDERLYING_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.underlying")) - 1));
27
+ assert(_VAULT_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.vault")) - 1));
28
+ assert(_REWARD_TOKEN_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.rewardToken")) - 1));
29
+ assert(_REWARD_POOL_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.rewardPool")) - 1));
30
+ assert(_SELL_FLOOR_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.sellFloor")) - 1));
31
+ assert(_SELL_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.sell")) - 1));
32
+ assert(_PAUSED_INVESTING_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.pausedInvesting")) - 1));
33
+
34
+ assert(_PROFIT_SHARING_NUMERATOR_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.profitSharingNumerator")) - 1));
35
+ assert(_PROFIT_SHARING_DENOMINATOR_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.profitSharingDenominator")) - 1));
36
+
37
+ assert(_NEXT_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.nextImplementation")) - 1));
38
+ assert(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.nextImplementationTimestamp")) - 1));
39
+ assert(_NEXT_IMPLEMENTATION_DELAY_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.nextImplementationDelay")) - 1));
40
+ }
41
+
42
+ function _setUnderlying(address _address) internal {
43
+ setAddress(_UNDERLYING_SLOT, _address);
44
+ }
45
+
46
+ function underlying() public virtual view returns (address) {
47
+ return getAddress(_UNDERLYING_SLOT);
48
+ }
49
+
50
+ function _setRewardPool(address _address) internal {
51
+ setAddress(_REWARD_POOL_SLOT, _address);
52
+ }
53
+
54
+ function rewardPool() public view returns (address) {
55
+ return getAddress(_REWARD_POOL_SLOT);
56
+ }
57
+
58
+ function _setRewardToken(address _address) internal {
59
+ setAddress(_REWARD_TOKEN_SLOT, _address);
60
+ }
61
+
62
+ function rewardToken() public view returns (address) {
63
+ return getAddress(_REWARD_TOKEN_SLOT);
64
+ }
65
+
66
+ function _setVault(address _address) internal {
67
+ setAddress(_VAULT_SLOT, _address);
68
+ }
69
+
70
+ function vault() public virtual view returns (address) {
71
+ return getAddress(_VAULT_SLOT);
72
+ }
73
+
74
+ // a flag for disabling selling for simplified emergency exit
75
+ function _setSell(bool _value) internal {
76
+ setBoolean(_SELL_SLOT, _value);
77
+ }
78
+
79
+ function sell() public view returns (bool) {
80
+ return getBoolean(_SELL_SLOT);
81
+ }
82
+
83
+ function _setPausedInvesting(bool _value) internal {
84
+ setBoolean(_PAUSED_INVESTING_SLOT, _value);
85
+ }
86
+
87
+ function pausedInvesting() public view returns (bool) {
88
+ return getBoolean(_PAUSED_INVESTING_SLOT);
89
+ }
90
+
91
+ function _setSellFloor(uint256 _value) internal {
92
+ setUint256(_SELL_FLOOR_SLOT, _value);
93
+ }
94
+
95
+ function sellFloor() public view returns (uint256) {
96
+ return getUint256(_SELL_FLOOR_SLOT);
97
+ }
98
+
99
+ function _setProfitSharingNumerator(uint256 _value) internal {
100
+ setUint256(_PROFIT_SHARING_NUMERATOR_SLOT, _value);
101
+ }
102
+
103
+ function profitSharingNumerator() public view returns (uint256) {
104
+ return getUint256(_PROFIT_SHARING_NUMERATOR_SLOT);
105
+ }
106
+
107
+ function _setProfitSharingDenominator(uint256 _value) internal {
108
+ setUint256(_PROFIT_SHARING_DENOMINATOR_SLOT, _value);
109
+ }
110
+
111
+ function profitSharingDenominator() public view returns (uint256) {
112
+ return getUint256(_PROFIT_SHARING_DENOMINATOR_SLOT);
113
+ }
114
+
115
+ // upgradeability
116
+
117
+ function _setNextImplementation(address _address) internal {
118
+ setAddress(_NEXT_IMPLEMENTATION_SLOT, _address);
119
+ }
120
+
121
+ function nextImplementation() public view returns (address) {
122
+ return getAddress(_NEXT_IMPLEMENTATION_SLOT);
123
+ }
124
+
125
+ function _setNextImplementationTimestamp(uint256 _value) internal {
126
+ setUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT, _value);
127
+ }
128
+
129
+ function nextImplementationTimestamp() public view returns (uint256) {
130
+ return getUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT);
131
+ }
132
+
133
+ function _setNextImplementationDelay(uint256 _value) internal {
134
+ setUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT, _value);
135
+ }
136
+
137
+ function nextImplementationDelay() public view returns (uint256) {
138
+ return getUint256(_NEXT_IMPLEMENTATION_DELAY_SLOT);
139
+ }
140
+
141
+ function setBoolean(bytes32 slot, bool _value) internal {
142
+ setUint256(slot, _value ? 1 : 0);
143
+ }
144
+
145
+ function getBoolean(bytes32 slot) internal view returns (bool) {
146
+ return (getUint256(slot) == 1);
147
+ }
148
+
149
+ function setAddress(bytes32 slot, address _address) internal {
150
+ // solhint-disable-next-line no-inline-assembly
151
+ assembly {
152
+ sstore(slot, _address)
153
+ }
154
+ }
155
+
156
+ function setUint256(bytes32 slot, uint256 _value) internal {
157
+ // solhint-disable-next-line no-inline-assembly
158
+ assembly {
159
+ sstore(slot, _value)
160
+ }
161
+ }
162
+
163
+ function getAddress(bytes32 slot) internal view returns (address str) {
164
+ // solhint-disable-next-line no-inline-assembly
165
+ assembly {
166
+ str := sload(slot)
167
+ }
168
+ }
169
+
170
+ function getUint256(bytes32 slot) internal view returns (uint256 str) {
171
+ // solhint-disable-next-line no-inline-assembly
172
+ assembly {
173
+ str := sload(slot)
174
+ }
175
+ }
176
+ }
@@ -0,0 +1,290 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "../interface/IControllerV2.sol";
5
+ import "../inheritance/ControllableInit.sol";
6
+
7
+ contract BaseUpgradeableStrategyStorageV2 is ControllableInit {
8
+
9
+ event ProfitsNotCollected(
10
+ address indexed rewardToken,
11
+ bool sell,
12
+ bool floor
13
+ );
14
+ event ProfitLogInReward(
15
+ address indexed rewardToken,
16
+ uint256 profitAmount,
17
+ uint256 feeAmount,
18
+ uint256 timestamp
19
+ );
20
+ event ProfitAndBuybackLog(
21
+ address indexed rewardToken,
22
+ uint256 profitAmount,
23
+ uint256 feeAmount,
24
+ uint256 timestamp
25
+ );
26
+ event PlatformFeeLogInReward(
27
+ address indexed treasury,
28
+ address indexed rewardToken,
29
+ uint256 profitAmount,
30
+ uint256 feeAmount,
31
+ uint256 timestamp
32
+ );
33
+ event StrategistFeeLogInReward(
34
+ address indexed strategist,
35
+ address indexed rewardToken,
36
+ uint256 profitAmount,
37
+ uint256 feeAmount,
38
+ uint256 timestamp
39
+ );
40
+
41
+ bytes32 internal constant _UNDERLYING_SLOT = 0xa1709211eeccf8f4ad5b6700d52a1a9525b5f5ae1e9e5f9e5a0c2fc23c86e530;
42
+ bytes32 internal constant _VAULT_SLOT = 0xefd7c7d9ef1040fc87e7ad11fe15f86e1d11e1df03c6d7c87f7e1f4041f08d41;
43
+
44
+ bytes32 internal constant _REWARD_TOKEN_SLOT = 0xdae0aafd977983cb1e78d8f638900ff361dc3c48c43118ca1dd77d1af3f47bbf;
45
+ bytes32 internal constant _REWARD_TOKENS_SLOT = 0x45418d9b5c2787ae64acbffccad43f2b487c1a16e24385aa9d2b059f9d1d163c;
46
+ bytes32 internal constant _REWARD_POOL_SLOT = 0x3d9bb16e77837e25cada0cf894835418b38e8e18fbec6cfd192eb344bebfa6b8;
47
+ bytes32 internal constant _SELL_FLOOR_SLOT = 0xc403216a7704d160f6a3b5c3b149a1226a6080f0a5dd27b27d9ba9c022fa0afc;
48
+ bytes32 internal constant _SELL_SLOT = 0x656de32df98753b07482576beb0d00a6b949ebf84c066c765f54f26725221bb6;
49
+ bytes32 internal constant _PAUSED_INVESTING_SLOT = 0xa07a20a2d463a602c2b891eb35f244624d9068572811f63d0e094072fb54591a;
50
+
51
+ bytes32 internal constant _PROFIT_SHARING_NUMERATOR_SLOT = 0xe3ee74fb7893020b457d8071ed1ef76ace2bf4903abd7b24d3ce312e9c72c029;
52
+ bytes32 internal constant _PROFIT_SHARING_DENOMINATOR_SLOT = 0x0286fd414602b432a8c80a0125e9a25de9bba96da9d5068c832ff73f09208a3b;
53
+
54
+ bytes32 internal constant _NEXT_IMPLEMENTATION_SLOT = 0x29f7fcd4fe2517c1963807a1ec27b0e45e67c60a874d5eeac7a0b1ab1bb84447;
55
+ bytes32 internal constant _NEXT_IMPLEMENTATION_TIMESTAMP_SLOT = 0x414c5263b05428f1be1bfa98e25407cc78dd031d0d3cd2a2e3d63b488804f22e;
56
+ bytes32 internal constant _NEXT_IMPLEMENTATION_DELAY_SLOT = 0x82b330ca72bcd6db11a26f10ce47ebcfe574a9c646bccbc6f1cd4478eae16b31;
57
+
58
+ bytes32 internal constant _STRATEGIST_SLOT = 0x6a7b588c950d46e2de3db2f157e5e0e4f29054c8d60f17bf0c30352e223a458d;
59
+
60
+ constructor() public {
61
+ assert(_UNDERLYING_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.underlying")) - 1));
62
+ assert(_VAULT_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.vault")) - 1));
63
+ assert(_REWARD_TOKEN_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.rewardToken")) - 1));
64
+ assert(_REWARD_TOKENS_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.rewardTokens")) - 1));
65
+ assert(_REWARD_POOL_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.rewardPool")) - 1));
66
+ assert(_SELL_FLOOR_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.sellFloor")) - 1));
67
+ assert(_SELL_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.sell")) - 1));
68
+ assert(_PAUSED_INVESTING_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.pausedInvesting")) - 1));
69
+
70
+ assert(_PROFIT_SHARING_NUMERATOR_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.profitSharingNumerator")) - 1));
71
+ assert(_PROFIT_SHARING_DENOMINATOR_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.profitSharingDenominator")) - 1));
72
+
73
+ assert(_NEXT_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.nextImplementation")) - 1));
74
+ assert(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.nextImplementationTimestamp")) - 1));
75
+ assert(_NEXT_IMPLEMENTATION_DELAY_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.nextImplementationDelay")) - 1));
76
+
77
+ assert(_STRATEGIST_SLOT == bytes32(uint256(keccak256("eip1967.strategyStorage.strategist")) - 1));
78
+ }
79
+
80
+ function _setUnderlying(address _address) internal {
81
+ setAddress(_UNDERLYING_SLOT, _address);
82
+ }
83
+
84
+ function underlying() public virtual view returns (address) {
85
+ return getAddress(_UNDERLYING_SLOT);
86
+ }
87
+
88
+ function _setRewardPool(address _address) internal {
89
+ setAddress(_REWARD_POOL_SLOT, _address);
90
+ }
91
+
92
+ function rewardPool() public view returns (address) {
93
+ return getAddress(_REWARD_POOL_SLOT);
94
+ }
95
+
96
+ function _setRewardToken(address _address) internal {
97
+ setAddress(_REWARD_TOKEN_SLOT, _address);
98
+ }
99
+
100
+ function rewardToken() public view returns (address) {
101
+ return getAddress(_REWARD_TOKEN_SLOT);
102
+ }
103
+
104
+ function _setRewardTokens(address[] memory _rewardTokens) internal {
105
+ setAddressArray(_REWARD_TOKENS_SLOT, _rewardTokens);
106
+ }
107
+
108
+ function isRewardToken(address _token) public view returns (bool) {
109
+ return _isAddressInList(_token, rewardTokens());
110
+ }
111
+
112
+ function rewardTokens() public view returns (address[] memory) {
113
+ return getAddressArray(_REWARD_TOKENS_SLOT);
114
+ }
115
+
116
+ function _isAddressInList(address _searchValue, address[] memory _list) internal pure returns (bool) {
117
+ for (uint i = 0; i < _list.length; i++) {
118
+ if (_list[i] == _searchValue) {
119
+ return true;
120
+ }
121
+ }
122
+ return false;
123
+ }
124
+
125
+ function _setStrategist(address _strategist) internal {
126
+ setAddress(_STRATEGIST_SLOT, _strategist);
127
+ }
128
+
129
+ function strategist() public view returns (address) {
130
+ return getAddress(_STRATEGIST_SLOT);
131
+ }
132
+
133
+ function _setVault(address _address) internal {
134
+ setAddress(_VAULT_SLOT, _address);
135
+ }
136
+
137
+ function vault() public virtual view returns (address) {
138
+ return getAddress(_VAULT_SLOT);
139
+ }
140
+
141
+ // a flag for disabling selling for simplified emergency exit
142
+ function _setSell(bool _value) internal {
143
+ setBoolean(_SELL_SLOT, _value);
144
+ }
145
+
146
+ function sell() public view returns (bool) {
147
+ return getBoolean(_SELL_SLOT);
148
+ }
149
+
150
+ function _setPausedInvesting(bool _value) internal {
151
+ setBoolean(_PAUSED_INVESTING_SLOT, _value);
152
+ }
153
+
154
+ function pausedInvesting() public view returns (bool) {
155
+ return getBoolean(_PAUSED_INVESTING_SLOT);
156
+ }
157
+
158
+ function _setSellFloor(uint256 _value) internal {
159
+ setUint256(_SELL_FLOOR_SLOT, _value);
160
+ }
161
+
162
+ function sellFloor() public view returns (uint256) {
163
+ return getUint256(_SELL_FLOOR_SLOT);
164
+ }
165
+
166
+ function profitSharingNumerator() public view returns (uint256) {
167
+ return IControllerV2(controller()).profitSharingNumerator();
168
+ }
169
+
170
+ function platformFeeNumerator() public view returns (uint256) {
171
+ return IControllerV2(controller()).platformFeeNumerator();
172
+ }
173
+
174
+ function strategistFeeNumerator() public view returns (uint256) {
175
+ return IControllerV2(controller()).strategistFeeNumerator();
176
+ }
177
+
178
+ function feeDenominator() public view returns (uint256) {
179
+ return IControllerV2(controller()).feeDenominator();
180
+ }
181
+
182
+ function universalLiquidator() public view returns (address) {
183
+ return IControllerV2(controller()).universalLiquidator();
184
+ }
185
+
186
+ // upgradeability
187
+
188
+ function _setNextImplementation(address _address) internal {
189
+ setAddress(_NEXT_IMPLEMENTATION_SLOT, _address);
190
+ }
191
+
192
+ function nextImplementation() public view returns (address) {
193
+ return getAddress(_NEXT_IMPLEMENTATION_SLOT);
194
+ }
195
+
196
+ function _setNextImplementationTimestamp(uint256 _value) internal {
197
+ setUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT, _value);
198
+ }
199
+
200
+ function nextImplementationTimestamp() public view returns (uint256) {
201
+ return getUint256(_NEXT_IMPLEMENTATION_TIMESTAMP_SLOT);
202
+ }
203
+
204
+ function nextImplementationDelay() public view returns (uint256) {
205
+ return IControllerV2(controller()).nextImplementationDelay();
206
+ }
207
+
208
+ function setBoolean(bytes32 slot, bool _value) internal {
209
+ setUint256(slot, _value ? 1 : 0);
210
+ }
211
+
212
+ function getBoolean(bytes32 slot) internal view returns (bool) {
213
+ return (getUint256(slot) == 1);
214
+ }
215
+
216
+ function setAddress(bytes32 slot, address _address) internal {
217
+ // solhint-disable-next-line no-inline-assembly
218
+ assembly {
219
+ sstore(slot, _address)
220
+ }
221
+ }
222
+
223
+ function setUint256(bytes32 slot, uint256 _value) internal {
224
+ // solhint-disable-next-line no-inline-assembly
225
+ assembly {
226
+ sstore(slot, _value)
227
+ }
228
+ }
229
+
230
+ function getAddress(bytes32 slot) internal view returns (address str) {
231
+ // solhint-disable-next-line no-inline-assembly
232
+ assembly {
233
+ str := sload(slot)
234
+ }
235
+ }
236
+
237
+ function getUint256(bytes32 slot) internal view returns (uint256 str) {
238
+ // solhint-disable-next-line no-inline-assembly
239
+ assembly {
240
+ str := sload(slot)
241
+ }
242
+ }
243
+
244
+ function setUint256Array(bytes32 slot, uint256[] memory _values) internal {
245
+ // solhint-disable-next-line no-inline-assembly
246
+ setUint256(slot, _values.length);
247
+ for (uint i = 0; i < _values.length; i++) {
248
+ setUint256(bytes32(uint(slot) + 1 + i), _values[i]);
249
+ }
250
+ }
251
+
252
+ function setAddressArray(bytes32 slot, address[] memory _values) internal {
253
+ // solhint-disable-next-line no-inline-assembly
254
+ setUint256(slot, _values.length);
255
+ for (uint i = 0; i < _values.length; i++) {
256
+ setAddress(bytes32(uint(slot) + 1 + i), _values[i]);
257
+ }
258
+ }
259
+
260
+
261
+ function getUint256Array(bytes32 slot) internal view returns (uint[] memory values) {
262
+ // solhint-disable-next-line no-inline-assembly
263
+ values = new uint[](getUint256(slot));
264
+ for (uint i = 0; i < values.length; i++) {
265
+ values[i] = getUint256(bytes32(uint(slot) + 1 + i));
266
+ }
267
+ }
268
+
269
+ function getAddressArray(bytes32 slot) internal view returns (address[] memory values) {
270
+ // solhint-disable-next-line no-inline-assembly
271
+ values = new address[](getUint256(slot));
272
+ for (uint i = 0; i < values.length; i++) {
273
+ values[i] = getAddress(bytes32(uint(slot) + 1 + i));
274
+ }
275
+ }
276
+
277
+ function setBytes32(bytes32 slot, bytes32 _value) internal {
278
+ // solhint-disable-next-line no-inline-assembly
279
+ assembly {
280
+ sstore(slot, _value)
281
+ }
282
+ }
283
+
284
+ function getBytes32(bytes32 slot) internal view returns (bytes32 str) {
285
+ // solhint-disable-next-line no-inline-assembly
286
+ assembly {
287
+ str := sload(slot)
288
+ }
289
+ }
290
+ }
@@ -0,0 +1,145 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol";
5
+ import "./BaseUpgradeableStrategyStorageV2.sol";
6
+ import "../inheritance/ControllableInit.sol";
7
+ import "../interface/IControllerV2.sol";
8
+ import "../interface/IRewardForwarder.sol";
9
+ import "../interface/merkl/IDistributor.sol";
10
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
11
+ import "@openzeppelin/contracts/math/SafeMath.sol";
12
+ import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
13
+
14
+ contract BaseUpgradeableStrategyV2 is Initializable, ControllableInit, BaseUpgradeableStrategyStorageV2 {
15
+ using SafeMath for uint256;
16
+ using SafeERC20 for IERC20;
17
+
18
+ event ProfitsNotCollected(bool sell, bool floor);
19
+ event ProfitLogInReward(uint256 profitAmount, uint256 feeAmount, uint256 timestamp);
20
+ event ProfitAndBuybackLog(uint256 profitAmount, uint256 feeAmount, uint256 timestamp);
21
+
22
+ modifier restricted() {
23
+ require(msg.sender == vault() || msg.sender == controller()
24
+ || msg.sender == governance(),
25
+ "The sender has to be the controller, governance, or vault");
26
+ _;
27
+ }
28
+
29
+ // This is only used in `investAllUnderlying()`
30
+ // The user can still freely withdraw from the strategy
31
+ modifier onlyNotPausedInvesting() {
32
+ require(!pausedInvesting(), "Action blocked as the strategy is in emergency state");
33
+ _;
34
+ }
35
+
36
+ constructor() public BaseUpgradeableStrategyStorageV2() {
37
+ }
38
+
39
+ function initialize(
40
+ address _storage,
41
+ address _underlying,
42
+ address _vault,
43
+ address _rewardPool,
44
+ address _rewardToken,
45
+ address _strategist
46
+ ) public initializer {
47
+ ControllableInit.initialize(
48
+ _storage
49
+ );
50
+ _setUnderlying(_underlying);
51
+ _setVault(_vault);
52
+ _setRewardPool(_rewardPool);
53
+ _setRewardToken(_rewardToken);
54
+ _setStrategist(_strategist);
55
+ _setSell(true);
56
+ _setSellFloor(0);
57
+ _setPausedInvesting(false);
58
+ }
59
+
60
+ /**
61
+ * Schedules an upgrade for this vault's proxy.
62
+ */
63
+ function scheduleUpgrade(address impl) public onlyGovernance {
64
+ _setNextImplementation(impl);
65
+ _setNextImplementationTimestamp(block.timestamp.add(nextImplementationDelay()));
66
+ }
67
+
68
+ function _finalizeUpgrade() internal {
69
+ _setNextImplementation(address(0));
70
+ _setNextImplementationTimestamp(0);
71
+ }
72
+
73
+ function shouldUpgrade() external view returns (bool, address) {
74
+ return (
75
+ nextImplementationTimestamp() != 0
76
+ && block.timestamp > nextImplementationTimestamp()
77
+ && nextImplementation() != address(0),
78
+ nextImplementation()
79
+ );
80
+ }
81
+
82
+ function toggleMerklOperator(address merklDistr, address _operator) external onlyGovernance {
83
+ IDistributor(merklDistr).toggleOperator(address(this), _operator);
84
+ }
85
+
86
+ // ========================= Internal & Private Functions =========================
87
+
88
+ // ==================== Functionality ====================
89
+
90
+ /**
91
+ * @dev Same as `_notifyProfitAndBuybackInRewardToken` but does not perform a compounding buyback. Just takes fees
92
+ * instead.
93
+ */
94
+ function _notifyProfitInRewardToken(
95
+ address _rewardToken,
96
+ uint256 _rewardBalance
97
+ ) internal {
98
+ if (_rewardBalance > 100) {
99
+ uint _feeDenominator = feeDenominator();
100
+ uint256 strategistFee = _rewardBalance.mul(strategistFeeNumerator()).div(_feeDenominator);
101
+ uint256 platformFee = _rewardBalance.mul(platformFeeNumerator()).div(_feeDenominator);
102
+ uint256 profitSharingFee = _rewardBalance.mul(profitSharingNumerator()).div(_feeDenominator);
103
+
104
+ address strategyFeeRecipient = strategist();
105
+ address platformFeeRecipient = IControllerV2(controller()).governance();
106
+
107
+ emit ProfitLogInReward(
108
+ _rewardToken,
109
+ _rewardBalance,
110
+ profitSharingFee,
111
+ block.timestamp
112
+ );
113
+ emit PlatformFeeLogInReward(
114
+ platformFeeRecipient,
115
+ _rewardToken,
116
+ _rewardBalance,
117
+ platformFee,
118
+ block.timestamp
119
+ );
120
+ emit StrategistFeeLogInReward(
121
+ strategyFeeRecipient,
122
+ _rewardToken,
123
+ _rewardBalance,
124
+ strategistFee,
125
+ block.timestamp
126
+ );
127
+
128
+ address rewardForwarder = IControllerV2(controller()).rewardForwarder();
129
+ IERC20(_rewardToken).safeApprove(rewardForwarder, 0);
130
+ IERC20(_rewardToken).safeApprove(rewardForwarder, _rewardBalance);
131
+
132
+ // Distribute/send the fees
133
+ IRewardForwarder(rewardForwarder).notifyFee(
134
+ _rewardToken,
135
+ profitSharingFee,
136
+ strategistFee,
137
+ platformFee
138
+ );
139
+ } else {
140
+ emit ProfitLogInReward(_rewardToken, 0, 0, block.timestamp);
141
+ emit PlatformFeeLogInReward(IControllerV2(controller()).governance(), _rewardToken, 0, 0, block.timestamp);
142
+ emit StrategistFeeLogInReward(strategist(), _rewardToken, 0, 0, block.timestamp);
143
+ }
144
+ }
145
+ }
@@ -0,0 +1,7 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ interface IUpgradeableStrategy {
5
+ function scheduleUpgrade(address impl) external;
6
+ function upgrade() external;
7
+ }
@@ -0,0 +1,71 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ /**
6
+ * @title Proxy
7
+ * @dev Implements delegation of calls to other contracts, with proper
8
+ * forwarding of return values and bubbling of failures.
9
+ * It defines a fallback function that delegates all calls to the address
10
+ * returned by the abstract _implementation() internal function.
11
+ */
12
+ abstract contract Proxy {
13
+ /**
14
+ * @dev Fallback function.
15
+ * Implemented entirely in `_fallback`.
16
+ */
17
+ fallback () payable external {
18
+ _fallback();
19
+ }
20
+
21
+ receive () payable external {}
22
+
23
+ /**
24
+ * @return The Address of the implementation.
25
+ */
26
+ function _implementation() internal view virtual returns (address);
27
+
28
+ /**
29
+ * @dev Delegates execution to an implementation contract.
30
+ * This is a low level function that doesn't return to its internal call site.
31
+ * It will return to the external caller whatever the implementation returns.
32
+ * @param implementation Address to delegate.
33
+ */
34
+ function _delegate(address implementation) internal {
35
+ assembly {
36
+ // Copy msg.data. We take full control of memory in this inline assembly
37
+ // block because it will not return to Solidity code. We overwrite the
38
+ // Solidity scratch pad at memory position 0.
39
+ calldatacopy(0, 0, calldatasize())
40
+
41
+ // Call the implementation.
42
+ // out and outsize are 0 because we don't know the size yet.
43
+ let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
44
+
45
+ // Copy the returned data.
46
+ returndatacopy(0, 0, returndatasize())
47
+
48
+ switch result
49
+ // delegatecall returns 0 on error.
50
+ case 0 { revert(0, returndatasize()) }
51
+ default { return(0, returndatasize()) }
52
+ }
53
+ }
54
+
55
+ /**
56
+ * @dev Function that is run as the first thing in the fallback function.
57
+ * Can be redefined in derived contracts to add functionality.
58
+ * Redefinitions must call super._willFallback().
59
+ */
60
+ function _willFallback() internal {
61
+ }
62
+
63
+ /**
64
+ * @dev fallback implementation.
65
+ * Extracted to enable manual triggering.
66
+ */
67
+ function _fallback() internal {
68
+ _willFallback();
69
+ _delegate(_implementation());
70
+ }
71
+ }