@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,163 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+
3
+ pragma solidity 0.6.12;
4
+
5
+ import "./inheritance/Governable.sol";
6
+ import "./interface/IRewardPool.sol";
7
+
8
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
9
+ import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
10
+ import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
11
+ import "@openzeppelin/contracts/math/SafeMath.sol";
12
+ import "@openzeppelin/contracts/math/Math.sol";
13
+ import "@openzeppelin/contracts/utils/Address.sol";
14
+ import "@openzeppelin/contracts/GSN/Context.sol";
15
+ import "@openzeppelin/contracts/access/Ownable.sol";
16
+
17
+ import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
18
+
19
+ contract FeeRewardForwarder is Governable {
20
+ using SafeERC20 for IERC20;
21
+ using SafeMath for uint256;
22
+
23
+ address constant public weth = address(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619);
24
+ address constant public wmatic = address(0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270);
25
+ address constant public quick = address(0x831753DD7087CaC61aB5644b308642cc1c33Dc13);
26
+
27
+ address constant public ifarm = address(0xab0b2ddB9C7e440fAc8E140A89c0dbCBf2d7Bbff);
28
+ address constant public sushi = address(0x0b3F868E0BE5597D5DB7fEB59E1CADBb0fdDa50a);
29
+ address constant public usdc = address(0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174);
30
+ address constant public aave = address(0xD6DF932A45C0f255f85145f286eA0b292B21C90B);
31
+
32
+
33
+ mapping (address => mapping (address => address[])) public routes;
34
+ mapping (address => mapping (address => address[])) public routers;
35
+
36
+ address constant public quickswapRouter = address(0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff);
37
+ address constant public sushiswapRouter = address(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506);
38
+
39
+ // the targeted reward token to convert everything to
40
+ address public targetToken = weth;
41
+ address public profitSharingPool;
42
+
43
+ event TokenPoolSet(address token, address pool);
44
+
45
+ constructor(address _storage) public Governable(_storage) {
46
+ profitSharingPool = governance();
47
+
48
+ routes[quick][weth] = [quick, weth];
49
+ routers[quick][weth] = [quickswapRouter];
50
+
51
+ routes[sushi][weth] = [sushi, weth];
52
+ routers[sushi][weth] = [sushiswapRouter];
53
+
54
+ routes[wmatic][weth] = [wmatic, weth];
55
+ routers[wmatic][weth] = [quickswapRouter];
56
+ }
57
+
58
+ /*
59
+ * Set the pool that will receive the reward token
60
+ * based on the address of the reward Token
61
+ */
62
+ function setEOA(address _eoa) public onlyGovernance {
63
+ profitSharingPool = _eoa;
64
+ targetToken = weth;
65
+ emit TokenPoolSet(targetToken, _eoa);
66
+ }
67
+
68
+ /**
69
+ * Sets the path for swapping tokens to the to address
70
+ * The to address is not validated to match the targetToken,
71
+ * so that we could first update the paths, and then,
72
+ * set the new target
73
+ */
74
+ function setConversionPath(address[] memory _route, address[] memory _routers)
75
+ public
76
+ onlyGovernance
77
+ {
78
+ require(
79
+ _routers.length == 1 || _routers.length == _route.length-1,
80
+ "Provide either 1 router in total, or 1 router per intermediate pair"
81
+ );
82
+ address from = _route[0];
83
+ address to = _route[_route.length-1];
84
+ routes[from][to] = _route;
85
+ routers[from][to] = _routers;
86
+ }
87
+
88
+ // Transfers the funds from the msg.sender to the pool
89
+ // under normal circumstances, msg.sender is the strategy
90
+ function poolNotifyFixedTarget(address _token, uint256 _amount) external {
91
+ uint256 remainingAmount = _amount;
92
+
93
+ if (_token == weth) {
94
+ // this is already the right token
95
+ IERC20(_token).safeTransferFrom(msg.sender, profitSharingPool, _amount);
96
+ } else {
97
+
98
+ // we need to convert _token to WETH
99
+ if (routes[_token][targetToken].length > 1) {
100
+ IERC20(_token).safeTransferFrom(msg.sender, address(this), remainingAmount);
101
+ uint256 balanceToSwap = IERC20(_token).balanceOf(address(this));
102
+ if (routers[_token][targetToken].length == 1) {
103
+ liquidate(_token, targetToken, balanceToSwap);
104
+ } else if (routers[_token][targetToken].length > 1) {
105
+ liquidateMultiRouter(_token, targetToken, balanceToSwap);
106
+ } else {
107
+ revert("FeeRewardForwarder: liquidation routers not set");
108
+ }
109
+
110
+ // now we can send this token forward
111
+ uint256 convertedRewardAmount = IERC20(targetToken).balanceOf(address(this));
112
+
113
+ IERC20(targetToken).safeTransfer(profitSharingPool, convertedRewardAmount);
114
+ } else {
115
+ // else the route does not exist for this token
116
+ // do not take any fees and revert.
117
+ // It's better to set the liquidation path then perform it again,
118
+ // rather then leaving the funds in controller
119
+ revert("FeeRewardForwarder: liquidation path doesn't exist");
120
+ }
121
+ }
122
+ }
123
+
124
+ function liquidate(address _from, address _to, uint256 balanceToSwap) internal {
125
+ if(balanceToSwap > 0){
126
+ address router = routers[_from][_to][0];
127
+ IERC20(_from).safeApprove(router, 0);
128
+ IERC20(_from).safeApprove(router, balanceToSwap);
129
+
130
+ IUniswapV2Router02(router).swapExactTokensForTokens(
131
+ balanceToSwap,
132
+ 0,
133
+ routes[_from][_to],
134
+ address(this),
135
+ block.timestamp
136
+ );
137
+ }
138
+ }
139
+
140
+ function liquidateMultiRouter(address _from, address _to, uint256 balanceToSwap) internal {
141
+ if(balanceToSwap > 0){
142
+ address[] memory _routers = routers[_from][_to];
143
+ address[] memory _route = routes[_from][_to];
144
+ for (uint256 i; i < _routers.length; i++ ) {
145
+ address router = _routers[i];
146
+ address[] memory route = new address[](2);
147
+ route[0] = _route[i];
148
+ route[1] = _route[i+1];
149
+ uint256 amount = IERC20(route[0]).balanceOf(address(this));
150
+ IERC20(route[0]).safeApprove(router, 0);
151
+ IERC20(route[0]).safeApprove(router, amount);
152
+
153
+ IUniswapV2Router02(router).swapExactTokensForTokens(
154
+ amount,
155
+ 0,
156
+ route,
157
+ address(this),
158
+ block.timestamp
159
+ );
160
+ }
161
+ }
162
+ }
163
+ }
@@ -0,0 +1,360 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "./inheritance/Controllable.sol";
5
+ import "./interface/IController.sol";
6
+
7
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
8
+ import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
9
+ import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
10
+ import "@openzeppelin/contracts/math/SafeMath.sol";
11
+ import "@openzeppelin/contracts/math/Math.sol";
12
+ import "@openzeppelin/contracts/utils/Address.sol";
13
+ import "@openzeppelin/contracts/GSN/Context.sol";
14
+ import "@openzeppelin/contracts/access/Ownable.sol";
15
+
16
+ abstract contract IRewardDistributionRecipient is Ownable {
17
+
18
+ mapping (address => bool) public rewardDistribution;
19
+
20
+ constructor(address[] memory _rewardDistributions) public {
21
+ // multisig on Matic
22
+ rewardDistribution[0x39cC360806b385C96969ce9ff26c23476017F652] = true;
23
+ // NotifyHelper
24
+ rewardDistribution[0xF71042C88458ff1702c3870f62F4c764712Cc9F0] = true;
25
+
26
+ for(uint256 i = 0; i < _rewardDistributions.length; i++) {
27
+ rewardDistribution[_rewardDistributions[i]] = true;
28
+ }
29
+ }
30
+
31
+ function notifyTargetRewardAmount(address rewardToken, uint256 reward) external virtual;
32
+ function notifyRewardAmount(uint256 reward) external virtual;
33
+
34
+ modifier onlyRewardDistribution() {
35
+ require(rewardDistribution[_msgSender()], "Caller is not reward distribution");
36
+ _;
37
+ }
38
+
39
+ function setRewardDistribution(address[] calldata _newRewardDistribution, bool _flag)
40
+ external
41
+ onlyOwner
42
+ {
43
+ for(uint256 i = 0; i < _newRewardDistribution.length; i++){
44
+ rewardDistribution[_newRewardDistribution[i]] = _flag;
45
+ }
46
+ }
47
+ }
48
+
49
+ contract PotPool is IRewardDistributionRecipient, Controllable, ERC20 {
50
+
51
+ using Address for address;
52
+ using SafeERC20 for IERC20;
53
+ using SafeMath for uint256;
54
+
55
+ address public lpToken;
56
+ uint256 public duration; // making it not a constant is less gas efficient, but portable
57
+
58
+ mapping(address => uint256) public stakedBalanceOf;
59
+
60
+ mapping (address => bool) smartContractStakers;
61
+ address[] public rewardTokens;
62
+ mapping(address => uint256) public periodFinishForToken;
63
+ mapping(address => uint256) public rewardRateForToken;
64
+ mapping(address => uint256) public lastUpdateTimeForToken;
65
+ mapping(address => uint256) public rewardPerTokenStoredForToken;
66
+ mapping(address => mapping(address => uint256)) public userRewardPerTokenPaidForToken;
67
+ mapping(address => mapping(address => uint256)) public rewardsForToken;
68
+
69
+ event RewardAdded(address rewardToken, uint256 reward);
70
+ event Staked(address indexed user, uint256 amount);
71
+ event Withdrawn(address indexed user, uint256 amount);
72
+ event RewardPaid(address indexed user, address rewardToken, uint256 reward);
73
+ event RewardDenied(address indexed user, address rewardToken, uint256 reward);
74
+ event SmartContractRecorded(address indexed smartContractAddress, address indexed smartContractInitiator);
75
+
76
+ modifier onlyGovernanceOrRewardDistribution() {
77
+ require(msg.sender == governance() || rewardDistribution[msg.sender], "Not governance nor reward distribution");
78
+ _;
79
+ }
80
+
81
+ modifier updateRewards(address account) {
82
+ for(uint256 i = 0; i < rewardTokens.length; i++ ){
83
+ address rt = rewardTokens[i];
84
+ rewardPerTokenStoredForToken[rt] = rewardPerToken(rt);
85
+ lastUpdateTimeForToken[rt] = lastTimeRewardApplicable(rt);
86
+ if (account != address(0)) {
87
+ rewardsForToken[rt][account] = earned(rt, account);
88
+ userRewardPerTokenPaidForToken[rt][account] = rewardPerTokenStoredForToken[rt];
89
+ }
90
+ }
91
+ _;
92
+ }
93
+
94
+ modifier updateReward(address account, address rt){
95
+ rewardPerTokenStoredForToken[rt] = rewardPerToken(rt);
96
+ lastUpdateTimeForToken[rt] = lastTimeRewardApplicable(rt);
97
+ if (account != address(0)) {
98
+ rewardsForToken[rt][account] = earned(rt, account);
99
+ userRewardPerTokenPaidForToken[rt][account] = rewardPerTokenStoredForToken[rt];
100
+ }
101
+ _;
102
+ }
103
+
104
+ /** View functions to respect old interface */
105
+ function rewardToken() public view returns(address) {
106
+ return rewardTokens[0];
107
+ }
108
+
109
+ function rewardPerToken() public view returns(uint256) {
110
+ return rewardPerToken(rewardTokens[0]);
111
+ }
112
+
113
+ function periodFinish() public view returns(uint256) {
114
+ return periodFinishForToken[rewardTokens[0]];
115
+ }
116
+
117
+ function rewardRate() public view returns(uint256) {
118
+ return rewardRateForToken[rewardTokens[0]];
119
+ }
120
+
121
+ function lastUpdateTime() public view returns(uint256) {
122
+ return lastUpdateTimeForToken[rewardTokens[0]];
123
+ }
124
+
125
+ function rewardPerTokenStored() public view returns(uint256) {
126
+ return rewardPerTokenStoredForToken[rewardTokens[0]];
127
+ }
128
+
129
+ function userRewardPerTokenPaid(address user) public view returns(uint256) {
130
+ return userRewardPerTokenPaidForToken[rewardTokens[0]][user];
131
+ }
132
+
133
+ function rewards(address user) public view returns(uint256) {
134
+ return rewardsForToken[rewardTokens[0]][user];
135
+ }
136
+
137
+ // [Hardwork] setting the reward, lpToken, duration, and rewardDistribution for each pool
138
+ constructor(
139
+ address[] memory _rewardTokens,
140
+ address _lpToken,
141
+ uint256 _duration,
142
+ address[] memory _rewardDistribution,
143
+ address _storage,
144
+ string memory _name,
145
+ string memory _symbol,
146
+ uint8 _decimals
147
+ ) public
148
+ ERC20(_name, _symbol)
149
+ IRewardDistributionRecipient(_rewardDistribution)
150
+ Controllable(_storage) // only used for referencing the grey list
151
+ {
152
+ require(_decimals == ERC20(_lpToken).decimals(), "decimals has to be aligned with the lpToken");
153
+ require(_rewardTokens.length != 0, "should initialize with at least 1 rewardToken");
154
+ rewardTokens = _rewardTokens;
155
+ lpToken = _lpToken;
156
+ duration = _duration;
157
+ }
158
+
159
+ function lastTimeRewardApplicable(uint256 i) public view returns (uint256) {
160
+ return lastTimeRewardApplicable(rewardTokens[i]);
161
+ }
162
+
163
+ function lastTimeRewardApplicable(address rt) public view returns (uint256) {
164
+ return Math.min(block.timestamp, periodFinishForToken[rt]);
165
+ }
166
+
167
+ function lastTimeRewardApplicable() public view returns (uint256) {
168
+ return lastTimeRewardApplicable(rewardTokens[0]);
169
+ }
170
+
171
+ function rewardPerToken(uint256 i) public view returns (uint256) {
172
+ return rewardPerToken(rewardTokens[i]);
173
+ }
174
+
175
+ function rewardPerToken(address rt) public view returns (uint256) {
176
+ if (totalSupply() == 0) {
177
+ return rewardPerTokenStoredForToken[rt];
178
+ }
179
+ return
180
+ rewardPerTokenStoredForToken[rt].add(
181
+ lastTimeRewardApplicable(rt)
182
+ .sub(lastUpdateTimeForToken[rt])
183
+ .mul(rewardRateForToken[rt])
184
+ .mul(1e18)
185
+ .div(totalSupply())
186
+ );
187
+ }
188
+
189
+ function earned(uint256 i, address account) public view returns (uint256) {
190
+ return earned(rewardTokens[i], account);
191
+ }
192
+
193
+ function earned(address account) public view returns (uint256) {
194
+ return earned(rewardTokens[0], account);
195
+ }
196
+
197
+ function earned(address rt, address account) public view returns (uint256) {
198
+ return
199
+ stakedBalanceOf[account]
200
+ .mul(rewardPerToken(rt).sub(userRewardPerTokenPaidForToken[rt][account]))
201
+ .div(1e18)
202
+ .add(rewardsForToken[rt][account]);
203
+ }
204
+
205
+ function stake(uint256 amount) public updateRewards(msg.sender) {
206
+ require(amount > 0, "Cannot stake 0");
207
+ recordSmartContract();
208
+ super._mint(msg.sender, amount); // ERC20 is used as a staking receipt
209
+ stakedBalanceOf[msg.sender] = stakedBalanceOf[msg.sender].add(amount);
210
+ IERC20(lpToken).safeTransferFrom(msg.sender, address(this), amount);
211
+ emit Staked(msg.sender, amount);
212
+ }
213
+
214
+ function withdraw(uint256 amount) public updateRewards(msg.sender) {
215
+ require(amount > 0, "Cannot withdraw 0");
216
+ super._burn(msg.sender, amount);
217
+ stakedBalanceOf[msg.sender] = stakedBalanceOf[msg.sender].sub(amount);
218
+ IERC20(lpToken).safeTransfer(msg.sender, amount);
219
+ emit Withdrawn(msg.sender, amount);
220
+ }
221
+
222
+ function exit() external {
223
+ withdraw(Math.min(stakedBalanceOf[msg.sender], balanceOf(msg.sender)));
224
+ getAllRewards();
225
+ }
226
+
227
+ /// A push mechanism for accounts that have not claimed their rewards for a long time.
228
+ /// The implementation is semantically analogous to getReward(), but uses a push pattern
229
+ /// instead of pull pattern.
230
+ function pushAllRewards(address recipient) public updateRewards(recipient) onlyGovernance {
231
+ bool rewardPayout = (!smartContractStakers[recipient] || !IController(controller()).greyList(recipient));
232
+ for(uint256 i = 0 ; i < rewardTokens.length; i++ ){
233
+ uint256 reward = earned(rewardTokens[i], recipient);
234
+ if (reward > 0) {
235
+ rewardsForToken[rewardTokens[i]][recipient] = 0;
236
+ // If it is a normal user and not smart contract,
237
+ // then the requirement will pass
238
+ // If it is a smart contract, then
239
+ // make sure that it is not on our greyList.
240
+ if (rewardPayout) {
241
+ IERC20(rewardTokens[i]).safeTransfer(recipient, reward);
242
+ emit RewardPaid(recipient, rewardTokens[i], reward);
243
+ } else {
244
+ emit RewardDenied(recipient, rewardTokens[i], reward);
245
+ }
246
+ }
247
+ }
248
+ }
249
+
250
+ function getAllRewards() public updateRewards(msg.sender) {
251
+ recordSmartContract();
252
+ bool rewardPayout = (!smartContractStakers[msg.sender] || !IController(controller()).greyList(msg.sender));
253
+ for(uint256 i = 0 ; i < rewardTokens.length; i++ ){
254
+ _getRewardAction(rewardTokens[i], rewardPayout);
255
+ }
256
+ }
257
+
258
+ function getReward(address rt) public updateReward(msg.sender, rt) {
259
+ recordSmartContract();
260
+ _getRewardAction(
261
+ rt,
262
+ // don't payout if it is a grey listed smart contract
263
+ (!smartContractStakers[msg.sender] || !IController(controller()).greyList(msg.sender))
264
+ );
265
+ }
266
+
267
+ function getReward() public {
268
+ getReward(rewardTokens[0]);
269
+ }
270
+
271
+ function _getRewardAction(address rt, bool rewardPayout) internal {
272
+ uint256 reward = earned(rt, msg.sender);
273
+ if (reward > 0 && IERC20(rt).balanceOf(address(this)) >= reward ) {
274
+ rewardsForToken[rt][msg.sender] = 0;
275
+ // If it is a normal user and not smart contract,
276
+ // then the requirement will pass
277
+ // If it is a smart contract, then
278
+ // make sure that it is not on our greyList.
279
+ if (rewardPayout) {
280
+ IERC20(rt).safeTransfer(msg.sender, reward);
281
+ emit RewardPaid(msg.sender, rt, reward);
282
+ } else {
283
+ emit RewardDenied(msg.sender, rt, reward);
284
+ }
285
+ }
286
+ }
287
+
288
+ function addRewardToken(address rt) public onlyGovernanceOrRewardDistribution {
289
+ require(getRewardTokenIndex(rt) == uint256(-1), "Reward token already exists");
290
+ rewardTokens.push(rt);
291
+ }
292
+
293
+ function removeRewardToken(address rt) public onlyGovernanceOrRewardDistribution {
294
+ uint256 i = getRewardTokenIndex(rt);
295
+ require(i != uint256(-1), "Reward token does not exists");
296
+ require(periodFinishForToken[rewardTokens[i]] < block.timestamp, "Can only remove when the reward period has passed");
297
+ require(rewardTokens.length > 1, "Cannot remove the last reward token");
298
+ uint256 lastIndex = rewardTokens.length - 1;
299
+
300
+ // swap
301
+ rewardTokens[i] = rewardTokens[lastIndex];
302
+
303
+ // delete last element
304
+ rewardTokens.pop();
305
+ }
306
+
307
+ // If the return value is MAX_UINT256, it means that
308
+ // the specified reward token is not in the list
309
+ function getRewardTokenIndex(address rt) public view returns(uint256) {
310
+ for(uint i = 0 ; i < rewardTokens.length ; i++){
311
+ if(rewardTokens[i] == rt)
312
+ return i;
313
+ }
314
+ return uint256(-1);
315
+ }
316
+
317
+ function notifyTargetRewardAmount(address _rewardToken, uint256 reward)
318
+ public override
319
+ onlyRewardDistribution
320
+ updateRewards(address(0))
321
+ {
322
+ // overflow fix according to https://sips.synthetix.io/sips/sip-77
323
+ require(reward < uint(-1) / 1e18, "the notified reward cannot invoke multiplication overflow");
324
+
325
+ uint256 i = getRewardTokenIndex(_rewardToken);
326
+ require(i != uint256(-1), "rewardTokenIndex not found");
327
+
328
+ if (block.timestamp >= periodFinishForToken[_rewardToken]) {
329
+ rewardRateForToken[_rewardToken] = reward.div(duration);
330
+ } else {
331
+ uint256 remaining = periodFinishForToken[_rewardToken].sub(block.timestamp);
332
+ uint256 leftover = remaining.mul(rewardRateForToken[_rewardToken]);
333
+ rewardRateForToken[_rewardToken] = reward.add(leftover).div(duration);
334
+ }
335
+ lastUpdateTimeForToken[_rewardToken] = block.timestamp;
336
+ periodFinishForToken[_rewardToken] = block.timestamp.add(duration);
337
+ emit RewardAdded(_rewardToken, reward);
338
+ }
339
+
340
+ function notifyRewardAmount(uint256 reward)
341
+ external override
342
+ onlyRewardDistribution
343
+ updateRewards(address(0))
344
+ {
345
+ notifyTargetRewardAmount(rewardTokens[0], reward);
346
+ }
347
+
348
+ function rewardTokensLength() public view returns(uint256){
349
+ return rewardTokens.length;
350
+ }
351
+
352
+ // Harvest Smart Contract recording
353
+ function recordSmartContract() internal {
354
+ if( tx.origin != msg.sender ) {
355
+ smartContractStakers[msg.sender] = true;
356
+ emit SmartContractRecorded(msg.sender, tx.origin);
357
+ }
358
+ }
359
+
360
+ }
@@ -0,0 +1,39 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts/utils/Address.sol";
5
+ import "@openzeppelin/contracts/math/SafeMath.sol";
6
+ import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
7
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
8
+
9
+ import "./inheritance/Governable.sol";
10
+ import "./interface/IProfitSharingReceiver.sol";
11
+
12
+
13
+ /**
14
+ * A simple contract for receiving tokens for profit sharing. This contract is designed to pool rewards that will be
15
+ * sent by governance to Ethereum mainnet for FARM buybacks
16
+ */
17
+ contract ProfitSharingReceiver is Governable {
18
+ using SafeERC20 for IERC20;
19
+
20
+ event WithdrawToken(address indexed token, address indexed receiver, uint amount);
21
+
22
+ constructor(
23
+ address _store
24
+ )
25
+ public
26
+ Governable(_store) {}
27
+
28
+ function withdrawTokens(address[] calldata _tokens) external onlyGovernance {
29
+ address _governance = governance();
30
+ for (uint i = 0; i < _tokens.length; ++i) {
31
+ uint amount = IERC20(_tokens[i]).balanceOf(address(this));
32
+ if (amount > 0) {
33
+ IERC20(_tokens[i]).safeTransfer(_governance, amount);
34
+ emit WithdrawToken(_tokens[i], _governance, amount);
35
+ }
36
+ }
37
+ }
38
+
39
+ }
@@ -0,0 +1,109 @@
1
+ // SPDX-License-Identifier: Unlicense
2
+ pragma solidity 0.6.12;
3
+
4
+ import "@openzeppelin/contracts/math/SafeMath.sol";
5
+ import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
6
+ import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
7
+
8
+ import "./inheritance/Governable.sol";
9
+ import "./interface/IControllerV2.sol";
10
+ import "./interface/IRewardForwarder.sol";
11
+ import "./interface/IProfitSharingReceiver.sol";
12
+ import "./interface/IStrategy.sol";
13
+ import "./interface/IUniversalLiquidator.sol";
14
+ import "./inheritance/Controllable.sol";
15
+
16
+ /**
17
+ * @dev This contract receives rewards from strategies and is responsible for routing the reward's liquidation into
18
+ * specific buyback tokens and profit tokens for the DAO.
19
+ */
20
+ contract RewardForwarderV2 is Controllable {
21
+ using SafeERC20 for IERC20;
22
+ using SafeMath for uint256;
23
+
24
+ address public constant iFARM = address(0xab0b2ddB9C7e440fAc8E140A89c0dbCBf2d7Bbff);
25
+
26
+ constructor(
27
+ address _storage
28
+ ) public Controllable(_storage) {}
29
+
30
+ function notifyFee(
31
+ address _token,
32
+ uint256 _profitSharingFee,
33
+ uint256 _strategistFee,
34
+ uint256 _platformFee
35
+ ) external {
36
+ _notifyFee(
37
+ _token,
38
+ _profitSharingFee,
39
+ _strategistFee,
40
+ _platformFee
41
+ );
42
+ }
43
+
44
+ function _notifyFee(
45
+ address _token,
46
+ uint256 _profitSharingFee,
47
+ uint256 _strategistFee,
48
+ uint256 _platformFee
49
+ ) internal {
50
+ address _controller = controller();
51
+ address liquidator = IControllerV2(_controller).universalLiquidator();
52
+
53
+ uint totalTransferAmount = _profitSharingFee.add(_strategistFee).add(_platformFee);
54
+ require(totalTransferAmount > 0, "totalTransferAmount should not be 0");
55
+ IERC20(_token).safeTransferFrom(msg.sender, address(this), totalTransferAmount);
56
+
57
+ address _targetToken = IControllerV2(_controller).targetToken();
58
+
59
+ if (_token != _targetToken) {
60
+ IERC20(_token).safeApprove(liquidator, 0);
61
+ IERC20(_token).safeApprove(liquidator, _platformFee);
62
+
63
+ uint amountOutMin = 1;
64
+
65
+ if (_platformFee > 0) {
66
+ IUniversalLiquidator(liquidator).swap(
67
+ _token,
68
+ _targetToken,
69
+ _platformFee,
70
+ amountOutMin,
71
+ IControllerV2(_controller).protocolFeeReceiver()
72
+ );
73
+ }
74
+ } else {
75
+ IERC20(_targetToken).safeTransfer(IControllerV2(_controller).protocolFeeReceiver(), _platformFee);
76
+ }
77
+
78
+ if (_token != iFARM) {
79
+ IERC20(_token).safeApprove(liquidator, 0);
80
+ IERC20(_token).safeApprove(liquidator, _profitSharingFee.add(_strategistFee));
81
+
82
+ uint amountOutMin = 1;
83
+
84
+ if (_profitSharingFee > 0) {
85
+ IUniversalLiquidator(liquidator).swap(
86
+ _token,
87
+ iFARM,
88
+ _profitSharingFee,
89
+ amountOutMin,
90
+ IControllerV2(_controller).profitSharingReceiver()
91
+ );
92
+ }
93
+ if (_strategistFee > 0) {
94
+ IUniversalLiquidator(liquidator).swap(
95
+ _token,
96
+ iFARM,
97
+ _strategistFee,
98
+ amountOutMin,
99
+ IStrategy(msg.sender).strategist()
100
+ );
101
+ }
102
+ } else {
103
+ if (_strategistFee > 0) {
104
+ IERC20(iFARM).safeTransfer(IStrategy(msg.sender).strategist(), _strategistFee);
105
+ }
106
+ IERC20(iFARM).safeTransfer(IControllerV2(_controller).profitSharingReceiver(), _profitSharingFee);
107
+ }
108
+ }
109
+ }