@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,167 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "./NotifyHelperStateful.sol";
5
+ import "./NotifyHelperGeneric.sol";
6
+ import "../inheritance/Controllable.sol";
7
+
8
+ import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
9
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
10
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
11
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
12
+
13
+
14
+ contract GlobalIncentivesHelper is Controllable {
15
+
16
+ using SafeMathUpgradeable for uint256;
17
+ using SafeERC20Upgradeable for IERC20Upgradeable;
18
+
19
+ address public helperControlStorage;
20
+ address public notifyHelperGeneric;
21
+ address public escrow;
22
+ address public reserve;
23
+ address public farm;
24
+
25
+ event ChangerSet(address indexed account, bool value);
26
+ event NotifierSet(address indexed account, bool value);
27
+ event Vesting(address pool, uint256 amount);
28
+ event PoolChanged(address indexed pool, uint256 percentage, uint256 notificationType, bool vests);
29
+
30
+ enum NotificationType {
31
+ VOID, AMPLIFARM, FARM, TRANSFER, PROFIT_SHARE, TOKEN
32
+ }
33
+
34
+ mapping (address => address) public tokenToHelper;
35
+ mapping (address => bool) public changer;
36
+ mapping (address => bool) public notifier;
37
+
38
+ modifier onlyChanger {
39
+ require(changer[msg.sender] || msg.sender == governance(), "Only changer");
40
+ _;
41
+ }
42
+
43
+ modifier onlyNotifier {
44
+ require(notifier[msg.sender] || msg.sender == governance(), "Only notifier");
45
+ _;
46
+ }
47
+
48
+ constructor(address _storage, address _farm, address _farmHelper, address _notifyHelperGeneric, address _escrow, address _reserve) public Controllable(_storage) {
49
+ tokenToHelper[_farm] = _farmHelper;
50
+ farm = _farm;
51
+ notifyHelperGeneric = _notifyHelperGeneric;
52
+ helperControlStorage = address(new Storage());
53
+ escrow = _escrow;
54
+ reserve = _reserve;
55
+ }
56
+
57
+ function notifyPools(address[] calldata tokens, uint256[] calldata totals, uint256 timestamp) external onlyNotifier {
58
+ for (uint256 i = 0; i < tokens.length; i++) {
59
+ // IERC20Upgradeable(tokens[i]).safeTransferFrom(msg.sender, address(this), totals[i]);
60
+ IERC20Upgradeable(tokens[i]).approve(tokenToHelper[tokens[i]], totals[i]);
61
+ NotifyHelperStateful(tokenToHelper[tokens[i]]).notifyPools(totals[i], timestamp);
62
+ }
63
+ }
64
+
65
+ // uses generic helper
66
+ function newToken(address token) external onlyChanger {
67
+ newTokenWithHelper(token, notifyHelperGeneric);
68
+ }
69
+
70
+ // uses a specific notify helper
71
+ function newTokenWithHelper(address token, address notifyHelper) public onlyChanger {
72
+ require(tokenToHelper[token] == address(0), "Token already initialized");
73
+ tokenToHelper[token] = address(new NotifyHelperStateful(
74
+ helperControlStorage,
75
+ notifyHelper, // the universal helper should be sufficient in all cases
76
+ token,
77
+ address(0), // no iFARM/ampliFARM notify helper is needed
78
+ escrow,
79
+ reserve
80
+ ));
81
+ if (notifyHelper == notifyHelperGeneric) {
82
+ NotifyHelperGeneric(notifyHelper).setWhitelist(tokenToHelper[token], true);
83
+ }
84
+ NotifyHelperStateful(tokenToHelper[token]).setNotifier(address(this), true);
85
+ NotifyHelperStateful(tokenToHelper[token]).setNotifier(governance(), true);
86
+ NotifyHelperStateful(tokenToHelper[token]).setChanger(address(this), true);
87
+ NotifyHelperStateful(tokenToHelper[token]).setChanger(governance(), true);
88
+ }
89
+
90
+ function resetToken(address token) public onlyChanger {
91
+ tokenToHelper[token] = address(0);
92
+ }
93
+
94
+ /// Whitelisted entity makes changes to the notifications
95
+ function setPoolBatch(
96
+ address[] calldata tokens,
97
+ address[] calldata poolAddress,
98
+ uint256[] calldata poolPercentage,
99
+ NotificationType[] calldata notificationType,
100
+ bool[] calldata vests) external onlyChanger {
101
+ for (uint256 i = 0; i < poolAddress.length; i++) {
102
+ setPool(tokens[i], poolAddress[i], poolPercentage[i], notificationType[i], vests[i]);
103
+ }
104
+ }
105
+
106
+ /// Pool management, adds, updates or removes a transfer/notification
107
+ function setPool(
108
+ address token,
109
+ address poolAddress,
110
+ uint256 poolPercentage,
111
+ NotificationType notificationType,
112
+ bool vests
113
+ ) public onlyChanger {
114
+ if (token == farm) {
115
+ require(notificationType != NotificationType.TOKEN, "With FARM, use FARM, AMPLIFARM, or TRANSFER");
116
+ }
117
+ if (notificationType == NotificationType.TOKEN) {
118
+ // we use type translation so that we can use the same contract
119
+ NotifyHelperStateful(tokenToHelper[token]).setPool(poolAddress, poolPercentage,
120
+ NotifyHelperStateful.NotificationType(uint256(NotificationType.FARM)), vests);
121
+ } else {
122
+ NotifyHelperStateful(tokenToHelper[token]).setPool(poolAddress, poolPercentage,
123
+ NotifyHelperStateful.NotificationType(uint256(notificationType)), vests);
124
+ }
125
+ emit PoolChanged(poolAddress, poolPercentage, uint256(notificationType), vests);
126
+ }
127
+
128
+ /// emergency draining of tokens and ETH as there should be none staying here
129
+ function emergencyDrain(address token, uint256 amount) public onlyGovernance {
130
+ if (token == address(0)) {
131
+ msg.sender.transfer(amount);
132
+ } else {
133
+ IERC20Upgradeable(token).safeTransfer(msg.sender, amount);
134
+ }
135
+ }
136
+
137
+ /// Configuration method for vesting for governance
138
+ function setVestingEscrow(address token, address _escrow) external onlyGovernance {
139
+ NotifyHelperStateful(tokenToHelper[token]).setVestingEscrow(_escrow);
140
+ }
141
+
142
+ /// Configuration method for vesting for governance
143
+ function setVesting(address token, uint256 _numerator, uint256 _denominator) external onlyGovernance {
144
+ NotifyHelperStateful(tokenToHelper[token]).setVesting(_numerator, _denominator);
145
+ }
146
+
147
+ function notificationExists(address token, address poolAddress) public view returns(bool) {
148
+ return NotifyHelperStateful(tokenToHelper[token]).notificationExists(poolAddress);
149
+ }
150
+
151
+ /// Returning the governance
152
+ function transferGovernance(address target, address newStorage) external onlyGovernance {
153
+ Governable(target).setStorage(newStorage);
154
+ }
155
+
156
+ /// The governance configures whitelists
157
+ function setChanger(address who, bool value) external onlyGovernance {
158
+ changer[who] = value;
159
+ emit ChangerSet(who, value);
160
+ }
161
+
162
+ /// The governance configures whitelists
163
+ function setNotifier(address who, bool value) external onlyGovernance {
164
+ notifier[who] = value;
165
+ emit NotifierSet(who, value);
166
+ }
167
+ }
@@ -0,0 +1,61 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
5
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
6
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
7
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
8
+
9
+ import "../inheritance/Controllable.sol";
10
+ import "../PotPool.sol";
11
+
12
+ contract NotifyHelperGeneric is Controllable {
13
+
14
+ using SafeMathUpgradeable for uint256;
15
+ using SafeERC20Upgradeable for IERC20Upgradeable;
16
+
17
+ event WhitelistSet(address who, bool value);
18
+
19
+ mapping (address => bool) public alreadyNotified;
20
+ mapping (address => bool) public whitelist;
21
+
22
+ modifier onlyWhitelisted {
23
+ require(whitelist[msg.sender] || msg.sender == governance(), "Only whitelisted");
24
+ _;
25
+ }
26
+
27
+ constructor(address _storage)
28
+ Controllable(_storage) public {
29
+ setWhitelist(governance(), true);
30
+ }
31
+
32
+ function setWhitelist(address who, bool value) public onlyWhitelisted {
33
+ whitelist[who] = value;
34
+ emit WhitelistSet(who, value);
35
+ }
36
+
37
+ /**
38
+ * Notifies all the pools, safe guarding the notification amount.
39
+ */
40
+ function notifyPools(uint256[] memory amounts,
41
+ address[] memory pools,
42
+ uint256 sum, address _token
43
+ ) public onlyWhitelisted {
44
+ require(amounts.length == pools.length, "Amounts and pools lengths mismatch");
45
+ for (uint i = 0; i < pools.length; i++) {
46
+ alreadyNotified[pools[i]] = false;
47
+ }
48
+
49
+ uint256 check = 0;
50
+ for (uint i = 0; i < pools.length; i++) {
51
+ require(amounts[i] > 0, "Notify zero");
52
+ require(!alreadyNotified[pools[i]], "Duplicate pool");
53
+ IERC20Upgradeable token = IERC20Upgradeable(_token);
54
+ token.safeTransferFrom(msg.sender, pools[i], amounts[i]);
55
+ PotPool(pools[i]).notifyTargetRewardAmount(_token, amounts[i]);
56
+ check = check.add(amounts[i]);
57
+ alreadyNotified[pools[i]] = true;
58
+ }
59
+ require(sum == check, "Wrong check sum");
60
+ }
61
+ }
@@ -0,0 +1,290 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol";
5
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol";
6
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
7
+ import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
8
+ import "../inheritance/Controllable.sol";
9
+ import "../PotPool.sol";
10
+
11
+ interface INotifyHelperGeneric {
12
+ function feeRewardForwarder() external view returns (address);
13
+
14
+ function notifyPools(uint256[] calldata amounts,
15
+ address[] calldata pools,
16
+ uint256 sum, address token
17
+ ) external;
18
+ }
19
+
20
+ interface INotifyHelperAmpliFARM {
21
+ function notifyPools(uint256[] calldata amounts,
22
+ address[] calldata pools,
23
+ uint256 sum
24
+ ) external;
25
+ }
26
+
27
+ contract NotifyHelperStateful is Controllable {
28
+
29
+ using SafeMathUpgradeable for uint256;
30
+ using SafeERC20Upgradeable for IERC20Upgradeable;
31
+
32
+ event ChangerSet(address indexed account, bool value);
33
+ event NotifierSet(address indexed account, bool value);
34
+ event Vesting(address pool, uint256 amount);
35
+ event PoolChanged(address indexed pool, uint256 percentage, uint256 notificationType, bool vests);
36
+
37
+ enum NotificationType {
38
+ VOID, AMPLIFARM, FARM, TRANSFER, PROFIT_SHARE, TOKEN
39
+ }
40
+
41
+ struct Notification {
42
+ address poolAddress;
43
+ NotificationType notificationType;
44
+ uint256 percentage;
45
+ bool vests;
46
+ }
47
+
48
+ struct WorkingNotification {
49
+ address[] pools;
50
+ uint256[] amounts;
51
+ uint256 checksum;
52
+ uint256 counter;
53
+ }
54
+
55
+ uint256 public VESTING_DENOMINATOR = 3;
56
+ uint256 public VESTING_NUMERATOR = 2;
57
+
58
+ mapping (address => bool) changer;
59
+ mapping (address => bool) notifier;
60
+
61
+ address public notifyHelperRegular;
62
+ address public notifyHelperAmpliFARM;
63
+ address public rewardToken;
64
+
65
+ Notification[] public notifications;
66
+ mapping (address => uint256) public poolToIndex;
67
+ mapping (uint256 => uint256) public numbers; // NotificationType to the number of pools
68
+
69
+ address public reserve;
70
+ address public vestingEscrow;
71
+ uint256 public totalPercentage; // maintain state to not have to calculate during emissions
72
+
73
+ modifier onlyChanger {
74
+ require(changer[msg.sender] || msg.sender == governance(), "Only changer");
75
+ _;
76
+ }
77
+
78
+ modifier onlyNotifier {
79
+ require(notifier[msg.sender], "Only notifier");
80
+ _;
81
+ }
82
+
83
+ constructor(address _storage,
84
+ address _notifyHelperRegular,
85
+ address _rewardToken,
86
+ address _notifyHelperAmpliFARM,
87
+ address _escrow,
88
+ address _reserve)
89
+ Controllable(_storage) public {
90
+ // used for getting a reference to FeeRewardForwarder
91
+ notifyHelperRegular = _notifyHelperRegular;
92
+ rewardToken = _rewardToken;
93
+ notifyHelperAmpliFARM = _notifyHelperAmpliFARM;
94
+ vestingEscrow = _escrow;
95
+ reserve = _reserve;
96
+ require(_reserve != address(0), "invalid reserve");
97
+ require(_escrow != address(0), "invalid escrow");
98
+ }
99
+
100
+ /// Whitelisted entities can notify pools based on the state, both for FARM and iFARM
101
+ /// The only whitelisted entity here would be the minter helper
102
+ function notifyPools(uint256 total, uint256 timestamp) public onlyNotifier {
103
+ // transfer the tokens from the msg.sender to here
104
+ IERC20Upgradeable(rewardToken).safeTransferFrom(msg.sender, address(this), total);
105
+
106
+ // prepare the notification data
107
+ WorkingNotification memory ampliFARM = WorkingNotification(
108
+ new address[](numbers[uint256(NotificationType.AMPLIFARM)]),
109
+ new uint256[](numbers[uint256(NotificationType.AMPLIFARM)]),
110
+ 0,
111
+ 0
112
+ );
113
+ WorkingNotification memory regular = WorkingNotification(
114
+ new address[](numbers[uint256(NotificationType.FARM)]),
115
+ new uint256[](numbers[uint256(NotificationType.FARM)]),
116
+ 0,
117
+ 0
118
+ );
119
+ uint256 vestingAmount = 0;
120
+ for (uint256 i = 0; i < notifications.length; i++) {
121
+ Notification storage notification = notifications[i];
122
+ if (notification.notificationType == NotificationType.TRANSFER) {
123
+ // simple transfer
124
+ IERC20Upgradeable(rewardToken).safeTransfer(
125
+ notification.poolAddress,
126
+ total.mul(notification.percentage).div(totalPercentage)
127
+ );
128
+ } else {
129
+ // FARM or ampliFARM notification
130
+ WorkingNotification memory toUse = notification.notificationType == NotificationType.FARM ? regular : ampliFARM;
131
+ toUse.amounts[toUse.counter] = total.mul(notification.percentage).div(totalPercentage);
132
+ if (notification.vests) {
133
+ uint256 toVest = toUse.amounts[toUse.counter].mul(VESTING_NUMERATOR).div(VESTING_DENOMINATOR);
134
+ toUse.amounts[toUse.counter] = toUse.amounts[toUse.counter].sub(toVest);
135
+ vestingAmount = vestingAmount.add(toVest);
136
+ emit Vesting(notification.poolAddress, toVest);
137
+ }
138
+ toUse.pools[toUse.counter] = notification.poolAddress;
139
+ toUse.checksum = toUse.checksum.add(toUse.amounts[toUse.counter]);
140
+ toUse.counter = toUse.counter.add(1);
141
+ }
142
+ }
143
+
144
+ // handle vesting
145
+ if (vestingAmount > 0) {
146
+ IERC20Upgradeable(rewardToken).safeTransfer(vestingEscrow, vestingAmount);
147
+ }
148
+
149
+ // ampliFARM notifications
150
+ if (ampliFARM.checksum > 0) {
151
+ IERC20Upgradeable(rewardToken).approve(notifyHelperAmpliFARM, ampliFARM.checksum);
152
+ INotifyHelperAmpliFARM(notifyHelperAmpliFARM).notifyPools(ampliFARM.amounts, ampliFARM.pools, ampliFARM.checksum);
153
+ }
154
+
155
+ // regular notifications
156
+ if (regular.checksum > 0) {
157
+ IERC20Upgradeable(rewardToken).approve(notifyHelperRegular, regular.checksum);
158
+ INotifyHelperGeneric(notifyHelperRegular).notifyPools(
159
+ regular.amounts, regular.pools, regular.checksum, rewardToken
160
+ );
161
+ }
162
+
163
+ // send rest to the reserve
164
+ uint256 remainingBalance = IERC20Upgradeable(rewardToken).balanceOf(address(this));
165
+ if (remainingBalance > 0) {
166
+ IERC20Upgradeable(rewardToken).safeTransfer(reserve, remainingBalance);
167
+ }
168
+ }
169
+
170
+ /// Returning the governance
171
+ function transferGovernance(address target, address newStorage) external onlyGovernance {
172
+ Governable(target).setStorage(newStorage);
173
+ }
174
+
175
+ /// The governance configures whitelists
176
+ function setChanger(address who, bool value) external onlyGovernance {
177
+ changer[who] = value;
178
+ emit ChangerSet(who, value);
179
+ }
180
+
181
+ /// The governance configures whitelists
182
+ function setNotifier(address who, bool value) external onlyGovernance {
183
+ notifier[who] = value;
184
+ emit NotifierSet(who, value);
185
+ }
186
+
187
+ /// Whitelisted entity makes changes to the notifications
188
+ function setPoolBatch(address[] calldata poolAddress, uint256[] calldata poolPercentage, NotificationType[] calldata notificationType, bool[] calldata vests) external onlyChanger {
189
+ for (uint256 i = 0; i < poolAddress.length; i++) {
190
+ setPool(poolAddress[i], poolPercentage[i], notificationType[i], vests[i]);
191
+ }
192
+ }
193
+
194
+ /// Pool management, adds, updates or removes a transfer/notification
195
+ function setPool(address poolAddress, uint256 poolPercentage, NotificationType notificationType, bool vests) public onlyChanger {
196
+ require(notificationType != NotificationType.VOID, "Use valid indication");
197
+ require(notificationType != NotificationType.TOKEN, "We do not use TOKEN here");
198
+ if (notificationExists(poolAddress) && poolPercentage == 0) {
199
+ // remove
200
+ removeNotification(poolAddress);
201
+ } else if (notificationExists(poolAddress)) {
202
+ // update
203
+ updateNotification(poolAddress, notificationType, poolPercentage, vests);
204
+ } else if (poolPercentage > 0) {
205
+ // add because it does not exist
206
+ addNotification(poolAddress, poolPercentage, notificationType, vests);
207
+ }
208
+ emit PoolChanged(poolAddress, poolPercentage, uint256(notificationType), vests);
209
+ }
210
+
211
+ /// Configuration method for vesting for governance
212
+ function setVestingEscrow(address _escrow) external onlyGovernance {
213
+ vestingEscrow = _escrow;
214
+ }
215
+
216
+ /// Configuration method for vesting for governance
217
+ function setVesting(uint256 _numerator, uint256 _denominator) external onlyGovernance {
218
+ VESTING_DENOMINATOR = _numerator;
219
+ VESTING_NUMERATOR = _denominator;
220
+ }
221
+
222
+ function notificationExists(address poolAddress) public view returns(bool) {
223
+ if (notifications.length == 0) return false;
224
+ if (poolToIndex[poolAddress] != 0) return true;
225
+ return (notifications[0].poolAddress == poolAddress);
226
+ }
227
+
228
+ function removeNotification(address poolAddress) internal {
229
+ require(notificationExists(poolAddress), "notification does not exist");
230
+ uint256 index = poolToIndex[poolAddress];
231
+ Notification storage notification = notifications[index];
232
+
233
+ totalPercentage = totalPercentage.sub(notification.percentage);
234
+ numbers[uint256(notification.notificationType)] = numbers[uint256(notification.notificationType)].sub(1);
235
+
236
+ // move the last element here and pop from the array
237
+ notifications[index] = notifications[notifications.length.sub(1)];
238
+ poolToIndex[notifications[index].poolAddress] = index;
239
+ poolToIndex[poolAddress] = 0;
240
+ notifications.pop();
241
+ }
242
+
243
+ function updateNotification(address poolAddress, NotificationType notificationType, uint256 percentage, bool vesting) internal {
244
+ require(notificationExists(poolAddress), "notification does not exist");
245
+ require(percentage > 0, "notification is 0");
246
+ uint256 index = poolToIndex[poolAddress];
247
+ totalPercentage = totalPercentage.sub(notifications[index].percentage).add(percentage);
248
+ notifications[index].percentage = percentage;
249
+ notifications[index].vests = vesting;
250
+ if (notifications[index].notificationType != notificationType) {
251
+ numbers[uint256(notifications[index].notificationType)] = numbers[uint256(notifications[index].notificationType)].sub(1);
252
+ notifications[index].notificationType = notificationType;
253
+ numbers[uint256(notifications[index].notificationType)] = numbers[uint256(notifications[index].notificationType)].add(1);
254
+ }
255
+ }
256
+
257
+ function addNotification(address poolAddress, uint256 percentage, NotificationType notificationType, bool vesting) internal {
258
+ require(!notificationExists(poolAddress), "notification exists");
259
+ require(percentage > 0, "notification is 0");
260
+ require(PotPool(poolAddress).getRewardTokenIndex(rewardToken) != uint256(-1), "Token not configured on pot pool");
261
+ Notification memory notification = Notification(poolAddress, notificationType, percentage, vesting);
262
+ notifications.push(notification);
263
+ totalPercentage = totalPercentage.add(notification.percentage);
264
+ numbers[uint256(notification.notificationType)] = numbers[uint256(notification.notificationType)].add(1);
265
+ poolToIndex[notification.poolAddress] = notifications.length.sub(1);
266
+ require(notificationExists(poolAddress), "notification was not added");
267
+ }
268
+
269
+ /// emergency draining of tokens and ETH as there should be none staying here
270
+ function emergencyDrain(address token, uint256 amount) public onlyGovernance {
271
+ if (token == address(0)) {
272
+ msg.sender.transfer(amount);
273
+ } else {
274
+ IERC20Upgradeable(token).safeTransfer(msg.sender, amount);
275
+ }
276
+ }
277
+
278
+ function getConfig(uint256 totalAmount) external view returns(address[] memory, uint256[] memory, uint256[] memory) {
279
+ address[] memory pools = new address[](notifications.length);
280
+ uint256[] memory percentages = new uint256[](notifications.length);
281
+ uint256[] memory amounts = new uint256[](notifications.length);
282
+ for (uint256 i = 0; i < notifications.length; i++) {
283
+ Notification storage notification = notifications[i];
284
+ pools[i] = notification.poolAddress;
285
+ percentages[i] = notification.percentage.mul(1000000).div(totalPercentage);
286
+ amounts[i] = notification.percentage.mul(totalAmount).div(totalPercentage);
287
+ }
288
+ return (pools, percentages, amounts);
289
+ }
290
+ }
@@ -0,0 +1,26 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ import "./Governable.sol";
6
+
7
+ contract Controllable is Governable {
8
+
9
+ constructor(address _storage) Governable(_storage) public {
10
+ }
11
+
12
+ modifier onlyController() {
13
+ require(store.isController(msg.sender), "Not a controller");
14
+ _;
15
+ }
16
+
17
+ modifier onlyControllerOrGovernance(){
18
+ require((store.isController(msg.sender) || store.isGovernance(msg.sender)),
19
+ "The caller must be controller or governance");
20
+ _;
21
+ }
22
+
23
+ function controller() public view returns (address) {
24
+ return store.controller();
25
+ }
26
+ }
@@ -0,0 +1,31 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ import "./GovernableInit.sol";
6
+
7
+ // A clone of Governable supporting the Initializable interface and pattern
8
+ contract ControllableInit is GovernableInit {
9
+
10
+ constructor() public {
11
+ }
12
+
13
+ function initialize(address _storage) public override initializer {
14
+ GovernableInit.initialize(_storage);
15
+ }
16
+
17
+ modifier onlyController() {
18
+ require(Storage(_storage()).isController(msg.sender), "Not a controller");
19
+ _;
20
+ }
21
+
22
+ modifier onlyControllerOrGovernance(){
23
+ require((Storage(_storage()).isController(msg.sender) || Storage(_storage()).isGovernance(msg.sender)),
24
+ "The caller must be controller or governance");
25
+ _;
26
+ }
27
+
28
+ function controller() public view returns (address) {
29
+ return Storage(_storage()).controller();
30
+ }
31
+ }
@@ -0,0 +1,29 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ import "./Storage.sol";
6
+
7
+ contract Governable {
8
+
9
+ Storage public store;
10
+
11
+ constructor(address _store) public {
12
+ require(_store != address(0), "new storage shouldn't be empty");
13
+ store = Storage(_store);
14
+ }
15
+
16
+ modifier onlyGovernance() {
17
+ require(store.isGovernance(msg.sender), "Not governance");
18
+ _;
19
+ }
20
+
21
+ function setStorage(address _store) public onlyGovernance {
22
+ require(_store != address(0), "new storage shouldn't be empty");
23
+ store = Storage(_store);
24
+ }
25
+
26
+ function governance() public view returns (address) {
27
+ return store.governance();
28
+ }
29
+ }
@@ -0,0 +1,51 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ import "../upgradability/ReentrancyGuardUpgradeable.sol";
6
+ import "./Storage.sol";
7
+
8
+ // A clone of Governable supporting the Initializable interface and pattern
9
+ contract GovernableInit is ReentrancyGuardUpgradeable {
10
+
11
+ bytes32 internal constant _STORAGE_SLOT = 0xa7ec62784904ff31cbcc32d09932a58e7f1e4476e1d041995b37c917990b16dc;
12
+
13
+ modifier onlyGovernance() {
14
+ require(Storage(_storage()).isGovernance(msg.sender), "Not governance");
15
+ _;
16
+ }
17
+
18
+ constructor() public {
19
+ assert(_STORAGE_SLOT == bytes32(uint256(keccak256("eip1967.governableInit.storage")) - 1));
20
+ }
21
+
22
+ function initialize(address _store) public virtual initializer {
23
+ _setStorage(_store);
24
+ ReentrancyGuardUpgradeable.initialize();
25
+ }
26
+
27
+ function _setStorage(address newStorage) private {
28
+ bytes32 slot = _STORAGE_SLOT;
29
+ // solhint-disable-next-line no-inline-assembly
30
+ assembly {
31
+ sstore(slot, newStorage)
32
+ }
33
+ }
34
+
35
+ function setStorage(address _store) public onlyGovernance {
36
+ require(_store != address(0), "new storage shouldn't be empty");
37
+ _setStorage(_store);
38
+ }
39
+
40
+ function _storage() internal view returns (address str) {
41
+ bytes32 slot = _STORAGE_SLOT;
42
+ // solhint-disable-next-line no-inline-assembly
43
+ assembly {
44
+ str := sload(slot)
45
+ }
46
+ }
47
+
48
+ function governance() public view returns (address) {
49
+ return Storage(_storage()).governance();
50
+ }
51
+ }
@@ -0,0 +1,8 @@
1
+ //SPDX-License-Identifier: Unlicense
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ interface IUpgradeSource {
6
+ function shouldUpgrade() external view returns (bool, address);
7
+ function finalizeUpgrade() external;
8
+ }
@@ -0,0 +1,17 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts/access/Ownable.sol";
5
+
6
+ contract OwnableWhitelist is Ownable {
7
+ mapping (address => bool) public whitelist;
8
+
9
+ modifier onlyWhitelisted() {
10
+ require(whitelist[msg.sender] || msg.sender == owner(), "not allowed");
11
+ _;
12
+ }
13
+
14
+ function setWhitelist(address target, bool isWhitelisted) public onlyOwner {
15
+ whitelist[target] = isWhitelisted;
16
+ }
17
+ }